| 1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
| 2 | /* |
| 3 | * Copyright © 2011 Ivan Djelic <ivan.djelic@parrot.com> |
| 4 | * |
| 5 | * This file is the header for the NAND BCH ECC implementation. |
| 6 | */ |
| 7 | |
| 8 | #ifndef __MTD_NAND_ECC_SW_BCH_H__ |
| 9 | #define __MTD_NAND_ECC_SW_BCH_H__ |
| 10 | |
| 11 | #include <linux/mtd/nand.h> |
| 12 | #include <linux/bch.h> |
| 13 | |
| 14 | /** |
| 15 | * struct nand_ecc_sw_bch_conf - private software BCH ECC engine structure |
| 16 | * @req_ctx: Save request context and tweak the original request to fit the |
| 17 | * engine needs |
| 18 | * @code_size: Number of bytes needed to store a code (one code per step) |
| 19 | * @calc_buf: Buffer to use when calculating ECC bytes |
| 20 | * @code_buf: Buffer to use when reading (raw) ECC bytes from the chip |
| 21 | * @bch: BCH control structure |
| 22 | * @errloc: error location array |
| 23 | * @eccmask: XOR ecc mask, allows erased pages to be decoded as valid |
| 24 | */ |
| 25 | struct nand_ecc_sw_bch_conf { |
| 26 | struct nand_ecc_req_tweak_ctx req_ctx; |
| 27 | unsigned int code_size; |
| 28 | u8 *calc_buf; |
| 29 | u8 *code_buf; |
| 30 | struct bch_control *bch; |
| 31 | unsigned int *errloc; |
| 32 | unsigned char *eccmask; |
| 33 | }; |
| 34 | |
| 35 | #if IS_ENABLED(CONFIG_MTD_NAND_ECC_SW_BCH) |
| 36 | |
| 37 | int nand_ecc_sw_bch_calculate(struct nand_device *nand, |
| 38 | const unsigned char *buf, unsigned char *code); |
| 39 | int nand_ecc_sw_bch_correct(struct nand_device *nand, unsigned char *buf, |
| 40 | unsigned char *read_ecc, unsigned char *calc_ecc); |
| 41 | int nand_ecc_sw_bch_init_ctx(struct nand_device *nand); |
| 42 | void nand_ecc_sw_bch_cleanup_ctx(struct nand_device *nand); |
| 43 | struct nand_ecc_engine *nand_ecc_sw_bch_get_engine(void); |
| 44 | |
| 45 | #else /* !CONFIG_MTD_NAND_ECC_SW_BCH */ |
| 46 | |
| 47 | static inline int nand_ecc_sw_bch_calculate(struct nand_device *nand, |
| 48 | const unsigned char *buf, |
| 49 | unsigned char *code) |
| 50 | { |
| 51 | return -ENOTSUPP; |
| 52 | } |
| 53 | |
| 54 | static inline int nand_ecc_sw_bch_correct(struct nand_device *nand, |
| 55 | unsigned char *buf, |
| 56 | unsigned char *read_ecc, |
| 57 | unsigned char *calc_ecc) |
| 58 | { |
| 59 | return -ENOTSUPP; |
| 60 | } |
| 61 | |
| 62 | static inline int nand_ecc_sw_bch_init_ctx(struct nand_device *nand) |
| 63 | { |
| 64 | return -ENOTSUPP; |
| 65 | } |
| 66 | |
| 67 | static inline void nand_ecc_sw_bch_cleanup_ctx(struct nand_device *nand) {} |
| 68 | |
| 69 | #endif /* CONFIG_MTD_NAND_ECC_SW_BCH */ |
| 70 | |
| 71 | #endif /* __MTD_NAND_ECC_SW_BCH_H__ */ |
| 72 | |