| Kyungmin Park | 87590e2 | 2005-09-27 11:26:39 +0100 | [diff] [blame] | 1 | /* | 
 | 2 |  *  linux/include/linux/mtd/bbm.h | 
 | 3 |  * | 
 | 4 |  *  NAND family Bad Block Management (BBM) header file | 
 | 5 |  *    - Bad Block Table (BBT) implementation | 
 | 6 |  * | 
| David Woodhouse | a1452a3 | 2010-08-08 20:58:20 +0100 | [diff] [blame] | 7 |  *  Copyright © 2005 Samsung Electronics | 
| Kyungmin Park | 87590e2 | 2005-09-27 11:26:39 +0100 | [diff] [blame] | 8 |  *  Kyungmin Park <kyungmin.park@samsung.com> | 
 | 9 |  * | 
| David Woodhouse | a1452a3 | 2010-08-08 20:58:20 +0100 | [diff] [blame] | 10 |  *  Copyright © 2000-2005 | 
| Kyungmin Park | 87590e2 | 2005-09-27 11:26:39 +0100 | [diff] [blame] | 11 |  *  Thomas Gleixner <tglx@linuxtronix.de> | 
 | 12 |  * | 
| David Woodhouse | a1452a3 | 2010-08-08 20:58:20 +0100 | [diff] [blame] | 13 |  * This program is free software; you can redistribute it and/or modify | 
 | 14 |  * it under the terms of the GNU General Public License as published by | 
 | 15 |  * the Free Software Foundation; either version 2 of the License, or | 
 | 16 |  * (at your option) any later version. | 
 | 17 |  * | 
 | 18 |  * This program is distributed in the hope that it will be useful, | 
 | 19 |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
 | 20 |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
 | 21 |  * GNU General Public License for more details. | 
 | 22 |  * | 
 | 23 |  * You should have received a copy of the GNU General Public License | 
 | 24 |  * along with this program; if not, write to the Free Software | 
 | 25 |  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA | 
 | 26 |  * | 
| Kyungmin Park | 87590e2 | 2005-09-27 11:26:39 +0100 | [diff] [blame] | 27 |  */ | 
 | 28 | #ifndef __LINUX_MTD_BBM_H | 
 | 29 | #define __LINUX_MTD_BBM_H | 
 | 30 |  | 
 | 31 | /* The maximum number of NAND chips in an array */ | 
 | 32 | #define NAND_MAX_CHIPS		8 | 
 | 33 |  | 
 | 34 | /** | 
 | 35 |  * struct nand_bbt_descr - bad block table descriptor | 
| Alessandro Rubini | c62d81b | 2009-09-20 23:28:04 +0200 | [diff] [blame] | 36 |  * @options:	options for this descriptor | 
 | 37 |  * @pages:	the page(s) where we find the bbt, used with option BBT_ABSPAGE | 
 | 38 |  *		when bbt is searched, then we store the found bbts pages here. | 
 | 39 |  *		Its an array and supports up to 8 chips now | 
 | 40 |  * @offs:	offset of the pattern in the oob area of the page | 
 | 41 |  * @veroffs:	offset of the bbt version counter in the oob are of the page | 
 | 42 |  * @version:	version read from the bbt page during scan | 
 | 43 |  * @len:	length of the pattern, if 0 no pattern check is performed | 
 | 44 |  * @maxblocks:	maximum number of blocks to search for a bbt. This number of | 
 | 45 |  *		blocks is reserved at the end of the device where the tables are | 
 | 46 |  *		written. | 
 | 47 |  * @reserved_block_code: if non-0, this pattern denotes a reserved (rather than | 
 | 48 |  *              bad) block in the stored bbt | 
 | 49 |  * @pattern:	pattern to identify bad block table or factory marked good / | 
 | 50 |  *		bad blocks, can be NULL, if len = 0 | 
| Kyungmin Park | 87590e2 | 2005-09-27 11:26:39 +0100 | [diff] [blame] | 51 |  * | 
 | 52 |  * Descriptor for the bad block table marker and the descriptor for the | 
 | 53 |  * pattern which identifies good and bad blocks. The assumption is made | 
 | 54 |  * that the pattern and the version count are always located in the oob area | 
 | 55 |  * of the first block. | 
 | 56 |  */ | 
 | 57 | struct nand_bbt_descr { | 
 | 58 | 	int options; | 
 | 59 | 	int pages[NAND_MAX_CHIPS]; | 
 | 60 | 	int offs; | 
 | 61 | 	int veroffs; | 
 | 62 | 	uint8_t version[NAND_MAX_CHIPS]; | 
 | 63 | 	int len; | 
 | 64 | 	int maxblocks; | 
 | 65 | 	int reserved_block_code; | 
 | 66 | 	uint8_t *pattern; | 
 | 67 | }; | 
 | 68 |  | 
 | 69 | /* Options for the bad block table descriptors */ | 
 | 70 |  | 
 | 71 | /* The number of bits used per block in the bbt on the device */ | 
 | 72 | #define NAND_BBT_NRBITS_MSK	0x0000000F | 
 | 73 | #define NAND_BBT_1BIT		0x00000001 | 
 | 74 | #define NAND_BBT_2BIT		0x00000002 | 
 | 75 | #define NAND_BBT_4BIT		0x00000004 | 
 | 76 | #define NAND_BBT_8BIT		0x00000008 | 
 | 77 | /* The bad block table is in the last good block of the device */ | 
 | 78 | #define NAND_BBT_LASTBLOCK	0x00000010 | 
 | 79 | /* The bbt is at the given page, else we must scan for the bbt */ | 
 | 80 | #define NAND_BBT_ABSPAGE	0x00000020 | 
 | 81 | /* The bbt is at the given page, else we must scan for the bbt */ | 
 | 82 | #define NAND_BBT_SEARCH		0x00000040 | 
 | 83 | /* bbt is stored per chip on multichip devices */ | 
 | 84 | #define NAND_BBT_PERCHIP	0x00000080 | 
 | 85 | /* bbt has a version counter at offset veroffs */ | 
 | 86 | #define NAND_BBT_VERSION	0x00000100 | 
| Sebastian Andrzej Siewior | 453281a | 2010-10-01 21:37:37 +0200 | [diff] [blame] | 87 | /* Create a bbt if none exists */ | 
| Kyungmin Park | 87590e2 | 2005-09-27 11:26:39 +0100 | [diff] [blame] | 88 | #define NAND_BBT_CREATE		0x00000200 | 
| Brian Norris | b8f8068 | 2011-05-31 16:31:24 -0700 | [diff] [blame] | 89 | /* | 
 | 90 |  * Create an empty BBT with no vendor information. Vendor's information may be | 
 | 91 |  * unavailable, for example, if the NAND controller has a different data and OOB | 
 | 92 |  * layout or if this information is already purged. Must be used in conjunction | 
 | 93 |  * with NAND_BBT_CREATE. | 
 | 94 |  */ | 
| Brian Norris | b4dc53e | 2011-05-31 16:31:26 -0700 | [diff] [blame] | 95 | #define NAND_BBT_CREATE_EMPTY	0x00000400 | 
| Kyungmin Park | 87590e2 | 2005-09-27 11:26:39 +0100 | [diff] [blame] | 96 | /* Search good / bad pattern through all pages of a block */ | 
| Brian Norris | b4dc53e | 2011-05-31 16:31:26 -0700 | [diff] [blame] | 97 | #define NAND_BBT_SCANALLPAGES	0x00000800 | 
| Kyungmin Park | 87590e2 | 2005-09-27 11:26:39 +0100 | [diff] [blame] | 98 | /* Scan block empty during good / bad block scan */ | 
| Brian Norris | b4dc53e | 2011-05-31 16:31:26 -0700 | [diff] [blame] | 99 | #define NAND_BBT_SCANEMPTY	0x00001000 | 
| Kyungmin Park | 87590e2 | 2005-09-27 11:26:39 +0100 | [diff] [blame] | 100 | /* Write bbt if neccecary */ | 
| Brian Norris | b4dc53e | 2011-05-31 16:31:26 -0700 | [diff] [blame] | 101 | #define NAND_BBT_WRITE		0x00002000 | 
| Kyungmin Park | 87590e2 | 2005-09-27 11:26:39 +0100 | [diff] [blame] | 102 | /* Read and write back block contents when writing bbt */ | 
| Brian Norris | b4dc53e | 2011-05-31 16:31:26 -0700 | [diff] [blame] | 103 | #define NAND_BBT_SAVECONTENT	0x00004000 | 
| Kyungmin Park | 87590e2 | 2005-09-27 11:26:39 +0100 | [diff] [blame] | 104 | /* Search good / bad pattern on the first and the second page */ | 
| Brian Norris | b4dc53e | 2011-05-31 16:31:26 -0700 | [diff] [blame] | 105 | #define NAND_BBT_SCAN2NDPAGE	0x00008000 | 
| Brian Norris | 30fe811 | 2010-06-23 13:36:02 -0700 | [diff] [blame] | 106 | /* Search good / bad pattern on the last page of the eraseblock */ | 
| Brian Norris | b4dc53e | 2011-05-31 16:31:26 -0700 | [diff] [blame] | 107 | #define NAND_BBT_SCANLASTPAGE	0x00010000 | 
| Brian Norris | a40f734 | 2011-05-31 16:31:22 -0700 | [diff] [blame] | 108 | /* | 
 | 109 |  * Use a flash based bad block table. By default, OOB identifier is saved in | 
 | 110 |  * OOB area. This option is passed to the default bad block table function. | 
 | 111 |  */ | 
| Brian Norris | b4dc53e | 2011-05-31 16:31:26 -0700 | [diff] [blame] | 112 | #define NAND_BBT_USE_FLASH	0x00020000 | 
| Brian Norris | a40f734 | 2011-05-31 16:31:22 -0700 | [diff] [blame] | 113 | /* Do not store flash based bad block table in OOB area; store it in-band */ | 
| Brian Norris | b4dc53e | 2011-05-31 16:31:26 -0700 | [diff] [blame] | 114 | #define NAND_BBT_NO_OOB		0x00040000 | 
| Brian Norris | e2414f4 | 2012-02-06 13:44:00 -0800 | [diff] [blame] | 115 | /* | 
 | 116 |  * Do not write new bad block markers to OOB; useful, e.g., when ECC covers | 
 | 117 |  * entire spare area. Must be used with NAND_BBT_USE_FLASH. | 
 | 118 |  */ | 
 | 119 | #define NAND_BBT_NO_OOB_BBM	0x00080000 | 
| Brian Norris | b4dc53e | 2011-05-31 16:31:26 -0700 | [diff] [blame] | 120 |  | 
| Brian Norris | 9eeff82 | 2011-05-31 16:31:27 -0700 | [diff] [blame] | 121 | /* | 
 | 122 |  * Flag set by nand_create_default_bbt_descr(), marking that the nand_bbt_descr | 
 | 123 |  * was allocated dynamicaly and must be freed in nand_release(). Has no meaning | 
 | 124 |  * in nand_chip.bbt_options. | 
 | 125 |  */ | 
| Brian Norris | b4dc53e | 2011-05-31 16:31:26 -0700 | [diff] [blame] | 126 | #define NAND_BBT_DYNAMICSTRUCT	0x80000000 | 
| Kyungmin Park | 87590e2 | 2005-09-27 11:26:39 +0100 | [diff] [blame] | 127 |  | 
 | 128 | /* The maximum number of blocks to scan for a bbt */ | 
 | 129 | #define NAND_BBT_SCAN_MAXBLOCKS	4 | 
 | 130 |  | 
 | 131 | /* | 
 | 132 |  * Constants for oob configuration | 
 | 133 |  */ | 
| Alessandro Rubini | c62d81b | 2009-09-20 23:28:04 +0200 | [diff] [blame] | 134 | #define NAND_SMALL_BADBLOCK_POS		5 | 
 | 135 | #define NAND_LARGE_BADBLOCK_POS		0 | 
 | 136 | #define ONENAND_BADBLOCK_POS		0 | 
| Kyungmin Park | 87590e2 | 2005-09-27 11:26:39 +0100 | [diff] [blame] | 137 |  | 
| Kyungmin Park | 211ac75 | 2007-02-07 12:15:01 +0900 | [diff] [blame] | 138 | /* | 
 | 139 |  * Bad block scanning errors | 
 | 140 |  */ | 
 | 141 | #define ONENAND_BBT_READ_ERROR		1 | 
 | 142 | #define ONENAND_BBT_READ_ECC_ERROR	2 | 
 | 143 | #define ONENAND_BBT_READ_FATAL_ERROR	4 | 
 | 144 |  | 
| Kyungmin Park | 87590e2 | 2005-09-27 11:26:39 +0100 | [diff] [blame] | 145 | /** | 
| Randy Dunlap | ea9b6dc | 2006-06-28 21:48:38 -0700 | [diff] [blame] | 146 |  * struct bbm_info - [GENERIC] Bad Block Table data structure | 
 | 147 |  * @bbt_erase_shift:	[INTERN] number of address bits in a bbt entry | 
 | 148 |  * @badblockpos:	[INTERN] position of the bad block marker in the oob area | 
 | 149 |  * @options:		options for this descriptor | 
 | 150 |  * @bbt:		[INTERN] bad block table pointer | 
 | 151 |  * @isbad_bbt:		function to determine if a block is bad | 
 | 152 |  * @badblock_pattern:	[REPLACEABLE] bad block scan pattern used for | 
 | 153 |  *			initial bad block scan | 
 | 154 |  * @priv:		[OPTIONAL] pointer to private bbm date | 
| Kyungmin Park | 87590e2 | 2005-09-27 11:26:39 +0100 | [diff] [blame] | 155 |  */ | 
 | 156 | struct bbm_info { | 
 | 157 | 	int bbt_erase_shift; | 
 | 158 | 	int badblockpos; | 
 | 159 | 	int options; | 
 | 160 |  | 
 | 161 | 	uint8_t *bbt; | 
 | 162 |  | 
 | 163 | 	int (*isbad_bbt)(struct mtd_info *mtd, loff_t ofs, int allowbbt); | 
 | 164 |  | 
 | 165 | 	/* TODO Add more NAND specific fileds */ | 
 | 166 | 	struct nand_bbt_descr *badblock_pattern; | 
 | 167 |  | 
 | 168 | 	void *priv; | 
 | 169 | }; | 
 | 170 |  | 
 | 171 | /* OneNAND BBT interface */ | 
 | 172 | extern int onenand_scan_bbt(struct mtd_info *mtd, struct nand_bbt_descr *bd); | 
 | 173 | extern int onenand_default_bbt(struct mtd_info *mtd); | 
 | 174 |  | 
 | 175 | #endif	/* __LINUX_MTD_BBM_H */ |