~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/include/linux/rslib.h

Version: ~ [ linux-4.15-rc3 ] ~ [ linux-4.14.5 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.68 ] ~ [ linux-4.8.17 ] ~ [ linux-4.7.10 ] ~ [ linux-4.6.7 ] ~ [ linux-4.5.7 ] ~ [ linux-4.4.105 ] ~ [ linux-4.3.6 ] ~ [ linux-4.2.8 ] ~ [ linux-4.1.47 ] ~ [ linux-4.0.9 ] ~ [ linux-3.19.8 ] ~ [ linux-3.18.87 ] ~ [ linux-3.17.8 ] ~ [ linux-3.16.51 ] ~ [ linux-3.15.10 ] ~ [ linux-3.14.79 ] ~ [ linux-3.13.11 ] ~ [ linux-3.12.74 ] ~ [ linux-3.11.10 ] ~ [ linux-3.10.108 ] ~ [ linux-3.9.11 ] ~ [ linux-3.8.13 ] ~ [ linux-3.7.10 ] ~ [ linux-3.6.11 ] ~ [ linux-3.5.7 ] ~ [ linux-3.4.113 ] ~ [ linux-3.3.8 ] ~ [ linux-3.2.96 ] ~ [ linux-3.1.10 ] ~ [ linux-3.0.101 ] ~ [ linux-2.6.39.4 ] ~ [ linux-2.6.38.8 ] ~ [ linux-2.6.37.6 ] ~ [ linux-2.6.36.4 ] ~ [ linux-2.6.35.14 ] ~ [ linux-2.6.34.15 ] ~ [ linux-2.6.33.20 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.27.62 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.5 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 /*
  2  * include/linux/rslib.h
  3  *
  4  * Overview:
  5  *   Generic Reed Solomon encoder / decoder library
  6  *
  7  * Copyright (C) 2004 Thomas Gleixner (tglx@linutronix.de)
  8  *
  9  * RS code lifted from reed solomon library written by Phil Karn
 10  * Copyright 2002 Phil Karn, KA9Q
 11  *
 12  * $Id: rslib.h,v 1.4 2005/11/07 11:14:52 gleixner Exp $
 13  *
 14  * This program is free software; you can redistribute it and/or modify
 15  * it under the terms of the GNU General Public License version 2 as
 16  * published by the Free Software Foundation.
 17  */
 18 
 19 #ifndef _RSLIB_H_
 20 #define _RSLIB_H_
 21 
 22 #include <linux/list.h>
 23 
 24 /**
 25  * struct rs_control - rs control structure
 26  *
 27  * @mm:         Bits per symbol
 28  * @nn:         Symbols per block (= (1<<mm)-1)
 29  * @alpha_to:   log lookup table
 30  * @index_of:   Antilog lookup table
 31  * @genpoly:    Generator polynomial
 32  * @nroots:     Number of generator roots = number of parity symbols
 33  * @fcr:        First consecutive root, index form
 34  * @prim:       Primitive element, index form
 35  * @iprim:      prim-th root of 1, index form
 36  * @gfpoly:     The primitive generator polynominal
 37  * @gffunc:     Function to generate the field, if non-canonical representation
 38  * @users:      Users of this structure
 39  * @list:       List entry for the rs control list
 40 */
 41 struct rs_control {
 42         int             mm;
 43         int             nn;
 44         uint16_t        *alpha_to;
 45         uint16_t        *index_of;
 46         uint16_t        *genpoly;
 47         int             nroots;
 48         int             fcr;
 49         int             prim;
 50         int             iprim;
 51         int             gfpoly;
 52         int             (*gffunc)(int);
 53         int             users;
 54         struct list_head list;
 55 };
 56 
 57 /* General purpose RS codec, 8-bit data width, symbol width 1-15 bit  */
 58 #ifdef CONFIG_REED_SOLOMON_ENC8
 59 int encode_rs8(struct rs_control *rs, uint8_t *data, int len, uint16_t *par,
 60                uint16_t invmsk);
 61 #endif
 62 #ifdef CONFIG_REED_SOLOMON_DEC8
 63 int decode_rs8(struct rs_control *rs, uint8_t *data, uint16_t *par, int len,
 64                 uint16_t *s, int no_eras, int *eras_pos, uint16_t invmsk,
 65                uint16_t *corr);
 66 #endif
 67 
 68 /* General purpose RS codec, 16-bit data width, symbol width 1-15 bit  */
 69 #ifdef CONFIG_REED_SOLOMON_ENC16
 70 int encode_rs16(struct rs_control *rs, uint16_t *data, int len, uint16_t *par,
 71                 uint16_t invmsk);
 72 #endif
 73 #ifdef CONFIG_REED_SOLOMON_DEC16
 74 int decode_rs16(struct rs_control *rs, uint16_t *data, uint16_t *par, int len,
 75                 uint16_t *s, int no_eras, int *eras_pos, uint16_t invmsk,
 76                 uint16_t *corr);
 77 #endif
 78 
 79 /* Create or get a matching rs control structure */
 80 struct rs_control *init_rs(int symsize, int gfpoly, int fcr, int prim,
 81                            int nroots);
 82 struct rs_control *init_rs_non_canonical(int symsize, int (*func)(int),
 83                                          int fcr, int prim, int nroots);
 84 
 85 /* Release a rs control structure */
 86 void free_rs(struct rs_control *rs);
 87 
 88 /** modulo replacement for galois field arithmetics
 89  *
 90  *  @rs:        the rs control structure
 91  *  @x:         the value to reduce
 92  *
 93  *  where
 94  *  rs->mm = number of bits per symbol
 95  *  rs->nn = (2^rs->mm) - 1
 96  *
 97  *  Simple arithmetic modulo would return a wrong result for values
 98  *  >= 3 * rs->nn
 99 */
100 static inline int rs_modnn(struct rs_control *rs, int x)
101 {
102         while (x >= rs->nn) {
103                 x -= rs->nn;
104                 x = (x >> rs->mm) + (x & rs->nn);
105         }
106         return x;
107 }
108 
109 #endif
110 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | Wiki (Japanese) | Wiki (English) | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

osdn.jp