linux/drivers/md/dm-verity-fec.h

/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
 * Copyright (C) 2015 Google, Inc.
 *
 * Author: Sami Tolvanen <[email protected]>
 */

#ifndef DM_VERITY_FEC_H
#define DM_VERITY_FEC_H

#include "dm-verity.h"
#include <linux/rslib.h>

/* Reed-Solomon(M, N) parameters */
#define DM_VERITY_FEC_RSM
#define DM_VERITY_FEC_MAX_RSN
#define DM_VERITY_FEC_MIN_RSN

/* buffers for deinterleaving and decoding */
#define DM_VERITY_FEC_BUF_PREALLOC
#define DM_VERITY_FEC_BUF_RS_BITS
/* we need buffers for at most 1 << block size RS blocks */
#define DM_VERITY_FEC_BUF_MAX

/* maximum recursion level for verity_fec_decode */
#define DM_VERITY_FEC_MAX_RECURSION

#define DM_VERITY_OPT_FEC_DEV
#define DM_VERITY_OPT_FEC_BLOCKS
#define DM_VERITY_OPT_FEC_START
#define DM_VERITY_OPT_FEC_ROOTS

/* configuration */
struct dm_verity_fec {};

/* per-bio data */
struct dm_verity_fec_io {};

#ifdef CONFIG_DM_VERITY_FEC

/* each feature parameter requires a value */
#define DM_VERITY_OPTS_FEC

extern bool verity_fec_is_enabled(struct dm_verity *v);

extern int verity_fec_decode(struct dm_verity *v, struct dm_verity_io *io,
			     enum verity_block_type type, sector_t block,
			     u8 *dest);

extern unsigned int verity_fec_status_table(struct dm_verity *v, unsigned int sz,
					char *result, unsigned int maxlen);

extern void verity_fec_finish_io(struct dm_verity_io *io);
extern void verity_fec_init_io(struct dm_verity_io *io);

extern bool verity_is_fec_opt_arg(const char *arg_name);
extern int verity_fec_parse_opt_args(struct dm_arg_set *as,
				     struct dm_verity *v, unsigned int *argc,
				     const char *arg_name);

extern void verity_fec_dtr(struct dm_verity *v);

extern int verity_fec_ctr_alloc(struct dm_verity *v);
extern int verity_fec_ctr(struct dm_verity *v);

#else /* !CONFIG_DM_VERITY_FEC */

#define DM_VERITY_OPTS_FEC

static inline bool verity_fec_is_enabled(struct dm_verity *v)
{
	return false;
}

static inline int verity_fec_decode(struct dm_verity *v,
				    struct dm_verity_io *io,
				    enum verity_block_type type,
				    sector_t block, u8 *dest)
{
	return -EOPNOTSUPP;
}

static inline unsigned int verity_fec_status_table(struct dm_verity *v,
					       unsigned int sz, char *result,
					       unsigned int maxlen)
{
	return sz;
}

static inline void verity_fec_finish_io(struct dm_verity_io *io)
{
}

static inline void verity_fec_init_io(struct dm_verity_io *io)
{
}

static inline bool verity_is_fec_opt_arg(const char *arg_name)
{
	return false;
}

static inline int verity_fec_parse_opt_args(struct dm_arg_set *as,
					    struct dm_verity *v,
					    unsigned int *argc,
					    const char *arg_name)
{
	return -EINVAL;
}

static inline void verity_fec_dtr(struct dm_verity *v)
{
}

static inline int verity_fec_ctr_alloc(struct dm_verity *v)
{
	return 0;
}

static inline int verity_fec_ctr(struct dm_verity *v)
{
	return 0;
}

#endif /* CONFIG_DM_VERITY_FEC */

#endif /* DM_VERITY_FEC_H */