xref: /rk3399_rockchip-uboot/include/linux/mtd/bbm.h (revision ff94bc40af3481d47546595ba73c136de6af6929)
1d7e8ce10SKyungmin Park /*
2d7e8ce10SKyungmin Park  *  linux/include/linux/mtd/bbm.h
3d7e8ce10SKyungmin Park  *
4d7e8ce10SKyungmin Park  *  NAND family Bad Block Management (BBM) header file
5d7e8ce10SKyungmin Park  *    - Bad Block Table (BBT) implementation
6d7e8ce10SKyungmin Park  *
7*ff94bc40SHeiko Schocher  *  Copyright © 2005 Samsung Electronics
8d7e8ce10SKyungmin Park  *  Kyungmin Park <kyungmin.park@samsung.com>
9d7e8ce10SKyungmin Park  *
10*ff94bc40SHeiko Schocher  *  Copyright © 2000-2005
11d7e8ce10SKyungmin Park  *  Thomas Gleixner <tglx@linuxtronix.de>
12d7e8ce10SKyungmin Park  *
131a459660SWolfgang Denk  * SPDX-License-Identifier:	GPL-2.0+
14*ff94bc40SHeiko Schocher  *
15d7e8ce10SKyungmin Park  */
16d7e8ce10SKyungmin Park #ifndef __LINUX_MTD_BBM_H
17d7e8ce10SKyungmin Park #define __LINUX_MTD_BBM_H
18d7e8ce10SKyungmin Park 
19d7e8ce10SKyungmin Park /* The maximum number of NAND chips in an array */
206c869637SWolfgang Grandegger #ifndef CONFIG_SYS_NAND_MAX_CHIPS
216c869637SWolfgang Grandegger #define CONFIG_SYS_NAND_MAX_CHIPS	1
22d7e8ce10SKyungmin Park #endif
23d7e8ce10SKyungmin Park 
24d7e8ce10SKyungmin Park /**
25d7e8ce10SKyungmin Park  * struct nand_bbt_descr - bad block table descriptor
26*ff94bc40SHeiko Schocher  * @options:	options for this descriptor
27*ff94bc40SHeiko Schocher  * @pages:	the page(s) where we find the bbt, used with option BBT_ABSPAGE
28*ff94bc40SHeiko Schocher  *		when bbt is searched, then we store the found bbts pages here.
29d7e8ce10SKyungmin Park  *		Its an array and supports up to 8 chips now
30*ff94bc40SHeiko Schocher  * @offs:	offset of the pattern in the oob area of the page
31*ff94bc40SHeiko Schocher  * @veroffs:	offset of the bbt version counter in the oob are of the page
32*ff94bc40SHeiko Schocher  * @version:	version read from the bbt page during scan
33*ff94bc40SHeiko Schocher  * @len:	length of the pattern, if 0 no pattern check is performed
34*ff94bc40SHeiko Schocher  * @maxblocks:	maximum number of blocks to search for a bbt. This number of
35*ff94bc40SHeiko Schocher  *		blocks is reserved at the end of the device where the tables are
36*ff94bc40SHeiko Schocher  *		written.
37*ff94bc40SHeiko Schocher  * @reserved_block_code: if non-0, this pattern denotes a reserved (rather than
38*ff94bc40SHeiko Schocher  *              bad) block in the stored bbt
39*ff94bc40SHeiko Schocher  * @pattern:	pattern to identify bad block table or factory marked good /
40*ff94bc40SHeiko Schocher  *		bad blocks, can be NULL, if len = 0
41d7e8ce10SKyungmin Park  *
42d7e8ce10SKyungmin Park  * Descriptor for the bad block table marker and the descriptor for the
43d7e8ce10SKyungmin Park  * pattern which identifies good and bad blocks. The assumption is made
44d7e8ce10SKyungmin Park  * that the pattern and the version count are always located in the oob area
45d7e8ce10SKyungmin Park  * of the first block.
46d7e8ce10SKyungmin Park  */
47d7e8ce10SKyungmin Park struct nand_bbt_descr {
48d7e8ce10SKyungmin Park 	int options;
496c869637SWolfgang Grandegger 	int pages[CONFIG_SYS_NAND_MAX_CHIPS];
50d7e8ce10SKyungmin Park 	int offs;
51d7e8ce10SKyungmin Park 	int veroffs;
526c869637SWolfgang Grandegger 	uint8_t version[CONFIG_SYS_NAND_MAX_CHIPS];
53d7e8ce10SKyungmin Park 	int len;
54d7e8ce10SKyungmin Park 	int maxblocks;
55d7e8ce10SKyungmin Park 	int reserved_block_code;
56d7e8ce10SKyungmin Park 	uint8_t *pattern;
57d7e8ce10SKyungmin Park };
58d7e8ce10SKyungmin Park 
59d7e8ce10SKyungmin Park /* Options for the bad block table descriptors */
60d7e8ce10SKyungmin Park 
61d7e8ce10SKyungmin Park /* The number of bits used per block in the bbt on the device */
62d7e8ce10SKyungmin Park #define NAND_BBT_NRBITS_MSK	0x0000000F
63d7e8ce10SKyungmin Park #define NAND_BBT_1BIT		0x00000001
64d7e8ce10SKyungmin Park #define NAND_BBT_2BIT		0x00000002
65d7e8ce10SKyungmin Park #define NAND_BBT_4BIT		0x00000004
66d7e8ce10SKyungmin Park #define NAND_BBT_8BIT		0x00000008
67d7e8ce10SKyungmin Park /* The bad block table is in the last good block of the device */
68d7e8ce10SKyungmin Park #define NAND_BBT_LASTBLOCK	0x00000010
69d7e8ce10SKyungmin Park /* The bbt is at the given page, else we must scan for the bbt */
70d7e8ce10SKyungmin Park #define NAND_BBT_ABSPAGE	0x00000020
71d7e8ce10SKyungmin Park /* bbt is stored per chip on multichip devices */
72d7e8ce10SKyungmin Park #define NAND_BBT_PERCHIP	0x00000080
73d7e8ce10SKyungmin Park /* bbt has a version counter at offset veroffs */
74d7e8ce10SKyungmin Park #define NAND_BBT_VERSION	0x00000100
752a8e0fc8SChristian Hitz /* Create a bbt if none exists */
76d7e8ce10SKyungmin Park #define NAND_BBT_CREATE		0x00000200
77dfe64e2cSSergey Lapin /*
78dfe64e2cSSergey Lapin  * Create an empty BBT with no vendor information. Vendor's information may be
79dfe64e2cSSergey Lapin  * unavailable, for example, if the NAND controller has a different data and OOB
80dfe64e2cSSergey Lapin  * layout or if this information is already purged. Must be used in conjunction
81dfe64e2cSSergey Lapin  * with NAND_BBT_CREATE.
82dfe64e2cSSergey Lapin  */
83dfe64e2cSSergey Lapin #define NAND_BBT_CREATE_EMPTY	0x00000400
84d7e8ce10SKyungmin Park /* Write bbt if neccecary */
85dfe64e2cSSergey Lapin #define NAND_BBT_WRITE		0x00002000
86d7e8ce10SKyungmin Park /* Read and write back block contents when writing bbt */
87dfe64e2cSSergey Lapin #define NAND_BBT_SAVECONTENT	0x00004000
88d7e8ce10SKyungmin Park /* Search good / bad pattern on the first and the second page */
89dfe64e2cSSergey Lapin #define NAND_BBT_SCAN2NDPAGE	0x00008000
902a8e0fc8SChristian Hitz /* Search good / bad pattern on the last page of the eraseblock */
91dfe64e2cSSergey Lapin #define NAND_BBT_SCANLASTPAGE	0x00010000
92dfe64e2cSSergey Lapin /*
93dfe64e2cSSergey Lapin  * Use a flash based bad block table. By default, OOB identifier is saved in
94dfe64e2cSSergey Lapin  * OOB area. This option is passed to the default bad block table function.
95dfe64e2cSSergey Lapin  */
96dfe64e2cSSergey Lapin #define NAND_BBT_USE_FLASH	0x00020000
97dfe64e2cSSergey Lapin /*
98dfe64e2cSSergey Lapin  * Do not store flash based bad block table marker in the OOB area; store it
99dfe64e2cSSergey Lapin  * in-band.
100dfe64e2cSSergey Lapin  */
101dfe64e2cSSergey Lapin #define NAND_BBT_NO_OOB		0x00040000
102dfe64e2cSSergey Lapin /*
103dfe64e2cSSergey Lapin  * Do not write new bad block markers to OOB; useful, e.g., when ECC covers
104dfe64e2cSSergey Lapin  * entire spare area. Must be used with NAND_BBT_USE_FLASH.
105dfe64e2cSSergey Lapin  */
106dfe64e2cSSergey Lapin #define NAND_BBT_NO_OOB_BBM	0x00080000
107dfe64e2cSSergey Lapin 
108dfe64e2cSSergey Lapin /*
109dfe64e2cSSergey Lapin  * Flag set by nand_create_default_bbt_descr(), marking that the nand_bbt_descr
110dfe64e2cSSergey Lapin  * was allocated dynamicaly and must be freed in nand_release(). Has no meaning
111dfe64e2cSSergey Lapin  * in nand_chip.bbt_options.
112dfe64e2cSSergey Lapin  */
113dfe64e2cSSergey Lapin #define NAND_BBT_DYNAMICSTRUCT	0x80000000
114d7e8ce10SKyungmin Park 
115d7e8ce10SKyungmin Park /* The maximum number of blocks to scan for a bbt */
116d7e8ce10SKyungmin Park #define NAND_BBT_SCAN_MAXBLOCKS	4
117d7e8ce10SKyungmin Park 
118d7e8ce10SKyungmin Park /*
119d7e8ce10SKyungmin Park  * Constants for oob configuration
120d7e8ce10SKyungmin Park  */
121*ff94bc40SHeiko Schocher #define NAND_SMALL_BADBLOCK_POS		5
122*ff94bc40SHeiko Schocher #define NAND_LARGE_BADBLOCK_POS		0
123d7e8ce10SKyungmin Park #define ONENAND_BADBLOCK_POS		0
124d7e8ce10SKyungmin Park 
125bfd7f386SKyungmin Park /*
126bfd7f386SKyungmin Park  * Bad block scanning errors
127bfd7f386SKyungmin Park  */
128bfd7f386SKyungmin Park #define ONENAND_BBT_READ_ERROR		1
129bfd7f386SKyungmin Park #define ONENAND_BBT_READ_ECC_ERROR	2
130bfd7f386SKyungmin Park #define ONENAND_BBT_READ_FATAL_ERROR	4
131bfd7f386SKyungmin Park 
132d7e8ce10SKyungmin Park /**
133*ff94bc40SHeiko Schocher  * struct bbm_info - [GENERIC] Bad Block Table data structure
134*ff94bc40SHeiko Schocher  * @bbt_erase_shift:	[INTERN] number of address bits in a bbt entry
135*ff94bc40SHeiko Schocher  * @badblockpos:	[INTERN] position of the bad block marker in the oob area
136*ff94bc40SHeiko Schocher  * @options:		options for this descriptor
137*ff94bc40SHeiko Schocher  * @bbt:		[INTERN] bad block table pointer
138*ff94bc40SHeiko Schocher  * @isbad_bbt:		function to determine if a block is bad
139*ff94bc40SHeiko Schocher  * @badblock_pattern:	[REPLACEABLE] bad block scan pattern used for
140*ff94bc40SHeiko Schocher  *			initial bad block scan
141*ff94bc40SHeiko Schocher  * @priv:		[OPTIONAL] pointer to private bbm date
142d7e8ce10SKyungmin Park  */
143d7e8ce10SKyungmin Park struct bbm_info {
144d7e8ce10SKyungmin Park 	int bbt_erase_shift;
145d7e8ce10SKyungmin Park 	int badblockpos;
146d7e8ce10SKyungmin Park 	int options;
147d7e8ce10SKyungmin Park 
148d7e8ce10SKyungmin Park 	uint8_t *bbt;
149d7e8ce10SKyungmin Park 
150d7e8ce10SKyungmin Park 	int (*isbad_bbt)(struct mtd_info *mtd, loff_t ofs, int allowbbt);
151d7e8ce10SKyungmin Park 
152d7e8ce10SKyungmin Park 	/* TODO Add more NAND specific fileds */
153d7e8ce10SKyungmin Park 	struct nand_bbt_descr *badblock_pattern;
154d7e8ce10SKyungmin Park 
155d7e8ce10SKyungmin Park 	void *priv;
156d7e8ce10SKyungmin Park };
157d7e8ce10SKyungmin Park 
158d7e8ce10SKyungmin Park /* OneNAND BBT interface */
159d7e8ce10SKyungmin Park extern int onenand_scan_bbt(struct mtd_info *mtd, struct nand_bbt_descr *bd);
160d7e8ce10SKyungmin Park extern int onenand_default_bbt(struct mtd_info *mtd);
161d7e8ce10SKyungmin Park 
162d7e8ce10SKyungmin Park #endif	/* __LINUX_MTD_BBM_H */
163