xref: /rk3399_rockchip-uboot/include/linux/mtd/bbm.h (revision 1a4596601fd395f3afb8f82f3f840c5e00bdd57a)
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  *
7d7e8ce10SKyungmin Park  *  Copyright (c) 2005-2007 Samsung Electronics
8d7e8ce10SKyungmin Park  *  Kyungmin Park <kyungmin.park@samsung.com>
9d7e8ce10SKyungmin Park  *
10d7e8ce10SKyungmin Park  *  Copyright (c) 2000-2005
11d7e8ce10SKyungmin Park  *  Thomas Gleixner <tglx@linuxtronix.de>
12d7e8ce10SKyungmin Park  *
13*1a459660SWolfgang Denk  * SPDX-License-Identifier:	GPL-2.0+
14d7e8ce10SKyungmin Park  */
15d7e8ce10SKyungmin Park #ifndef __LINUX_MTD_BBM_H
16d7e8ce10SKyungmin Park #define __LINUX_MTD_BBM_H
17d7e8ce10SKyungmin Park 
18d7e8ce10SKyungmin Park /* The maximum number of NAND chips in an array */
196c869637SWolfgang Grandegger #ifndef CONFIG_SYS_NAND_MAX_CHIPS
206c869637SWolfgang Grandegger #define CONFIG_SYS_NAND_MAX_CHIPS	1
21d7e8ce10SKyungmin Park #endif
22d7e8ce10SKyungmin Park 
23d7e8ce10SKyungmin Park /**
24d7e8ce10SKyungmin Park  * struct nand_bbt_descr - bad block table descriptor
25d7e8ce10SKyungmin Park  * @param options	options for this descriptor
26d7e8ce10SKyungmin Park  * @param pages		the page(s) where we find the bbt, used with
27d7e8ce10SKyungmin Park  *			option BBT_ABSPAGE when bbt is searched,
28d7e8ce10SKyungmin Park  *			then we store the found bbts pages here.
29d7e8ce10SKyungmin Park  *			Its an array and supports up to 8 chips now
30d7e8ce10SKyungmin Park  * @param offs		offset of the pattern in the oob area of the page
31d7e8ce10SKyungmin Park  * @param veroffs	offset of the bbt version counter in the oob are of the page
32d7e8ce10SKyungmin Park  * @param version	version read from the bbt page during scan
33d7e8ce10SKyungmin Park  * @param len		length of the pattern, if 0 no pattern check is performed
34d7e8ce10SKyungmin Park  * @param maxblocks	maximum number of blocks to search for a bbt. This number of
35d7e8ce10SKyungmin Park  *			blocks is reserved at the end of the device
36d7e8ce10SKyungmin Park  *			where the tables are written.
37d7e8ce10SKyungmin Park  * @param reserved_block_code	if non-0, this pattern denotes a reserved
38d7e8ce10SKyungmin Park  *			(rather than bad) block in the stored bbt
39d7e8ce10SKyungmin Park  * @param pattern	pattern to identify bad block table or factory marked
40d7e8ce10SKyungmin Park  *			good / 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 /* Search good / bad pattern through all pages of a block */
85dfe64e2cSSergey Lapin #define NAND_BBT_SCANALLPAGES	0x00000800
86d7e8ce10SKyungmin Park /* Scan block empty during good / bad block scan */
87dfe64e2cSSergey Lapin #define NAND_BBT_SCANEMPTY	0x00001000
88d7e8ce10SKyungmin Park /* Write bbt if neccecary */
89dfe64e2cSSergey Lapin #define NAND_BBT_WRITE		0x00002000
90d7e8ce10SKyungmin Park /* Read and write back block contents when writing bbt */
91dfe64e2cSSergey Lapin #define NAND_BBT_SAVECONTENT	0x00004000
92d7e8ce10SKyungmin Park /* Search good / bad pattern on the first and the second page */
93dfe64e2cSSergey Lapin #define NAND_BBT_SCAN2NDPAGE	0x00008000
942a8e0fc8SChristian Hitz /* Search good / bad pattern on the last page of the eraseblock */
95dfe64e2cSSergey Lapin #define NAND_BBT_SCANLASTPAGE	0x00010000
96dfe64e2cSSergey Lapin /*
97dfe64e2cSSergey Lapin  * Use a flash based bad block table. By default, OOB identifier is saved in
98dfe64e2cSSergey Lapin  * OOB area. This option is passed to the default bad block table function.
99dfe64e2cSSergey Lapin  */
100dfe64e2cSSergey Lapin #define NAND_BBT_USE_FLASH	0x00020000
101dfe64e2cSSergey Lapin /*
102dfe64e2cSSergey Lapin  * Do not store flash based bad block table marker in the OOB area; store it
103dfe64e2cSSergey Lapin  * in-band.
104dfe64e2cSSergey Lapin  */
105dfe64e2cSSergey Lapin #define NAND_BBT_NO_OOB		0x00040000
106dfe64e2cSSergey Lapin /*
107dfe64e2cSSergey Lapin  * Do not write new bad block markers to OOB; useful, e.g., when ECC covers
108dfe64e2cSSergey Lapin  * entire spare area. Must be used with NAND_BBT_USE_FLASH.
109dfe64e2cSSergey Lapin  */
110dfe64e2cSSergey Lapin #define NAND_BBT_NO_OOB_BBM	0x00080000
111dfe64e2cSSergey Lapin 
112dfe64e2cSSergey Lapin /*
113dfe64e2cSSergey Lapin  * Flag set by nand_create_default_bbt_descr(), marking that the nand_bbt_descr
114dfe64e2cSSergey Lapin  * was allocated dynamicaly and must be freed in nand_release(). Has no meaning
115dfe64e2cSSergey Lapin  * in nand_chip.bbt_options.
116dfe64e2cSSergey Lapin  */
117dfe64e2cSSergey Lapin #define NAND_BBT_DYNAMICSTRUCT	0x80000000
118d7e8ce10SKyungmin Park 
119d7e8ce10SKyungmin Park /* The maximum number of blocks to scan for a bbt */
120d7e8ce10SKyungmin Park #define NAND_BBT_SCAN_MAXBLOCKS	4
121d7e8ce10SKyungmin Park 
122d7e8ce10SKyungmin Park /*
123d7e8ce10SKyungmin Park  * Constants for oob configuration
124d7e8ce10SKyungmin Park  */
125d7e8ce10SKyungmin Park #define ONENAND_BADBLOCK_POS	0
126d7e8ce10SKyungmin Park 
127bfd7f386SKyungmin Park /*
128bfd7f386SKyungmin Park  * Bad block scanning errors
129bfd7f386SKyungmin Park  */
130bfd7f386SKyungmin Park #define ONENAND_BBT_READ_ERROR          1
131bfd7f386SKyungmin Park #define ONENAND_BBT_READ_ECC_ERROR      2
132bfd7f386SKyungmin Park #define ONENAND_BBT_READ_FATAL_ERROR    4
133bfd7f386SKyungmin Park 
134d7e8ce10SKyungmin Park /**
135d7e8ce10SKyungmin Park  * struct bbt_info - [GENERIC] Bad Block Table data structure
136d7e8ce10SKyungmin Park  * @param bbt_erase_shift	[INTERN] number of address bits in a bbt entry
137d7e8ce10SKyungmin Park  * @param badblockpos		[INTERN] position of the bad block marker in the oob area
138d7e8ce10SKyungmin Park  * @param bbt			[INTERN] bad block table pointer
139d7e8ce10SKyungmin Park  * @param badblock_pattern	[REPLACEABLE] bad block scan pattern used for initial bad block scan
140d7e8ce10SKyungmin Park  * @param priv			[OPTIONAL] pointer to private bbm date
141d7e8ce10SKyungmin Park  */
142d7e8ce10SKyungmin Park struct bbm_info {
143d7e8ce10SKyungmin Park 	int bbt_erase_shift;
144d7e8ce10SKyungmin Park 	int badblockpos;
145d7e8ce10SKyungmin Park 	int options;
146d7e8ce10SKyungmin Park 
147d7e8ce10SKyungmin Park 	uint8_t *bbt;
148d7e8ce10SKyungmin Park 
149d7e8ce10SKyungmin Park 	int (*isbad_bbt) (struct mtd_info * mtd, loff_t ofs, int allowbbt);
150d7e8ce10SKyungmin Park 
151d7e8ce10SKyungmin Park 	/* TODO Add more NAND specific fileds */
152d7e8ce10SKyungmin Park 	struct nand_bbt_descr *badblock_pattern;
153d7e8ce10SKyungmin Park 
154d7e8ce10SKyungmin Park 	void *priv;
155d7e8ce10SKyungmin Park };
156d7e8ce10SKyungmin Park 
157d7e8ce10SKyungmin Park /* OneNAND BBT interface */
158d7e8ce10SKyungmin Park extern int onenand_scan_bbt (struct mtd_info *mtd, struct nand_bbt_descr *bd);
159d7e8ce10SKyungmin Park extern int onenand_default_bbt (struct mtd_info *mtd);
160d7e8ce10SKyungmin Park 
161d7e8ce10SKyungmin Park #endif				/* __LINUX_MTD_BBM_H */
162