12b27bdccSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */ 2437aa565SIvan Djelic /* 3437aa565SIvan Djelic * Generic binary BCH encoding/decoding library 4437aa565SIvan Djelic * 5437aa565SIvan Djelic * Copyright © 2011 Parrot S.A. 6437aa565SIvan Djelic * 7437aa565SIvan Djelic * Author: Ivan Djelic <[email protected]> 8437aa565SIvan Djelic * 9437aa565SIvan Djelic * Description: 10437aa565SIvan Djelic * 11437aa565SIvan Djelic * This library provides runtime configurable encoding/decoding of binary 12437aa565SIvan Djelic * Bose-Chaudhuri-Hocquenghem (BCH) codes. 13437aa565SIvan Djelic */ 14437aa565SIvan Djelic #ifndef _BCH_H 15437aa565SIvan Djelic #define _BCH_H 16437aa565SIvan Djelic 17437aa565SIvan Djelic #include <linux/types.h> 18437aa565SIvan Djelic 19437aa565SIvan Djelic /** 20437aa565SIvan Djelic * struct bch_control - BCH control structure 21437aa565SIvan Djelic * @m: Galois field order 22437aa565SIvan Djelic * @n: maximum codeword size in bits (= 2^m-1) 23437aa565SIvan Djelic * @t: error correction capability in bits 24437aa565SIvan Djelic * @ecc_bits: ecc exact size in bits, i.e. generator polynomial degree (<=m*t) 25437aa565SIvan Djelic * @ecc_bytes: ecc max size (m*t bits) in bytes 26437aa565SIvan Djelic * @a_pow_tab: Galois field GF(2^m) exponentiation lookup table 27437aa565SIvan Djelic * @a_log_tab: Galois field GF(2^m) log lookup table 28437aa565SIvan Djelic * @mod8_tab: remainder generator polynomial lookup tables 29437aa565SIvan Djelic * @ecc_buf: ecc parity words buffer 30437aa565SIvan Djelic * @ecc_buf2: ecc parity words buffer 31437aa565SIvan Djelic * @xi_tab: GF(2^m) base for solving degree 2 polynomial roots 32437aa565SIvan Djelic * @syn: syndrome buffer 33437aa565SIvan Djelic * @cache: log-based polynomial representation buffer 34437aa565SIvan Djelic * @elp: error locator polynomial 35437aa565SIvan Djelic * @poly_2t: temporary polynomials of degree 2t 36*1759279aSMiquel Raynal * @swap_bits: swap bits within data and syndrome bytes 37437aa565SIvan Djelic */ 38437aa565SIvan Djelic struct bch_control { 39437aa565SIvan Djelic unsigned int m; 40437aa565SIvan Djelic unsigned int n; 41437aa565SIvan Djelic unsigned int t; 42437aa565SIvan Djelic unsigned int ecc_bits; 43437aa565SIvan Djelic unsigned int ecc_bytes; 44437aa565SIvan Djelic /* private: */ 45437aa565SIvan Djelic uint16_t *a_pow_tab; 46437aa565SIvan Djelic uint16_t *a_log_tab; 47437aa565SIvan Djelic uint32_t *mod8_tab; 48437aa565SIvan Djelic uint32_t *ecc_buf; 49437aa565SIvan Djelic uint32_t *ecc_buf2; 50437aa565SIvan Djelic unsigned int *xi_tab; 51437aa565SIvan Djelic unsigned int *syn; 52437aa565SIvan Djelic int *cache; 53437aa565SIvan Djelic struct gf_poly *elp; 54437aa565SIvan Djelic struct gf_poly *poly_2t[4]; 55*1759279aSMiquel Raynal bool swap_bits; 56437aa565SIvan Djelic }; 57437aa565SIvan Djelic 58*1759279aSMiquel Raynal struct bch_control *bch_init(int m, int t, unsigned int prim_poly, 59*1759279aSMiquel Raynal bool swap_bits); 60437aa565SIvan Djelic 61c8ae3f74SMiquel Raynal void bch_free(struct bch_control *bch); 62437aa565SIvan Djelic 63c8ae3f74SMiquel Raynal void bch_encode(struct bch_control *bch, const uint8_t *data, 64437aa565SIvan Djelic unsigned int len, uint8_t *ecc); 65437aa565SIvan Djelic 66c8ae3f74SMiquel Raynal int bch_decode(struct bch_control *bch, const uint8_t *data, unsigned int len, 67437aa565SIvan Djelic const uint8_t *recv_ecc, const uint8_t *calc_ecc, 68437aa565SIvan Djelic const unsigned int *syn, unsigned int *errloc); 69437aa565SIvan Djelic 70437aa565SIvan Djelic #endif /* _BCH_H */ 71