187590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park/* 287590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park * linux/include/linux/mtd/bbm.h 387590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park * 487590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park * NAND family Bad Block Management (BBM) header file 587590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park * - Bad Block Table (BBT) implementation 687590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park * 7a1452a3771c4eb85bd779790b040efdc36f4274eDavid Woodhouse * Copyright © 2005 Samsung Electronics 887590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park * Kyungmin Park <kyungmin.park@samsung.com> 987590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park * 10a1452a3771c4eb85bd779790b040efdc36f4274eDavid Woodhouse * Copyright © 2000-2005 1187590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park * Thomas Gleixner <tglx@linuxtronix.de> 1287590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park * 13a1452a3771c4eb85bd779790b040efdc36f4274eDavid Woodhouse * This program is free software; you can redistribute it and/or modify 14a1452a3771c4eb85bd779790b040efdc36f4274eDavid Woodhouse * it under the terms of the GNU General Public License as published by 15a1452a3771c4eb85bd779790b040efdc36f4274eDavid Woodhouse * the Free Software Foundation; either version 2 of the License, or 16a1452a3771c4eb85bd779790b040efdc36f4274eDavid Woodhouse * (at your option) any later version. 17a1452a3771c4eb85bd779790b040efdc36f4274eDavid Woodhouse * 18a1452a3771c4eb85bd779790b040efdc36f4274eDavid Woodhouse * This program is distributed in the hope that it will be useful, 19a1452a3771c4eb85bd779790b040efdc36f4274eDavid Woodhouse * but WITHOUT ANY WARRANTY; without even the implied warranty of 20a1452a3771c4eb85bd779790b040efdc36f4274eDavid Woodhouse * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 21a1452a3771c4eb85bd779790b040efdc36f4274eDavid Woodhouse * GNU General Public License for more details. 22a1452a3771c4eb85bd779790b040efdc36f4274eDavid Woodhouse * 23a1452a3771c4eb85bd779790b040efdc36f4274eDavid Woodhouse * You should have received a copy of the GNU General Public License 24a1452a3771c4eb85bd779790b040efdc36f4274eDavid Woodhouse * along with this program; if not, write to the Free Software 25a1452a3771c4eb85bd779790b040efdc36f4274eDavid Woodhouse * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 26a1452a3771c4eb85bd779790b040efdc36f4274eDavid Woodhouse * 2787590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park */ 2887590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park#ifndef __LINUX_MTD_BBM_H 2987590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park#define __LINUX_MTD_BBM_H 3087590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park 3187590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park/* The maximum number of NAND chips in an array */ 3287590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park#define NAND_MAX_CHIPS 8 3387590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park 3487590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park/** 3587590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park * struct nand_bbt_descr - bad block table descriptor 36c62d81bcfe82526cc3da10cf4fc63faad368bc60Alessandro Rubini * @options: options for this descriptor 37c62d81bcfe82526cc3da10cf4fc63faad368bc60Alessandro Rubini * @pages: the page(s) where we find the bbt, used with option BBT_ABSPAGE 38c62d81bcfe82526cc3da10cf4fc63faad368bc60Alessandro Rubini * when bbt is searched, then we store the found bbts pages here. 39c62d81bcfe82526cc3da10cf4fc63faad368bc60Alessandro Rubini * Its an array and supports up to 8 chips now 40c62d81bcfe82526cc3da10cf4fc63faad368bc60Alessandro Rubini * @offs: offset of the pattern in the oob area of the page 41c62d81bcfe82526cc3da10cf4fc63faad368bc60Alessandro Rubini * @veroffs: offset of the bbt version counter in the oob are of the page 42c62d81bcfe82526cc3da10cf4fc63faad368bc60Alessandro Rubini * @version: version read from the bbt page during scan 43c62d81bcfe82526cc3da10cf4fc63faad368bc60Alessandro Rubini * @len: length of the pattern, if 0 no pattern check is performed 44c62d81bcfe82526cc3da10cf4fc63faad368bc60Alessandro Rubini * @maxblocks: maximum number of blocks to search for a bbt. This number of 45c62d81bcfe82526cc3da10cf4fc63faad368bc60Alessandro Rubini * blocks is reserved at the end of the device where the tables are 46c62d81bcfe82526cc3da10cf4fc63faad368bc60Alessandro Rubini * written. 47c62d81bcfe82526cc3da10cf4fc63faad368bc60Alessandro Rubini * @reserved_block_code: if non-0, this pattern denotes a reserved (rather than 48c62d81bcfe82526cc3da10cf4fc63faad368bc60Alessandro Rubini * bad) block in the stored bbt 49c62d81bcfe82526cc3da10cf4fc63faad368bc60Alessandro Rubini * @pattern: pattern to identify bad block table or factory marked good / 50c62d81bcfe82526cc3da10cf4fc63faad368bc60Alessandro Rubini * bad blocks, can be NULL, if len = 0 5187590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park * 5287590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park * Descriptor for the bad block table marker and the descriptor for the 5387590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park * pattern which identifies good and bad blocks. The assumption is made 5487590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park * that the pattern and the version count are always located in the oob area 5587590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park * of the first block. 5687590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park */ 5787590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Parkstruct nand_bbt_descr { 5887590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park int options; 5987590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park int pages[NAND_MAX_CHIPS]; 6087590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park int offs; 6187590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park int veroffs; 6287590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park uint8_t version[NAND_MAX_CHIPS]; 6387590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park int len; 6487590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park int maxblocks; 6587590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park int reserved_block_code; 6687590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park uint8_t *pattern; 6787590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park}; 6887590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park 6987590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park/* Options for the bad block table descriptors */ 7087590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park 7187590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park/* The number of bits used per block in the bbt on the device */ 7287590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park#define NAND_BBT_NRBITS_MSK 0x0000000F 7387590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park#define NAND_BBT_1BIT 0x00000001 7487590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park#define NAND_BBT_2BIT 0x00000002 7587590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park#define NAND_BBT_4BIT 0x00000004 7687590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park#define NAND_BBT_8BIT 0x00000008 7787590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park/* The bad block table is in the last good block of the device */ 7887590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park#define NAND_BBT_LASTBLOCK 0x00000010 7987590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park/* The bbt is at the given page, else we must scan for the bbt */ 8087590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park#define NAND_BBT_ABSPAGE 0x00000020 8187590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park/* bbt is stored per chip on multichip devices */ 8287590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park#define NAND_BBT_PERCHIP 0x00000080 8387590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park/* bbt has a version counter at offset veroffs */ 8487590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park#define NAND_BBT_VERSION 0x00000100 85453281a973c10bce941b240d1c654d536623b16bSebastian Andrzej Siewior/* Create a bbt if none exists */ 8687590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park#define NAND_BBT_CREATE 0x00000200 87b8f80684054ec8a3bcdf35dc9c76ddf629a36482Brian Norris/* 88b8f80684054ec8a3bcdf35dc9c76ddf629a36482Brian Norris * Create an empty BBT with no vendor information. Vendor's information may be 89b8f80684054ec8a3bcdf35dc9c76ddf629a36482Brian Norris * unavailable, for example, if the NAND controller has a different data and OOB 90b8f80684054ec8a3bcdf35dc9c76ddf629a36482Brian Norris * layout or if this information is already purged. Must be used in conjunction 91b8f80684054ec8a3bcdf35dc9c76ddf629a36482Brian Norris * with NAND_BBT_CREATE. 92b8f80684054ec8a3bcdf35dc9c76ddf629a36482Brian Norris */ 93b4dc53e16ff00c0edba3d3219e216475e68951b3Brian Norris#define NAND_BBT_CREATE_EMPTY 0x00000400 9487590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park/* Write bbt if neccecary */ 95b4dc53e16ff00c0edba3d3219e216475e68951b3Brian Norris#define NAND_BBT_WRITE 0x00002000 9687590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park/* Read and write back block contents when writing bbt */ 97b4dc53e16ff00c0edba3d3219e216475e68951b3Brian Norris#define NAND_BBT_SAVECONTENT 0x00004000 9887590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park/* Search good / bad pattern on the first and the second page */ 99b4dc53e16ff00c0edba3d3219e216475e68951b3Brian Norris#define NAND_BBT_SCAN2NDPAGE 0x00008000 10030fe8115b55223cb84530ce04c4a20ba9d6dcf0bBrian Norris/* Search good / bad pattern on the last page of the eraseblock */ 101b4dc53e16ff00c0edba3d3219e216475e68951b3Brian Norris#define NAND_BBT_SCANLASTPAGE 0x00010000 102a40f73419f02e40555f692785ea1c1813d5b4c12Brian Norris/* 103a40f73419f02e40555f692785ea1c1813d5b4c12Brian Norris * Use a flash based bad block table. By default, OOB identifier is saved in 104a40f73419f02e40555f692785ea1c1813d5b4c12Brian Norris * OOB area. This option is passed to the default bad block table function. 105a40f73419f02e40555f692785ea1c1813d5b4c12Brian Norris */ 106b4dc53e16ff00c0edba3d3219e216475e68951b3Brian Norris#define NAND_BBT_USE_FLASH 0x00020000 107f3bae3df764737a168fbc51484b277cf0187933eShmulik Ladkani/* 108f3bae3df764737a168fbc51484b277cf0187933eShmulik Ladkani * Do not store flash based bad block table marker in the OOB area; store it 109f3bae3df764737a168fbc51484b277cf0187933eShmulik Ladkani * in-band. 110f3bae3df764737a168fbc51484b277cf0187933eShmulik Ladkani */ 111b4dc53e16ff00c0edba3d3219e216475e68951b3Brian Norris#define NAND_BBT_NO_OOB 0x00040000 112e2414f4c20bd4dc62186fbfd7bdec50bce6d2eadBrian Norris/* 113e2414f4c20bd4dc62186fbfd7bdec50bce6d2eadBrian Norris * Do not write new bad block markers to OOB; useful, e.g., when ECC covers 114e2414f4c20bd4dc62186fbfd7bdec50bce6d2eadBrian Norris * entire spare area. Must be used with NAND_BBT_USE_FLASH. 115e2414f4c20bd4dc62186fbfd7bdec50bce6d2eadBrian Norris */ 116e2414f4c20bd4dc62186fbfd7bdec50bce6d2eadBrian Norris#define NAND_BBT_NO_OOB_BBM 0x00080000 117b4dc53e16ff00c0edba3d3219e216475e68951b3Brian Norris 1189eeff8243677b8bbfc17e8e606e965bb591a759dBrian Norris/* 1199eeff8243677b8bbfc17e8e606e965bb591a759dBrian Norris * Flag set by nand_create_default_bbt_descr(), marking that the nand_bbt_descr 1209eeff8243677b8bbfc17e8e606e965bb591a759dBrian Norris * was allocated dynamicaly and must be freed in nand_release(). Has no meaning 1219eeff8243677b8bbfc17e8e606e965bb591a759dBrian Norris * in nand_chip.bbt_options. 1229eeff8243677b8bbfc17e8e606e965bb591a759dBrian Norris */ 123b4dc53e16ff00c0edba3d3219e216475e68951b3Brian Norris#define NAND_BBT_DYNAMICSTRUCT 0x80000000 12487590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park 12587590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park/* The maximum number of blocks to scan for a bbt */ 12687590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park#define NAND_BBT_SCAN_MAXBLOCKS 4 12787590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park 12887590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park/* 12987590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park * Constants for oob configuration 13087590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park */ 131c62d81bcfe82526cc3da10cf4fc63faad368bc60Alessandro Rubini#define NAND_SMALL_BADBLOCK_POS 5 132c62d81bcfe82526cc3da10cf4fc63faad368bc60Alessandro Rubini#define NAND_LARGE_BADBLOCK_POS 0 133c62d81bcfe82526cc3da10cf4fc63faad368bc60Alessandro Rubini#define ONENAND_BADBLOCK_POS 0 13487590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park 135211ac75f5e867ab7a54811a514814149caca42c3Kyungmin Park/* 136211ac75f5e867ab7a54811a514814149caca42c3Kyungmin Park * Bad block scanning errors 137211ac75f5e867ab7a54811a514814149caca42c3Kyungmin Park */ 138211ac75f5e867ab7a54811a514814149caca42c3Kyungmin Park#define ONENAND_BBT_READ_ERROR 1 139211ac75f5e867ab7a54811a514814149caca42c3Kyungmin Park#define ONENAND_BBT_READ_ECC_ERROR 2 140211ac75f5e867ab7a54811a514814149caca42c3Kyungmin Park#define ONENAND_BBT_READ_FATAL_ERROR 4 141211ac75f5e867ab7a54811a514814149caca42c3Kyungmin Park 14287590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park/** 143ea9b6dcc152f09c207117ab121d4fa03d2db282aRandy Dunlap * struct bbm_info - [GENERIC] Bad Block Table data structure 144ea9b6dcc152f09c207117ab121d4fa03d2db282aRandy Dunlap * @bbt_erase_shift: [INTERN] number of address bits in a bbt entry 145ea9b6dcc152f09c207117ab121d4fa03d2db282aRandy Dunlap * @badblockpos: [INTERN] position of the bad block marker in the oob area 146ea9b6dcc152f09c207117ab121d4fa03d2db282aRandy Dunlap * @options: options for this descriptor 147ea9b6dcc152f09c207117ab121d4fa03d2db282aRandy Dunlap * @bbt: [INTERN] bad block table pointer 148ea9b6dcc152f09c207117ab121d4fa03d2db282aRandy Dunlap * @isbad_bbt: function to determine if a block is bad 149ea9b6dcc152f09c207117ab121d4fa03d2db282aRandy Dunlap * @badblock_pattern: [REPLACEABLE] bad block scan pattern used for 150ea9b6dcc152f09c207117ab121d4fa03d2db282aRandy Dunlap * initial bad block scan 151ea9b6dcc152f09c207117ab121d4fa03d2db282aRandy Dunlap * @priv: [OPTIONAL] pointer to private bbm date 15287590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park */ 15387590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Parkstruct bbm_info { 15487590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park int bbt_erase_shift; 15587590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park int badblockpos; 15687590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park int options; 15787590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park 15887590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park uint8_t *bbt; 15987590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park 16087590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park int (*isbad_bbt)(struct mtd_info *mtd, loff_t ofs, int allowbbt); 16187590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park 16287590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park /* TODO Add more NAND specific fileds */ 16387590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park struct nand_bbt_descr *badblock_pattern; 16487590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park 16587590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park void *priv; 16687590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park}; 16787590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park 16887590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park/* OneNAND BBT interface */ 16987590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Parkextern int onenand_scan_bbt(struct mtd_info *mtd, struct nand_bbt_descr *bd); 17087590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Parkextern int onenand_default_bbt(struct mtd_info *mtd); 17187590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park 17287590e26ff4e7d57dfdaa81780b1b0d9e9970a4cKyungmin Park#endif /* __LINUX_MTD_BBM_H */ 173