]> CyberLeo.Net >> Repos - FreeBSD/releng/10.2.git/blob - sys/dev/nand/nand.h
- Copy stable/10@285827 to releng/10.2 in preparation for 10.2-RC1
[FreeBSD/releng/10.2.git] / sys / dev / nand / nand.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  * $FreeBSD$
27  */
28
29 #ifndef _DEV_NAND_H_
30 #define _DEV_NAND_H_
31
32 #include <sys/bus.h>
33 #include <sys/param.h>
34 #include <sys/systm.h>
35 #include <sys/lock.h>
36 #include <sys/sx.h>
37 #include <sys/taskqueue.h>
38 #include <sys/queue.h>
39 #include <sys/bio.h>
40 #include <sys/lock.h>
41 #include <sys/mutex.h>
42 #include <sys/malloc.h>
43
44 #include <dev/nand/nand_dev.h>
45
46 MALLOC_DECLARE(M_NAND);
47
48 /* Read commands */
49 #define NAND_CMD_READ           0x00
50 #define NAND_CMD_CHNG_READ_COL  0x05
51 #define NAND_CMD_READ_END       0x30
52 #define NAND_CMD_READ_CACHE     0x31
53 #define NAND_CMD_READ_CPBK      0x35
54 #define NAND_CMD_READ_CACHE_END 0x3F
55 #define NAND_CMD_CHNG_READ_COL_END      0xE0
56
57 /* Erase commands */
58 #define NAND_CMD_ERASE          0x60
59 #define NAND_CMD_ERASE_END      0xD0
60 #define NAND_CMD_ERASE_INTLV    0xD1
61
62 /* Program commands */
63 #define NAND_CMD_PROG           0x80
64 #define NAND_CMD_CHNG_WRITE_COL 0x85
65 #define NAND_CMD_PROG_END       0x10
66 #define NAND_CMD_PROG_INTLV     0x11
67 #define NAND_CMD_PROG_CACHE     0x15
68
69 /* Misc commands */
70 #define NAND_CMD_STATUS         0x70
71 #define NAND_CMD_STATUS_ENH     0x78
72 #define NAND_CMD_READ_ID        0x90
73 #define NAND_CMD_READ_PARAMETER 0xec
74 #define NAND_CMD_READ_UNIQUE_ID 0xed
75 #define NAND_CMD_GET_FEATURE    0xee
76 #define NAND_CMD_SET_FEATURE    0xef
77
78 /* Reset commands */
79 #define NAND_CMD_SYNCH_RESET    0xfc
80 #define NAND_CMD_RESET          0xff
81
82 /* Small page flash commands */
83 #define NAND_CMD_SMALLA         0x00
84 #define NAND_CMD_SMALLB         0x01
85 #define NAND_CMD_SMALLOOB       0x50
86
87 #define NAND_STATUS_FAIL        0x1
88 #define NAND_STATUS_FAILC       0x2
89 #define NAND_STATUS_ARDY        0x20
90 #define NAND_STATUS_RDY         0x40
91 #define NAND_STATUS_WP          0x80
92
93 #define NAND_LP_OOB_COLUMN_START        0x800
94 #define NAND_LP_OOBSZ                   0x40
95 #define NAND_SP_OOB_COLUMN_START        0x200
96 #define NAND_SP_OOBSZ                   0x10
97
98 #define PAGE_PARAM_LENGTH               0x100
99 #define PAGE_PARAMETER_DEF              0x0
100 #define PAGE_PARAMETER_RED_1            0x100
101 #define PAGE_PARAMETER_RED_2            0x200
102
103 #define ONFI_SIG_ADDR   0x20
104
105 #define NAND_MAX_CHIPS  0x4
106 #define NAND_MAX_OOBSZ  512
107 #define NAND_MAX_PAGESZ 16384
108
109 #define NAND_SMALL_PAGE_SIZE    0x200
110
111 #define NAND_16_BIT             0x00000001
112
113 #define NAND_ECC_NONE                   0x0
114 #define NAND_ECC_SOFT                   0x1
115 #define NAND_ECC_FULLHW                 0x2
116 #define NAND_ECC_PARTHW                 0x4
117 #define NAND_ECC_MODE_MASK              0x7
118
119 #define ECC_OK                  0
120 #define ECC_CORRECTABLE         1
121 #define ECC_ERROR_ECC           (-1)
122 #define ECC_UNCORRECTABLE       (-2)
123
124 #define NAND_MAN_SAMSUNG                0xec
125 #define NAND_MAN_HYNIX                  0xad
126 #define NAND_MAN_STMICRO                0x20
127 #define NAND_MAN_MICRON                 0x2c
128
129 struct nand_id {
130         uint8_t man_id;
131         uint8_t dev_id;
132 };
133
134 struct nand_params {
135         struct nand_id  id;
136         char            *name;
137         uint32_t        chip_size;
138         uint32_t        page_size;
139         uint32_t        oob_size;
140         uint32_t        pages_per_block;
141         uint32_t        flags;
142 };
143
144 /* nand debug levels */
145 #define NDBG_NAND       0x01
146 #define NDBG_CDEV       0x02
147 #define NDBG_GEN        0x04
148 #define NDBG_GEOM       0x08
149 #define NDBG_BUS        0x10
150 #define NDBG_SIM        0x20
151 #define NDBG_CTRL       0x40
152 #define NDBG_DRV        0x80
153 #define NDBG_ECC        0x100
154
155 /* nand_debug_function */
156 void nand_debug(int level, const char *fmt, ...);
157 extern int nand_debug_flag;
158
159 /* ONFI features bit*/
160 #define ONFI_FEAT_16BIT         0x01
161 #define ONFI_FEAT_MULT_LUN      0x02
162 #define ONFI_FEAT_INTLV_OPS     0x04
163 #define ONFI_FEAT_CPBK_RESTRICT 0x08
164 #define ONFI_FEAT_SRC_SYNCH     0x10
165
166 /* ONFI optional commands bits */
167 #define ONFI_OPTCOM_PROG_CACHE  0x01
168 #define ONFI_OPTCOM_READ_CACHE  0x02
169 #define ONFI_OPTCOM_GETSET_FEAT 0x04
170 #define ONFI_OPTCOM_STATUS_ENH  0x08
171 #define ONFI_OPTCOM_COPYBACK    0x10
172 #define ONFI_OPTCOM_UNIQUE_ID   0x20
173
174
175 /* Layout of parameter page is defined in ONFI */
176 struct onfi_params {
177         char            signature[4];
178         uint16_t        rev;
179         uint16_t        features;
180         uint16_t        optional_commands;
181         uint8_t         primary_advanced_command;
182         uint8_t         res1;
183         uint16_t        extended_parameter_page_length;
184         uint8_t         parameter_page_count;
185         uint8_t         res2[17];
186         char            manufacturer_name[12];
187         char            device_model[20];
188         uint8_t         manufacturer_id;
189         uint8_t         manufacture_date_yy;
190         uint8_t         manufacture_date_ww;
191         uint8_t         res3[13];
192         uint32_t        bytes_per_page;
193         uint16_t        spare_bytes_per_page;
194         uint32_t        bytes_per_partial_page;
195         uint16_t        spare_bytes_per_partial_page;
196         uint32_t        pages_per_block;
197         uint32_t        blocks_per_lun;
198         uint8_t         luns;
199         uint8_t         address_cycles;
200         uint8_t         bits_per_cell;
201         uint16_t        max_bad_block_per_lun;
202         uint16_t        block_endurance;
203         uint8_t         guaranteed_valid_blocks;
204         uint16_t        valid_block_endurance;
205         uint8_t         programs_per_page;
206         uint8_t         partial_prog_attr;
207         uint8_t         bits_of_ecc;
208         uint8_t         interleaved_addr_bits;
209         uint8_t         interleaved_oper_attr;
210         uint8_t         eznand_support;
211         uint8_t         res4[12];
212         uint8_t         pin_capacitance;
213         uint16_t        asynch_timing_mode_support;
214         uint16_t        asynch_prog_cache_timing_mode_support;
215         uint16_t        t_prog; /* us, max page program time */
216         uint16_t        t_bers; /* us, max block erase time */
217         uint16_t        t_r;    /* us, max page read time */
218         uint16_t        t_ccs;  /* ns, min change column setup time */
219         uint16_t        source_synch_timing_mode_support;
220         uint8_t         source_synch_feat;
221         uint16_t        clk_input_capacitance;
222         uint16_t        io_capacitance;
223         uint16_t        input_capacitance;
224         uint8_t         input_capacitance_max;
225         uint8_t         driver_strength_support;
226         uint16_t        t_r_interleaved;
227         uint16_t        t_adl;
228         uint16_t        t_r_eznand;
229         uint8_t         nv_ddr2_features;
230         uint8_t         nv_ddr2_warmup_cycles;
231         uint8_t         res5[4];
232         uint16_t        vendor_rev;
233         uint8_t         vendor_spec[88];
234         uint16_t        crc;
235 }__attribute__((packed));
236 CTASSERT(sizeof(struct onfi_params) == 256);
237
238 struct onfi_chip_params {
239         uint32_t blocks_per_lun;
240         uint32_t pages_per_block;
241         uint32_t bytes_per_page;
242         uint32_t spare_bytes_per_page;
243         uint16_t t_bers;
244         uint16_t t_prog;
245         uint16_t t_r;
246         uint16_t t_ccs;
247         uint16_t features;
248         uint8_t address_cycles;
249         uint8_t luns;
250 };
251
252 struct nand_ecc_data {
253         int     eccsize;                /* Number of data bytes per ECC step */
254         int     eccmode;
255         int     eccbytes;               /* Number of ECC bytes per step */
256
257         uint16_t        *eccpositions;          /* Positions of ecc bytes */
258         uint8_t ecccalculated[NAND_MAX_OOBSZ];
259         uint8_t eccread[NAND_MAX_OOBSZ];
260 };
261
262 struct ecc_stat {
263         uint32_t ecc_succeded;
264         uint32_t ecc_corrected;
265         uint32_t ecc_failed;
266 };
267
268 struct page_stat {
269         struct ecc_stat ecc_stat;
270         uint32_t        page_read;
271         uint32_t        page_raw_read;
272         uint32_t        page_written;
273         uint32_t        page_raw_written;
274 };
275
276 struct block_stat {
277         uint32_t block_erased;
278 };
279
280 struct chip_geom {
281         uint32_t        chip_size;
282         uint32_t        block_size;
283         uint32_t        page_size;
284         uint32_t        oob_size;
285
286         uint32_t        luns;
287         uint32_t        blks_per_lun;
288         uint32_t        blks_per_chip;
289         uint32_t        pgs_per_blk;
290
291         uint32_t        pg_mask;
292         uint32_t        blk_mask;
293         uint32_t        lun_mask;
294         uint8_t         blk_shift;
295         uint8_t         lun_shift;
296 };
297
298 struct nand_chip {
299         device_t                dev;
300         struct nand_id          id;
301         struct chip_geom        chip_geom;
302
303         uint16_t                t_prog; /* us, max page program time */
304         uint16_t                t_bers; /* us, max block erase time */
305         uint16_t                t_r;    /* us, max page read time */
306         uint16_t                t_ccs;  /* ns, min change column setup time */
307         uint8_t                 num;
308         uint8_t                 flags;
309
310         struct page_stat        *pg_stat;
311         struct block_stat       *blk_stat;
312         struct nand_softc       *nand;
313         struct nand_bbt         *bbt;
314         struct nand_ops         *ops;
315         struct cdev             *cdev;
316
317         struct disk             *ndisk;
318         struct disk             *rdisk;
319         struct bio_queue_head   bioq;   /* bio queue */
320         struct mtx              qlock;  /* bioq lock */
321         struct taskqueue        *tq;    /* private task queue for i/o request */
322         struct task             iotask; /* i/o processing */
323
324 };
325
326 struct nand_softc {
327         uint8_t                 flags;
328
329         char                    *chip_cdev_name;
330         struct nand_ecc_data    ecc;
331 };
332
333 /* NAND ops */
334 int nand_erase_blocks(struct nand_chip *chip, off_t offset, size_t len);
335 int nand_prog_pages(struct nand_chip *chip, uint32_t offset, uint8_t *buf,
336     uint32_t len);
337 int nand_read_pages(struct nand_chip *chip, uint32_t offset, void *buf,
338     uint32_t len);
339 int nand_read_pages_raw(struct nand_chip *chip, uint32_t offset, void *buf,
340     uint32_t len);
341 int nand_prog_pages_raw(struct nand_chip *chip, uint32_t offset, void *buf,
342     uint32_t len);
343 int nand_read_oob(struct nand_chip *chip, uint32_t page, void *buf,
344     uint32_t len);
345 int nand_prog_oob(struct nand_chip *chip, uint32_t page, void *buf,
346     uint32_t len);
347
348 int nand_select_cs(device_t dev, uint8_t cs);
349
350 int nand_read_parameter(struct nand_softc *nand, struct onfi_params *param);
351 int nand_synch_reset(struct nand_softc *nand);
352 int nand_chng_read_col(device_t dev, uint32_t col, void *buf, size_t len);
353 int nand_chng_write_col(device_t dev, uint32_t col, void *buf, size_t len);
354 int nand_get_feature(device_t dev, uint8_t feat, void* buf);
355 int nand_set_feature(device_t dev, uint8_t feat, void* buf);
356
357
358 int nand_erase_block_intlv(device_t dev, uint32_t block);
359 int nand_copyback_read(device_t dev, uint32_t page, uint32_t col,
360     void *buf, size_t len);
361 int nand_copyback_prog(device_t dev, uint32_t page, uint32_t col,
362     void *buf, size_t len);
363 int nand_copyback_prog_intlv(device_t dev, uint32_t page);
364 int nand_prog_cache(device_t dev, uint32_t page, uint32_t col,
365     void *buf, size_t len, uint8_t end);
366 int nand_prog_intlv(device_t dev, uint32_t page, uint32_t col,
367     void *buf, size_t len);
368 int nand_read_cache(device_t dev, uint32_t page, uint32_t col,
369     void *buf, size_t len, uint8_t end);
370
371 int nand_write_ecc(struct nand_softc *nand, uint32_t page, uint8_t *data);
372 int nand_read_ecc(struct nand_softc *nand, uint32_t page, uint8_t *data);
373
374 int nand_softecc_get(device_t dev, uint8_t *buf, int pagesize, uint8_t *ecc);
375 int nand_softecc_correct(device_t dev, uint8_t *buf, int pagesize,
376     uint8_t *readecc, uint8_t *calcecc);
377
378 /* Chip initialization */
379 void nand_init(struct nand_softc *nand, device_t dev, int ecc_mode,
380     int ecc_bytes, int ecc_size, uint16_t* eccposition, char* cdev_name);
381 void nand_detach(struct nand_softc *nand);
382 struct nand_params *nand_get_params(struct nand_id *id);
383
384 void nand_onfi_set_params(struct nand_chip *chip, struct onfi_chip_params *params);
385 void nand_set_params(struct nand_chip *chip, struct nand_params *params);
386 int  nand_init_stat(struct nand_chip *chip);
387 void nand_destroy_stat(struct nand_chip *chip);
388
389 /* BBT */
390 int nand_init_bbt(struct nand_chip *chip);
391 void nand_destroy_bbt(struct nand_chip *chip);
392 int nand_update_bbt(struct nand_chip *chip);
393 int nand_mark_bad_block(struct nand_chip* chip, uint32_t block_num);
394 int nand_check_bad_block(struct nand_chip* chip, uint32_t block_num);
395
396 /* cdev creation/removal */
397 int  nand_make_dev(struct nand_chip* chip);
398 void nand_destroy_dev(struct nand_chip *chip);
399
400 int  create_geom_disk(struct nand_chip* chip);
401 int  create_geom_raw_disk(struct nand_chip *chip);
402 void destroy_geom_disk(struct nand_chip *chip);
403 void destroy_geom_raw_disk(struct nand_chip *chip);
404
405 int init_chip_geom(struct chip_geom* cg, uint32_t luns, uint32_t blks_per_lun,
406     uint32_t pgs_per_blk, uint32_t pg_size, uint32_t oob_size);
407 int nand_row_to_blkpg(struct chip_geom *cg, uint32_t row, uint32_t *lun,
408     uint32_t *blk, uint32_t *pg);
409 int page_to_row(struct chip_geom *cg, uint32_t page, uint32_t *row);
410 int nand_check_page_boundary(struct nand_chip *chip, uint32_t page);
411 void nand_get_chip_param(struct nand_chip *chip, struct chip_param_io *param);
412
413 #endif /* _DEV_NAND_H_ */