1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (c) 2018 Macronix
8 #include <linux/bitfield.h>
9 #include <linux/device.h>
10 #include <linux/kernel.h>
11 #include <linux/mtd/spinand.h>
13 #define SPINAND_MFR_MACRONIX 0xC2
14 #define MACRONIX_ECCSR_BF_LAST_PAGE(eccsr) FIELD_GET(GENMASK(3, 0), eccsr)
15 #define MACRONIX_ECCSR_BF_ACCUMULATED_PAGES(eccsr) FIELD_GET(GENMASK(7, 4), eccsr)
16 #define MACRONIX_CFG_CONT_READ BIT(2)
18 #define STATUS_ECC_HAS_BITFLIPS_THRESHOLD (3 << 4)
20 /* Bitflip theshold configuration register */
21 #define REG_CFG_BFT 0x10
22 #define CFG_BFT(x) FIELD_PREP(GENMASK(7, 4), (x))
24 struct macronix_priv {
28 static SPINAND_OP_VARIANTS(read_cache_variants,
29 SPINAND_PAGE_READ_FROM_CACHE_X4_OP(0, 1, NULL, 0),
30 SPINAND_PAGE_READ_FROM_CACHE_X2_OP(0, 1, NULL, 0),
31 SPINAND_PAGE_READ_FROM_CACHE_FAST_OP(0, 1, NULL, 0),
32 SPINAND_PAGE_READ_FROM_CACHE_OP(0, 1, NULL, 0));
34 static SPINAND_OP_VARIANTS(write_cache_variants,
35 SPINAND_PROG_LOAD_X4(true, 0, NULL, 0),
36 SPINAND_PROG_LOAD(false, 0, NULL, 0));
38 static SPINAND_OP_VARIANTS(update_cache_variants,
39 SPINAND_PROG_LOAD_X4(false, 0, NULL, 0),
40 SPINAND_PROG_LOAD(false, 0, NULL, 0));
42 static int mx35lfxge4ab_ooblayout_ecc(struct mtd_info *mtd, int section,
43 struct mtd_oob_region *region)
48 static int mx35lfxge4ab_ooblayout_free(struct mtd_info *mtd, int section,
49 struct mtd_oob_region *region)
55 region->length = mtd->oobsize - 2;
60 static const struct mtd_ooblayout_ops mx35lfxge4ab_ooblayout = {
61 .ecc = mx35lfxge4ab_ooblayout_ecc,
62 .free = mx35lfxge4ab_ooblayout_free,
65 static int macronix_get_eccsr(struct spinand_device *spinand, u8 *eccsr)
67 struct macronix_priv *priv = spinand->priv;
68 struct spi_mem_op op = SPI_MEM_OP(SPI_MEM_OP_CMD(0x7c, 1),
70 SPI_MEM_OP_DUMMY(1, 1),
71 SPI_MEM_OP_DATA_IN(1, eccsr, 1));
73 int ret = spi_mem_exec_op(spinand->spimem, &op);
78 * ECCSR exposes the number of bitflips for the last read page in bits [3:0].
79 * Continuous read compatible chips also expose the maximum number of
80 * bitflips for the whole (continuous) read operation in bits [7:4].
83 *eccsr = MACRONIX_ECCSR_BF_LAST_PAGE(*eccsr);
85 *eccsr = MACRONIX_ECCSR_BF_ACCUMULATED_PAGES(*eccsr);
90 static int macronix_ecc_get_status(struct spinand_device *spinand,
93 struct nand_device *nand = spinand_to_nand(spinand);
96 switch (status & STATUS_ECC_MASK) {
97 case STATUS_ECC_NO_BITFLIPS:
100 case STATUS_ECC_UNCOR_ERROR:
103 case STATUS_ECC_HAS_BITFLIPS:
105 * Let's try to retrieve the real maximum number of bitflips
106 * in order to avoid forcing the wear-leveling layer to move
107 * data around if it's not necessary.
109 if (macronix_get_eccsr(spinand, spinand->scratchbuf))
110 return nanddev_get_ecc_conf(nand)->strength;
112 eccsr = *spinand->scratchbuf;
113 if (WARN_ON(eccsr > nanddev_get_ecc_conf(nand)->strength || !eccsr))
114 return nanddev_get_ecc_conf(nand)->strength;
124 static int macronix_set_cont_read(struct spinand_device *spinand, bool enable)
126 struct macronix_priv *priv = spinand->priv;
129 ret = spinand_upd_cfg(spinand, MACRONIX_CFG_CONT_READ,
130 enable ? MACRONIX_CFG_CONT_READ : 0);
134 priv->cont_read = enable;
139 static const struct spinand_info macronix_spinand_table[] = {
140 SPINAND_INFO("MX35LF1GE4AB",
141 SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x12),
142 NAND_MEMORG(1, 2048, 64, 64, 1024, 20, 1, 1, 1),
144 SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
145 &write_cache_variants,
146 &update_cache_variants),
148 SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
149 macronix_ecc_get_status)),
150 SPINAND_INFO("MX35LF2GE4AB",
151 SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x22),
152 NAND_MEMORG(1, 2048, 64, 64, 2048, 40, 2, 1, 1),
154 SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
155 &write_cache_variants,
156 &update_cache_variants),
158 SPINAND_HAS_PROG_PLANE_SELECT_BIT |
159 SPINAND_HAS_READ_PLANE_SELECT_BIT,
160 SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout, NULL)),
161 SPINAND_INFO("MX35LF2GE4AD",
162 SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x26, 0x03),
163 NAND_MEMORG(1, 2048, 64, 64, 2048, 40, 1, 1, 1),
165 SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
166 &write_cache_variants,
167 &update_cache_variants),
169 SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
170 macronix_ecc_get_status),
171 SPINAND_CONT_READ(macronix_set_cont_read)),
172 SPINAND_INFO("MX35LF4GE4AD",
173 SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x37, 0x03),
174 NAND_MEMORG(1, 4096, 128, 64, 2048, 40, 1, 1, 1),
176 SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
177 &write_cache_variants,
178 &update_cache_variants),
180 SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
181 macronix_ecc_get_status),
182 SPINAND_CONT_READ(macronix_set_cont_read)),
183 SPINAND_INFO("MX35LF1G24AD",
184 SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x14, 0x03),
185 NAND_MEMORG(1, 2048, 128, 64, 1024, 20, 1, 1, 1),
187 SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
188 &write_cache_variants,
189 &update_cache_variants),
191 SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout, NULL)),
192 SPINAND_INFO("MX35LF2G24AD",
193 SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x24, 0x03),
194 NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 2, 1, 1),
196 SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
197 &write_cache_variants,
198 &update_cache_variants),
200 SPINAND_HAS_PROG_PLANE_SELECT_BIT,
201 SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout, NULL)),
202 SPINAND_INFO("MX35LF2G24AD-Z4I8",
203 SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x64, 0x03),
204 NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 1, 1, 1),
206 SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
207 &write_cache_variants,
208 &update_cache_variants),
210 SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout, NULL)),
211 SPINAND_INFO("MX35LF4G24AD",
212 SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x35, 0x03),
213 NAND_MEMORG(1, 4096, 256, 64, 2048, 40, 2, 1, 1),
215 SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
216 &write_cache_variants,
217 &update_cache_variants),
219 SPINAND_HAS_PROG_PLANE_SELECT_BIT,
220 SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout, NULL)),
221 SPINAND_INFO("MX35LF4G24AD-Z4I8",
222 SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x75, 0x03),
223 NAND_MEMORG(1, 4096, 256, 64, 2048, 40, 1, 1, 1),
225 SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
226 &write_cache_variants,
227 &update_cache_variants),
229 SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout, NULL)),
230 SPINAND_INFO("MX31LF1GE4BC",
231 SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x1e),
232 NAND_MEMORG(1, 2048, 64, 64, 1024, 20, 1, 1, 1),
234 SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
235 &write_cache_variants,
236 &update_cache_variants),
238 SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
239 macronix_ecc_get_status)),
240 SPINAND_INFO("MX31UF1GE4BC",
241 SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x9e),
242 NAND_MEMORG(1, 2048, 64, 64, 1024, 20, 1, 1, 1),
244 SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
245 &write_cache_variants,
246 &update_cache_variants),
248 SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
249 macronix_ecc_get_status)),
251 SPINAND_INFO("MX35LF2G14AC",
252 SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x20),
253 NAND_MEMORG(1, 2048, 64, 64, 2048, 40, 2, 1, 1),
255 SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
256 &write_cache_variants,
257 &update_cache_variants),
259 SPINAND_HAS_PROG_PLANE_SELECT_BIT |
260 SPINAND_HAS_READ_PLANE_SELECT_BIT,
261 SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
262 macronix_ecc_get_status)),
263 SPINAND_INFO("MX35UF4G24AD",
264 SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xb5, 0x03),
265 NAND_MEMORG(1, 4096, 256, 64, 2048, 40, 2, 1, 1),
267 SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
268 &write_cache_variants,
269 &update_cache_variants),
271 SPINAND_HAS_PROG_PLANE_SELECT_BIT,
272 SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
273 macronix_ecc_get_status)),
274 SPINAND_INFO("MX35UF4G24AD-Z4I8",
275 SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xf5, 0x03),
276 NAND_MEMORG(1, 4096, 256, 64, 2048, 40, 1, 1, 1),
278 SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
279 &write_cache_variants,
280 &update_cache_variants),
282 SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
283 macronix_ecc_get_status)),
284 SPINAND_INFO("MX35UF4GE4AD",
285 SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xb7, 0x03),
286 NAND_MEMORG(1, 4096, 256, 64, 2048, 40, 1, 1, 1),
288 SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
289 &write_cache_variants,
290 &update_cache_variants),
292 SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
293 macronix_ecc_get_status),
294 SPINAND_CONT_READ(macronix_set_cont_read)),
295 SPINAND_INFO("MX35UF2G14AC",
296 SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xa0),
297 NAND_MEMORG(1, 2048, 64, 64, 2048, 40, 2, 1, 1),
299 SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
300 &write_cache_variants,
301 &update_cache_variants),
303 SPINAND_HAS_PROG_PLANE_SELECT_BIT |
304 SPINAND_HAS_READ_PLANE_SELECT_BIT,
305 SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
306 macronix_ecc_get_status)),
307 SPINAND_INFO("MX35UF2G24AD",
308 SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xa4, 0x03),
309 NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 2, 1, 1),
311 SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
312 &write_cache_variants,
313 &update_cache_variants),
315 SPINAND_HAS_PROG_PLANE_SELECT_BIT,
316 SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
317 macronix_ecc_get_status)),
318 SPINAND_INFO("MX35UF2G24AD-Z4I8",
319 SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xe4, 0x03),
320 NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 1, 1, 1),
322 SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
323 &write_cache_variants,
324 &update_cache_variants),
326 SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
327 macronix_ecc_get_status)),
328 SPINAND_INFO("MX35UF2GE4AD",
329 SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xa6, 0x03),
330 NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 1, 1, 1),
332 SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
333 &write_cache_variants,
334 &update_cache_variants),
336 SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
337 macronix_ecc_get_status),
338 SPINAND_CONT_READ(macronix_set_cont_read)),
339 SPINAND_INFO("MX35UF2GE4AC",
340 SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xa2, 0x01),
341 NAND_MEMORG(1, 2048, 64, 64, 2048, 40, 1, 1, 1),
343 SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
344 &write_cache_variants,
345 &update_cache_variants),
347 SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
348 macronix_ecc_get_status),
349 SPINAND_CONT_READ(macronix_set_cont_read)),
350 SPINAND_INFO("MX35UF1G14AC",
351 SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x90),
352 NAND_MEMORG(1, 2048, 64, 64, 1024, 20, 1, 1, 1),
354 SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
355 &write_cache_variants,
356 &update_cache_variants),
358 SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
359 macronix_ecc_get_status)),
360 SPINAND_INFO("MX35UF1G24AD",
361 SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x94, 0x03),
362 NAND_MEMORG(1, 2048, 128, 64, 1024, 20, 1, 1, 1),
364 SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
365 &write_cache_variants,
366 &update_cache_variants),
368 SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
369 macronix_ecc_get_status)),
370 SPINAND_INFO("MX35UF1GE4AD",
371 SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x96, 0x03),
372 NAND_MEMORG(1, 2048, 128, 64, 1024, 20, 1, 1, 1),
374 SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
375 &write_cache_variants,
376 &update_cache_variants),
378 SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
379 macronix_ecc_get_status),
380 SPINAND_CONT_READ(macronix_set_cont_read)),
381 SPINAND_INFO("MX35UF1GE4AC",
382 SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x92, 0x01),
383 NAND_MEMORG(1, 2048, 64, 64, 1024, 20, 1, 1, 1),
385 SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
386 &write_cache_variants,
387 &update_cache_variants),
389 SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
390 macronix_ecc_get_status),
391 SPINAND_CONT_READ(macronix_set_cont_read)),
392 SPINAND_INFO("MX31LF2GE4BC",
393 SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x2e),
394 NAND_MEMORG(1, 2048, 64, 64, 2048, 40, 1, 1, 1),
396 SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
397 &write_cache_variants,
398 &update_cache_variants),
400 SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
401 macronix_ecc_get_status)),
402 SPINAND_INFO("MX3UF2GE4BC",
403 SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xae),
404 NAND_MEMORG(1, 2048, 64, 64, 2048, 40, 1, 1, 1),
406 SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
407 &write_cache_variants,
408 &update_cache_variants),
410 SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
411 macronix_ecc_get_status)),
414 static int macronix_spinand_init(struct spinand_device *spinand)
416 struct macronix_priv *priv;
418 priv = kzalloc(sizeof(*priv), GFP_KERNEL);
422 spinand->priv = priv;
427 static void macronix_spinand_cleanup(struct spinand_device *spinand)
429 kfree(spinand->priv);
432 static const struct spinand_manufacturer_ops macronix_spinand_manuf_ops = {
433 .init = macronix_spinand_init,
434 .cleanup = macronix_spinand_cleanup,
437 const struct spinand_manufacturer macronix_spinand_manufacturer = {
438 .id = SPINAND_MFR_MACRONIX,
440 .chips = macronix_spinand_table,
441 .nchips = ARRAY_SIZE(macronix_spinand_table),
442 .ops = ¯onix_spinand_manuf_ops,