Deleted Added
full compact
nand_generic.c (258200) nand_generic.c (285006)
1/*-
2 * Copyright (C) 2009-2012 Semihalf
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 */
26
27/* Generic NAND driver */
28
29#include <sys/cdefs.h>
1/*-
2 * Copyright (C) 2009-2012 Semihalf
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 */
26
27/* Generic NAND driver */
28
29#include <sys/cdefs.h>
30__FBSDID("$FreeBSD: head/sys/dev/nand/nand_generic.c 258200 2013-11-15 23:41:32Z ian $");
30__FBSDID("$FreeBSD: head/sys/dev/nand/nand_generic.c 285006 2015-07-01 14:54:13Z brueffer $");
31
32#include <sys/param.h>
33#include <sys/systm.h>
34#include <sys/proc.h>
35#include <sys/bus.h>
36#include <sys/conf.h>
37#include <sys/endian.h>
38#include <sys/kernel.h>
39#include <sys/module.h>
40#include <sys/rman.h>
41#include <sys/lock.h>
42#include <sys/mutex.h>
43#include <sys/time.h>
44#include <sys/malloc.h>
45
46#include <dev/nand/nand.h>
47#include <dev/nand/nandbus.h>
48#include "nfc_if.h"
49#include "nand_if.h"
50#include "nandbus_if.h"
51
52
53static int onfi_nand_probe(device_t dev);
54static int large_nand_probe(device_t dev);
55static int small_nand_probe(device_t dev);
56static int generic_nand_attach(device_t dev);
57static int generic_nand_detach(device_t dev);
58
59static int generic_erase_block(device_t, uint32_t);
60static int generic_erase_block_intlv(device_t, uint32_t);
61static int generic_read_page (device_t, uint32_t, void *, uint32_t, uint32_t);
62static int generic_read_oob(device_t, uint32_t, void *, uint32_t, uint32_t);
63static int generic_program_page(device_t, uint32_t, void *, uint32_t, uint32_t);
64static int generic_program_page_intlv(device_t, uint32_t, void *, uint32_t,
65 uint32_t);
66static int generic_program_oob(device_t, uint32_t, void *, uint32_t, uint32_t);
67static int generic_is_blk_bad(device_t, uint32_t, uint8_t *);
68static int generic_get_ecc(device_t, void *, void *, int *);
69static int generic_correct_ecc(device_t, void *, void *, void *);
70
71static int small_read_page(device_t, uint32_t, void *, uint32_t, uint32_t);
72static int small_read_oob(device_t, uint32_t, void *, uint32_t, uint32_t);
73static int small_program_page(device_t, uint32_t, void *, uint32_t, uint32_t);
74static int small_program_oob(device_t, uint32_t, void *, uint32_t, uint32_t);
75
76static int onfi_is_blk_bad(device_t, uint32_t, uint8_t *);
77static int onfi_read_parameter(struct nand_chip *, struct onfi_chip_params *);
78
79static int nand_send_address(device_t, int32_t, int32_t, int8_t);
80
81static device_method_t onand_methods[] = {
82 /* Device interface */
83 DEVMETHOD(device_probe, onfi_nand_probe),
84 DEVMETHOD(device_attach, generic_nand_attach),
85 DEVMETHOD(device_detach, generic_nand_detach),
86
87 DEVMETHOD(nand_read_page, generic_read_page),
88 DEVMETHOD(nand_program_page, generic_program_page),
89 DEVMETHOD(nand_program_page_intlv, generic_program_page_intlv),
90 DEVMETHOD(nand_read_oob, generic_read_oob),
91 DEVMETHOD(nand_program_oob, generic_program_oob),
92 DEVMETHOD(nand_erase_block, generic_erase_block),
93 DEVMETHOD(nand_erase_block_intlv, generic_erase_block_intlv),
94
95 DEVMETHOD(nand_is_blk_bad, onfi_is_blk_bad),
96 DEVMETHOD(nand_get_ecc, generic_get_ecc),
97 DEVMETHOD(nand_correct_ecc, generic_correct_ecc),
98 { 0, 0 }
99};
100
101static device_method_t lnand_methods[] = {
102 /* Device interface */
103 DEVMETHOD(device_probe, large_nand_probe),
104 DEVMETHOD(device_attach, generic_nand_attach),
105 DEVMETHOD(device_detach, generic_nand_detach),
106
107 DEVMETHOD(nand_read_page, generic_read_page),
108 DEVMETHOD(nand_program_page, generic_program_page),
109 DEVMETHOD(nand_read_oob, generic_read_oob),
110 DEVMETHOD(nand_program_oob, generic_program_oob),
111 DEVMETHOD(nand_erase_block, generic_erase_block),
112
113 DEVMETHOD(nand_is_blk_bad, generic_is_blk_bad),
114 DEVMETHOD(nand_get_ecc, generic_get_ecc),
115 DEVMETHOD(nand_correct_ecc, generic_correct_ecc),
116 { 0, 0 }
117};
118
119static device_method_t snand_methods[] = {
120 /* Device interface */
121 DEVMETHOD(device_probe, small_nand_probe),
122 DEVMETHOD(device_attach, generic_nand_attach),
123 DEVMETHOD(device_detach, generic_nand_detach),
124
125 DEVMETHOD(nand_read_page, small_read_page),
126 DEVMETHOD(nand_program_page, small_program_page),
127 DEVMETHOD(nand_read_oob, small_read_oob),
128 DEVMETHOD(nand_program_oob, small_program_oob),
129 DEVMETHOD(nand_erase_block, generic_erase_block),
130
131 DEVMETHOD(nand_is_blk_bad, generic_is_blk_bad),
132 DEVMETHOD(nand_get_ecc, generic_get_ecc),
133 DEVMETHOD(nand_correct_ecc, generic_correct_ecc),
134 { 0, 0 }
135};
136
137devclass_t onand_devclass;
138devclass_t lnand_devclass;
139devclass_t snand_devclass;
140
141driver_t onand_driver = {
142 "onand",
143 onand_methods,
144 sizeof(struct nand_chip)
145};
146
147driver_t lnand_driver = {
148 "lnand",
149 lnand_methods,
150 sizeof(struct nand_chip)
151};
152
153driver_t snand_driver = {
154 "snand",
155 snand_methods,
156 sizeof(struct nand_chip)
157};
158
159DRIVER_MODULE(onand, nandbus, onand_driver, onand_devclass, 0, 0);
160DRIVER_MODULE(lnand, nandbus, lnand_driver, lnand_devclass, 0, 0);
161DRIVER_MODULE(snand, nandbus, snand_driver, snand_devclass, 0, 0);
162
163static int
164onfi_nand_probe(device_t dev)
165{
166 struct nandbus_ivar *ivar;
167
168 ivar = device_get_ivars(dev);
169 if (ivar && ivar->is_onfi) {
170 device_set_desc(dev, "ONFI compliant NAND");
171 return (BUS_PROBE_DEFAULT);
172 }
173
174 return (ENODEV);
175}
176
177static int
178large_nand_probe(device_t dev)
179{
180 struct nandbus_ivar *ivar;
181
182 ivar = device_get_ivars(dev);
183 if (ivar && !ivar->is_onfi && ivar->params->page_size >= 512) {
184 device_set_desc(dev, ivar->params->name);
185 return (BUS_PROBE_DEFAULT);
186 }
187
188 return (ENODEV);
189}
190
191static int
192small_nand_probe(device_t dev)
193{
194 struct nandbus_ivar *ivar;
195
196 ivar = device_get_ivars(dev);
197 if (ivar && !ivar->is_onfi && ivar->params->page_size == 512) {
198 device_set_desc(dev, ivar->params->name);
199 return (BUS_PROBE_DEFAULT);
200 }
201
202 return (ENODEV);
203}
204
205static int
206generic_nand_attach(device_t dev)
207{
208 struct nand_chip *chip;
209 struct nandbus_ivar *ivar;
210 struct onfi_chip_params *onfi_chip_params;
211 device_t nandbus, nfc;
212 int err;
213
214 chip = device_get_softc(dev);
215 chip->dev = dev;
216
217 ivar = device_get_ivars(dev);
218 chip->id.man_id = ivar->man_id;
219 chip->id.dev_id = ivar->dev_id;
220 chip->num = ivar->cs;
221
222 /* TODO remove when HW ECC supported */
223 nandbus = device_get_parent(dev);
224 nfc = device_get_parent(nandbus);
225
226 chip->nand = device_get_softc(nfc);
227
228 if (ivar->is_onfi) {
229 onfi_chip_params = malloc(sizeof(struct onfi_chip_params),
230 M_NAND, M_WAITOK | M_ZERO);
231 if (onfi_chip_params == NULL)
232 return (ENOMEM);
233
234 if (onfi_read_parameter(chip, onfi_chip_params)) {
235 nand_debug(NDBG_GEN,"Could not read parameter page!\n");
236 free(onfi_chip_params, M_NAND);
237 return (ENXIO);
238 }
239
240 nand_onfi_set_params(chip, onfi_chip_params);
241 /* Set proper column and row cycles */
242 ivar->cols = (onfi_chip_params->address_cycles >> 4) & 0xf;
243 ivar->rows = onfi_chip_params->address_cycles & 0xf;
244 free(onfi_chip_params, M_NAND);
245
246 } else {
247 nand_set_params(chip, ivar->params);
248 }
249
250 err = nand_init_stat(chip);
251 if (err) {
252 generic_nand_detach(dev);
253 return (err);
254 }
255
256 err = nand_init_bbt(chip);
257 if (err) {
258 generic_nand_detach(dev);
259 return (err);
260 }
261
262 err = nand_make_dev(chip);
263 if (err) {
264 generic_nand_detach(dev);
265 return (err);
266 }
267
268 err = create_geom_disk(chip);
269 if (err) {
270 generic_nand_detach(dev);
271 return (err);
272 }
273
274 return (0);
275}
276
277static int
278generic_nand_detach(device_t dev)
279{
280 struct nand_chip *chip;
281
282 chip = device_get_softc(dev);
283
284 nand_destroy_bbt(chip);
285 destroy_geom_disk(chip);
286 nand_destroy_dev(chip);
287 nand_destroy_stat(chip);
288
289 return (0);
290}
291
292static int
293can_write(device_t nandbus)
294{
295 uint8_t status;
296
297 if (NANDBUS_WAIT_READY(nandbus, &status))
298 return (0);
299
300 if (!(status & NAND_STATUS_WP)) {
301 nand_debug(NDBG_GEN,"Chip is write-protected");
302 return (0);
303 }
304
305 return (1);
306}
307
308static int
309check_fail(device_t nandbus)
310{
311 uint8_t status;
312
313 NANDBUS_WAIT_READY(nandbus, &status);
314 if (status & NAND_STATUS_FAIL) {
315 nand_debug(NDBG_GEN,"Status failed %x", status);
316 return (ENXIO);
317 }
318
319 return (0);
320}
321
322static uint16_t
323onfi_crc(const void *buf, size_t buflen)
324{
325 int i, j;
326 uint16_t crc;
327 const uint8_t *bufptr;
328
329 bufptr = buf;
330 crc = 0x4f4e;
331 for (j = 0; j < buflen; j++) {
332 crc ^= *bufptr++ << 8;
333 for (i = 0; i < 8; i++)
334 if (crc & 0x8000)
335 crc = (crc << 1) ^ 0x8005;
336 else
337 crc <<= 1;
338 }
339 return crc;
340}
341
342static int
343onfi_read_parameter(struct nand_chip *chip, struct onfi_chip_params *chip_params)
344{
345 device_t nandbus;
346 struct onfi_params params;
347 int found, sigcount, trycopy;
348
349 nand_debug(NDBG_GEN,"read parameter");
350
351 nandbus = device_get_parent(chip->dev);
352
353 NANDBUS_SELECT_CS(nandbus, chip->num);
354
355 if (NANDBUS_SEND_COMMAND(nandbus, NAND_CMD_READ_PARAMETER))
356 return (ENXIO);
357
358 if (nand_send_address(chip->dev, -1, -1, PAGE_PARAMETER_DEF))
359 return (ENXIO);
360
361 if (NANDBUS_START_COMMAND(nandbus))
362 return (ENXIO);
363
364 /*
365 * XXX Bogus DELAY, we really need a nandbus_wait_ready() here, but it's
366 * not accessible from here (static to nandbus).
367 */
368 DELAY(1000);
369
370 /*
371 * The ONFI spec mandates a minimum of three copies of the parameter
372 * data, so loop up to 3 times trying to find good data. Each copy is
373 * validated by a signature of "ONFI" and a crc. There is a very strange
374 * rule that the signature is valid if any 2 of the 4 bytes are correct.
375 */
376 for (found= 0, trycopy = 0; !found && trycopy < 3; trycopy++) {
377 NANDBUS_READ_BUFFER(nandbus, &params, sizeof(struct onfi_params));
378 sigcount = params.signature[0] == 'O';
379 sigcount += params.signature[1] == 'N';
380 sigcount += params.signature[2] == 'F';
381 sigcount += params.signature[3] == 'I';
382 if (sigcount < 2)
383 continue;
384 if (onfi_crc(&params, 254) != params.crc)
385 continue;
386 found = 1;
387 }
388 if (!found)
389 return (ENXIO);
390
391 chip_params->luns = params.luns;
392 chip_params->blocks_per_lun = le32dec(&params.blocks_per_lun);
393 chip_params->pages_per_block = le32dec(&params.pages_per_block);
394 chip_params->bytes_per_page = le32dec(&params.bytes_per_page);
31
32#include <sys/param.h>
33#include <sys/systm.h>
34#include <sys/proc.h>
35#include <sys/bus.h>
36#include <sys/conf.h>
37#include <sys/endian.h>
38#include <sys/kernel.h>
39#include <sys/module.h>
40#include <sys/rman.h>
41#include <sys/lock.h>
42#include <sys/mutex.h>
43#include <sys/time.h>
44#include <sys/malloc.h>
45
46#include <dev/nand/nand.h>
47#include <dev/nand/nandbus.h>
48#include "nfc_if.h"
49#include "nand_if.h"
50#include "nandbus_if.h"
51
52
53static int onfi_nand_probe(device_t dev);
54static int large_nand_probe(device_t dev);
55static int small_nand_probe(device_t dev);
56static int generic_nand_attach(device_t dev);
57static int generic_nand_detach(device_t dev);
58
59static int generic_erase_block(device_t, uint32_t);
60static int generic_erase_block_intlv(device_t, uint32_t);
61static int generic_read_page (device_t, uint32_t, void *, uint32_t, uint32_t);
62static int generic_read_oob(device_t, uint32_t, void *, uint32_t, uint32_t);
63static int generic_program_page(device_t, uint32_t, void *, uint32_t, uint32_t);
64static int generic_program_page_intlv(device_t, uint32_t, void *, uint32_t,
65 uint32_t);
66static int generic_program_oob(device_t, uint32_t, void *, uint32_t, uint32_t);
67static int generic_is_blk_bad(device_t, uint32_t, uint8_t *);
68static int generic_get_ecc(device_t, void *, void *, int *);
69static int generic_correct_ecc(device_t, void *, void *, void *);
70
71static int small_read_page(device_t, uint32_t, void *, uint32_t, uint32_t);
72static int small_read_oob(device_t, uint32_t, void *, uint32_t, uint32_t);
73static int small_program_page(device_t, uint32_t, void *, uint32_t, uint32_t);
74static int small_program_oob(device_t, uint32_t, void *, uint32_t, uint32_t);
75
76static int onfi_is_blk_bad(device_t, uint32_t, uint8_t *);
77static int onfi_read_parameter(struct nand_chip *, struct onfi_chip_params *);
78
79static int nand_send_address(device_t, int32_t, int32_t, int8_t);
80
81static device_method_t onand_methods[] = {
82 /* Device interface */
83 DEVMETHOD(device_probe, onfi_nand_probe),
84 DEVMETHOD(device_attach, generic_nand_attach),
85 DEVMETHOD(device_detach, generic_nand_detach),
86
87 DEVMETHOD(nand_read_page, generic_read_page),
88 DEVMETHOD(nand_program_page, generic_program_page),
89 DEVMETHOD(nand_program_page_intlv, generic_program_page_intlv),
90 DEVMETHOD(nand_read_oob, generic_read_oob),
91 DEVMETHOD(nand_program_oob, generic_program_oob),
92 DEVMETHOD(nand_erase_block, generic_erase_block),
93 DEVMETHOD(nand_erase_block_intlv, generic_erase_block_intlv),
94
95 DEVMETHOD(nand_is_blk_bad, onfi_is_blk_bad),
96 DEVMETHOD(nand_get_ecc, generic_get_ecc),
97 DEVMETHOD(nand_correct_ecc, generic_correct_ecc),
98 { 0, 0 }
99};
100
101static device_method_t lnand_methods[] = {
102 /* Device interface */
103 DEVMETHOD(device_probe, large_nand_probe),
104 DEVMETHOD(device_attach, generic_nand_attach),
105 DEVMETHOD(device_detach, generic_nand_detach),
106
107 DEVMETHOD(nand_read_page, generic_read_page),
108 DEVMETHOD(nand_program_page, generic_program_page),
109 DEVMETHOD(nand_read_oob, generic_read_oob),
110 DEVMETHOD(nand_program_oob, generic_program_oob),
111 DEVMETHOD(nand_erase_block, generic_erase_block),
112
113 DEVMETHOD(nand_is_blk_bad, generic_is_blk_bad),
114 DEVMETHOD(nand_get_ecc, generic_get_ecc),
115 DEVMETHOD(nand_correct_ecc, generic_correct_ecc),
116 { 0, 0 }
117};
118
119static device_method_t snand_methods[] = {
120 /* Device interface */
121 DEVMETHOD(device_probe, small_nand_probe),
122 DEVMETHOD(device_attach, generic_nand_attach),
123 DEVMETHOD(device_detach, generic_nand_detach),
124
125 DEVMETHOD(nand_read_page, small_read_page),
126 DEVMETHOD(nand_program_page, small_program_page),
127 DEVMETHOD(nand_read_oob, small_read_oob),
128 DEVMETHOD(nand_program_oob, small_program_oob),
129 DEVMETHOD(nand_erase_block, generic_erase_block),
130
131 DEVMETHOD(nand_is_blk_bad, generic_is_blk_bad),
132 DEVMETHOD(nand_get_ecc, generic_get_ecc),
133 DEVMETHOD(nand_correct_ecc, generic_correct_ecc),
134 { 0, 0 }
135};
136
137devclass_t onand_devclass;
138devclass_t lnand_devclass;
139devclass_t snand_devclass;
140
141driver_t onand_driver = {
142 "onand",
143 onand_methods,
144 sizeof(struct nand_chip)
145};
146
147driver_t lnand_driver = {
148 "lnand",
149 lnand_methods,
150 sizeof(struct nand_chip)
151};
152
153driver_t snand_driver = {
154 "snand",
155 snand_methods,
156 sizeof(struct nand_chip)
157};
158
159DRIVER_MODULE(onand, nandbus, onand_driver, onand_devclass, 0, 0);
160DRIVER_MODULE(lnand, nandbus, lnand_driver, lnand_devclass, 0, 0);
161DRIVER_MODULE(snand, nandbus, snand_driver, snand_devclass, 0, 0);
162
163static int
164onfi_nand_probe(device_t dev)
165{
166 struct nandbus_ivar *ivar;
167
168 ivar = device_get_ivars(dev);
169 if (ivar && ivar->is_onfi) {
170 device_set_desc(dev, "ONFI compliant NAND");
171 return (BUS_PROBE_DEFAULT);
172 }
173
174 return (ENODEV);
175}
176
177static int
178large_nand_probe(device_t dev)
179{
180 struct nandbus_ivar *ivar;
181
182 ivar = device_get_ivars(dev);
183 if (ivar && !ivar->is_onfi && ivar->params->page_size >= 512) {
184 device_set_desc(dev, ivar->params->name);
185 return (BUS_PROBE_DEFAULT);
186 }
187
188 return (ENODEV);
189}
190
191static int
192small_nand_probe(device_t dev)
193{
194 struct nandbus_ivar *ivar;
195
196 ivar = device_get_ivars(dev);
197 if (ivar && !ivar->is_onfi && ivar->params->page_size == 512) {
198 device_set_desc(dev, ivar->params->name);
199 return (BUS_PROBE_DEFAULT);
200 }
201
202 return (ENODEV);
203}
204
205static int
206generic_nand_attach(device_t dev)
207{
208 struct nand_chip *chip;
209 struct nandbus_ivar *ivar;
210 struct onfi_chip_params *onfi_chip_params;
211 device_t nandbus, nfc;
212 int err;
213
214 chip = device_get_softc(dev);
215 chip->dev = dev;
216
217 ivar = device_get_ivars(dev);
218 chip->id.man_id = ivar->man_id;
219 chip->id.dev_id = ivar->dev_id;
220 chip->num = ivar->cs;
221
222 /* TODO remove when HW ECC supported */
223 nandbus = device_get_parent(dev);
224 nfc = device_get_parent(nandbus);
225
226 chip->nand = device_get_softc(nfc);
227
228 if (ivar->is_onfi) {
229 onfi_chip_params = malloc(sizeof(struct onfi_chip_params),
230 M_NAND, M_WAITOK | M_ZERO);
231 if (onfi_chip_params == NULL)
232 return (ENOMEM);
233
234 if (onfi_read_parameter(chip, onfi_chip_params)) {
235 nand_debug(NDBG_GEN,"Could not read parameter page!\n");
236 free(onfi_chip_params, M_NAND);
237 return (ENXIO);
238 }
239
240 nand_onfi_set_params(chip, onfi_chip_params);
241 /* Set proper column and row cycles */
242 ivar->cols = (onfi_chip_params->address_cycles >> 4) & 0xf;
243 ivar->rows = onfi_chip_params->address_cycles & 0xf;
244 free(onfi_chip_params, M_NAND);
245
246 } else {
247 nand_set_params(chip, ivar->params);
248 }
249
250 err = nand_init_stat(chip);
251 if (err) {
252 generic_nand_detach(dev);
253 return (err);
254 }
255
256 err = nand_init_bbt(chip);
257 if (err) {
258 generic_nand_detach(dev);
259 return (err);
260 }
261
262 err = nand_make_dev(chip);
263 if (err) {
264 generic_nand_detach(dev);
265 return (err);
266 }
267
268 err = create_geom_disk(chip);
269 if (err) {
270 generic_nand_detach(dev);
271 return (err);
272 }
273
274 return (0);
275}
276
277static int
278generic_nand_detach(device_t dev)
279{
280 struct nand_chip *chip;
281
282 chip = device_get_softc(dev);
283
284 nand_destroy_bbt(chip);
285 destroy_geom_disk(chip);
286 nand_destroy_dev(chip);
287 nand_destroy_stat(chip);
288
289 return (0);
290}
291
292static int
293can_write(device_t nandbus)
294{
295 uint8_t status;
296
297 if (NANDBUS_WAIT_READY(nandbus, &status))
298 return (0);
299
300 if (!(status & NAND_STATUS_WP)) {
301 nand_debug(NDBG_GEN,"Chip is write-protected");
302 return (0);
303 }
304
305 return (1);
306}
307
308static int
309check_fail(device_t nandbus)
310{
311 uint8_t status;
312
313 NANDBUS_WAIT_READY(nandbus, &status);
314 if (status & NAND_STATUS_FAIL) {
315 nand_debug(NDBG_GEN,"Status failed %x", status);
316 return (ENXIO);
317 }
318
319 return (0);
320}
321
322static uint16_t
323onfi_crc(const void *buf, size_t buflen)
324{
325 int i, j;
326 uint16_t crc;
327 const uint8_t *bufptr;
328
329 bufptr = buf;
330 crc = 0x4f4e;
331 for (j = 0; j < buflen; j++) {
332 crc ^= *bufptr++ << 8;
333 for (i = 0; i < 8; i++)
334 if (crc & 0x8000)
335 crc = (crc << 1) ^ 0x8005;
336 else
337 crc <<= 1;
338 }
339 return crc;
340}
341
342static int
343onfi_read_parameter(struct nand_chip *chip, struct onfi_chip_params *chip_params)
344{
345 device_t nandbus;
346 struct onfi_params params;
347 int found, sigcount, trycopy;
348
349 nand_debug(NDBG_GEN,"read parameter");
350
351 nandbus = device_get_parent(chip->dev);
352
353 NANDBUS_SELECT_CS(nandbus, chip->num);
354
355 if (NANDBUS_SEND_COMMAND(nandbus, NAND_CMD_READ_PARAMETER))
356 return (ENXIO);
357
358 if (nand_send_address(chip->dev, -1, -1, PAGE_PARAMETER_DEF))
359 return (ENXIO);
360
361 if (NANDBUS_START_COMMAND(nandbus))
362 return (ENXIO);
363
364 /*
365 * XXX Bogus DELAY, we really need a nandbus_wait_ready() here, but it's
366 * not accessible from here (static to nandbus).
367 */
368 DELAY(1000);
369
370 /*
371 * The ONFI spec mandates a minimum of three copies of the parameter
372 * data, so loop up to 3 times trying to find good data. Each copy is
373 * validated by a signature of "ONFI" and a crc. There is a very strange
374 * rule that the signature is valid if any 2 of the 4 bytes are correct.
375 */
376 for (found= 0, trycopy = 0; !found && trycopy < 3; trycopy++) {
377 NANDBUS_READ_BUFFER(nandbus, &params, sizeof(struct onfi_params));
378 sigcount = params.signature[0] == 'O';
379 sigcount += params.signature[1] == 'N';
380 sigcount += params.signature[2] == 'F';
381 sigcount += params.signature[3] == 'I';
382 if (sigcount < 2)
383 continue;
384 if (onfi_crc(&params, 254) != params.crc)
385 continue;
386 found = 1;
387 }
388 if (!found)
389 return (ENXIO);
390
391 chip_params->luns = params.luns;
392 chip_params->blocks_per_lun = le32dec(&params.blocks_per_lun);
393 chip_params->pages_per_block = le32dec(&params.pages_per_block);
394 chip_params->bytes_per_page = le32dec(&params.bytes_per_page);
395 chip_params->spare_bytes_per_page = le32dec(&params.spare_bytes_per_page);
395 chip_params->spare_bytes_per_page = le16dec(&params.spare_bytes_per_page);
396 chip_params->t_bers = le16dec(&params.t_bers);
397 chip_params->t_prog = le16dec(&params.t_prog);
398 chip_params->t_r = le16dec(&params.t_r);
399 chip_params->t_ccs = le16dec(&params.t_ccs);
400 chip_params->features = le16dec(&params.features);
401 chip_params->address_cycles = params.address_cycles;
402
403 return (0);
404}
405
406static int
407send_read_page(device_t nand, uint8_t start_command, uint8_t end_command,
408 uint32_t row, uint32_t column)
409{
410 device_t nandbus = device_get_parent(nand);
411
412 if (NANDBUS_SEND_COMMAND(nandbus, start_command))
413 return (ENXIO);
414
415 if (nand_send_address(nand, row, column, -1))
416 return (ENXIO);
417
418 if (NANDBUS_SEND_COMMAND(nandbus, end_command))
419 return (ENXIO);
420
421 if (NANDBUS_START_COMMAND(nandbus))
422 return (ENXIO);
423
424 return (0);
425}
426
427static int
428generic_read_page(device_t nand, uint32_t page, void *buf, uint32_t len,
429 uint32_t offset)
430{
431 struct nand_chip *chip;
432 struct page_stat *pg_stat;
433 device_t nandbus;
434 uint32_t row;
435
436 nand_debug(NDBG_GEN,"%p raw read page %x[%x] at %x", nand, page, len, offset);
437 chip = device_get_softc(nand);
438 nandbus = device_get_parent(nand);
439
440 if (nand_check_page_boundary(chip, page))
441 return (ENXIO);
442
443 page_to_row(&chip->chip_geom, page, &row);
444
445 if (send_read_page(nand, NAND_CMD_READ, NAND_CMD_READ_END, row,
446 offset))
447 return (ENXIO);
448
449 DELAY(chip->t_r);
450
451 NANDBUS_READ_BUFFER(nandbus, buf, len);
452
453 if (check_fail(nandbus))
454 return (ENXIO);
455
456 pg_stat = &(chip->pg_stat[page]);
457 pg_stat->page_raw_read++;
458
459 return (0);
460}
461
462static int
463generic_read_oob(device_t nand, uint32_t page, void* buf, uint32_t len,
464 uint32_t offset)
465{
466 struct nand_chip *chip;
467 device_t nandbus;
468 uint32_t row;
469
470 nand_debug(NDBG_GEN,"%p raw read oob %x[%x] at %x", nand, page, len, offset);
471 chip = device_get_softc(nand);
472 nandbus = device_get_parent(nand);
473
474 if (nand_check_page_boundary(chip, page)) {
475 nand_debug(NDBG_GEN,"page boundary check failed: %08x\n", page);
476 return (ENXIO);
477 }
478
479 page_to_row(&chip->chip_geom, page, &row);
480
481 offset += chip->chip_geom.page_size;
482
483 if (send_read_page(nand, NAND_CMD_READ, NAND_CMD_READ_END, row,
484 offset))
485 return (ENXIO);
486
487 DELAY(chip->t_r);
488
489 NANDBUS_READ_BUFFER(nandbus, buf, len);
490
491 if (check_fail(nandbus))
492 return (ENXIO);
493
494 return (0);
495}
496
497static int
498send_start_program_page(device_t nand, uint32_t row, uint32_t column)
499{
500 device_t nandbus = device_get_parent(nand);
501
502 if (NANDBUS_SEND_COMMAND(nandbus, NAND_CMD_PROG))
503 return (ENXIO);
504
505 if (nand_send_address(nand, row, column, -1))
506 return (ENXIO);
507
508 return (0);
509}
510
511static int
512send_end_program_page(device_t nandbus, uint8_t end_command)
513{
514
515 if (NANDBUS_SEND_COMMAND(nandbus, end_command))
516 return (ENXIO);
517
518 if (NANDBUS_START_COMMAND(nandbus))
519 return (ENXIO);
520
521 return (0);
522}
523
524static int
525generic_program_page(device_t nand, uint32_t page, void *buf, uint32_t len,
526 uint32_t offset)
527{
528 struct nand_chip *chip;
529 struct page_stat *pg_stat;
530 device_t nandbus;
531 uint32_t row;
532
533 nand_debug(NDBG_GEN,"%p raw prog page %x[%x] at %x", nand, page, len,
534 offset);
535 chip = device_get_softc(nand);
536 nandbus = device_get_parent(nand);
537
538 if (nand_check_page_boundary(chip, page))
539 return (ENXIO);
540
541 page_to_row(&chip->chip_geom, page, &row);
542
543 if (!can_write(nandbus))
544 return (ENXIO);
545
546 if (send_start_program_page(nand, row, offset))
547 return (ENXIO);
548
549 NANDBUS_WRITE_BUFFER(nandbus, buf, len);
550
551 if (send_end_program_page(nandbus, NAND_CMD_PROG_END))
552 return (ENXIO);
553
554 DELAY(chip->t_prog);
555
556 if (check_fail(nandbus))
557 return (ENXIO);
558
559 pg_stat = &(chip->pg_stat[page]);
560 pg_stat->page_raw_written++;
561
562 return (0);
563}
564
565static int
566generic_program_page_intlv(device_t nand, uint32_t page, void *buf,
567 uint32_t len, uint32_t offset)
568{
569 struct nand_chip *chip;
570 struct page_stat *pg_stat;
571 device_t nandbus;
572 uint32_t row;
573
574 nand_debug(NDBG_GEN,"%p raw prog page %x[%x] at %x", nand, page, len, offset);
575 chip = device_get_softc(nand);
576 nandbus = device_get_parent(nand);
577
578 if (nand_check_page_boundary(chip, page))
579 return (ENXIO);
580
581 page_to_row(&chip->chip_geom, page, &row);
582
583 if (!can_write(nandbus))
584 return (ENXIO);
585
586 if (send_start_program_page(nand, row, offset))
587 return (ENXIO);
588
589 NANDBUS_WRITE_BUFFER(nandbus, buf, len);
590
591 if (send_end_program_page(nandbus, NAND_CMD_PROG_INTLV))
592 return (ENXIO);
593
594 DELAY(chip->t_prog);
595
596 if (check_fail(nandbus))
597 return (ENXIO);
598
599 pg_stat = &(chip->pg_stat[page]);
600 pg_stat->page_raw_written++;
601
602 return (0);
603}
604
605static int
606generic_program_oob(device_t nand, uint32_t page, void* buf, uint32_t len,
607 uint32_t offset)
608{
609 struct nand_chip *chip;
610 device_t nandbus;
611 uint32_t row;
612
613 nand_debug(NDBG_GEN,"%p raw prog oob %x[%x] at %x", nand, page, len,
614 offset);
615 chip = device_get_softc(nand);
616 nandbus = device_get_parent(nand);
617
618 if (nand_check_page_boundary(chip, page))
619 return (ENXIO);
620
621 page_to_row(&chip->chip_geom, page, &row);
622 offset += chip->chip_geom.page_size;
623
624 if (!can_write(nandbus))
625 return (ENXIO);
626
627 if (send_start_program_page(nand, row, offset))
628 return (ENXIO);
629
630 NANDBUS_WRITE_BUFFER(nandbus, buf, len);
631
632 if (send_end_program_page(nandbus, NAND_CMD_PROG_END))
633 return (ENXIO);
634
635 DELAY(chip->t_prog);
636
637 if (check_fail(nandbus))
638 return (ENXIO);
639
640 return (0);
641}
642
643static int
644send_erase_block(device_t nand, uint32_t row, uint8_t second_command)
645{
646 device_t nandbus = device_get_parent(nand);
647
648 if (NANDBUS_SEND_COMMAND(nandbus, NAND_CMD_ERASE))
649 return (ENXIO);
650
651 if (nand_send_address(nand, row, -1, -1))
652 return (ENXIO);
653
654 if (NANDBUS_SEND_COMMAND(nandbus, second_command))
655 return (ENXIO);
656
657 if (NANDBUS_START_COMMAND(nandbus))
658 return (ENXIO);
659
660 return (0);
661}
662
663static int
664generic_erase_block(device_t nand, uint32_t block)
665{
666 struct block_stat *blk_stat;
667 struct nand_chip *chip;
668 device_t nandbus;
669 int row;
670
671 nand_debug(NDBG_GEN,"%p erase block %x", nand, block);
672 nandbus = device_get_parent(nand);
673 chip = device_get_softc(nand);
674
675 if (block >= (chip->chip_geom.blks_per_lun * chip->chip_geom.luns))
676 return (ENXIO);
677
678 row = (block << chip->chip_geom.blk_shift) &
679 chip->chip_geom.blk_mask;
680
681 nand_debug(NDBG_GEN,"%p erase block row %x", nand, row);
682
683 if (!can_write(nandbus))
684 return (ENXIO);
685
686 send_erase_block(nand, row, NAND_CMD_ERASE_END);
687
688 DELAY(chip->t_bers);
689
690 if (check_fail(nandbus))
691 return (ENXIO);
692
693 blk_stat = &(chip->blk_stat[block]);
694 blk_stat->block_erased++;
695
696 return (0);
697}
698
699static int
700generic_erase_block_intlv(device_t nand, uint32_t block)
701{
702 struct block_stat *blk_stat;
703 struct nand_chip *chip;
704 device_t nandbus;
705 int row;
706
707 nand_debug(NDBG_GEN,"%p erase block %x", nand, block);
708 nandbus = device_get_parent(nand);
709 chip = device_get_softc(nand);
710
711 if (block >= (chip->chip_geom.blks_per_lun * chip->chip_geom.luns))
712 return (ENXIO);
713
714 row = (block << chip->chip_geom.blk_shift) &
715 chip->chip_geom.blk_mask;
716
717 if (!can_write(nandbus))
718 return (ENXIO);
719
720 send_erase_block(nand, row, NAND_CMD_ERASE_INTLV);
721
722 DELAY(chip->t_bers);
723
724 if (check_fail(nandbus))
725 return (ENXIO);
726
727 blk_stat = &(chip->blk_stat[block]);
728 blk_stat->block_erased++;
729
730 return (0);
731
732}
733
734static int
735onfi_is_blk_bad(device_t device, uint32_t block_number, uint8_t *bad)
736{
737 struct nand_chip *chip;
738 int page_number, i, j, err;
739 uint8_t *oob;
740
741 chip = device_get_softc(device);
742
743 oob = malloc(chip->chip_geom.oob_size, M_NAND, M_WAITOK);
744 if (!oob) {
745 device_printf(device, "%s: cannot allocate oob\n", __func__);
746 return (ENOMEM);
747 }
748
749 page_number = block_number * chip->chip_geom.pgs_per_blk;
750 *bad = 0;
751 /* Check OOB of first and last page */
752 for (i = 0; i < 2; i++, page_number+= chip->chip_geom.pgs_per_blk - 1) {
753 err = generic_read_oob(device, page_number, oob,
754 chip->chip_geom.oob_size, 0);
755 if (err) {
756 device_printf(device, "%s: cannot allocate oob\n",
757 __func__);
758 free(oob, M_NAND);
759 return (ENOMEM);
760 }
761
762 for (j = 0; j < chip->chip_geom.oob_size; j++) {
763 if (!oob[j]) {
764 *bad = 1;
765 free(oob, M_NAND);
766 return (0);
767 }
768 }
769 }
770
771 free(oob, M_NAND);
772
773 return (0);
774}
775
776static int
777send_small_read_page(device_t nand, uint8_t start_command,
778 uint32_t row, uint32_t column)
779{
780 device_t nandbus = device_get_parent(nand);
781
782 if (NANDBUS_SEND_COMMAND(nandbus, start_command))
783 return (ENXIO);
784
785 if (nand_send_address(nand, row, column, -1))
786 return (ENXIO);
787
788 if (NANDBUS_START_COMMAND(nandbus))
789 return (ENXIO);
790
791 return (0);
792}
793
794
795static int
796small_read_page(device_t nand, uint32_t page, void *buf, uint32_t len,
797 uint32_t offset)
798{
799 struct nand_chip *chip;
800 struct page_stat *pg_stat;
801 device_t nandbus;
802 uint32_t row;
803
804 nand_debug(NDBG_GEN,"%p small read page %x[%x] at %x", nand, page, len, offset);
805 chip = device_get_softc(nand);
806 nandbus = device_get_parent(nand);
807
808 if (nand_check_page_boundary(chip, page))
809 return (ENXIO);
810
811 page_to_row(&chip->chip_geom, page, &row);
812
813 if (offset < 256) {
814 if (send_small_read_page(nand, NAND_CMD_SMALLA, row, offset))
815 return (ENXIO);
816 } else {
817 offset -= 256;
818 if (send_small_read_page(nandbus, NAND_CMD_SMALLB, row, offset))
819 return (ENXIO);
820 }
821
822 DELAY(chip->t_r);
823
824 NANDBUS_READ_BUFFER(nandbus, buf, len);
825
826 if (check_fail(nandbus))
827 return (ENXIO);
828
829 pg_stat = &(chip->pg_stat[page]);
830 pg_stat->page_raw_read++;
831
832 return (0);
833}
834
835static int
836small_read_oob(device_t nand, uint32_t page, void *buf, uint32_t len,
837 uint32_t offset)
838{
839 struct nand_chip *chip;
840 struct page_stat *pg_stat;
841 device_t nandbus;
842 uint32_t row;
843
844 nand_debug(NDBG_GEN,"%p small read oob %x[%x] at %x", nand, page, len, offset);
845 chip = device_get_softc(nand);
846 nandbus = device_get_parent(nand);
847
848 if (nand_check_page_boundary(chip, page))
849 return (ENXIO);
850
851 page_to_row(&chip->chip_geom, page, &row);
852
853 if (send_small_read_page(nand, NAND_CMD_SMALLOOB, row, 0))
854 return (ENXIO);
855
856 DELAY(chip->t_r);
857
858 NANDBUS_READ_BUFFER(nandbus, buf, len);
859
860 if (check_fail(nandbus))
861 return (ENXIO);
862
863 pg_stat = &(chip->pg_stat[page]);
864 pg_stat->page_raw_read++;
865
866 return (0);
867}
868
869static int
870small_program_page(device_t nand, uint32_t page, void* buf, uint32_t len,
871 uint32_t offset)
872{
873 struct nand_chip *chip;
874 device_t nandbus;
875 uint32_t row;
876
877 nand_debug(NDBG_GEN,"%p small prog page %x[%x] at %x", nand, page, len, offset);
878 chip = device_get_softc(nand);
879 nandbus = device_get_parent(nand);
880
881 if (nand_check_page_boundary(chip, page))
882 return (ENXIO);
883
884 page_to_row(&chip->chip_geom, page, &row);
885
886 if (!can_write(nandbus))
887 return (ENXIO);
888
889 if (offset < 256) {
890 if (NANDBUS_SEND_COMMAND(nandbus, NAND_CMD_SMALLA))
891 return (ENXIO);
892 } else {
893 if (NANDBUS_SEND_COMMAND(nandbus, NAND_CMD_SMALLB))
894 return (ENXIO);
895 }
896
897 if (send_start_program_page(nand, row, offset))
898 return (ENXIO);
899
900 NANDBUS_WRITE_BUFFER(nandbus, buf, len);
901
902 if (send_end_program_page(nandbus, NAND_CMD_PROG_END))
903 return (ENXIO);
904
905 DELAY(chip->t_prog);
906
907 if (check_fail(nandbus))
908 return (ENXIO);
909
910 return (0);
911}
912
913static int
914small_program_oob(device_t nand, uint32_t page, void* buf, uint32_t len,
915 uint32_t offset)
916{
917 struct nand_chip *chip;
918 device_t nandbus;
919 uint32_t row;
920
921 nand_debug(NDBG_GEN,"%p small prog oob %x[%x] at %x", nand, page, len, offset);
922 chip = device_get_softc(nand);
923 nandbus = device_get_parent(nand);
924
925 if (nand_check_page_boundary(chip, page))
926 return (ENXIO);
927
928 page_to_row(&chip->chip_geom, page, &row);
929
930 if (!can_write(nandbus))
931 return (ENXIO);
932
933 if (NANDBUS_SEND_COMMAND(nandbus, NAND_CMD_SMALLOOB))
934 return (ENXIO);
935
936 if (send_start_program_page(nand, row, offset))
937 return (ENXIO);
938
939 NANDBUS_WRITE_BUFFER(nandbus, buf, len);
940
941 if (send_end_program_page(nandbus, NAND_CMD_PROG_END))
942 return (ENXIO);
943
944 DELAY(chip->t_prog);
945
946 if (check_fail(nandbus))
947 return (ENXIO);
948
949 return (0);
950}
951
952int
953nand_send_address(device_t nand, int32_t row, int32_t col, int8_t id)
954{
955 struct nandbus_ivar *ivar;
956 device_t nandbus;
957 uint8_t addr;
958 int err = 0;
959 int i;
960
961 nandbus = device_get_parent(nand);
962 ivar = device_get_ivars(nand);
963
964 if (id != -1) {
965 nand_debug(NDBG_GEN,"send_address: send id %02x", id);
966 err = NANDBUS_SEND_ADDRESS(nandbus, id);
967 }
968
969 if (!err && col != -1) {
970 for (i = 0; i < ivar->cols; i++, col >>= 8) {
971 addr = (uint8_t)(col & 0xff);
972 nand_debug(NDBG_GEN,"send_address: send address column "
973 "%02x", addr);
974 err = NANDBUS_SEND_ADDRESS(nandbus, addr);
975 if (err)
976 break;
977 }
978 }
979
980 if (!err && row != -1) {
981 for (i = 0; i < ivar->rows; i++, row >>= 8) {
982 addr = (uint8_t)(row & 0xff);
983 nand_debug(NDBG_GEN,"send_address: send address row "
984 "%02x", addr);
985 err = NANDBUS_SEND_ADDRESS(nandbus, addr);
986 if (err)
987 break;
988 }
989 }
990
991 return (err);
992}
993
994static int
995generic_is_blk_bad(device_t dev, uint32_t block, uint8_t *bad)
996{
997 struct nand_chip *chip;
998 int page_number, err, i;
999 uint8_t *oob;
1000
1001 chip = device_get_softc(dev);
1002
1003 oob = malloc(chip->chip_geom.oob_size, M_NAND, M_WAITOK);
1004 if (!oob) {
1005 device_printf(dev, "%s: cannot allocate OOB\n", __func__);
1006 return (ENOMEM);
1007 }
1008
1009 page_number = block * chip->chip_geom.pgs_per_blk;
1010 *bad = 0;
1011
1012 /* Check OOB of first and second page */
1013 for (i = 0; i < 2; i++) {
1014 err = NAND_READ_OOB(dev, page_number + i, oob,
1015 chip->chip_geom.oob_size, 0);
1016 if (err) {
1017 device_printf(dev, "%s: cannot allocate OOB\n",
1018 __func__);
1019 free(oob, M_NAND);
1020 return (ENOMEM);
1021 }
1022
1023 if (!oob[0]) {
1024 *bad = 1;
1025 free(oob, M_NAND);
1026 return (0);
1027 }
1028 }
1029
1030 free(oob, M_NAND);
1031
1032 return (0);
1033}
1034
1035static int
1036generic_get_ecc(device_t dev, void *buf, void *ecc, int *needwrite)
1037{
1038 struct nand_chip *chip = device_get_softc(dev);
1039 struct chip_geom *cg = &chip->chip_geom;
1040
1041 return (NANDBUS_GET_ECC(device_get_parent(dev), buf, cg->page_size,
1042 ecc, needwrite));
1043}
1044
1045static int
1046generic_correct_ecc(device_t dev, void *buf, void *readecc, void *calcecc)
1047{
1048 struct nand_chip *chip = device_get_softc(dev);
1049 struct chip_geom *cg = &chip->chip_geom;
1050
1051 return (NANDBUS_CORRECT_ECC(device_get_parent(dev), buf,
1052 cg->page_size, readecc, calcecc));
1053}
1054
1055
1056#if 0
1057int
1058nand_chng_read_col(device_t nand, uint32_t col, void *buf, size_t len)
1059{
1060 struct nand_chip *chip;
1061 device_t nandbus;
1062
1063 chip = device_get_softc(nand);
1064 nandbus = device_get_parent(nand);
1065
1066 if (NANDBUS_SEND_COMMAND(nandbus, NAND_CMD_CHNG_READ_COL))
1067 return (ENXIO);
1068
1069 if (NANDBUS_SEND_ADDRESS(nandbus, -1, col, -1))
1070 return (ENXIO);
1071
1072 if (NANDBUS_SEND_COMMAND(nandbus, NAND_CMD_CHNG_READ_COL_END))
1073 return (ENXIO);
1074
1075 if (NANDBUS_START_COMMAND(nandbus))
1076 return (ENXIO);
1077
1078 if (buf != NULL && len > 0)
1079 NANDBUS_READ_BUFFER(nandbus, buf, len);
1080
1081 return (0);
1082}
1083
1084int
1085nand_chng_write_col(device_t dev, uint32_t col, void *buf,
1086 size_t len)
1087{
1088 struct nand_chip *chip;
1089 device_t nandbus;
1090
1091 chip = device_get_softc(dev);
1092 nandbus = device_get_parent(dev);
1093
1094 if (NANDBUS_SEND_COMMAND(nandbus, NAND_CMD_CHNG_WRITE_COL))
1095 return (ENXIO);
1096
1097 if (NANDBUS_SEND_ADDRESS(nandbus, -1, col, -1))
1098 return (ENXIO);
1099
1100 if (buf != NULL && len > 0)
1101 NANDBUS_WRITE_BUFFER(nandbus, buf, len);
1102
1103 if (NANDBUS_SEND_COMMAND(nandbus, NAND_CMD_CHNG_READ_COL_END))
1104 return (ENXIO);
1105
1106 if (NANDBUS_START_COMMAND(nandbus))
1107 return (ENXIO);
1108
1109 return (0);
1110}
1111
1112int
1113nand_copyback_read(device_t dev, uint32_t page, uint32_t col,
1114 void *buf, size_t len)
1115{
1116 struct nand_chip *chip;
1117 struct page_stat *pg_stat;
1118 device_t nandbus;
1119 uint32_t row;
1120
1121 nand_debug(NDBG_GEN," raw read page %x[%x] at %x", page, col, len);
1122 chip = device_get_softc(dev);
1123 nandbus = device_get_parent(dev);
1124
1125 if (nand_check_page_boundary(chip, page))
1126 return (ENXIO);
1127
1128 page_to_row(&chip->chip_geom, page, &row);
1129
1130 if (send_read_page(nand, NAND_CMD_READ, NAND_CMD_READ_CPBK, row, 0))
1131 return (ENXIO);
1132
1133 DELAY(chip->t_r);
1134 if (check_fail(nandbus))
1135 return (ENXIO);
1136
1137 if (buf != NULL && len > 0)
1138 NANDBUS_READ_BUFFER(nandbus, buf, len);
1139
1140 pg_stat = &(chip->pg_stat[page]);
1141 pg_stat->page_raw_read++;
1142
1143 return (0);
1144}
1145
1146int
1147nand_copyback_prog(device_t dev, uint32_t page, uint32_t col,
1148 void *buf, size_t len)
1149{
1150 struct nand_chip *chip;
1151 struct page_stat *pg_stat;
1152 device_t nandbus;
1153 uint32_t row;
1154
1155 nand_debug(NDBG_GEN,"copyback prog page %x[%x]", page, len);
1156 chip = device_get_softc(dev);
1157 nandbus = device_get_parent(dev);
1158
1159 if (nand_check_page_boundary(chip, page))
1160 return (ENXIO);
1161
1162 page_to_row(&chip->chip_geom, page, &row);
1163
1164 if (!can_write(nandbus))
1165 return (ENXIO);
1166
1167 if (NANDBUS_SEND_COMMAND(nandbus, NAND_CMD_CHNG_WRITE_COL))
1168 return (ENXIO);
1169
1170 if (NANDBUS_SEND_ADDRESS(nandbus, row, col, -1))
1171 return (ENXIO);
1172
1173 if (buf != NULL && len > 0)
1174 NANDBUS_WRITE_BUFFER(nandbus, buf, len);
1175
1176 if (send_end_program_page(nandbus, NAND_CMD_PROG_END))
1177 return (ENXIO);
1178
1179 DELAY(chip->t_prog);
1180
1181 if (check_fail(nandbus))
1182 return (ENXIO);
1183
1184 pg_stat = &(chip->pg_stat[page]);
1185 pg_stat->page_raw_written++;
1186
1187 return (0);
1188}
1189
1190int
1191nand_copyback_prog_intlv(device_t dev, uint32_t page)
1192{
1193 struct nand_chip *chip;
1194 struct page_stat *pg_stat;
1195 device_t nandbus;
1196 uint32_t row;
1197
1198 nand_debug(NDBG_GEN,"cache prog page %x", page);
1199 chip = device_get_softc(dev);
1200 nandbus = device_get_parent(dev);
1201
1202 if (nand_check_page_boundary(chip, page))
1203 return (ENXIO);
1204
1205 page_to_row(&chip->chip_geom, page, &row);
1206
1207 if (!can_write(nandbus))
1208 return (ENXIO);
1209
1210 if (send_start_program_page(nand, row, 0))
1211 return (ENXIO);
1212
1213 if (send_end_program_page(nandbus, NAND_CMD_PROG_INTLV))
1214 return (ENXIO);
1215
1216 DELAY(chip->t_prog);
1217
1218 if (check_fail(nandbus))
1219 return (ENXIO);
1220
1221 pg_stat = &(chip->pg_stat[page]);
1222 pg_stat->page_raw_written++;
1223
1224 return (0);
1225}
1226
1227int
1228nand_prog_cache(device_t dev, uint32_t page, uint32_t col,
1229 void *buf, size_t len, uint8_t end)
1230{
1231 struct nand_chip *chip;
1232 struct page_stat *pg_stat;
1233 device_t nandbus;
1234 uint32_t row;
1235 uint8_t command;
1236
1237 nand_debug(NDBG_GEN,"cache prog page %x[%x]", page, len);
1238 chip = device_get_softc(dev);
1239 nandbus = device_get_parent(dev);
1240
1241 if (nand_check_page_boundary(chip, page))
1242 return (ENXIO);
1243
1244 page_to_row(&chip->chip_geom, page, &row);
1245
1246 if (!can_write(nandbus))
1247 return (ENXIO);
1248
1249 if (send_start_program_page(dev, row, 0))
1250 return (ENXIO);
1251
1252 NANDBUS_WRITE_BUFFER(nandbus, buf, len);
1253
1254 if (end)
1255 command = NAND_CMD_PROG_END;
1256 else
1257 command = NAND_CMD_PROG_CACHE;
1258
1259 if (send_end_program_page(nandbus, command))
1260 return (ENXIO);
1261
1262 DELAY(chip->t_prog);
1263
1264 if (check_fail(nandbus))
1265 return (ENXIO);
1266
1267 pg_stat = &(chip->pg_stat[page]);
1268 pg_stat->page_raw_written++;
1269
1270 return (0);
1271}
1272
1273int
1274nand_read_cache(device_t dev, uint32_t page, uint32_t col,
1275 void *buf, size_t len, uint8_t end)
1276{
1277 struct nand_chip *chip;
1278 struct page_stat *pg_stat;
1279 device_t nandbus;
1280 uint32_t row;
1281 uint8_t command;
1282
1283 nand_debug(NDBG_GEN,"cache read page %x[%x] ", page, len);
1284 chip = device_get_softc(dev);
1285 nandbus = device_get_parent(dev);
1286
1287 if (nand_check_page_boundary(chip, page))
1288 return (ENXIO);
1289
1290 page_to_row(&chip->chip_geom, page, &row);
1291
1292 if (page != -1) {
1293 if (NANDBUS_SEND_COMMAND(nandbus, NAND_CMD_READ))
1294 return (ENXIO);
1295
1296 if (NANDBUS_SEND_ADDRESS(nandbus, row, col, -1))
1297 return (ENXIO);
1298 }
1299
1300 if (end)
1301 command = NAND_CMD_READ_CACHE_END;
1302 else
1303 command = NAND_CMD_READ_CACHE;
1304
1305 if (NANDBUS_SEND_COMMAND(nandbus, command))
1306 return (ENXIO);
1307
1308 if (NANDBUS_START_COMMAND(nandbus))
1309 return (ENXIO);
1310
1311 DELAY(chip->t_r);
1312 if (check_fail(nandbus))
1313 return (ENXIO);
1314
1315 if (buf != NULL && len > 0)
1316 NANDBUS_READ_BUFFER(nandbus, buf, len);
1317
1318 pg_stat = &(chip->pg_stat[page]);
1319 pg_stat->page_raw_read++;
1320
1321 return (0);
1322}
1323
1324int
1325nand_get_feature(device_t dev, uint8_t feat, void *buf)
1326{
1327 struct nand_chip *chip;
1328 device_t nandbus;
1329
1330 nand_debug(NDBG_GEN,"nand get feature");
1331
1332 chip = device_get_softc(dev);
1333 nandbus = device_get_parent(dev);
1334
1335 if (NANDBUS_SEND_COMMAND(nandbus, NAND_CMD_GET_FEATURE))
1336 return (ENXIO);
1337
1338 if (NANDBUS_SEND_ADDRESS(nandbus, -1, -1, feat))
1339 return (ENXIO);
1340
1341 if (NANDBUS_START_COMMAND(nandbus))
1342 return (ENXIO);
1343
1344 DELAY(chip->t_r);
1345 NANDBUS_READ_BUFFER(nandbus, buf, 4);
1346
1347 return (0);
1348}
1349
1350int
1351nand_set_feature(device_t dev, uint8_t feat, void *buf)
1352{
1353 struct nand_chip *chip;
1354 device_t nandbus;
1355
1356 nand_debug(NDBG_GEN,"nand set feature");
1357
1358 chip = device_get_softc(dev);
1359 nandbus = device_get_parent(dev);
1360
1361 if (NANDBUS_SEND_COMMAND(nandbus, NAND_CMD_SET_FEATURE))
1362 return (ENXIO);
1363
1364 if (NANDBUS_SEND_ADDRESS(nandbus, -1, -1, feat))
1365 return (ENXIO);
1366
1367 NANDBUS_WRITE_BUFFER(nandbus, buf, 4);
1368
1369 if (NANDBUS_START_COMMAND(nandbus))
1370 return (ENXIO);
1371
1372 return (0);
1373}
1374#endif
396 chip_params->t_bers = le16dec(&params.t_bers);
397 chip_params->t_prog = le16dec(&params.t_prog);
398 chip_params->t_r = le16dec(&params.t_r);
399 chip_params->t_ccs = le16dec(&params.t_ccs);
400 chip_params->features = le16dec(&params.features);
401 chip_params->address_cycles = params.address_cycles;
402
403 return (0);
404}
405
406static int
407send_read_page(device_t nand, uint8_t start_command, uint8_t end_command,
408 uint32_t row, uint32_t column)
409{
410 device_t nandbus = device_get_parent(nand);
411
412 if (NANDBUS_SEND_COMMAND(nandbus, start_command))
413 return (ENXIO);
414
415 if (nand_send_address(nand, row, column, -1))
416 return (ENXIO);
417
418 if (NANDBUS_SEND_COMMAND(nandbus, end_command))
419 return (ENXIO);
420
421 if (NANDBUS_START_COMMAND(nandbus))
422 return (ENXIO);
423
424 return (0);
425}
426
427static int
428generic_read_page(device_t nand, uint32_t page, void *buf, uint32_t len,
429 uint32_t offset)
430{
431 struct nand_chip *chip;
432 struct page_stat *pg_stat;
433 device_t nandbus;
434 uint32_t row;
435
436 nand_debug(NDBG_GEN,"%p raw read page %x[%x] at %x", nand, page, len, offset);
437 chip = device_get_softc(nand);
438 nandbus = device_get_parent(nand);
439
440 if (nand_check_page_boundary(chip, page))
441 return (ENXIO);
442
443 page_to_row(&chip->chip_geom, page, &row);
444
445 if (send_read_page(nand, NAND_CMD_READ, NAND_CMD_READ_END, row,
446 offset))
447 return (ENXIO);
448
449 DELAY(chip->t_r);
450
451 NANDBUS_READ_BUFFER(nandbus, buf, len);
452
453 if (check_fail(nandbus))
454 return (ENXIO);
455
456 pg_stat = &(chip->pg_stat[page]);
457 pg_stat->page_raw_read++;
458
459 return (0);
460}
461
462static int
463generic_read_oob(device_t nand, uint32_t page, void* buf, uint32_t len,
464 uint32_t offset)
465{
466 struct nand_chip *chip;
467 device_t nandbus;
468 uint32_t row;
469
470 nand_debug(NDBG_GEN,"%p raw read oob %x[%x] at %x", nand, page, len, offset);
471 chip = device_get_softc(nand);
472 nandbus = device_get_parent(nand);
473
474 if (nand_check_page_boundary(chip, page)) {
475 nand_debug(NDBG_GEN,"page boundary check failed: %08x\n", page);
476 return (ENXIO);
477 }
478
479 page_to_row(&chip->chip_geom, page, &row);
480
481 offset += chip->chip_geom.page_size;
482
483 if (send_read_page(nand, NAND_CMD_READ, NAND_CMD_READ_END, row,
484 offset))
485 return (ENXIO);
486
487 DELAY(chip->t_r);
488
489 NANDBUS_READ_BUFFER(nandbus, buf, len);
490
491 if (check_fail(nandbus))
492 return (ENXIO);
493
494 return (0);
495}
496
497static int
498send_start_program_page(device_t nand, uint32_t row, uint32_t column)
499{
500 device_t nandbus = device_get_parent(nand);
501
502 if (NANDBUS_SEND_COMMAND(nandbus, NAND_CMD_PROG))
503 return (ENXIO);
504
505 if (nand_send_address(nand, row, column, -1))
506 return (ENXIO);
507
508 return (0);
509}
510
511static int
512send_end_program_page(device_t nandbus, uint8_t end_command)
513{
514
515 if (NANDBUS_SEND_COMMAND(nandbus, end_command))
516 return (ENXIO);
517
518 if (NANDBUS_START_COMMAND(nandbus))
519 return (ENXIO);
520
521 return (0);
522}
523
524static int
525generic_program_page(device_t nand, uint32_t page, void *buf, uint32_t len,
526 uint32_t offset)
527{
528 struct nand_chip *chip;
529 struct page_stat *pg_stat;
530 device_t nandbus;
531 uint32_t row;
532
533 nand_debug(NDBG_GEN,"%p raw prog page %x[%x] at %x", nand, page, len,
534 offset);
535 chip = device_get_softc(nand);
536 nandbus = device_get_parent(nand);
537
538 if (nand_check_page_boundary(chip, page))
539 return (ENXIO);
540
541 page_to_row(&chip->chip_geom, page, &row);
542
543 if (!can_write(nandbus))
544 return (ENXIO);
545
546 if (send_start_program_page(nand, row, offset))
547 return (ENXIO);
548
549 NANDBUS_WRITE_BUFFER(nandbus, buf, len);
550
551 if (send_end_program_page(nandbus, NAND_CMD_PROG_END))
552 return (ENXIO);
553
554 DELAY(chip->t_prog);
555
556 if (check_fail(nandbus))
557 return (ENXIO);
558
559 pg_stat = &(chip->pg_stat[page]);
560 pg_stat->page_raw_written++;
561
562 return (0);
563}
564
565static int
566generic_program_page_intlv(device_t nand, uint32_t page, void *buf,
567 uint32_t len, uint32_t offset)
568{
569 struct nand_chip *chip;
570 struct page_stat *pg_stat;
571 device_t nandbus;
572 uint32_t row;
573
574 nand_debug(NDBG_GEN,"%p raw prog page %x[%x] at %x", nand, page, len, offset);
575 chip = device_get_softc(nand);
576 nandbus = device_get_parent(nand);
577
578 if (nand_check_page_boundary(chip, page))
579 return (ENXIO);
580
581 page_to_row(&chip->chip_geom, page, &row);
582
583 if (!can_write(nandbus))
584 return (ENXIO);
585
586 if (send_start_program_page(nand, row, offset))
587 return (ENXIO);
588
589 NANDBUS_WRITE_BUFFER(nandbus, buf, len);
590
591 if (send_end_program_page(nandbus, NAND_CMD_PROG_INTLV))
592 return (ENXIO);
593
594 DELAY(chip->t_prog);
595
596 if (check_fail(nandbus))
597 return (ENXIO);
598
599 pg_stat = &(chip->pg_stat[page]);
600 pg_stat->page_raw_written++;
601
602 return (0);
603}
604
605static int
606generic_program_oob(device_t nand, uint32_t page, void* buf, uint32_t len,
607 uint32_t offset)
608{
609 struct nand_chip *chip;
610 device_t nandbus;
611 uint32_t row;
612
613 nand_debug(NDBG_GEN,"%p raw prog oob %x[%x] at %x", nand, page, len,
614 offset);
615 chip = device_get_softc(nand);
616 nandbus = device_get_parent(nand);
617
618 if (nand_check_page_boundary(chip, page))
619 return (ENXIO);
620
621 page_to_row(&chip->chip_geom, page, &row);
622 offset += chip->chip_geom.page_size;
623
624 if (!can_write(nandbus))
625 return (ENXIO);
626
627 if (send_start_program_page(nand, row, offset))
628 return (ENXIO);
629
630 NANDBUS_WRITE_BUFFER(nandbus, buf, len);
631
632 if (send_end_program_page(nandbus, NAND_CMD_PROG_END))
633 return (ENXIO);
634
635 DELAY(chip->t_prog);
636
637 if (check_fail(nandbus))
638 return (ENXIO);
639
640 return (0);
641}
642
643static int
644send_erase_block(device_t nand, uint32_t row, uint8_t second_command)
645{
646 device_t nandbus = device_get_parent(nand);
647
648 if (NANDBUS_SEND_COMMAND(nandbus, NAND_CMD_ERASE))
649 return (ENXIO);
650
651 if (nand_send_address(nand, row, -1, -1))
652 return (ENXIO);
653
654 if (NANDBUS_SEND_COMMAND(nandbus, second_command))
655 return (ENXIO);
656
657 if (NANDBUS_START_COMMAND(nandbus))
658 return (ENXIO);
659
660 return (0);
661}
662
663static int
664generic_erase_block(device_t nand, uint32_t block)
665{
666 struct block_stat *blk_stat;
667 struct nand_chip *chip;
668 device_t nandbus;
669 int row;
670
671 nand_debug(NDBG_GEN,"%p erase block %x", nand, block);
672 nandbus = device_get_parent(nand);
673 chip = device_get_softc(nand);
674
675 if (block >= (chip->chip_geom.blks_per_lun * chip->chip_geom.luns))
676 return (ENXIO);
677
678 row = (block << chip->chip_geom.blk_shift) &
679 chip->chip_geom.blk_mask;
680
681 nand_debug(NDBG_GEN,"%p erase block row %x", nand, row);
682
683 if (!can_write(nandbus))
684 return (ENXIO);
685
686 send_erase_block(nand, row, NAND_CMD_ERASE_END);
687
688 DELAY(chip->t_bers);
689
690 if (check_fail(nandbus))
691 return (ENXIO);
692
693 blk_stat = &(chip->blk_stat[block]);
694 blk_stat->block_erased++;
695
696 return (0);
697}
698
699static int
700generic_erase_block_intlv(device_t nand, uint32_t block)
701{
702 struct block_stat *blk_stat;
703 struct nand_chip *chip;
704 device_t nandbus;
705 int row;
706
707 nand_debug(NDBG_GEN,"%p erase block %x", nand, block);
708 nandbus = device_get_parent(nand);
709 chip = device_get_softc(nand);
710
711 if (block >= (chip->chip_geom.blks_per_lun * chip->chip_geom.luns))
712 return (ENXIO);
713
714 row = (block << chip->chip_geom.blk_shift) &
715 chip->chip_geom.blk_mask;
716
717 if (!can_write(nandbus))
718 return (ENXIO);
719
720 send_erase_block(nand, row, NAND_CMD_ERASE_INTLV);
721
722 DELAY(chip->t_bers);
723
724 if (check_fail(nandbus))
725 return (ENXIO);
726
727 blk_stat = &(chip->blk_stat[block]);
728 blk_stat->block_erased++;
729
730 return (0);
731
732}
733
734static int
735onfi_is_blk_bad(device_t device, uint32_t block_number, uint8_t *bad)
736{
737 struct nand_chip *chip;
738 int page_number, i, j, err;
739 uint8_t *oob;
740
741 chip = device_get_softc(device);
742
743 oob = malloc(chip->chip_geom.oob_size, M_NAND, M_WAITOK);
744 if (!oob) {
745 device_printf(device, "%s: cannot allocate oob\n", __func__);
746 return (ENOMEM);
747 }
748
749 page_number = block_number * chip->chip_geom.pgs_per_blk;
750 *bad = 0;
751 /* Check OOB of first and last page */
752 for (i = 0; i < 2; i++, page_number+= chip->chip_geom.pgs_per_blk - 1) {
753 err = generic_read_oob(device, page_number, oob,
754 chip->chip_geom.oob_size, 0);
755 if (err) {
756 device_printf(device, "%s: cannot allocate oob\n",
757 __func__);
758 free(oob, M_NAND);
759 return (ENOMEM);
760 }
761
762 for (j = 0; j < chip->chip_geom.oob_size; j++) {
763 if (!oob[j]) {
764 *bad = 1;
765 free(oob, M_NAND);
766 return (0);
767 }
768 }
769 }
770
771 free(oob, M_NAND);
772
773 return (0);
774}
775
776static int
777send_small_read_page(device_t nand, uint8_t start_command,
778 uint32_t row, uint32_t column)
779{
780 device_t nandbus = device_get_parent(nand);
781
782 if (NANDBUS_SEND_COMMAND(nandbus, start_command))
783 return (ENXIO);
784
785 if (nand_send_address(nand, row, column, -1))
786 return (ENXIO);
787
788 if (NANDBUS_START_COMMAND(nandbus))
789 return (ENXIO);
790
791 return (0);
792}
793
794
795static int
796small_read_page(device_t nand, uint32_t page, void *buf, uint32_t len,
797 uint32_t offset)
798{
799 struct nand_chip *chip;
800 struct page_stat *pg_stat;
801 device_t nandbus;
802 uint32_t row;
803
804 nand_debug(NDBG_GEN,"%p small read page %x[%x] at %x", nand, page, len, offset);
805 chip = device_get_softc(nand);
806 nandbus = device_get_parent(nand);
807
808 if (nand_check_page_boundary(chip, page))
809 return (ENXIO);
810
811 page_to_row(&chip->chip_geom, page, &row);
812
813 if (offset < 256) {
814 if (send_small_read_page(nand, NAND_CMD_SMALLA, row, offset))
815 return (ENXIO);
816 } else {
817 offset -= 256;
818 if (send_small_read_page(nandbus, NAND_CMD_SMALLB, row, offset))
819 return (ENXIO);
820 }
821
822 DELAY(chip->t_r);
823
824 NANDBUS_READ_BUFFER(nandbus, buf, len);
825
826 if (check_fail(nandbus))
827 return (ENXIO);
828
829 pg_stat = &(chip->pg_stat[page]);
830 pg_stat->page_raw_read++;
831
832 return (0);
833}
834
835static int
836small_read_oob(device_t nand, uint32_t page, void *buf, uint32_t len,
837 uint32_t offset)
838{
839 struct nand_chip *chip;
840 struct page_stat *pg_stat;
841 device_t nandbus;
842 uint32_t row;
843
844 nand_debug(NDBG_GEN,"%p small read oob %x[%x] at %x", nand, page, len, offset);
845 chip = device_get_softc(nand);
846 nandbus = device_get_parent(nand);
847
848 if (nand_check_page_boundary(chip, page))
849 return (ENXIO);
850
851 page_to_row(&chip->chip_geom, page, &row);
852
853 if (send_small_read_page(nand, NAND_CMD_SMALLOOB, row, 0))
854 return (ENXIO);
855
856 DELAY(chip->t_r);
857
858 NANDBUS_READ_BUFFER(nandbus, buf, len);
859
860 if (check_fail(nandbus))
861 return (ENXIO);
862
863 pg_stat = &(chip->pg_stat[page]);
864 pg_stat->page_raw_read++;
865
866 return (0);
867}
868
869static int
870small_program_page(device_t nand, uint32_t page, void* buf, uint32_t len,
871 uint32_t offset)
872{
873 struct nand_chip *chip;
874 device_t nandbus;
875 uint32_t row;
876
877 nand_debug(NDBG_GEN,"%p small prog page %x[%x] at %x", nand, page, len, offset);
878 chip = device_get_softc(nand);
879 nandbus = device_get_parent(nand);
880
881 if (nand_check_page_boundary(chip, page))
882 return (ENXIO);
883
884 page_to_row(&chip->chip_geom, page, &row);
885
886 if (!can_write(nandbus))
887 return (ENXIO);
888
889 if (offset < 256) {
890 if (NANDBUS_SEND_COMMAND(nandbus, NAND_CMD_SMALLA))
891 return (ENXIO);
892 } else {
893 if (NANDBUS_SEND_COMMAND(nandbus, NAND_CMD_SMALLB))
894 return (ENXIO);
895 }
896
897 if (send_start_program_page(nand, row, offset))
898 return (ENXIO);
899
900 NANDBUS_WRITE_BUFFER(nandbus, buf, len);
901
902 if (send_end_program_page(nandbus, NAND_CMD_PROG_END))
903 return (ENXIO);
904
905 DELAY(chip->t_prog);
906
907 if (check_fail(nandbus))
908 return (ENXIO);
909
910 return (0);
911}
912
913static int
914small_program_oob(device_t nand, uint32_t page, void* buf, uint32_t len,
915 uint32_t offset)
916{
917 struct nand_chip *chip;
918 device_t nandbus;
919 uint32_t row;
920
921 nand_debug(NDBG_GEN,"%p small prog oob %x[%x] at %x", nand, page, len, offset);
922 chip = device_get_softc(nand);
923 nandbus = device_get_parent(nand);
924
925 if (nand_check_page_boundary(chip, page))
926 return (ENXIO);
927
928 page_to_row(&chip->chip_geom, page, &row);
929
930 if (!can_write(nandbus))
931 return (ENXIO);
932
933 if (NANDBUS_SEND_COMMAND(nandbus, NAND_CMD_SMALLOOB))
934 return (ENXIO);
935
936 if (send_start_program_page(nand, row, offset))
937 return (ENXIO);
938
939 NANDBUS_WRITE_BUFFER(nandbus, buf, len);
940
941 if (send_end_program_page(nandbus, NAND_CMD_PROG_END))
942 return (ENXIO);
943
944 DELAY(chip->t_prog);
945
946 if (check_fail(nandbus))
947 return (ENXIO);
948
949 return (0);
950}
951
952int
953nand_send_address(device_t nand, int32_t row, int32_t col, int8_t id)
954{
955 struct nandbus_ivar *ivar;
956 device_t nandbus;
957 uint8_t addr;
958 int err = 0;
959 int i;
960
961 nandbus = device_get_parent(nand);
962 ivar = device_get_ivars(nand);
963
964 if (id != -1) {
965 nand_debug(NDBG_GEN,"send_address: send id %02x", id);
966 err = NANDBUS_SEND_ADDRESS(nandbus, id);
967 }
968
969 if (!err && col != -1) {
970 for (i = 0; i < ivar->cols; i++, col >>= 8) {
971 addr = (uint8_t)(col & 0xff);
972 nand_debug(NDBG_GEN,"send_address: send address column "
973 "%02x", addr);
974 err = NANDBUS_SEND_ADDRESS(nandbus, addr);
975 if (err)
976 break;
977 }
978 }
979
980 if (!err && row != -1) {
981 for (i = 0; i < ivar->rows; i++, row >>= 8) {
982 addr = (uint8_t)(row & 0xff);
983 nand_debug(NDBG_GEN,"send_address: send address row "
984 "%02x", addr);
985 err = NANDBUS_SEND_ADDRESS(nandbus, addr);
986 if (err)
987 break;
988 }
989 }
990
991 return (err);
992}
993
994static int
995generic_is_blk_bad(device_t dev, uint32_t block, uint8_t *bad)
996{
997 struct nand_chip *chip;
998 int page_number, err, i;
999 uint8_t *oob;
1000
1001 chip = device_get_softc(dev);
1002
1003 oob = malloc(chip->chip_geom.oob_size, M_NAND, M_WAITOK);
1004 if (!oob) {
1005 device_printf(dev, "%s: cannot allocate OOB\n", __func__);
1006 return (ENOMEM);
1007 }
1008
1009 page_number = block * chip->chip_geom.pgs_per_blk;
1010 *bad = 0;
1011
1012 /* Check OOB of first and second page */
1013 for (i = 0; i < 2; i++) {
1014 err = NAND_READ_OOB(dev, page_number + i, oob,
1015 chip->chip_geom.oob_size, 0);
1016 if (err) {
1017 device_printf(dev, "%s: cannot allocate OOB\n",
1018 __func__);
1019 free(oob, M_NAND);
1020 return (ENOMEM);
1021 }
1022
1023 if (!oob[0]) {
1024 *bad = 1;
1025 free(oob, M_NAND);
1026 return (0);
1027 }
1028 }
1029
1030 free(oob, M_NAND);
1031
1032 return (0);
1033}
1034
1035static int
1036generic_get_ecc(device_t dev, void *buf, void *ecc, int *needwrite)
1037{
1038 struct nand_chip *chip = device_get_softc(dev);
1039 struct chip_geom *cg = &chip->chip_geom;
1040
1041 return (NANDBUS_GET_ECC(device_get_parent(dev), buf, cg->page_size,
1042 ecc, needwrite));
1043}
1044
1045static int
1046generic_correct_ecc(device_t dev, void *buf, void *readecc, void *calcecc)
1047{
1048 struct nand_chip *chip = device_get_softc(dev);
1049 struct chip_geom *cg = &chip->chip_geom;
1050
1051 return (NANDBUS_CORRECT_ECC(device_get_parent(dev), buf,
1052 cg->page_size, readecc, calcecc));
1053}
1054
1055
1056#if 0
1057int
1058nand_chng_read_col(device_t nand, uint32_t col, void *buf, size_t len)
1059{
1060 struct nand_chip *chip;
1061 device_t nandbus;
1062
1063 chip = device_get_softc(nand);
1064 nandbus = device_get_parent(nand);
1065
1066 if (NANDBUS_SEND_COMMAND(nandbus, NAND_CMD_CHNG_READ_COL))
1067 return (ENXIO);
1068
1069 if (NANDBUS_SEND_ADDRESS(nandbus, -1, col, -1))
1070 return (ENXIO);
1071
1072 if (NANDBUS_SEND_COMMAND(nandbus, NAND_CMD_CHNG_READ_COL_END))
1073 return (ENXIO);
1074
1075 if (NANDBUS_START_COMMAND(nandbus))
1076 return (ENXIO);
1077
1078 if (buf != NULL && len > 0)
1079 NANDBUS_READ_BUFFER(nandbus, buf, len);
1080
1081 return (0);
1082}
1083
1084int
1085nand_chng_write_col(device_t dev, uint32_t col, void *buf,
1086 size_t len)
1087{
1088 struct nand_chip *chip;
1089 device_t nandbus;
1090
1091 chip = device_get_softc(dev);
1092 nandbus = device_get_parent(dev);
1093
1094 if (NANDBUS_SEND_COMMAND(nandbus, NAND_CMD_CHNG_WRITE_COL))
1095 return (ENXIO);
1096
1097 if (NANDBUS_SEND_ADDRESS(nandbus, -1, col, -1))
1098 return (ENXIO);
1099
1100 if (buf != NULL && len > 0)
1101 NANDBUS_WRITE_BUFFER(nandbus, buf, len);
1102
1103 if (NANDBUS_SEND_COMMAND(nandbus, NAND_CMD_CHNG_READ_COL_END))
1104 return (ENXIO);
1105
1106 if (NANDBUS_START_COMMAND(nandbus))
1107 return (ENXIO);
1108
1109 return (0);
1110}
1111
1112int
1113nand_copyback_read(device_t dev, uint32_t page, uint32_t col,
1114 void *buf, size_t len)
1115{
1116 struct nand_chip *chip;
1117 struct page_stat *pg_stat;
1118 device_t nandbus;
1119 uint32_t row;
1120
1121 nand_debug(NDBG_GEN," raw read page %x[%x] at %x", page, col, len);
1122 chip = device_get_softc(dev);
1123 nandbus = device_get_parent(dev);
1124
1125 if (nand_check_page_boundary(chip, page))
1126 return (ENXIO);
1127
1128 page_to_row(&chip->chip_geom, page, &row);
1129
1130 if (send_read_page(nand, NAND_CMD_READ, NAND_CMD_READ_CPBK, row, 0))
1131 return (ENXIO);
1132
1133 DELAY(chip->t_r);
1134 if (check_fail(nandbus))
1135 return (ENXIO);
1136
1137 if (buf != NULL && len > 0)
1138 NANDBUS_READ_BUFFER(nandbus, buf, len);
1139
1140 pg_stat = &(chip->pg_stat[page]);
1141 pg_stat->page_raw_read++;
1142
1143 return (0);
1144}
1145
1146int
1147nand_copyback_prog(device_t dev, uint32_t page, uint32_t col,
1148 void *buf, size_t len)
1149{
1150 struct nand_chip *chip;
1151 struct page_stat *pg_stat;
1152 device_t nandbus;
1153 uint32_t row;
1154
1155 nand_debug(NDBG_GEN,"copyback prog page %x[%x]", page, len);
1156 chip = device_get_softc(dev);
1157 nandbus = device_get_parent(dev);
1158
1159 if (nand_check_page_boundary(chip, page))
1160 return (ENXIO);
1161
1162 page_to_row(&chip->chip_geom, page, &row);
1163
1164 if (!can_write(nandbus))
1165 return (ENXIO);
1166
1167 if (NANDBUS_SEND_COMMAND(nandbus, NAND_CMD_CHNG_WRITE_COL))
1168 return (ENXIO);
1169
1170 if (NANDBUS_SEND_ADDRESS(nandbus, row, col, -1))
1171 return (ENXIO);
1172
1173 if (buf != NULL && len > 0)
1174 NANDBUS_WRITE_BUFFER(nandbus, buf, len);
1175
1176 if (send_end_program_page(nandbus, NAND_CMD_PROG_END))
1177 return (ENXIO);
1178
1179 DELAY(chip->t_prog);
1180
1181 if (check_fail(nandbus))
1182 return (ENXIO);
1183
1184 pg_stat = &(chip->pg_stat[page]);
1185 pg_stat->page_raw_written++;
1186
1187 return (0);
1188}
1189
1190int
1191nand_copyback_prog_intlv(device_t dev, uint32_t page)
1192{
1193 struct nand_chip *chip;
1194 struct page_stat *pg_stat;
1195 device_t nandbus;
1196 uint32_t row;
1197
1198 nand_debug(NDBG_GEN,"cache prog page %x", page);
1199 chip = device_get_softc(dev);
1200 nandbus = device_get_parent(dev);
1201
1202 if (nand_check_page_boundary(chip, page))
1203 return (ENXIO);
1204
1205 page_to_row(&chip->chip_geom, page, &row);
1206
1207 if (!can_write(nandbus))
1208 return (ENXIO);
1209
1210 if (send_start_program_page(nand, row, 0))
1211 return (ENXIO);
1212
1213 if (send_end_program_page(nandbus, NAND_CMD_PROG_INTLV))
1214 return (ENXIO);
1215
1216 DELAY(chip->t_prog);
1217
1218 if (check_fail(nandbus))
1219 return (ENXIO);
1220
1221 pg_stat = &(chip->pg_stat[page]);
1222 pg_stat->page_raw_written++;
1223
1224 return (0);
1225}
1226
1227int
1228nand_prog_cache(device_t dev, uint32_t page, uint32_t col,
1229 void *buf, size_t len, uint8_t end)
1230{
1231 struct nand_chip *chip;
1232 struct page_stat *pg_stat;
1233 device_t nandbus;
1234 uint32_t row;
1235 uint8_t command;
1236
1237 nand_debug(NDBG_GEN,"cache prog page %x[%x]", page, len);
1238 chip = device_get_softc(dev);
1239 nandbus = device_get_parent(dev);
1240
1241 if (nand_check_page_boundary(chip, page))
1242 return (ENXIO);
1243
1244 page_to_row(&chip->chip_geom, page, &row);
1245
1246 if (!can_write(nandbus))
1247 return (ENXIO);
1248
1249 if (send_start_program_page(dev, row, 0))
1250 return (ENXIO);
1251
1252 NANDBUS_WRITE_BUFFER(nandbus, buf, len);
1253
1254 if (end)
1255 command = NAND_CMD_PROG_END;
1256 else
1257 command = NAND_CMD_PROG_CACHE;
1258
1259 if (send_end_program_page(nandbus, command))
1260 return (ENXIO);
1261
1262 DELAY(chip->t_prog);
1263
1264 if (check_fail(nandbus))
1265 return (ENXIO);
1266
1267 pg_stat = &(chip->pg_stat[page]);
1268 pg_stat->page_raw_written++;
1269
1270 return (0);
1271}
1272
1273int
1274nand_read_cache(device_t dev, uint32_t page, uint32_t col,
1275 void *buf, size_t len, uint8_t end)
1276{
1277 struct nand_chip *chip;
1278 struct page_stat *pg_stat;
1279 device_t nandbus;
1280 uint32_t row;
1281 uint8_t command;
1282
1283 nand_debug(NDBG_GEN,"cache read page %x[%x] ", page, len);
1284 chip = device_get_softc(dev);
1285 nandbus = device_get_parent(dev);
1286
1287 if (nand_check_page_boundary(chip, page))
1288 return (ENXIO);
1289
1290 page_to_row(&chip->chip_geom, page, &row);
1291
1292 if (page != -1) {
1293 if (NANDBUS_SEND_COMMAND(nandbus, NAND_CMD_READ))
1294 return (ENXIO);
1295
1296 if (NANDBUS_SEND_ADDRESS(nandbus, row, col, -1))
1297 return (ENXIO);
1298 }
1299
1300 if (end)
1301 command = NAND_CMD_READ_CACHE_END;
1302 else
1303 command = NAND_CMD_READ_CACHE;
1304
1305 if (NANDBUS_SEND_COMMAND(nandbus, command))
1306 return (ENXIO);
1307
1308 if (NANDBUS_START_COMMAND(nandbus))
1309 return (ENXIO);
1310
1311 DELAY(chip->t_r);
1312 if (check_fail(nandbus))
1313 return (ENXIO);
1314
1315 if (buf != NULL && len > 0)
1316 NANDBUS_READ_BUFFER(nandbus, buf, len);
1317
1318 pg_stat = &(chip->pg_stat[page]);
1319 pg_stat->page_raw_read++;
1320
1321 return (0);
1322}
1323
1324int
1325nand_get_feature(device_t dev, uint8_t feat, void *buf)
1326{
1327 struct nand_chip *chip;
1328 device_t nandbus;
1329
1330 nand_debug(NDBG_GEN,"nand get feature");
1331
1332 chip = device_get_softc(dev);
1333 nandbus = device_get_parent(dev);
1334
1335 if (NANDBUS_SEND_COMMAND(nandbus, NAND_CMD_GET_FEATURE))
1336 return (ENXIO);
1337
1338 if (NANDBUS_SEND_ADDRESS(nandbus, -1, -1, feat))
1339 return (ENXIO);
1340
1341 if (NANDBUS_START_COMMAND(nandbus))
1342 return (ENXIO);
1343
1344 DELAY(chip->t_r);
1345 NANDBUS_READ_BUFFER(nandbus, buf, 4);
1346
1347 return (0);
1348}
1349
1350int
1351nand_set_feature(device_t dev, uint8_t feat, void *buf)
1352{
1353 struct nand_chip *chip;
1354 device_t nandbus;
1355
1356 nand_debug(NDBG_GEN,"nand set feature");
1357
1358 chip = device_get_softc(dev);
1359 nandbus = device_get_parent(dev);
1360
1361 if (NANDBUS_SEND_COMMAND(nandbus, NAND_CMD_SET_FEATURE))
1362 return (ENXIO);
1363
1364 if (NANDBUS_SEND_ADDRESS(nandbus, -1, -1, feat))
1365 return (ENXIO);
1366
1367 NANDBUS_WRITE_BUFFER(nandbus, buf, 4);
1368
1369 if (NANDBUS_START_COMMAND(nandbus))
1370 return (ENXIO);
1371
1372 return (0);
1373}
1374#endif