← Documents Documentation/core-api/librs.rst GitHub 원문 ↗

Linux 6.18.37 · Core API

Reed-Solomon Library Programming Interface

Kernel Reed-Solomon library의 decoder 초기화, encoding, syndrome 기반 decoding, correction buffer와 resource 해제를 예제로 설명합니다.

Source pathDocumentation/core-api/librs.rst
Source versionLinux v6.18.37
TranslationDUJINLABS 전문 번역 + 해설

요약·해설과 원문, 전문 번역을 서로 분리했습니다. API 이름, symbol, source path는 원문 표기를 사용합니다.

1. 요약·해설

원문의 핵심 논리와 kernel programming 관점의 보충 설명입니다. 아래의 전문 번역과는 별도로 작성했습니다.

요약과 해설

librs.rst:1-212

`init_rs`는 polynomial과 root 구성을 기준으로 Reed-Solomon control structure를 만들거나 기존의 일치하는 decoder를 재사용합니다. Lookup table 생성 비용이 있으므로 latency-sensitive path에서 초기화하면 안 됩니다.

`encode_rs8`은 data를 symbol로 확장해 parity를 계산하며, FLASH처럼 erased value가 0xFF인 매체는 inversion mask로 all-zero codeword와 저장 표현을 맞출 수 있습니다. Parity buffer는 호출 전에 초기화해야 합니다.

`decode_rs8`은 자체 syndrome 계산 또는 hardware가 제공한 syndrome을 사용합니다. Data를 직접 수정하거나 `errpos`와 correction mask만 받아 hardware-specific bit ordering에 맞춰 caller가 수정할 수 있으며, 마지막 decoder user는 `free_rs`로 resource를 반납합니다.

2. 영어 원문 전체

번역 기준이 된 Linux v6.18.37 원문입니다. 줄 번호는 이 버전의 파일 좌표입니다.

원문 전체 펼치기
1 ==========================================
2 Reed-Solomon Library Programming Interface
3 ==========================================
4
5 :Author: Thomas Gleixner
6
7 Introduction
8 ============
9
10 The generic Reed-Solomon Library provides encoding, decoding and error
11 correction functions.
12
13 Reed-Solomon codes are used in communication and storage applications to
14 ensure data integrity.
15
16 This documentation is provided for developers who want to utilize the
17 functions provided by the library.
18
19 Known Bugs And Assumptions
20 ==========================
21
22 None.
23
24 Usage
25 =====
26
27 This chapter provides examples of how to use the library.
28
29 Initializing
30 ------------
31
32 The init function init_rs returns a pointer to an rs decoder structure,
33 which holds the necessary information for encoding, decoding and error
34 correction with the given polynomial. It either uses an existing
35 matching decoder or creates a new one. On creation all the lookup tables
36 for fast en/decoding are created. The function may take a while, so make
37 sure not to call it in critical code paths.
38
39 ::
40
41 /* the Reed Solomon control structure */
42 static struct rs_control *rs_decoder;
43
44 /* Symbolsize is 10 (bits)
45 * Primitive polynomial is x^10+x^3+1
46 * first consecutive root is 0
47 * primitive element to generate roots = 1
48 * generator polynomial degree (number of roots) = 6
49 */
50 rs_decoder = init_rs (10, 0x409, 0, 1, 6);
51
52
53 Encoding
54 --------
55
56 The encoder calculates the Reed-Solomon code over the given data length
57 and stores the result in the parity buffer. Note that the parity buffer
58 must be initialized before calling the encoder.
59
60 The expanded data can be inverted on the fly by providing a non-zero
61 inversion mask. The expanded data is XOR'ed with the mask. This is used
62 e.g. for FLASH ECC, where the all 0xFF is inverted to an all 0x00. The
63 Reed-Solomon code for all 0x00 is all 0x00. The code is inverted before
64 storing to FLASH so it is 0xFF too. This prevents that reading from an
65 erased FLASH results in ECC errors.
66
67 The databytes are expanded to the given symbol size on the fly. There is
68 no support for encoding continuous bitstreams with a symbol size != 8 at
69 the moment. If it is necessary it should be not a big deal to implement
70 such functionality.
71
72 ::
73
74 /* Parity buffer. Size = number of roots */
75 uint16_t par[6];
76 /* Initialize the parity buffer */
77 memset(par, 0, sizeof(par));
78 /* Encode 512 byte in data8. Store parity in buffer par */
79 encode_rs8 (rs_decoder, data8, 512, par, 0);
80
81
82 Decoding
83 --------
84
85 The decoder calculates the syndrome over the given data length and the
86 received parity symbols and corrects errors in the data.
87
88 If a syndrome is available from a hardware decoder then the syndrome
89 calculation is skipped.
90
91 The correction of the data buffer can be suppressed by providing a
92 correction pattern buffer and an error location buffer to the decoder.
93 The decoder stores the calculated error location and the correction
94 bitmask in the given buffers. This is useful for hardware decoders which
95 use a weird bit ordering scheme.
96
97 The databytes are expanded to the given symbol size on the fly. There is
98 no support for decoding continuous bitstreams with a symbolsize != 8 at
99 the moment. If it is necessary it should be not a big deal to implement
100 such functionality.
101
102 Decoding with syndrome calculation, direct data correction
103 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
104
105 ::
106
107 /* Parity buffer. Size = number of roots */
108 uint16_t par[6];
109 uint8_t data[512];
110 int numerr;
111 /* Receive data */
112 .....
113 /* Receive parity */
114 .....
115 /* Decode 512 byte in data8.*/
116 numerr = decode_rs8 (rs_decoder, data8, par, 512, NULL, 0, NULL, 0, NULL);
117
118
119 Decoding with syndrome given by hardware decoder, direct data correction
120 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
121
122 ::
123
124 /* Parity buffer. Size = number of roots */
125 uint16_t par[6], syn[6];
126 uint8_t data[512];
127 int numerr;
128 /* Receive data */
129 .....
130 /* Receive parity */
131 .....
132 /* Get syndrome from hardware decoder */
133 .....
134 /* Decode 512 byte in data8.*/
135 numerr = decode_rs8 (rs_decoder, data8, par, 512, syn, 0, NULL, 0, NULL);
136
137
138 Decoding with syndrome given by hardware decoder, no direct data correction.
139 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
140
141 Note: It's not necessary to give data and received parity to the
142 decoder.
143
144 ::
145
146 /* Parity buffer. Size = number of roots */
147 uint16_t par[6], syn[6], corr[8];
148 uint8_t data[512];
149 int numerr, errpos[8];
150 /* Receive data */
151 .....
152 /* Receive parity */
153 .....
154 /* Get syndrome from hardware decoder */
155 .....
156 /* Decode 512 byte in data8.*/
157 numerr = decode_rs8 (rs_decoder, NULL, NULL, 512, syn, 0, errpos, 0, corr);
158 for (i = 0; i < numerr; i++) {
159 do_error_correction_in_your_buffer(errpos[i], corr[i]);
160 }
161
162
163 Cleanup
164 -------
165
166 The function free_rs frees the allocated resources, if the caller is
167 the last user of the decoder.
168
169 ::
170
171 /* Release resources */
172 free_rs(rs_decoder);
173
174
175 Structures
176 ==========
177
178 This chapter contains the autogenerated documentation of the structures
179 which are used in the Reed-Solomon Library and are relevant for a
180 developer.
181
182 .. kernel-doc:: include/linux/rslib.h
183 :internal:
184
185 Public Functions Provided
186 =========================
187
188 This chapter contains the autogenerated documentation of the
189 Reed-Solomon functions which are exported.
190
191 .. kernel-doc:: lib/reed_solomon/reed_solomon.c
192 :export:
193
194 Credits
195 =======
196
197 The library code for encoding and decoding was written by Phil Karn.
198
199 ::
200
201 Copyright 2002, Phil Karn, KA9Q
202 May be used under the terms of the GNU General Public License (GPL)
203
204
205 The wrapper functions and interfaces are written by Thomas Gleixner.
206
207 Many users have provided bugfixes, improvements and helping hands for
208 testing. Thanks a lot.
209
210 The following people have contributed to this document:
211
212 Thomas Gleixner\ [email protected]
213

3. 한국어 전문 번역

영어 원문의 문단 순서와 의미를 유지한 전체 번역입니다. 코드, 함수명, symbol과 URL은 원문 표기를 유지합니다.

Reed-Solomon library 소개

1-18

Reed-Solomon Library programming interface (Reed-Solomon Library Programming Interface)

저자: Thomas Gleixner

소개 (Introduction)

Generic Reed-Solomon Library는 encoding, decoding, error correction 함수를 제공합니다.

Reed-Solomon code는 통신 및 storage application에서 data integrity를 보장하기 위해 사용합니다.

이 문서는 library가 제공하는 함수를 활용하려는 developer를 위한 것입니다.

알려진 bug와 사용법

19-28

알려진 bug와 가정 (Known Bugs And Assumptions)

없습니다.

사용법 (Usage)

이 장에서는 library를 사용하는 방법을 예제로 설명합니다.

decoder 초기화

29-52

초기화 (Initializing)

초기화 함수 `init_rs`는 지정한 polynomial로 encoding, decoding, error correction을 수행하는 데 필요한 정보를 보관하는 `rs` decoder structure pointer를 반환합니다. 일치하는 기존 decoder가 있으면 재사용하고, 없으면 새로 만듭니다.

새 decoder를 만들 때 빠른 encoding과 decoding에 필요한 모든 lookup table도 생성합니다. 함수 실행에 시간이 걸릴 수 있으므로 critical code path에서 호출하지 않도록 해야 합니다.

/* the Reed Solomon control structure */
static struct rs_control *rs_decoder;

/* Symbolsize is 10 (bits)
 * Primitive polynomial is x^10+x^3+1
 * first consecutive root is 0
 * primitive element to generate roots = 1
 * generator polynomial degree (number of roots) = 6
 */
rs_decoder = init_rs (10, 0x409, 0, 1, 6);

Reed-Solomon encoding

53-81

Encoding

Encoder는 주어진 data length에 대한 Reed-Solomon code를 계산해 parity buffer에 저장합니다. Encoder를 호출하기 전에 parity buffer를 반드시 초기화해야 합니다.

0이 아닌 inversion mask를 전달하면 확장된 data를 처리 중에 바로 반전할 수 있습니다. 확장 data와 mask를 XOR합니다. 예를 들어 FLASH ECC에서는 전부 0xFF인 값을 전부 0x00으로 반전합니다. 전부 0x00인 data의 Reed-Solomon code도 전부 0x00입니다. Code를 FLASH에 저장하기 전에 다시 반전하면 code도 0xFF가 되므로, 지워진 FLASH를 읽을 때 ECC error가 발생하는 일을 방지합니다.

Data byte는 처리 중에 지정된 symbol size로 확장됩니다. 현재 symbol size가 8이 아닌 continuous bitstream encoding은 지원하지 않습니다. 필요하다면 이 기능을 구현하는 일은 어렵지 않을 것입니다.

/* Parity buffer. Size = number of roots */
uint16_t par[6];
/* Initialize the parity buffer */
memset(par, 0, sizeof(par));
/* Encode 512 byte in data8. Store parity in buffer par */
encode_rs8 (rs_decoder, data8, 512, par, 0);

decoding 동작

82-101

Decoding

Decoder는 주어진 data length와 수신한 parity symbol로 syndrome을 계산하고 data의 error를 수정합니다.

Hardware decoder가 syndrome을 제공하면 syndrome 계산 단계를 건너뜁니다.

Correction pattern buffer와 error location buffer를 decoder에 전달하면 data buffer를 직접 수정하지 않도록 할 수 있습니다. Decoder는 계산한 error location과 correction bitmask를 제공된 buffer에 저장합니다. 이는 특이한 bit ordering scheme을 쓰는 hardware decoder에 유용합니다.

Data byte는 처리 중에 지정된 symbol size로 확장됩니다. 현재 symbol size가 8이 아닌 continuous bitstream decoding은 지원하지 않으며, 필요하다면 해당 기능을 어렵지 않게 구현할 수 있습니다.

syndrome 계산과 직접 data 수정

102-118

Syndrome을 계산하면서 data를 직접 수정하는 decoding 예제입니다.

/* Parity buffer. Size = number of roots */
uint16_t par[6];
uint8_t  data[512];
int numerr;
/* Receive data */
.....
/* Receive parity */
.....
/* Decode 512 byte in data8.*/
numerr = decode_rs8 (rs_decoder, data8, par, 512, NULL, 0, NULL, 0, NULL);

hardware syndrome과 직접 data 수정

119-137

Hardware decoder가 제공한 syndrome을 사용하면서 data를 직접 수정하는 decoding 예제입니다.

/* Parity buffer. Size = number of roots */
uint16_t par[6], syn[6];
uint8_t  data[512];
int numerr;
/* Receive data */
.....
/* Receive parity */
.....
/* Get syndrome from hardware decoder */
.....
/* Decode 512 byte in data8.*/
numerr = decode_rs8 (rs_decoder, data8, par, 512, syn, 0, NULL, 0, NULL);

hardware syndrome과 correction pattern

138-162

Hardware decoder가 제공한 syndrome을 사용하고 data를 직접 수정하지 않는 decoding 예제입니다.

Decoder에 data와 수신한 parity를 전달할 필요가 없습니다.

/* Parity buffer. Size = number of roots */
uint16_t par[6], syn[6], corr[8];
uint8_t  data[512];
int numerr, errpos[8];
/* Receive data */
.....
/* Receive parity */
.....
/* Get syndrome from hardware decoder */
.....
/* Decode 512 byte in data8.*/
numerr = decode_rs8 (rs_decoder, NULL, NULL, 512, syn, 0, errpos, 0, corr);
for (i = 0; i < numerr; i++) {
    do_error_correction_in_your_buffer(errpos[i], corr[i]);
}

decoder resource 정리

163-174

정리 (Cleanup)

Caller가 decoder의 마지막 user라면 `free_rs` 함수가 할당된 resource를 해제합니다.

/* Release resources */
free_rs(rs_decoder);

structure와 공개 함수

175-193

Structure (Structures)

이 장에는 Reed-Solomon Library에서 사용하며 developer에게 관련 있는 structure의 자동 생성 문서가 들어 있습니다.

.. kernel-doc:: include/linux/rslib.h
   :internal:

제공되는 공개 함수 (Public Functions Provided)

이 장에는 export된 Reed-Solomon 함수의 자동 생성 문서가 들어 있습니다.

.. kernel-doc:: lib/reed_solomon/reed_solomon.c
   :export:

기여자

194-212

기여자 (Credits)

Encoding 및 decoding library code는 Phil Karn이 작성했습니다.

Copyright 2002, Phil Karn, KA9Q
May be used under the terms of the GNU General Public License (GPL)

Wrapper function과 interface는 Thomas Gleixner가 작성했습니다.

많은 user가 bugfix, 개선 사항, test 지원을 제공했습니다. 깊이 감사드립니다.

이 문서에는 Thomas Gleixner <[email protected]>가 기여했습니다.