1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Copyright (C) 2017 Free Electrons
4 * Copyright (C) 2017 NextThing Co
6 * Author: Boris Brezillon <boris.brezillon@free-electrons.com>
11 /* Bit for detecting BENAND */
12 #define TOSHIBA_NAND_ID4_IS_BENAND BIT(7)
14 /* Recommended to rewrite for BENAND */
15 #define TOSHIBA_NAND_STATUS_REWRITE_RECOMMENDED BIT(3)
17 static int toshiba_nand_benand_eccstatus(struct nand_chip
*chip
)
19 struct mtd_info
*mtd
= nand_to_mtd(chip
);
21 unsigned int max_bitflips
= 0;
25 ret
= nand_status_op(chip
, &status
);
29 if (status
& NAND_STATUS_FAIL
) {
31 mtd
->ecc_stats
.failed
++;
32 } else if (status
& TOSHIBA_NAND_STATUS_REWRITE_RECOMMENDED
) {
34 max_bitflips
= mtd
->bitflip_threshold
;
35 mtd
->ecc_stats
.corrected
+= max_bitflips
;
42 toshiba_nand_read_page_benand(struct nand_chip
*chip
, uint8_t *buf
,
43 int oob_required
, int page
)
47 ret
= nand_read_page_raw(chip
, buf
, oob_required
, page
);
51 return toshiba_nand_benand_eccstatus(chip
);
55 toshiba_nand_read_subpage_benand(struct nand_chip
*chip
, uint32_t data_offs
,
56 uint32_t readlen
, uint8_t *bufpoi
, int page
)
60 ret
= nand_read_page_op(chip
, page
, data_offs
,
61 bufpoi
+ data_offs
, readlen
);
65 return toshiba_nand_benand_eccstatus(chip
);
68 static void toshiba_nand_benand_init(struct nand_chip
*chip
)
70 struct mtd_info
*mtd
= nand_to_mtd(chip
);
73 * On BENAND, the entire OOB region can be used by the MTD user.
74 * The calculated ECC bytes are stored into other isolated
75 * area which is not accessible to users.
76 * This is why chip->ecc.bytes = 0.
80 chip
->ecc
.strength
= 8;
81 chip
->ecc
.read_page
= toshiba_nand_read_page_benand
;
82 chip
->ecc
.read_subpage
= toshiba_nand_read_subpage_benand
;
83 chip
->ecc
.write_page
= nand_write_page_raw
;
84 chip
->ecc
.read_page_raw
= nand_read_page_raw_notsupp
;
85 chip
->ecc
.write_page_raw
= nand_write_page_raw_notsupp
;
87 chip
->options
|= NAND_SUBPAGE_READ
;
89 mtd_set_ooblayout(mtd
, &nand_ooblayout_lp_ops
);
92 static void toshiba_nand_decode_id(struct nand_chip
*chip
)
94 struct mtd_info
*mtd
= nand_to_mtd(chip
);
95 struct nand_memory_organization
*memorg
;
97 memorg
= nanddev_get_memorg(&chip
->base
);
99 nand_decode_ext_id(chip
);
102 * Toshiba 24nm raw SLC (i.e., not BENAND) have 32B OOB per
103 * 512B page. For Toshiba SLC, we decode the 5th/6th byte as
105 * - ID byte 6, bits[2:0]: 100b -> 43nm, 101b -> 32nm,
107 * - ID byte 5, bit[7]: 1 -> BENAND, 0 -> raw SLC
109 if (chip
->id
.len
>= 6 && nand_is_slc(chip
) &&
110 (chip
->id
.data
[5] & 0x7) == 0x6 /* 24nm */ &&
111 !(chip
->id
.data
[4] & 0x80) /* !BENAND */) {
112 memorg
->oobsize
= 32 * memorg
->pagesize
>> 9;
113 mtd
->oobsize
= memorg
->oobsize
;
117 * Extract ECC requirements from 6th id byte.
118 * For Toshiba SLC, ecc requrements are as follows:
119 * - 43nm: 1 bit ECC for each 512Byte is required.
120 * - 32nm: 4 bit ECC for each 512Byte is required.
121 * - 24nm: 8 bit ECC for each 512Byte is required.
123 if (chip
->id
.len
>= 6 && nand_is_slc(chip
)) {
124 chip
->base
.eccreq
.step_size
= 512;
125 switch (chip
->id
.data
[5] & 0x7) {
127 chip
->base
.eccreq
.strength
= 1;
130 chip
->base
.eccreq
.strength
= 4;
133 chip
->base
.eccreq
.strength
= 8;
136 WARN(1, "Could not get ECC info");
137 chip
->base
.eccreq
.step_size
= 0;
143 static int toshiba_nand_init(struct nand_chip
*chip
)
145 if (nand_is_slc(chip
))
146 chip
->options
|= NAND_BBM_FIRSTPAGE
| NAND_BBM_SECONDPAGE
;
148 /* Check that chip is BENAND and ECC mode is on-die */
149 if (nand_is_slc(chip
) && chip
->ecc
.mode
== NAND_ECC_ON_DIE
&&
150 chip
->id
.data
[4] & TOSHIBA_NAND_ID4_IS_BENAND
)
151 toshiba_nand_benand_init(chip
);
156 const struct nand_manufacturer_ops toshiba_nand_manuf_ops
= {
157 .detect
= toshiba_nand_decode_id
,
158 .init
= toshiba_nand_init
,