2 * Copyright (C) 2009-2012 Semihalf
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 #include <sys/cdefs.h>
28 __FBSDID("$FreeBSD$");
30 #include <sys/param.h>
31 #include <sys/systm.h>
32 #include <sys/kernel.h>
33 #include <sys/socket.h>
34 #include <sys/malloc.h>
35 #include <sys/module.h>
38 #include <sys/mutex.h>
39 #include <sys/callout.h>
40 #include <sys/sysctl.h>
42 #include <dev/nand/nand.h>
43 #include <dev/nand/nandbus.h>
44 #include <dev/nand/nand_ecc_pos.h>
47 #include "nandbus_if.h"
48 #include <machine/stdarg.h>
50 #define NAND_RESET_DELAY 1000 /* tRST */
51 #define NAND_ERASE_DELAY 3000 /* tBERS */
52 #define NAND_PROG_DELAY 700 /* tPROG */
53 #define NAND_READ_DELAY 50 /* tR */
55 #define BIT0(x) ((x) & 0x1)
56 #define BIT1(x) (BIT0(x >> 1))
57 #define BIT2(x) (BIT0(x >> 2))
58 #define BIT3(x) (BIT0(x >> 3))
59 #define BIT4(x) (BIT0(x >> 4))
60 #define BIT5(x) (BIT0(x >> 5))
61 #define BIT6(x) (BIT0(x >> 6))
62 #define BIT7(x) (BIT0(x >> 7))
64 #define SOFTECC_SIZE 256
65 #define SOFTECC_BYTES 3
67 int nand_debug_flag = 0;
68 SYSCTL_INT(_debug, OID_AUTO, nand_debug, CTLFLAG_RW, &nand_debug_flag, 0,
69 "NAND subsystem debug flag");
72 nand_tunable_init(void *arg)
75 TUNABLE_INT_FETCH("debug.nand", &nand_debug_flag);
78 SYSINIT(nand_tunables, SI_SUB_VFS, SI_ORDER_ANY, nand_tunable_init, NULL);
80 MALLOC_DEFINE(M_NAND, "NAND", "NAND dynamic data");
82 static void calculate_ecc(const uint8_t *, uint8_t *);
83 static int correct_ecc(uint8_t *, uint8_t *, uint8_t *);
86 nand_debug(int level, const char *fmt, ...)
90 if (!(nand_debug_flag & level))
99 nand_init(struct nand_softc *nand, device_t dev, int ecc_mode,
100 int ecc_bytes, int ecc_size, uint16_t *eccposition, char *cdev_name)
103 nand->ecc.eccmode = ecc_mode;
104 nand->chip_cdev_name = cdev_name;
106 if (ecc_mode == NAND_ECC_SOFT) {
107 nand->ecc.eccbytes = SOFTECC_BYTES;
108 nand->ecc.eccsize = SOFTECC_SIZE;
109 } else if (ecc_mode != NAND_ECC_NONE) {
110 nand->ecc.eccbytes = ecc_bytes;
111 nand->ecc.eccsize = ecc_size;
113 nand->ecc.eccpositions = eccposition;
118 nand_onfi_set_params(struct nand_chip *chip, struct onfi_chip_params *params)
120 struct chip_geom *cg;
122 cg = &chip->chip_geom;
124 init_chip_geom(cg, params->luns, params->blocks_per_lun,
125 params->pages_per_block, params->bytes_per_page,
126 params->spare_bytes_per_page);
127 chip->t_bers = params->t_bers;
128 chip->t_prog = params->t_prog;
129 chip->t_r = params->t_r;
130 chip->t_ccs = params->t_ccs;
132 if (params->features & ONFI_FEAT_16BIT)
133 chip->flags |= NAND_16_BIT;
137 nand_set_params(struct nand_chip *chip, struct nand_params *params)
139 struct chip_geom *cg;
140 uint32_t blocks_per_chip;
142 cg = &chip->chip_geom;
143 blocks_per_chip = (params->chip_size << 20) /
144 (params->page_size * params->pages_per_block);
146 init_chip_geom(cg, 1, blocks_per_chip,
147 params->pages_per_block, params->page_size,
150 chip->t_bers = NAND_ERASE_DELAY;
151 chip->t_prog = NAND_PROG_DELAY;
152 chip->t_r = NAND_READ_DELAY;
155 if (params->flags & NAND_16_BIT)
156 chip->flags |= NAND_16_BIT;
160 nand_init_stat(struct nand_chip *chip)
162 struct block_stat *blk_stat;
163 struct page_stat *pg_stat;
164 struct chip_geom *cg;
167 cg = &chip->chip_geom;
168 blks = cg->blks_per_lun * cg->luns;
169 blk_stat = malloc(sizeof(struct block_stat) * blks, M_NAND,
174 pgs = blks * cg->pgs_per_blk;
175 pg_stat = malloc(sizeof(struct page_stat) * pgs, M_NAND,
178 free(blk_stat, M_NAND);
182 chip->blk_stat = blk_stat;
183 chip->pg_stat = pg_stat;
189 nand_destroy_stat(struct nand_chip *chip)
192 free(chip->pg_stat, M_NAND);
193 free(chip->blk_stat, M_NAND);
197 init_chip_geom(struct chip_geom *cg, uint32_t luns, uint32_t blks_per_lun,
198 uint32_t pgs_per_blk, uint32_t pg_size, uint32_t oob_size)
206 cg->blks_per_lun = blks_per_lun;
207 cg->blks_per_chip = blks_per_lun * luns;
208 cg->pgs_per_blk = pgs_per_blk;
210 cg->page_size = pg_size;
211 cg->oob_size = oob_size;
212 cg->block_size = cg->page_size * cg->pgs_per_blk;
213 cg->chip_size = cg->block_size * cg->blks_per_chip;
215 shift = fls(cg->pgs_per_blk - 1);
216 cg->pg_mask = (1 << shift) - 1;
217 cg->blk_shift = shift;
219 if (cg->blks_per_lun > 0) {
220 shift = fls(cg->blks_per_lun - 1);
221 cg->blk_mask = ((1 << shift) - 1) << cg->blk_shift;
227 cg->lun_shift = shift + cg->blk_shift;
228 shift = fls(cg->luns - 1);
229 cg->lun_mask = ((1 << shift) - 1) << cg->lun_shift;
231 nand_debug(NDBG_NAND, "Masks: lun 0x%x blk 0x%x page 0x%x\n"
232 "Shifts: lun %d blk %d",
233 cg->lun_mask, cg->blk_mask, cg->pg_mask,
234 cg->lun_shift, cg->blk_shift);
240 nand_row_to_blkpg(struct chip_geom *cg, uint32_t row, uint32_t *lun,
241 uint32_t *blk, uint32_t *pg)
244 if (!cg || !lun || !blk || !pg)
247 if (row & ~(cg->lun_mask | cg->blk_mask | cg->pg_mask)) {
248 nand_debug(NDBG_NAND,"Address out of bounds\n");
252 *lun = (row & cg->lun_mask) >> cg->lun_shift;
253 *blk = (row & cg->blk_mask) >> cg->blk_shift;
254 *pg = (row & cg->pg_mask);
256 nand_debug(NDBG_NAND,"address %x-%x-%x\n", *lun, *blk, *pg);
261 int page_to_row(struct chip_geom *cg, uint32_t page, uint32_t *row)
263 uint32_t lun, block, pg_in_blk;
268 block = page / cg->pgs_per_blk;
269 pg_in_blk = page % cg->pgs_per_blk;
271 lun = block / cg->blks_per_lun;
272 block = block % cg->blks_per_lun;
274 *row = (lun << cg->lun_shift) & cg->lun_mask;
275 *row |= ((block << cg->blk_shift) & cg->blk_mask);
276 *row |= (pg_in_blk & cg->pg_mask);
282 nand_check_page_boundary(struct nand_chip *chip, uint32_t page)
284 struct chip_geom* cg;
286 cg = &chip->chip_geom;
287 if (page >= (cg->pgs_per_blk * cg->blks_per_lun * cg->luns)) {
288 nand_debug(NDBG_GEN,"%s: page number too big %#x\n",
297 nand_get_chip_param(struct nand_chip *chip, struct chip_param_io *param)
299 struct chip_geom *cg;
301 cg = &chip->chip_geom;
302 param->page_size = cg->page_size;
303 param->oob_size = cg->oob_size;
305 param->blocks = cg->blks_per_lun * cg->luns;
306 param->pages_per_block = cg->pgs_per_blk;
310 default_software_ecc_positions(struct nand_chip *chip)
312 /* If positions have been set already, use them. */
313 if (chip->nand->ecc.eccpositions)
314 return (chip->nand->ecc.eccpositions);
317 * XXX Note that the following logic isn't really sufficient, especially
318 * in the ONFI case where the number of ECC bytes can be dictated by
319 * values in the parameters page, and that could lead to needing more
320 * byte positions than exist within the tables of software-ecc defaults.
322 if (chip->chip_geom.oob_size >= 128)
323 return (default_software_ecc_positions_128);
324 if (chip->chip_geom.oob_size >= 64)
325 return (default_software_ecc_positions_64);
326 else if (chip->chip_geom.oob_size >= 16)
327 return (default_software_ecc_positions_16);
333 calculate_ecc(const uint8_t *buf, uint8_t *ecc)
340 for (i = 0; i < 256; i++) {
342 ecc[0] ^= (BIT0(byte) ^ BIT2(byte) ^ BIT4(byte) ^
344 ecc[0] ^= (BIT1(byte) ^ BIT3(byte) ^ BIT5(byte) ^
346 ecc[0] ^= (BIT0(byte) ^ BIT1(byte) ^ BIT4(byte) ^
348 ecc[0] ^= (BIT2(byte) ^ BIT3(byte) ^ BIT6(byte) ^
350 ecc[0] ^= (BIT0(byte) ^ BIT1(byte) ^ BIT2(byte) ^
352 ecc[0] ^= (BIT4(byte) ^ BIT5(byte) ^ BIT6(byte) ^
355 p8 = BIT0(byte) ^ BIT1(byte) ^ BIT2(byte) ^
356 BIT3(byte) ^ BIT4(byte) ^ BIT5(byte) ^ BIT6(byte) ^
360 ecc[2] ^= (0x1 << BIT0(i));
361 ecc[2] ^= (0x4 << BIT1(i));
362 ecc[2] ^= (0x10 << BIT2(i));
363 ecc[2] ^= (0x40 << BIT3(i));
365 ecc[1] ^= (0x1 << BIT4(i));
366 ecc[1] ^= (0x4 << BIT5(i));
367 ecc[1] ^= (0x10 << BIT6(i));
368 ecc[1] ^= (0x40 << BIT7(i));
378 correct_ecc(uint8_t *buf, uint8_t *calc_ecc, uint8_t *read_ecc)
380 uint8_t ecc0, ecc1, ecc2, onesnum, bit, byte;
383 ecc0 = calc_ecc[0] ^ read_ecc[0];
384 ecc1 = calc_ecc[1] ^ read_ecc[1];
385 ecc2 = calc_ecc[2] ^ read_ecc[2];
387 if (!ecc0 && !ecc1 && !ecc2)
390 addr = BIT3(ecc0) | (BIT5(ecc0) << 1) | (BIT7(ecc0) << 2);
391 addr |= (BIT1(ecc2) << 3) | (BIT3(ecc2) << 4) |
392 (BIT5(ecc2) << 5) | (BIT7(ecc2) << 6);
393 addr |= (BIT1(ecc1) << 7) | (BIT3(ecc1) << 8) |
394 (BIT5(ecc1) << 9) | (BIT7(ecc1) << 10);
397 while (ecc0 || ecc1 || ecc2) {
411 /* Correctable error */
414 buf[byte] ^= (1 << bit);
415 return (ECC_CORRECTABLE);
416 } else if (onesnum == 1) {
418 return (ECC_ERROR_ECC);
420 /* Uncorrectable error */
421 return (ECC_UNCORRECTABLE);
428 nand_softecc_get(device_t dev, uint8_t *buf, int pagesize, uint8_t *ecc)
430 int steps = pagesize / SOFTECC_SIZE;
433 for (; i < (steps * SOFTECC_BYTES);
434 i += SOFTECC_BYTES, j += SOFTECC_SIZE) {
435 calculate_ecc(&buf[j], &ecc[i]);
442 nand_softecc_correct(device_t dev, uint8_t *buf, int pagesize,
443 uint8_t *readecc, uint8_t *calcecc)
445 int steps = pagesize / SOFTECC_SIZE;
446 int i = 0, j = 0, ret = 0;
448 for (i = 0; i < (steps * SOFTECC_BYTES);
449 i += SOFTECC_BYTES, j += SOFTECC_SIZE) {
450 ret += correct_ecc(&buf[j], &calcecc[i], &readecc[i]);
459 offset_to_page(struct chip_geom *cg, uint32_t offset)
462 return (offset / cg->page_size);
466 nand_read_pages(struct nand_chip *chip, uint32_t offset, void *buf,
469 struct chip_geom *cg;
470 struct nand_ecc_data *eccd;
471 struct page_stat *pg_stat;
475 uint16_t *eccpos = NULL;
476 uint32_t page, num, steps = 0;
477 int i, retval = 0, needwrite;
479 nand_debug(NDBG_NAND,"%p read page %x[%x]", chip, offset, len);
480 cg = &chip->chip_geom;
481 eccd = &chip->nand->ecc;
482 page = offset_to_page(cg, offset);
483 num = len / cg->page_size;
485 if (eccd->eccmode != NAND_ECC_NONE) {
486 steps = cg->page_size / eccd->eccsize;
487 eccpos = default_software_ecc_positions(chip);
488 oob = malloc(cg->oob_size, M_NAND, M_WAITOK);
491 nandbus = device_get_parent(chip->dev);
492 NANDBUS_LOCK(nandbus);
493 NANDBUS_SELECT_CS(device_get_parent(chip->dev), chip->num);
495 ptr = (uint8_t *)buf;
497 pg_stat = &(chip->pg_stat[page]);
499 if (NAND_READ_PAGE(chip->dev, page, ptr, cg->page_size, 0)) {
504 if (eccd->eccmode != NAND_ECC_NONE) {
505 if (NAND_GET_ECC(chip->dev, ptr, eccd->ecccalculated,
510 nand_debug(NDBG_ECC,"%s: ECC calculated:",
512 if (nand_debug_flag & NDBG_ECC)
513 for (i = 0; i < (eccd->eccbytes * steps); i++)
514 printf("%x ", eccd->ecccalculated[i]);
516 nand_debug(NDBG_ECC,"\n");
518 if (NAND_READ_OOB(chip->dev, page, oob, cg->oob_size,
523 for (i = 0; i < (eccd->eccbytes * steps); i++)
524 eccd->eccread[i] = ((uint8_t *)oob)[eccpos[i]];
526 nand_debug(NDBG_ECC,"%s: ECC read:", __func__);
527 if (nand_debug_flag & NDBG_ECC)
528 for (i = 0; i < (eccd->eccbytes * steps); i++)
529 printf("%x ", eccd->eccread[i]);
530 nand_debug(NDBG_ECC,"\n");
532 retval = NAND_CORRECT_ECC(chip->dev, ptr, eccd->eccread,
533 eccd->ecccalculated);
535 nand_debug(NDBG_ECC, "NAND_CORRECT_ECC() returned %d",
539 pg_stat->ecc_stat.ecc_succeded++;
540 else if (retval > 0) {
541 pg_stat->ecc_stat.ecc_corrected += retval;
542 retval = ECC_CORRECTABLE;
544 pg_stat->ecc_stat.ecc_failed++;
549 pg_stat->page_read++;
551 ptr += cg->page_size;
554 NANDBUS_UNLOCK(nandbus);
563 nand_read_pages_raw(struct nand_chip *chip, uint32_t offset, void *buf,
566 struct chip_geom *cg;
569 uint32_t page, num, end, begin = 0, begin_off;
572 cg = &chip->chip_geom;
573 page = offset_to_page(cg, offset);
574 begin_off = offset - page * cg->page_size;
576 begin = cg->page_size - begin_off;
579 num = len / cg->page_size;
580 end = len % cg->page_size;
582 nandbus = device_get_parent(chip->dev);
583 NANDBUS_LOCK(nandbus);
584 NANDBUS_SELECT_CS(device_get_parent(chip->dev), chip->num);
586 ptr = (uint8_t *)buf;
588 if (NAND_READ_PAGE(chip->dev, page, ptr, begin, begin_off)) {
589 NANDBUS_UNLOCK(nandbus);
598 if (NAND_READ_PAGE(chip->dev, page, ptr, cg->page_size, 0)) {
599 NANDBUS_UNLOCK(nandbus);
604 ptr += cg->page_size;
608 if (NAND_READ_PAGE(chip->dev, page, ptr, end, 0)) {
609 NANDBUS_UNLOCK(nandbus);
613 NANDBUS_UNLOCK(nandbus);
620 nand_prog_pages(struct nand_chip *chip, uint32_t offset, uint8_t *buf,
623 struct chip_geom *cg;
624 struct page_stat *pg_stat;
625 struct nand_ecc_data *eccd;
629 uint16_t *eccpos = NULL;
630 int steps = 0, i, needwrite, err = 0;
632 nand_debug(NDBG_NAND,"%p prog page %x[%x]", chip, offset, len);
634 eccd = &chip->nand->ecc;
635 cg = &chip->chip_geom;
636 page = offset_to_page(cg, offset);
637 num = len / cg->page_size;
639 if (eccd->eccmode != NAND_ECC_NONE) {
640 steps = cg->page_size / eccd->eccsize;
641 oob = malloc(cg->oob_size, M_NAND, M_WAITOK);
642 eccpos = default_software_ecc_positions(chip);
645 nandbus = device_get_parent(chip->dev);
646 NANDBUS_LOCK(nandbus);
647 NANDBUS_SELECT_CS(device_get_parent(chip->dev), chip->num);
650 if (NAND_PROGRAM_PAGE(chip->dev, page, buf, cg->page_size, 0)) {
655 if (eccd->eccmode != NAND_ECC_NONE) {
656 if (NAND_GET_ECC(chip->dev, buf, &eccd->ecccalculated,
661 nand_debug(NDBG_ECC,"ECC calculated:");
662 if (nand_debug_flag & NDBG_ECC)
663 for (i = 0; i < (eccd->eccbytes * steps); i++)
664 printf("%x ", eccd->ecccalculated[i]);
666 nand_debug(NDBG_ECC,"\n");
669 if (NAND_READ_OOB(chip->dev, page, oob, cg->oob_size,
675 for (i = 0; i < (eccd->eccbytes * steps); i++)
676 oob[eccpos[i]] = eccd->ecccalculated[i];
678 if (NAND_PROGRAM_OOB(chip->dev, page, oob,
686 pg_stat = &(chip->pg_stat[page]);
687 pg_stat->page_written++;
690 buf += cg->page_size;
693 NANDBUS_UNLOCK(nandbus);
702 nand_prog_pages_raw(struct nand_chip *chip, uint32_t offset, void *buf,
705 struct chip_geom *cg;
708 uint32_t page, num, end, begin = 0, begin_off;
711 cg = &chip->chip_geom;
712 page = offset_to_page(cg, offset);
713 begin_off = offset - page * cg->page_size;
715 begin = cg->page_size - begin_off;
718 num = len / cg->page_size;
719 end = len % cg->page_size;
721 nandbus = device_get_parent(chip->dev);
722 NANDBUS_LOCK(nandbus);
723 NANDBUS_SELECT_CS(device_get_parent(chip->dev), chip->num);
725 ptr = (uint8_t *)buf;
727 if (NAND_PROGRAM_PAGE(chip->dev, page, ptr, begin, begin_off)) {
728 NANDBUS_UNLOCK(nandbus);
737 if (NAND_PROGRAM_PAGE(chip->dev, page, ptr, cg->page_size, 0)) {
738 NANDBUS_UNLOCK(nandbus);
743 ptr += cg->page_size;
747 retval = NAND_PROGRAM_PAGE(chip->dev, page, ptr, end, 0);
749 NANDBUS_UNLOCK(nandbus);
755 nand_read_oob(struct nand_chip *chip, uint32_t page, void *buf,
761 nandbus = device_get_parent(chip->dev);
762 NANDBUS_LOCK(nandbus);
763 NANDBUS_SELECT_CS(device_get_parent(chip->dev), chip->num);
765 retval = NAND_READ_OOB(chip->dev, page, buf, len, 0);
767 NANDBUS_UNLOCK(nandbus);
774 nand_prog_oob(struct nand_chip *chip, uint32_t page, void *buf,
780 nandbus = device_get_parent(chip->dev);
781 NANDBUS_LOCK(nandbus);
782 NANDBUS_SELECT_CS(device_get_parent(chip->dev), chip->num);
784 retval = NAND_PROGRAM_OOB(chip->dev, page, buf, len, 0);
786 NANDBUS_UNLOCK(nandbus);
792 nand_erase_blocks(struct nand_chip *chip, off_t offset, size_t len)
795 struct chip_geom *cg;
796 uint32_t block, num_blocks;
799 cg = &chip->chip_geom;
800 if ((offset % cg->block_size) || (len % cg->block_size))
803 block = offset / cg->block_size;
804 num_blocks = len / cg->block_size;
805 nand_debug(NDBG_NAND,"%p erase blocks %d[%d]", chip, block, num_blocks);
807 nandbus = device_get_parent(chip->dev);
808 NANDBUS_LOCK(nandbus);
809 NANDBUS_SELECT_CS(device_get_parent(chip->dev), chip->num);
811 while (num_blocks--) {
812 if (!nand_check_bad_block(chip, block)) {
813 if (NAND_ERASE_BLOCK(chip->dev, block)) {
814 nand_debug(NDBG_NAND,"%p erase blocks %d error",
816 nand_mark_bad_block(chip, block);
825 NANDBUS_UNLOCK(nandbus);
828 nand_update_bbt(chip);
833 MODULE_VERSION(nand, 1);