1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Generic binary BCH encoding/decoding library 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright © 2011 Parrot S.A. 6*4882a593Smuzhiyun * 7*4882a593Smuzhiyun * Author: Ivan Djelic <ivan.djelic@parrot.com> 8*4882a593Smuzhiyun * 9*4882a593Smuzhiyun * Description: 10*4882a593Smuzhiyun * 11*4882a593Smuzhiyun * This library provides runtime configurable encoding/decoding of binary 12*4882a593Smuzhiyun * Bose-Chaudhuri-Hocquenghem (BCH) codes. 13*4882a593Smuzhiyun */ 14*4882a593Smuzhiyun #ifndef _BCH_H 15*4882a593Smuzhiyun #define _BCH_H 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun #include <linux/types.h> 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun /** 20*4882a593Smuzhiyun * struct bch_control - BCH control structure 21*4882a593Smuzhiyun * @m: Galois field order 22*4882a593Smuzhiyun * @n: maximum codeword size in bits (= 2^m-1) 23*4882a593Smuzhiyun * @t: error correction capability in bits 24*4882a593Smuzhiyun * @ecc_bits: ecc exact size in bits, i.e. generator polynomial degree (<=m*t) 25*4882a593Smuzhiyun * @ecc_bytes: ecc max size (m*t bits) in bytes 26*4882a593Smuzhiyun * @a_pow_tab: Galois field GF(2^m) exponentiation lookup table 27*4882a593Smuzhiyun * @a_log_tab: Galois field GF(2^m) log lookup table 28*4882a593Smuzhiyun * @mod8_tab: remainder generator polynomial lookup tables 29*4882a593Smuzhiyun * @ecc_buf: ecc parity words buffer 30*4882a593Smuzhiyun * @ecc_buf2: ecc parity words buffer 31*4882a593Smuzhiyun * @xi_tab: GF(2^m) base for solving degree 2 polynomial roots 32*4882a593Smuzhiyun * @syn: syndrome buffer 33*4882a593Smuzhiyun * @cache: log-based polynomial representation buffer 34*4882a593Smuzhiyun * @elp: error locator polynomial 35*4882a593Smuzhiyun * @poly_2t: temporary polynomials of degree 2t 36*4882a593Smuzhiyun * @swap_bits: swap bits within data and syndrome bytes 37*4882a593Smuzhiyun */ 38*4882a593Smuzhiyun struct bch_control { 39*4882a593Smuzhiyun unsigned int m; 40*4882a593Smuzhiyun unsigned int n; 41*4882a593Smuzhiyun unsigned int t; 42*4882a593Smuzhiyun unsigned int ecc_bits; 43*4882a593Smuzhiyun unsigned int ecc_bytes; 44*4882a593Smuzhiyun /* private: */ 45*4882a593Smuzhiyun uint16_t *a_pow_tab; 46*4882a593Smuzhiyun uint16_t *a_log_tab; 47*4882a593Smuzhiyun uint32_t *mod8_tab; 48*4882a593Smuzhiyun uint32_t *ecc_buf; 49*4882a593Smuzhiyun uint32_t *ecc_buf2; 50*4882a593Smuzhiyun unsigned int *xi_tab; 51*4882a593Smuzhiyun unsigned int *syn; 52*4882a593Smuzhiyun int *cache; 53*4882a593Smuzhiyun struct gf_poly *elp; 54*4882a593Smuzhiyun struct gf_poly *poly_2t[4]; 55*4882a593Smuzhiyun bool swap_bits; 56*4882a593Smuzhiyun }; 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun struct bch_control *bch_init(int m, int t, unsigned int prim_poly, 59*4882a593Smuzhiyun bool swap_bits); 60*4882a593Smuzhiyun 61*4882a593Smuzhiyun void bch_free(struct bch_control *bch); 62*4882a593Smuzhiyun 63*4882a593Smuzhiyun void bch_encode(struct bch_control *bch, const uint8_t *data, 64*4882a593Smuzhiyun unsigned int len, uint8_t *ecc); 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun int bch_decode(struct bch_control *bch, const uint8_t *data, unsigned int len, 67*4882a593Smuzhiyun const uint8_t *recv_ecc, const uint8_t *calc_ecc, 68*4882a593Smuzhiyun const unsigned int *syn, unsigned int *errloc); 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun #endif /* _BCH_H */ 71