blob: b5b68aa16eb36e06c6d0a8cc34bd87ba1f36840c [file] [log] [blame]
Thomas Gleixnerd2912cb2019-06-04 10:11:33 +02001// SPDX-License-Identifier: GPL-2.0-only
Linus Torvalds1da177e2005-04-16 15:20:36 -07002/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07003 * Overview:
4 * This is the generic MTD driver for NAND flash devices. It should be
5 * capable of working with almost all NAND chips currently available.
Thomas Gleixner61b03bd2005-11-07 11:15:49 +00006 *
Linus Torvalds1da177e2005-04-16 15:20:36 -07007 * Additional technical information is available on
maximilian attems8b2b4032007-07-28 13:07:16 +02008 * http://www.linux-mtd.infradead.org/doc/nand.html
Thomas Gleixner61b03bd2005-11-07 11:15:49 +00009 *
Linus Torvalds1da177e2005-04-16 15:20:36 -070010 * Copyright (C) 2000 Steven J. Hill (sjhill@realitydiluted.com)
Thomas Gleixnerace4dfe2006-05-24 12:07:37 +020011 * 2002-2006 Thomas Gleixner (tglx@linutronix.de)
Linus Torvalds1da177e2005-04-16 15:20:36 -070012 *
Thomas Gleixnerace4dfe2006-05-24 12:07:37 +020013 * Credits:
Thomas Gleixner61b03bd2005-11-07 11:15:49 +000014 * David Woodhouse for adding multichip support
15 *
Linus Torvalds1da177e2005-04-16 15:20:36 -070016 * Aleph One Ltd. and Toby Churchill Ltd. for supporting the
17 * rework for 2K page size chips
18 *
Thomas Gleixnerace4dfe2006-05-24 12:07:37 +020019 * TODO:
Linus Torvalds1da177e2005-04-16 15:20:36 -070020 * Enable cached programming for 2k page size chips
21 * Check, if mtd->ecctype should be set to MTD_ECC_HW
Brian Norris7854d3f2011-06-23 14:12:08 -070022 * if we have HW ECC support.
Artem Bityutskiyc0b8ba72007-07-23 16:06:50 +030023 * BBT table is not serialized, has to be fixed
Linus Torvalds1da177e2005-04-16 15:20:36 -070024 */
25
Ezequiel Garcia20171642013-11-25 08:30:31 -030026#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
27
David Woodhouse552d9202006-05-14 01:20:46 +010028#include <linux/module.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070029#include <linux/delay.h>
30#include <linux/errno.h>
Thomas Gleixner7aa65bf2006-05-23 11:54:38 +020031#include <linux/err.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070032#include <linux/sched.h>
33#include <linux/slab.h>
Kamal Dasu66507c72014-05-01 20:51:19 -040034#include <linux/mm.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070035#include <linux/types.h>
36#include <linux/mtd/mtd.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070037#include <linux/mtd/nand_ecc.h>
Ivan Djelic193bd402011-03-11 11:05:33 +010038#include <linux/mtd/nand_bch.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070039#include <linux/interrupt.h>
40#include <linux/bitops.h>
Florian Fainelli7351d3a2010-09-07 13:23:45 +020041#include <linux/io.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070042#include <linux/mtd/partitions.h>
Boris Brezillond48f62b2016-04-01 14:54:32 +020043#include <linux/of.h>
Janusz Krzysztofikb0e137a2018-10-15 21:41:28 +020044#include <linux/gpio/consumer.h>
Thomas Gleixner81ec5362007-12-12 17:27:03 +010045
Boris Brezillon348d56a2018-09-07 00:38:48 +020046#include "internals.h"
47
Boris Brezillon41b207a2016-02-03 19:06:15 +010048/* Define default oob placement schemes for large and small page devices */
49static int nand_ooblayout_ecc_sp(struct mtd_info *mtd, int section,
50 struct mtd_oob_region *oobregion)
51{
52 struct nand_chip *chip = mtd_to_nand(mtd);
53 struct nand_ecc_ctrl *ecc = &chip->ecc;
54
55 if (section > 1)
56 return -ERANGE;
57
58 if (!section) {
59 oobregion->offset = 0;
Miquel Raynalf7f8c172017-07-05 08:51:09 +020060 if (mtd->oobsize == 16)
61 oobregion->length = 4;
62 else
63 oobregion->length = 3;
Boris Brezillon41b207a2016-02-03 19:06:15 +010064 } else {
Miquel Raynalf7f8c172017-07-05 08:51:09 +020065 if (mtd->oobsize == 8)
66 return -ERANGE;
67
Boris Brezillon41b207a2016-02-03 19:06:15 +010068 oobregion->offset = 6;
69 oobregion->length = ecc->total - 4;
70 }
71
72 return 0;
73}
74
75static int nand_ooblayout_free_sp(struct mtd_info *mtd, int section,
76 struct mtd_oob_region *oobregion)
77{
78 if (section > 1)
79 return -ERANGE;
80
81 if (mtd->oobsize == 16) {
82 if (section)
83 return -ERANGE;
84
85 oobregion->length = 8;
86 oobregion->offset = 8;
87 } else {
88 oobregion->length = 2;
89 if (!section)
90 oobregion->offset = 3;
91 else
92 oobregion->offset = 6;
93 }
94
95 return 0;
96}
97
98const struct mtd_ooblayout_ops nand_ooblayout_sp_ops = {
99 .ecc = nand_ooblayout_ecc_sp,
100 .free = nand_ooblayout_free_sp,
101};
102EXPORT_SYMBOL_GPL(nand_ooblayout_sp_ops);
103
104static int nand_ooblayout_ecc_lp(struct mtd_info *mtd, int section,
105 struct mtd_oob_region *oobregion)
106{
107 struct nand_chip *chip = mtd_to_nand(mtd);
108 struct nand_ecc_ctrl *ecc = &chip->ecc;
109
Miquel Raynal882fd152017-08-26 17:19:15 +0200110 if (section || !ecc->total)
Boris Brezillon41b207a2016-02-03 19:06:15 +0100111 return -ERANGE;
112
113 oobregion->length = ecc->total;
114 oobregion->offset = mtd->oobsize - oobregion->length;
115
116 return 0;
117}
118
119static int nand_ooblayout_free_lp(struct mtd_info *mtd, int section,
120 struct mtd_oob_region *oobregion)
121{
122 struct nand_chip *chip = mtd_to_nand(mtd);
123 struct nand_ecc_ctrl *ecc = &chip->ecc;
124
125 if (section)
126 return -ERANGE;
127
128 oobregion->length = mtd->oobsize - ecc->total - 2;
129 oobregion->offset = 2;
130
131 return 0;
132}
133
134const struct mtd_ooblayout_ops nand_ooblayout_lp_ops = {
135 .ecc = nand_ooblayout_ecc_lp,
136 .free = nand_ooblayout_free_lp,
137};
138EXPORT_SYMBOL_GPL(nand_ooblayout_lp_ops);
Thomas Gleixnerd470a972006-05-23 23:48:57 +0200139
Alexander Couzens6a623e02017-05-02 12:19:00 +0200140/*
141 * Support the old "large page" layout used for 1-bit Hamming ECC where ECC
142 * are placed at a fixed offset.
143 */
144static int nand_ooblayout_ecc_lp_hamming(struct mtd_info *mtd, int section,
145 struct mtd_oob_region *oobregion)
146{
147 struct nand_chip *chip = mtd_to_nand(mtd);
148 struct nand_ecc_ctrl *ecc = &chip->ecc;
149
150 if (section)
151 return -ERANGE;
152
153 switch (mtd->oobsize) {
154 case 64:
155 oobregion->offset = 40;
156 break;
157 case 128:
158 oobregion->offset = 80;
159 break;
160 default:
161 return -EINVAL;
162 }
163
164 oobregion->length = ecc->total;
165 if (oobregion->offset + oobregion->length > mtd->oobsize)
166 return -ERANGE;
167
168 return 0;
169}
170
171static int nand_ooblayout_free_lp_hamming(struct mtd_info *mtd, int section,
172 struct mtd_oob_region *oobregion)
173{
174 struct nand_chip *chip = mtd_to_nand(mtd);
175 struct nand_ecc_ctrl *ecc = &chip->ecc;
176 int ecc_offset = 0;
177
178 if (section < 0 || section > 1)
179 return -ERANGE;
180
181 switch (mtd->oobsize) {
182 case 64:
183 ecc_offset = 40;
184 break;
185 case 128:
186 ecc_offset = 80;
187 break;
188 default:
189 return -EINVAL;
190 }
191
192 if (section == 0) {
193 oobregion->offset = 2;
194 oobregion->length = ecc_offset - 2;
195 } else {
196 oobregion->offset = ecc_offset + ecc->total;
197 oobregion->length = mtd->oobsize - oobregion->offset;
198 }
199
200 return 0;
201}
202
Colin Ian Kingd4ed3b92017-05-04 13:11:00 +0100203static const struct mtd_ooblayout_ops nand_ooblayout_lp_hamming_ops = {
Alexander Couzens6a623e02017-05-02 12:19:00 +0200204 .ecc = nand_ooblayout_ecc_lp_hamming,
205 .free = nand_ooblayout_free_lp_hamming,
206};
207
Boris Brezillon08136212018-11-11 08:55:03 +0100208static int check_offs_len(struct nand_chip *chip, loff_t ofs, uint64_t len)
Vimal Singh6fe5a6a2010-02-03 14:12:24 +0530209{
Vimal Singh6fe5a6a2010-02-03 14:12:24 +0530210 int ret = 0;
211
212 /* Start address must align on block boundary */
Dan Carpenterdaae74c2013-08-09 12:49:05 +0300213 if (ofs & ((1ULL << chip->phys_erase_shift) - 1)) {
Brian Norris289c0522011-07-19 10:06:09 -0700214 pr_debug("%s: unaligned address\n", __func__);
Vimal Singh6fe5a6a2010-02-03 14:12:24 +0530215 ret = -EINVAL;
216 }
217
218 /* Length must align on block boundary */
Dan Carpenterdaae74c2013-08-09 12:49:05 +0300219 if (len & ((1ULL << chip->phys_erase_shift) - 1)) {
Brian Norris289c0522011-07-19 10:06:09 -0700220 pr_debug("%s: length not block aligned\n", __func__);
Vimal Singh6fe5a6a2010-02-03 14:12:24 +0530221 ret = -EINVAL;
222 }
223
Vimal Singh6fe5a6a2010-02-03 14:12:24 +0530224 return ret;
225}
226
Linus Torvalds1da177e2005-04-16 15:20:36 -0700227/**
Boris Brezillon1d017852018-11-11 08:55:14 +0100228 * nand_select_target() - Select a NAND target (A.K.A. die)
229 * @chip: NAND chip object
230 * @cs: the CS line to select. Note that this CS id is always from the chip
231 * PoV, not the controller one
232 *
233 * Select a NAND target so that further operations executed on @chip go to the
234 * selected NAND target.
235 */
236void nand_select_target(struct nand_chip *chip, unsigned int cs)
237{
238 /*
Boris Brezillon32813e22018-10-29 11:58:29 +0100239 * cs should always lie between 0 and nanddev_ntargets(), when that's
240 * not the case it's a bug and the caller should be fixed.
Boris Brezillon1d017852018-11-11 08:55:14 +0100241 */
Boris Brezillon32813e22018-10-29 11:58:29 +0100242 if (WARN_ON(cs > nanddev_ntargets(&chip->base)))
Boris Brezillon1d017852018-11-11 08:55:14 +0100243 return;
244
Boris Brezillonae2294b2018-11-11 08:55:15 +0100245 chip->cur_cs = cs;
Boris Brezillon02b4a522018-11-11 08:55:16 +0100246
Boris Brezillon7d6c37e2018-11-11 08:55:22 +0100247 if (chip->legacy.select_chip)
248 chip->legacy.select_chip(chip, cs);
Boris Brezillon1d017852018-11-11 08:55:14 +0100249}
250EXPORT_SYMBOL_GPL(nand_select_target);
251
252/**
253 * nand_deselect_target() - Deselect the currently selected target
254 * @chip: NAND chip object
255 *
256 * Deselect the currently selected NAND target. The result of operations
257 * executed on @chip after the target has been deselected is undefined.
258 */
259void nand_deselect_target(struct nand_chip *chip)
260{
Boris Brezillon7d6c37e2018-11-11 08:55:22 +0100261 if (chip->legacy.select_chip)
262 chip->legacy.select_chip(chip, -1);
Boris Brezillon02b4a522018-11-11 08:55:16 +0100263
Boris Brezillonae2294b2018-11-11 08:55:15 +0100264 chip->cur_cs = -1;
Boris Brezillon1d017852018-11-11 08:55:14 +0100265}
266EXPORT_SYMBOL_GPL(nand_deselect_target);
267
268/**
Linus Torvalds1da177e2005-04-16 15:20:36 -0700269 * nand_release_device - [GENERIC] release chip
Boris Brezillon08136212018-11-11 08:55:03 +0100270 * @chip: NAND chip object
Thomas Gleixner61b03bd2005-11-07 11:15:49 +0000271 *
Huang Shijieb0bb6902012-11-19 14:43:29 +0800272 * Release chip lock and wake up anyone waiting on the device.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700273 */
Boris Brezillon08136212018-11-11 08:55:03 +0100274static void nand_release_device(struct nand_chip *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700275{
Thomas Gleixnera36ed292006-05-23 11:37:03 +0200276 /* Release the controller and the chip */
Boris Brezillon013e6292018-11-20 11:57:20 +0100277 mutex_unlock(&chip->controller->lock);
278 mutex_unlock(&chip->lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700279}
280
281/**
Frieder Schrempff90da782019-04-17 12:36:37 +0000282 * nand_bbm_get_next_page - Get the next page for bad block markers
283 * @chip: NAND chip object
284 * @page: First page to start checking for bad block marker usage
285 *
286 * Returns an integer that corresponds to the page offset within a block, for
287 * a page that is used to store bad block markers. If no more pages are
288 * available, -EINVAL is returned.
289 */
290int nand_bbm_get_next_page(struct nand_chip *chip, int page)
291{
292 struct mtd_info *mtd = nand_to_mtd(chip);
293 int last_page = ((mtd->erasesize - mtd->writesize) >>
294 chip->page_shift) & chip->pagemask;
295
296 if (page == 0 && chip->options & NAND_BBM_FIRSTPAGE)
297 return 0;
298 else if (page <= 1 && chip->options & NAND_BBM_SECONDPAGE)
299 return 1;
300 else if (page <= last_page && chip->options & NAND_BBM_LASTPAGE)
301 return last_page;
302
303 return -EINVAL;
304}
305
306/**
Linus Torvalds1da177e2005-04-16 15:20:36 -0700307 * nand_block_bad - [DEFAULT] Read bad block marker from the chip
Boris Brezillonc17556f2018-09-06 14:05:25 +0200308 * @chip: NAND chip object
Brian Norris8b6e50c2011-05-25 14:59:01 -0700309 * @ofs: offset from device start
Linus Torvalds1da177e2005-04-16 15:20:36 -0700310 *
Thomas Gleixner61b03bd2005-11-07 11:15:49 +0000311 * Check, if the block is bad.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700312 */
Boris Brezillonc17556f2018-09-06 14:05:25 +0200313static int nand_block_bad(struct nand_chip *chip, loff_t ofs)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700314{
Frieder Schrempff90da782019-04-17 12:36:37 +0000315 int first_page, page_offset;
316 int res;
Masahiro Yamadac120e752017-03-23 05:07:01 +0900317 u8 bad;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700318
Frieder Schrempff90da782019-04-17 12:36:37 +0000319 first_page = (int)(ofs >> chip->page_shift) & chip->pagemask;
320 page_offset = nand_bbm_get_next_page(chip, 0);
Kevin Cernekeeb60b08b2010-05-04 20:58:10 -0700321
Frieder Schrempff90da782019-04-17 12:36:37 +0000322 while (page_offset >= 0) {
323 res = chip->ecc.read_oob(chip, first_page + page_offset);
Abhishek Sahue9893e62018-06-13 14:32:36 +0530324 if (res < 0)
Masahiro Yamadac120e752017-03-23 05:07:01 +0900325 return res;
326
327 bad = chip->oob_poi[chip->badblockpos];
Thomas Gleixner61b03bd2005-11-07 11:15:49 +0000328
Brian Norriscdbec052012-01-13 18:11:48 -0800329 if (likely(chip->badblockbits == 8))
330 res = bad != 0xFF;
331 else
332 res = hweight8(bad) < chip->badblockbits;
Masahiro Yamadac120e752017-03-23 05:07:01 +0900333 if (res)
334 return res;
Frieder Schrempff90da782019-04-17 12:36:37 +0000335
336 page_offset = nand_bbm_get_next_page(chip, page_offset + 1);
Masahiro Yamadac120e752017-03-23 05:07:01 +0900337 }
Maxim Levitskye0b58d02010-02-22 20:39:38 +0200338
Masahiro Yamadac120e752017-03-23 05:07:01 +0900339 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700340}
341
Boris Brezillon99f33512018-11-11 08:55:04 +0100342static int nand_isbad_bbm(struct nand_chip *chip, loff_t ofs)
343{
344 if (chip->legacy.block_bad)
345 return chip->legacy.block_bad(chip, ofs);
346
347 return nand_block_bad(chip, ofs);
348}
349
350/**
Boris Brezillon99f33512018-11-11 08:55:04 +0100351 * nand_get_device - [GENERIC] Get chip for selected access
352 * @chip: NAND chip structure
Boris Brezillon99f33512018-11-11 08:55:04 +0100353 *
Boris Brezillon013e6292018-11-20 11:57:20 +0100354 * Lock the device and its controller for exclusive access
355 *
356 * Return: -EBUSY if the chip has been suspended, 0 otherwise
Boris Brezillon99f33512018-11-11 08:55:04 +0100357 */
Boris Brezillon013e6292018-11-20 11:57:20 +0100358static int nand_get_device(struct nand_chip *chip)
Boris Brezillon99f33512018-11-11 08:55:04 +0100359{
Boris Brezillon013e6292018-11-20 11:57:20 +0100360 mutex_lock(&chip->lock);
361 if (chip->suspended) {
362 mutex_unlock(&chip->lock);
363 return -EBUSY;
Boris Brezillon99f33512018-11-11 08:55:04 +0100364 }
Boris Brezillon013e6292018-11-20 11:57:20 +0100365 mutex_lock(&chip->controller->lock);
366
367 return 0;
Boris Brezillon99f33512018-11-11 08:55:04 +0100368}
369
370/**
371 * nand_check_wp - [GENERIC] check if the chip is write protected
372 * @chip: NAND chip object
373 *
374 * Check, if the device is write protected. The function expects, that the
375 * device is already selected.
376 */
377static int nand_check_wp(struct nand_chip *chip)
378{
379 u8 status;
380 int ret;
381
382 /* Broken xD cards report WP despite being writable */
383 if (chip->options & NAND_BROKEN_XD)
384 return 0;
385
386 /* Check the WP bit */
387 ret = nand_status_op(chip, &status);
388 if (ret)
389 return ret;
390
391 return status & NAND_STATUS_WP ? 0 : 1;
392}
393
394/**
395 * nand_fill_oob - [INTERN] Transfer client buffer to oob
Randy Dunlap455e7b32019-01-27 18:21:42 -0800396 * @chip: NAND chip object
Boris Brezillon99f33512018-11-11 08:55:04 +0100397 * @oob: oob data buffer
398 * @len: oob data write length
399 * @ops: oob ops structure
400 */
401static uint8_t *nand_fill_oob(struct nand_chip *chip, uint8_t *oob, size_t len,
402 struct mtd_oob_ops *ops)
403{
404 struct mtd_info *mtd = nand_to_mtd(chip);
405 int ret;
406
407 /*
408 * Initialise to all 0xFF, to avoid the possibility of left over OOB
409 * data from a previous OOB read.
410 */
411 memset(chip->oob_poi, 0xff, mtd->oobsize);
412
413 switch (ops->mode) {
414
415 case MTD_OPS_PLACE_OOB:
416 case MTD_OPS_RAW:
417 memcpy(chip->oob_poi + ops->ooboffs, oob, len);
418 return oob + len;
419
420 case MTD_OPS_AUTO_OOB:
421 ret = mtd_ooblayout_set_databytes(mtd, oob, chip->oob_poi,
422 ops->ooboffs, len);
423 BUG_ON(ret);
424 return oob + len;
425
426 default:
427 BUG();
428 }
429 return NULL;
430}
431
432/**
433 * nand_do_write_oob - [MTD Interface] NAND write out-of-band
434 * @chip: NAND chip object
435 * @to: offset to write to
436 * @ops: oob operation description structure
437 *
438 * NAND write out-of-band.
439 */
440static int nand_do_write_oob(struct nand_chip *chip, loff_t to,
441 struct mtd_oob_ops *ops)
442{
443 struct mtd_info *mtd = nand_to_mtd(chip);
Masahiro Yamadaf9ffb402019-01-21 22:05:34 +0900444 int chipnr, page, status, len, ret;
Boris Brezillon99f33512018-11-11 08:55:04 +0100445
446 pr_debug("%s: to = 0x%08x, len = %i\n",
447 __func__, (unsigned int)to, (int)ops->ooblen);
448
449 len = mtd_oobavail(mtd, ops);
450
451 /* Do not allow write past end of page */
452 if ((ops->ooboffs + ops->ooblen) > len) {
453 pr_debug("%s: attempt to write past end of page\n",
454 __func__);
455 return -EINVAL;
456 }
457
458 chipnr = (int)(to >> chip->chip_shift);
459
460 /*
461 * Reset the chip. Some chips (like the Toshiba TC5832DC found in one
462 * of my DiskOnChip 2000 test units) will clear the whole data page too
463 * if we don't do this. I have no clue why, but I seem to have 'fixed'
464 * it in the doc2000 driver in August 1999. dwmw2.
465 */
Masahiro Yamadaf9ffb402019-01-21 22:05:34 +0900466 ret = nand_reset(chip, chipnr);
467 if (ret)
468 return ret;
Boris Brezillon99f33512018-11-11 08:55:04 +0100469
Boris Brezillon1d017852018-11-11 08:55:14 +0100470 nand_select_target(chip, chipnr);
Boris Brezillon99f33512018-11-11 08:55:04 +0100471
472 /* Shift to get page */
473 page = (int)(to >> chip->page_shift);
474
475 /* Check, if it is write protected */
476 if (nand_check_wp(chip)) {
Boris Brezillon1d017852018-11-11 08:55:14 +0100477 nand_deselect_target(chip);
Boris Brezillon99f33512018-11-11 08:55:04 +0100478 return -EROFS;
479 }
480
481 /* Invalidate the page cache, if we write to the cached page */
Boris Brezillond9745412018-10-28 16:12:45 +0100482 if (page == chip->pagecache.page)
483 chip->pagecache.page = -1;
Boris Brezillon99f33512018-11-11 08:55:04 +0100484
485 nand_fill_oob(chip, ops->oobbuf, ops->ooblen, ops);
486
487 if (ops->mode == MTD_OPS_RAW)
488 status = chip->ecc.write_oob_raw(chip, page & chip->pagemask);
489 else
490 status = chip->ecc.write_oob(chip, page & chip->pagemask);
491
Boris Brezillon1d017852018-11-11 08:55:14 +0100492 nand_deselect_target(chip);
Boris Brezillon99f33512018-11-11 08:55:04 +0100493
494 if (status)
495 return status;
496
497 ops->oobretlen = ops->ooblen;
498
499 return 0;
500}
501
Linus Torvalds1da177e2005-04-16 15:20:36 -0700502/**
Brian Norris5a0edb22013-07-30 17:52:58 -0700503 * nand_default_block_markbad - [DEFAULT] mark a block bad via bad block marker
Boris Brezillonc17556f2018-09-06 14:05:25 +0200504 * @chip: NAND chip object
Brian Norris8b6e50c2011-05-25 14:59:01 -0700505 * @ofs: offset from device start
Linus Torvalds1da177e2005-04-16 15:20:36 -0700506 *
Brian Norris8b6e50c2011-05-25 14:59:01 -0700507 * This is the default implementation, which can be overridden by a hardware
Brian Norris5a0edb22013-07-30 17:52:58 -0700508 * specific driver. It provides the details for writing a bad block marker to a
509 * block.
510 */
Boris Brezillonc17556f2018-09-06 14:05:25 +0200511static int nand_default_block_markbad(struct nand_chip *chip, loff_t ofs)
Brian Norris5a0edb22013-07-30 17:52:58 -0700512{
Boris Brezillonc17556f2018-09-06 14:05:25 +0200513 struct mtd_info *mtd = nand_to_mtd(chip);
Brian Norris5a0edb22013-07-30 17:52:58 -0700514 struct mtd_oob_ops ops;
515 uint8_t buf[2] = { 0, 0 };
Frieder Schrempff90da782019-04-17 12:36:37 +0000516 int ret = 0, res, page_offset;
Brian Norris5a0edb22013-07-30 17:52:58 -0700517
Brian Norris0ec56dc2015-02-28 02:02:30 -0800518 memset(&ops, 0, sizeof(ops));
Brian Norris5a0edb22013-07-30 17:52:58 -0700519 ops.oobbuf = buf;
520 ops.ooboffs = chip->badblockpos;
521 if (chip->options & NAND_BUSWIDTH_16) {
522 ops.ooboffs &= ~0x01;
523 ops.len = ops.ooblen = 2;
524 } else {
525 ops.len = ops.ooblen = 1;
526 }
527 ops.mode = MTD_OPS_PLACE_OOB;
528
Frieder Schrempff90da782019-04-17 12:36:37 +0000529 page_offset = nand_bbm_get_next_page(chip, 0);
530
531 while (page_offset >= 0) {
532 res = nand_do_write_oob(chip,
533 ofs + (page_offset * mtd->writesize),
534 &ops);
535
Brian Norris5a0edb22013-07-30 17:52:58 -0700536 if (!ret)
537 ret = res;
538
Frieder Schrempff90da782019-04-17 12:36:37 +0000539 page_offset = nand_bbm_get_next_page(chip, page_offset + 1);
540 }
Brian Norris5a0edb22013-07-30 17:52:58 -0700541
542 return ret;
543}
544
545/**
Boris Brezilloncdc784c2018-09-07 00:38:38 +0200546 * nand_markbad_bbm - mark a block by updating the BBM
547 * @chip: NAND chip object
548 * @ofs: offset of the block to mark bad
549 */
550int nand_markbad_bbm(struct nand_chip *chip, loff_t ofs)
551{
552 if (chip->legacy.block_markbad)
553 return chip->legacy.block_markbad(chip, ofs);
554
555 return nand_default_block_markbad(chip, ofs);
556}
557
Boris Brezilloncdc784c2018-09-07 00:38:38 +0200558/**
Brian Norris5a0edb22013-07-30 17:52:58 -0700559 * nand_block_markbad_lowlevel - mark a block bad
Boris Brezillon08136212018-11-11 08:55:03 +0100560 * @chip: NAND chip object
Brian Norris5a0edb22013-07-30 17:52:58 -0700561 * @ofs: offset from device start
562 *
563 * This function performs the generic NAND bad block marking steps (i.e., bad
564 * block table(s) and/or marker(s)). We only allow the hardware driver to
Boris Brezilloncdc784c2018-09-07 00:38:38 +0200565 * specify how to write bad block markers to OOB (chip->legacy.block_markbad).
Brian Norris5a0edb22013-07-30 17:52:58 -0700566 *
Brian Norrisb32843b2013-07-30 17:52:59 -0700567 * We try operations in the following order:
Mauro Carvalho Chehabb6f6c292017-05-13 07:40:36 -0300568 *
Brian Norrise2414f42012-02-06 13:44:00 -0800569 * (1) erase the affected block, to allow OOB marker to be written cleanly
Brian Norrisb32843b2013-07-30 17:52:59 -0700570 * (2) write bad block marker to OOB area of affected block (unless flag
571 * NAND_BBT_NO_OOB_BBM is present)
572 * (3) update the BBT
Mauro Carvalho Chehabb6f6c292017-05-13 07:40:36 -0300573 *
Brian Norrisb32843b2013-07-30 17:52:59 -0700574 * Note that we retain the first error encountered in (2) or (3), finish the
Brian Norrise2414f42012-02-06 13:44:00 -0800575 * procedures, and dump the error in the end.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700576*/
Boris Brezillon08136212018-11-11 08:55:03 +0100577static int nand_block_markbad_lowlevel(struct nand_chip *chip, loff_t ofs)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700578{
Boris Brezillon08136212018-11-11 08:55:03 +0100579 struct mtd_info *mtd = nand_to_mtd(chip);
Brian Norrisb32843b2013-07-30 17:52:59 -0700580 int res, ret = 0;
Thomas Gleixner61b03bd2005-11-07 11:15:49 +0000581
Brian Norrisb32843b2013-07-30 17:52:59 -0700582 if (!(chip->bbt_options & NAND_BBT_NO_OOB_BBM)) {
Brian Norris00918422012-01-13 18:11:47 -0800583 struct erase_info einfo;
584
585 /* Attempt erase before marking OOB */
586 memset(&einfo, 0, sizeof(einfo));
Brian Norris00918422012-01-13 18:11:47 -0800587 einfo.addr = ofs;
Dan Carpenterdaae74c2013-08-09 12:49:05 +0300588 einfo.len = 1ULL << chip->phys_erase_shift;
Boris Brezillone4cdf9c2018-09-06 14:05:35 +0200589 nand_erase_nand(chip, &einfo, 0);
Brian Norris00918422012-01-13 18:11:47 -0800590
Brian Norrisb32843b2013-07-30 17:52:59 -0700591 /* Write bad block marker to OOB */
Boris Brezillon013e6292018-11-20 11:57:20 +0100592 ret = nand_get_device(chip);
593 if (ret)
594 return ret;
595
Boris Brezilloncdc784c2018-09-07 00:38:38 +0200596 ret = nand_markbad_bbm(chip, ofs);
Boris Brezillon08136212018-11-11 08:55:03 +0100597 nand_release_device(chip);
Thomas Gleixnerf1a28c02006-05-30 00:37:34 +0200598 }
Brian Norrise2414f42012-02-06 13:44:00 -0800599
Brian Norrisb32843b2013-07-30 17:52:59 -0700600 /* Mark block bad in BBT */
601 if (chip->bbt) {
Boris Brezillon5740d4c2018-09-06 14:05:34 +0200602 res = nand_markbad_bbt(chip, ofs);
Brian Norrise2414f42012-02-06 13:44:00 -0800603 if (!ret)
604 ret = res;
605 }
606
Thomas Gleixnerf1a28c02006-05-30 00:37:34 +0200607 if (!ret)
608 mtd->ecc_stats.badblocks++;
Artem Bityutskiyc0b8ba72007-07-23 16:06:50 +0300609
Thomas Gleixnerf1a28c02006-05-30 00:37:34 +0200610 return ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700611}
612
Thomas Gleixner61b03bd2005-11-07 11:15:49 +0000613/**
Gu Zhengc30e1f72014-09-03 17:49:10 +0800614 * nand_block_isreserved - [GENERIC] Check if a block is marked reserved.
Brian Norris8b6e50c2011-05-25 14:59:01 -0700615 * @mtd: MTD device structure
616 * @ofs: offset from device start
Ezequiel Garcia8471bb72014-05-21 19:06:12 -0300617 *
Gu Zhengc30e1f72014-09-03 17:49:10 +0800618 * Check if the block is marked as reserved.
Ezequiel Garcia8471bb72014-05-21 19:06:12 -0300619 */
620static int nand_block_isreserved(struct mtd_info *mtd, loff_t ofs)
621{
Boris BREZILLON862eba52015-12-01 12:03:03 +0100622 struct nand_chip *chip = mtd_to_nand(mtd);
Ezequiel Garcia8471bb72014-05-21 19:06:12 -0300623
624 if (!chip->bbt)
625 return 0;
626 /* Return info from the table */
Boris Brezillon5740d4c2018-09-06 14:05:34 +0200627 return nand_isreserved_bbt(chip, ofs);
Ezequiel Garcia8471bb72014-05-21 19:06:12 -0300628}
629
630/**
631 * nand_block_checkbad - [GENERIC] Check if a block is marked bad
Boris Brezillon08136212018-11-11 08:55:03 +0100632 * @chip: NAND chip object
Ezequiel Garcia8471bb72014-05-21 19:06:12 -0300633 * @ofs: offset from device start
Brian Norris8b6e50c2011-05-25 14:59:01 -0700634 * @allowbbt: 1, if its allowed to access the bbt area
Linus Torvalds1da177e2005-04-16 15:20:36 -0700635 *
636 * Check, if the block is bad. Either by reading the bad block table or
637 * calling of the scan function.
638 */
Boris Brezillon08136212018-11-11 08:55:03 +0100639static int nand_block_checkbad(struct nand_chip *chip, loff_t ofs, int allowbbt)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700640{
Linus Torvalds1da177e2005-04-16 15:20:36 -0700641 /* Return info from the table */
Boris Brezilloncdc784c2018-09-07 00:38:38 +0200642 if (chip->bbt)
643 return nand_isbad_bbt(chip, ofs, allowbbt);
644
645 return nand_isbad_bbm(chip, ofs);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700646}
647
Simon Kagstrom2af7c652009-10-05 15:55:52 +0200648/**
Miquel Raynal8878b122017-11-09 14:16:45 +0100649 * nand_soft_waitrdy - Poll STATUS reg until RDY bit is set to 1
650 * @chip: NAND chip structure
651 * @timeout_ms: Timeout in ms
652 *
653 * Poll the STATUS register using ->exec_op() until the RDY bit becomes 1.
654 * If that does not happen whitin the specified timeout, -ETIMEDOUT is
655 * returned.
656 *
657 * This helper is intended to be used when the controller does not have access
658 * to the NAND R/B pin.
659 *
660 * Be aware that calling this helper from an ->exec_op() implementation means
661 * ->exec_op() must be re-entrant.
662 *
663 * Return 0 if the NAND chip is ready, a negative error otherwise.
664 */
665int nand_soft_waitrdy(struct nand_chip *chip, unsigned long timeout_ms)
666{
Boris Brezillon3057fce2018-05-04 21:24:31 +0200667 const struct nand_sdr_timings *timings;
Miquel Raynal8878b122017-11-09 14:16:45 +0100668 u8 status = 0;
669 int ret;
670
Boris Brezillonf2abfeb2018-11-11 08:55:23 +0100671 if (!nand_has_exec_op(chip))
Miquel Raynal8878b122017-11-09 14:16:45 +0100672 return -ENOTSUPP;
673
Boris Brezillon3057fce2018-05-04 21:24:31 +0200674 /* Wait tWB before polling the STATUS reg. */
675 timings = nand_get_sdr_timings(&chip->data_interface);
676 ndelay(PSEC_TO_NSEC(timings->tWB_max));
677
Miquel Raynal8878b122017-11-09 14:16:45 +0100678 ret = nand_status_op(chip, NULL);
679 if (ret)
680 return ret;
681
682 timeout_ms = jiffies + msecs_to_jiffies(timeout_ms);
683 do {
684 ret = nand_read_data_op(chip, &status, sizeof(status), true);
685 if (ret)
686 break;
687
688 if (status & NAND_STATUS_READY)
689 break;
690
691 /*
692 * Typical lowest execution time for a tR on most NANDs is 10us,
693 * use this as polling delay before doing something smarter (ie.
694 * deriving a delay from the timeout value, timeout_ms/ratio).
695 */
696 udelay(10);
697 } while (time_before(jiffies, timeout_ms));
698
699 /*
700 * We have to exit READ_STATUS mode in order to read real data on the
701 * bus in case the WAITRDY instruction is preceding a DATA_IN
702 * instruction.
703 */
704 nand_exit_status_op(chip);
705
706 if (ret)
707 return ret;
708
709 return status & NAND_STATUS_READY ? 0 : -ETIMEDOUT;
710};
711EXPORT_SYMBOL_GPL(nand_soft_waitrdy);
712
713/**
Janusz Krzysztofikb0e137a2018-10-15 21:41:28 +0200714 * nand_gpio_waitrdy - Poll R/B GPIO pin until ready
715 * @chip: NAND chip structure
716 * @gpiod: GPIO descriptor of R/B pin
717 * @timeout_ms: Timeout in ms
718 *
719 * Poll the R/B GPIO pin until it becomes ready. If that does not happen
720 * whitin the specified timeout, -ETIMEDOUT is returned.
721 *
722 * This helper is intended to be used when the controller has access to the
723 * NAND R/B pin over GPIO.
724 *
725 * Return 0 if the R/B pin indicates chip is ready, a negative error otherwise.
726 */
727int nand_gpio_waitrdy(struct nand_chip *chip, struct gpio_desc *gpiod,
728 unsigned long timeout_ms)
729{
730 /* Wait until R/B pin indicates chip is ready or timeout occurs */
731 timeout_ms = jiffies + msecs_to_jiffies(timeout_ms);
732 do {
733 if (gpiod_get_value_cansleep(gpiod))
734 return 0;
735
736 cond_resched();
737 } while (time_before(jiffies, timeout_ms));
738
739 return gpiod_get_value_cansleep(gpiod) ? 0 : -ETIMEDOUT;
740};
741EXPORT_SYMBOL_GPL(nand_gpio_waitrdy);
742
743/**
Brian Norris8b6e50c2011-05-25 14:59:01 -0700744 * panic_nand_wait - [GENERIC] wait until the command is done
Brian Norris8b6e50c2011-05-25 14:59:01 -0700745 * @chip: NAND chip structure
746 * @timeo: timeout
Simon Kagstrom2af7c652009-10-05 15:55:52 +0200747 *
748 * Wait for command done. This is a helper function for nand_wait used when
749 * we are in interrupt context. May happen when in panic and trying to write
Uwe Kleine-Königb5950762010-11-01 15:38:34 -0400750 * an oops through mtdoops.
Simon Kagstrom2af7c652009-10-05 15:55:52 +0200751 */
Boris Brezillon3d4af7c2018-09-07 00:38:49 +0200752void panic_nand_wait(struct nand_chip *chip, unsigned long timeo)
Simon Kagstrom2af7c652009-10-05 15:55:52 +0200753{
754 int i;
755 for (i = 0; i < timeo; i++) {
Boris Brezillon8395b752018-09-07 00:38:37 +0200756 if (chip->legacy.dev_ready) {
757 if (chip->legacy.dev_ready(chip))
Simon Kagstrom2af7c652009-10-05 15:55:52 +0200758 break;
759 } else {
Boris Brezillon97d90da2017-11-30 18:01:29 +0100760 int ret;
761 u8 status;
762
763 ret = nand_read_data_op(chip, &status, sizeof(status),
764 true);
765 if (ret)
766 return;
767
768 if (status & NAND_STATUS_READY)
Simon Kagstrom2af7c652009-10-05 15:55:52 +0200769 break;
770 }
771 mdelay(1);
Florian Fainellif8ac0412010-09-07 13:23:43 +0200772 }
Simon Kagstrom2af7c652009-10-05 15:55:52 +0200773}
774
Miquel Raynal789157e2018-03-19 14:47:28 +0100775static bool nand_supports_get_features(struct nand_chip *chip, int addr)
Miquel Raynal97baea12018-03-19 14:47:20 +0100776{
Miquel Raynal789157e2018-03-19 14:47:28 +0100777 return (chip->parameters.supports_set_get_features &&
778 test_bit(addr, chip->parameters.get_feature_list));
779}
780
781static bool nand_supports_set_features(struct nand_chip *chip, int addr)
782{
783 return (chip->parameters.supports_set_get_features &&
784 test_bit(addr, chip->parameters.set_feature_list));
Miquel Raynal97baea12018-03-19 14:47:20 +0100785}
786
787/**
Boris Brezillond8e725d2016-09-15 10:32:50 +0200788 * nand_reset_data_interface - Reset data interface and timings
789 * @chip: The NAND chip
Boris Brezillon104e4422017-03-16 09:35:58 +0100790 * @chipnr: Internal die id
Boris Brezillond8e725d2016-09-15 10:32:50 +0200791 *
792 * Reset the Data interface and timings to ONFI mode 0.
793 *
794 * Returns 0 for success or negative error code otherwise.
795 */
Boris Brezillon104e4422017-03-16 09:35:58 +0100796static int nand_reset_data_interface(struct nand_chip *chip, int chipnr)
Boris Brezillond8e725d2016-09-15 10:32:50 +0200797{
Boris Brezillond8e725d2016-09-15 10:32:50 +0200798 int ret;
799
Boris Brezillon7a08dba2018-11-11 08:55:24 +0100800 if (!nand_has_setup_data_iface(chip))
Boris Brezillond8e725d2016-09-15 10:32:50 +0200801 return 0;
802
803 /*
804 * The ONFI specification says:
805 * "
806 * To transition from NV-DDR or NV-DDR2 to the SDR data
807 * interface, the host shall use the Reset (FFh) command
808 * using SDR timing mode 0. A device in any timing mode is
809 * required to recognize Reset (FFh) command issued in SDR
810 * timing mode 0.
811 * "
812 *
813 * Configure the data interface in SDR mode and set the
814 * timings to timing mode 0.
815 */
816
Miquel Raynal17fa8042017-11-30 18:01:31 +0100817 onfi_fill_data_interface(chip, NAND_SDR_IFACE, 0);
Boris Brezillon7a08dba2018-11-11 08:55:24 +0100818 ret = chip->controller->ops->setup_data_interface(chip, chipnr,
819 &chip->data_interface);
Boris Brezillond8e725d2016-09-15 10:32:50 +0200820 if (ret)
821 pr_err("Failed to configure data interface to SDR timing mode 0\n");
822
823 return ret;
824}
825
826/**
827 * nand_setup_data_interface - Setup the best data interface and timings
828 * @chip: The NAND chip
Boris Brezillon104e4422017-03-16 09:35:58 +0100829 * @chipnr: Internal die id
Boris Brezillond8e725d2016-09-15 10:32:50 +0200830 *
831 * Find and configure the best data interface and NAND timings supported by
832 * the chip and the driver.
833 * First tries to retrieve supported timing modes from ONFI information,
834 * and if the NAND chip does not support ONFI, relies on the
835 * ->onfi_timing_mode_default specified in the nand_ids table.
836 *
837 * Returns 0 for success or negative error code otherwise.
838 */
Boris Brezillon104e4422017-03-16 09:35:58 +0100839static int nand_setup_data_interface(struct nand_chip *chip, int chipnr)
Boris Brezillond8e725d2016-09-15 10:32:50 +0200840{
Miquel Raynal97baea12018-03-19 14:47:20 +0100841 u8 tmode_param[ONFI_SUBFEATURE_PARAM_LEN] = {
842 chip->onfi_timing_mode_default,
843 };
Boris Brezillond8e725d2016-09-15 10:32:50 +0200844 int ret;
845
Boris Brezillon7a08dba2018-11-11 08:55:24 +0100846 if (!nand_has_setup_data_iface(chip))
Boris Brezillond8e725d2016-09-15 10:32:50 +0200847 return 0;
848
Miquel Raynal993447b2018-03-19 14:47:21 +0100849 /* Change the mode on the chip side (if supported by the NAND chip) */
Miquel Raynal789157e2018-03-19 14:47:28 +0100850 if (nand_supports_set_features(chip, ONFI_FEATURE_ADDR_TIMING_MODE)) {
Boris Brezillon1d017852018-11-11 08:55:14 +0100851 nand_select_target(chip, chipnr);
Miquel Raynal993447b2018-03-19 14:47:21 +0100852 ret = nand_set_features(chip, ONFI_FEATURE_ADDR_TIMING_MODE,
853 tmode_param);
Boris Brezillon1d017852018-11-11 08:55:14 +0100854 nand_deselect_target(chip);
Boris Brezillond8e725d2016-09-15 10:32:50 +0200855 if (ret)
Miquel Raynal993447b2018-03-19 14:47:21 +0100856 return ret;
Boris Brezillond8e725d2016-09-15 10:32:50 +0200857 }
858
Miquel Raynal97baea12018-03-19 14:47:20 +0100859 /* Change the mode on the controller side */
Boris Brezillon7a08dba2018-11-11 08:55:24 +0100860 ret = chip->controller->ops->setup_data_interface(chip, chipnr,
861 &chip->data_interface);
Miquel Raynal415ae782018-03-19 14:47:24 +0100862 if (ret)
863 return ret;
864
865 /* Check the mode has been accepted by the chip, if supported */
Miquel Raynal789157e2018-03-19 14:47:28 +0100866 if (!nand_supports_get_features(chip, ONFI_FEATURE_ADDR_TIMING_MODE))
Miquel Raynal415ae782018-03-19 14:47:24 +0100867 return 0;
868
869 memset(tmode_param, 0, ONFI_SUBFEATURE_PARAM_LEN);
Boris Brezillon1d017852018-11-11 08:55:14 +0100870 nand_select_target(chip, chipnr);
Miquel Raynal415ae782018-03-19 14:47:24 +0100871 ret = nand_get_features(chip, ONFI_FEATURE_ADDR_TIMING_MODE,
872 tmode_param);
Boris Brezillon1d017852018-11-11 08:55:14 +0100873 nand_deselect_target(chip);
Miquel Raynal415ae782018-03-19 14:47:24 +0100874 if (ret)
875 goto err_reset_chip;
876
877 if (tmode_param[0] != chip->onfi_timing_mode_default) {
878 pr_warn("timing mode %d not acknowledged by the NAND chip\n",
879 chip->onfi_timing_mode_default);
880 goto err_reset_chip;
881 }
882
883 return 0;
884
885err_reset_chip:
886 /*
887 * Fallback to mode 0 if the chip explicitly did not ack the chosen
888 * timing mode.
889 */
890 nand_reset_data_interface(chip, chipnr);
Boris Brezillon1d017852018-11-11 08:55:14 +0100891 nand_select_target(chip, chipnr);
Miquel Raynal415ae782018-03-19 14:47:24 +0100892 nand_reset_op(chip);
Boris Brezillon1d017852018-11-11 08:55:14 +0100893 nand_deselect_target(chip);
Miquel Raynal415ae782018-03-19 14:47:24 +0100894
Boris Brezillond8e725d2016-09-15 10:32:50 +0200895 return ret;
896}
897
898/**
899 * nand_init_data_interface - find the best data interface and timings
900 * @chip: The NAND chip
901 *
902 * Find the best data interface and NAND timings supported by the chip
903 * and the driver.
904 * First tries to retrieve supported timing modes from ONFI information,
905 * and if the NAND chip does not support ONFI, relies on the
906 * ->onfi_timing_mode_default specified in the nand_ids table. After this
907 * function nand_chip->data_interface is initialized with the best timing mode
908 * available.
909 *
910 * Returns 0 for success or negative error code otherwise.
911 */
912static int nand_init_data_interface(struct nand_chip *chip)
913{
Boris Brezillond8e725d2016-09-15 10:32:50 +0200914 int modes, mode, ret;
915
Boris Brezillon7a08dba2018-11-11 08:55:24 +0100916 if (!nand_has_setup_data_iface(chip))
Boris Brezillond8e725d2016-09-15 10:32:50 +0200917 return 0;
918
919 /*
920 * First try to identify the best timings from ONFI parameters and
921 * if the NAND does not support ONFI, fallback to the default ONFI
922 * timing mode.
923 */
Boris Brezillon462f35d2018-09-07 00:38:47 +0200924 if (chip->parameters.onfi) {
925 modes = chip->parameters.onfi->async_timing_mode;
926 } else {
Boris Brezillond8e725d2016-09-15 10:32:50 +0200927 if (!chip->onfi_timing_mode_default)
928 return 0;
929
930 modes = GENMASK(chip->onfi_timing_mode_default, 0);
931 }
932
Boris Brezillond8e725d2016-09-15 10:32:50 +0200933 for (mode = fls(modes) - 1; mode >= 0; mode--) {
Miquel Raynal17fa8042017-11-30 18:01:31 +0100934 ret = onfi_fill_data_interface(chip, NAND_SDR_IFACE, mode);
Boris Brezillond8e725d2016-09-15 10:32:50 +0200935 if (ret)
936 continue;
937
Miquel Raynald787b8b2017-12-22 18:12:41 +0100938 /*
939 * Pass NAND_DATA_IFACE_CHECK_ONLY to only check if the
940 * controller supports the requested timings.
941 */
Boris Brezillon7a08dba2018-11-11 08:55:24 +0100942 ret = chip->controller->ops->setup_data_interface(chip,
Boris Brezillon104e4422017-03-16 09:35:58 +0100943 NAND_DATA_IFACE_CHECK_ONLY,
Miquel Raynal17fa8042017-11-30 18:01:31 +0100944 &chip->data_interface);
Boris Brezillond8e725d2016-09-15 10:32:50 +0200945 if (!ret) {
946 chip->onfi_timing_mode_default = mode;
947 break;
948 }
949 }
950
951 return 0;
952}
953
Boris Brezillond8e725d2016-09-15 10:32:50 +0200954/**
Miquel Raynal8878b122017-11-09 14:16:45 +0100955 * nand_fill_column_cycles - fill the column cycles of an address
956 * @chip: The NAND chip
957 * @addrs: Array of address cycles to fill
958 * @offset_in_page: The offset in the page
959 *
960 * Fills the first or the first two bytes of the @addrs field depending
961 * on the NAND bus width and the page size.
962 *
963 * Returns the number of cycles needed to encode the column, or a negative
964 * error code in case one of the arguments is invalid.
965 */
966static int nand_fill_column_cycles(struct nand_chip *chip, u8 *addrs,
967 unsigned int offset_in_page)
Matthieu CASTETf251b8d2012-11-05 15:00:44 +0100968{
Miquel Raynal8878b122017-11-09 14:16:45 +0100969 struct mtd_info *mtd = nand_to_mtd(chip);
970
971 /* Make sure the offset is less than the actual page size. */
972 if (offset_in_page > mtd->writesize + mtd->oobsize)
973 return -EINVAL;
974
975 /*
976 * On small page NANDs, there's a dedicated command to access the OOB
977 * area, and the column address is relative to the start of the OOB
978 * area, not the start of the page. Asjust the address accordingly.
979 */
980 if (mtd->writesize <= 512 && offset_in_page >= mtd->writesize)
981 offset_in_page -= mtd->writesize;
982
983 /*
984 * The offset in page is expressed in bytes, if the NAND bus is 16-bit
985 * wide, then it must be divided by 2.
986 */
987 if (chip->options & NAND_BUSWIDTH_16) {
988 if (WARN_ON(offset_in_page % 2))
989 return -EINVAL;
990
991 offset_in_page /= 2;
992 }
993
994 addrs[0] = offset_in_page;
995
996 /*
997 * Small page NANDs use 1 cycle for the columns, while large page NANDs
998 * need 2
999 */
1000 if (mtd->writesize <= 512)
1001 return 1;
1002
1003 addrs[1] = offset_in_page >> 8;
1004
1005 return 2;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001006}
1007
Miquel Raynal8878b122017-11-09 14:16:45 +01001008static int nand_sp_exec_read_page_op(struct nand_chip *chip, unsigned int page,
1009 unsigned int offset_in_page, void *buf,
1010 unsigned int len)
1011{
1012 struct mtd_info *mtd = nand_to_mtd(chip);
1013 const struct nand_sdr_timings *sdr =
1014 nand_get_sdr_timings(&chip->data_interface);
1015 u8 addrs[4];
1016 struct nand_op_instr instrs[] = {
1017 NAND_OP_CMD(NAND_CMD_READ0, 0),
1018 NAND_OP_ADDR(3, addrs, PSEC_TO_NSEC(sdr->tWB_max)),
1019 NAND_OP_WAIT_RDY(PSEC_TO_MSEC(sdr->tR_max),
1020 PSEC_TO_NSEC(sdr->tRR_min)),
1021 NAND_OP_DATA_IN(len, buf, 0),
1022 };
Boris Brezillonae2294b2018-11-11 08:55:15 +01001023 struct nand_operation op = NAND_OPERATION(chip->cur_cs, instrs);
Miquel Raynal8878b122017-11-09 14:16:45 +01001024 int ret;
1025
1026 /* Drop the DATA_IN instruction if len is set to 0. */
1027 if (!len)
1028 op.ninstrs--;
1029
1030 if (offset_in_page >= mtd->writesize)
1031 instrs[0].ctx.cmd.opcode = NAND_CMD_READOOB;
1032 else if (offset_in_page >= 256 &&
1033 !(chip->options & NAND_BUSWIDTH_16))
1034 instrs[0].ctx.cmd.opcode = NAND_CMD_READ1;
1035
1036 ret = nand_fill_column_cycles(chip, addrs, offset_in_page);
1037 if (ret < 0)
1038 return ret;
1039
1040 addrs[1] = page;
1041 addrs[2] = page >> 8;
1042
1043 if (chip->options & NAND_ROW_ADDR_3) {
1044 addrs[3] = page >> 16;
1045 instrs[1].ctx.addr.naddrs++;
1046 }
1047
1048 return nand_exec_op(chip, &op);
1049}
1050
1051static int nand_lp_exec_read_page_op(struct nand_chip *chip, unsigned int page,
1052 unsigned int offset_in_page, void *buf,
1053 unsigned int len)
1054{
1055 const struct nand_sdr_timings *sdr =
1056 nand_get_sdr_timings(&chip->data_interface);
1057 u8 addrs[5];
1058 struct nand_op_instr instrs[] = {
1059 NAND_OP_CMD(NAND_CMD_READ0, 0),
1060 NAND_OP_ADDR(4, addrs, 0),
1061 NAND_OP_CMD(NAND_CMD_READSTART, PSEC_TO_NSEC(sdr->tWB_max)),
1062 NAND_OP_WAIT_RDY(PSEC_TO_MSEC(sdr->tR_max),
1063 PSEC_TO_NSEC(sdr->tRR_min)),
1064 NAND_OP_DATA_IN(len, buf, 0),
1065 };
Boris Brezillonae2294b2018-11-11 08:55:15 +01001066 struct nand_operation op = NAND_OPERATION(chip->cur_cs, instrs);
Miquel Raynal8878b122017-11-09 14:16:45 +01001067 int ret;
1068
1069 /* Drop the DATA_IN instruction if len is set to 0. */
1070 if (!len)
1071 op.ninstrs--;
1072
1073 ret = nand_fill_column_cycles(chip, addrs, offset_in_page);
1074 if (ret < 0)
1075 return ret;
1076
1077 addrs[2] = page;
1078 addrs[3] = page >> 8;
1079
1080 if (chip->options & NAND_ROW_ADDR_3) {
1081 addrs[4] = page >> 16;
1082 instrs[1].ctx.addr.naddrs++;
1083 }
1084
1085 return nand_exec_op(chip, &op);
1086}
1087
1088/**
Boris Brezillon97d90da2017-11-30 18:01:29 +01001089 * nand_read_page_op - Do a READ PAGE operation
1090 * @chip: The NAND chip
1091 * @page: page to read
1092 * @offset_in_page: offset within the page
1093 * @buf: buffer used to store the data
1094 * @len: length of the buffer
1095 *
1096 * This function issues a READ PAGE operation.
1097 * This function does not select/unselect the CS line.
1098 *
1099 * Returns 0 on success, a negative error code otherwise.
1100 */
1101int nand_read_page_op(struct nand_chip *chip, unsigned int page,
1102 unsigned int offset_in_page, void *buf, unsigned int len)
1103{
1104 struct mtd_info *mtd = nand_to_mtd(chip);
1105
1106 if (len && !buf)
1107 return -EINVAL;
1108
1109 if (offset_in_page + len > mtd->writesize + mtd->oobsize)
1110 return -EINVAL;
1111
Boris Brezillonf2abfeb2018-11-11 08:55:23 +01001112 if (nand_has_exec_op(chip)) {
Miquel Raynal8878b122017-11-09 14:16:45 +01001113 if (mtd->writesize > 512)
1114 return nand_lp_exec_read_page_op(chip, page,
1115 offset_in_page, buf,
1116 len);
1117
1118 return nand_sp_exec_read_page_op(chip, page, offset_in_page,
1119 buf, len);
1120 }
1121
Boris Brezillonbf6065c2018-09-07 00:38:36 +02001122 chip->legacy.cmdfunc(chip, NAND_CMD_READ0, offset_in_page, page);
Boris Brezillon97d90da2017-11-30 18:01:29 +01001123 if (len)
Boris Brezillon716bbba2018-09-07 00:38:35 +02001124 chip->legacy.read_buf(chip, buf, len);
Boris Brezillon97d90da2017-11-30 18:01:29 +01001125
1126 return 0;
1127}
1128EXPORT_SYMBOL_GPL(nand_read_page_op);
1129
1130/**
1131 * nand_read_param_page_op - Do a READ PARAMETER PAGE operation
1132 * @chip: The NAND chip
1133 * @page: parameter page to read
1134 * @buf: buffer used to store the data
1135 * @len: length of the buffer
1136 *
1137 * This function issues a READ PARAMETER PAGE operation.
1138 * This function does not select/unselect the CS line.
1139 *
1140 * Returns 0 on success, a negative error code otherwise.
1141 */
Boris Brezillon1c325cc2018-09-07 00:38:50 +02001142int nand_read_param_page_op(struct nand_chip *chip, u8 page, void *buf,
1143 unsigned int len)
Boris Brezillon97d90da2017-11-30 18:01:29 +01001144{
Boris Brezillon97d90da2017-11-30 18:01:29 +01001145 unsigned int i;
1146 u8 *p = buf;
1147
1148 if (len && !buf)
1149 return -EINVAL;
1150
Boris Brezillonf2abfeb2018-11-11 08:55:23 +01001151 if (nand_has_exec_op(chip)) {
Miquel Raynal8878b122017-11-09 14:16:45 +01001152 const struct nand_sdr_timings *sdr =
1153 nand_get_sdr_timings(&chip->data_interface);
1154 struct nand_op_instr instrs[] = {
1155 NAND_OP_CMD(NAND_CMD_PARAM, 0),
1156 NAND_OP_ADDR(1, &page, PSEC_TO_NSEC(sdr->tWB_max)),
1157 NAND_OP_WAIT_RDY(PSEC_TO_MSEC(sdr->tR_max),
1158 PSEC_TO_NSEC(sdr->tRR_min)),
1159 NAND_OP_8BIT_DATA_IN(len, buf, 0),
1160 };
Boris Brezillonae2294b2018-11-11 08:55:15 +01001161 struct nand_operation op = NAND_OPERATION(chip->cur_cs, instrs);
Miquel Raynal8878b122017-11-09 14:16:45 +01001162
1163 /* Drop the DATA_IN instruction if len is set to 0. */
1164 if (!len)
1165 op.ninstrs--;
1166
1167 return nand_exec_op(chip, &op);
1168 }
1169
Boris Brezillonbf6065c2018-09-07 00:38:36 +02001170 chip->legacy.cmdfunc(chip, NAND_CMD_PARAM, page, -1);
Boris Brezillon97d90da2017-11-30 18:01:29 +01001171 for (i = 0; i < len; i++)
Boris Brezillon716bbba2018-09-07 00:38:35 +02001172 p[i] = chip->legacy.read_byte(chip);
Boris Brezillon97d90da2017-11-30 18:01:29 +01001173
1174 return 0;
1175}
1176
1177/**
1178 * nand_change_read_column_op - Do a CHANGE READ COLUMN operation
1179 * @chip: The NAND chip
1180 * @offset_in_page: offset within the page
1181 * @buf: buffer used to store the data
1182 * @len: length of the buffer
1183 * @force_8bit: force 8-bit bus access
1184 *
1185 * This function issues a CHANGE READ COLUMN operation.
1186 * This function does not select/unselect the CS line.
1187 *
1188 * Returns 0 on success, a negative error code otherwise.
1189 */
1190int nand_change_read_column_op(struct nand_chip *chip,
1191 unsigned int offset_in_page, void *buf,
1192 unsigned int len, bool force_8bit)
1193{
1194 struct mtd_info *mtd = nand_to_mtd(chip);
1195
1196 if (len && !buf)
1197 return -EINVAL;
1198
1199 if (offset_in_page + len > mtd->writesize + mtd->oobsize)
1200 return -EINVAL;
1201
Miquel Raynal8878b122017-11-09 14:16:45 +01001202 /* Small page NANDs do not support column change. */
1203 if (mtd->writesize <= 512)
1204 return -ENOTSUPP;
1205
Boris Brezillonf2abfeb2018-11-11 08:55:23 +01001206 if (nand_has_exec_op(chip)) {
Miquel Raynal8878b122017-11-09 14:16:45 +01001207 const struct nand_sdr_timings *sdr =
1208 nand_get_sdr_timings(&chip->data_interface);
1209 u8 addrs[2] = {};
1210 struct nand_op_instr instrs[] = {
1211 NAND_OP_CMD(NAND_CMD_RNDOUT, 0),
1212 NAND_OP_ADDR(2, addrs, 0),
1213 NAND_OP_CMD(NAND_CMD_RNDOUTSTART,
1214 PSEC_TO_NSEC(sdr->tCCS_min)),
1215 NAND_OP_DATA_IN(len, buf, 0),
1216 };
Boris Brezillonae2294b2018-11-11 08:55:15 +01001217 struct nand_operation op = NAND_OPERATION(chip->cur_cs, instrs);
Miquel Raynal8878b122017-11-09 14:16:45 +01001218 int ret;
1219
1220 ret = nand_fill_column_cycles(chip, addrs, offset_in_page);
1221 if (ret < 0)
1222 return ret;
1223
1224 /* Drop the DATA_IN instruction if len is set to 0. */
1225 if (!len)
1226 op.ninstrs--;
1227
1228 instrs[3].ctx.data.force_8bit = force_8bit;
1229
1230 return nand_exec_op(chip, &op);
1231 }
1232
Boris Brezillonbf6065c2018-09-07 00:38:36 +02001233 chip->legacy.cmdfunc(chip, NAND_CMD_RNDOUT, offset_in_page, -1);
Boris Brezillon97d90da2017-11-30 18:01:29 +01001234 if (len)
Boris Brezillon716bbba2018-09-07 00:38:35 +02001235 chip->legacy.read_buf(chip, buf, len);
Boris Brezillon97d90da2017-11-30 18:01:29 +01001236
1237 return 0;
1238}
1239EXPORT_SYMBOL_GPL(nand_change_read_column_op);
1240
1241/**
1242 * nand_read_oob_op - Do a READ OOB operation
1243 * @chip: The NAND chip
1244 * @page: page to read
1245 * @offset_in_oob: offset within the OOB area
1246 * @buf: buffer used to store the data
1247 * @len: length of the buffer
1248 *
1249 * This function issues a READ OOB operation.
1250 * This function does not select/unselect the CS line.
1251 *
1252 * Returns 0 on success, a negative error code otherwise.
1253 */
1254int nand_read_oob_op(struct nand_chip *chip, unsigned int page,
1255 unsigned int offset_in_oob, void *buf, unsigned int len)
1256{
1257 struct mtd_info *mtd = nand_to_mtd(chip);
1258
1259 if (len && !buf)
1260 return -EINVAL;
1261
1262 if (offset_in_oob + len > mtd->oobsize)
1263 return -EINVAL;
1264
Boris Brezillonf2abfeb2018-11-11 08:55:23 +01001265 if (nand_has_exec_op(chip))
Miquel Raynal8878b122017-11-09 14:16:45 +01001266 return nand_read_page_op(chip, page,
1267 mtd->writesize + offset_in_oob,
1268 buf, len);
1269
Boris Brezillonbf6065c2018-09-07 00:38:36 +02001270 chip->legacy.cmdfunc(chip, NAND_CMD_READOOB, offset_in_oob, page);
Boris Brezillon97d90da2017-11-30 18:01:29 +01001271 if (len)
Boris Brezillon716bbba2018-09-07 00:38:35 +02001272 chip->legacy.read_buf(chip, buf, len);
Boris Brezillon97d90da2017-11-30 18:01:29 +01001273
1274 return 0;
1275}
1276EXPORT_SYMBOL_GPL(nand_read_oob_op);
1277
Miquel Raynal8878b122017-11-09 14:16:45 +01001278static int nand_exec_prog_page_op(struct nand_chip *chip, unsigned int page,
1279 unsigned int offset_in_page, const void *buf,
1280 unsigned int len, bool prog)
1281{
1282 struct mtd_info *mtd = nand_to_mtd(chip);
1283 const struct nand_sdr_timings *sdr =
1284 nand_get_sdr_timings(&chip->data_interface);
1285 u8 addrs[5] = {};
1286 struct nand_op_instr instrs[] = {
1287 /*
1288 * The first instruction will be dropped if we're dealing
1289 * with a large page NAND and adjusted if we're dealing
1290 * with a small page NAND and the page offset is > 255.
1291 */
1292 NAND_OP_CMD(NAND_CMD_READ0, 0),
1293 NAND_OP_CMD(NAND_CMD_SEQIN, 0),
1294 NAND_OP_ADDR(0, addrs, PSEC_TO_NSEC(sdr->tADL_min)),
1295 NAND_OP_DATA_OUT(len, buf, 0),
1296 NAND_OP_CMD(NAND_CMD_PAGEPROG, PSEC_TO_NSEC(sdr->tWB_max)),
1297 NAND_OP_WAIT_RDY(PSEC_TO_MSEC(sdr->tPROG_max), 0),
1298 };
Boris Brezillonae2294b2018-11-11 08:55:15 +01001299 struct nand_operation op = NAND_OPERATION(chip->cur_cs, instrs);
Miquel Raynal8878b122017-11-09 14:16:45 +01001300 int naddrs = nand_fill_column_cycles(chip, addrs, offset_in_page);
1301 int ret;
1302 u8 status;
1303
1304 if (naddrs < 0)
1305 return naddrs;
1306
1307 addrs[naddrs++] = page;
1308 addrs[naddrs++] = page >> 8;
1309 if (chip->options & NAND_ROW_ADDR_3)
1310 addrs[naddrs++] = page >> 16;
1311
1312 instrs[2].ctx.addr.naddrs = naddrs;
1313
1314 /* Drop the last two instructions if we're not programming the page. */
1315 if (!prog) {
1316 op.ninstrs -= 2;
1317 /* Also drop the DATA_OUT instruction if empty. */
1318 if (!len)
1319 op.ninstrs--;
1320 }
1321
1322 if (mtd->writesize <= 512) {
1323 /*
1324 * Small pages need some more tweaking: we have to adjust the
1325 * first instruction depending on the page offset we're trying
1326 * to access.
1327 */
1328 if (offset_in_page >= mtd->writesize)
1329 instrs[0].ctx.cmd.opcode = NAND_CMD_READOOB;
1330 else if (offset_in_page >= 256 &&
1331 !(chip->options & NAND_BUSWIDTH_16))
1332 instrs[0].ctx.cmd.opcode = NAND_CMD_READ1;
1333 } else {
1334 /*
1335 * Drop the first command if we're dealing with a large page
1336 * NAND.
1337 */
1338 op.instrs++;
1339 op.ninstrs--;
1340 }
1341
1342 ret = nand_exec_op(chip, &op);
1343 if (!prog || ret)
1344 return ret;
1345
1346 ret = nand_status_op(chip, &status);
1347 if (ret)
1348 return ret;
1349
1350 return status;
1351}
1352
Boris Brezillon97d90da2017-11-30 18:01:29 +01001353/**
1354 * nand_prog_page_begin_op - starts a PROG PAGE operation
1355 * @chip: The NAND chip
1356 * @page: page to write
1357 * @offset_in_page: offset within the page
1358 * @buf: buffer containing the data to write to the page
1359 * @len: length of the buffer
1360 *
1361 * This function issues the first half of a PROG PAGE operation.
1362 * This function does not select/unselect the CS line.
1363 *
1364 * Returns 0 on success, a negative error code otherwise.
1365 */
1366int nand_prog_page_begin_op(struct nand_chip *chip, unsigned int page,
1367 unsigned int offset_in_page, const void *buf,
1368 unsigned int len)
1369{
1370 struct mtd_info *mtd = nand_to_mtd(chip);
1371
1372 if (len && !buf)
1373 return -EINVAL;
1374
1375 if (offset_in_page + len > mtd->writesize + mtd->oobsize)
1376 return -EINVAL;
1377
Boris Brezillonf2abfeb2018-11-11 08:55:23 +01001378 if (nand_has_exec_op(chip))
Miquel Raynal8878b122017-11-09 14:16:45 +01001379 return nand_exec_prog_page_op(chip, page, offset_in_page, buf,
1380 len, false);
1381
Boris Brezillonbf6065c2018-09-07 00:38:36 +02001382 chip->legacy.cmdfunc(chip, NAND_CMD_SEQIN, offset_in_page, page);
Boris Brezillon97d90da2017-11-30 18:01:29 +01001383
1384 if (buf)
Boris Brezillon716bbba2018-09-07 00:38:35 +02001385 chip->legacy.write_buf(chip, buf, len);
Boris Brezillon97d90da2017-11-30 18:01:29 +01001386
1387 return 0;
1388}
1389EXPORT_SYMBOL_GPL(nand_prog_page_begin_op);
1390
1391/**
1392 * nand_prog_page_end_op - ends a PROG PAGE operation
1393 * @chip: The NAND chip
1394 *
1395 * This function issues the second half of a PROG PAGE operation.
1396 * This function does not select/unselect the CS line.
1397 *
1398 * Returns 0 on success, a negative error code otherwise.
1399 */
1400int nand_prog_page_end_op(struct nand_chip *chip)
1401{
Miquel Raynal8878b122017-11-09 14:16:45 +01001402 int ret;
1403 u8 status;
Boris Brezillon97d90da2017-11-30 18:01:29 +01001404
Boris Brezillonf2abfeb2018-11-11 08:55:23 +01001405 if (nand_has_exec_op(chip)) {
Miquel Raynal8878b122017-11-09 14:16:45 +01001406 const struct nand_sdr_timings *sdr =
1407 nand_get_sdr_timings(&chip->data_interface);
1408 struct nand_op_instr instrs[] = {
1409 NAND_OP_CMD(NAND_CMD_PAGEPROG,
1410 PSEC_TO_NSEC(sdr->tWB_max)),
1411 NAND_OP_WAIT_RDY(PSEC_TO_MSEC(sdr->tPROG_max), 0),
1412 };
Boris Brezillonae2294b2018-11-11 08:55:15 +01001413 struct nand_operation op = NAND_OPERATION(chip->cur_cs, instrs);
Boris Brezillon97d90da2017-11-30 18:01:29 +01001414
Miquel Raynal8878b122017-11-09 14:16:45 +01001415 ret = nand_exec_op(chip, &op);
1416 if (ret)
1417 return ret;
1418
1419 ret = nand_status_op(chip, &status);
1420 if (ret)
1421 return ret;
1422 } else {
Boris Brezillonbf6065c2018-09-07 00:38:36 +02001423 chip->legacy.cmdfunc(chip, NAND_CMD_PAGEPROG, -1, -1);
Boris Brezillon8395b752018-09-07 00:38:37 +02001424 ret = chip->legacy.waitfunc(chip);
Miquel Raynal8878b122017-11-09 14:16:45 +01001425 if (ret < 0)
1426 return ret;
1427
1428 status = ret;
1429 }
1430
Boris Brezillon97d90da2017-11-30 18:01:29 +01001431 if (status & NAND_STATUS_FAIL)
1432 return -EIO;
1433
1434 return 0;
1435}
1436EXPORT_SYMBOL_GPL(nand_prog_page_end_op);
1437
1438/**
1439 * nand_prog_page_op - Do a full PROG PAGE operation
1440 * @chip: The NAND chip
1441 * @page: page to write
1442 * @offset_in_page: offset within the page
1443 * @buf: buffer containing the data to write to the page
1444 * @len: length of the buffer
1445 *
1446 * This function issues a full PROG PAGE operation.
1447 * This function does not select/unselect the CS line.
1448 *
1449 * Returns 0 on success, a negative error code otherwise.
1450 */
1451int nand_prog_page_op(struct nand_chip *chip, unsigned int page,
1452 unsigned int offset_in_page, const void *buf,
1453 unsigned int len)
1454{
1455 struct mtd_info *mtd = nand_to_mtd(chip);
1456 int status;
1457
1458 if (!len || !buf)
1459 return -EINVAL;
1460
1461 if (offset_in_page + len > mtd->writesize + mtd->oobsize)
1462 return -EINVAL;
1463
Boris Brezillonf2abfeb2018-11-11 08:55:23 +01001464 if (nand_has_exec_op(chip)) {
Miquel Raynal8878b122017-11-09 14:16:45 +01001465 status = nand_exec_prog_page_op(chip, page, offset_in_page, buf,
1466 len, true);
1467 } else {
Boris Brezillonbf6065c2018-09-07 00:38:36 +02001468 chip->legacy.cmdfunc(chip, NAND_CMD_SEQIN, offset_in_page,
1469 page);
Boris Brezillon716bbba2018-09-07 00:38:35 +02001470 chip->legacy.write_buf(chip, buf, len);
Boris Brezillonbf6065c2018-09-07 00:38:36 +02001471 chip->legacy.cmdfunc(chip, NAND_CMD_PAGEPROG, -1, -1);
Boris Brezillon8395b752018-09-07 00:38:37 +02001472 status = chip->legacy.waitfunc(chip);
Miquel Raynal8878b122017-11-09 14:16:45 +01001473 }
Boris Brezillon97d90da2017-11-30 18:01:29 +01001474
Boris Brezillon97d90da2017-11-30 18:01:29 +01001475 if (status & NAND_STATUS_FAIL)
1476 return -EIO;
1477
1478 return 0;
1479}
1480EXPORT_SYMBOL_GPL(nand_prog_page_op);
1481
1482/**
1483 * nand_change_write_column_op - Do a CHANGE WRITE COLUMN operation
1484 * @chip: The NAND chip
1485 * @offset_in_page: offset within the page
1486 * @buf: buffer containing the data to send to the NAND
1487 * @len: length of the buffer
1488 * @force_8bit: force 8-bit bus access
1489 *
1490 * This function issues a CHANGE WRITE COLUMN operation.
1491 * This function does not select/unselect the CS line.
1492 *
1493 * Returns 0 on success, a negative error code otherwise.
1494 */
1495int nand_change_write_column_op(struct nand_chip *chip,
1496 unsigned int offset_in_page,
1497 const void *buf, unsigned int len,
1498 bool force_8bit)
1499{
1500 struct mtd_info *mtd = nand_to_mtd(chip);
1501
1502 if (len && !buf)
1503 return -EINVAL;
1504
1505 if (offset_in_page + len > mtd->writesize + mtd->oobsize)
1506 return -EINVAL;
1507
Miquel Raynal8878b122017-11-09 14:16:45 +01001508 /* Small page NANDs do not support column change. */
1509 if (mtd->writesize <= 512)
1510 return -ENOTSUPP;
1511
Boris Brezillonf2abfeb2018-11-11 08:55:23 +01001512 if (nand_has_exec_op(chip)) {
Miquel Raynal8878b122017-11-09 14:16:45 +01001513 const struct nand_sdr_timings *sdr =
1514 nand_get_sdr_timings(&chip->data_interface);
1515 u8 addrs[2];
1516 struct nand_op_instr instrs[] = {
1517 NAND_OP_CMD(NAND_CMD_RNDIN, 0),
1518 NAND_OP_ADDR(2, addrs, PSEC_TO_NSEC(sdr->tCCS_min)),
1519 NAND_OP_DATA_OUT(len, buf, 0),
1520 };
Boris Brezillonae2294b2018-11-11 08:55:15 +01001521 struct nand_operation op = NAND_OPERATION(chip->cur_cs, instrs);
Miquel Raynal8878b122017-11-09 14:16:45 +01001522 int ret;
1523
1524 ret = nand_fill_column_cycles(chip, addrs, offset_in_page);
1525 if (ret < 0)
1526 return ret;
1527
1528 instrs[2].ctx.data.force_8bit = force_8bit;
1529
1530 /* Drop the DATA_OUT instruction if len is set to 0. */
1531 if (!len)
1532 op.ninstrs--;
1533
1534 return nand_exec_op(chip, &op);
1535 }
1536
Boris Brezillonbf6065c2018-09-07 00:38:36 +02001537 chip->legacy.cmdfunc(chip, NAND_CMD_RNDIN, offset_in_page, -1);
Boris Brezillon97d90da2017-11-30 18:01:29 +01001538 if (len)
Boris Brezillon716bbba2018-09-07 00:38:35 +02001539 chip->legacy.write_buf(chip, buf, len);
Boris Brezillon97d90da2017-11-30 18:01:29 +01001540
1541 return 0;
1542}
1543EXPORT_SYMBOL_GPL(nand_change_write_column_op);
1544
1545/**
1546 * nand_readid_op - Do a READID operation
1547 * @chip: The NAND chip
1548 * @addr: address cycle to pass after the READID command
1549 * @buf: buffer used to store the ID
1550 * @len: length of the buffer
1551 *
1552 * This function sends a READID command and reads back the ID returned by the
1553 * NAND.
1554 * This function does not select/unselect the CS line.
1555 *
1556 * Returns 0 on success, a negative error code otherwise.
1557 */
1558int nand_readid_op(struct nand_chip *chip, u8 addr, void *buf,
1559 unsigned int len)
1560{
Boris Brezillon97d90da2017-11-30 18:01:29 +01001561 unsigned int i;
1562 u8 *id = buf;
1563
1564 if (len && !buf)
1565 return -EINVAL;
1566
Boris Brezillonf2abfeb2018-11-11 08:55:23 +01001567 if (nand_has_exec_op(chip)) {
Miquel Raynal8878b122017-11-09 14:16:45 +01001568 const struct nand_sdr_timings *sdr =
1569 nand_get_sdr_timings(&chip->data_interface);
1570 struct nand_op_instr instrs[] = {
1571 NAND_OP_CMD(NAND_CMD_READID, 0),
1572 NAND_OP_ADDR(1, &addr, PSEC_TO_NSEC(sdr->tADL_min)),
1573 NAND_OP_8BIT_DATA_IN(len, buf, 0),
1574 };
Boris Brezillonae2294b2018-11-11 08:55:15 +01001575 struct nand_operation op = NAND_OPERATION(chip->cur_cs, instrs);
Miquel Raynal8878b122017-11-09 14:16:45 +01001576
1577 /* Drop the DATA_IN instruction if len is set to 0. */
1578 if (!len)
1579 op.ninstrs--;
1580
1581 return nand_exec_op(chip, &op);
1582 }
1583
Boris Brezillonbf6065c2018-09-07 00:38:36 +02001584 chip->legacy.cmdfunc(chip, NAND_CMD_READID, addr, -1);
Boris Brezillon97d90da2017-11-30 18:01:29 +01001585
1586 for (i = 0; i < len; i++)
Boris Brezillon716bbba2018-09-07 00:38:35 +02001587 id[i] = chip->legacy.read_byte(chip);
Boris Brezillon97d90da2017-11-30 18:01:29 +01001588
1589 return 0;
1590}
1591EXPORT_SYMBOL_GPL(nand_readid_op);
1592
1593/**
1594 * nand_status_op - Do a STATUS operation
1595 * @chip: The NAND chip
1596 * @status: out variable to store the NAND status
1597 *
1598 * This function sends a STATUS command and reads back the status returned by
1599 * the NAND.
1600 * This function does not select/unselect the CS line.
1601 *
1602 * Returns 0 on success, a negative error code otherwise.
1603 */
1604int nand_status_op(struct nand_chip *chip, u8 *status)
1605{
Boris Brezillonf2abfeb2018-11-11 08:55:23 +01001606 if (nand_has_exec_op(chip)) {
Miquel Raynal8878b122017-11-09 14:16:45 +01001607 const struct nand_sdr_timings *sdr =
1608 nand_get_sdr_timings(&chip->data_interface);
1609 struct nand_op_instr instrs[] = {
1610 NAND_OP_CMD(NAND_CMD_STATUS,
1611 PSEC_TO_NSEC(sdr->tADL_min)),
1612 NAND_OP_8BIT_DATA_IN(1, status, 0),
1613 };
Boris Brezillonae2294b2018-11-11 08:55:15 +01001614 struct nand_operation op = NAND_OPERATION(chip->cur_cs, instrs);
Miquel Raynal8878b122017-11-09 14:16:45 +01001615
1616 if (!status)
1617 op.ninstrs--;
1618
1619 return nand_exec_op(chip, &op);
1620 }
1621
Boris Brezillonbf6065c2018-09-07 00:38:36 +02001622 chip->legacy.cmdfunc(chip, NAND_CMD_STATUS, -1, -1);
Boris Brezillon97d90da2017-11-30 18:01:29 +01001623 if (status)
Boris Brezillon716bbba2018-09-07 00:38:35 +02001624 *status = chip->legacy.read_byte(chip);
Boris Brezillon97d90da2017-11-30 18:01:29 +01001625
1626 return 0;
1627}
1628EXPORT_SYMBOL_GPL(nand_status_op);
1629
1630/**
1631 * nand_exit_status_op - Exit a STATUS operation
1632 * @chip: The NAND chip
1633 *
1634 * This function sends a READ0 command to cancel the effect of the STATUS
1635 * command to avoid reading only the status until a new read command is sent.
1636 *
1637 * This function does not select/unselect the CS line.
1638 *
1639 * Returns 0 on success, a negative error code otherwise.
1640 */
1641int nand_exit_status_op(struct nand_chip *chip)
1642{
Boris Brezillonf2abfeb2018-11-11 08:55:23 +01001643 if (nand_has_exec_op(chip)) {
Miquel Raynal8878b122017-11-09 14:16:45 +01001644 struct nand_op_instr instrs[] = {
1645 NAND_OP_CMD(NAND_CMD_READ0, 0),
1646 };
Boris Brezillonae2294b2018-11-11 08:55:15 +01001647 struct nand_operation op = NAND_OPERATION(chip->cur_cs, instrs);
Miquel Raynal8878b122017-11-09 14:16:45 +01001648
1649 return nand_exec_op(chip, &op);
1650 }
1651
Boris Brezillonbf6065c2018-09-07 00:38:36 +02001652 chip->legacy.cmdfunc(chip, NAND_CMD_READ0, -1, -1);
Boris Brezillon97d90da2017-11-30 18:01:29 +01001653
1654 return 0;
1655}
Boris Brezillon97d90da2017-11-30 18:01:29 +01001656
1657/**
1658 * nand_erase_op - Do an erase operation
1659 * @chip: The NAND chip
1660 * @eraseblock: block to erase
1661 *
1662 * This function sends an ERASE command and waits for the NAND to be ready
1663 * before returning.
1664 * This function does not select/unselect the CS line.
1665 *
1666 * Returns 0 on success, a negative error code otherwise.
1667 */
1668int nand_erase_op(struct nand_chip *chip, unsigned int eraseblock)
1669{
Boris Brezillon97d90da2017-11-30 18:01:29 +01001670 unsigned int page = eraseblock <<
1671 (chip->phys_erase_shift - chip->page_shift);
Miquel Raynal8878b122017-11-09 14:16:45 +01001672 int ret;
1673 u8 status;
Boris Brezillon97d90da2017-11-30 18:01:29 +01001674
Boris Brezillonf2abfeb2018-11-11 08:55:23 +01001675 if (nand_has_exec_op(chip)) {
Miquel Raynal8878b122017-11-09 14:16:45 +01001676 const struct nand_sdr_timings *sdr =
1677 nand_get_sdr_timings(&chip->data_interface);
1678 u8 addrs[3] = { page, page >> 8, page >> 16 };
1679 struct nand_op_instr instrs[] = {
1680 NAND_OP_CMD(NAND_CMD_ERASE1, 0),
1681 NAND_OP_ADDR(2, addrs, 0),
1682 NAND_OP_CMD(NAND_CMD_ERASE2,
1683 PSEC_TO_MSEC(sdr->tWB_max)),
1684 NAND_OP_WAIT_RDY(PSEC_TO_MSEC(sdr->tBERS_max), 0),
1685 };
Boris Brezillonae2294b2018-11-11 08:55:15 +01001686 struct nand_operation op = NAND_OPERATION(chip->cur_cs, instrs);
Boris Brezillon97d90da2017-11-30 18:01:29 +01001687
Miquel Raynal8878b122017-11-09 14:16:45 +01001688 if (chip->options & NAND_ROW_ADDR_3)
1689 instrs[1].ctx.addr.naddrs++;
1690
1691 ret = nand_exec_op(chip, &op);
1692 if (ret)
1693 return ret;
1694
1695 ret = nand_status_op(chip, &status);
1696 if (ret)
1697 return ret;
1698 } else {
Boris Brezillonbf6065c2018-09-07 00:38:36 +02001699 chip->legacy.cmdfunc(chip, NAND_CMD_ERASE1, -1, page);
1700 chip->legacy.cmdfunc(chip, NAND_CMD_ERASE2, -1, -1);
Miquel Raynal8878b122017-11-09 14:16:45 +01001701
Boris Brezillon8395b752018-09-07 00:38:37 +02001702 ret = chip->legacy.waitfunc(chip);
Miquel Raynal8878b122017-11-09 14:16:45 +01001703 if (ret < 0)
1704 return ret;
1705
1706 status = ret;
1707 }
Boris Brezillon97d90da2017-11-30 18:01:29 +01001708
1709 if (status & NAND_STATUS_FAIL)
1710 return -EIO;
1711
1712 return 0;
1713}
1714EXPORT_SYMBOL_GPL(nand_erase_op);
1715
1716/**
1717 * nand_set_features_op - Do a SET FEATURES operation
1718 * @chip: The NAND chip
1719 * @feature: feature id
1720 * @data: 4 bytes of data
1721 *
1722 * This function sends a SET FEATURES command and waits for the NAND to be
1723 * ready before returning.
1724 * This function does not select/unselect the CS line.
1725 *
1726 * Returns 0 on success, a negative error code otherwise.
1727 */
1728static int nand_set_features_op(struct nand_chip *chip, u8 feature,
1729 const void *data)
1730{
Boris Brezillon97d90da2017-11-30 18:01:29 +01001731 const u8 *params = data;
Miquel Raynal8878b122017-11-09 14:16:45 +01001732 int i, ret;
Boris Brezillon97d90da2017-11-30 18:01:29 +01001733
Boris Brezillonf2abfeb2018-11-11 08:55:23 +01001734 if (nand_has_exec_op(chip)) {
Miquel Raynal8878b122017-11-09 14:16:45 +01001735 const struct nand_sdr_timings *sdr =
1736 nand_get_sdr_timings(&chip->data_interface);
1737 struct nand_op_instr instrs[] = {
1738 NAND_OP_CMD(NAND_CMD_SET_FEATURES, 0),
1739 NAND_OP_ADDR(1, &feature, PSEC_TO_NSEC(sdr->tADL_min)),
1740 NAND_OP_8BIT_DATA_OUT(ONFI_SUBFEATURE_PARAM_LEN, data,
1741 PSEC_TO_NSEC(sdr->tWB_max)),
1742 NAND_OP_WAIT_RDY(PSEC_TO_MSEC(sdr->tFEAT_max), 0),
1743 };
Boris Brezillonae2294b2018-11-11 08:55:15 +01001744 struct nand_operation op = NAND_OPERATION(chip->cur_cs, instrs);
Boris Brezillon97d90da2017-11-30 18:01:29 +01001745
Boris Brezillon782d1962018-05-11 14:44:07 +02001746 return nand_exec_op(chip, &op);
Miquel Raynal8878b122017-11-09 14:16:45 +01001747 }
1748
Boris Brezillonbf6065c2018-09-07 00:38:36 +02001749 chip->legacy.cmdfunc(chip, NAND_CMD_SET_FEATURES, feature, -1);
Boris Brezillon782d1962018-05-11 14:44:07 +02001750 for (i = 0; i < ONFI_SUBFEATURE_PARAM_LEN; ++i)
Boris Brezillon716bbba2018-09-07 00:38:35 +02001751 chip->legacy.write_byte(chip, params[i]);
Boris Brezillon782d1962018-05-11 14:44:07 +02001752
Boris Brezillon8395b752018-09-07 00:38:37 +02001753 ret = chip->legacy.waitfunc(chip);
Boris Brezillon782d1962018-05-11 14:44:07 +02001754 if (ret < 0)
1755 return ret;
1756
1757 if (ret & NAND_STATUS_FAIL)
Boris Brezillon97d90da2017-11-30 18:01:29 +01001758 return -EIO;
1759
1760 return 0;
1761}
1762
1763/**
1764 * nand_get_features_op - Do a GET FEATURES operation
1765 * @chip: The NAND chip
1766 * @feature: feature id
1767 * @data: 4 bytes of data
1768 *
1769 * This function sends a GET FEATURES command and waits for the NAND to be
1770 * ready before returning.
1771 * This function does not select/unselect the CS line.
1772 *
1773 * Returns 0 on success, a negative error code otherwise.
1774 */
1775static int nand_get_features_op(struct nand_chip *chip, u8 feature,
1776 void *data)
1777{
Boris Brezillon97d90da2017-11-30 18:01:29 +01001778 u8 *params = data;
1779 int i;
1780
Boris Brezillonf2abfeb2018-11-11 08:55:23 +01001781 if (nand_has_exec_op(chip)) {
Miquel Raynal8878b122017-11-09 14:16:45 +01001782 const struct nand_sdr_timings *sdr =
1783 nand_get_sdr_timings(&chip->data_interface);
1784 struct nand_op_instr instrs[] = {
1785 NAND_OP_CMD(NAND_CMD_GET_FEATURES, 0),
1786 NAND_OP_ADDR(1, &feature, PSEC_TO_NSEC(sdr->tWB_max)),
1787 NAND_OP_WAIT_RDY(PSEC_TO_MSEC(sdr->tFEAT_max),
1788 PSEC_TO_NSEC(sdr->tRR_min)),
1789 NAND_OP_8BIT_DATA_IN(ONFI_SUBFEATURE_PARAM_LEN,
1790 data, 0),
1791 };
Boris Brezillonae2294b2018-11-11 08:55:15 +01001792 struct nand_operation op = NAND_OPERATION(chip->cur_cs, instrs);
Miquel Raynal8878b122017-11-09 14:16:45 +01001793
1794 return nand_exec_op(chip, &op);
1795 }
1796
Boris Brezillonbf6065c2018-09-07 00:38:36 +02001797 chip->legacy.cmdfunc(chip, NAND_CMD_GET_FEATURES, feature, -1);
Boris Brezillon97d90da2017-11-30 18:01:29 +01001798 for (i = 0; i < ONFI_SUBFEATURE_PARAM_LEN; ++i)
Boris Brezillon716bbba2018-09-07 00:38:35 +02001799 params[i] = chip->legacy.read_byte(chip);
Boris Brezillon97d90da2017-11-30 18:01:29 +01001800
1801 return 0;
1802}
1803
Boris Brezillon52f05b62018-07-27 09:44:18 +02001804static int nand_wait_rdy_op(struct nand_chip *chip, unsigned int timeout_ms,
1805 unsigned int delay_ns)
1806{
Boris Brezillonf2abfeb2018-11-11 08:55:23 +01001807 if (nand_has_exec_op(chip)) {
Boris Brezillon52f05b62018-07-27 09:44:18 +02001808 struct nand_op_instr instrs[] = {
1809 NAND_OP_WAIT_RDY(PSEC_TO_MSEC(timeout_ms),
1810 PSEC_TO_NSEC(delay_ns)),
1811 };
Boris Brezillonae2294b2018-11-11 08:55:15 +01001812 struct nand_operation op = NAND_OPERATION(chip->cur_cs, instrs);
Boris Brezillon52f05b62018-07-27 09:44:18 +02001813
1814 return nand_exec_op(chip, &op);
1815 }
1816
1817 /* Apply delay or wait for ready/busy pin */
Boris Brezillon8395b752018-09-07 00:38:37 +02001818 if (!chip->legacy.dev_ready)
Boris Brezillon3cece3a2018-09-07 00:38:41 +02001819 udelay(chip->legacy.chip_delay);
Boris Brezillon52f05b62018-07-27 09:44:18 +02001820 else
Boris Brezillon2b356ab2018-09-06 14:05:16 +02001821 nand_wait_ready(chip);
Boris Brezillon52f05b62018-07-27 09:44:18 +02001822
1823 return 0;
1824}
1825
Boris Brezillon97d90da2017-11-30 18:01:29 +01001826/**
1827 * nand_reset_op - Do a reset operation
1828 * @chip: The NAND chip
1829 *
1830 * This function sends a RESET command and waits for the NAND to be ready
1831 * before returning.
1832 * This function does not select/unselect the CS line.
1833 *
1834 * Returns 0 on success, a negative error code otherwise.
1835 */
1836int nand_reset_op(struct nand_chip *chip)
1837{
Boris Brezillonf2abfeb2018-11-11 08:55:23 +01001838 if (nand_has_exec_op(chip)) {
Miquel Raynal8878b122017-11-09 14:16:45 +01001839 const struct nand_sdr_timings *sdr =
1840 nand_get_sdr_timings(&chip->data_interface);
1841 struct nand_op_instr instrs[] = {
1842 NAND_OP_CMD(NAND_CMD_RESET, PSEC_TO_NSEC(sdr->tWB_max)),
1843 NAND_OP_WAIT_RDY(PSEC_TO_MSEC(sdr->tRST_max), 0),
1844 };
Boris Brezillonae2294b2018-11-11 08:55:15 +01001845 struct nand_operation op = NAND_OPERATION(chip->cur_cs, instrs);
Miquel Raynal8878b122017-11-09 14:16:45 +01001846
1847 return nand_exec_op(chip, &op);
1848 }
1849
Boris Brezillonbf6065c2018-09-07 00:38:36 +02001850 chip->legacy.cmdfunc(chip, NAND_CMD_RESET, -1, -1);
Boris Brezillon97d90da2017-11-30 18:01:29 +01001851
1852 return 0;
1853}
1854EXPORT_SYMBOL_GPL(nand_reset_op);
1855
1856/**
1857 * nand_read_data_op - Read data from the NAND
1858 * @chip: The NAND chip
1859 * @buf: buffer used to store the data
1860 * @len: length of the buffer
1861 * @force_8bit: force 8-bit bus access
1862 *
1863 * This function does a raw data read on the bus. Usually used after launching
1864 * another NAND operation like nand_read_page_op().
1865 * This function does not select/unselect the CS line.
1866 *
1867 * Returns 0 on success, a negative error code otherwise.
1868 */
1869int nand_read_data_op(struct nand_chip *chip, void *buf, unsigned int len,
1870 bool force_8bit)
1871{
Boris Brezillon97d90da2017-11-30 18:01:29 +01001872 if (!len || !buf)
1873 return -EINVAL;
1874
Boris Brezillonf2abfeb2018-11-11 08:55:23 +01001875 if (nand_has_exec_op(chip)) {
Miquel Raynal8878b122017-11-09 14:16:45 +01001876 struct nand_op_instr instrs[] = {
1877 NAND_OP_DATA_IN(len, buf, 0),
1878 };
Boris Brezillonae2294b2018-11-11 08:55:15 +01001879 struct nand_operation op = NAND_OPERATION(chip->cur_cs, instrs);
Miquel Raynal8878b122017-11-09 14:16:45 +01001880
1881 instrs[0].ctx.data.force_8bit = force_8bit;
1882
1883 return nand_exec_op(chip, &op);
1884 }
1885
Boris Brezillon97d90da2017-11-30 18:01:29 +01001886 if (force_8bit) {
1887 u8 *p = buf;
1888 unsigned int i;
1889
1890 for (i = 0; i < len; i++)
Boris Brezillon716bbba2018-09-07 00:38:35 +02001891 p[i] = chip->legacy.read_byte(chip);
Boris Brezillon97d90da2017-11-30 18:01:29 +01001892 } else {
Boris Brezillon716bbba2018-09-07 00:38:35 +02001893 chip->legacy.read_buf(chip, buf, len);
Boris Brezillon97d90da2017-11-30 18:01:29 +01001894 }
1895
1896 return 0;
1897}
1898EXPORT_SYMBOL_GPL(nand_read_data_op);
1899
1900/**
1901 * nand_write_data_op - Write data from the NAND
1902 * @chip: The NAND chip
1903 * @buf: buffer containing the data to send on the bus
1904 * @len: length of the buffer
1905 * @force_8bit: force 8-bit bus access
1906 *
1907 * This function does a raw data write on the bus. Usually used after launching
1908 * another NAND operation like nand_write_page_begin_op().
1909 * This function does not select/unselect the CS line.
1910 *
1911 * Returns 0 on success, a negative error code otherwise.
1912 */
1913int nand_write_data_op(struct nand_chip *chip, const void *buf,
1914 unsigned int len, bool force_8bit)
1915{
Boris Brezillon97d90da2017-11-30 18:01:29 +01001916 if (!len || !buf)
1917 return -EINVAL;
1918
Boris Brezillonf2abfeb2018-11-11 08:55:23 +01001919 if (nand_has_exec_op(chip)) {
Miquel Raynal8878b122017-11-09 14:16:45 +01001920 struct nand_op_instr instrs[] = {
1921 NAND_OP_DATA_OUT(len, buf, 0),
1922 };
Boris Brezillonae2294b2018-11-11 08:55:15 +01001923 struct nand_operation op = NAND_OPERATION(chip->cur_cs, instrs);
Miquel Raynal8878b122017-11-09 14:16:45 +01001924
1925 instrs[0].ctx.data.force_8bit = force_8bit;
1926
1927 return nand_exec_op(chip, &op);
1928 }
1929
Boris Brezillon97d90da2017-11-30 18:01:29 +01001930 if (force_8bit) {
1931 const u8 *p = buf;
1932 unsigned int i;
1933
1934 for (i = 0; i < len; i++)
Boris Brezillon716bbba2018-09-07 00:38:35 +02001935 chip->legacy.write_byte(chip, p[i]);
Boris Brezillon97d90da2017-11-30 18:01:29 +01001936 } else {
Boris Brezillon716bbba2018-09-07 00:38:35 +02001937 chip->legacy.write_buf(chip, buf, len);
Boris Brezillon97d90da2017-11-30 18:01:29 +01001938 }
1939
1940 return 0;
1941}
1942EXPORT_SYMBOL_GPL(nand_write_data_op);
1943
1944/**
Miquel Raynal8878b122017-11-09 14:16:45 +01001945 * struct nand_op_parser_ctx - Context used by the parser
1946 * @instrs: array of all the instructions that must be addressed
1947 * @ninstrs: length of the @instrs array
1948 * @subop: Sub-operation to be passed to the NAND controller
1949 *
1950 * This structure is used by the core to split NAND operations into
1951 * sub-operations that can be handled by the NAND controller.
1952 */
1953struct nand_op_parser_ctx {
1954 const struct nand_op_instr *instrs;
1955 unsigned int ninstrs;
1956 struct nand_subop subop;
1957};
1958
1959/**
1960 * nand_op_parser_must_split_instr - Checks if an instruction must be split
1961 * @pat: the parser pattern element that matches @instr
1962 * @instr: pointer to the instruction to check
1963 * @start_offset: this is an in/out parameter. If @instr has already been
1964 * split, then @start_offset is the offset from which to start
1965 * (either an address cycle or an offset in the data buffer).
1966 * Conversely, if the function returns true (ie. instr must be
1967 * split), this parameter is updated to point to the first
1968 * data/address cycle that has not been taken care of.
1969 *
1970 * Some NAND controllers are limited and cannot send X address cycles with a
1971 * unique operation, or cannot read/write more than Y bytes at the same time.
1972 * In this case, split the instruction that does not fit in a single
1973 * controller-operation into two or more chunks.
1974 *
1975 * Returns true if the instruction must be split, false otherwise.
1976 * The @start_offset parameter is also updated to the offset at which the next
1977 * bundle of instruction must start (if an address or a data instruction).
1978 */
1979static bool
1980nand_op_parser_must_split_instr(const struct nand_op_parser_pattern_elem *pat,
1981 const struct nand_op_instr *instr,
1982 unsigned int *start_offset)
1983{
1984 switch (pat->type) {
1985 case NAND_OP_ADDR_INSTR:
Miquel Raynalc1a72e22018-01-19 19:11:27 +01001986 if (!pat->ctx.addr.maxcycles)
Miquel Raynal8878b122017-11-09 14:16:45 +01001987 break;
1988
1989 if (instr->ctx.addr.naddrs - *start_offset >
Miquel Raynalc1a72e22018-01-19 19:11:27 +01001990 pat->ctx.addr.maxcycles) {
1991 *start_offset += pat->ctx.addr.maxcycles;
Miquel Raynal8878b122017-11-09 14:16:45 +01001992 return true;
1993 }
1994 break;
1995
1996 case NAND_OP_DATA_IN_INSTR:
1997 case NAND_OP_DATA_OUT_INSTR:
Miquel Raynalc1a72e22018-01-19 19:11:27 +01001998 if (!pat->ctx.data.maxlen)
Miquel Raynal8878b122017-11-09 14:16:45 +01001999 break;
2000
Miquel Raynalc1a72e22018-01-19 19:11:27 +01002001 if (instr->ctx.data.len - *start_offset >
2002 pat->ctx.data.maxlen) {
2003 *start_offset += pat->ctx.data.maxlen;
Miquel Raynal8878b122017-11-09 14:16:45 +01002004 return true;
2005 }
2006 break;
2007
2008 default:
2009 break;
2010 }
2011
2012 return false;
2013}
2014
2015/**
2016 * nand_op_parser_match_pat - Checks if a pattern matches the instructions
2017 * remaining in the parser context
2018 * @pat: the pattern to test
2019 * @ctx: the parser context structure to match with the pattern @pat
2020 *
2021 * Check if @pat matches the set or a sub-set of instructions remaining in @ctx.
2022 * Returns true if this is the case, false ortherwise. When true is returned,
2023 * @ctx->subop is updated with the set of instructions to be passed to the
2024 * controller driver.
2025 */
2026static bool
2027nand_op_parser_match_pat(const struct nand_op_parser_pattern *pat,
2028 struct nand_op_parser_ctx *ctx)
2029{
2030 unsigned int instr_offset = ctx->subop.first_instr_start_off;
2031 const struct nand_op_instr *end = ctx->instrs + ctx->ninstrs;
2032 const struct nand_op_instr *instr = ctx->subop.instrs;
2033 unsigned int i, ninstrs;
2034
2035 for (i = 0, ninstrs = 0; i < pat->nelems && instr < end; i++) {
2036 /*
2037 * The pattern instruction does not match the operation
2038 * instruction. If the instruction is marked optional in the
2039 * pattern definition, we skip the pattern element and continue
2040 * to the next one. If the element is mandatory, there's no
2041 * match and we can return false directly.
2042 */
2043 if (instr->type != pat->elems[i].type) {
2044 if (!pat->elems[i].optional)
2045 return false;
2046
2047 continue;
2048 }
2049
2050 /*
2051 * Now check the pattern element constraints. If the pattern is
2052 * not able to handle the whole instruction in a single step,
2053 * we have to split it.
2054 * The last_instr_end_off value comes back updated to point to
2055 * the position where we have to split the instruction (the
2056 * start of the next subop chunk).
2057 */
2058 if (nand_op_parser_must_split_instr(&pat->elems[i], instr,
2059 &instr_offset)) {
2060 ninstrs++;
2061 i++;
2062 break;
2063 }
2064
2065 instr++;
2066 ninstrs++;
2067 instr_offset = 0;
2068 }
2069
2070 /*
2071 * This can happen if all instructions of a pattern are optional.
2072 * Still, if there's not at least one instruction handled by this
2073 * pattern, this is not a match, and we should try the next one (if
2074 * any).
2075 */
2076 if (!ninstrs)
2077 return false;
2078
2079 /*
2080 * We had a match on the pattern head, but the pattern may be longer
2081 * than the instructions we're asked to execute. We need to make sure
2082 * there's no mandatory elements in the pattern tail.
2083 */
2084 for (; i < pat->nelems; i++) {
2085 if (!pat->elems[i].optional)
2086 return false;
2087 }
2088
2089 /*
2090 * We have a match: update the subop structure accordingly and return
2091 * true.
2092 */
2093 ctx->subop.ninstrs = ninstrs;
2094 ctx->subop.last_instr_end_off = instr_offset;
2095
2096 return true;
2097}
2098
2099#if IS_ENABLED(CONFIG_DYNAMIC_DEBUG) || defined(DEBUG)
2100static void nand_op_parser_trace(const struct nand_op_parser_ctx *ctx)
2101{
2102 const struct nand_op_instr *instr;
2103 char *prefix = " ";
2104 unsigned int i;
2105
2106 pr_debug("executing subop:\n");
2107
2108 for (i = 0; i < ctx->ninstrs; i++) {
2109 instr = &ctx->instrs[i];
2110
2111 if (instr == &ctx->subop.instrs[0])
2112 prefix = " ->";
2113
2114 switch (instr->type) {
2115 case NAND_OP_CMD_INSTR:
2116 pr_debug("%sCMD [0x%02x]\n", prefix,
2117 instr->ctx.cmd.opcode);
2118 break;
2119 case NAND_OP_ADDR_INSTR:
2120 pr_debug("%sADDR [%d cyc: %*ph]\n", prefix,
2121 instr->ctx.addr.naddrs,
2122 instr->ctx.addr.naddrs < 64 ?
2123 instr->ctx.addr.naddrs : 64,
2124 instr->ctx.addr.addrs);
2125 break;
2126 case NAND_OP_DATA_IN_INSTR:
2127 pr_debug("%sDATA_IN [%d B%s]\n", prefix,
2128 instr->ctx.data.len,
2129 instr->ctx.data.force_8bit ?
2130 ", force 8-bit" : "");
2131 break;
2132 case NAND_OP_DATA_OUT_INSTR:
2133 pr_debug("%sDATA_OUT [%d B%s]\n", prefix,
2134 instr->ctx.data.len,
2135 instr->ctx.data.force_8bit ?
2136 ", force 8-bit" : "");
2137 break;
2138 case NAND_OP_WAITRDY_INSTR:
2139 pr_debug("%sWAITRDY [max %d ms]\n", prefix,
2140 instr->ctx.waitrdy.timeout_ms);
2141 break;
2142 }
2143
2144 if (instr == &ctx->subop.instrs[ctx->subop.ninstrs - 1])
2145 prefix = " ";
2146 }
2147}
2148#else
2149static void nand_op_parser_trace(const struct nand_op_parser_ctx *ctx)
2150{
2151 /* NOP */
2152}
2153#endif
2154
2155/**
2156 * nand_op_parser_exec_op - exec_op parser
2157 * @chip: the NAND chip
2158 * @parser: patterns description provided by the controller driver
2159 * @op: the NAND operation to address
2160 * @check_only: when true, the function only checks if @op can be handled but
2161 * does not execute the operation
2162 *
2163 * Helper function designed to ease integration of NAND controller drivers that
2164 * only support a limited set of instruction sequences. The supported sequences
2165 * are described in @parser, and the framework takes care of splitting @op into
2166 * multiple sub-operations (if required) and pass them back to the ->exec()
2167 * callback of the matching pattern if @check_only is set to false.
2168 *
2169 * NAND controller drivers should call this function from their own ->exec_op()
2170 * implementation.
2171 *
2172 * Returns 0 on success, a negative error code otherwise. A failure can be
2173 * caused by an unsupported operation (none of the supported patterns is able
2174 * to handle the requested operation), or an error returned by one of the
2175 * matching pattern->exec() hook.
2176 */
2177int nand_op_parser_exec_op(struct nand_chip *chip,
2178 const struct nand_op_parser *parser,
2179 const struct nand_operation *op, bool check_only)
2180{
2181 struct nand_op_parser_ctx ctx = {
2182 .subop.instrs = op->instrs,
2183 .instrs = op->instrs,
2184 .ninstrs = op->ninstrs,
2185 };
2186 unsigned int i;
2187
2188 while (ctx.subop.instrs < op->instrs + op->ninstrs) {
2189 int ret;
2190
2191 for (i = 0; i < parser->npatterns; i++) {
2192 const struct nand_op_parser_pattern *pattern;
2193
2194 pattern = &parser->patterns[i];
2195 if (!nand_op_parser_match_pat(pattern, &ctx))
2196 continue;
2197
2198 nand_op_parser_trace(&ctx);
2199
2200 if (check_only)
2201 break;
2202
2203 ret = pattern->exec(chip, &ctx.subop);
2204 if (ret)
2205 return ret;
2206
2207 break;
2208 }
2209
2210 if (i == parser->npatterns) {
2211 pr_debug("->exec_op() parser: pattern not found!\n");
2212 return -ENOTSUPP;
2213 }
2214
2215 /*
2216 * Update the context structure by pointing to the start of the
2217 * next subop.
2218 */
2219 ctx.subop.instrs = ctx.subop.instrs + ctx.subop.ninstrs;
2220 if (ctx.subop.last_instr_end_off)
2221 ctx.subop.instrs -= 1;
2222
2223 ctx.subop.first_instr_start_off = ctx.subop.last_instr_end_off;
2224 }
2225
2226 return 0;
2227}
2228EXPORT_SYMBOL_GPL(nand_op_parser_exec_op);
2229
2230static bool nand_instr_is_data(const struct nand_op_instr *instr)
2231{
2232 return instr && (instr->type == NAND_OP_DATA_IN_INSTR ||
2233 instr->type == NAND_OP_DATA_OUT_INSTR);
2234}
2235
2236static bool nand_subop_instr_is_valid(const struct nand_subop *subop,
2237 unsigned int instr_idx)
2238{
2239 return subop && instr_idx < subop->ninstrs;
2240}
2241
Miquel Raynal760c4352018-07-19 00:09:12 +02002242static unsigned int nand_subop_get_start_off(const struct nand_subop *subop,
2243 unsigned int instr_idx)
Miquel Raynal8878b122017-11-09 14:16:45 +01002244{
2245 if (instr_idx)
2246 return 0;
2247
2248 return subop->first_instr_start_off;
2249}
2250
2251/**
2252 * nand_subop_get_addr_start_off - Get the start offset in an address array
2253 * @subop: The entire sub-operation
2254 * @instr_idx: Index of the instruction inside the sub-operation
2255 *
2256 * During driver development, one could be tempted to directly use the
2257 * ->addr.addrs field of address instructions. This is wrong as address
2258 * instructions might be split.
2259 *
2260 * Given an address instruction, returns the offset of the first cycle to issue.
2261 */
Miquel Raynal760c4352018-07-19 00:09:12 +02002262unsigned int nand_subop_get_addr_start_off(const struct nand_subop *subop,
2263 unsigned int instr_idx)
Miquel Raynal8878b122017-11-09 14:16:45 +01002264{
Miquel Raynal760c4352018-07-19 00:09:12 +02002265 if (WARN_ON(!nand_subop_instr_is_valid(subop, instr_idx) ||
2266 subop->instrs[instr_idx].type != NAND_OP_ADDR_INSTR))
2267 return 0;
Miquel Raynal8878b122017-11-09 14:16:45 +01002268
2269 return nand_subop_get_start_off(subop, instr_idx);
2270}
2271EXPORT_SYMBOL_GPL(nand_subop_get_addr_start_off);
2272
2273/**
2274 * nand_subop_get_num_addr_cyc - Get the remaining address cycles to assert
2275 * @subop: The entire sub-operation
2276 * @instr_idx: Index of the instruction inside the sub-operation
2277 *
2278 * During driver development, one could be tempted to directly use the
2279 * ->addr->naddrs field of a data instruction. This is wrong as instructions
2280 * might be split.
2281 *
2282 * Given an address instruction, returns the number of address cycle to issue.
2283 */
Miquel Raynal760c4352018-07-19 00:09:12 +02002284unsigned int nand_subop_get_num_addr_cyc(const struct nand_subop *subop,
2285 unsigned int instr_idx)
Miquel Raynal8878b122017-11-09 14:16:45 +01002286{
2287 int start_off, end_off;
2288
Miquel Raynal760c4352018-07-19 00:09:12 +02002289 if (WARN_ON(!nand_subop_instr_is_valid(subop, instr_idx) ||
2290 subop->instrs[instr_idx].type != NAND_OP_ADDR_INSTR))
2291 return 0;
Miquel Raynal8878b122017-11-09 14:16:45 +01002292
2293 start_off = nand_subop_get_addr_start_off(subop, instr_idx);
2294
2295 if (instr_idx == subop->ninstrs - 1 &&
2296 subop->last_instr_end_off)
2297 end_off = subop->last_instr_end_off;
2298 else
2299 end_off = subop->instrs[instr_idx].ctx.addr.naddrs;
2300
2301 return end_off - start_off;
2302}
2303EXPORT_SYMBOL_GPL(nand_subop_get_num_addr_cyc);
2304
2305/**
2306 * nand_subop_get_data_start_off - Get the start offset in a data array
2307 * @subop: The entire sub-operation
2308 * @instr_idx: Index of the instruction inside the sub-operation
2309 *
2310 * During driver development, one could be tempted to directly use the
2311 * ->data->buf.{in,out} field of data instructions. This is wrong as data
2312 * instructions might be split.
2313 *
2314 * Given a data instruction, returns the offset to start from.
2315 */
Miquel Raynal760c4352018-07-19 00:09:12 +02002316unsigned int nand_subop_get_data_start_off(const struct nand_subop *subop,
2317 unsigned int instr_idx)
Miquel Raynal8878b122017-11-09 14:16:45 +01002318{
Miquel Raynal760c4352018-07-19 00:09:12 +02002319 if (WARN_ON(!nand_subop_instr_is_valid(subop, instr_idx) ||
2320 !nand_instr_is_data(&subop->instrs[instr_idx])))
2321 return 0;
Miquel Raynal8878b122017-11-09 14:16:45 +01002322
2323 return nand_subop_get_start_off(subop, instr_idx);
2324}
2325EXPORT_SYMBOL_GPL(nand_subop_get_data_start_off);
2326
2327/**
2328 * nand_subop_get_data_len - Get the number of bytes to retrieve
2329 * @subop: The entire sub-operation
2330 * @instr_idx: Index of the instruction inside the sub-operation
2331 *
2332 * During driver development, one could be tempted to directly use the
2333 * ->data->len field of a data instruction. This is wrong as data instructions
2334 * might be split.
2335 *
2336 * Returns the length of the chunk of data to send/receive.
2337 */
Miquel Raynal760c4352018-07-19 00:09:12 +02002338unsigned int nand_subop_get_data_len(const struct nand_subop *subop,
2339 unsigned int instr_idx)
Miquel Raynal8878b122017-11-09 14:16:45 +01002340{
2341 int start_off = 0, end_off;
2342
Miquel Raynal760c4352018-07-19 00:09:12 +02002343 if (WARN_ON(!nand_subop_instr_is_valid(subop, instr_idx) ||
2344 !nand_instr_is_data(&subop->instrs[instr_idx])))
2345 return 0;
Miquel Raynal8878b122017-11-09 14:16:45 +01002346
2347 start_off = nand_subop_get_data_start_off(subop, instr_idx);
2348
2349 if (instr_idx == subop->ninstrs - 1 &&
2350 subop->last_instr_end_off)
2351 end_off = subop->last_instr_end_off;
2352 else
2353 end_off = subop->instrs[instr_idx].ctx.data.len;
2354
2355 return end_off - start_off;
2356}
2357EXPORT_SYMBOL_GPL(nand_subop_get_data_len);
2358
Linus Torvalds1da177e2005-04-16 15:20:36 -07002359/**
Sascha Hauer2f94abf2016-09-15 10:32:45 +02002360 * nand_reset - Reset and initialize a NAND device
2361 * @chip: The NAND chip
Boris Brezillon73f907f2016-10-24 16:46:20 +02002362 * @chipnr: Internal die id
Sascha Hauer2f94abf2016-09-15 10:32:45 +02002363 *
Miquel Raynal17fa8042017-11-30 18:01:31 +01002364 * Save the timings data structure, then apply SDR timings mode 0 (see
2365 * nand_reset_data_interface for details), do the reset operation, and
2366 * apply back the previous timings.
2367 *
2368 * Returns 0 on success, a negative error code otherwise.
Sascha Hauer2f94abf2016-09-15 10:32:45 +02002369 */
Boris Brezillon73f907f2016-10-24 16:46:20 +02002370int nand_reset(struct nand_chip *chip, int chipnr)
Sascha Hauer2f94abf2016-09-15 10:32:45 +02002371{
Miquel Raynal17fa8042017-11-30 18:01:31 +01002372 struct nand_data_interface saved_data_intf = chip->data_interface;
Boris Brezillond8e725d2016-09-15 10:32:50 +02002373 int ret;
2374
Boris Brezillon104e4422017-03-16 09:35:58 +01002375 ret = nand_reset_data_interface(chip, chipnr);
Boris Brezillond8e725d2016-09-15 10:32:50 +02002376 if (ret)
2377 return ret;
Sascha Hauer2f94abf2016-09-15 10:32:45 +02002378
Boris Brezillon73f907f2016-10-24 16:46:20 +02002379 /*
2380 * The CS line has to be released before we can apply the new NAND
Boris Brezillon1d017852018-11-11 08:55:14 +01002381 * interface settings, hence this weird nand_select_target()
2382 * nand_deselect_target() dance.
Boris Brezillon73f907f2016-10-24 16:46:20 +02002383 */
Boris Brezillon1d017852018-11-11 08:55:14 +01002384 nand_select_target(chip, chipnr);
Boris Brezillon97d90da2017-11-30 18:01:29 +01002385 ret = nand_reset_op(chip);
Boris Brezillon1d017852018-11-11 08:55:14 +01002386 nand_deselect_target(chip);
Boris Brezillon97d90da2017-11-30 18:01:29 +01002387 if (ret)
2388 return ret;
Sascha Hauer2f94abf2016-09-15 10:32:45 +02002389
Miquel Raynal107b7d62018-03-19 14:47:25 +01002390 /*
2391 * A nand_reset_data_interface() put both the NAND chip and the NAND
2392 * controller in timings mode 0. If the default mode for this chip is
2393 * also 0, no need to proceed to the change again. Plus, at probe time,
2394 * nand_setup_data_interface() uses ->set/get_features() which would
2395 * fail anyway as the parameter page is not available yet.
2396 */
2397 if (!chip->onfi_timing_mode_default)
2398 return 0;
2399
Miquel Raynal17fa8042017-11-30 18:01:31 +01002400 chip->data_interface = saved_data_intf;
Boris Brezillon104e4422017-03-16 09:35:58 +01002401 ret = nand_setup_data_interface(chip, chipnr);
Boris Brezillond8e725d2016-09-15 10:32:50 +02002402 if (ret)
2403 return ret;
2404
Sascha Hauer2f94abf2016-09-15 10:32:45 +02002405 return 0;
2406}
Boris Brezillonb9bb9842017-10-05 18:53:19 +02002407EXPORT_SYMBOL_GPL(nand_reset);
Sascha Hauer2f94abf2016-09-15 10:32:45 +02002408
2409/**
Boris Brezillon45240362018-09-07 00:38:40 +02002410 * nand_get_features - wrapper to perform a GET_FEATURE
2411 * @chip: NAND chip info structure
2412 * @addr: feature address
2413 * @subfeature_param: the subfeature parameters, a four bytes array
2414 *
2415 * Returns 0 for success, a negative error otherwise. Returns -ENOTSUPP if the
2416 * operation cannot be handled.
2417 */
2418int nand_get_features(struct nand_chip *chip, int addr,
2419 u8 *subfeature_param)
2420{
2421 if (!nand_supports_get_features(chip, addr))
2422 return -ENOTSUPP;
2423
2424 if (chip->legacy.get_features)
2425 return chip->legacy.get_features(chip, addr, subfeature_param);
2426
2427 return nand_get_features_op(chip, addr, subfeature_param);
2428}
Boris Brezillon45240362018-09-07 00:38:40 +02002429
2430/**
2431 * nand_set_features - wrapper to perform a SET_FEATURE
2432 * @chip: NAND chip info structure
2433 * @addr: feature address
2434 * @subfeature_param: the subfeature parameters, a four bytes array
2435 *
2436 * Returns 0 for success, a negative error otherwise. Returns -ENOTSUPP if the
2437 * operation cannot be handled.
2438 */
2439int nand_set_features(struct nand_chip *chip, int addr,
2440 u8 *subfeature_param)
2441{
2442 if (!nand_supports_set_features(chip, addr))
2443 return -ENOTSUPP;
2444
2445 if (chip->legacy.set_features)
2446 return chip->legacy.set_features(chip, addr, subfeature_param);
2447
2448 return nand_set_features_op(chip, addr, subfeature_param);
2449}
Boris Brezillon45240362018-09-07 00:38:40 +02002450
2451/**
Boris BREZILLON730a43f2015-09-03 18:03:38 +02002452 * nand_check_erased_buf - check if a buffer contains (almost) only 0xff data
2453 * @buf: buffer to test
2454 * @len: buffer length
2455 * @bitflips_threshold: maximum number of bitflips
2456 *
2457 * Check if a buffer contains only 0xff, which means the underlying region
2458 * has been erased and is ready to be programmed.
2459 * The bitflips_threshold specify the maximum number of bitflips before
2460 * considering the region is not erased.
2461 * Note: The logic of this function has been extracted from the memweight
2462 * implementation, except that nand_check_erased_buf function exit before
2463 * testing the whole buffer if the number of bitflips exceed the
2464 * bitflips_threshold value.
2465 *
2466 * Returns a positive number of bitflips less than or equal to
2467 * bitflips_threshold, or -ERROR_CODE for bitflips in excess of the
2468 * threshold.
2469 */
2470static int nand_check_erased_buf(void *buf, int len, int bitflips_threshold)
2471{
2472 const unsigned char *bitmap = buf;
2473 int bitflips = 0;
2474 int weight;
2475
2476 for (; len && ((uintptr_t)bitmap) % sizeof(long);
2477 len--, bitmap++) {
2478 weight = hweight8(*bitmap);
2479 bitflips += BITS_PER_BYTE - weight;
2480 if (unlikely(bitflips > bitflips_threshold))
2481 return -EBADMSG;
2482 }
2483
2484 for (; len >= sizeof(long);
2485 len -= sizeof(long), bitmap += sizeof(long)) {
Pavel Machek086567f2017-04-21 12:51:07 +02002486 unsigned long d = *((unsigned long *)bitmap);
2487 if (d == ~0UL)
2488 continue;
2489 weight = hweight_long(d);
Boris BREZILLON730a43f2015-09-03 18:03:38 +02002490 bitflips += BITS_PER_LONG - weight;
2491 if (unlikely(bitflips > bitflips_threshold))
2492 return -EBADMSG;
2493 }
2494
2495 for (; len > 0; len--, bitmap++) {
2496 weight = hweight8(*bitmap);
2497 bitflips += BITS_PER_BYTE - weight;
2498 if (unlikely(bitflips > bitflips_threshold))
2499 return -EBADMSG;
2500 }
2501
2502 return bitflips;
2503}
2504
2505/**
2506 * nand_check_erased_ecc_chunk - check if an ECC chunk contains (almost) only
2507 * 0xff data
2508 * @data: data buffer to test
2509 * @datalen: data length
2510 * @ecc: ECC buffer
2511 * @ecclen: ECC length
2512 * @extraoob: extra OOB buffer
2513 * @extraooblen: extra OOB length
2514 * @bitflips_threshold: maximum number of bitflips
2515 *
2516 * Check if a data buffer and its associated ECC and OOB data contains only
2517 * 0xff pattern, which means the underlying region has been erased and is
2518 * ready to be programmed.
2519 * The bitflips_threshold specify the maximum number of bitflips before
2520 * considering the region as not erased.
2521 *
2522 * Note:
2523 * 1/ ECC algorithms are working on pre-defined block sizes which are usually
2524 * different from the NAND page size. When fixing bitflips, ECC engines will
2525 * report the number of errors per chunk, and the NAND core infrastructure
2526 * expect you to return the maximum number of bitflips for the whole page.
2527 * This is why you should always use this function on a single chunk and
2528 * not on the whole page. After checking each chunk you should update your
2529 * max_bitflips value accordingly.
2530 * 2/ When checking for bitflips in erased pages you should not only check
2531 * the payload data but also their associated ECC data, because a user might
2532 * have programmed almost all bits to 1 but a few. In this case, we
2533 * shouldn't consider the chunk as erased, and checking ECC bytes prevent
2534 * this case.
2535 * 3/ The extraoob argument is optional, and should be used if some of your OOB
2536 * data are protected by the ECC engine.
2537 * It could also be used if you support subpages and want to attach some
2538 * extra OOB data to an ECC chunk.
2539 *
2540 * Returns a positive number of bitflips less than or equal to
2541 * bitflips_threshold, or -ERROR_CODE for bitflips in excess of the
2542 * threshold. In case of success, the passed buffers are filled with 0xff.
2543 */
2544int nand_check_erased_ecc_chunk(void *data, int datalen,
2545 void *ecc, int ecclen,
2546 void *extraoob, int extraooblen,
2547 int bitflips_threshold)
2548{
2549 int data_bitflips = 0, ecc_bitflips = 0, extraoob_bitflips = 0;
2550
2551 data_bitflips = nand_check_erased_buf(data, datalen,
2552 bitflips_threshold);
2553 if (data_bitflips < 0)
2554 return data_bitflips;
2555
2556 bitflips_threshold -= data_bitflips;
2557
2558 ecc_bitflips = nand_check_erased_buf(ecc, ecclen, bitflips_threshold);
2559 if (ecc_bitflips < 0)
2560 return ecc_bitflips;
2561
2562 bitflips_threshold -= ecc_bitflips;
2563
2564 extraoob_bitflips = nand_check_erased_buf(extraoob, extraooblen,
2565 bitflips_threshold);
2566 if (extraoob_bitflips < 0)
2567 return extraoob_bitflips;
2568
2569 if (data_bitflips)
2570 memset(data, 0xff, datalen);
2571
2572 if (ecc_bitflips)
2573 memset(ecc, 0xff, ecclen);
2574
2575 if (extraoob_bitflips)
2576 memset(extraoob, 0xff, extraooblen);
2577
2578 return data_bitflips + ecc_bitflips + extraoob_bitflips;
2579}
2580EXPORT_SYMBOL(nand_check_erased_ecc_chunk);
2581
2582/**
Boris Brezillon0d6030a2018-07-18 10:42:17 +02002583 * nand_read_page_raw_notsupp - dummy read raw page function
Boris Brezillon0d6030a2018-07-18 10:42:17 +02002584 * @chip: nand chip info structure
2585 * @buf: buffer to store read data
2586 * @oob_required: caller requires OOB data read to chip->oob_poi
2587 * @page: page number to read
2588 *
2589 * Returns -ENOTSUPP unconditionally.
2590 */
Boris Brezillonb9761682018-09-06 14:05:20 +02002591int nand_read_page_raw_notsupp(struct nand_chip *chip, u8 *buf,
2592 int oob_required, int page)
Boris Brezillon0d6030a2018-07-18 10:42:17 +02002593{
2594 return -ENOTSUPP;
2595}
Boris Brezillon0d6030a2018-07-18 10:42:17 +02002596
2597/**
Brian Norris7854d3f2011-06-23 14:12:08 -07002598 * nand_read_page_raw - [INTERN] read raw page data without ecc
Brian Norris8b6e50c2011-05-25 14:59:01 -07002599 * @chip: nand chip info structure
2600 * @buf: buffer to store read data
Brian Norris1fbb9382012-05-02 10:14:55 -07002601 * @oob_required: caller requires OOB data read to chip->oob_poi
Brian Norris8b6e50c2011-05-25 14:59:01 -07002602 * @page: page number to read
David Brownell52ff49d2009-03-04 12:01:36 -08002603 *
Brian Norris7854d3f2011-06-23 14:12:08 -07002604 * Not for syndrome calculating ECC controllers, which use a special oob layout.
Thomas Gleixner8593fbc2006-05-29 03:26:58 +02002605 */
Boris Brezillonb9761682018-09-06 14:05:20 +02002606int nand_read_page_raw(struct nand_chip *chip, uint8_t *buf, int oob_required,
2607 int page)
Thomas Gleixner8593fbc2006-05-29 03:26:58 +02002608{
Boris Brezillonb9761682018-09-06 14:05:20 +02002609 struct mtd_info *mtd = nand_to_mtd(chip);
Boris Brezillon97d90da2017-11-30 18:01:29 +01002610 int ret;
2611
Boris Brezillon25f815f2017-11-30 18:01:30 +01002612 ret = nand_read_page_op(chip, page, 0, buf, mtd->writesize);
Boris Brezillon97d90da2017-11-30 18:01:29 +01002613 if (ret)
2614 return ret;
2615
2616 if (oob_required) {
2617 ret = nand_read_data_op(chip, chip->oob_poi, mtd->oobsize,
2618 false);
2619 if (ret)
2620 return ret;
2621 }
2622
Thomas Gleixner8593fbc2006-05-29 03:26:58 +02002623 return 0;
2624}
Thomas Petazzonicc0f51e2017-04-29 11:06:44 +02002625EXPORT_SYMBOL(nand_read_page_raw);
Thomas Gleixner8593fbc2006-05-29 03:26:58 +02002626
2627/**
Brian Norris7854d3f2011-06-23 14:12:08 -07002628 * nand_read_page_raw_syndrome - [INTERN] read raw page data without ecc
Brian Norris8b6e50c2011-05-25 14:59:01 -07002629 * @chip: nand chip info structure
2630 * @buf: buffer to store read data
Brian Norris1fbb9382012-05-02 10:14:55 -07002631 * @oob_required: caller requires OOB data read to chip->oob_poi
Brian Norris8b6e50c2011-05-25 14:59:01 -07002632 * @page: page number to read
David Brownell52ff49d2009-03-04 12:01:36 -08002633 *
2634 * We need a special oob layout and handling even when OOB isn't used.
2635 */
Boris Brezillonb9761682018-09-06 14:05:20 +02002636static int nand_read_page_raw_syndrome(struct nand_chip *chip, uint8_t *buf,
Brian Norris1fbb9382012-05-02 10:14:55 -07002637 int oob_required, int page)
David Brownell52ff49d2009-03-04 12:01:36 -08002638{
Boris Brezillonb9761682018-09-06 14:05:20 +02002639 struct mtd_info *mtd = nand_to_mtd(chip);
David Brownell52ff49d2009-03-04 12:01:36 -08002640 int eccsize = chip->ecc.size;
2641 int eccbytes = chip->ecc.bytes;
2642 uint8_t *oob = chip->oob_poi;
Boris Brezillon97d90da2017-11-30 18:01:29 +01002643 int steps, size, ret;
David Brownell52ff49d2009-03-04 12:01:36 -08002644
Boris Brezillon25f815f2017-11-30 18:01:30 +01002645 ret = nand_read_page_op(chip, page, 0, NULL, 0);
2646 if (ret)
2647 return ret;
David Brownell52ff49d2009-03-04 12:01:36 -08002648
2649 for (steps = chip->ecc.steps; steps > 0; steps--) {
Boris Brezillon97d90da2017-11-30 18:01:29 +01002650 ret = nand_read_data_op(chip, buf, eccsize, false);
2651 if (ret)
2652 return ret;
2653
David Brownell52ff49d2009-03-04 12:01:36 -08002654 buf += eccsize;
2655
2656 if (chip->ecc.prepad) {
Boris Brezillon97d90da2017-11-30 18:01:29 +01002657 ret = nand_read_data_op(chip, oob, chip->ecc.prepad,
2658 false);
2659 if (ret)
2660 return ret;
2661
David Brownell52ff49d2009-03-04 12:01:36 -08002662 oob += chip->ecc.prepad;
2663 }
2664
Boris Brezillon97d90da2017-11-30 18:01:29 +01002665 ret = nand_read_data_op(chip, oob, eccbytes, false);
2666 if (ret)
2667 return ret;
2668
David Brownell52ff49d2009-03-04 12:01:36 -08002669 oob += eccbytes;
2670
2671 if (chip->ecc.postpad) {
Boris Brezillon97d90da2017-11-30 18:01:29 +01002672 ret = nand_read_data_op(chip, oob, chip->ecc.postpad,
2673 false);
2674 if (ret)
2675 return ret;
2676
David Brownell52ff49d2009-03-04 12:01:36 -08002677 oob += chip->ecc.postpad;
2678 }
2679 }
2680
2681 size = mtd->oobsize - (oob - chip->oob_poi);
Boris Brezillon97d90da2017-11-30 18:01:29 +01002682 if (size) {
2683 ret = nand_read_data_op(chip, oob, size, false);
2684 if (ret)
2685 return ret;
2686 }
David Brownell52ff49d2009-03-04 12:01:36 -08002687
2688 return 0;
2689}
2690
2691/**
Brian Norris7854d3f2011-06-23 14:12:08 -07002692 * nand_read_page_swecc - [REPLACEABLE] software ECC based page read function
Brian Norris8b6e50c2011-05-25 14:59:01 -07002693 * @chip: nand chip info structure
2694 * @buf: buffer to store read data
Brian Norris1fbb9382012-05-02 10:14:55 -07002695 * @oob_required: caller requires OOB data read to chip->oob_poi
Brian Norris8b6e50c2011-05-25 14:59:01 -07002696 * @page: page number to read
David A. Marlin068e3c02005-01-24 03:07:46 +00002697 */
Boris Brezillonb9761682018-09-06 14:05:20 +02002698static int nand_read_page_swecc(struct nand_chip *chip, uint8_t *buf,
2699 int oob_required, int page)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002700{
Boris Brezillonb9761682018-09-06 14:05:20 +02002701 struct mtd_info *mtd = nand_to_mtd(chip);
Boris Brezillon846031d2016-02-03 20:11:00 +01002702 int i, eccsize = chip->ecc.size, ret;
Thomas Gleixnerf5bbdac2006-05-25 10:07:16 +02002703 int eccbytes = chip->ecc.bytes;
2704 int eccsteps = chip->ecc.steps;
2705 uint8_t *p = buf;
Masahiro Yamadac0313b92017-12-05 17:47:16 +09002706 uint8_t *ecc_calc = chip->ecc.calc_buf;
2707 uint8_t *ecc_code = chip->ecc.code_buf;
Mike Dunn3f91e942012-04-25 12:06:09 -07002708 unsigned int max_bitflips = 0;
Thomas Gleixnerf5bbdac2006-05-25 10:07:16 +02002709
Boris Brezillonb9761682018-09-06 14:05:20 +02002710 chip->ecc.read_page_raw(chip, buf, 1, page);
Thomas Gleixnerf5bbdac2006-05-25 10:07:16 +02002711
2712 for (i = 0; eccsteps; eccsteps--, i += eccbytes, p += eccsize)
Boris Brezillonaf37d2c2018-09-06 14:05:18 +02002713 chip->ecc.calculate(chip, p, &ecc_calc[i]);
Thomas Gleixnerf5bbdac2006-05-25 10:07:16 +02002714
Boris Brezillon846031d2016-02-03 20:11:00 +01002715 ret = mtd_ooblayout_get_eccbytes(mtd, ecc_code, chip->oob_poi, 0,
2716 chip->ecc.total);
2717 if (ret)
2718 return ret;
Thomas Gleixnerf5bbdac2006-05-25 10:07:16 +02002719
2720 eccsteps = chip->ecc.steps;
2721 p = buf;
2722
2723 for (i = 0 ; eccsteps; eccsteps--, i += eccbytes, p += eccsize) {
2724 int stat;
2725
Boris Brezillon00da2ea2018-09-06 14:05:19 +02002726 stat = chip->ecc.correct(chip, p, &ecc_code[i], &ecc_calc[i]);
Mike Dunn3f91e942012-04-25 12:06:09 -07002727 if (stat < 0) {
Thomas Gleixnerf5bbdac2006-05-25 10:07:16 +02002728 mtd->ecc_stats.failed++;
Mike Dunn3f91e942012-04-25 12:06:09 -07002729 } else {
Thomas Gleixnerf5bbdac2006-05-25 10:07:16 +02002730 mtd->ecc_stats.corrected += stat;
Mike Dunn3f91e942012-04-25 12:06:09 -07002731 max_bitflips = max_t(unsigned int, max_bitflips, stat);
2732 }
Thomas Gleixnerf5bbdac2006-05-25 10:07:16 +02002733 }
Mike Dunn3f91e942012-04-25 12:06:09 -07002734 return max_bitflips;
Thomas Gleixner22c60f52005-04-04 19:56:32 +01002735}
Linus Torvalds1da177e2005-04-16 15:20:36 -07002736
Linus Torvalds1da177e2005-04-16 15:20:36 -07002737/**
Gupta, Pekon837a6ba2013-03-15 17:55:53 +05302738 * nand_read_subpage - [REPLACEABLE] ECC based sub-page read function
Brian Norris8b6e50c2011-05-25 14:59:01 -07002739 * @chip: nand chip info structure
2740 * @data_offs: offset of requested data within the page
2741 * @readlen: data length
2742 * @bufpoi: buffer to store read data
Huang Shijiee004deb2014-01-03 11:01:40 +08002743 * @page: page number to read
Alexey Korolev3d459552008-05-15 17:23:18 +01002744 */
Boris Brezillonb9761682018-09-06 14:05:20 +02002745static int nand_read_subpage(struct nand_chip *chip, uint32_t data_offs,
2746 uint32_t readlen, uint8_t *bufpoi, int page)
Alexey Korolev3d459552008-05-15 17:23:18 +01002747{
Boris Brezillonb9761682018-09-06 14:05:20 +02002748 struct mtd_info *mtd = nand_to_mtd(chip);
Boris Brezillon846031d2016-02-03 20:11:00 +01002749 int start_step, end_step, num_steps, ret;
Alexey Korolev3d459552008-05-15 17:23:18 +01002750 uint8_t *p;
2751 int data_col_addr, i, gaps = 0;
2752 int datafrag_len, eccfrag_len, aligned_len, aligned_pos;
2753 int busw = (chip->options & NAND_BUSWIDTH_16) ? 2 : 1;
Boris Brezillon846031d2016-02-03 20:11:00 +01002754 int index, section = 0;
Mike Dunn3f91e942012-04-25 12:06:09 -07002755 unsigned int max_bitflips = 0;
Boris Brezillon846031d2016-02-03 20:11:00 +01002756 struct mtd_oob_region oobregion = { };
Alexey Korolev3d459552008-05-15 17:23:18 +01002757
Brian Norris7854d3f2011-06-23 14:12:08 -07002758 /* Column address within the page aligned to ECC size (256bytes) */
Alexey Korolev3d459552008-05-15 17:23:18 +01002759 start_step = data_offs / chip->ecc.size;
2760 end_step = (data_offs + readlen - 1) / chip->ecc.size;
2761 num_steps = end_step - start_step + 1;
Ron4a4163ca2014-03-16 04:01:07 +10302762 index = start_step * chip->ecc.bytes;
Alexey Korolev3d459552008-05-15 17:23:18 +01002763
Brian Norris8b6e50c2011-05-25 14:59:01 -07002764 /* Data size aligned to ECC ecc.size */
Alexey Korolev3d459552008-05-15 17:23:18 +01002765 datafrag_len = num_steps * chip->ecc.size;
2766 eccfrag_len = num_steps * chip->ecc.bytes;
2767
2768 data_col_addr = start_step * chip->ecc.size;
2769 /* If we read not a page aligned data */
Alexey Korolev3d459552008-05-15 17:23:18 +01002770 p = bufpoi + data_col_addr;
Boris Brezillon25f815f2017-11-30 18:01:30 +01002771 ret = nand_read_page_op(chip, page, data_col_addr, p, datafrag_len);
Boris Brezillon97d90da2017-11-30 18:01:29 +01002772 if (ret)
2773 return ret;
Alexey Korolev3d459552008-05-15 17:23:18 +01002774
Brian Norris8b6e50c2011-05-25 14:59:01 -07002775 /* Calculate ECC */
Alexey Korolev3d459552008-05-15 17:23:18 +01002776 for (i = 0; i < eccfrag_len ; i += chip->ecc.bytes, p += chip->ecc.size)
Boris Brezillonaf37d2c2018-09-06 14:05:18 +02002777 chip->ecc.calculate(chip, p, &chip->ecc.calc_buf[i]);
Alexey Korolev3d459552008-05-15 17:23:18 +01002778
Brian Norris8b6e50c2011-05-25 14:59:01 -07002779 /*
2780 * The performance is faster if we position offsets according to
Brian Norris7854d3f2011-06-23 14:12:08 -07002781 * ecc.pos. Let's make sure that there are no gaps in ECC positions.
Brian Norris8b6e50c2011-05-25 14:59:01 -07002782 */
Boris Brezillon846031d2016-02-03 20:11:00 +01002783 ret = mtd_ooblayout_find_eccregion(mtd, index, &section, &oobregion);
2784 if (ret)
2785 return ret;
2786
2787 if (oobregion.length < eccfrag_len)
2788 gaps = 1;
2789
Alexey Korolev3d459552008-05-15 17:23:18 +01002790 if (gaps) {
Boris Brezillon97d90da2017-11-30 18:01:29 +01002791 ret = nand_change_read_column_op(chip, mtd->writesize,
2792 chip->oob_poi, mtd->oobsize,
2793 false);
2794 if (ret)
2795 return ret;
Alexey Korolev3d459552008-05-15 17:23:18 +01002796 } else {
Brian Norris8b6e50c2011-05-25 14:59:01 -07002797 /*
Brian Norris7854d3f2011-06-23 14:12:08 -07002798 * Send the command to read the particular ECC bytes take care
Brian Norris8b6e50c2011-05-25 14:59:01 -07002799 * about buswidth alignment in read_buf.
2800 */
Boris Brezillon846031d2016-02-03 20:11:00 +01002801 aligned_pos = oobregion.offset & ~(busw - 1);
Alexey Korolev3d459552008-05-15 17:23:18 +01002802 aligned_len = eccfrag_len;
Boris Brezillon846031d2016-02-03 20:11:00 +01002803 if (oobregion.offset & (busw - 1))
Alexey Korolev3d459552008-05-15 17:23:18 +01002804 aligned_len++;
Boris Brezillon846031d2016-02-03 20:11:00 +01002805 if ((oobregion.offset + (num_steps * chip->ecc.bytes)) &
2806 (busw - 1))
Alexey Korolev3d459552008-05-15 17:23:18 +01002807 aligned_len++;
2808
Boris Brezillon97d90da2017-11-30 18:01:29 +01002809 ret = nand_change_read_column_op(chip,
2810 mtd->writesize + aligned_pos,
2811 &chip->oob_poi[aligned_pos],
2812 aligned_len, false);
2813 if (ret)
2814 return ret;
Alexey Korolev3d459552008-05-15 17:23:18 +01002815 }
2816
Masahiro Yamadac0313b92017-12-05 17:47:16 +09002817 ret = mtd_ooblayout_get_eccbytes(mtd, chip->ecc.code_buf,
Boris Brezillon846031d2016-02-03 20:11:00 +01002818 chip->oob_poi, index, eccfrag_len);
2819 if (ret)
2820 return ret;
Alexey Korolev3d459552008-05-15 17:23:18 +01002821
2822 p = bufpoi + data_col_addr;
2823 for (i = 0; i < eccfrag_len ; i += chip->ecc.bytes, p += chip->ecc.size) {
2824 int stat;
2825
Boris Brezillon00da2ea2018-09-06 14:05:19 +02002826 stat = chip->ecc.correct(chip, p, &chip->ecc.code_buf[i],
Masahiro Yamadac0313b92017-12-05 17:47:16 +09002827 &chip->ecc.calc_buf[i]);
Boris BREZILLON40cbe6e2015-12-30 20:32:04 +01002828 if (stat == -EBADMSG &&
2829 (chip->ecc.options & NAND_ECC_GENERIC_ERASED_CHECK)) {
2830 /* check for empty pages with bitflips */
2831 stat = nand_check_erased_ecc_chunk(p, chip->ecc.size,
Masahiro Yamadac0313b92017-12-05 17:47:16 +09002832 &chip->ecc.code_buf[i],
Boris BREZILLON40cbe6e2015-12-30 20:32:04 +01002833 chip->ecc.bytes,
2834 NULL, 0,
2835 chip->ecc.strength);
2836 }
2837
Mike Dunn3f91e942012-04-25 12:06:09 -07002838 if (stat < 0) {
Alexey Korolev3d459552008-05-15 17:23:18 +01002839 mtd->ecc_stats.failed++;
Mike Dunn3f91e942012-04-25 12:06:09 -07002840 } else {
Alexey Korolev3d459552008-05-15 17:23:18 +01002841 mtd->ecc_stats.corrected += stat;
Mike Dunn3f91e942012-04-25 12:06:09 -07002842 max_bitflips = max_t(unsigned int, max_bitflips, stat);
2843 }
Alexey Korolev3d459552008-05-15 17:23:18 +01002844 }
Mike Dunn3f91e942012-04-25 12:06:09 -07002845 return max_bitflips;
Alexey Korolev3d459552008-05-15 17:23:18 +01002846}
2847
2848/**
Brian Norris7854d3f2011-06-23 14:12:08 -07002849 * nand_read_page_hwecc - [REPLACEABLE] hardware ECC based page read function
Brian Norris8b6e50c2011-05-25 14:59:01 -07002850 * @chip: nand chip info structure
2851 * @buf: buffer to store read data
Brian Norris1fbb9382012-05-02 10:14:55 -07002852 * @oob_required: caller requires OOB data read to chip->oob_poi
Brian Norris8b6e50c2011-05-25 14:59:01 -07002853 * @page: page number to read
Thomas Gleixnerf5bbdac2006-05-25 10:07:16 +02002854 *
Brian Norris7854d3f2011-06-23 14:12:08 -07002855 * Not for syndrome calculating ECC controllers which need a special oob layout.
Thomas Gleixnerf5bbdac2006-05-25 10:07:16 +02002856 */
Boris Brezillonb9761682018-09-06 14:05:20 +02002857static int nand_read_page_hwecc(struct nand_chip *chip, uint8_t *buf,
2858 int oob_required, int page)
Thomas Gleixnerf5bbdac2006-05-25 10:07:16 +02002859{
Boris Brezillonb9761682018-09-06 14:05:20 +02002860 struct mtd_info *mtd = nand_to_mtd(chip);
Boris Brezillon846031d2016-02-03 20:11:00 +01002861 int i, eccsize = chip->ecc.size, ret;
Thomas Gleixnerf5bbdac2006-05-25 10:07:16 +02002862 int eccbytes = chip->ecc.bytes;
2863 int eccsteps = chip->ecc.steps;
2864 uint8_t *p = buf;
Masahiro Yamadac0313b92017-12-05 17:47:16 +09002865 uint8_t *ecc_calc = chip->ecc.calc_buf;
2866 uint8_t *ecc_code = chip->ecc.code_buf;
Mike Dunn3f91e942012-04-25 12:06:09 -07002867 unsigned int max_bitflips = 0;
Thomas Gleixnerf5bbdac2006-05-25 10:07:16 +02002868
Boris Brezillon25f815f2017-11-30 18:01:30 +01002869 ret = nand_read_page_op(chip, page, 0, NULL, 0);
2870 if (ret)
2871 return ret;
2872
Thomas Gleixnerf5bbdac2006-05-25 10:07:16 +02002873 for (i = 0; eccsteps; eccsteps--, i += eccbytes, p += eccsize) {
Boris Brezillonec476362018-09-06 14:05:17 +02002874 chip->ecc.hwctl(chip, NAND_ECC_READ);
Boris Brezillon97d90da2017-11-30 18:01:29 +01002875
2876 ret = nand_read_data_op(chip, p, eccsize, false);
2877 if (ret)
2878 return ret;
2879
Boris Brezillonaf37d2c2018-09-06 14:05:18 +02002880 chip->ecc.calculate(chip, p, &ecc_calc[i]);
Thomas Gleixnerf5bbdac2006-05-25 10:07:16 +02002881 }
Boris Brezillon97d90da2017-11-30 18:01:29 +01002882
2883 ret = nand_read_data_op(chip, chip->oob_poi, mtd->oobsize, false);
2884 if (ret)
2885 return ret;
Thomas Gleixnerf5bbdac2006-05-25 10:07:16 +02002886
Boris Brezillon846031d2016-02-03 20:11:00 +01002887 ret = mtd_ooblayout_get_eccbytes(mtd, ecc_code, chip->oob_poi, 0,
2888 chip->ecc.total);
2889 if (ret)
2890 return ret;
Thomas Gleixnerf5bbdac2006-05-25 10:07:16 +02002891
2892 eccsteps = chip->ecc.steps;
2893 p = buf;
2894
2895 for (i = 0 ; eccsteps; eccsteps--, i += eccbytes, p += eccsize) {
2896 int stat;
2897
Boris Brezillon00da2ea2018-09-06 14:05:19 +02002898 stat = chip->ecc.correct(chip, p, &ecc_code[i], &ecc_calc[i]);
Boris BREZILLON40cbe6e2015-12-30 20:32:04 +01002899 if (stat == -EBADMSG &&
2900 (chip->ecc.options & NAND_ECC_GENERIC_ERASED_CHECK)) {
2901 /* check for empty pages with bitflips */
2902 stat = nand_check_erased_ecc_chunk(p, eccsize,
2903 &ecc_code[i], eccbytes,
2904 NULL, 0,
2905 chip->ecc.strength);
2906 }
2907
Mike Dunn3f91e942012-04-25 12:06:09 -07002908 if (stat < 0) {
Thomas Gleixnerf5bbdac2006-05-25 10:07:16 +02002909 mtd->ecc_stats.failed++;
Mike Dunn3f91e942012-04-25 12:06:09 -07002910 } else {
Thomas Gleixnerf5bbdac2006-05-25 10:07:16 +02002911 mtd->ecc_stats.corrected += stat;
Mike Dunn3f91e942012-04-25 12:06:09 -07002912 max_bitflips = max_t(unsigned int, max_bitflips, stat);
2913 }
Thomas Gleixnerf5bbdac2006-05-25 10:07:16 +02002914 }
Mike Dunn3f91e942012-04-25 12:06:09 -07002915 return max_bitflips;
Thomas Gleixnerf5bbdac2006-05-25 10:07:16 +02002916}
2917
2918/**
Brian Norris7854d3f2011-06-23 14:12:08 -07002919 * nand_read_page_hwecc_oob_first - [REPLACEABLE] hw ecc, read oob first
Brian Norris8b6e50c2011-05-25 14:59:01 -07002920 * @chip: nand chip info structure
2921 * @buf: buffer to store read data
Brian Norris1fbb9382012-05-02 10:14:55 -07002922 * @oob_required: caller requires OOB data read to chip->oob_poi
Brian Norris8b6e50c2011-05-25 14:59:01 -07002923 * @page: page number to read
Sneha Narnakaje6e0cb132009-09-18 12:51:47 -07002924 *
Brian Norris8b6e50c2011-05-25 14:59:01 -07002925 * Hardware ECC for large page chips, require OOB to be read first. For this
2926 * ECC mode, the write_page method is re-used from ECC_HW. These methods
2927 * read/write ECC from the OOB area, unlike the ECC_HW_SYNDROME support with
2928 * multiple ECC steps, follows the "infix ECC" scheme and reads/writes ECC from
2929 * the data area, by overwriting the NAND manufacturer bad block markings.
Sneha Narnakaje6e0cb132009-09-18 12:51:47 -07002930 */
Boris Brezillonb9761682018-09-06 14:05:20 +02002931static int nand_read_page_hwecc_oob_first(struct nand_chip *chip, uint8_t *buf,
2932 int oob_required, int page)
Sneha Narnakaje6e0cb132009-09-18 12:51:47 -07002933{
Boris Brezillonb9761682018-09-06 14:05:20 +02002934 struct mtd_info *mtd = nand_to_mtd(chip);
Boris Brezillon846031d2016-02-03 20:11:00 +01002935 int i, eccsize = chip->ecc.size, ret;
Sneha Narnakaje6e0cb132009-09-18 12:51:47 -07002936 int eccbytes = chip->ecc.bytes;
2937 int eccsteps = chip->ecc.steps;
2938 uint8_t *p = buf;
Masahiro Yamadac0313b92017-12-05 17:47:16 +09002939 uint8_t *ecc_code = chip->ecc.code_buf;
2940 uint8_t *ecc_calc = chip->ecc.calc_buf;
Mike Dunn3f91e942012-04-25 12:06:09 -07002941 unsigned int max_bitflips = 0;
Sneha Narnakaje6e0cb132009-09-18 12:51:47 -07002942
2943 /* Read the OOB area first */
Boris Brezillon97d90da2017-11-30 18:01:29 +01002944 ret = nand_read_oob_op(chip, page, 0, chip->oob_poi, mtd->oobsize);
2945 if (ret)
2946 return ret;
2947
2948 ret = nand_read_page_op(chip, page, 0, NULL, 0);
2949 if (ret)
2950 return ret;
Sneha Narnakaje6e0cb132009-09-18 12:51:47 -07002951
Boris Brezillon846031d2016-02-03 20:11:00 +01002952 ret = mtd_ooblayout_get_eccbytes(mtd, ecc_code, chip->oob_poi, 0,
2953 chip->ecc.total);
2954 if (ret)
2955 return ret;
Sneha Narnakaje6e0cb132009-09-18 12:51:47 -07002956
2957 for (i = 0; eccsteps; eccsteps--, i += eccbytes, p += eccsize) {
2958 int stat;
2959
Boris Brezillonec476362018-09-06 14:05:17 +02002960 chip->ecc.hwctl(chip, NAND_ECC_READ);
Boris Brezillon97d90da2017-11-30 18:01:29 +01002961
2962 ret = nand_read_data_op(chip, p, eccsize, false);
2963 if (ret)
2964 return ret;
2965
Boris Brezillonaf37d2c2018-09-06 14:05:18 +02002966 chip->ecc.calculate(chip, p, &ecc_calc[i]);
Sneha Narnakaje6e0cb132009-09-18 12:51:47 -07002967
Boris Brezillon00da2ea2018-09-06 14:05:19 +02002968 stat = chip->ecc.correct(chip, p, &ecc_code[i], NULL);
Boris BREZILLON40cbe6e2015-12-30 20:32:04 +01002969 if (stat == -EBADMSG &&
2970 (chip->ecc.options & NAND_ECC_GENERIC_ERASED_CHECK)) {
2971 /* check for empty pages with bitflips */
2972 stat = nand_check_erased_ecc_chunk(p, eccsize,
2973 &ecc_code[i], eccbytes,
2974 NULL, 0,
2975 chip->ecc.strength);
2976 }
2977
Mike Dunn3f91e942012-04-25 12:06:09 -07002978 if (stat < 0) {
Sneha Narnakaje6e0cb132009-09-18 12:51:47 -07002979 mtd->ecc_stats.failed++;
Mike Dunn3f91e942012-04-25 12:06:09 -07002980 } else {
Sneha Narnakaje6e0cb132009-09-18 12:51:47 -07002981 mtd->ecc_stats.corrected += stat;
Mike Dunn3f91e942012-04-25 12:06:09 -07002982 max_bitflips = max_t(unsigned int, max_bitflips, stat);
2983 }
Sneha Narnakaje6e0cb132009-09-18 12:51:47 -07002984 }
Mike Dunn3f91e942012-04-25 12:06:09 -07002985 return max_bitflips;
Sneha Narnakaje6e0cb132009-09-18 12:51:47 -07002986}
2987
2988/**
Brian Norris7854d3f2011-06-23 14:12:08 -07002989 * nand_read_page_syndrome - [REPLACEABLE] hardware ECC syndrome based page read
Brian Norris8b6e50c2011-05-25 14:59:01 -07002990 * @chip: nand chip info structure
2991 * @buf: buffer to store read data
Brian Norris1fbb9382012-05-02 10:14:55 -07002992 * @oob_required: caller requires OOB data read to chip->oob_poi
Brian Norris8b6e50c2011-05-25 14:59:01 -07002993 * @page: page number to read
Thomas Gleixnerf5bbdac2006-05-25 10:07:16 +02002994 *
Brian Norris8b6e50c2011-05-25 14:59:01 -07002995 * The hw generator calculates the error syndrome automatically. Therefore we
2996 * need a special oob layout and handling.
Thomas Gleixnerf5bbdac2006-05-25 10:07:16 +02002997 */
Boris Brezillonb9761682018-09-06 14:05:20 +02002998static int nand_read_page_syndrome(struct nand_chip *chip, uint8_t *buf,
2999 int oob_required, int page)
Thomas Gleixnerf5bbdac2006-05-25 10:07:16 +02003000{
Boris Brezillonb9761682018-09-06 14:05:20 +02003001 struct mtd_info *mtd = nand_to_mtd(chip);
Boris Brezillon97d90da2017-11-30 18:01:29 +01003002 int ret, i, eccsize = chip->ecc.size;
Thomas Gleixnerf5bbdac2006-05-25 10:07:16 +02003003 int eccbytes = chip->ecc.bytes;
3004 int eccsteps = chip->ecc.steps;
Boris BREZILLON40cbe6e2015-12-30 20:32:04 +01003005 int eccpadbytes = eccbytes + chip->ecc.prepad + chip->ecc.postpad;
Thomas Gleixnerf5bbdac2006-05-25 10:07:16 +02003006 uint8_t *p = buf;
Thomas Gleixnerf75e5092006-05-26 18:52:08 +02003007 uint8_t *oob = chip->oob_poi;
Mike Dunn3f91e942012-04-25 12:06:09 -07003008 unsigned int max_bitflips = 0;
Thomas Gleixnerf5bbdac2006-05-25 10:07:16 +02003009
Boris Brezillon25f815f2017-11-30 18:01:30 +01003010 ret = nand_read_page_op(chip, page, 0, NULL, 0);
3011 if (ret)
3012 return ret;
3013
Thomas Gleixnerf5bbdac2006-05-25 10:07:16 +02003014 for (i = 0; eccsteps; eccsteps--, i += eccbytes, p += eccsize) {
3015 int stat;
3016
Boris Brezillonec476362018-09-06 14:05:17 +02003017 chip->ecc.hwctl(chip, NAND_ECC_READ);
Boris Brezillon97d90da2017-11-30 18:01:29 +01003018
3019 ret = nand_read_data_op(chip, p, eccsize, false);
3020 if (ret)
3021 return ret;
Thomas Gleixnerf5bbdac2006-05-25 10:07:16 +02003022
3023 if (chip->ecc.prepad) {
Boris Brezillon97d90da2017-11-30 18:01:29 +01003024 ret = nand_read_data_op(chip, oob, chip->ecc.prepad,
3025 false);
3026 if (ret)
3027 return ret;
3028
Thomas Gleixnerf5bbdac2006-05-25 10:07:16 +02003029 oob += chip->ecc.prepad;
3030 }
3031
Boris Brezillonec476362018-09-06 14:05:17 +02003032 chip->ecc.hwctl(chip, NAND_ECC_READSYN);
Boris Brezillon97d90da2017-11-30 18:01:29 +01003033
3034 ret = nand_read_data_op(chip, oob, eccbytes, false);
3035 if (ret)
3036 return ret;
3037
Boris Brezillon00da2ea2018-09-06 14:05:19 +02003038 stat = chip->ecc.correct(chip, p, oob, NULL);
Thomas Gleixnerf5bbdac2006-05-25 10:07:16 +02003039
Thomas Gleixnerf5bbdac2006-05-25 10:07:16 +02003040 oob += eccbytes;
3041
3042 if (chip->ecc.postpad) {
Boris Brezillon97d90da2017-11-30 18:01:29 +01003043 ret = nand_read_data_op(chip, oob, chip->ecc.postpad,
3044 false);
3045 if (ret)
3046 return ret;
3047
Thomas Gleixnerf5bbdac2006-05-25 10:07:16 +02003048 oob += chip->ecc.postpad;
3049 }
Boris BREZILLON40cbe6e2015-12-30 20:32:04 +01003050
3051 if (stat == -EBADMSG &&
3052 (chip->ecc.options & NAND_ECC_GENERIC_ERASED_CHECK)) {
3053 /* check for empty pages with bitflips */
3054 stat = nand_check_erased_ecc_chunk(p, chip->ecc.size,
3055 oob - eccpadbytes,
3056 eccpadbytes,
3057 NULL, 0,
3058 chip->ecc.strength);
3059 }
3060
3061 if (stat < 0) {
3062 mtd->ecc_stats.failed++;
3063 } else {
3064 mtd->ecc_stats.corrected += stat;
3065 max_bitflips = max_t(unsigned int, max_bitflips, stat);
3066 }
Thomas Gleixnerf5bbdac2006-05-25 10:07:16 +02003067 }
3068
3069 /* Calculate remaining oob bytes */
Vitaly Wool7e4178f2006-06-07 09:34:37 +04003070 i = mtd->oobsize - (oob - chip->oob_poi);
Boris Brezillon97d90da2017-11-30 18:01:29 +01003071 if (i) {
3072 ret = nand_read_data_op(chip, oob, i, false);
3073 if (ret)
3074 return ret;
3075 }
Thomas Gleixnerf5bbdac2006-05-25 10:07:16 +02003076
Mike Dunn3f91e942012-04-25 12:06:09 -07003077 return max_bitflips;
Thomas Gleixnerf5bbdac2006-05-25 10:07:16 +02003078}
3079
3080/**
Brian Norris7854d3f2011-06-23 14:12:08 -07003081 * nand_transfer_oob - [INTERN] Transfer oob to client buffer
Boris Brezillon08136212018-11-11 08:55:03 +01003082 * @chip: NAND chip object
Brian Norris8b6e50c2011-05-25 14:59:01 -07003083 * @oob: oob destination address
3084 * @ops: oob ops structure
3085 * @len: size of oob to transfer
Thomas Gleixner8593fbc2006-05-29 03:26:58 +02003086 */
Boris Brezillon08136212018-11-11 08:55:03 +01003087static uint8_t *nand_transfer_oob(struct nand_chip *chip, uint8_t *oob,
Vitaly Wool70145682006-11-03 18:20:38 +03003088 struct mtd_oob_ops *ops, size_t len)
Thomas Gleixner8593fbc2006-05-29 03:26:58 +02003089{
Boris Brezillon08136212018-11-11 08:55:03 +01003090 struct mtd_info *mtd = nand_to_mtd(chip);
Boris Brezillon846031d2016-02-03 20:11:00 +01003091 int ret;
3092
Florian Fainellif8ac0412010-09-07 13:23:43 +02003093 switch (ops->mode) {
Thomas Gleixner8593fbc2006-05-29 03:26:58 +02003094
Brian Norris0612b9d2011-08-30 18:45:40 -07003095 case MTD_OPS_PLACE_OOB:
3096 case MTD_OPS_RAW:
Thomas Gleixner8593fbc2006-05-29 03:26:58 +02003097 memcpy(oob, chip->oob_poi + ops->ooboffs, len);
3098 return oob + len;
3099
Boris Brezillon846031d2016-02-03 20:11:00 +01003100 case MTD_OPS_AUTO_OOB:
3101 ret = mtd_ooblayout_get_databytes(mtd, oob, chip->oob_poi,
3102 ops->ooboffs, len);
3103 BUG_ON(ret);
3104 return oob + len;
Thomas Gleixner8593fbc2006-05-29 03:26:58 +02003105
Thomas Gleixner8593fbc2006-05-29 03:26:58 +02003106 default:
3107 BUG();
3108 }
3109 return NULL;
3110}
3111
3112/**
Brian Norrisba84fb52014-01-03 15:13:33 -08003113 * nand_setup_read_retry - [INTERN] Set the READ RETRY mode
Boris Brezillon2e7f1ce2018-09-06 14:05:32 +02003114 * @chip: NAND chip object
Brian Norrisba84fb52014-01-03 15:13:33 -08003115 * @retry_mode: the retry mode to use
3116 *
3117 * Some vendors supply a special command to shift the Vt threshold, to be used
3118 * when there are too many bitflips in a page (i.e., ECC error). After setting
3119 * a new threshold, the host should retry reading the page.
3120 */
Boris Brezillon2e7f1ce2018-09-06 14:05:32 +02003121static int nand_setup_read_retry(struct nand_chip *chip, int retry_mode)
Brian Norrisba84fb52014-01-03 15:13:33 -08003122{
Brian Norrisba84fb52014-01-03 15:13:33 -08003123 pr_debug("setting READ RETRY mode %d\n", retry_mode);
3124
3125 if (retry_mode >= chip->read_retries)
3126 return -EINVAL;
3127
3128 if (!chip->setup_read_retry)
3129 return -EOPNOTSUPP;
3130
Boris Brezillon2e7f1ce2018-09-06 14:05:32 +02003131 return chip->setup_read_retry(chip, retry_mode);
Brian Norrisba84fb52014-01-03 15:13:33 -08003132}
3133
Boris Brezillon85e08e52018-07-27 09:44:17 +02003134static void nand_wait_readrdy(struct nand_chip *chip)
3135{
Boris Brezillon52f05b62018-07-27 09:44:18 +02003136 const struct nand_sdr_timings *sdr;
3137
Boris Brezillon85e08e52018-07-27 09:44:17 +02003138 if (!(chip->options & NAND_NEED_READRDY))
3139 return;
3140
Boris Brezillon52f05b62018-07-27 09:44:18 +02003141 sdr = nand_get_sdr_timings(&chip->data_interface);
3142 WARN_ON(nand_wait_rdy_op(chip, PSEC_TO_MSEC(sdr->tR_max), 0));
Boris Brezillon85e08e52018-07-27 09:44:17 +02003143}
3144
Brian Norrisba84fb52014-01-03 15:13:33 -08003145/**
Brian Norris7854d3f2011-06-23 14:12:08 -07003146 * nand_do_read_ops - [INTERN] Read data with ECC
Boris Brezillon08136212018-11-11 08:55:03 +01003147 * @chip: NAND chip object
Brian Norris8b6e50c2011-05-25 14:59:01 -07003148 * @from: offset to read from
3149 * @ops: oob ops structure
David A. Marlin068e3c02005-01-24 03:07:46 +00003150 *
Thomas Gleixnerf5bbdac2006-05-25 10:07:16 +02003151 * Internal function. Called with chip held.
David A. Marlin068e3c02005-01-24 03:07:46 +00003152 */
Boris Brezillon08136212018-11-11 08:55:03 +01003153static int nand_do_read_ops(struct nand_chip *chip, loff_t from,
Thomas Gleixner8593fbc2006-05-29 03:26:58 +02003154 struct mtd_oob_ops *ops)
David A. Marlin068e3c02005-01-24 03:07:46 +00003155{
Brian Norrise47f3db2012-05-02 10:14:56 -07003156 int chipnr, page, realpage, col, bytes, aligned, oob_required;
Boris Brezillon08136212018-11-11 08:55:03 +01003157 struct mtd_info *mtd = nand_to_mtd(chip);
Thomas Gleixnerf5bbdac2006-05-25 10:07:16 +02003158 int ret = 0;
Thomas Gleixner8593fbc2006-05-29 03:26:58 +02003159 uint32_t readlen = ops->len;
Vitaly Wool70145682006-11-03 18:20:38 +03003160 uint32_t oobreadlen = ops->ooblen;
Boris BREZILLON29f10582016-03-07 10:46:52 +01003161 uint32_t max_oobsize = mtd_oobavail(mtd, ops);
Maxim Levitsky9aca3342010-02-22 20:39:35 +02003162
Thomas Gleixner8593fbc2006-05-29 03:26:58 +02003163 uint8_t *bufpoi, *oob, *buf;
Kamal Dasu66507c72014-05-01 20:51:19 -04003164 int use_bufpoi;
Mike Dunnedbc45402012-04-25 12:06:11 -07003165 unsigned int max_bitflips = 0;
Brian Norrisba84fb52014-01-03 15:13:33 -08003166 int retry_mode = 0;
Brian Norrisb72f3df2013-12-03 11:04:14 -08003167 bool ecc_fail = false;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003168
Thomas Gleixnerace4dfe2006-05-24 12:07:37 +02003169 chipnr = (int)(from >> chip->chip_shift);
Boris Brezillon1d017852018-11-11 08:55:14 +01003170 nand_select_target(chip, chipnr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003171
Thomas Gleixnerace4dfe2006-05-24 12:07:37 +02003172 realpage = (int)(from >> chip->page_shift);
3173 page = realpage & chip->pagemask;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003174
Thomas Gleixnerf5bbdac2006-05-25 10:07:16 +02003175 col = (int)(from & (mtd->writesize - 1));
Linus Torvalds1da177e2005-04-16 15:20:36 -07003176
Thomas Gleixner8593fbc2006-05-29 03:26:58 +02003177 buf = ops->datbuf;
3178 oob = ops->oobbuf;
Brian Norrise47f3db2012-05-02 10:14:56 -07003179 oob_required = oob ? 1 : 0;
Thomas Gleixner8593fbc2006-05-29 03:26:58 +02003180
Florian Fainellif8ac0412010-09-07 13:23:43 +02003181 while (1) {
Brian Norrisb72f3df2013-12-03 11:04:14 -08003182 unsigned int ecc_failures = mtd->ecc_stats.failed;
3183
Thomas Gleixnerf5bbdac2006-05-25 10:07:16 +02003184 bytes = min(mtd->writesize - col, readlen);
3185 aligned = (bytes == mtd->writesize);
Thomas Gleixner61b03bd2005-11-07 11:15:49 +00003186
Kamal Dasu66507c72014-05-01 20:51:19 -04003187 if (!aligned)
3188 use_bufpoi = 1;
3189 else if (chip->options & NAND_USE_BOUNCE_BUFFER)
Masahiro Yamada477544c2017-03-30 17:15:05 +09003190 use_bufpoi = !virt_addr_valid(buf) ||
3191 !IS_ALIGNED((unsigned long)buf,
3192 chip->buf_align);
Kamal Dasu66507c72014-05-01 20:51:19 -04003193 else
3194 use_bufpoi = 0;
3195
Brian Norris8b6e50c2011-05-25 14:59:01 -07003196 /* Is the current page in the buffer? */
Boris Brezillond9745412018-10-28 16:12:45 +01003197 if (realpage != chip->pagecache.page || oob) {
Masahiro Yamadac0313b92017-12-05 17:47:16 +09003198 bufpoi = use_bufpoi ? chip->data_buf : buf;
Kamal Dasu66507c72014-05-01 20:51:19 -04003199
3200 if (use_bufpoi && aligned)
3201 pr_debug("%s: using read bounce buffer for buf@%p\n",
3202 __func__, buf);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003203
Brian Norrisba84fb52014-01-03 15:13:33 -08003204read_retry:
Mike Dunnedbc45402012-04-25 12:06:11 -07003205 /*
3206 * Now read the page into the buffer. Absent an error,
3207 * the read methods return max bitflips per ecc step.
3208 */
Brian Norris0612b9d2011-08-30 18:45:40 -07003209 if (unlikely(ops->mode == MTD_OPS_RAW))
Boris Brezillonb9761682018-09-06 14:05:20 +02003210 ret = chip->ecc.read_page_raw(chip, bufpoi,
Brian Norrise47f3db2012-05-02 10:14:56 -07003211 oob_required,
3212 page);
Jeff Westfahla5ff4f12012-08-13 16:35:30 -05003213 else if (!aligned && NAND_HAS_SUBPAGE_READ(chip) &&
3214 !oob)
Boris Brezillonb9761682018-09-06 14:05:20 +02003215 ret = chip->ecc.read_subpage(chip, col, bytes,
3216 bufpoi, page);
David Woodhouse956e9442006-09-25 17:12:39 +01003217 else
Boris Brezillonb9761682018-09-06 14:05:20 +02003218 ret = chip->ecc.read_page(chip, bufpoi,
Brian Norrise47f3db2012-05-02 10:14:56 -07003219 oob_required, page);
Brian Norris6d77b9d2011-09-07 13:13:40 -07003220 if (ret < 0) {
Kamal Dasu66507c72014-05-01 20:51:19 -04003221 if (use_bufpoi)
Brian Norris6d77b9d2011-09-07 13:13:40 -07003222 /* Invalidate page cache */
Boris Brezillond9745412018-10-28 16:12:45 +01003223 chip->pagecache.page = -1;
David Woodhousee0c7d762006-05-13 18:07:53 +01003224 break;
Brian Norris6d77b9d2011-09-07 13:13:40 -07003225 }
Thomas Gleixnerf5bbdac2006-05-25 10:07:16 +02003226
3227 /* Transfer not aligned data */
Kamal Dasu66507c72014-05-01 20:51:19 -04003228 if (use_bufpoi) {
Jeff Westfahla5ff4f12012-08-13 16:35:30 -05003229 if (!NAND_HAS_SUBPAGE_READ(chip) && !oob &&
Brian Norrisb72f3df2013-12-03 11:04:14 -08003230 !(mtd->ecc_stats.failed - ecc_failures) &&
Mike Dunnedbc45402012-04-25 12:06:11 -07003231 (ops->mode != MTD_OPS_RAW)) {
Boris Brezillond9745412018-10-28 16:12:45 +01003232 chip->pagecache.page = realpage;
3233 chip->pagecache.bitflips = ret;
Mike Dunnedbc45402012-04-25 12:06:11 -07003234 } else {
Brian Norris6d77b9d2011-09-07 13:13:40 -07003235 /* Invalidate page cache */
Boris Brezillond9745412018-10-28 16:12:45 +01003236 chip->pagecache.page = -1;
Mike Dunnedbc45402012-04-25 12:06:11 -07003237 }
Masahiro Yamadac0313b92017-12-05 17:47:16 +09003238 memcpy(buf, chip->data_buf + col, bytes);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003239 }
Thomas Gleixner61b03bd2005-11-07 11:15:49 +00003240
Thomas Gleixner8593fbc2006-05-29 03:26:58 +02003241 if (unlikely(oob)) {
Maxim Levitskyb64d39d2010-02-22 20:39:37 +02003242 int toread = min(oobreadlen, max_oobsize);
3243
3244 if (toread) {
Boris Brezillon08136212018-11-11 08:55:03 +01003245 oob = nand_transfer_oob(chip, oob, ops,
3246 toread);
Maxim Levitskyb64d39d2010-02-22 20:39:37 +02003247 oobreadlen -= toread;
3248 }
Thomas Gleixner8593fbc2006-05-29 03:26:58 +02003249 }
Brian Norris5bc7c332013-03-13 09:51:31 -07003250
Boris Brezillon85e08e52018-07-27 09:44:17 +02003251 nand_wait_readrdy(chip);
Brian Norrisb72f3df2013-12-03 11:04:14 -08003252
Brian Norrisba84fb52014-01-03 15:13:33 -08003253 if (mtd->ecc_stats.failed - ecc_failures) {
Brian Norris28fa65e2014-02-12 16:08:28 -08003254 if (retry_mode + 1 < chip->read_retries) {
Brian Norrisba84fb52014-01-03 15:13:33 -08003255 retry_mode++;
Boris Brezillon2e7f1ce2018-09-06 14:05:32 +02003256 ret = nand_setup_read_retry(chip,
Brian Norrisba84fb52014-01-03 15:13:33 -08003257 retry_mode);
3258 if (ret < 0)
3259 break;
3260
3261 /* Reset failures; retry */
3262 mtd->ecc_stats.failed = ecc_failures;
3263 goto read_retry;
3264 } else {
3265 /* No more retry modes; real failure */
3266 ecc_fail = true;
3267 }
3268 }
3269
3270 buf += bytes;
Masahiro Yamada07604682017-03-30 15:45:47 +09003271 max_bitflips = max_t(unsigned int, max_bitflips, ret);
Thomas Gleixner8593fbc2006-05-29 03:26:58 +02003272 } else {
Masahiro Yamadac0313b92017-12-05 17:47:16 +09003273 memcpy(buf, chip->data_buf + col, bytes);
Thomas Gleixner8593fbc2006-05-29 03:26:58 +02003274 buf += bytes;
Mike Dunnedbc45402012-04-25 12:06:11 -07003275 max_bitflips = max_t(unsigned int, max_bitflips,
Boris Brezillond9745412018-10-28 16:12:45 +01003276 chip->pagecache.bitflips);
Thomas Gleixner8593fbc2006-05-29 03:26:58 +02003277 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003278
Thomas Gleixnerf5bbdac2006-05-25 10:07:16 +02003279 readlen -= bytes;
Thomas Gleixner61b03bd2005-11-07 11:15:49 +00003280
Brian Norrisba84fb52014-01-03 15:13:33 -08003281 /* Reset to retry mode 0 */
3282 if (retry_mode) {
Boris Brezillon2e7f1ce2018-09-06 14:05:32 +02003283 ret = nand_setup_read_retry(chip, 0);
Brian Norrisba84fb52014-01-03 15:13:33 -08003284 if (ret < 0)
3285 break;
3286 retry_mode = 0;
3287 }
3288
Thomas Gleixnerf5bbdac2006-05-25 10:07:16 +02003289 if (!readlen)
Thomas Gleixner61b03bd2005-11-07 11:15:49 +00003290 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003291
Brian Norris8b6e50c2011-05-25 14:59:01 -07003292 /* For subsequent reads align to page boundary */
Linus Torvalds1da177e2005-04-16 15:20:36 -07003293 col = 0;
3294 /* Increment page address */
3295 realpage++;
3296
Thomas Gleixnerace4dfe2006-05-24 12:07:37 +02003297 page = realpage & chip->pagemask;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003298 /* Check, if we cross a chip boundary */
3299 if (!page) {
3300 chipnr++;
Boris Brezillon1d017852018-11-11 08:55:14 +01003301 nand_deselect_target(chip);
3302 nand_select_target(chip, chipnr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003303 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003304 }
Boris Brezillon1d017852018-11-11 08:55:14 +01003305 nand_deselect_target(chip);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003306
Thomas Gleixner8593fbc2006-05-29 03:26:58 +02003307 ops->retlen = ops->len - (size_t) readlen;
Vitaly Wool70145682006-11-03 18:20:38 +03003308 if (oob)
3309 ops->oobretlen = ops->ooblen - oobreadlen;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003310
Mike Dunn3f91e942012-04-25 12:06:09 -07003311 if (ret < 0)
Thomas Gleixnerf5bbdac2006-05-25 10:07:16 +02003312 return ret;
3313
Brian Norrisb72f3df2013-12-03 11:04:14 -08003314 if (ecc_fail)
Thomas Gleixner9a1fcdf2006-05-29 14:56:39 +02003315 return -EBADMSG;
3316
Mike Dunnedbc45402012-04-25 12:06:11 -07003317 return max_bitflips;
Thomas Gleixnerf5bbdac2006-05-25 10:07:16 +02003318}
3319
3320/**
Brian Norris7854d3f2011-06-23 14:12:08 -07003321 * nand_read_oob_std - [REPLACEABLE] the most common OOB data read function
Brian Norris8b6e50c2011-05-25 14:59:01 -07003322 * @chip: nand chip info structure
3323 * @page: page number to read
Thomas Gleixner7bc33122006-06-20 20:05:05 +02003324 */
Boris Brezillonb9761682018-09-06 14:05:20 +02003325int nand_read_oob_std(struct nand_chip *chip, int page)
Thomas Gleixner7bc33122006-06-20 20:05:05 +02003326{
Boris Brezillonb9761682018-09-06 14:05:20 +02003327 struct mtd_info *mtd = nand_to_mtd(chip);
3328
Boris Brezillon97d90da2017-11-30 18:01:29 +01003329 return nand_read_oob_op(chip, page, 0, chip->oob_poi, mtd->oobsize);
Thomas Gleixner7bc33122006-06-20 20:05:05 +02003330}
Boris Brezillon9d02fc22015-08-26 16:08:12 +02003331EXPORT_SYMBOL(nand_read_oob_std);
Thomas Gleixner7bc33122006-06-20 20:05:05 +02003332
3333/**
Brian Norris7854d3f2011-06-23 14:12:08 -07003334 * nand_read_oob_syndrome - [REPLACEABLE] OOB data read function for HW ECC
Thomas Gleixner7bc33122006-06-20 20:05:05 +02003335 * with syndromes
Brian Norris8b6e50c2011-05-25 14:59:01 -07003336 * @chip: nand chip info structure
3337 * @page: page number to read
Thomas Gleixner7bc33122006-06-20 20:05:05 +02003338 */
Boris Brezillon348d56a2018-09-07 00:38:48 +02003339static int nand_read_oob_syndrome(struct nand_chip *chip, int page)
Thomas Gleixner7bc33122006-06-20 20:05:05 +02003340{
Boris Brezillonb9761682018-09-06 14:05:20 +02003341 struct mtd_info *mtd = nand_to_mtd(chip);
Thomas Gleixner7bc33122006-06-20 20:05:05 +02003342 int length = mtd->oobsize;
3343 int chunk = chip->ecc.bytes + chip->ecc.prepad + chip->ecc.postpad;
3344 int eccsize = chip->ecc.size;
Baruch Siach2ea69d22015-01-22 15:23:05 +02003345 uint8_t *bufpoi = chip->oob_poi;
Boris Brezillon97d90da2017-11-30 18:01:29 +01003346 int i, toread, sndrnd = 0, pos, ret;
Thomas Gleixner7bc33122006-06-20 20:05:05 +02003347
Boris Brezillon97d90da2017-11-30 18:01:29 +01003348 ret = nand_read_page_op(chip, page, chip->ecc.size, NULL, 0);
3349 if (ret)
3350 return ret;
3351
Thomas Gleixner7bc33122006-06-20 20:05:05 +02003352 for (i = 0; i < chip->ecc.steps; i++) {
3353 if (sndrnd) {
Boris Brezillon97d90da2017-11-30 18:01:29 +01003354 int ret;
3355
Thomas Gleixner7bc33122006-06-20 20:05:05 +02003356 pos = eccsize + i * (eccsize + chunk);
3357 if (mtd->writesize > 512)
Boris Brezillon97d90da2017-11-30 18:01:29 +01003358 ret = nand_change_read_column_op(chip, pos,
3359 NULL, 0,
3360 false);
Thomas Gleixner7bc33122006-06-20 20:05:05 +02003361 else
Boris Brezillon97d90da2017-11-30 18:01:29 +01003362 ret = nand_read_page_op(chip, page, pos, NULL,
3363 0);
3364
3365 if (ret)
3366 return ret;
Thomas Gleixner7bc33122006-06-20 20:05:05 +02003367 } else
3368 sndrnd = 1;
3369 toread = min_t(int, length, chunk);
Boris Brezillon97d90da2017-11-30 18:01:29 +01003370
3371 ret = nand_read_data_op(chip, bufpoi, toread, false);
3372 if (ret)
3373 return ret;
3374
Thomas Gleixner7bc33122006-06-20 20:05:05 +02003375 bufpoi += toread;
3376 length -= toread;
3377 }
Boris Brezillon97d90da2017-11-30 18:01:29 +01003378 if (length > 0) {
3379 ret = nand_read_data_op(chip, bufpoi, length, false);
3380 if (ret)
3381 return ret;
3382 }
Thomas Gleixner7bc33122006-06-20 20:05:05 +02003383
Shmulik Ladkani5c2ffb12012-05-09 13:06:35 +03003384 return 0;
Thomas Gleixner7bc33122006-06-20 20:05:05 +02003385}
3386
3387/**
Brian Norris7854d3f2011-06-23 14:12:08 -07003388 * nand_write_oob_std - [REPLACEABLE] the most common OOB data write function
Brian Norris8b6e50c2011-05-25 14:59:01 -07003389 * @chip: nand chip info structure
3390 * @page: page number to write
Thomas Gleixner7bc33122006-06-20 20:05:05 +02003391 */
Boris Brezillon767eb6f2018-09-06 14:05:21 +02003392int nand_write_oob_std(struct nand_chip *chip, int page)
Thomas Gleixner7bc33122006-06-20 20:05:05 +02003393{
Boris Brezillon767eb6f2018-09-06 14:05:21 +02003394 struct mtd_info *mtd = nand_to_mtd(chip);
3395
Boris Brezillon97d90da2017-11-30 18:01:29 +01003396 return nand_prog_page_op(chip, page, mtd->writesize, chip->oob_poi,
3397 mtd->oobsize);
Thomas Gleixner7bc33122006-06-20 20:05:05 +02003398}
Boris Brezillon9d02fc22015-08-26 16:08:12 +02003399EXPORT_SYMBOL(nand_write_oob_std);
Thomas Gleixner7bc33122006-06-20 20:05:05 +02003400
3401/**
Brian Norris7854d3f2011-06-23 14:12:08 -07003402 * nand_write_oob_syndrome - [REPLACEABLE] OOB data write function for HW ECC
Brian Norris8b6e50c2011-05-25 14:59:01 -07003403 * with syndrome - only for large page flash
Brian Norris8b6e50c2011-05-25 14:59:01 -07003404 * @chip: nand chip info structure
3405 * @page: page number to write
Thomas Gleixner7bc33122006-06-20 20:05:05 +02003406 */
Boris Brezillon348d56a2018-09-07 00:38:48 +02003407static int nand_write_oob_syndrome(struct nand_chip *chip, int page)
Thomas Gleixner7bc33122006-06-20 20:05:05 +02003408{
Boris Brezillon767eb6f2018-09-06 14:05:21 +02003409 struct mtd_info *mtd = nand_to_mtd(chip);
Thomas Gleixner7bc33122006-06-20 20:05:05 +02003410 int chunk = chip->ecc.bytes + chip->ecc.prepad + chip->ecc.postpad;
3411 int eccsize = chip->ecc.size, length = mtd->oobsize;
Boris Brezillon97d90da2017-11-30 18:01:29 +01003412 int ret, i, len, pos, sndcmd = 0, steps = chip->ecc.steps;
Thomas Gleixner7bc33122006-06-20 20:05:05 +02003413 const uint8_t *bufpoi = chip->oob_poi;
3414
3415 /*
3416 * data-ecc-data-ecc ... ecc-oob
3417 * or
3418 * data-pad-ecc-pad-data-pad .... ecc-pad-oob
3419 */
3420 if (!chip->ecc.prepad && !chip->ecc.postpad) {
3421 pos = steps * (eccsize + chunk);
3422 steps = 0;
3423 } else
Vitaly Wool8b0036e2006-07-11 09:11:25 +02003424 pos = eccsize;
Thomas Gleixner7bc33122006-06-20 20:05:05 +02003425
Boris Brezillon97d90da2017-11-30 18:01:29 +01003426 ret = nand_prog_page_begin_op(chip, page, pos, NULL, 0);
3427 if (ret)
3428 return ret;
3429
Thomas Gleixner7bc33122006-06-20 20:05:05 +02003430 for (i = 0; i < steps; i++) {
3431 if (sndcmd) {
3432 if (mtd->writesize <= 512) {
3433 uint32_t fill = 0xFFFFFFFF;
3434
3435 len = eccsize;
3436 while (len > 0) {
3437 int num = min_t(int, len, 4);
Boris Brezillon97d90da2017-11-30 18:01:29 +01003438
3439 ret = nand_write_data_op(chip, &fill,
3440 num, false);
3441 if (ret)
3442 return ret;
3443
Thomas Gleixner7bc33122006-06-20 20:05:05 +02003444 len -= num;
3445 }
3446 } else {
3447 pos = eccsize + i * (eccsize + chunk);
Boris Brezillon97d90da2017-11-30 18:01:29 +01003448 ret = nand_change_write_column_op(chip, pos,
3449 NULL, 0,
3450 false);
3451 if (ret)
3452 return ret;
Thomas Gleixner7bc33122006-06-20 20:05:05 +02003453 }
3454 } else
3455 sndcmd = 1;
3456 len = min_t(int, length, chunk);
Boris Brezillon97d90da2017-11-30 18:01:29 +01003457
3458 ret = nand_write_data_op(chip, bufpoi, len, false);
3459 if (ret)
3460 return ret;
3461
Thomas Gleixner7bc33122006-06-20 20:05:05 +02003462 bufpoi += len;
3463 length -= len;
3464 }
Boris Brezillon97d90da2017-11-30 18:01:29 +01003465 if (length > 0) {
3466 ret = nand_write_data_op(chip, bufpoi, length, false);
3467 if (ret)
3468 return ret;
3469 }
Thomas Gleixner7bc33122006-06-20 20:05:05 +02003470
Boris Brezillon97d90da2017-11-30 18:01:29 +01003471 return nand_prog_page_end_op(chip);
Thomas Gleixner7bc33122006-06-20 20:05:05 +02003472}
3473
3474/**
Brian Norris7854d3f2011-06-23 14:12:08 -07003475 * nand_do_read_oob - [INTERN] NAND read out-of-band
Boris Brezillon08136212018-11-11 08:55:03 +01003476 * @chip: NAND chip object
Brian Norris8b6e50c2011-05-25 14:59:01 -07003477 * @from: offset to read from
3478 * @ops: oob operations description structure
Linus Torvalds1da177e2005-04-16 15:20:36 -07003479 *
Brian Norris8b6e50c2011-05-25 14:59:01 -07003480 * NAND read out-of-band data from the spare area.
Linus Torvalds1da177e2005-04-16 15:20:36 -07003481 */
Boris Brezillon08136212018-11-11 08:55:03 +01003482static int nand_do_read_oob(struct nand_chip *chip, loff_t from,
Thomas Gleixner8593fbc2006-05-29 03:26:58 +02003483 struct mtd_oob_ops *ops)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003484{
Boris Brezillon08136212018-11-11 08:55:03 +01003485 struct mtd_info *mtd = nand_to_mtd(chip);
Miquel Raynal87e89ce2018-01-12 10:13:36 +01003486 unsigned int max_bitflips = 0;
Brian Norrisc00a0992012-05-01 17:12:54 -07003487 int page, realpage, chipnr;
Brian Norris041e4572011-06-23 16:45:24 -07003488 struct mtd_ecc_stats stats;
Vitaly Wool70145682006-11-03 18:20:38 +03003489 int readlen = ops->ooblen;
3490 int len;
Thomas Gleixner7bc33122006-06-20 20:05:05 +02003491 uint8_t *buf = ops->oobbuf;
Shmulik Ladkani1951f2f2012-05-09 13:13:34 +03003492 int ret = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003493
Brian Norris289c0522011-07-19 10:06:09 -07003494 pr_debug("%s: from = 0x%08Lx, len = %i\n",
vimal singh20d8e242009-07-07 15:49:49 +05303495 __func__, (unsigned long long)from, readlen);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003496
Brian Norris041e4572011-06-23 16:45:24 -07003497 stats = mtd->ecc_stats;
3498
Boris BREZILLON29f10582016-03-07 10:46:52 +01003499 len = mtd_oobavail(mtd, ops);
Adrian Hunter03736152007-01-31 17:58:29 +02003500
Thomas Gleixner7314e9e2006-05-25 09:51:54 +02003501 chipnr = (int)(from >> chip->chip_shift);
Boris Brezillon1d017852018-11-11 08:55:14 +01003502 nand_select_target(chip, chipnr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003503
Thomas Gleixner7314e9e2006-05-25 09:51:54 +02003504 /* Shift to get page */
3505 realpage = (int)(from >> chip->page_shift);
3506 page = realpage & chip->pagemask;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003507
Florian Fainellif8ac0412010-09-07 13:23:43 +02003508 while (1) {
Brian Norris0612b9d2011-08-30 18:45:40 -07003509 if (ops->mode == MTD_OPS_RAW)
Boris Brezillonb9761682018-09-06 14:05:20 +02003510 ret = chip->ecc.read_oob_raw(chip, page);
Brian Norrisc46f6482011-08-30 18:45:38 -07003511 else
Boris Brezillonb9761682018-09-06 14:05:20 +02003512 ret = chip->ecc.read_oob(chip, page);
Shmulik Ladkani1951f2f2012-05-09 13:13:34 +03003513
3514 if (ret < 0)
3515 break;
Vitaly Wool70145682006-11-03 18:20:38 +03003516
3517 len = min(len, readlen);
Boris Brezillon08136212018-11-11 08:55:03 +01003518 buf = nand_transfer_oob(chip, buf, ops, len);
Thomas Gleixner8593fbc2006-05-29 03:26:58 +02003519
Boris Brezillon85e08e52018-07-27 09:44:17 +02003520 nand_wait_readrdy(chip);
Brian Norris5bc7c332013-03-13 09:51:31 -07003521
Miquel Raynal87e89ce2018-01-12 10:13:36 +01003522 max_bitflips = max_t(unsigned int, max_bitflips, ret);
3523
Vitaly Wool70145682006-11-03 18:20:38 +03003524 readlen -= len;
Savin Zlobec0d420f92006-06-21 11:51:20 +02003525 if (!readlen)
3526 break;
3527
Thomas Gleixner7314e9e2006-05-25 09:51:54 +02003528 /* Increment page address */
3529 realpage++;
3530
3531 page = realpage & chip->pagemask;
3532 /* Check, if we cross a chip boundary */
3533 if (!page) {
3534 chipnr++;
Boris Brezillon1d017852018-11-11 08:55:14 +01003535 nand_deselect_target(chip);
3536 nand_select_target(chip, chipnr);
Thomas Gleixner7314e9e2006-05-25 09:51:54 +02003537 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003538 }
Boris Brezillon1d017852018-11-11 08:55:14 +01003539 nand_deselect_target(chip);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003540
Shmulik Ladkani1951f2f2012-05-09 13:13:34 +03003541 ops->oobretlen = ops->ooblen - readlen;
3542
3543 if (ret < 0)
3544 return ret;
Brian Norris041e4572011-06-23 16:45:24 -07003545
3546 if (mtd->ecc_stats.failed - stats.failed)
3547 return -EBADMSG;
3548
Miquel Raynal87e89ce2018-01-12 10:13:36 +01003549 return max_bitflips;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003550}
3551
3552/**
Thomas Gleixner8593fbc2006-05-29 03:26:58 +02003553 * nand_read_oob - [MTD Interface] NAND read data and/or out-of-band
Brian Norris8b6e50c2011-05-25 14:59:01 -07003554 * @mtd: MTD device structure
3555 * @from: offset to read from
3556 * @ops: oob operation description structure
Linus Torvalds1da177e2005-04-16 15:20:36 -07003557 *
Brian Norris8b6e50c2011-05-25 14:59:01 -07003558 * NAND read data and/or out-of-band data.
Linus Torvalds1da177e2005-04-16 15:20:36 -07003559 */
Thomas Gleixner8593fbc2006-05-29 03:26:58 +02003560static int nand_read_oob(struct mtd_info *mtd, loff_t from,
3561 struct mtd_oob_ops *ops)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003562{
Boris Brezillon08136212018-11-11 08:55:03 +01003563 struct nand_chip *chip = mtd_to_nand(mtd);
Andrey Smirnovfc6b4d12016-07-21 14:59:21 -07003564 int ret;
Thomas Gleixner8593fbc2006-05-29 03:26:58 +02003565
3566 ops->retlen = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003567
Andrey Smirnovfc6b4d12016-07-21 14:59:21 -07003568 if (ops->mode != MTD_OPS_PLACE_OOB &&
3569 ops->mode != MTD_OPS_AUTO_OOB &&
3570 ops->mode != MTD_OPS_RAW)
3571 return -ENOTSUPP;
3572
Boris Brezillon013e6292018-11-20 11:57:20 +01003573 ret = nand_get_device(chip);
3574 if (ret)
3575 return ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003576
Thomas Gleixner8593fbc2006-05-29 03:26:58 +02003577 if (!ops->datbuf)
Boris Brezillon08136212018-11-11 08:55:03 +01003578 ret = nand_do_read_oob(chip, from, ops);
Thomas Gleixner8593fbc2006-05-29 03:26:58 +02003579 else
Boris Brezillon08136212018-11-11 08:55:03 +01003580 ret = nand_do_read_ops(chip, from, ops);
Thomas Gleixner8593fbc2006-05-29 03:26:58 +02003581
Boris Brezillon08136212018-11-11 08:55:03 +01003582 nand_release_device(chip);
Thomas Gleixner8593fbc2006-05-29 03:26:58 +02003583 return ret;
3584}
3585
Boris Brezillon0d6030a2018-07-18 10:42:17 +02003586/**
3587 * nand_write_page_raw_notsupp - dummy raw page write function
Boris Brezillon0d6030a2018-07-18 10:42:17 +02003588 * @chip: nand chip info structure
3589 * @buf: data buffer
3590 * @oob_required: must write chip->oob_poi to OOB
3591 * @page: page number to write
3592 *
3593 * Returns -ENOTSUPP unconditionally.
3594 */
Boris Brezillon767eb6f2018-09-06 14:05:21 +02003595int nand_write_page_raw_notsupp(struct nand_chip *chip, const u8 *buf,
3596 int oob_required, int page)
Boris Brezillon0d6030a2018-07-18 10:42:17 +02003597{
3598 return -ENOTSUPP;
3599}
Thomas Gleixner8593fbc2006-05-29 03:26:58 +02003600
3601/**
Brian Norris7854d3f2011-06-23 14:12:08 -07003602 * nand_write_page_raw - [INTERN] raw page write function
Brian Norris8b6e50c2011-05-25 14:59:01 -07003603 * @chip: nand chip info structure
3604 * @buf: data buffer
Brian Norris1fbb9382012-05-02 10:14:55 -07003605 * @oob_required: must write chip->oob_poi to OOB
Boris BREZILLON45aaeff2015-10-13 11:22:18 +02003606 * @page: page number to write
David Brownell52ff49d2009-03-04 12:01:36 -08003607 *
Brian Norris7854d3f2011-06-23 14:12:08 -07003608 * Not for syndrome calculating ECC controllers, which use a special oob layout.
Thomas Gleixner8593fbc2006-05-29 03:26:58 +02003609 */
Boris Brezillon767eb6f2018-09-06 14:05:21 +02003610int nand_write_page_raw(struct nand_chip *chip, const uint8_t *buf,
3611 int oob_required, int page)
Thomas Gleixner8593fbc2006-05-29 03:26:58 +02003612{
Boris Brezillon767eb6f2018-09-06 14:05:21 +02003613 struct mtd_info *mtd = nand_to_mtd(chip);
Boris Brezillon97d90da2017-11-30 18:01:29 +01003614 int ret;
Josh Wufdbad98d2012-06-25 18:07:45 +08003615
Boris Brezillon25f815f2017-11-30 18:01:30 +01003616 ret = nand_prog_page_begin_op(chip, page, 0, buf, mtd->writesize);
Boris Brezillon97d90da2017-11-30 18:01:29 +01003617 if (ret)
3618 return ret;
3619
3620 if (oob_required) {
3621 ret = nand_write_data_op(chip, chip->oob_poi, mtd->oobsize,
3622 false);
3623 if (ret)
3624 return ret;
3625 }
Josh Wufdbad98d2012-06-25 18:07:45 +08003626
Boris Brezillon25f815f2017-11-30 18:01:30 +01003627 return nand_prog_page_end_op(chip);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003628}
Thomas Petazzonicc0f51e2017-04-29 11:06:44 +02003629EXPORT_SYMBOL(nand_write_page_raw);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003630
Thomas Gleixner61b03bd2005-11-07 11:15:49 +00003631/**
Brian Norris7854d3f2011-06-23 14:12:08 -07003632 * nand_write_page_raw_syndrome - [INTERN] raw page write function
Brian Norris8b6e50c2011-05-25 14:59:01 -07003633 * @chip: nand chip info structure
3634 * @buf: data buffer
Brian Norris1fbb9382012-05-02 10:14:55 -07003635 * @oob_required: must write chip->oob_poi to OOB
Boris BREZILLON45aaeff2015-10-13 11:22:18 +02003636 * @page: page number to write
David Brownell52ff49d2009-03-04 12:01:36 -08003637 *
3638 * We need a special oob layout and handling even when ECC isn't checked.
3639 */
Boris Brezillon767eb6f2018-09-06 14:05:21 +02003640static int nand_write_page_raw_syndrome(struct nand_chip *chip,
Boris BREZILLON45aaeff2015-10-13 11:22:18 +02003641 const uint8_t *buf, int oob_required,
3642 int page)
David Brownell52ff49d2009-03-04 12:01:36 -08003643{
Boris Brezillon767eb6f2018-09-06 14:05:21 +02003644 struct mtd_info *mtd = nand_to_mtd(chip);
David Brownell52ff49d2009-03-04 12:01:36 -08003645 int eccsize = chip->ecc.size;
3646 int eccbytes = chip->ecc.bytes;
3647 uint8_t *oob = chip->oob_poi;
Boris Brezillon97d90da2017-11-30 18:01:29 +01003648 int steps, size, ret;
David Brownell52ff49d2009-03-04 12:01:36 -08003649
Boris Brezillon25f815f2017-11-30 18:01:30 +01003650 ret = nand_prog_page_begin_op(chip, page, 0, NULL, 0);
3651 if (ret)
3652 return ret;
David Brownell52ff49d2009-03-04 12:01:36 -08003653
3654 for (steps = chip->ecc.steps; steps > 0; steps--) {
Boris Brezillon97d90da2017-11-30 18:01:29 +01003655 ret = nand_write_data_op(chip, buf, eccsize, false);
3656 if (ret)
3657 return ret;
3658
David Brownell52ff49d2009-03-04 12:01:36 -08003659 buf += eccsize;
3660
3661 if (chip->ecc.prepad) {
Boris Brezillon97d90da2017-11-30 18:01:29 +01003662 ret = nand_write_data_op(chip, oob, chip->ecc.prepad,
3663 false);
3664 if (ret)
3665 return ret;
3666
David Brownell52ff49d2009-03-04 12:01:36 -08003667 oob += chip->ecc.prepad;
3668 }
3669
Boris Brezillon97d90da2017-11-30 18:01:29 +01003670 ret = nand_write_data_op(chip, oob, eccbytes, false);
3671 if (ret)
3672 return ret;
3673
David Brownell52ff49d2009-03-04 12:01:36 -08003674 oob += eccbytes;
3675
3676 if (chip->ecc.postpad) {
Boris Brezillon97d90da2017-11-30 18:01:29 +01003677 ret = nand_write_data_op(chip, oob, chip->ecc.postpad,
3678 false);
3679 if (ret)
3680 return ret;
3681
David Brownell52ff49d2009-03-04 12:01:36 -08003682 oob += chip->ecc.postpad;
3683 }
3684 }
3685
3686 size = mtd->oobsize - (oob - chip->oob_poi);
Boris Brezillon97d90da2017-11-30 18:01:29 +01003687 if (size) {
3688 ret = nand_write_data_op(chip, oob, size, false);
3689 if (ret)
3690 return ret;
3691 }
Josh Wufdbad98d2012-06-25 18:07:45 +08003692
Boris Brezillon25f815f2017-11-30 18:01:30 +01003693 return nand_prog_page_end_op(chip);
David Brownell52ff49d2009-03-04 12:01:36 -08003694}
3695/**
Brian Norris7854d3f2011-06-23 14:12:08 -07003696 * nand_write_page_swecc - [REPLACEABLE] software ECC based page write function
Brian Norris8b6e50c2011-05-25 14:59:01 -07003697 * @chip: nand chip info structure
3698 * @buf: data buffer
Brian Norris1fbb9382012-05-02 10:14:55 -07003699 * @oob_required: must write chip->oob_poi to OOB
Boris BREZILLON45aaeff2015-10-13 11:22:18 +02003700 * @page: page number to write
Thomas Gleixnerf75e5092006-05-26 18:52:08 +02003701 */
Boris Brezillon767eb6f2018-09-06 14:05:21 +02003702static int nand_write_page_swecc(struct nand_chip *chip, const uint8_t *buf,
3703 int oob_required, int page)
Thomas Gleixnerf75e5092006-05-26 18:52:08 +02003704{
Boris Brezillon767eb6f2018-09-06 14:05:21 +02003705 struct mtd_info *mtd = nand_to_mtd(chip);
Boris Brezillon846031d2016-02-03 20:11:00 +01003706 int i, eccsize = chip->ecc.size, ret;
Thomas Gleixnerf75e5092006-05-26 18:52:08 +02003707 int eccbytes = chip->ecc.bytes;
3708 int eccsteps = chip->ecc.steps;
Masahiro Yamadac0313b92017-12-05 17:47:16 +09003709 uint8_t *ecc_calc = chip->ecc.calc_buf;
Thomas Gleixnerf75e5092006-05-26 18:52:08 +02003710 const uint8_t *p = buf;
Thomas Gleixnerf75e5092006-05-26 18:52:08 +02003711
Brian Norris7854d3f2011-06-23 14:12:08 -07003712 /* Software ECC calculation */
Thomas Gleixner8593fbc2006-05-29 03:26:58 +02003713 for (i = 0; eccsteps; eccsteps--, i += eccbytes, p += eccsize)
Boris Brezillonaf37d2c2018-09-06 14:05:18 +02003714 chip->ecc.calculate(chip, p, &ecc_calc[i]);
Thomas Gleixnerf75e5092006-05-26 18:52:08 +02003715
Boris Brezillon846031d2016-02-03 20:11:00 +01003716 ret = mtd_ooblayout_set_eccbytes(mtd, ecc_calc, chip->oob_poi, 0,
3717 chip->ecc.total);
3718 if (ret)
3719 return ret;
Thomas Gleixnerf75e5092006-05-26 18:52:08 +02003720
Boris Brezillon767eb6f2018-09-06 14:05:21 +02003721 return chip->ecc.write_page_raw(chip, buf, 1, page);
Thomas Gleixnerf75e5092006-05-26 18:52:08 +02003722}
3723
3724/**
Brian Norris7854d3f2011-06-23 14:12:08 -07003725 * nand_write_page_hwecc - [REPLACEABLE] hardware ECC based page write function
Brian Norris8b6e50c2011-05-25 14:59:01 -07003726 * @chip: nand chip info structure
3727 * @buf: data buffer
Brian Norris1fbb9382012-05-02 10:14:55 -07003728 * @oob_required: must write chip->oob_poi to OOB
Boris BREZILLON45aaeff2015-10-13 11:22:18 +02003729 * @page: page number to write
Thomas Gleixnerf75e5092006-05-26 18:52:08 +02003730 */
Boris Brezillon767eb6f2018-09-06 14:05:21 +02003731static int nand_write_page_hwecc(struct nand_chip *chip, const uint8_t *buf,
3732 int oob_required, int page)
Thomas Gleixnerf75e5092006-05-26 18:52:08 +02003733{
Boris Brezillon767eb6f2018-09-06 14:05:21 +02003734 struct mtd_info *mtd = nand_to_mtd(chip);
Boris Brezillon846031d2016-02-03 20:11:00 +01003735 int i, eccsize = chip->ecc.size, ret;
Thomas Gleixnerf75e5092006-05-26 18:52:08 +02003736 int eccbytes = chip->ecc.bytes;
3737 int eccsteps = chip->ecc.steps;
Masahiro Yamadac0313b92017-12-05 17:47:16 +09003738 uint8_t *ecc_calc = chip->ecc.calc_buf;
Thomas Gleixnerf75e5092006-05-26 18:52:08 +02003739 const uint8_t *p = buf;
Thomas Gleixnerf75e5092006-05-26 18:52:08 +02003740
Boris Brezillon25f815f2017-11-30 18:01:30 +01003741 ret = nand_prog_page_begin_op(chip, page, 0, NULL, 0);
3742 if (ret)
3743 return ret;
3744
Thomas Gleixnerf75e5092006-05-26 18:52:08 +02003745 for (i = 0; eccsteps; eccsteps--, i += eccbytes, p += eccsize) {
Boris Brezillonec476362018-09-06 14:05:17 +02003746 chip->ecc.hwctl(chip, NAND_ECC_WRITE);
Boris Brezillon97d90da2017-11-30 18:01:29 +01003747
3748 ret = nand_write_data_op(chip, p, eccsize, false);
3749 if (ret)
3750 return ret;
3751
Boris Brezillonaf37d2c2018-09-06 14:05:18 +02003752 chip->ecc.calculate(chip, p, &ecc_calc[i]);
Thomas Gleixnerf75e5092006-05-26 18:52:08 +02003753 }
3754
Boris Brezillon846031d2016-02-03 20:11:00 +01003755 ret = mtd_ooblayout_set_eccbytes(mtd, ecc_calc, chip->oob_poi, 0,
3756 chip->ecc.total);
3757 if (ret)
3758 return ret;
Thomas Gleixnerf75e5092006-05-26 18:52:08 +02003759
Boris Brezillon97d90da2017-11-30 18:01:29 +01003760 ret = nand_write_data_op(chip, chip->oob_poi, mtd->oobsize, false);
3761 if (ret)
3762 return ret;
Josh Wufdbad98d2012-06-25 18:07:45 +08003763
Boris Brezillon25f815f2017-11-30 18:01:30 +01003764 return nand_prog_page_end_op(chip);
Thomas Gleixnerf75e5092006-05-26 18:52:08 +02003765}
3766
Gupta, Pekon837a6ba2013-03-15 17:55:53 +05303767
3768/**
Brian Norris73c8aaf2015-02-28 02:04:18 -08003769 * nand_write_subpage_hwecc - [REPLACEABLE] hardware ECC based subpage write
Gupta, Pekon837a6ba2013-03-15 17:55:53 +05303770 * @chip: nand chip info structure
Brian Norrisd6a950802013-08-08 17:16:36 -07003771 * @offset: column address of subpage within the page
Gupta, Pekon837a6ba2013-03-15 17:55:53 +05303772 * @data_len: data length
Brian Norrisd6a950802013-08-08 17:16:36 -07003773 * @buf: data buffer
Gupta, Pekon837a6ba2013-03-15 17:55:53 +05303774 * @oob_required: must write chip->oob_poi to OOB
Boris BREZILLON45aaeff2015-10-13 11:22:18 +02003775 * @page: page number to write
Gupta, Pekon837a6ba2013-03-15 17:55:53 +05303776 */
Boris Brezillon767eb6f2018-09-06 14:05:21 +02003777static int nand_write_subpage_hwecc(struct nand_chip *chip, uint32_t offset,
3778 uint32_t data_len, const uint8_t *buf,
3779 int oob_required, int page)
Gupta, Pekon837a6ba2013-03-15 17:55:53 +05303780{
Boris Brezillon767eb6f2018-09-06 14:05:21 +02003781 struct mtd_info *mtd = nand_to_mtd(chip);
Gupta, Pekon837a6ba2013-03-15 17:55:53 +05303782 uint8_t *oob_buf = chip->oob_poi;
Masahiro Yamadac0313b92017-12-05 17:47:16 +09003783 uint8_t *ecc_calc = chip->ecc.calc_buf;
Gupta, Pekon837a6ba2013-03-15 17:55:53 +05303784 int ecc_size = chip->ecc.size;
3785 int ecc_bytes = chip->ecc.bytes;
3786 int ecc_steps = chip->ecc.steps;
Gupta, Pekon837a6ba2013-03-15 17:55:53 +05303787 uint32_t start_step = offset / ecc_size;
3788 uint32_t end_step = (offset + data_len - 1) / ecc_size;
3789 int oob_bytes = mtd->oobsize / ecc_steps;
Boris Brezillon846031d2016-02-03 20:11:00 +01003790 int step, ret;
Gupta, Pekon837a6ba2013-03-15 17:55:53 +05303791
Boris Brezillon25f815f2017-11-30 18:01:30 +01003792 ret = nand_prog_page_begin_op(chip, page, 0, NULL, 0);
3793 if (ret)
3794 return ret;
3795
Gupta, Pekon837a6ba2013-03-15 17:55:53 +05303796 for (step = 0; step < ecc_steps; step++) {
3797 /* configure controller for WRITE access */
Boris Brezillonec476362018-09-06 14:05:17 +02003798 chip->ecc.hwctl(chip, NAND_ECC_WRITE);
Gupta, Pekon837a6ba2013-03-15 17:55:53 +05303799
3800 /* write data (untouched subpages already masked by 0xFF) */
Boris Brezillon97d90da2017-11-30 18:01:29 +01003801 ret = nand_write_data_op(chip, buf, ecc_size, false);
3802 if (ret)
3803 return ret;
Gupta, Pekon837a6ba2013-03-15 17:55:53 +05303804
3805 /* mask ECC of un-touched subpages by padding 0xFF */
3806 if ((step < start_step) || (step > end_step))
3807 memset(ecc_calc, 0xff, ecc_bytes);
3808 else
Boris Brezillonaf37d2c2018-09-06 14:05:18 +02003809 chip->ecc.calculate(chip, buf, ecc_calc);
Gupta, Pekon837a6ba2013-03-15 17:55:53 +05303810
3811 /* mask OOB of un-touched subpages by padding 0xFF */
3812 /* if oob_required, preserve OOB metadata of written subpage */
3813 if (!oob_required || (step < start_step) || (step > end_step))
3814 memset(oob_buf, 0xff, oob_bytes);
3815
Brian Norrisd6a950802013-08-08 17:16:36 -07003816 buf += ecc_size;
Gupta, Pekon837a6ba2013-03-15 17:55:53 +05303817 ecc_calc += ecc_bytes;
3818 oob_buf += oob_bytes;
3819 }
3820
3821 /* copy calculated ECC for whole page to chip->buffer->oob */
3822 /* this include masked-value(0xFF) for unwritten subpages */
Masahiro Yamadac0313b92017-12-05 17:47:16 +09003823 ecc_calc = chip->ecc.calc_buf;
Boris Brezillon846031d2016-02-03 20:11:00 +01003824 ret = mtd_ooblayout_set_eccbytes(mtd, ecc_calc, chip->oob_poi, 0,
3825 chip->ecc.total);
3826 if (ret)
3827 return ret;
Gupta, Pekon837a6ba2013-03-15 17:55:53 +05303828
3829 /* write OOB buffer to NAND device */
Boris Brezillon97d90da2017-11-30 18:01:29 +01003830 ret = nand_write_data_op(chip, chip->oob_poi, mtd->oobsize, false);
3831 if (ret)
3832 return ret;
Gupta, Pekon837a6ba2013-03-15 17:55:53 +05303833
Boris Brezillon25f815f2017-11-30 18:01:30 +01003834 return nand_prog_page_end_op(chip);
Gupta, Pekon837a6ba2013-03-15 17:55:53 +05303835}
3836
3837
Thomas Gleixnerf75e5092006-05-26 18:52:08 +02003838/**
Brian Norris7854d3f2011-06-23 14:12:08 -07003839 * nand_write_page_syndrome - [REPLACEABLE] hardware ECC syndrome based page write
Brian Norris8b6e50c2011-05-25 14:59:01 -07003840 * @chip: nand chip info structure
3841 * @buf: data buffer
Brian Norris1fbb9382012-05-02 10:14:55 -07003842 * @oob_required: must write chip->oob_poi to OOB
Boris BREZILLON45aaeff2015-10-13 11:22:18 +02003843 * @page: page number to write
Thomas Gleixnerf75e5092006-05-26 18:52:08 +02003844 *
Brian Norris8b6e50c2011-05-25 14:59:01 -07003845 * The hw generator calculates the error syndrome automatically. Therefore we
3846 * need a special oob layout and handling.
Thomas Gleixnerf75e5092006-05-26 18:52:08 +02003847 */
Boris Brezillon767eb6f2018-09-06 14:05:21 +02003848static int nand_write_page_syndrome(struct nand_chip *chip, const uint8_t *buf,
3849 int oob_required, int page)
Thomas Gleixnerf75e5092006-05-26 18:52:08 +02003850{
Boris Brezillon767eb6f2018-09-06 14:05:21 +02003851 struct mtd_info *mtd = nand_to_mtd(chip);
Thomas Gleixnerf75e5092006-05-26 18:52:08 +02003852 int i, eccsize = chip->ecc.size;
3853 int eccbytes = chip->ecc.bytes;
3854 int eccsteps = chip->ecc.steps;
3855 const uint8_t *p = buf;
3856 uint8_t *oob = chip->oob_poi;
Boris Brezillon97d90da2017-11-30 18:01:29 +01003857 int ret;
Thomas Gleixnerf75e5092006-05-26 18:52:08 +02003858
Boris Brezillon25f815f2017-11-30 18:01:30 +01003859 ret = nand_prog_page_begin_op(chip, page, 0, NULL, 0);
3860 if (ret)
3861 return ret;
Thomas Gleixnerf75e5092006-05-26 18:52:08 +02003862
3863 for (i = 0; eccsteps; eccsteps--, i += eccbytes, p += eccsize) {
Boris Brezillonec476362018-09-06 14:05:17 +02003864 chip->ecc.hwctl(chip, NAND_ECC_WRITE);
Boris Brezillon97d90da2017-11-30 18:01:29 +01003865
3866 ret = nand_write_data_op(chip, p, eccsize, false);
3867 if (ret)
3868 return ret;
Thomas Gleixnerf75e5092006-05-26 18:52:08 +02003869
3870 if (chip->ecc.prepad) {
Boris Brezillon97d90da2017-11-30 18:01:29 +01003871 ret = nand_write_data_op(chip, oob, chip->ecc.prepad,
3872 false);
3873 if (ret)
3874 return ret;
3875
Thomas Gleixnerf75e5092006-05-26 18:52:08 +02003876 oob += chip->ecc.prepad;
3877 }
3878
Boris Brezillonaf37d2c2018-09-06 14:05:18 +02003879 chip->ecc.calculate(chip, p, oob);
Boris Brezillon97d90da2017-11-30 18:01:29 +01003880
3881 ret = nand_write_data_op(chip, oob, eccbytes, false);
3882 if (ret)
3883 return ret;
3884
Thomas Gleixnerf75e5092006-05-26 18:52:08 +02003885 oob += eccbytes;
3886
3887 if (chip->ecc.postpad) {
Boris Brezillon97d90da2017-11-30 18:01:29 +01003888 ret = nand_write_data_op(chip, oob, chip->ecc.postpad,
3889 false);
3890 if (ret)
3891 return ret;
3892
Thomas Gleixnerf75e5092006-05-26 18:52:08 +02003893 oob += chip->ecc.postpad;
3894 }
3895 }
3896
3897 /* Calculate remaining oob bytes */
Vitaly Wool7e4178f2006-06-07 09:34:37 +04003898 i = mtd->oobsize - (oob - chip->oob_poi);
Boris Brezillon97d90da2017-11-30 18:01:29 +01003899 if (i) {
3900 ret = nand_write_data_op(chip, oob, i, false);
3901 if (ret)
3902 return ret;
3903 }
Josh Wufdbad98d2012-06-25 18:07:45 +08003904
Boris Brezillon25f815f2017-11-30 18:01:30 +01003905 return nand_prog_page_end_op(chip);
Thomas Gleixnerf75e5092006-05-26 18:52:08 +02003906}
3907
3908/**
Boris Brezillonf107d7a2017-03-16 09:02:42 +01003909 * nand_write_page - write one page
Brian Norris8b6e50c2011-05-25 14:59:01 -07003910 * @chip: NAND chip descriptor
Gupta, Pekon837a6ba2013-03-15 17:55:53 +05303911 * @offset: address offset within the page
3912 * @data_len: length of actual data to be written
Brian Norris8b6e50c2011-05-25 14:59:01 -07003913 * @buf: the data to write
Brian Norris1fbb9382012-05-02 10:14:55 -07003914 * @oob_required: must write chip->oob_poi to OOB
Brian Norris8b6e50c2011-05-25 14:59:01 -07003915 * @page: page number to write
Brian Norris8b6e50c2011-05-25 14:59:01 -07003916 * @raw: use _raw version of write_page
Thomas Gleixnerf75e5092006-05-26 18:52:08 +02003917 */
Boris Brezillon08136212018-11-11 08:55:03 +01003918static int nand_write_page(struct nand_chip *chip, uint32_t offset,
3919 int data_len, const uint8_t *buf, int oob_required,
3920 int page, int raw)
Thomas Gleixnerf75e5092006-05-26 18:52:08 +02003921{
Boris Brezillon08136212018-11-11 08:55:03 +01003922 struct mtd_info *mtd = nand_to_mtd(chip);
Gupta, Pekon837a6ba2013-03-15 17:55:53 +05303923 int status, subpage;
3924
3925 if (!(chip->options & NAND_NO_SUBPAGE_WRITE) &&
3926 chip->ecc.write_subpage)
3927 subpage = offset || (data_len < mtd->writesize);
3928 else
3929 subpage = 0;
Thomas Gleixnerf75e5092006-05-26 18:52:08 +02003930
David Woodhouse956e9442006-09-25 17:12:39 +01003931 if (unlikely(raw))
Boris Brezillon767eb6f2018-09-06 14:05:21 +02003932 status = chip->ecc.write_page_raw(chip, buf, oob_required,
3933 page);
Gupta, Pekon837a6ba2013-03-15 17:55:53 +05303934 else if (subpage)
Boris Brezillon767eb6f2018-09-06 14:05:21 +02003935 status = chip->ecc.write_subpage(chip, offset, data_len, buf,
3936 oob_required, page);
David Woodhouse956e9442006-09-25 17:12:39 +01003937 else
Boris Brezillon767eb6f2018-09-06 14:05:21 +02003938 status = chip->ecc.write_page(chip, buf, oob_required, page);
Josh Wufdbad98d2012-06-25 18:07:45 +08003939
3940 if (status < 0)
3941 return status;
Thomas Gleixnerf75e5092006-05-26 18:52:08 +02003942
Thomas Gleixnerf75e5092006-05-26 18:52:08 +02003943 return 0;
3944}
3945
Florian Fainellif8ac0412010-09-07 13:23:43 +02003946#define NOTALIGNED(x) ((x & (chip->subpagesize - 1)) != 0)
Thomas Gleixnerf75e5092006-05-26 18:52:08 +02003947
3948/**
Brian Norris7854d3f2011-06-23 14:12:08 -07003949 * nand_do_write_ops - [INTERN] NAND write with ECC
Boris Brezillon08136212018-11-11 08:55:03 +01003950 * @chip: NAND chip object
Brian Norris8b6e50c2011-05-25 14:59:01 -07003951 * @to: offset to write to
3952 * @ops: oob operations description structure
Thomas Gleixnerf75e5092006-05-26 18:52:08 +02003953 *
Brian Norris8b6e50c2011-05-25 14:59:01 -07003954 * NAND write with ECC.
Thomas Gleixnerf75e5092006-05-26 18:52:08 +02003955 */
Boris Brezillon08136212018-11-11 08:55:03 +01003956static int nand_do_write_ops(struct nand_chip *chip, loff_t to,
Thomas Gleixner8593fbc2006-05-29 03:26:58 +02003957 struct mtd_oob_ops *ops)
Thomas Gleixnerf75e5092006-05-26 18:52:08 +02003958{
Boris Brezillon08136212018-11-11 08:55:03 +01003959 struct mtd_info *mtd = nand_to_mtd(chip);
Corentin Labbe73600b62017-09-02 10:49:38 +02003960 int chipnr, realpage, page, column;
Thomas Gleixner8593fbc2006-05-29 03:26:58 +02003961 uint32_t writelen = ops->len;
Maxim Levitsky782ce792010-02-22 20:39:36 +02003962
3963 uint32_t oobwritelen = ops->ooblen;
Boris BREZILLON29f10582016-03-07 10:46:52 +01003964 uint32_t oobmaxlen = mtd_oobavail(mtd, ops);
Maxim Levitsky782ce792010-02-22 20:39:36 +02003965
Thomas Gleixner8593fbc2006-05-29 03:26:58 +02003966 uint8_t *oob = ops->oobbuf;
3967 uint8_t *buf = ops->datbuf;
Gupta, Pekon837a6ba2013-03-15 17:55:53 +05303968 int ret;
Brian Norrise47f3db2012-05-02 10:14:56 -07003969 int oob_required = oob ? 1 : 0;
Thomas Gleixnerf75e5092006-05-26 18:52:08 +02003970
Thomas Gleixner8593fbc2006-05-29 03:26:58 +02003971 ops->retlen = 0;
Thomas Gleixner29072b92006-09-28 15:38:36 +02003972 if (!writelen)
3973 return 0;
Thomas Gleixnerf75e5092006-05-26 18:52:08 +02003974
Brian Norris8b6e50c2011-05-25 14:59:01 -07003975 /* Reject writes, which are not page aligned */
Thomas Gleixner8593fbc2006-05-29 03:26:58 +02003976 if (NOTALIGNED(to) || NOTALIGNED(ops->len)) {
Brian Norrisd0370212011-07-19 10:06:08 -07003977 pr_notice("%s: attempt to write non page aligned data\n",
3978 __func__);
Thomas Gleixnerf75e5092006-05-26 18:52:08 +02003979 return -EINVAL;
3980 }
3981
Thomas Gleixner29072b92006-09-28 15:38:36 +02003982 column = to & (mtd->writesize - 1);
Thomas Gleixnerf75e5092006-05-26 18:52:08 +02003983
Thomas Gleixner6a930962006-06-28 00:11:45 +02003984 chipnr = (int)(to >> chip->chip_shift);
Boris Brezillon1d017852018-11-11 08:55:14 +01003985 nand_select_target(chip, chipnr);
Thomas Gleixner6a930962006-06-28 00:11:45 +02003986
Thomas Gleixnerf75e5092006-05-26 18:52:08 +02003987 /* Check, if it is write protected */
Boris Brezillon08136212018-11-11 08:55:03 +01003988 if (nand_check_wp(chip)) {
Huang Shijieb0bb6902012-11-19 14:43:29 +08003989 ret = -EIO;
3990 goto err_out;
3991 }
Thomas Gleixnerf75e5092006-05-26 18:52:08 +02003992
Thomas Gleixnerf75e5092006-05-26 18:52:08 +02003993 realpage = (int)(to >> chip->page_shift);
3994 page = realpage & chip->pagemask;
Thomas Gleixnerf75e5092006-05-26 18:52:08 +02003995
3996 /* Invalidate the page cache, when we write to the cached page */
Boris Brezillond9745412018-10-28 16:12:45 +01003997 if (to <= ((loff_t)chip->pagecache.page << chip->page_shift) &&
3998 ((loff_t)chip->pagecache.page << chip->page_shift) < (to + ops->len))
3999 chip->pagecache.page = -1;
Thomas Gleixnerf75e5092006-05-26 18:52:08 +02004000
Maxim Levitsky782ce792010-02-22 20:39:36 +02004001 /* Don't allow multipage oob writes with offset */
Huang Shijieb0bb6902012-11-19 14:43:29 +08004002 if (oob && ops->ooboffs && (ops->ooboffs + ops->ooblen > oobmaxlen)) {
4003 ret = -EINVAL;
4004 goto err_out;
4005 }
Maxim Levitsky782ce792010-02-22 20:39:36 +02004006
Florian Fainellif8ac0412010-09-07 13:23:43 +02004007 while (1) {
Thomas Gleixner29072b92006-09-28 15:38:36 +02004008 int bytes = mtd->writesize;
Thomas Gleixner29072b92006-09-28 15:38:36 +02004009 uint8_t *wbuf = buf;
Kamal Dasu66507c72014-05-01 20:51:19 -04004010 int use_bufpoi;
Hector Palacios144f4c92016-07-18 10:39:18 +02004011 int part_pagewr = (column || writelen < mtd->writesize);
Thomas Gleixner29072b92006-09-28 15:38:36 +02004012
Kamal Dasu66507c72014-05-01 20:51:19 -04004013 if (part_pagewr)
4014 use_bufpoi = 1;
4015 else if (chip->options & NAND_USE_BOUNCE_BUFFER)
Masahiro Yamada477544c2017-03-30 17:15:05 +09004016 use_bufpoi = !virt_addr_valid(buf) ||
4017 !IS_ALIGNED((unsigned long)buf,
4018 chip->buf_align);
Kamal Dasu66507c72014-05-01 20:51:19 -04004019 else
4020 use_bufpoi = 0;
4021
4022 /* Partial page write?, or need to use bounce buffer */
4023 if (use_bufpoi) {
4024 pr_debug("%s: using write bounce buffer for buf@%p\n",
4025 __func__, buf);
Kamal Dasu66507c72014-05-01 20:51:19 -04004026 if (part_pagewr)
4027 bytes = min_t(int, bytes - column, writelen);
Boris Brezilloneeab7172018-10-28 15:27:55 +01004028 wbuf = nand_get_data_buf(chip);
4029 memset(wbuf, 0xff, mtd->writesize);
4030 memcpy(&wbuf[column], buf, bytes);
Thomas Gleixner29072b92006-09-28 15:38:36 +02004031 }
Thomas Gleixnerf75e5092006-05-26 18:52:08 +02004032
Maxim Levitsky782ce792010-02-22 20:39:36 +02004033 if (unlikely(oob)) {
4034 size_t len = min(oobwritelen, oobmaxlen);
Boris Brezillon08136212018-11-11 08:55:03 +01004035 oob = nand_fill_oob(chip, oob, len, ops);
Maxim Levitsky782ce792010-02-22 20:39:36 +02004036 oobwritelen -= len;
THOMSON, Adam (Adam)f722013e2011-06-14 16:52:38 +02004037 } else {
4038 /* We still need to erase leftover OOB data */
4039 memset(chip->oob_poi, 0xff, mtd->oobsize);
Maxim Levitsky782ce792010-02-22 20:39:36 +02004040 }
Boris Brezillonf107d7a2017-03-16 09:02:42 +01004041
Boris Brezillon08136212018-11-11 08:55:03 +01004042 ret = nand_write_page(chip, column, bytes, wbuf,
Boris Brezillon0b4773fd2017-05-16 00:17:41 +02004043 oob_required, page,
Boris Brezillonf107d7a2017-03-16 09:02:42 +01004044 (ops->mode == MTD_OPS_RAW));
Thomas Gleixnerf75e5092006-05-26 18:52:08 +02004045 if (ret)
4046 break;
4047
4048 writelen -= bytes;
4049 if (!writelen)
4050 break;
4051
Thomas Gleixner29072b92006-09-28 15:38:36 +02004052 column = 0;
Thomas Gleixnerf75e5092006-05-26 18:52:08 +02004053 buf += bytes;
4054 realpage++;
4055
4056 page = realpage & chip->pagemask;
4057 /* Check, if we cross a chip boundary */
4058 if (!page) {
4059 chipnr++;
Boris Brezillon1d017852018-11-11 08:55:14 +01004060 nand_deselect_target(chip);
4061 nand_select_target(chip, chipnr);
Thomas Gleixnerf75e5092006-05-26 18:52:08 +02004062 }
4063 }
Thomas Gleixner8593fbc2006-05-29 03:26:58 +02004064
Thomas Gleixner8593fbc2006-05-29 03:26:58 +02004065 ops->retlen = ops->len - writelen;
Vitaly Wool70145682006-11-03 18:20:38 +03004066 if (unlikely(oob))
4067 ops->oobretlen = ops->ooblen;
Huang Shijieb0bb6902012-11-19 14:43:29 +08004068
4069err_out:
Boris Brezillon1d017852018-11-11 08:55:14 +01004070 nand_deselect_target(chip);
Thomas Gleixnerf75e5092006-05-26 18:52:08 +02004071 return ret;
4072}
4073
4074/**
Simon Kagstrom2af7c652009-10-05 15:55:52 +02004075 * panic_nand_write - [MTD Interface] NAND write with ECC
Brian Norris8b6e50c2011-05-25 14:59:01 -07004076 * @mtd: MTD device structure
4077 * @to: offset to write to
4078 * @len: number of bytes to write
4079 * @retlen: pointer to variable to store the number of written bytes
4080 * @buf: the data to write
Simon Kagstrom2af7c652009-10-05 15:55:52 +02004081 *
4082 * NAND write with ECC. Used when performing writes in interrupt context, this
4083 * may for example be called by mtdoops when writing an oops while in panic.
4084 */
4085static int panic_nand_write(struct mtd_info *mtd, loff_t to, size_t len,
4086 size_t *retlen, const uint8_t *buf)
4087{
Boris BREZILLON862eba52015-12-01 12:03:03 +01004088 struct nand_chip *chip = mtd_to_nand(mtd);
Brent Taylor30863e382017-10-30 22:32:45 -05004089 int chipnr = (int)(to >> chip->chip_shift);
Brian Norris4a89ff82011-08-30 18:45:45 -07004090 struct mtd_oob_ops ops;
Simon Kagstrom2af7c652009-10-05 15:55:52 +02004091 int ret;
4092
Boris Brezillon1d017852018-11-11 08:55:14 +01004093 nand_select_target(chip, chipnr);
Brent Taylor30863e382017-10-30 22:32:45 -05004094
4095 /* Wait for the device to get ready */
Boris Brezillonf1d46942018-09-06 14:05:29 +02004096 panic_nand_wait(chip, 400);
Brent Taylor30863e382017-10-30 22:32:45 -05004097
Brian Norris0ec56dc2015-02-28 02:02:30 -08004098 memset(&ops, 0, sizeof(ops));
Brian Norris4a89ff82011-08-30 18:45:45 -07004099 ops.len = len;
4100 ops.datbuf = (uint8_t *)buf;
Huang Shijie11041ae62012-07-03 16:44:14 +08004101 ops.mode = MTD_OPS_PLACE_OOB;
Simon Kagstrom2af7c652009-10-05 15:55:52 +02004102
Boris Brezillon08136212018-11-11 08:55:03 +01004103 ret = nand_do_write_ops(chip, to, &ops);
Simon Kagstrom2af7c652009-10-05 15:55:52 +02004104
Brian Norris4a89ff82011-08-30 18:45:45 -07004105 *retlen = ops.retlen;
Simon Kagstrom2af7c652009-10-05 15:55:52 +02004106 return ret;
4107}
4108
4109/**
Thomas Gleixner8593fbc2006-05-29 03:26:58 +02004110 * nand_write_oob - [MTD Interface] NAND write data and/or out-of-band
Brian Norris8b6e50c2011-05-25 14:59:01 -07004111 * @mtd: MTD device structure
4112 * @to: offset to write to
4113 * @ops: oob operation description structure
Thomas Gleixner8593fbc2006-05-29 03:26:58 +02004114 */
4115static int nand_write_oob(struct mtd_info *mtd, loff_t to,
4116 struct mtd_oob_ops *ops)
4117{
Boris Brezillon08136212018-11-11 08:55:03 +01004118 struct nand_chip *chip = mtd_to_nand(mtd);
Thomas Gleixner8593fbc2006-05-29 03:26:58 +02004119 int ret = -ENOTSUPP;
4120
4121 ops->retlen = 0;
4122
Boris Brezillon013e6292018-11-20 11:57:20 +01004123 ret = nand_get_device(chip);
4124 if (ret)
4125 return ret;
Thomas Gleixner8593fbc2006-05-29 03:26:58 +02004126
Florian Fainellif8ac0412010-09-07 13:23:43 +02004127 switch (ops->mode) {
Brian Norris0612b9d2011-08-30 18:45:40 -07004128 case MTD_OPS_PLACE_OOB:
4129 case MTD_OPS_AUTO_OOB:
4130 case MTD_OPS_RAW:
Thomas Gleixner8593fbc2006-05-29 03:26:58 +02004131 break;
4132
4133 default:
4134 goto out;
4135 }
4136
4137 if (!ops->datbuf)
Boris Brezillon08136212018-11-11 08:55:03 +01004138 ret = nand_do_write_oob(chip, to, ops);
Thomas Gleixner8593fbc2006-05-29 03:26:58 +02004139 else
Boris Brezillon08136212018-11-11 08:55:03 +01004140 ret = nand_do_write_ops(chip, to, ops);
Thomas Gleixner8593fbc2006-05-29 03:26:58 +02004141
Florian Fainelli7351d3a2010-09-07 13:23:45 +02004142out:
Boris Brezillon08136212018-11-11 08:55:03 +01004143 nand_release_device(chip);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004144 return ret;
4145}
4146
Linus Torvalds1da177e2005-04-16 15:20:36 -07004147/**
Linus Torvalds1da177e2005-04-16 15:20:36 -07004148 * nand_erase - [MTD Interface] erase block(s)
Brian Norris8b6e50c2011-05-25 14:59:01 -07004149 * @mtd: MTD device structure
4150 * @instr: erase instruction
Linus Torvalds1da177e2005-04-16 15:20:36 -07004151 *
Brian Norris8b6e50c2011-05-25 14:59:01 -07004152 * Erase one ore more blocks.
Linus Torvalds1da177e2005-04-16 15:20:36 -07004153 */
David Woodhousee0c7d762006-05-13 18:07:53 +01004154static int nand_erase(struct mtd_info *mtd, struct erase_info *instr)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004155{
Boris Brezillone4cdf9c2018-09-06 14:05:35 +02004156 return nand_erase_nand(mtd_to_nand(mtd), instr, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004157}
Thomas Gleixner61b03bd2005-11-07 11:15:49 +00004158
Linus Torvalds1da177e2005-04-16 15:20:36 -07004159/**
Brian Norris7854d3f2011-06-23 14:12:08 -07004160 * nand_erase_nand - [INTERN] erase block(s)
Boris Brezillone4cdf9c2018-09-06 14:05:35 +02004161 * @chip: NAND chip object
Brian Norris8b6e50c2011-05-25 14:59:01 -07004162 * @instr: erase instruction
4163 * @allowbbt: allow erasing the bbt area
Linus Torvalds1da177e2005-04-16 15:20:36 -07004164 *
Brian Norris8b6e50c2011-05-25 14:59:01 -07004165 * Erase one ore more blocks.
Linus Torvalds1da177e2005-04-16 15:20:36 -07004166 */
Boris Brezillone4cdf9c2018-09-06 14:05:35 +02004167int nand_erase_nand(struct nand_chip *chip, struct erase_info *instr,
Thomas Gleixnerace4dfe2006-05-24 12:07:37 +02004168 int allowbbt)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004169{
Masahiro Yamada2d73f3d2019-01-21 15:32:07 +09004170 int page, pages_per_block, ret, chipnr;
Adrian Hunter69423d92008-12-10 13:37:21 +00004171 loff_t len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004172
Brian Norris289c0522011-07-19 10:06:09 -07004173 pr_debug("%s: start = 0x%012llx, len = %llu\n",
4174 __func__, (unsigned long long)instr->addr,
4175 (unsigned long long)instr->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004176
Boris Brezillon08136212018-11-11 08:55:03 +01004177 if (check_offs_len(chip, instr->addr, instr->len))
Linus Torvalds1da177e2005-04-16 15:20:36 -07004178 return -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004179
Linus Torvalds1da177e2005-04-16 15:20:36 -07004180 /* Grab the lock and see if the device is available */
Boris Brezillon013e6292018-11-20 11:57:20 +01004181 ret = nand_get_device(chip);
4182 if (ret)
4183 return ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004184
4185 /* Shift to get first page */
Thomas Gleixnerace4dfe2006-05-24 12:07:37 +02004186 page = (int)(instr->addr >> chip->page_shift);
4187 chipnr = (int)(instr->addr >> chip->chip_shift);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004188
4189 /* Calculate pages in each block */
Thomas Gleixnerace4dfe2006-05-24 12:07:37 +02004190 pages_per_block = 1 << (chip->phys_erase_shift - chip->page_shift);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004191
4192 /* Select the NAND device */
Boris Brezillon1d017852018-11-11 08:55:14 +01004193 nand_select_target(chip, chipnr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004194
Linus Torvalds1da177e2005-04-16 15:20:36 -07004195 /* Check, if it is write protected */
Boris Brezillon08136212018-11-11 08:55:03 +01004196 if (nand_check_wp(chip)) {
Brian Norris289c0522011-07-19 10:06:09 -07004197 pr_debug("%s: device is write protected!\n",
4198 __func__);
Boris Brezillone7bfb3f2018-02-12 22:03:11 +01004199 ret = -EIO;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004200 goto erase_exit;
4201 }
4202
4203 /* Loop through the pages */
4204 len = instr->len;
4205
Linus Torvalds1da177e2005-04-16 15:20:36 -07004206 while (len) {
Wolfram Sang12183a22011-12-21 23:01:20 +01004207 /* Check if we have a bad block, we do not erase bad blocks! */
Boris Brezillon08136212018-11-11 08:55:03 +01004208 if (nand_block_checkbad(chip, ((loff_t) page) <<
Archit Taneja9f3e0422016-02-03 14:29:49 +05304209 chip->page_shift, allowbbt)) {
Brian Norrisd0370212011-07-19 10:06:08 -07004210 pr_warn("%s: attempt to erase a bad block at page 0x%08x\n",
4211 __func__, page);
Boris Brezillone7bfb3f2018-02-12 22:03:11 +01004212 ret = -EIO;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004213 goto erase_exit;
4214 }
Thomas Gleixner61b03bd2005-11-07 11:15:49 +00004215
Thomas Gleixnerace4dfe2006-05-24 12:07:37 +02004216 /*
4217 * Invalidate the page cache, if we erase the block which
Brian Norris8b6e50c2011-05-25 14:59:01 -07004218 * contains the current cached page.
Thomas Gleixnerace4dfe2006-05-24 12:07:37 +02004219 */
Boris Brezillond9745412018-10-28 16:12:45 +01004220 if (page <= chip->pagecache.page && chip->pagecache.page <
Thomas Gleixnerace4dfe2006-05-24 12:07:37 +02004221 (page + pages_per_block))
Boris Brezillond9745412018-10-28 16:12:45 +01004222 chip->pagecache.page = -1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004223
Masahiro Yamada2d73f3d2019-01-21 15:32:07 +09004224 ret = nand_erase_op(chip, (page & chip->pagemask) >>
4225 (chip->phys_erase_shift - chip->page_shift));
4226 if (ret) {
Brian Norris289c0522011-07-19 10:06:09 -07004227 pr_debug("%s: failed erase, page 0x%08x\n",
4228 __func__, page);
Adrian Hunter69423d92008-12-10 13:37:21 +00004229 instr->fail_addr =
4230 ((loff_t)page << chip->page_shift);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004231 goto erase_exit;
4232 }
David A. Marlin30f464b2005-01-17 18:35:25 +00004233
Linus Torvalds1da177e2005-04-16 15:20:36 -07004234 /* Increment page address and decrement length */
Dan Carpenterdaae74c2013-08-09 12:49:05 +03004235 len -= (1ULL << chip->phys_erase_shift);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004236 page += pages_per_block;
4237
4238 /* Check, if we cross a chip boundary */
Thomas Gleixnerace4dfe2006-05-24 12:07:37 +02004239 if (len && !(page & chip->pagemask)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07004240 chipnr++;
Boris Brezillon1d017852018-11-11 08:55:14 +01004241 nand_deselect_target(chip);
4242 nand_select_target(chip, chipnr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004243 }
4244 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004245
Boris Brezillone7bfb3f2018-02-12 22:03:11 +01004246 ret = 0;
Florian Fainelli7351d3a2010-09-07 13:23:45 +02004247erase_exit:
Linus Torvalds1da177e2005-04-16 15:20:36 -07004248
Linus Torvalds1da177e2005-04-16 15:20:36 -07004249 /* Deselect and wake up anyone waiting on the device */
Boris Brezillon1d017852018-11-11 08:55:14 +01004250 nand_deselect_target(chip);
Boris Brezillon08136212018-11-11 08:55:03 +01004251 nand_release_device(chip);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004252
Linus Torvalds1da177e2005-04-16 15:20:36 -07004253 /* Return more or less happy */
4254 return ret;
4255}
4256
4257/**
4258 * nand_sync - [MTD Interface] sync
Brian Norris8b6e50c2011-05-25 14:59:01 -07004259 * @mtd: MTD device structure
Linus Torvalds1da177e2005-04-16 15:20:36 -07004260 *
Brian Norris8b6e50c2011-05-25 14:59:01 -07004261 * Sync is actually a wait for chip ready function.
Linus Torvalds1da177e2005-04-16 15:20:36 -07004262 */
David Woodhousee0c7d762006-05-13 18:07:53 +01004263static void nand_sync(struct mtd_info *mtd)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004264{
Boris Brezillon08136212018-11-11 08:55:03 +01004265 struct nand_chip *chip = mtd_to_nand(mtd);
4266
Brian Norris289c0522011-07-19 10:06:09 -07004267 pr_debug("%s: called\n", __func__);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004268
4269 /* Grab the lock and see if the device is available */
Boris Brezillon013e6292018-11-20 11:57:20 +01004270 WARN_ON(nand_get_device(chip));
Linus Torvalds1da177e2005-04-16 15:20:36 -07004271 /* Release it and go back */
Boris Brezillon08136212018-11-11 08:55:03 +01004272 nand_release_device(chip);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004273}
4274
Linus Torvalds1da177e2005-04-16 15:20:36 -07004275/**
Thomas Gleixnerace4dfe2006-05-24 12:07:37 +02004276 * nand_block_isbad - [MTD Interface] Check if block at offset is bad
Brian Norris8b6e50c2011-05-25 14:59:01 -07004277 * @mtd: MTD device structure
4278 * @offs: offset relative to mtd start
Linus Torvalds1da177e2005-04-16 15:20:36 -07004279 */
Thomas Gleixnerace4dfe2006-05-24 12:07:37 +02004280static int nand_block_isbad(struct mtd_info *mtd, loff_t offs)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004281{
Archit Taneja9f3e0422016-02-03 14:29:49 +05304282 struct nand_chip *chip = mtd_to_nand(mtd);
4283 int chipnr = (int)(offs >> chip->chip_shift);
4284 int ret;
4285
4286 /* Select the NAND device */
Boris Brezillon013e6292018-11-20 11:57:20 +01004287 ret = nand_get_device(chip);
4288 if (ret)
4289 return ret;
4290
Boris Brezillon1d017852018-11-11 08:55:14 +01004291 nand_select_target(chip, chipnr);
Archit Taneja9f3e0422016-02-03 14:29:49 +05304292
Boris Brezillon08136212018-11-11 08:55:03 +01004293 ret = nand_block_checkbad(chip, offs, 0);
Archit Taneja9f3e0422016-02-03 14:29:49 +05304294
Boris Brezillon1d017852018-11-11 08:55:14 +01004295 nand_deselect_target(chip);
Boris Brezillon08136212018-11-11 08:55:03 +01004296 nand_release_device(chip);
Archit Taneja9f3e0422016-02-03 14:29:49 +05304297
4298 return ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004299}
4300
4301/**
Thomas Gleixnerace4dfe2006-05-24 12:07:37 +02004302 * nand_block_markbad - [MTD Interface] Mark block at the given offset as bad
Brian Norris8b6e50c2011-05-25 14:59:01 -07004303 * @mtd: MTD device structure
4304 * @ofs: offset relative to mtd start
Linus Torvalds1da177e2005-04-16 15:20:36 -07004305 */
David Woodhousee0c7d762006-05-13 18:07:53 +01004306static int nand_block_markbad(struct mtd_info *mtd, loff_t ofs)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004307{
Linus Torvalds1da177e2005-04-16 15:20:36 -07004308 int ret;
4309
Florian Fainellif8ac0412010-09-07 13:23:43 +02004310 ret = nand_block_isbad(mtd, ofs);
4311 if (ret) {
Brian Norris8b6e50c2011-05-25 14:59:01 -07004312 /* If it was bad already, return success and do nothing */
Linus Torvalds1da177e2005-04-16 15:20:36 -07004313 if (ret > 0)
4314 return 0;
David Woodhousee0c7d762006-05-13 18:07:53 +01004315 return ret;
4316 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004317
Boris Brezillon08136212018-11-11 08:55:03 +01004318 return nand_block_markbad_lowlevel(mtd_to_nand(mtd), ofs);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004319}
4320
4321/**
Vitaly Wool962034f2005-09-15 14:58:53 +01004322 * nand_suspend - [MTD Interface] Suspend the NAND flash
Brian Norris8b6e50c2011-05-25 14:59:01 -07004323 * @mtd: MTD device structure
Vitaly Wool962034f2005-09-15 14:58:53 +01004324 */
4325static int nand_suspend(struct mtd_info *mtd)
4326{
Boris Brezillon013e6292018-11-20 11:57:20 +01004327 struct nand_chip *chip = mtd_to_nand(mtd);
4328
4329 mutex_lock(&chip->lock);
4330 chip->suspended = 1;
4331 mutex_unlock(&chip->lock);
4332
4333 return 0;
Vitaly Wool962034f2005-09-15 14:58:53 +01004334}
4335
4336/**
4337 * nand_resume - [MTD Interface] Resume the NAND flash
Brian Norris8b6e50c2011-05-25 14:59:01 -07004338 * @mtd: MTD device structure
Vitaly Wool962034f2005-09-15 14:58:53 +01004339 */
4340static void nand_resume(struct mtd_info *mtd)
4341{
Boris BREZILLON862eba52015-12-01 12:03:03 +01004342 struct nand_chip *chip = mtd_to_nand(mtd);
Vitaly Wool962034f2005-09-15 14:58:53 +01004343
Boris Brezillon013e6292018-11-20 11:57:20 +01004344 mutex_lock(&chip->lock);
4345 if (chip->suspended)
4346 chip->suspended = 0;
Vitaly Wool962034f2005-09-15 14:58:53 +01004347 else
Brian Norrisd0370212011-07-19 10:06:08 -07004348 pr_err("%s called for a chip which is not in suspended state\n",
4349 __func__);
Boris Brezillon013e6292018-11-20 11:57:20 +01004350 mutex_unlock(&chip->lock);
Vitaly Wool962034f2005-09-15 14:58:53 +01004351}
4352
Scott Branden72ea4032014-11-20 11:18:05 -08004353/**
4354 * nand_shutdown - [MTD Interface] Finish the current NAND operation and
4355 * prevent further operations
4356 * @mtd: MTD device structure
4357 */
4358static void nand_shutdown(struct mtd_info *mtd)
4359{
Boris Brezillon013e6292018-11-20 11:57:20 +01004360 nand_suspend(mtd);
Scott Branden72ea4032014-11-20 11:18:05 -08004361}
4362
Brian Norris8b6e50c2011-05-25 14:59:01 -07004363/* Set default functions */
Boris Brezillon29a198a2016-05-24 20:17:48 +02004364static void nand_set_defaults(struct nand_chip *chip)
Thomas Gleixner7aa65bf2006-05-23 11:54:38 +02004365{
Boris Brezillon7b6a9b22018-11-20 10:02:39 +01004366 /* If no controller is provided, use the dummy, legacy one. */
Thomas Gleixnerf75e5092006-05-26 18:52:08 +02004367 if (!chip->controller) {
Boris Brezillon7b6a9b22018-11-20 10:02:39 +01004368 chip->controller = &chip->legacy.dummy_controller;
Miquel Raynal7da45132018-07-17 09:08:02 +02004369 nand_controller_init(chip->controller);
Thomas Gleixnerf75e5092006-05-26 18:52:08 +02004370 }
4371
Boris Brezillonf2abfeb2018-11-11 08:55:23 +01004372 nand_legacy_set_defaults(chip);
4373
Masahiro Yamada477544c2017-03-30 17:15:05 +09004374 if (!chip->buf_align)
4375 chip->buf_align = 1;
Thomas Gleixner7aa65bf2006-05-23 11:54:38 +02004376}
4377
Brian Norris8b6e50c2011-05-25 14:59:01 -07004378/* Sanitize ONFI strings so we can safely print them */
Boris Brezillon1c325cc2018-09-07 00:38:50 +02004379void sanitize_string(uint8_t *s, size_t len)
Florian Fainellid1e1f4e2010-08-30 18:32:24 +02004380{
4381 ssize_t i;
4382
Brian Norris8b6e50c2011-05-25 14:59:01 -07004383 /* Null terminate */
Florian Fainellid1e1f4e2010-08-30 18:32:24 +02004384 s[len - 1] = 0;
4385
Brian Norris8b6e50c2011-05-25 14:59:01 -07004386 /* Remove non printable chars */
Florian Fainellid1e1f4e2010-08-30 18:32:24 +02004387 for (i = 0; i < len - 1; i++) {
4388 if (s[i] < ' ' || s[i] > 127)
4389 s[i] = '?';
4390 }
4391
Brian Norris8b6e50c2011-05-25 14:59:01 -07004392 /* Remove trailing spaces */
Florian Fainellid1e1f4e2010-08-30 18:32:24 +02004393 strim(s);
4394}
4395
Florian Fainelli6fb277b2010-09-01 22:28:59 +02004396/*
Brian Norrise3b88bd2012-09-24 20:40:52 -07004397 * nand_id_has_period - Check if an ID string has a given wraparound period
4398 * @id_data: the ID string
4399 * @arrlen: the length of the @id_data array
4400 * @period: the period of repitition
4401 *
4402 * Check if an ID string is repeated within a given sequence of bytes at
4403 * specific repetition interval period (e.g., {0x20,0x01,0x7F,0x20} has a
Brian Norrisd4d4f1b2012-11-14 21:54:20 -08004404 * period of 3). This is a helper function for nand_id_len(). Returns non-zero
Brian Norrise3b88bd2012-09-24 20:40:52 -07004405 * if the repetition has a period of @period; otherwise, returns zero.
4406 */
4407static int nand_id_has_period(u8 *id_data, int arrlen, int period)
4408{
4409 int i, j;
4410 for (i = 0; i < period; i++)
4411 for (j = i + period; j < arrlen; j += period)
4412 if (id_data[i] != id_data[j])
4413 return 0;
4414 return 1;
4415}
4416
4417/*
4418 * nand_id_len - Get the length of an ID string returned by CMD_READID
4419 * @id_data: the ID string
4420 * @arrlen: the length of the @id_data array
4421
4422 * Returns the length of the ID string, according to known wraparound/trailing
4423 * zero patterns. If no pattern exists, returns the length of the array.
4424 */
4425static int nand_id_len(u8 *id_data, int arrlen)
4426{
4427 int last_nonzero, period;
4428
4429 /* Find last non-zero byte */
4430 for (last_nonzero = arrlen - 1; last_nonzero >= 0; last_nonzero--)
4431 if (id_data[last_nonzero])
4432 break;
4433
4434 /* All zeros */
4435 if (last_nonzero < 0)
4436 return 0;
4437
4438 /* Calculate wraparound period */
4439 for (period = 1; period < arrlen; period++)
4440 if (nand_id_has_period(id_data, arrlen, period))
4441 break;
4442
4443 /* There's a repeated pattern */
4444 if (period < arrlen)
4445 return period;
4446
4447 /* There are trailing zeros */
4448 if (last_nonzero < arrlen - 1)
4449 return last_nonzero + 1;
4450
4451 /* No pattern detected */
4452 return arrlen;
4453}
4454
Huang Shijie7db906b2013-09-25 14:58:11 +08004455/* Extract the bits of per cell from the 3rd byte of the extended ID */
4456static int nand_get_bits_per_cell(u8 cellinfo)
4457{
4458 int bits;
4459
4460 bits = cellinfo & NAND_CI_CELLTYPE_MSK;
4461 bits >>= NAND_CI_CELLTYPE_SHIFT;
4462 return bits + 1;
4463}
4464
Brian Norrise3b88bd2012-09-24 20:40:52 -07004465/*
Brian Norrisfc09bbc2012-09-24 20:40:50 -07004466 * Many new NAND share similar device ID codes, which represent the size of the
4467 * chip. The rest of the parameters must be decoded according to generic or
4468 * manufacturer-specific "extended ID" decoding patterns.
4469 */
Boris Brezillonabbe26d2016-06-08 09:32:55 +02004470void nand_decode_ext_id(struct nand_chip *chip)
Brian Norrisfc09bbc2012-09-24 20:40:50 -07004471{
Boris Brezillon629a4422018-10-25 17:10:37 +02004472 struct nand_memory_organization *memorg;
Boris Brezilloncbe435a2016-05-24 16:56:22 +02004473 struct mtd_info *mtd = nand_to_mtd(chip);
Boris Brezillon9b2d61f2016-06-08 10:34:57 +02004474 int extid;
Boris Brezillon7f501f02016-05-24 19:20:05 +02004475 u8 *id_data = chip->id.data;
Boris Brezillon629a4422018-10-25 17:10:37 +02004476
4477 memorg = nanddev_get_memorg(&chip->base);
4478
Brian Norrisfc09bbc2012-09-24 20:40:50 -07004479 /* The 3rd id byte holds MLC / multichip data */
Boris Brezillon629a4422018-10-25 17:10:37 +02004480 memorg->bits_per_cell = nand_get_bits_per_cell(id_data[2]);
Brian Norrisfc09bbc2012-09-24 20:40:50 -07004481 /* The 4th id byte is the important one */
4482 extid = id_data[3];
4483
Boris Brezillon01389b62016-06-08 10:30:18 +02004484 /* Calc pagesize */
Boris Brezillon629a4422018-10-25 17:10:37 +02004485 memorg->pagesize = 1024 << (extid & 0x03);
4486 mtd->writesize = memorg->pagesize;
Boris Brezillon01389b62016-06-08 10:30:18 +02004487 extid >>= 2;
4488 /* Calc oobsize */
Boris Brezillon629a4422018-10-25 17:10:37 +02004489 memorg->oobsize = (8 << (extid & 0x01)) * (mtd->writesize >> 9);
4490 mtd->oobsize = memorg->oobsize;
Boris Brezillon01389b62016-06-08 10:30:18 +02004491 extid >>= 2;
4492 /* Calc blocksize. Blocksize is multiples of 64KiB */
Boris Brezillon629a4422018-10-25 17:10:37 +02004493 memorg->pages_per_eraseblock = ((64 * 1024) << (extid & 0x03)) /
4494 memorg->pagesize;
Boris Brezillon01389b62016-06-08 10:30:18 +02004495 mtd->erasesize = (64 * 1024) << (extid & 0x03);
4496 extid >>= 2;
4497 /* Get buswidth information */
4498 if (extid & 0x1)
4499 chip->options |= NAND_BUSWIDTH_16;
Brian Norrisfc09bbc2012-09-24 20:40:50 -07004500}
Boris Brezillonabbe26d2016-06-08 09:32:55 +02004501EXPORT_SYMBOL_GPL(nand_decode_ext_id);
Brian Norrisfc09bbc2012-09-24 20:40:50 -07004502
4503/*
Brian Norrisf23a4812012-09-24 20:40:51 -07004504 * Old devices have chip data hardcoded in the device ID table. nand_decode_id
4505 * decodes a matching ID table entry and assigns the MTD size parameters for
4506 * the chip.
4507 */
Boris Brezillon29a198a2016-05-24 20:17:48 +02004508static void nand_decode_id(struct nand_chip *chip, struct nand_flash_dev *type)
Brian Norrisf23a4812012-09-24 20:40:51 -07004509{
Boris Brezilloncbe435a2016-05-24 16:56:22 +02004510 struct mtd_info *mtd = nand_to_mtd(chip);
Boris Brezillon629a4422018-10-25 17:10:37 +02004511 struct nand_memory_organization *memorg;
Brian Norrisf23a4812012-09-24 20:40:51 -07004512
Boris Brezillon629a4422018-10-25 17:10:37 +02004513 memorg = nanddev_get_memorg(&chip->base);
4514
4515 memorg->pages_per_eraseblock = type->erasesize / type->pagesize;
Brian Norrisf23a4812012-09-24 20:40:51 -07004516 mtd->erasesize = type->erasesize;
Boris Brezillon629a4422018-10-25 17:10:37 +02004517 memorg->pagesize = type->pagesize;
4518 mtd->writesize = memorg->pagesize;
4519 memorg->oobsize = memorg->pagesize / 32;
4520 mtd->oobsize = memorg->oobsize;
Brian Norrisf23a4812012-09-24 20:40:51 -07004521
Huang Shijie1c195e92013-09-25 14:58:12 +08004522 /* All legacy ID NAND are small-page, SLC */
Boris Brezillon629a4422018-10-25 17:10:37 +02004523 memorg->bits_per_cell = 1;
Brian Norrisf23a4812012-09-24 20:40:51 -07004524}
4525
4526/*
Brian Norris7e74c2d2012-09-24 20:40:49 -07004527 * Set the bad block marker/indicator (BBM/BBI) patterns according to some
4528 * heuristic patterns using various detected parameters (e.g., manufacturer,
4529 * page size, cell-type information).
4530 */
Boris Brezillon7f501f02016-05-24 19:20:05 +02004531static void nand_decode_bbm_options(struct nand_chip *chip)
Brian Norris7e74c2d2012-09-24 20:40:49 -07004532{
Boris Brezilloncbe435a2016-05-24 16:56:22 +02004533 struct mtd_info *mtd = nand_to_mtd(chip);
Brian Norris7e74c2d2012-09-24 20:40:49 -07004534
4535 /* Set the bad block position */
4536 if (mtd->writesize > 512 || (chip->options & NAND_BUSWIDTH_16))
Frieder Schrempf04649ec2019-04-17 12:36:34 +00004537 chip->badblockpos = NAND_BBM_POS_LARGE;
Brian Norris7e74c2d2012-09-24 20:40:49 -07004538 else
Frieder Schrempf04649ec2019-04-17 12:36:34 +00004539 chip->badblockpos = NAND_BBM_POS_SMALL;
Brian Norris7e74c2d2012-09-24 20:40:49 -07004540}
4541
Huang Shijieec6e87e2013-03-15 11:01:00 +08004542static inline bool is_full_id_nand(struct nand_flash_dev *type)
4543{
4544 return type->id_len;
4545}
4546
Boris Brezilloncbe435a2016-05-24 16:56:22 +02004547static bool find_full_id_nand(struct nand_chip *chip,
Boris Brezillon29a198a2016-05-24 20:17:48 +02004548 struct nand_flash_dev *type)
Huang Shijieec6e87e2013-03-15 11:01:00 +08004549{
Boris Brezilloncbe435a2016-05-24 16:56:22 +02004550 struct mtd_info *mtd = nand_to_mtd(chip);
Boris Brezillon629a4422018-10-25 17:10:37 +02004551 struct nand_memory_organization *memorg;
Boris Brezillon7f501f02016-05-24 19:20:05 +02004552 u8 *id_data = chip->id.data;
Boris Brezilloncbe435a2016-05-24 16:56:22 +02004553
Boris Brezillon629a4422018-10-25 17:10:37 +02004554 memorg = nanddev_get_memorg(&chip->base);
Huang Shijieec6e87e2013-03-15 11:01:00 +08004555
Boris Brezillon629a4422018-10-25 17:10:37 +02004556 if (!strncmp(type->id, id_data, type->id_len)) {
4557 memorg->pagesize = type->pagesize;
4558 mtd->writesize = memorg->pagesize;
4559 memorg->pages_per_eraseblock = type->erasesize /
4560 type->pagesize;
4561 mtd->erasesize = type->erasesize;
4562 memorg->oobsize = type->oobsize;
4563 mtd->oobsize = memorg->oobsize;
4564
4565 memorg->bits_per_cell = nand_get_bits_per_cell(id_data[2]);
Boris Brezillon629a4422018-10-25 17:10:37 +02004566 memorg->eraseblocks_per_lun =
4567 DIV_ROUND_DOWN_ULL((u64)type->chipsize << 20,
4568 memorg->pagesize *
4569 memorg->pages_per_eraseblock);
Huang Shijieec6e87e2013-03-15 11:01:00 +08004570 chip->options |= type->options;
Boris Brezillon6a1b66d2018-11-04 16:09:42 +01004571 chip->base.eccreq.strength = NAND_ECC_STRENGTH(type);
4572 chip->base.eccreq.step_size = NAND_ECC_STEP(type);
Boris BREZILLON57a94e22014-09-22 20:11:50 +02004573 chip->onfi_timing_mode_default =
4574 type->onfi_timing_mode_default;
Huang Shijieec6e87e2013-03-15 11:01:00 +08004575
Miquel Raynal2023f1fa2018-07-25 15:31:51 +02004576 chip->parameters.model = kstrdup(type->name, GFP_KERNEL);
4577 if (!chip->parameters.model)
4578 return false;
Cai Zhiyong092b6a12013-12-25 21:19:21 +08004579
Huang Shijieec6e87e2013-03-15 11:01:00 +08004580 return true;
4581 }
4582 return false;
4583}
4584
Brian Norris7e74c2d2012-09-24 20:40:49 -07004585/*
Boris Brezillonabbe26d2016-06-08 09:32:55 +02004586 * Manufacturer detection. Only used when the NAND is not ONFI or JEDEC
4587 * compliant and does not have a full-id or legacy-id entry in the nand_ids
4588 * table.
4589 */
4590static void nand_manufacturer_detect(struct nand_chip *chip)
4591{
4592 /*
4593 * Try manufacturer detection if available and use
4594 * nand_decode_ext_id() otherwise.
4595 */
4596 if (chip->manufacturer.desc && chip->manufacturer.desc->ops &&
Lothar Waßmann69fc0122017-08-29 12:17:12 +02004597 chip->manufacturer.desc->ops->detect) {
Boris Brezillon629a4422018-10-25 17:10:37 +02004598 struct nand_memory_organization *memorg;
4599
4600 memorg = nanddev_get_memorg(&chip->base);
4601
Lothar Waßmann69fc0122017-08-29 12:17:12 +02004602 /* The 3rd id byte holds MLC / multichip data */
Boris Brezillon629a4422018-10-25 17:10:37 +02004603 memorg->bits_per_cell = nand_get_bits_per_cell(chip->id.data[2]);
Boris Brezillonabbe26d2016-06-08 09:32:55 +02004604 chip->manufacturer.desc->ops->detect(chip);
Lothar Waßmann69fc0122017-08-29 12:17:12 +02004605 } else {
Boris Brezillonabbe26d2016-06-08 09:32:55 +02004606 nand_decode_ext_id(chip);
Lothar Waßmann69fc0122017-08-29 12:17:12 +02004607 }
Boris Brezillonabbe26d2016-06-08 09:32:55 +02004608}
4609
4610/*
4611 * Manufacturer initialization. This function is called for all NANDs including
4612 * ONFI and JEDEC compliant ones.
4613 * Manufacturer drivers should put all their specific initialization code in
4614 * their ->init() hook.
4615 */
4616static int nand_manufacturer_init(struct nand_chip *chip)
4617{
4618 if (!chip->manufacturer.desc || !chip->manufacturer.desc->ops ||
4619 !chip->manufacturer.desc->ops->init)
4620 return 0;
4621
4622 return chip->manufacturer.desc->ops->init(chip);
4623}
4624
4625/*
4626 * Manufacturer cleanup. This function is called for all NANDs including
4627 * ONFI and JEDEC compliant ones.
4628 * Manufacturer drivers should put all their specific cleanup code in their
4629 * ->cleanup() hook.
4630 */
4631static void nand_manufacturer_cleanup(struct nand_chip *chip)
4632{
4633 /* Release manufacturer private data */
4634 if (chip->manufacturer.desc && chip->manufacturer.desc->ops &&
4635 chip->manufacturer.desc->ops->cleanup)
4636 chip->manufacturer.desc->ops->cleanup(chip);
4637}
4638
Boris Brezillon348d56a2018-09-07 00:38:48 +02004639static const char *
4640nand_manufacturer_name(const struct nand_manufacturer *manufacturer)
4641{
4642 return manufacturer ? manufacturer->name : "Unknown";
4643}
4644
Boris Brezillonabbe26d2016-06-08 09:32:55 +02004645/*
Brian Norris8b6e50c2011-05-25 14:59:01 -07004646 * Get the flash and manufacturer id and lookup if the type is supported.
Thomas Gleixner7aa65bf2006-05-23 11:54:38 +02004647 */
Boris Brezillon7bb42792016-05-24 20:55:33 +02004648static int nand_detect(struct nand_chip *chip, struct nand_flash_dev *type)
Thomas Gleixner7aa65bf2006-05-23 11:54:38 +02004649{
Boris Brezillonbcc678c2017-01-07 15:48:25 +01004650 const struct nand_manufacturer *manufacturer;
Boris Brezilloncbe435a2016-05-24 16:56:22 +02004651 struct mtd_info *mtd = nand_to_mtd(chip);
Boris Brezillon629a4422018-10-25 17:10:37 +02004652 struct nand_memory_organization *memorg;
Boris Brezillon97d90da2017-11-30 18:01:29 +01004653 int busw, ret;
Boris Brezillon7f501f02016-05-24 19:20:05 +02004654 u8 *id_data = chip->id.data;
4655 u8 maf_id, dev_id;
Boris Brezillon6c836d52018-10-29 11:22:16 +01004656 u64 targetsize;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004657
Karl Beldanef89a882008-09-15 14:37:29 +02004658 /*
Boris Brezillon629a4422018-10-25 17:10:37 +02004659 * Let's start by initializing memorg fields that might be left
4660 * unassigned by the ID-based detection logic.
4661 */
4662 memorg = nanddev_get_memorg(&chip->base);
4663 memorg->planes_per_lun = 1;
4664 memorg->luns_per_target = 1;
4665 memorg->ntargets = 1;
4666
4667 /*
Karl Beldanef89a882008-09-15 14:37:29 +02004668 * Reset the chip, required by some chips (e.g. Micron MT29FxGxxxxx)
Brian Norris8b6e50c2011-05-25 14:59:01 -07004669 * after power-up.
Karl Beldanef89a882008-09-15 14:37:29 +02004670 */
Boris Brezillon97d90da2017-11-30 18:01:29 +01004671 ret = nand_reset(chip, 0);
4672 if (ret)
4673 return ret;
Boris Brezillon73f907f2016-10-24 16:46:20 +02004674
4675 /* Select the device */
Boris Brezillon1d017852018-11-11 08:55:14 +01004676 nand_select_target(chip, 0);
Karl Beldanef89a882008-09-15 14:37:29 +02004677
Linus Torvalds1da177e2005-04-16 15:20:36 -07004678 /* Send the command for reading device ID */
Boris Brezillon97d90da2017-11-30 18:01:29 +01004679 ret = nand_readid_op(chip, 0, id_data, 2);
4680 if (ret)
4681 return ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004682
4683 /* Read manufacturer and device IDs */
Boris Brezillon97d90da2017-11-30 18:01:29 +01004684 maf_id = id_data[0];
4685 dev_id = id_data[1];
Linus Torvalds1da177e2005-04-16 15:20:36 -07004686
Brian Norris8b6e50c2011-05-25 14:59:01 -07004687 /*
4688 * Try again to make sure, as some systems the bus-hold or other
Ben Dooksed8165c2008-04-14 14:58:58 +01004689 * interface concerns can cause random data which looks like a
4690 * possibly credible NAND flash to appear. If the two results do
4691 * not match, ignore the device completely.
4692 */
4693
Brian Norris4aef9b72012-09-24 20:40:48 -07004694 /* Read entire ID string */
Boris Brezillon97d90da2017-11-30 18:01:29 +01004695 ret = nand_readid_op(chip, 0, id_data, sizeof(chip->id.data));
4696 if (ret)
4697 return ret;
Ben Dooksed8165c2008-04-14 14:58:58 +01004698
Boris Brezillon7f501f02016-05-24 19:20:05 +02004699 if (id_data[0] != maf_id || id_data[1] != dev_id) {
Ezequiel Garcia20171642013-11-25 08:30:31 -03004700 pr_info("second ID read did not match %02x,%02x against %02x,%02x\n",
Boris Brezillon7f501f02016-05-24 19:20:05 +02004701 maf_id, dev_id, id_data[0], id_data[1]);
Masahiro Yamada4722c0e2016-11-04 17:49:08 +09004702 return -ENODEV;
Ben Dooksed8165c2008-04-14 14:58:58 +01004703 }
4704
Jean-Louis Thekekara5158bd52017-06-29 19:08:30 +02004705 chip->id.len = nand_id_len(id_data, ARRAY_SIZE(chip->id.data));
Boris Brezillon7f501f02016-05-24 19:20:05 +02004706
Boris Brezillonabbe26d2016-06-08 09:32:55 +02004707 /* Try to identify manufacturer */
4708 manufacturer = nand_get_manufacturer(maf_id);
4709 chip->manufacturer.desc = manufacturer;
4710
Thomas Gleixner7aa65bf2006-05-23 11:54:38 +02004711 if (!type)
David Woodhouse5e81e882010-02-26 18:32:56 +00004712 type = nand_flash_ids;
4713
Boris Brezillon29a198a2016-05-24 20:17:48 +02004714 /*
4715 * Save the NAND_BUSWIDTH_16 flag before letting auto-detection logic
4716 * override it.
4717 * This is required to make sure initial NAND bus width set by the
4718 * NAND controller driver is coherent with the real NAND bus width
4719 * (extracted by auto-detection code).
4720 */
4721 busw = chip->options & NAND_BUSWIDTH_16;
4722
4723 /*
4724 * The flag is only set (never cleared), reset it to its default value
4725 * before starting auto-detection.
4726 */
4727 chip->options &= ~NAND_BUSWIDTH_16;
4728
Huang Shijieec6e87e2013-03-15 11:01:00 +08004729 for (; type->name != NULL; type++) {
4730 if (is_full_id_nand(type)) {
Boris Brezillon29a198a2016-05-24 20:17:48 +02004731 if (find_full_id_nand(chip, type))
Huang Shijieec6e87e2013-03-15 11:01:00 +08004732 goto ident_done;
Boris Brezillon7f501f02016-05-24 19:20:05 +02004733 } else if (dev_id == type->dev_id) {
Brian Norrisdb5b09f2015-05-22 10:43:12 -07004734 break;
Huang Shijieec6e87e2013-03-15 11:01:00 +08004735 }
4736 }
David Woodhouse5e81e882010-02-26 18:32:56 +00004737
Florian Fainellid1e1f4e2010-08-30 18:32:24 +02004738 if (!type->name || !type->pagesize) {
Masahiro Yamada35fc5192014-04-09 16:26:26 +09004739 /* Check if the chip is ONFI compliant */
Boris Brezillon1c325cc2018-09-07 00:38:50 +02004740 ret = nand_onfi_detect(chip);
Miquel Raynalbd0b6432018-03-19 14:47:31 +01004741 if (ret < 0)
4742 return ret;
4743 else if (ret)
Florian Fainelli6fb277b2010-09-01 22:28:59 +02004744 goto ident_done;
Huang Shijie91361812014-02-21 13:39:40 +08004745
4746 /* Check if the chip is JEDEC compliant */
Boris Brezillon8ae3fbf2018-09-07 00:38:51 +02004747 ret = nand_jedec_detect(chip);
Miquel Raynal480139d2018-03-19 14:47:30 +01004748 if (ret < 0)
4749 return ret;
4750 else if (ret)
Huang Shijie91361812014-02-21 13:39:40 +08004751 goto ident_done;
Florian Fainellid1e1f4e2010-08-30 18:32:24 +02004752 }
4753
David Woodhouse5e81e882010-02-26 18:32:56 +00004754 if (!type->name)
Masahiro Yamada4722c0e2016-11-04 17:49:08 +09004755 return -ENODEV;
Thomas Gleixner7aa65bf2006-05-23 11:54:38 +02004756
Miquel Raynal2023f1fa2018-07-25 15:31:51 +02004757 chip->parameters.model = kstrdup(type->name, GFP_KERNEL);
4758 if (!chip->parameters.model)
4759 return -ENOMEM;
Thomas Gleixnerba0251fe2006-05-27 01:02:13 +02004760
Boris Brezillonabbe26d2016-06-08 09:32:55 +02004761 if (!type->pagesize)
4762 nand_manufacturer_detect(chip);
4763 else
Boris Brezillon29a198a2016-05-24 20:17:48 +02004764 nand_decode_id(chip, type);
Boris Brezillonabbe26d2016-06-08 09:32:55 +02004765
Brian Norrisbf7a01b2012-07-13 09:28:24 -07004766 /* Get chip options */
4767 chip->options |= type->options;
Florian Fainellid1e1f4e2010-08-30 18:32:24 +02004768
Boris Brezillon629a4422018-10-25 17:10:37 +02004769 memorg->eraseblocks_per_lun =
4770 DIV_ROUND_DOWN_ULL((u64)type->chipsize << 20,
4771 memorg->pagesize *
4772 memorg->pages_per_eraseblock);
4773
Florian Fainellid1e1f4e2010-08-30 18:32:24 +02004774ident_done:
Miquel Raynalf4531b22018-03-19 14:47:26 +01004775 if (!mtd->name)
4776 mtd->name = chip->parameters.model;
Florian Fainellid1e1f4e2010-08-30 18:32:24 +02004777
Matthieu CASTET64b37b22012-11-06 11:51:44 +01004778 if (chip->options & NAND_BUSWIDTH_AUTO) {
Boris Brezillon29a198a2016-05-24 20:17:48 +02004779 WARN_ON(busw & NAND_BUSWIDTH_16);
4780 nand_set_defaults(chip);
Matthieu CASTET64b37b22012-11-06 11:51:44 +01004781 } else if (busw != (chip->options & NAND_BUSWIDTH_16)) {
4782 /*
4783 * Check, if buswidth is correct. Hardware drivers should set
4784 * chip correct!
4785 */
Ezequiel Garcia20171642013-11-25 08:30:31 -03004786 pr_info("device found, Manufacturer ID: 0x%02x, Chip ID: 0x%02x\n",
Boris Brezillon7f501f02016-05-24 19:20:05 +02004787 maf_id, dev_id);
Boris Brezillonbcc678c2017-01-07 15:48:25 +01004788 pr_info("%s %s\n", nand_manufacturer_name(manufacturer),
4789 mtd->name);
Boris Brezillon29a198a2016-05-24 20:17:48 +02004790 pr_warn("bus width %d instead of %d bits\n", busw ? 16 : 8,
4791 (chip->options & NAND_BUSWIDTH_16) ? 16 : 8);
Miquel Raynal2023f1fa2018-07-25 15:31:51 +02004792 ret = -EINVAL;
4793
4794 goto free_detect_allocation;
Thomas Gleixner7aa65bf2006-05-23 11:54:38 +02004795 }
4796
Boris Brezillon7f501f02016-05-24 19:20:05 +02004797 nand_decode_bbm_options(chip);
Brian Norris7e74c2d2012-09-24 20:40:49 -07004798
Thomas Gleixner7aa65bf2006-05-23 11:54:38 +02004799 /* Calculate the address shift from the page size */
Thomas Gleixnerace4dfe2006-05-24 12:07:37 +02004800 chip->page_shift = ffs(mtd->writesize) - 1;
Brian Norris8b6e50c2011-05-25 14:59:01 -07004801 /* Convert chipsize to number of pages per chip -1 */
Boris Brezillon6c836d52018-10-29 11:22:16 +01004802 targetsize = nanddev_target_size(&chip->base);
4803 chip->pagemask = (targetsize >> chip->page_shift) - 1;
Thomas Gleixner7aa65bf2006-05-23 11:54:38 +02004804
Thomas Gleixnerace4dfe2006-05-24 12:07:37 +02004805 chip->bbt_erase_shift = chip->phys_erase_shift =
Thomas Gleixner7aa65bf2006-05-23 11:54:38 +02004806 ffs(mtd->erasesize) - 1;
Boris Brezillon6c836d52018-10-29 11:22:16 +01004807 if (targetsize & 0xffffffff)
4808 chip->chip_shift = ffs((unsigned)targetsize) - 1;
Florian Fainelli7351d3a2010-09-07 13:23:45 +02004809 else {
Boris Brezillon6c836d52018-10-29 11:22:16 +01004810 chip->chip_shift = ffs((unsigned)(targetsize >> 32));
Florian Fainelli7351d3a2010-09-07 13:23:45 +02004811 chip->chip_shift += 32 - 1;
4812 }
Thomas Gleixner7aa65bf2006-05-23 11:54:38 +02004813
Masahiro Yamada14157f82017-09-13 11:05:50 +09004814 if (chip->chip_shift - chip->page_shift > 16)
4815 chip->options |= NAND_ROW_ADDR_3;
4816
Artem Bityutskiy26d9be12011-04-28 20:26:59 +03004817 chip->badblockbits = 8;
Thomas Gleixner7aa65bf2006-05-23 11:54:38 +02004818
Boris Brezillon3d4af7c2018-09-07 00:38:49 +02004819 nand_legacy_adjust_cmdfunc(chip);
Thomas Gleixner7aa65bf2006-05-23 11:54:38 +02004820
Ezequiel Garcia20171642013-11-25 08:30:31 -03004821 pr_info("device found, Manufacturer ID: 0x%02x, Chip ID: 0x%02x\n",
Boris Brezillon7f501f02016-05-24 19:20:05 +02004822 maf_id, dev_id);
Miquel Raynalf4531b22018-03-19 14:47:26 +01004823 pr_info("%s %s\n", nand_manufacturer_name(manufacturer),
4824 chip->parameters.model);
Rafał Miłecki3755a992014-10-21 00:01:04 +02004825 pr_info("%d MiB, %s, erase size: %d KiB, page size: %d, OOB size: %d\n",
Boris Brezillon6c836d52018-10-29 11:22:16 +01004826 (int)(targetsize >> 20), nand_is_slc(chip) ? "SLC" : "MLC",
Rafał Miłecki3755a992014-10-21 00:01:04 +02004827 mtd->erasesize >> 10, mtd->writesize, mtd->oobsize);
Masahiro Yamada4722c0e2016-11-04 17:49:08 +09004828 return 0;
Miquel Raynal2023f1fa2018-07-25 15:31:51 +02004829
4830free_detect_allocation:
4831 kfree(chip->parameters.model);
4832
4833 return ret;
Thomas Gleixner7aa65bf2006-05-23 11:54:38 +02004834}
4835
Boris Brezillond48f62b2016-04-01 14:54:32 +02004836static const char * const nand_ecc_modes[] = {
4837 [NAND_ECC_NONE] = "none",
4838 [NAND_ECC_SOFT] = "soft",
4839 [NAND_ECC_HW] = "hw",
4840 [NAND_ECC_HW_SYNDROME] = "hw_syndrome",
4841 [NAND_ECC_HW_OOB_FIRST] = "hw_oob_first",
Thomas Petazzoni785818f2017-04-29 11:06:43 +02004842 [NAND_ECC_ON_DIE] = "on-die",
Boris Brezillond48f62b2016-04-01 14:54:32 +02004843};
4844
4845static int of_get_nand_ecc_mode(struct device_node *np)
4846{
4847 const char *pm;
4848 int err, i;
4849
4850 err = of_property_read_string(np, "nand-ecc-mode", &pm);
4851 if (err < 0)
4852 return err;
4853
4854 for (i = 0; i < ARRAY_SIZE(nand_ecc_modes); i++)
4855 if (!strcasecmp(pm, nand_ecc_modes[i]))
4856 return i;
4857
Rafał Miłeckiae211bc2016-04-17 22:53:06 +02004858 /*
4859 * For backward compatibility we support few obsoleted values that don't
4860 * have their mappings into nand_ecc_modes_t anymore (they were merged
4861 * with other enums).
4862 */
4863 if (!strcasecmp(pm, "soft_bch"))
4864 return NAND_ECC_SOFT;
4865
Boris Brezillond48f62b2016-04-01 14:54:32 +02004866 return -ENODEV;
4867}
4868
Rafał Miłeckiba4f46b2016-04-22 13:23:13 +02004869static const char * const nand_ecc_algos[] = {
4870 [NAND_ECC_HAMMING] = "hamming",
4871 [NAND_ECC_BCH] = "bch",
Stefan Agnerf308d732018-06-24 23:27:22 +02004872 [NAND_ECC_RS] = "rs",
Rafał Miłeckiba4f46b2016-04-22 13:23:13 +02004873};
4874
Boris Brezillond48f62b2016-04-01 14:54:32 +02004875static int of_get_nand_ecc_algo(struct device_node *np)
4876{
4877 const char *pm;
Rafał Miłeckiba4f46b2016-04-22 13:23:13 +02004878 int err, i;
Boris Brezillond48f62b2016-04-01 14:54:32 +02004879
Rafał Miłeckiba4f46b2016-04-22 13:23:13 +02004880 err = of_property_read_string(np, "nand-ecc-algo", &pm);
4881 if (!err) {
4882 for (i = NAND_ECC_HAMMING; i < ARRAY_SIZE(nand_ecc_algos); i++)
4883 if (!strcasecmp(pm, nand_ecc_algos[i]))
4884 return i;
4885 return -ENODEV;
4886 }
Boris Brezillond48f62b2016-04-01 14:54:32 +02004887
4888 /*
4889 * For backward compatibility we also read "nand-ecc-mode" checking
4890 * for some obsoleted values that were specifying ECC algorithm.
4891 */
4892 err = of_property_read_string(np, "nand-ecc-mode", &pm);
4893 if (err < 0)
4894 return err;
4895
4896 if (!strcasecmp(pm, "soft"))
4897 return NAND_ECC_HAMMING;
4898 else if (!strcasecmp(pm, "soft_bch"))
4899 return NAND_ECC_BCH;
4900
4901 return -ENODEV;
4902}
4903
4904static int of_get_nand_ecc_step_size(struct device_node *np)
4905{
4906 int ret;
4907 u32 val;
4908
4909 ret = of_property_read_u32(np, "nand-ecc-step-size", &val);
4910 return ret ? ret : val;
4911}
4912
4913static int of_get_nand_ecc_strength(struct device_node *np)
4914{
4915 int ret;
4916 u32 val;
4917
4918 ret = of_property_read_u32(np, "nand-ecc-strength", &val);
4919 return ret ? ret : val;
4920}
4921
4922static int of_get_nand_bus_width(struct device_node *np)
4923{
4924 u32 val;
4925
4926 if (of_property_read_u32(np, "nand-bus-width", &val))
4927 return 8;
4928
4929 switch (val) {
4930 case 8:
4931 case 16:
4932 return val;
4933 default:
4934 return -EIO;
4935 }
4936}
4937
4938static bool of_get_nand_on_flash_bbt(struct device_node *np)
4939{
4940 return of_property_read_bool(np, "nand-on-flash-bbt");
4941}
4942
Boris BREZILLON7194a29a2015-12-10 09:00:37 +01004943static int nand_dt_init(struct nand_chip *chip)
Brian Norris5844fee2015-01-23 00:22:27 -08004944{
Boris BREZILLON7194a29a2015-12-10 09:00:37 +01004945 struct device_node *dn = nand_get_flash_node(chip);
Rafał Miłecki79082452016-03-23 11:19:02 +01004946 int ecc_mode, ecc_algo, ecc_strength, ecc_step;
Brian Norris5844fee2015-01-23 00:22:27 -08004947
Boris BREZILLON7194a29a2015-12-10 09:00:37 +01004948 if (!dn)
4949 return 0;
4950
Brian Norris5844fee2015-01-23 00:22:27 -08004951 if (of_get_nand_bus_width(dn) == 16)
4952 chip->options |= NAND_BUSWIDTH_16;
4953
Stefan Agnerf922bd72018-06-24 23:27:23 +02004954 if (of_property_read_bool(dn, "nand-is-boot-medium"))
4955 chip->options |= NAND_IS_BOOT_MEDIUM;
4956
Brian Norris5844fee2015-01-23 00:22:27 -08004957 if (of_get_nand_on_flash_bbt(dn))
4958 chip->bbt_options |= NAND_BBT_USE_FLASH;
4959
4960 ecc_mode = of_get_nand_ecc_mode(dn);
Rafał Miłecki79082452016-03-23 11:19:02 +01004961 ecc_algo = of_get_nand_ecc_algo(dn);
Brian Norris5844fee2015-01-23 00:22:27 -08004962 ecc_strength = of_get_nand_ecc_strength(dn);
4963 ecc_step = of_get_nand_ecc_step_size(dn);
4964
Brian Norris5844fee2015-01-23 00:22:27 -08004965 if (ecc_mode >= 0)
4966 chip->ecc.mode = ecc_mode;
4967
Rafał Miłecki79082452016-03-23 11:19:02 +01004968 if (ecc_algo >= 0)
4969 chip->ecc.algo = ecc_algo;
4970
Brian Norris5844fee2015-01-23 00:22:27 -08004971 if (ecc_strength >= 0)
4972 chip->ecc.strength = ecc_strength;
4973
4974 if (ecc_step > 0)
4975 chip->ecc.size = ecc_step;
4976
Boris Brezillonba78ee02016-06-08 17:04:22 +02004977 if (of_property_read_bool(dn, "nand-ecc-maximize"))
4978 chip->ecc.options |= NAND_ECC_MAXIMIZE;
4979
Brian Norris5844fee2015-01-23 00:22:27 -08004980 return 0;
4981}
4982
Thomas Gleixner7aa65bf2006-05-23 11:54:38 +02004983/**
Miquel Raynal98732da2018-07-25 15:31:50 +02004984 * nand_scan_ident - Scan for the NAND device
Boris Brezillon00ad3782018-09-06 14:05:14 +02004985 * @chip: NAND chip object
Brian Norris8b6e50c2011-05-25 14:59:01 -07004986 * @maxchips: number of chips to scan for
4987 * @table: alternative NAND ID table
Thomas Gleixner7aa65bf2006-05-23 11:54:38 +02004988 *
Brian Norris8b6e50c2011-05-25 14:59:01 -07004989 * This is the first phase of the normal nand_scan() function. It reads the
4990 * flash ID and sets up MTD fields accordingly.
Thomas Gleixner7aa65bf2006-05-23 11:54:38 +02004991 *
Miquel Raynal98732da2018-07-25 15:31:50 +02004992 * This helper used to be called directly from controller drivers that needed
4993 * to tweak some ECC-related parameters before nand_scan_tail(). This separation
4994 * prevented dynamic allocations during this phase which was unconvenient and
4995 * as been banned for the benefit of the ->init_ecc()/cleanup_ecc() hooks.
Thomas Gleixner7aa65bf2006-05-23 11:54:38 +02004996 */
Boris Brezillon871a4072018-08-04 22:59:22 +02004997static int nand_scan_ident(struct nand_chip *chip, unsigned int maxchips,
Miquel Raynal98732da2018-07-25 15:31:50 +02004998 struct nand_flash_dev *table)
Thomas Gleixner7aa65bf2006-05-23 11:54:38 +02004999{
Boris Brezillon00ad3782018-09-06 14:05:14 +02005000 struct mtd_info *mtd = nand_to_mtd(chip);
Boris Brezillon629a4422018-10-25 17:10:37 +02005001 struct nand_memory_organization *memorg;
Boris Brezillon871a4072018-08-04 22:59:22 +02005002 int nand_maf_id, nand_dev_id;
5003 unsigned int i;
Brian Norris5844fee2015-01-23 00:22:27 -08005004 int ret;
5005
Boris Brezillon629a4422018-10-25 17:10:37 +02005006 memorg = nanddev_get_memorg(&chip->base);
5007
Boris Brezillonae2294b2018-11-11 08:55:15 +01005008 /* Assume all dies are deselected when we enter nand_scan_ident(). */
5009 chip->cur_cs = -1;
5010
Boris Brezillon013e6292018-11-20 11:57:20 +01005011 mutex_init(&chip->lock);
5012
Miquel Raynal17fa8042017-11-30 18:01:31 +01005013 /* Enforce the right timings for reset/detection */
5014 onfi_fill_data_interface(chip, NAND_SDR_IFACE, 0);
5015
Boris BREZILLON7194a29a2015-12-10 09:00:37 +01005016 ret = nand_dt_init(chip);
5017 if (ret)
5018 return ret;
Thomas Gleixner7aa65bf2006-05-23 11:54:38 +02005019
Brian Norrisf7a8e382016-01-05 10:39:45 -08005020 if (!mtd->name && mtd->dev.parent)
5021 mtd->name = dev_name(mtd->dev.parent);
5022
Thomas Gleixner7aa65bf2006-05-23 11:54:38 +02005023 /* Set the default functions */
Boris Brezillon29a198a2016-05-24 20:17:48 +02005024 nand_set_defaults(chip);
Thomas Gleixner7aa65bf2006-05-23 11:54:38 +02005025
Boris Brezillonf2abfeb2018-11-11 08:55:23 +01005026 ret = nand_legacy_check_hooks(chip);
5027 if (ret)
5028 return ret;
5029
Thomas Gleixner7aa65bf2006-05-23 11:54:38 +02005030 /* Read the flash type */
Boris Brezillon7bb42792016-05-24 20:55:33 +02005031 ret = nand_detect(chip, table);
Masahiro Yamada4722c0e2016-11-04 17:49:08 +09005032 if (ret) {
Ben Dooksb1c6e6d2009-11-02 18:12:33 +00005033 if (!(chip->options & NAND_SCAN_SILENT_NODEV))
Brian Norrisd0370212011-07-19 10:06:08 -07005034 pr_warn("No NAND device found\n");
Boris Brezillon1d017852018-11-11 08:55:14 +01005035 nand_deselect_target(chip);
Masahiro Yamada4722c0e2016-11-04 17:49:08 +09005036 return ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005037 }
5038
Boris Brezillon7f501f02016-05-24 19:20:05 +02005039 nand_maf_id = chip->id.data[0];
5040 nand_dev_id = chip->id.data[1];
5041
Boris Brezillon1d017852018-11-11 08:55:14 +01005042 nand_deselect_target(chip);
Huang Shijie07300162012-11-09 16:23:45 +08005043
Thomas Gleixner7aa65bf2006-05-23 11:54:38 +02005044 /* Check for a chip array */
David Woodhousee0c7d762006-05-13 18:07:53 +01005045 for (i = 1; i < maxchips; i++) {
Boris Brezillon97d90da2017-11-30 18:01:29 +01005046 u8 id[2];
5047
Karl Beldanef89a882008-09-15 14:37:29 +02005048 /* See comment in nand_get_flash_type for reset */
Masahiro Yamadaf9ffb402019-01-21 22:05:34 +09005049 ret = nand_reset(chip, i);
5050 if (ret)
5051 break;
Boris Brezillon73f907f2016-10-24 16:46:20 +02005052
Boris Brezillon1d017852018-11-11 08:55:14 +01005053 nand_select_target(chip, i);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005054 /* Send the command for reading device ID */
Masahiro Yamadaf9ffb402019-01-21 22:05:34 +09005055 ret = nand_readid_op(chip, 0, id, sizeof(id));
5056 if (ret)
5057 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005058 /* Read manufacturer and device IDs */
Boris Brezillon97d90da2017-11-30 18:01:29 +01005059 if (nand_maf_id != id[0] || nand_dev_id != id[1]) {
Boris Brezillon1d017852018-11-11 08:55:14 +01005060 nand_deselect_target(chip);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005061 break;
Huang Shijie07300162012-11-09 16:23:45 +08005062 }
Boris Brezillon1d017852018-11-11 08:55:14 +01005063 nand_deselect_target(chip);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005064 }
5065 if (i > 1)
Ezequiel Garcia20171642013-11-25 08:30:31 -03005066 pr_info("%d chips detected\n", i);
Thomas Gleixner61b03bd2005-11-07 11:15:49 +00005067
Linus Torvalds1da177e2005-04-16 15:20:36 -07005068 /* Store the number of chips and calc total size for mtd */
Boris Brezillon629a4422018-10-25 17:10:37 +02005069 memorg->ntargets = i;
Boris Brezillon6c836d52018-10-29 11:22:16 +01005070 mtd->size = i * nanddev_target_size(&chip->base);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005071
David Woodhouse3b85c322006-09-25 17:06:53 +01005072 return 0;
5073}
5074
Miquel Raynal2023f1fa2018-07-25 15:31:51 +02005075static void nand_scan_ident_cleanup(struct nand_chip *chip)
5076{
5077 kfree(chip->parameters.model);
Miquel Raynal3d3fe3c2018-07-25 15:31:52 +02005078 kfree(chip->parameters.onfi);
Miquel Raynal2023f1fa2018-07-25 15:31:51 +02005079}
5080
Boris Brezillon08136212018-11-11 08:55:03 +01005081static int nand_set_ecc_soft_ops(struct nand_chip *chip)
Rafał Miłecki06f384c2016-04-17 22:53:05 +02005082{
Boris Brezillon08136212018-11-11 08:55:03 +01005083 struct mtd_info *mtd = nand_to_mtd(chip);
Rafał Miłecki06f384c2016-04-17 22:53:05 +02005084 struct nand_ecc_ctrl *ecc = &chip->ecc;
5085
Rafał Miłeckie4225ae2016-04-17 22:53:07 +02005086 if (WARN_ON(ecc->mode != NAND_ECC_SOFT))
Rafał Miłecki06f384c2016-04-17 22:53:05 +02005087 return -EINVAL;
5088
5089 switch (ecc->algo) {
5090 case NAND_ECC_HAMMING:
5091 ecc->calculate = nand_calculate_ecc;
5092 ecc->correct = nand_correct_data;
5093 ecc->read_page = nand_read_page_swecc;
5094 ecc->read_subpage = nand_read_subpage;
5095 ecc->write_page = nand_write_page_swecc;
5096 ecc->read_page_raw = nand_read_page_raw;
5097 ecc->write_page_raw = nand_write_page_raw;
5098 ecc->read_oob = nand_read_oob_std;
5099 ecc->write_oob = nand_write_oob_std;
5100 if (!ecc->size)
5101 ecc->size = 256;
5102 ecc->bytes = 3;
5103 ecc->strength = 1;
Boris Brezillon309600c2018-09-04 16:23:28 +02005104
Miquel Raynal9bb94642019-02-08 08:48:37 +01005105 if (IS_ENABLED(CONFIG_MTD_NAND_ECC_SW_HAMMING_SMC))
Boris Brezillon309600c2018-09-04 16:23:28 +02005106 ecc->options |= NAND_ECC_SOFT_HAMMING_SM_ORDER;
5107
Rafał Miłecki06f384c2016-04-17 22:53:05 +02005108 return 0;
5109 case NAND_ECC_BCH:
5110 if (!mtd_nand_has_bch()) {
Miquel Raynal714c0682019-02-06 15:12:27 +01005111 WARN(1, "CONFIG_MTD_NAND_ECC_SW_BCH not enabled\n");
Rafał Miłecki06f384c2016-04-17 22:53:05 +02005112 return -EINVAL;
5113 }
5114 ecc->calculate = nand_bch_calculate_ecc;
5115 ecc->correct = nand_bch_correct_data;
5116 ecc->read_page = nand_read_page_swecc;
5117 ecc->read_subpage = nand_read_subpage;
5118 ecc->write_page = nand_write_page_swecc;
5119 ecc->read_page_raw = nand_read_page_raw;
5120 ecc->write_page_raw = nand_write_page_raw;
5121 ecc->read_oob = nand_read_oob_std;
5122 ecc->write_oob = nand_write_oob_std;
Boris Brezillon8bbba482016-06-08 17:04:23 +02005123
Rafał Miłecki06f384c2016-04-17 22:53:05 +02005124 /*
5125 * Board driver should supply ecc.size and ecc.strength
5126 * values to select how many bits are correctable.
5127 * Otherwise, default to 4 bits for large page devices.
5128 */
5129 if (!ecc->size && (mtd->oobsize >= 64)) {
5130 ecc->size = 512;
5131 ecc->strength = 4;
5132 }
5133
5134 /*
5135 * if no ecc placement scheme was provided pickup the default
5136 * large page one.
5137 */
5138 if (!mtd->ooblayout) {
5139 /* handle large page devices only */
5140 if (mtd->oobsize < 64) {
5141 WARN(1, "OOB layout is required when using software BCH on small pages\n");
5142 return -EINVAL;
5143 }
5144
5145 mtd_set_ooblayout(mtd, &nand_ooblayout_lp_ops);
Boris Brezillon8bbba482016-06-08 17:04:23 +02005146
5147 }
5148
5149 /*
5150 * We can only maximize ECC config when the default layout is
5151 * used, otherwise we don't know how many bytes can really be
5152 * used.
5153 */
5154 if (mtd->ooblayout == &nand_ooblayout_lp_ops &&
5155 ecc->options & NAND_ECC_MAXIMIZE) {
5156 int steps, bytes;
5157
5158 /* Always prefer 1k blocks over 512bytes ones */
5159 ecc->size = 1024;
5160 steps = mtd->writesize / ecc->size;
5161
5162 /* Reserve 2 bytes for the BBM */
5163 bytes = (mtd->oobsize - 2) / steps;
5164 ecc->strength = bytes * 8 / fls(8 * ecc->size);
Rafał Miłecki06f384c2016-04-17 22:53:05 +02005165 }
5166
5167 /* See nand_bch_init() for details. */
5168 ecc->bytes = 0;
5169 ecc->priv = nand_bch_init(mtd);
5170 if (!ecc->priv) {
5171 WARN(1, "BCH ECC initialization failed!\n");
5172 return -EINVAL;
5173 }
5174 return 0;
5175 default:
5176 WARN(1, "Unsupported ECC algorithm!\n");
5177 return -EINVAL;
5178 }
5179}
5180
Masahiro Yamada2c8f8af2017-06-07 20:52:10 +09005181/**
5182 * nand_check_ecc_caps - check the sanity of preset ECC settings
5183 * @chip: nand chip info structure
5184 * @caps: ECC caps info structure
5185 * @oobavail: OOB size that the ECC engine can use
5186 *
5187 * When ECC step size and strength are already set, check if they are supported
5188 * by the controller and the calculated ECC bytes fit within the chip's OOB.
5189 * On success, the calculated ECC bytes is set.
5190 */
Abhishek Sahu0cf5c7d2018-06-20 12:57:42 +05305191static int
5192nand_check_ecc_caps(struct nand_chip *chip,
5193 const struct nand_ecc_caps *caps, int oobavail)
Masahiro Yamada2c8f8af2017-06-07 20:52:10 +09005194{
5195 struct mtd_info *mtd = nand_to_mtd(chip);
5196 const struct nand_ecc_step_info *stepinfo;
5197 int preset_step = chip->ecc.size;
5198 int preset_strength = chip->ecc.strength;
Abhishek Sahu0cf5c7d2018-06-20 12:57:42 +05305199 int ecc_bytes, nsteps = mtd->writesize / preset_step;
Masahiro Yamada2c8f8af2017-06-07 20:52:10 +09005200 int i, j;
5201
Masahiro Yamada2c8f8af2017-06-07 20:52:10 +09005202 for (i = 0; i < caps->nstepinfos; i++) {
5203 stepinfo = &caps->stepinfos[i];
5204
5205 if (stepinfo->stepsize != preset_step)
5206 continue;
5207
5208 for (j = 0; j < stepinfo->nstrengths; j++) {
5209 if (stepinfo->strengths[j] != preset_strength)
5210 continue;
5211
5212 ecc_bytes = caps->calc_ecc_bytes(preset_step,
5213 preset_strength);
5214 if (WARN_ON_ONCE(ecc_bytes < 0))
5215 return ecc_bytes;
5216
5217 if (ecc_bytes * nsteps > oobavail) {
5218 pr_err("ECC (step, strength) = (%d, %d) does not fit in OOB",
5219 preset_step, preset_strength);
5220 return -ENOSPC;
5221 }
5222
5223 chip->ecc.bytes = ecc_bytes;
5224
5225 return 0;
5226 }
5227 }
5228
5229 pr_err("ECC (step, strength) = (%d, %d) not supported on this controller",
5230 preset_step, preset_strength);
5231
5232 return -ENOTSUPP;
5233}
Masahiro Yamada2c8f8af2017-06-07 20:52:10 +09005234
5235/**
5236 * nand_match_ecc_req - meet the chip's requirement with least ECC bytes
5237 * @chip: nand chip info structure
5238 * @caps: ECC engine caps info structure
5239 * @oobavail: OOB size that the ECC engine can use
5240 *
5241 * If a chip's ECC requirement is provided, try to meet it with the least
5242 * number of ECC bytes (i.e. with the largest number of OOB-free bytes).
5243 * On success, the chosen ECC settings are set.
5244 */
Abhishek Sahu0cf5c7d2018-06-20 12:57:42 +05305245static int
5246nand_match_ecc_req(struct nand_chip *chip,
5247 const struct nand_ecc_caps *caps, int oobavail)
Masahiro Yamada2c8f8af2017-06-07 20:52:10 +09005248{
5249 struct mtd_info *mtd = nand_to_mtd(chip);
5250 const struct nand_ecc_step_info *stepinfo;
Boris Brezillon6a1b66d2018-11-04 16:09:42 +01005251 int req_step = chip->base.eccreq.step_size;
5252 int req_strength = chip->base.eccreq.strength;
Masahiro Yamada2c8f8af2017-06-07 20:52:10 +09005253 int req_corr, step_size, strength, nsteps, ecc_bytes, ecc_bytes_total;
5254 int best_step, best_strength, best_ecc_bytes;
5255 int best_ecc_bytes_total = INT_MAX;
5256 int i, j;
5257
Masahiro Yamada2c8f8af2017-06-07 20:52:10 +09005258 /* No information provided by the NAND chip */
5259 if (!req_step || !req_strength)
5260 return -ENOTSUPP;
5261
5262 /* number of correctable bits the chip requires in a page */
5263 req_corr = mtd->writesize / req_step * req_strength;
5264
5265 for (i = 0; i < caps->nstepinfos; i++) {
5266 stepinfo = &caps->stepinfos[i];
5267 step_size = stepinfo->stepsize;
5268
5269 for (j = 0; j < stepinfo->nstrengths; j++) {
5270 strength = stepinfo->strengths[j];
5271
5272 /*
5273 * If both step size and strength are smaller than the
5274 * chip's requirement, it is not easy to compare the
5275 * resulted reliability.
5276 */
5277 if (step_size < req_step && strength < req_strength)
5278 continue;
5279
5280 if (mtd->writesize % step_size)
5281 continue;
5282
5283 nsteps = mtd->writesize / step_size;
5284
5285 ecc_bytes = caps->calc_ecc_bytes(step_size, strength);
5286 if (WARN_ON_ONCE(ecc_bytes < 0))
5287 continue;
5288 ecc_bytes_total = ecc_bytes * nsteps;
5289
5290 if (ecc_bytes_total > oobavail ||
5291 strength * nsteps < req_corr)
5292 continue;
5293
5294 /*
5295 * We assume the best is to meet the chip's requrement
5296 * with the least number of ECC bytes.
5297 */
5298 if (ecc_bytes_total < best_ecc_bytes_total) {
5299 best_ecc_bytes_total = ecc_bytes_total;
5300 best_step = step_size;
5301 best_strength = strength;
5302 best_ecc_bytes = ecc_bytes;
5303 }
5304 }
5305 }
5306
5307 if (best_ecc_bytes_total == INT_MAX)
5308 return -ENOTSUPP;
5309
5310 chip->ecc.size = best_step;
5311 chip->ecc.strength = best_strength;
5312 chip->ecc.bytes = best_ecc_bytes;
5313
5314 return 0;
5315}
Masahiro Yamada2c8f8af2017-06-07 20:52:10 +09005316
5317/**
5318 * nand_maximize_ecc - choose the max ECC strength available
5319 * @chip: nand chip info structure
5320 * @caps: ECC engine caps info structure
5321 * @oobavail: OOB size that the ECC engine can use
5322 *
5323 * Choose the max ECC strength that is supported on the controller, and can fit
5324 * within the chip's OOB. On success, the chosen ECC settings are set.
5325 */
Abhishek Sahu0cf5c7d2018-06-20 12:57:42 +05305326static int
5327nand_maximize_ecc(struct nand_chip *chip,
5328 const struct nand_ecc_caps *caps, int oobavail)
Masahiro Yamada2c8f8af2017-06-07 20:52:10 +09005329{
5330 struct mtd_info *mtd = nand_to_mtd(chip);
5331 const struct nand_ecc_step_info *stepinfo;
5332 int step_size, strength, nsteps, ecc_bytes, corr;
5333 int best_corr = 0;
5334 int best_step = 0;
5335 int best_strength, best_ecc_bytes;
5336 int i, j;
5337
Masahiro Yamada2c8f8af2017-06-07 20:52:10 +09005338 for (i = 0; i < caps->nstepinfos; i++) {
5339 stepinfo = &caps->stepinfos[i];
5340 step_size = stepinfo->stepsize;
5341
5342 /* If chip->ecc.size is already set, respect it */
5343 if (chip->ecc.size && step_size != chip->ecc.size)
5344 continue;
5345
5346 for (j = 0; j < stepinfo->nstrengths; j++) {
5347 strength = stepinfo->strengths[j];
5348
5349 if (mtd->writesize % step_size)
5350 continue;
5351
5352 nsteps = mtd->writesize / step_size;
5353
5354 ecc_bytes = caps->calc_ecc_bytes(step_size, strength);
5355 if (WARN_ON_ONCE(ecc_bytes < 0))
5356 continue;
5357
5358 if (ecc_bytes * nsteps > oobavail)
5359 continue;
5360
5361 corr = strength * nsteps;
5362
5363 /*
5364 * If the number of correctable bits is the same,
5365 * bigger step_size has more reliability.
5366 */
5367 if (corr > best_corr ||
5368 (corr == best_corr && step_size > best_step)) {
5369 best_corr = corr;
5370 best_step = step_size;
5371 best_strength = strength;
5372 best_ecc_bytes = ecc_bytes;
5373 }
5374 }
5375 }
5376
5377 if (!best_corr)
5378 return -ENOTSUPP;
5379
5380 chip->ecc.size = best_step;
5381 chip->ecc.strength = best_strength;
5382 chip->ecc.bytes = best_ecc_bytes;
5383
5384 return 0;
5385}
Masahiro Yamada2c8f8af2017-06-07 20:52:10 +09005386
Abhishek Sahu181ace92018-06-20 12:57:28 +05305387/**
5388 * nand_ecc_choose_conf - Set the ECC strength and ECC step size
5389 * @chip: nand chip info structure
5390 * @caps: ECC engine caps info structure
5391 * @oobavail: OOB size that the ECC engine can use
5392 *
5393 * Choose the ECC configuration according to following logic
5394 *
5395 * 1. If both ECC step size and ECC strength are already set (usually by DT)
5396 * then check if it is supported by this controller.
5397 * 2. If NAND_ECC_MAXIMIZE is set, then select maximum ECC strength.
5398 * 3. Otherwise, try to match the ECC step size and ECC strength closest
5399 * to the chip's requirement. If available OOB size can't fit the chip
5400 * requirement then fallback to the maximum ECC step size and ECC strength.
5401 *
5402 * On success, the chosen ECC settings are set.
5403 */
5404int nand_ecc_choose_conf(struct nand_chip *chip,
5405 const struct nand_ecc_caps *caps, int oobavail)
5406{
Abhishek Sahu0cf5c7d2018-06-20 12:57:42 +05305407 struct mtd_info *mtd = nand_to_mtd(chip);
5408
5409 if (WARN_ON(oobavail < 0 || oobavail > mtd->oobsize))
5410 return -EINVAL;
5411
Abhishek Sahu181ace92018-06-20 12:57:28 +05305412 if (chip->ecc.size && chip->ecc.strength)
5413 return nand_check_ecc_caps(chip, caps, oobavail);
5414
5415 if (chip->ecc.options & NAND_ECC_MAXIMIZE)
5416 return nand_maximize_ecc(chip, caps, oobavail);
5417
5418 if (!nand_match_ecc_req(chip, caps, oobavail))
5419 return 0;
5420
5421 return nand_maximize_ecc(chip, caps, oobavail);
5422}
5423EXPORT_SYMBOL_GPL(nand_ecc_choose_conf);
5424
Ezequiel Garcia67a9ad92014-05-14 14:58:06 -03005425/*
5426 * Check if the chip configuration meet the datasheet requirements.
5427
5428 * If our configuration corrects A bits per B bytes and the minimum
5429 * required correction level is X bits per Y bytes, then we must ensure
5430 * both of the following are true:
5431 *
5432 * (1) A / B >= X / Y
5433 * (2) A >= X
5434 *
5435 * Requirement (1) ensures we can correct for the required bitflip density.
5436 * Requirement (2) ensures we can correct even when all bitflips are clumped
5437 * in the same sector.
5438 */
Boris Brezillon08136212018-11-11 08:55:03 +01005439static bool nand_ecc_strength_good(struct nand_chip *chip)
Ezequiel Garcia67a9ad92014-05-14 14:58:06 -03005440{
Boris Brezillon08136212018-11-11 08:55:03 +01005441 struct mtd_info *mtd = nand_to_mtd(chip);
Ezequiel Garcia67a9ad92014-05-14 14:58:06 -03005442 struct nand_ecc_ctrl *ecc = &chip->ecc;
5443 int corr, ds_corr;
5444
Boris Brezillon6a1b66d2018-11-04 16:09:42 +01005445 if (ecc->size == 0 || chip->base.eccreq.step_size == 0)
Ezequiel Garcia67a9ad92014-05-14 14:58:06 -03005446 /* Not enough information */
5447 return true;
5448
5449 /*
5450 * We get the number of corrected bits per page to compare
5451 * the correction density.
5452 */
5453 corr = (mtd->writesize * ecc->strength) / ecc->size;
Boris Brezillon6a1b66d2018-11-04 16:09:42 +01005454 ds_corr = (mtd->writesize * chip->base.eccreq.strength) /
5455 chip->base.eccreq.step_size;
Ezequiel Garcia67a9ad92014-05-14 14:58:06 -03005456
Boris Brezillon6a1b66d2018-11-04 16:09:42 +01005457 return corr >= ds_corr && ecc->strength >= chip->base.eccreq.strength;
Ezequiel Garcia67a9ad92014-05-14 14:58:06 -03005458}
David Woodhouse3b85c322006-09-25 17:06:53 +01005459
Boris Brezillona7ab0852018-10-25 22:10:36 +02005460static int rawnand_erase(struct nand_device *nand, const struct nand_pos *pos)
5461{
5462 struct nand_chip *chip = container_of(nand, struct nand_chip,
5463 base);
5464 unsigned int eb = nanddev_pos_to_row(nand, pos);
5465 int ret;
5466
5467 eb >>= nand->rowconv.eraseblock_addr_shift;
5468
5469 nand_select_target(chip, pos->target);
5470 ret = nand_erase_op(chip, eb);
5471 nand_deselect_target(chip);
5472
5473 return ret;
5474}
5475
5476static int rawnand_markbad(struct nand_device *nand,
5477 const struct nand_pos *pos)
5478{
5479 struct nand_chip *chip = container_of(nand, struct nand_chip,
5480 base);
5481
5482 return nand_markbad_bbm(chip, nanddev_pos_to_offs(nand, pos));
5483}
5484
5485static bool rawnand_isbad(struct nand_device *nand, const struct nand_pos *pos)
5486{
5487 struct nand_chip *chip = container_of(nand, struct nand_chip,
5488 base);
5489 int ret;
5490
5491 nand_select_target(chip, pos->target);
5492 ret = nand_isbad_bbm(chip, nanddev_pos_to_offs(nand, pos));
5493 nand_deselect_target(chip);
5494
5495 return ret;
5496}
5497
5498static const struct nand_ops rawnand_ops = {
5499 .erase = rawnand_erase,
5500 .markbad = rawnand_markbad,
5501 .isbad = rawnand_isbad,
5502};
5503
David Woodhouse3b85c322006-09-25 17:06:53 +01005504/**
Miquel Raynal98732da2018-07-25 15:31:50 +02005505 * nand_scan_tail - Scan for the NAND device
Boris Brezillon00ad3782018-09-06 14:05:14 +02005506 * @chip: NAND chip object
David Woodhouse3b85c322006-09-25 17:06:53 +01005507 *
Brian Norris8b6e50c2011-05-25 14:59:01 -07005508 * This is the second phase of the normal nand_scan() function. It fills out
5509 * all the uninitialized function pointers with the defaults and scans for a
5510 * bad block table if appropriate.
David Woodhouse3b85c322006-09-25 17:06:53 +01005511 */
Boris Brezillon00ad3782018-09-06 14:05:14 +02005512static int nand_scan_tail(struct nand_chip *chip)
David Woodhouse3b85c322006-09-25 17:06:53 +01005513{
Boris Brezillon00ad3782018-09-06 14:05:14 +02005514 struct mtd_info *mtd = nand_to_mtd(chip);
Huang Shijie97de79e02013-10-18 14:20:53 +08005515 struct nand_ecc_ctrl *ecc = &chip->ecc;
Boris Brezillonf84674b2017-06-02 12:18:24 +02005516 int ret, i;
David Woodhouse3b85c322006-09-25 17:06:53 +01005517
Brian Norrise2414f42012-02-06 13:44:00 -08005518 /* New bad blocks should be marked in OOB, flash-based BBT, or both */
Ezequiel García11eaf6d2016-04-01 18:29:24 -03005519 if (WARN_ON((chip->bbt_options & NAND_BBT_NO_OOB_BBM) &&
Brian Norris78771042017-05-01 17:04:53 -07005520 !(chip->bbt_options & NAND_BBT_USE_FLASH))) {
Boris Brezillonf84674b2017-06-02 12:18:24 +02005521 return -EINVAL;
Brian Norris78771042017-05-01 17:04:53 -07005522 }
Brian Norrise2414f42012-02-06 13:44:00 -08005523
Masahiro Yamadac0313b92017-12-05 17:47:16 +09005524 chip->data_buf = kmalloc(mtd->writesize + mtd->oobsize, GFP_KERNEL);
Boris Brezillonaeb93af2017-12-05 12:09:29 +01005525 if (!chip->data_buf)
Boris Brezillonf84674b2017-06-02 12:18:24 +02005526 return -ENOMEM;
David Woodhouse4bf63fc2006-09-25 17:08:04 +01005527
Boris Brezillonf84674b2017-06-02 12:18:24 +02005528 /*
5529 * FIXME: some NAND manufacturer drivers expect the first die to be
5530 * selected when manufacturer->init() is called. They should be fixed
5531 * to explictly select the relevant die when interacting with the NAND
5532 * chip.
5533 */
Boris Brezillon1d017852018-11-11 08:55:14 +01005534 nand_select_target(chip, 0);
Boris Brezillonf84674b2017-06-02 12:18:24 +02005535 ret = nand_manufacturer_init(chip);
Boris Brezillon1d017852018-11-11 08:55:14 +01005536 nand_deselect_target(chip);
Boris Brezillonf84674b2017-06-02 12:18:24 +02005537 if (ret)
Masahiro Yamadac0313b92017-12-05 17:47:16 +09005538 goto err_free_buf;
Boris Brezillonf84674b2017-06-02 12:18:24 +02005539
David Woodhouse7dcdcbef2006-10-21 17:09:53 +01005540 /* Set the internal oob buffer location, just after the page data */
Masahiro Yamadac0313b92017-12-05 17:47:16 +09005541 chip->oob_poi = chip->data_buf + mtd->writesize;
Thomas Gleixner7aa65bf2006-05-23 11:54:38 +02005542
5543 /*
Brian Norris8b6e50c2011-05-25 14:59:01 -07005544 * If no default placement scheme is given, select an appropriate one.
Thomas Gleixner7aa65bf2006-05-23 11:54:38 +02005545 */
Rafał Miłecki06f384c2016-04-17 22:53:05 +02005546 if (!mtd->ooblayout &&
Rafał Miłeckie4225ae2016-04-17 22:53:07 +02005547 !(ecc->mode == NAND_ECC_SOFT && ecc->algo == NAND_ECC_BCH)) {
Thomas Gleixner61b03bd2005-11-07 11:15:49 +00005548 switch (mtd->oobsize) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07005549 case 8:
Linus Torvalds1da177e2005-04-16 15:20:36 -07005550 case 16:
Boris Brezillon41b207a2016-02-03 19:06:15 +01005551 mtd_set_ooblayout(mtd, &nand_ooblayout_sp_ops);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005552 break;
5553 case 64:
Thomas Gleixner81ec5362007-12-12 17:27:03 +01005554 case 128:
Alexander Couzens6a623e02017-05-02 12:19:00 +02005555 mtd_set_ooblayout(mtd, &nand_ooblayout_lp_hamming_ops);
Thomas Gleixner81ec5362007-12-12 17:27:03 +01005556 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005557 default:
Miquel Raynal882fd152017-08-26 17:19:15 +02005558 /*
5559 * Expose the whole OOB area to users if ECC_NONE
5560 * is passed. We could do that for all kind of
5561 * ->oobsize, but we must keep the old large/small
5562 * page with ECC layout when ->oobsize <= 128 for
5563 * compatibility reasons.
5564 */
5565 if (ecc->mode == NAND_ECC_NONE) {
5566 mtd_set_ooblayout(mtd,
5567 &nand_ooblayout_lp_ops);
5568 break;
5569 }
5570
Ezequiel García11eaf6d2016-04-01 18:29:24 -03005571 WARN(1, "No oob scheme defined for oobsize %d\n",
5572 mtd->oobsize);
5573 ret = -EINVAL;
Boris Brezillonf84674b2017-06-02 12:18:24 +02005574 goto err_nand_manuf_cleanup;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005575 }
5576 }
Thomas Gleixner61b03bd2005-11-07 11:15:49 +00005577
Thomas Gleixner7aa65bf2006-05-23 11:54:38 +02005578 /*
Brian Norris8b6e50c2011-05-25 14:59:01 -07005579 * Check ECC mode, default to software if 3byte/512byte hardware ECC is
Thomas Gleixner7aa65bf2006-05-23 11:54:38 +02005580 * selected and we have 256 byte pagesize fallback to software ECC
David Woodhousee0c7d762006-05-13 18:07:53 +01005581 */
David Woodhouse956e9442006-09-25 17:12:39 +01005582
Huang Shijie97de79e02013-10-18 14:20:53 +08005583 switch (ecc->mode) {
Sneha Narnakaje6e0cb132009-09-18 12:51:47 -07005584 case NAND_ECC_HW_OOB_FIRST:
5585 /* Similar to NAND_ECC_HW, but a separate read_page handle */
Huang Shijie97de79e02013-10-18 14:20:53 +08005586 if (!ecc->calculate || !ecc->correct || !ecc->hwctl) {
Ezequiel García11eaf6d2016-04-01 18:29:24 -03005587 WARN(1, "No ECC functions supplied; hardware ECC not possible\n");
5588 ret = -EINVAL;
Boris Brezillonf84674b2017-06-02 12:18:24 +02005589 goto err_nand_manuf_cleanup;
Sneha Narnakaje6e0cb132009-09-18 12:51:47 -07005590 }
Huang Shijie97de79e02013-10-18 14:20:53 +08005591 if (!ecc->read_page)
5592 ecc->read_page = nand_read_page_hwecc_oob_first;
Mathieu Malaterre3175e122019-01-16 20:50:04 +01005593 /* fall through */
Sneha Narnakaje6e0cb132009-09-18 12:51:47 -07005594
Thomas Gleixner6dfc6d22006-05-23 12:00:46 +02005595 case NAND_ECC_HW:
Brian Norris8b6e50c2011-05-25 14:59:01 -07005596 /* Use standard hwecc read page function? */
Huang Shijie97de79e02013-10-18 14:20:53 +08005597 if (!ecc->read_page)
5598 ecc->read_page = nand_read_page_hwecc;
5599 if (!ecc->write_page)
5600 ecc->write_page = nand_write_page_hwecc;
5601 if (!ecc->read_page_raw)
5602 ecc->read_page_raw = nand_read_page_raw;
5603 if (!ecc->write_page_raw)
5604 ecc->write_page_raw = nand_write_page_raw;
5605 if (!ecc->read_oob)
5606 ecc->read_oob = nand_read_oob_std;
5607 if (!ecc->write_oob)
5608 ecc->write_oob = nand_write_oob_std;
5609 if (!ecc->read_subpage)
5610 ecc->read_subpage = nand_read_subpage;
Helmut Schaa44991b32014-04-09 11:13:24 +02005611 if (!ecc->write_subpage && ecc->hwctl && ecc->calculate)
Huang Shijie97de79e02013-10-18 14:20:53 +08005612 ecc->write_subpage = nand_write_subpage_hwecc;
Mathieu Malaterre3175e122019-01-16 20:50:04 +01005613 /* fall through */
Thomas Gleixnerf5bbdac2006-05-25 10:07:16 +02005614
Thomas Gleixner6dfc6d22006-05-23 12:00:46 +02005615 case NAND_ECC_HW_SYNDROME:
Huang Shijie97de79e02013-10-18 14:20:53 +08005616 if ((!ecc->calculate || !ecc->correct || !ecc->hwctl) &&
5617 (!ecc->read_page ||
5618 ecc->read_page == nand_read_page_hwecc ||
5619 !ecc->write_page ||
5620 ecc->write_page == nand_write_page_hwecc)) {
Ezequiel García11eaf6d2016-04-01 18:29:24 -03005621 WARN(1, "No ECC functions supplied; hardware ECC not possible\n");
5622 ret = -EINVAL;
Boris Brezillonf84674b2017-06-02 12:18:24 +02005623 goto err_nand_manuf_cleanup;
Thomas Gleixner6dfc6d22006-05-23 12:00:46 +02005624 }
Brian Norris8b6e50c2011-05-25 14:59:01 -07005625 /* Use standard syndrome read/write page function? */
Huang Shijie97de79e02013-10-18 14:20:53 +08005626 if (!ecc->read_page)
5627 ecc->read_page = nand_read_page_syndrome;
5628 if (!ecc->write_page)
5629 ecc->write_page = nand_write_page_syndrome;
5630 if (!ecc->read_page_raw)
5631 ecc->read_page_raw = nand_read_page_raw_syndrome;
5632 if (!ecc->write_page_raw)
5633 ecc->write_page_raw = nand_write_page_raw_syndrome;
5634 if (!ecc->read_oob)
5635 ecc->read_oob = nand_read_oob_syndrome;
5636 if (!ecc->write_oob)
5637 ecc->write_oob = nand_write_oob_syndrome;
Thomas Gleixnerf5bbdac2006-05-25 10:07:16 +02005638
Huang Shijie97de79e02013-10-18 14:20:53 +08005639 if (mtd->writesize >= ecc->size) {
5640 if (!ecc->strength) {
Ezequiel García11eaf6d2016-04-01 18:29:24 -03005641 WARN(1, "Driver must set ecc.strength when using hardware ECC\n");
5642 ret = -EINVAL;
Boris Brezillonf84674b2017-06-02 12:18:24 +02005643 goto err_nand_manuf_cleanup;
Mike Dunne2788c92012-04-25 12:06:10 -07005644 }
Thomas Gleixner6dfc6d22006-05-23 12:00:46 +02005645 break;
Mike Dunne2788c92012-04-25 12:06:10 -07005646 }
Rafał Miłecki2ac63d92014-08-19 13:55:34 +02005647 pr_warn("%d byte HW ECC not possible on %d byte page size, fallback to SW ECC\n",
5648 ecc->size, mtd->writesize);
Huang Shijie97de79e02013-10-18 14:20:53 +08005649 ecc->mode = NAND_ECC_SOFT;
Rafał Miłeckie9d4fae2016-04-17 22:53:02 +02005650 ecc->algo = NAND_ECC_HAMMING;
Mathieu Malaterre3175e122019-01-16 20:50:04 +01005651 /* fall through */
Linus Torvalds1da177e2005-04-16 15:20:36 -07005652
Thomas Gleixner6dfc6d22006-05-23 12:00:46 +02005653 case NAND_ECC_SOFT:
Boris Brezillon08136212018-11-11 08:55:03 +01005654 ret = nand_set_ecc_soft_ops(chip);
Rafał Miłecki06f384c2016-04-17 22:53:05 +02005655 if (ret) {
Ezequiel García11eaf6d2016-04-01 18:29:24 -03005656 ret = -EINVAL;
Boris Brezillonf84674b2017-06-02 12:18:24 +02005657 goto err_nand_manuf_cleanup;
Ivan Djelic193bd402011-03-11 11:05:33 +01005658 }
5659 break;
5660
Thomas Petazzoni785818f2017-04-29 11:06:43 +02005661 case NAND_ECC_ON_DIE:
5662 if (!ecc->read_page || !ecc->write_page) {
5663 WARN(1, "No ECC functions supplied; on-die ECC not possible\n");
5664 ret = -EINVAL;
Boris Brezillonf84674b2017-06-02 12:18:24 +02005665 goto err_nand_manuf_cleanup;
Thomas Petazzoni785818f2017-04-29 11:06:43 +02005666 }
5667 if (!ecc->read_oob)
5668 ecc->read_oob = nand_read_oob_std;
5669 if (!ecc->write_oob)
5670 ecc->write_oob = nand_write_oob_std;
5671 break;
5672
Thomas Gleixner61b03bd2005-11-07 11:15:49 +00005673 case NAND_ECC_NONE:
Rafał Miłecki2ac63d92014-08-19 13:55:34 +02005674 pr_warn("NAND_ECC_NONE selected by board driver. This is not recommended!\n");
Huang Shijie97de79e02013-10-18 14:20:53 +08005675 ecc->read_page = nand_read_page_raw;
5676 ecc->write_page = nand_write_page_raw;
5677 ecc->read_oob = nand_read_oob_std;
5678 ecc->read_page_raw = nand_read_page_raw;
5679 ecc->write_page_raw = nand_write_page_raw;
5680 ecc->write_oob = nand_write_oob_std;
5681 ecc->size = mtd->writesize;
5682 ecc->bytes = 0;
5683 ecc->strength = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005684 break;
David Woodhouse956e9442006-09-25 17:12:39 +01005685
Linus Torvalds1da177e2005-04-16 15:20:36 -07005686 default:
Ezequiel García11eaf6d2016-04-01 18:29:24 -03005687 WARN(1, "Invalid NAND_ECC_MODE %d\n", ecc->mode);
5688 ret = -EINVAL;
Boris Brezillonf84674b2017-06-02 12:18:24 +02005689 goto err_nand_manuf_cleanup;
Thomas Gleixner61b03bd2005-11-07 11:15:49 +00005690 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07005691
Boris Brezillonaeb93af2017-12-05 12:09:29 +01005692 if (ecc->correct || ecc->calculate) {
5693 ecc->calc_buf = kmalloc(mtd->oobsize, GFP_KERNEL);
5694 ecc->code_buf = kmalloc(mtd->oobsize, GFP_KERNEL);
5695 if (!ecc->calc_buf || !ecc->code_buf) {
5696 ret = -ENOMEM;
5697 goto err_nand_manuf_cleanup;
5698 }
5699 }
5700
Brian Norris9ce244b2011-08-30 18:45:37 -07005701 /* For many systems, the standard OOB write also works for raw */
Huang Shijie97de79e02013-10-18 14:20:53 +08005702 if (!ecc->read_oob_raw)
5703 ecc->read_oob_raw = ecc->read_oob;
5704 if (!ecc->write_oob_raw)
5705 ecc->write_oob_raw = ecc->write_oob;
Brian Norris9ce244b2011-08-30 18:45:37 -07005706
Boris Brezillon846031d2016-02-03 20:11:00 +01005707 /* propagate ecc info to mtd_info */
Boris Brezillon846031d2016-02-03 20:11:00 +01005708 mtd->ecc_strength = ecc->strength;
5709 mtd->ecc_step_size = ecc->size;
Ezequiel Garcia67a9ad92014-05-14 14:58:06 -03005710
Thomas Gleixner5bd34c02006-05-27 22:16:10 +02005711 /*
Thomas Gleixner7aa65bf2006-05-23 11:54:38 +02005712 * Set the number of read / write steps for one page depending on ECC
Brian Norris8b6e50c2011-05-25 14:59:01 -07005713 * mode.
Thomas Gleixner7aa65bf2006-05-23 11:54:38 +02005714 */
Huang Shijie97de79e02013-10-18 14:20:53 +08005715 ecc->steps = mtd->writesize / ecc->size;
5716 if (ecc->steps * ecc->size != mtd->writesize) {
Ezequiel García11eaf6d2016-04-01 18:29:24 -03005717 WARN(1, "Invalid ECC parameters\n");
5718 ret = -EINVAL;
Boris Brezillonf84674b2017-06-02 12:18:24 +02005719 goto err_nand_manuf_cleanup;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005720 }
Huang Shijie97de79e02013-10-18 14:20:53 +08005721 ecc->total = ecc->steps * ecc->bytes;
Masahiro Yamada79e03482017-05-25 13:50:20 +09005722 if (ecc->total > mtd->oobsize) {
5723 WARN(1, "Total number of ECC bytes exceeded oobsize\n");
5724 ret = -EINVAL;
Boris Brezillonf84674b2017-06-02 12:18:24 +02005725 goto err_nand_manuf_cleanup;
Masahiro Yamada79e03482017-05-25 13:50:20 +09005726 }
Thomas Gleixner61b03bd2005-11-07 11:15:49 +00005727
Boris Brezillon846031d2016-02-03 20:11:00 +01005728 /*
5729 * The number of bytes available for a client to place data into
5730 * the out of band area.
5731 */
5732 ret = mtd_ooblayout_count_freebytes(mtd);
5733 if (ret < 0)
5734 ret = 0;
5735
5736 mtd->oobavail = ret;
5737
5738 /* ECC sanity check: warn if it's too weak */
Boris Brezillon08136212018-11-11 08:55:03 +01005739 if (!nand_ecc_strength_good(chip))
Boris Brezillon846031d2016-02-03 20:11:00 +01005740 pr_warn("WARNING: %s: the ECC used on your system is too weak compared to the one required by the NAND chip\n",
5741 mtd->name);
5742
Brian Norris8b6e50c2011-05-25 14:59:01 -07005743 /* Allow subpage writes up to ecc.steps. Not possible for MLC flash */
Huang Shijie1d0ed692013-09-25 14:58:10 +08005744 if (!(chip->options & NAND_NO_SUBPAGE_WRITE) && nand_is_slc(chip)) {
Huang Shijie97de79e02013-10-18 14:20:53 +08005745 switch (ecc->steps) {
Thomas Gleixner29072b92006-09-28 15:38:36 +02005746 case 2:
5747 mtd->subpage_sft = 1;
5748 break;
5749 case 4:
5750 case 8:
Thomas Gleixner81ec5362007-12-12 17:27:03 +01005751 case 16:
Thomas Gleixner29072b92006-09-28 15:38:36 +02005752 mtd->subpage_sft = 2;
5753 break;
5754 }
5755 }
5756 chip->subpagesize = mtd->writesize >> mtd->subpage_sft;
5757
Linus Torvalds1da177e2005-04-16 15:20:36 -07005758 /* Invalidate the pagebuffer reference */
Boris Brezillond9745412018-10-28 16:12:45 +01005759 chip->pagecache.page = -1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005760
Jeff Westfahla5ff4f12012-08-13 16:35:30 -05005761 /* Large page NAND with SOFT_ECC should support subpage reads */
Ron Lee4007e2d2014-04-25 15:01:35 +09305762 switch (ecc->mode) {
5763 case NAND_ECC_SOFT:
Ron Lee4007e2d2014-04-25 15:01:35 +09305764 if (chip->page_shift > 9)
5765 chip->options |= NAND_SUBPAGE_READ;
5766 break;
5767
5768 default:
5769 break;
5770 }
Jeff Westfahla5ff4f12012-08-13 16:35:30 -05005771
Boris Brezillona7ab0852018-10-25 22:10:36 +02005772 ret = nanddev_init(&chip->base, &rawnand_ops, mtd->owner);
5773 if (ret)
5774 goto err_nand_manuf_cleanup;
5775
5776 /* Adjust the MTD_CAP_ flags when NAND_ROM is set. */
5777 if (chip->options & NAND_ROM)
5778 mtd->flags = MTD_CAP_ROM;
5779
Linus Torvalds1da177e2005-04-16 15:20:36 -07005780 /* Fill in remaining MTD driver data */
Artem Bityutskiy3c3c10b2012-01-30 14:58:32 +02005781 mtd->_erase = nand_erase;
5782 mtd->_point = NULL;
5783 mtd->_unpoint = NULL;
Artem Bityutskiy3c3c10b2012-01-30 14:58:32 +02005784 mtd->_panic_write = panic_nand_write;
5785 mtd->_read_oob = nand_read_oob;
5786 mtd->_write_oob = nand_write_oob;
5787 mtd->_sync = nand_sync;
5788 mtd->_lock = NULL;
5789 mtd->_unlock = NULL;
5790 mtd->_suspend = nand_suspend;
5791 mtd->_resume = nand_resume;
Scott Branden72ea4032014-11-20 11:18:05 -08005792 mtd->_reboot = nand_shutdown;
Ezequiel Garcia8471bb72014-05-21 19:06:12 -03005793 mtd->_block_isreserved = nand_block_isreserved;
Artem Bityutskiy3c3c10b2012-01-30 14:58:32 +02005794 mtd->_block_isbad = nand_block_isbad;
5795 mtd->_block_markbad = nand_block_markbad;
Boris Brezillon7beb37e2018-11-04 14:50:28 +01005796 mtd->_max_bad_blocks = nanddev_mtd_max_bad_blocks;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005797
Shmulik Ladkaniea3b2ea2012-06-08 18:29:06 +03005798 /*
5799 * Initialize bitflip_threshold to its default prior scan_bbt() call.
5800 * scan_bbt() might invoke mtd_read(), thus bitflip_threshold must be
5801 * properly set.
5802 */
5803 if (!mtd->bitflip_threshold)
Brian Norris240181f2015-01-12 12:51:29 -08005804 mtd->bitflip_threshold = DIV_ROUND_UP(mtd->ecc_strength * 3, 4);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005805
Boris Brezillonf84674b2017-06-02 12:18:24 +02005806 /* Initialize the ->data_interface field. */
5807 ret = nand_init_data_interface(chip);
5808 if (ret)
Boris Brezillona7ab0852018-10-25 22:10:36 +02005809 goto err_nanddev_cleanup;
Boris Brezillonf84674b2017-06-02 12:18:24 +02005810
5811 /* Enter fastest possible mode on all dies. */
Boris Brezillon32813e22018-10-29 11:58:29 +01005812 for (i = 0; i < nanddev_ntargets(&chip->base); i++) {
Boris Brezillonf84674b2017-06-02 12:18:24 +02005813 ret = nand_setup_data_interface(chip, i);
Boris Brezillonf84674b2017-06-02 12:18:24 +02005814 if (ret)
Boris Brezillona7ab0852018-10-25 22:10:36 +02005815 goto err_nanddev_cleanup;
Boris Brezillonf84674b2017-06-02 12:18:24 +02005816 }
5817
Thomas Gleixner0040bf32005-02-09 12:20:00 +00005818 /* Check, if we should skip the bad block table scan */
Thomas Gleixnerace4dfe2006-05-24 12:07:37 +02005819 if (chip->options & NAND_SKIP_BBTSCAN)
Thomas Gleixner0040bf32005-02-09 12:20:00 +00005820 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005821
5822 /* Build bad block table */
Boris Brezillone80eba72018-07-05 12:27:31 +02005823 ret = nand_create_bbt(chip);
Brian Norris44d41822017-05-01 17:04:50 -07005824 if (ret)
Boris Brezillona7ab0852018-10-25 22:10:36 +02005825 goto err_nanddev_cleanup;
Boris Brezillonf84674b2017-06-02 12:18:24 +02005826
Brian Norris44d41822017-05-01 17:04:50 -07005827 return 0;
5828
Boris Brezillonf84674b2017-06-02 12:18:24 +02005829
Boris Brezillona7ab0852018-10-25 22:10:36 +02005830err_nanddev_cleanup:
5831 nanddev_cleanup(&chip->base);
5832
Boris Brezillonf84674b2017-06-02 12:18:24 +02005833err_nand_manuf_cleanup:
5834 nand_manufacturer_cleanup(chip);
5835
Masahiro Yamadac0313b92017-12-05 17:47:16 +09005836err_free_buf:
5837 kfree(chip->data_buf);
5838 kfree(ecc->code_buf);
5839 kfree(ecc->calc_buf);
Brian Norris78771042017-05-01 17:04:53 -07005840
Ezequiel García11eaf6d2016-04-01 18:29:24 -03005841 return ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005842}
5843
Miquel Raynal05b54c72018-07-19 01:05:46 +02005844static int nand_attach(struct nand_chip *chip)
5845{
5846 if (chip->controller->ops && chip->controller->ops->attach_chip)
5847 return chip->controller->ops->attach_chip(chip);
5848
5849 return 0;
5850}
5851
5852static void nand_detach(struct nand_chip *chip)
5853{
5854 if (chip->controller->ops && chip->controller->ops->detach_chip)
5855 chip->controller->ops->detach_chip(chip);
5856}
5857
David Woodhouse3b85c322006-09-25 17:06:53 +01005858/**
Miquel Raynal256c4fc2018-04-22 18:02:30 +02005859 * nand_scan_with_ids - [NAND Interface] Scan for the NAND device
Boris Brezillon00ad3782018-09-06 14:05:14 +02005860 * @chip: NAND chip object
Boris Brezillon800342d2018-08-04 22:59:23 +02005861 * @maxchips: number of chips to scan for.
Miquel Raynal256c4fc2018-04-22 18:02:30 +02005862 * @ids: optional flash IDs table
David Woodhouse3b85c322006-09-25 17:06:53 +01005863 *
Brian Norris8b6e50c2011-05-25 14:59:01 -07005864 * This fills out all the uninitialized function pointers with the defaults.
5865 * The flash ID is read and the mtd/chip structures are filled with the
Ezequiel García20c07a52016-04-01 18:29:23 -03005866 * appropriate values.
David Woodhouse3b85c322006-09-25 17:06:53 +01005867 */
Boris Brezillon871a4072018-08-04 22:59:22 +02005868int nand_scan_with_ids(struct nand_chip *chip, unsigned int maxchips,
Miquel Raynal256c4fc2018-04-22 18:02:30 +02005869 struct nand_flash_dev *ids)
David Woodhouse3b85c322006-09-25 17:06:53 +01005870{
5871 int ret;
5872
Boris Brezillon800342d2018-08-04 22:59:23 +02005873 if (!maxchips)
5874 return -EINVAL;
5875
5876 ret = nand_scan_ident(chip, maxchips, ids);
5877 if (ret)
5878 return ret;
Miquel Raynal05b54c72018-07-19 01:05:46 +02005879
5880 ret = nand_attach(chip);
5881 if (ret)
Miquel Raynal2023f1fa2018-07-25 15:31:51 +02005882 goto cleanup_ident;
Miquel Raynal05b54c72018-07-19 01:05:46 +02005883
Boris Brezillon00ad3782018-09-06 14:05:14 +02005884 ret = nand_scan_tail(chip);
Miquel Raynal05b54c72018-07-19 01:05:46 +02005885 if (ret)
Miquel Raynal2023f1fa2018-07-25 15:31:51 +02005886 goto detach_chip;
5887
5888 return 0;
5889
5890detach_chip:
5891 nand_detach(chip);
5892cleanup_ident:
5893 nand_scan_ident_cleanup(chip);
Miquel Raynal05b54c72018-07-19 01:05:46 +02005894
David Woodhouse3b85c322006-09-25 17:06:53 +01005895 return ret;
5896}
Miquel Raynal256c4fc2018-04-22 18:02:30 +02005897EXPORT_SYMBOL(nand_scan_with_ids);
David Woodhouse3b85c322006-09-25 17:06:53 +01005898
Linus Torvalds1da177e2005-04-16 15:20:36 -07005899/**
Richard Weinbergerd44154f2016-09-21 11:44:41 +02005900 * nand_cleanup - [NAND Interface] Free resources held by the NAND device
5901 * @chip: NAND chip object
Brian Norris8b6e50c2011-05-25 14:59:01 -07005902 */
Richard Weinbergerd44154f2016-09-21 11:44:41 +02005903void nand_cleanup(struct nand_chip *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07005904{
Rafał Miłeckie4225ae2016-04-17 22:53:07 +02005905 if (chip->ecc.mode == NAND_ECC_SOFT &&
Rafał Miłecki06f384c2016-04-17 22:53:05 +02005906 chip->ecc.algo == NAND_ECC_BCH)
Ivan Djelic193bd402011-03-11 11:05:33 +01005907 nand_bch_free((struct nand_bch_control *)chip->ecc.priv);
5908
Jesper Juhlfa671642005-11-07 01:01:27 -08005909 /* Free bad block table memory */
Thomas Gleixnerace4dfe2006-05-24 12:07:37 +02005910 kfree(chip->bbt);
Masahiro Yamadac0313b92017-12-05 17:47:16 +09005911 kfree(chip->data_buf);
5912 kfree(chip->ecc.code_buf);
5913 kfree(chip->ecc.calc_buf);
Brian Norris58373ff2010-07-15 12:15:44 -07005914
5915 /* Free bad block descriptor memory */
5916 if (chip->badblock_pattern && chip->badblock_pattern->options
5917 & NAND_BBT_DYNAMICSTRUCT)
5918 kfree(chip->badblock_pattern);
Boris Brezillonabbe26d2016-06-08 09:32:55 +02005919
5920 /* Free manufacturer priv data. */
5921 nand_manufacturer_cleanup(chip);
Miquel Raynal05b54c72018-07-19 01:05:46 +02005922
5923 /* Free controller specific allocations after chip identification */
5924 nand_detach(chip);
Miquel Raynal2023f1fa2018-07-25 15:31:51 +02005925
5926 /* Free identification phase allocations */
5927 nand_scan_ident_cleanup(chip);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005928}
Miquel Raynal05b54c72018-07-19 01:05:46 +02005929
Richard Weinbergerd44154f2016-09-21 11:44:41 +02005930EXPORT_SYMBOL_GPL(nand_cleanup);
5931
5932/**
5933 * nand_release - [NAND Interface] Unregister the MTD device and free resources
5934 * held by the NAND device
Boris Brezillon59ac2762018-09-06 14:05:15 +02005935 * @chip: NAND chip object
Richard Weinbergerd44154f2016-09-21 11:44:41 +02005936 */
Boris Brezillon59ac2762018-09-06 14:05:15 +02005937void nand_release(struct nand_chip *chip)
Richard Weinbergerd44154f2016-09-21 11:44:41 +02005938{
Boris Brezillon59ac2762018-09-06 14:05:15 +02005939 mtd_device_unregister(nand_to_mtd(chip));
5940 nand_cleanup(chip);
Richard Weinbergerd44154f2016-09-21 11:44:41 +02005941}
David Woodhousee0c7d762006-05-13 18:07:53 +01005942EXPORT_SYMBOL_GPL(nand_release);
Richard Purdie8fe833c2006-03-31 02:31:14 -08005943
David Woodhousee0c7d762006-05-13 18:07:53 +01005944MODULE_LICENSE("GPL");
Florian Fainelli7351d3a2010-09-07 13:23:45 +02005945MODULE_AUTHOR("Steven J. Hill <sjhill@realitydiluted.com>");
5946MODULE_AUTHOR("Thomas Gleixner <tglx@linutronix.de>");
David Woodhousee0c7d762006-05-13 18:07:53 +01005947MODULE_DESCRIPTION("Generic NAND flash driver code");