Merge tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi
[linux-2.6-microblaze.git] / drivers / mtd / nand / ecc-sw-hamming.c
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  * This file contains an ECC algorithm that detects and corrects 1 bit
4  * errors in a 256 byte block of data.
5  *
6  * Copyright © 2008 Koninklijke Philips Electronics NV.
7  *                  Author: Frans Meulenbroeks
8  *
9  * Completely replaces the previous ECC implementation which was written by:
10  *   Steven J. Hill (sjhill@realitydiluted.com)
11  *   Thomas Gleixner (tglx@linutronix.de)
12  *
13  * Information on how this algorithm works and how it was developed
14  * can be found in Documentation/driver-api/mtd/nand_ecc.rst
15  */
16
17 #include <linux/types.h>
18 #include <linux/kernel.h>
19 #include <linux/module.h>
20 #include <linux/mtd/nand.h>
21 #include <linux/mtd/nand-ecc-sw-hamming.h>
22 #include <linux/slab.h>
23 #include <asm/byteorder.h>
24
25 /*
26  * invparity is a 256 byte table that contains the odd parity
27  * for each byte. So if the number of bits in a byte is even,
28  * the array element is 1, and when the number of bits is odd
29  * the array eleemnt is 0.
30  */
31 static const char invparity[256] = {
32         1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1,
33         0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0,
34         0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0,
35         1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1,
36         0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0,
37         1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1,
38         1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1,
39         0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0,
40         0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0,
41         1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1,
42         1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1,
43         0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0,
44         1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1,
45         0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0,
46         0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0,
47         1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1
48 };
49
50 /*
51  * bitsperbyte contains the number of bits per byte
52  * this is only used for testing and repairing parity
53  * (a precalculated value slightly improves performance)
54  */
55 static const char bitsperbyte[256] = {
56         0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4,
57         1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
58         1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
59         2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
60         1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
61         2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
62         2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
63         3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
64         1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
65         2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
66         2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
67         3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
68         2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
69         3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
70         3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
71         4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8,
72 };
73
74 /*
75  * addressbits is a lookup table to filter out the bits from the xor-ed
76  * ECC data that identify the faulty location.
77  * this is only used for repairing parity
78  * see the comments in nand_ecc_sw_hamming_correct for more details
79  */
80 static const char addressbits[256] = {
81         0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01,
82         0x02, 0x02, 0x03, 0x03, 0x02, 0x02, 0x03, 0x03,
83         0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01,
84         0x02, 0x02, 0x03, 0x03, 0x02, 0x02, 0x03, 0x03,
85         0x04, 0x04, 0x05, 0x05, 0x04, 0x04, 0x05, 0x05,
86         0x06, 0x06, 0x07, 0x07, 0x06, 0x06, 0x07, 0x07,
87         0x04, 0x04, 0x05, 0x05, 0x04, 0x04, 0x05, 0x05,
88         0x06, 0x06, 0x07, 0x07, 0x06, 0x06, 0x07, 0x07,
89         0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01,
90         0x02, 0x02, 0x03, 0x03, 0x02, 0x02, 0x03, 0x03,
91         0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01,
92         0x02, 0x02, 0x03, 0x03, 0x02, 0x02, 0x03, 0x03,
93         0x04, 0x04, 0x05, 0x05, 0x04, 0x04, 0x05, 0x05,
94         0x06, 0x06, 0x07, 0x07, 0x06, 0x06, 0x07, 0x07,
95         0x04, 0x04, 0x05, 0x05, 0x04, 0x04, 0x05, 0x05,
96         0x06, 0x06, 0x07, 0x07, 0x06, 0x06, 0x07, 0x07,
97         0x08, 0x08, 0x09, 0x09, 0x08, 0x08, 0x09, 0x09,
98         0x0a, 0x0a, 0x0b, 0x0b, 0x0a, 0x0a, 0x0b, 0x0b,
99         0x08, 0x08, 0x09, 0x09, 0x08, 0x08, 0x09, 0x09,
100         0x0a, 0x0a, 0x0b, 0x0b, 0x0a, 0x0a, 0x0b, 0x0b,
101         0x0c, 0x0c, 0x0d, 0x0d, 0x0c, 0x0c, 0x0d, 0x0d,
102         0x0e, 0x0e, 0x0f, 0x0f, 0x0e, 0x0e, 0x0f, 0x0f,
103         0x0c, 0x0c, 0x0d, 0x0d, 0x0c, 0x0c, 0x0d, 0x0d,
104         0x0e, 0x0e, 0x0f, 0x0f, 0x0e, 0x0e, 0x0f, 0x0f,
105         0x08, 0x08, 0x09, 0x09, 0x08, 0x08, 0x09, 0x09,
106         0x0a, 0x0a, 0x0b, 0x0b, 0x0a, 0x0a, 0x0b, 0x0b,
107         0x08, 0x08, 0x09, 0x09, 0x08, 0x08, 0x09, 0x09,
108         0x0a, 0x0a, 0x0b, 0x0b, 0x0a, 0x0a, 0x0b, 0x0b,
109         0x0c, 0x0c, 0x0d, 0x0d, 0x0c, 0x0c, 0x0d, 0x0d,
110         0x0e, 0x0e, 0x0f, 0x0f, 0x0e, 0x0e, 0x0f, 0x0f,
111         0x0c, 0x0c, 0x0d, 0x0d, 0x0c, 0x0c, 0x0d, 0x0d,
112         0x0e, 0x0e, 0x0f, 0x0f, 0x0e, 0x0e, 0x0f, 0x0f
113 };
114
115 int ecc_sw_hamming_calculate(const unsigned char *buf, unsigned int step_size,
116                              unsigned char *code, bool sm_order)
117 {
118         const u32 *bp = (uint32_t *)buf;
119         const u32 eccsize_mult = (step_size == 256) ? 1 : 2;
120         /* current value in buffer */
121         u32 cur;
122         /* rp0..rp17 are the various accumulated parities (per byte) */
123         u32 rp0, rp1, rp2, rp3, rp4, rp5, rp6, rp7, rp8, rp9, rp10, rp11, rp12,
124                 rp13, rp14, rp15, rp16, rp17;
125         /* Cumulative parity for all data */
126         u32 par;
127         /* Cumulative parity at the end of the loop (rp12, rp14, rp16) */
128         u32 tmppar;
129         int i;
130
131         par = 0;
132         rp4 = 0;
133         rp6 = 0;
134         rp8 = 0;
135         rp10 = 0;
136         rp12 = 0;
137         rp14 = 0;
138         rp16 = 0;
139         rp17 = 0;
140
141         /*
142          * The loop is unrolled a number of times;
143          * This avoids if statements to decide on which rp value to update
144          * Also we process the data by longwords.
145          * Note: passing unaligned data might give a performance penalty.
146          * It is assumed that the buffers are aligned.
147          * tmppar is the cumulative sum of this iteration.
148          * needed for calculating rp12, rp14, rp16 and par
149          * also used as a performance improvement for rp6, rp8 and rp10
150          */
151         for (i = 0; i < eccsize_mult << 2; i++) {
152                 cur = *bp++;
153                 tmppar = cur;
154                 rp4 ^= cur;
155                 cur = *bp++;
156                 tmppar ^= cur;
157                 rp6 ^= tmppar;
158                 cur = *bp++;
159                 tmppar ^= cur;
160                 rp4 ^= cur;
161                 cur = *bp++;
162                 tmppar ^= cur;
163                 rp8 ^= tmppar;
164
165                 cur = *bp++;
166                 tmppar ^= cur;
167                 rp4 ^= cur;
168                 rp6 ^= cur;
169                 cur = *bp++;
170                 tmppar ^= cur;
171                 rp6 ^= cur;
172                 cur = *bp++;
173                 tmppar ^= cur;
174                 rp4 ^= cur;
175                 cur = *bp++;
176                 tmppar ^= cur;
177                 rp10 ^= tmppar;
178
179                 cur = *bp++;
180                 tmppar ^= cur;
181                 rp4 ^= cur;
182                 rp6 ^= cur;
183                 rp8 ^= cur;
184                 cur = *bp++;
185                 tmppar ^= cur;
186                 rp6 ^= cur;
187                 rp8 ^= cur;
188                 cur = *bp++;
189                 tmppar ^= cur;
190                 rp4 ^= cur;
191                 rp8 ^= cur;
192                 cur = *bp++;
193                 tmppar ^= cur;
194                 rp8 ^= cur;
195
196                 cur = *bp++;
197                 tmppar ^= cur;
198                 rp4 ^= cur;
199                 rp6 ^= cur;
200                 cur = *bp++;
201                 tmppar ^= cur;
202                 rp6 ^= cur;
203                 cur = *bp++;
204                 tmppar ^= cur;
205                 rp4 ^= cur;
206                 cur = *bp++;
207                 tmppar ^= cur;
208
209                 par ^= tmppar;
210                 if ((i & 0x1) == 0)
211                         rp12 ^= tmppar;
212                 if ((i & 0x2) == 0)
213                         rp14 ^= tmppar;
214                 if (eccsize_mult == 2 && (i & 0x4) == 0)
215                         rp16 ^= tmppar;
216         }
217
218         /*
219          * handle the fact that we use longword operations
220          * we'll bring rp4..rp14..rp16 back to single byte entities by
221          * shifting and xoring first fold the upper and lower 16 bits,
222          * then the upper and lower 8 bits.
223          */
224         rp4 ^= (rp4 >> 16);
225         rp4 ^= (rp4 >> 8);
226         rp4 &= 0xff;
227         rp6 ^= (rp6 >> 16);
228         rp6 ^= (rp6 >> 8);
229         rp6 &= 0xff;
230         rp8 ^= (rp8 >> 16);
231         rp8 ^= (rp8 >> 8);
232         rp8 &= 0xff;
233         rp10 ^= (rp10 >> 16);
234         rp10 ^= (rp10 >> 8);
235         rp10 &= 0xff;
236         rp12 ^= (rp12 >> 16);
237         rp12 ^= (rp12 >> 8);
238         rp12 &= 0xff;
239         rp14 ^= (rp14 >> 16);
240         rp14 ^= (rp14 >> 8);
241         rp14 &= 0xff;
242         if (eccsize_mult == 2) {
243                 rp16 ^= (rp16 >> 16);
244                 rp16 ^= (rp16 >> 8);
245                 rp16 &= 0xff;
246         }
247
248         /*
249          * we also need to calculate the row parity for rp0..rp3
250          * This is present in par, because par is now
251          * rp3 rp3 rp2 rp2 in little endian and
252          * rp2 rp2 rp3 rp3 in big endian
253          * as well as
254          * rp1 rp0 rp1 rp0 in little endian and
255          * rp0 rp1 rp0 rp1 in big endian
256          * First calculate rp2 and rp3
257          */
258 #ifdef __BIG_ENDIAN
259         rp2 = (par >> 16);
260         rp2 ^= (rp2 >> 8);
261         rp2 &= 0xff;
262         rp3 = par & 0xffff;
263         rp3 ^= (rp3 >> 8);
264         rp3 &= 0xff;
265 #else
266         rp3 = (par >> 16);
267         rp3 ^= (rp3 >> 8);
268         rp3 &= 0xff;
269         rp2 = par & 0xffff;
270         rp2 ^= (rp2 >> 8);
271         rp2 &= 0xff;
272 #endif
273
274         /* reduce par to 16 bits then calculate rp1 and rp0 */
275         par ^= (par >> 16);
276 #ifdef __BIG_ENDIAN
277         rp0 = (par >> 8) & 0xff;
278         rp1 = (par & 0xff);
279 #else
280         rp1 = (par >> 8) & 0xff;
281         rp0 = (par & 0xff);
282 #endif
283
284         /* finally reduce par to 8 bits */
285         par ^= (par >> 8);
286         par &= 0xff;
287
288         /*
289          * and calculate rp5..rp15..rp17
290          * note that par = rp4 ^ rp5 and due to the commutative property
291          * of the ^ operator we can say:
292          * rp5 = (par ^ rp4);
293          * The & 0xff seems superfluous, but benchmarking learned that
294          * leaving it out gives slightly worse results. No idea why, probably
295          * it has to do with the way the pipeline in pentium is organized.
296          */
297         rp5 = (par ^ rp4) & 0xff;
298         rp7 = (par ^ rp6) & 0xff;
299         rp9 = (par ^ rp8) & 0xff;
300         rp11 = (par ^ rp10) & 0xff;
301         rp13 = (par ^ rp12) & 0xff;
302         rp15 = (par ^ rp14) & 0xff;
303         if (eccsize_mult == 2)
304                 rp17 = (par ^ rp16) & 0xff;
305
306         /*
307          * Finally calculate the ECC bits.
308          * Again here it might seem that there are performance optimisations
309          * possible, but benchmarks showed that on the system this is developed
310          * the code below is the fastest
311          */
312         if (sm_order) {
313                 code[0] = (invparity[rp7] << 7) | (invparity[rp6] << 6) |
314                           (invparity[rp5] << 5) | (invparity[rp4] << 4) |
315                           (invparity[rp3] << 3) | (invparity[rp2] << 2) |
316                           (invparity[rp1] << 1) | (invparity[rp0]);
317                 code[1] = (invparity[rp15] << 7) | (invparity[rp14] << 6) |
318                           (invparity[rp13] << 5) | (invparity[rp12] << 4) |
319                           (invparity[rp11] << 3) | (invparity[rp10] << 2) |
320                           (invparity[rp9] << 1) | (invparity[rp8]);
321         } else {
322                 code[1] = (invparity[rp7] << 7) | (invparity[rp6] << 6) |
323                           (invparity[rp5] << 5) | (invparity[rp4] << 4) |
324                           (invparity[rp3] << 3) | (invparity[rp2] << 2) |
325                           (invparity[rp1] << 1) | (invparity[rp0]);
326                 code[0] = (invparity[rp15] << 7) | (invparity[rp14] << 6) |
327                           (invparity[rp13] << 5) | (invparity[rp12] << 4) |
328                           (invparity[rp11] << 3) | (invparity[rp10] << 2) |
329                           (invparity[rp9] << 1) | (invparity[rp8]);
330         }
331
332         if (eccsize_mult == 1)
333                 code[2] =
334                     (invparity[par & 0xf0] << 7) |
335                     (invparity[par & 0x0f] << 6) |
336                     (invparity[par & 0xcc] << 5) |
337                     (invparity[par & 0x33] << 4) |
338                     (invparity[par & 0xaa] << 3) |
339                     (invparity[par & 0x55] << 2) |
340                     3;
341         else
342                 code[2] =
343                     (invparity[par & 0xf0] << 7) |
344                     (invparity[par & 0x0f] << 6) |
345                     (invparity[par & 0xcc] << 5) |
346                     (invparity[par & 0x33] << 4) |
347                     (invparity[par & 0xaa] << 3) |
348                     (invparity[par & 0x55] << 2) |
349                     (invparity[rp17] << 1) |
350                     (invparity[rp16] << 0);
351
352         return 0;
353 }
354 EXPORT_SYMBOL(ecc_sw_hamming_calculate);
355
356 /**
357  * nand_ecc_sw_hamming_calculate - Calculate 3-byte ECC for 256/512-byte block
358  * @nand: NAND device
359  * @buf: Input buffer with raw data
360  * @code: Output buffer with ECC
361  */
362 int nand_ecc_sw_hamming_calculate(struct nand_device *nand,
363                                   const unsigned char *buf, unsigned char *code)
364 {
365         struct nand_ecc_sw_hamming_conf *engine_conf = nand->ecc.ctx.priv;
366         unsigned int step_size = nand->ecc.ctx.conf.step_size;
367
368         return ecc_sw_hamming_calculate(buf, step_size, code,
369                                         engine_conf->sm_order);
370 }
371 EXPORT_SYMBOL(nand_ecc_sw_hamming_calculate);
372
373 int ecc_sw_hamming_correct(unsigned char *buf, unsigned char *read_ecc,
374                            unsigned char *calc_ecc, unsigned int step_size,
375                            bool sm_order)
376 {
377         const u32 eccsize_mult = step_size >> 8;
378         unsigned char b0, b1, b2, bit_addr;
379         unsigned int byte_addr;
380
381         /*
382          * b0 to b2 indicate which bit is faulty (if any)
383          * we might need the xor result  more than once,
384          * so keep them in a local var
385         */
386         if (sm_order) {
387                 b0 = read_ecc[0] ^ calc_ecc[0];
388                 b1 = read_ecc[1] ^ calc_ecc[1];
389         } else {
390                 b0 = read_ecc[1] ^ calc_ecc[1];
391                 b1 = read_ecc[0] ^ calc_ecc[0];
392         }
393
394         b2 = read_ecc[2] ^ calc_ecc[2];
395
396         /* check if there are any bitfaults */
397
398         /* repeated if statements are slightly more efficient than switch ... */
399         /* ordered in order of likelihood */
400
401         if ((b0 | b1 | b2) == 0)
402                 return 0;       /* no error */
403
404         if ((((b0 ^ (b0 >> 1)) & 0x55) == 0x55) &&
405             (((b1 ^ (b1 >> 1)) & 0x55) == 0x55) &&
406             ((eccsize_mult == 1 && ((b2 ^ (b2 >> 1)) & 0x54) == 0x54) ||
407              (eccsize_mult == 2 && ((b2 ^ (b2 >> 1)) & 0x55) == 0x55))) {
408         /* single bit error */
409                 /*
410                  * rp17/rp15/13/11/9/7/5/3/1 indicate which byte is the faulty
411                  * byte, cp 5/3/1 indicate the faulty bit.
412                  * A lookup table (called addressbits) is used to filter
413                  * the bits from the byte they are in.
414                  * A marginal optimisation is possible by having three
415                  * different lookup tables.
416                  * One as we have now (for b0), one for b2
417                  * (that would avoid the >> 1), and one for b1 (with all values
418                  * << 4). However it was felt that introducing two more tables
419                  * hardly justify the gain.
420                  *
421                  * The b2 shift is there to get rid of the lowest two bits.
422                  * We could also do addressbits[b2] >> 1 but for the
423                  * performance it does not make any difference
424                  */
425                 if (eccsize_mult == 1)
426                         byte_addr = (addressbits[b1] << 4) + addressbits[b0];
427                 else
428                         byte_addr = (addressbits[b2 & 0x3] << 8) +
429                                     (addressbits[b1] << 4) + addressbits[b0];
430                 bit_addr = addressbits[b2 >> 2];
431                 /* flip the bit */
432                 buf[byte_addr] ^= (1 << bit_addr);
433                 return 1;
434
435         }
436         /* count nr of bits; use table lookup, faster than calculating it */
437         if ((bitsperbyte[b0] + bitsperbyte[b1] + bitsperbyte[b2]) == 1)
438                 return 1;       /* error in ECC data; no action needed */
439
440         pr_err("%s: uncorrectable ECC error\n", __func__);
441         return -EBADMSG;
442 }
443 EXPORT_SYMBOL(ecc_sw_hamming_correct);
444
445 /**
446  * nand_ecc_sw_hamming_correct - Detect and correct bit error(s)
447  * @nand: NAND device
448  * @buf: Raw data read from the chip
449  * @read_ecc: ECC bytes read from the chip
450  * @calc_ecc: ECC calculated from the raw data
451  *
452  * Detect and correct up to 1 bit error per 256/512-byte block.
453  */
454 int nand_ecc_sw_hamming_correct(struct nand_device *nand, unsigned char *buf,
455                                 unsigned char *read_ecc,
456                                 unsigned char *calc_ecc)
457 {
458         struct nand_ecc_sw_hamming_conf *engine_conf = nand->ecc.ctx.priv;
459         unsigned int step_size = nand->ecc.ctx.conf.step_size;
460
461         return ecc_sw_hamming_correct(buf, read_ecc, calc_ecc, step_size,
462                                       engine_conf->sm_order);
463 }
464 EXPORT_SYMBOL(nand_ecc_sw_hamming_correct);
465
466 int nand_ecc_sw_hamming_init_ctx(struct nand_device *nand)
467 {
468         struct nand_ecc_props *conf = &nand->ecc.ctx.conf;
469         struct nand_ecc_sw_hamming_conf *engine_conf;
470         struct mtd_info *mtd = nanddev_to_mtd(nand);
471         int ret;
472
473         if (!mtd->ooblayout) {
474                 switch (mtd->oobsize) {
475                 case 8:
476                 case 16:
477                         mtd_set_ooblayout(mtd, nand_get_small_page_ooblayout());
478                         break;
479                 case 64:
480                 case 128:
481                         mtd_set_ooblayout(mtd,
482                                           nand_get_large_page_hamming_ooblayout());
483                         break;
484                 default:
485                         return -ENOTSUPP;
486                 }
487         }
488
489         conf->engine_type = NAND_ECC_ENGINE_TYPE_SOFT;
490         conf->algo = NAND_ECC_ALGO_HAMMING;
491         conf->step_size = nand->ecc.user_conf.step_size;
492         conf->strength = 1;
493
494         /* Use the strongest configuration by default */
495         if (conf->step_size != 256 && conf->step_size != 512)
496                 conf->step_size = 256;
497
498         engine_conf = kzalloc(sizeof(*engine_conf), GFP_KERNEL);
499         if (!engine_conf)
500                 return -ENOMEM;
501
502         ret = nand_ecc_init_req_tweaking(&engine_conf->req_ctx, nand);
503         if (ret)
504                 goto free_engine_conf;
505
506         engine_conf->code_size = 3;
507         engine_conf->calc_buf = kzalloc(mtd->oobsize, GFP_KERNEL);
508         engine_conf->code_buf = kzalloc(mtd->oobsize, GFP_KERNEL);
509         if (!engine_conf->calc_buf || !engine_conf->code_buf) {
510                 ret = -ENOMEM;
511                 goto free_bufs;
512         }
513
514         nand->ecc.ctx.priv = engine_conf;
515         nand->ecc.ctx.nsteps = mtd->writesize / conf->step_size;
516         nand->ecc.ctx.total = nand->ecc.ctx.nsteps * engine_conf->code_size;
517
518         return 0;
519
520 free_bufs:
521         nand_ecc_cleanup_req_tweaking(&engine_conf->req_ctx);
522         kfree(engine_conf->calc_buf);
523         kfree(engine_conf->code_buf);
524 free_engine_conf:
525         kfree(engine_conf);
526
527         return ret;
528 }
529 EXPORT_SYMBOL(nand_ecc_sw_hamming_init_ctx);
530
531 void nand_ecc_sw_hamming_cleanup_ctx(struct nand_device *nand)
532 {
533         struct nand_ecc_sw_hamming_conf *engine_conf = nand->ecc.ctx.priv;
534
535         if (engine_conf) {
536                 nand_ecc_cleanup_req_tweaking(&engine_conf->req_ctx);
537                 kfree(engine_conf->calc_buf);
538                 kfree(engine_conf->code_buf);
539                 kfree(engine_conf);
540         }
541 }
542 EXPORT_SYMBOL(nand_ecc_sw_hamming_cleanup_ctx);
543
544 static int nand_ecc_sw_hamming_prepare_io_req(struct nand_device *nand,
545                                               struct nand_page_io_req *req)
546 {
547         struct nand_ecc_sw_hamming_conf *engine_conf = nand->ecc.ctx.priv;
548         struct mtd_info *mtd = nanddev_to_mtd(nand);
549         int eccsize = nand->ecc.ctx.conf.step_size;
550         int eccbytes = engine_conf->code_size;
551         int eccsteps = nand->ecc.ctx.nsteps;
552         int total = nand->ecc.ctx.total;
553         u8 *ecccalc = engine_conf->calc_buf;
554         const u8 *data;
555         int i;
556
557         /* Nothing to do for a raw operation */
558         if (req->mode == MTD_OPS_RAW)
559                 return 0;
560
561         /* This engine does not provide BBM/free OOB bytes protection */
562         if (!req->datalen)
563                 return 0;
564
565         nand_ecc_tweak_req(&engine_conf->req_ctx, req);
566
567         /* No more preparation for page read */
568         if (req->type == NAND_PAGE_READ)
569                 return 0;
570
571         /* Preparation for page write: derive the ECC bytes and place them */
572         for (i = 0, data = req->databuf.out;
573              eccsteps;
574              eccsteps--, i += eccbytes, data += eccsize)
575                 nand_ecc_sw_hamming_calculate(nand, data, &ecccalc[i]);
576
577         return mtd_ooblayout_set_eccbytes(mtd, ecccalc, (void *)req->oobbuf.out,
578                                           0, total);
579 }
580
581 static int nand_ecc_sw_hamming_finish_io_req(struct nand_device *nand,
582                                              struct nand_page_io_req *req)
583 {
584         struct nand_ecc_sw_hamming_conf *engine_conf = nand->ecc.ctx.priv;
585         struct mtd_info *mtd = nanddev_to_mtd(nand);
586         int eccsize = nand->ecc.ctx.conf.step_size;
587         int total = nand->ecc.ctx.total;
588         int eccbytes = engine_conf->code_size;
589         int eccsteps = nand->ecc.ctx.nsteps;
590         u8 *ecccalc = engine_conf->calc_buf;
591         u8 *ecccode = engine_conf->code_buf;
592         unsigned int max_bitflips = 0;
593         u8 *data = req->databuf.in;
594         int i, ret;
595
596         /* Nothing to do for a raw operation */
597         if (req->mode == MTD_OPS_RAW)
598                 return 0;
599
600         /* This engine does not provide BBM/free OOB bytes protection */
601         if (!req->datalen)
602                 return 0;
603
604         /* No more preparation for page write */
605         if (req->type == NAND_PAGE_WRITE) {
606                 nand_ecc_restore_req(&engine_conf->req_ctx, req);
607                 return 0;
608         }
609
610         /* Finish a page read: retrieve the (raw) ECC bytes*/
611         ret = mtd_ooblayout_get_eccbytes(mtd, ecccode, req->oobbuf.in, 0,
612                                          total);
613         if (ret)
614                 return ret;
615
616         /* Calculate the ECC bytes */
617         for (i = 0; eccsteps; eccsteps--, i += eccbytes, data += eccsize)
618                 nand_ecc_sw_hamming_calculate(nand, data, &ecccalc[i]);
619
620         /* Finish a page read: compare and correct */
621         for (eccsteps = nand->ecc.ctx.nsteps, i = 0, data = req->databuf.in;
622              eccsteps;
623              eccsteps--, i += eccbytes, data += eccsize) {
624                 int stat =  nand_ecc_sw_hamming_correct(nand, data,
625                                                         &ecccode[i],
626                                                         &ecccalc[i]);
627                 if (stat < 0) {
628                         mtd->ecc_stats.failed++;
629                 } else {
630                         mtd->ecc_stats.corrected += stat;
631                         max_bitflips = max_t(unsigned int, max_bitflips, stat);
632                 }
633         }
634
635         nand_ecc_restore_req(&engine_conf->req_ctx, req);
636
637         return max_bitflips;
638 }
639
640 static struct nand_ecc_engine_ops nand_ecc_sw_hamming_engine_ops = {
641         .init_ctx = nand_ecc_sw_hamming_init_ctx,
642         .cleanup_ctx = nand_ecc_sw_hamming_cleanup_ctx,
643         .prepare_io_req = nand_ecc_sw_hamming_prepare_io_req,
644         .finish_io_req = nand_ecc_sw_hamming_finish_io_req,
645 };
646
647 static struct nand_ecc_engine nand_ecc_sw_hamming_engine = {
648         .ops = &nand_ecc_sw_hamming_engine_ops,
649 };
650
651 struct nand_ecc_engine *nand_ecc_sw_hamming_get_engine(void)
652 {
653         return &nand_ecc_sw_hamming_engine;
654 }
655 EXPORT_SYMBOL(nand_ecc_sw_hamming_get_engine);
656
657 MODULE_LICENSE("GPL");
658 MODULE_AUTHOR("Frans Meulenbroeks <fransmeulenbroeks@gmail.com>");
659 MODULE_DESCRIPTION("NAND software Hamming ECC support");