Lines Matching full:block
4 * Bad block table support for the NAND driver
10 * When nand_scan_bbt is called, then it tries to find the bad block table
14 * Once a new bad block is discovered then the "factory" information is updated
21 * If the tables are not versioned, then we "or" the bad block information.
24 * good / bad blocks and the bad block tables are created.
29 * The auto generated bad block table is located in the last good blocks
38 * The table uses 2 bits per block
39 * 11b: block is good
40 * 00b: block is factory marked bad
41 * 01b, 10b: block is marked bad due to wear
43 * The memory bad block table uses the following scheme:
44 * 00b: block is good
45 * 01b: block is marked bad due to wear
46 * 10b: block is reserved (to protect the bbt area)
47 * 11b: block is factory marked bad
49 * Multichip devices like DOC store the bad block info per floor.
52 * - bbts start at a page boundary, if autolocated on a block boundary
53 * - the space necessary for a bbt in FLASH does not exceed a block boundary
76 static inline uint8_t bbt_get_entry(struct nand_chip *chip, int block) in bbt_get_entry() argument
78 uint8_t entry = chip->bbt[block >> BBT_ENTRY_SHIFT]; in bbt_get_entry()
79 entry >>= (block & BBT_ENTRY_MASK) * 2; in bbt_get_entry()
83 static inline void bbt_mark_entry(struct nand_chip *chip, int block, in bbt_mark_entry() argument
86 uint8_t msk = (mark & BBT_ENTRY_MASK) << ((block & BBT_ENTRY_MASK) * 2); in bbt_mark_entry()
87 chip->bbt[block >> BBT_ENTRY_SHIFT] |= msk; in bbt_mark_entry()
104 * Check for a pattern at the given place. Used to search bad block tables and
105 * good / bad block identifiers.
124 * Check for a pattern at the given place. Used to search bad block tables and
125 * good / bad block identifiers. Same as check_pattern, but no optional empty
156 * read_bbt - [GENERIC] Read the bad block table starting from page
162 * @offs: block number offset in the table
164 * Read the bad block table starting from page.
217 pr_info("nand_read_bbt: reserved block at 0x%012llx\n", in read_bbt()
229 pr_info("nand_read_bbt: bad block at 0x%012llx\n", in read_bbt()
249 * read_abs_bbt - [GENERIC] Read the bad block table starting at a given page
252 * @td: descriptor for the bad block table
256 * Read the bad block table for all chips starting at a given page. We assume
380 * read_abs_bbts - [GENERIC] Read the bad block table(s) for all chips starting at a given page
383 * @td: descriptor for the bad block table
384 * @md: descriptor for the bad block table mirror
386 * Read the bad block table(s) for all chips starting at a given page. We
399 pr_info("Bad block table at page %d, version 0x%02X\n", in read_abs_bbts()
408 pr_info("Bad block table at page %d, version 0x%02X\n", in read_abs_bbts()
413 /* Scan a given block partially */
450 /* Check if a potential BBT block is marked as bad */
457 * No need to check for a bad BBT block if the BBM area overlaps with in bbt_block_checkbad()
458 * the bad block table marker area in OOB since writing a BBM here in bbt_block_checkbad()
459 * invalidates the bad block table marker anyway. in bbt_block_checkbad()
466 * There is no point in checking for a bad block marker if writing in bbt_block_checkbad()
480 * create_bbt - [GENERIC] Create a bad block table by scanning the device
483 * @bd: descriptor for the good/bad block search pattern
487 * Create a bad block table by scanning the device for the given good/bad block
538 * search_bbt - [GENERIC] scan the device for a specific bad block table
541 * @td: descriptor for the bad block table
543 * Read the bad block table by searching for a given ident pattern. Search is
545 * downwards. The search starts always at the start of a block. If the option
547 * the bad block information of this chip. This is necessary to provide support
550 * The bbt ident pattern resides in the oob area of the first page in a block.
558 int startblock, block, dir; in search_bbt() local
586 for (block = 0; block < td->maxblocks; block++) { in search_bbt()
588 int actblock = startblock + dir * block; in search_bbt()
591 /* Check if block is marked bad */ in search_bbt()
611 pr_warn("Bad block table not found for chip %d\n", i); in search_bbt()
613 pr_info("Bad block table found at page %d, version 0x%02X\n", in search_bbt()
620 * search_read_bbts - [GENERIC] scan the device for bad block table(s)
623 * @td: descriptor for the bad block table
624 * @md: descriptor for the bad block table mirror
626 * Search and read the bad block table(s).
647 * This functions returns a positive block number pointing a valid eraseblock
650 * pointing to a valid block we re-use it, otherwise we search for the next
673 * Automatic placement of the bad block table. Search direction in get_bbt_block()
685 int block = startblock + dir * i; in get_bbt_block() local
687 /* Check, if the block is bad */ in get_bbt_block()
688 switch (bbt_get_entry(this, block)) { in get_bbt_block()
694 page = block << (this->bbt_erase_shift - this->page_shift); in get_bbt_block()
696 /* Check, if the block is used by the mirror table */ in get_bbt_block()
698 return block; in get_bbt_block()
705 * mark_bbt_block_bad - Mark one of the block reserved for BBT bad
709 * @block: the BBT block to mark
713 * block as bad using a bad block marker and invalidating the associated
718 int chip, int block) in mark_bbt_block_bad() argument
723 bbt_mark_entry(this, block, BBT_BLOCK_WORN); in mark_bbt_block_bad()
725 to = (loff_t)block << this->bbt_erase_shift; in mark_bbt_block_bad()
728 pr_warn("nand_bbt: error %d while marking block %d bad\n", in mark_bbt_block_bad()
729 res, block); in mark_bbt_block_bad()
735 * write_bbt - [GENERIC] (Re)write the bad block table
738 * @td: descriptor for the bad block table
739 * @md: descriptor for the bad block table mirror
742 * (Re)write the bad block table.
767 /* Write bad block table per chip rather than per device? */ in write_bbt()
784 int block; in write_bbt() local
786 block = get_bbt_block(this, td, md, chip); in write_bbt()
787 if (block < 0) { in write_bbt()
788 pr_err("No space left to write bad block table\n"); in write_bbt()
789 res = block; in write_bbt()
794 * get_bbt_block() returns a block number, shift the value to in write_bbt()
797 page = block << (this->bbt_erase_shift - this->page_shift); in write_bbt()
820 /* Must we save the block contents? */ in write_bbt()
822 /* Make it block aligned */ in write_bbt()
828 pr_info("nand_bbt: error reading block for writing the bad block table\n"); in write_bbt()
831 pr_warn("nand_bbt: ECC error while reading block for writing bad block table\n"); in write_bbt()
893 pr_warn("nand_bbt: error while erasing BBT block %d\n", in write_bbt()
895 mark_bbt_block_bad(this, td, chip, block); in write_bbt()
903 pr_warn("nand_bbt: error while writing BBT block %d\n", in write_bbt()
905 mark_bbt_block_bad(this, td, chip, block); in write_bbt()
909 pr_info("Bad block table written to 0x%012llx, version 0x%02X\n", in write_bbt()
918 pr_warn("nand_bbt: error while writing bad block table %d\n", res); in write_bbt()
923 * nand_memory_bbt - [GENERIC] create a memory based bad block table
925 * @bd: descriptor for the good/bad block search pattern
942 * @bd: descriptor for the good/bad block search pattern
1003 /* Create the bad block table by scanning the device? */ in check_create()
1049 /* Write the bad block table to the device? */ in check_create()
1056 /* Write the mirror bad block table to the device? */ in check_create()
1067 * nand_update_bbt - update bad block table(s)
1069 * @offs: the offset of the newly marked block
1071 * The function updates the bad block table(s).
1105 /* Write the bad block table to the device? */ in nand_update_bbt()
1111 /* Write the mirror bad block table to the device? */ in nand_update_bbt()
1122 * mark_bbt_region - [GENERIC] mark the bad block table regions
1124 * @td: bad block table descriptor
1126 * The bad block table regions are marked as "bad" to prevent accidental
1133 int i, j, chips, block, nrblocks, update; in mark_bbt_region() local
1150 block = td->pages[i] >> (this->bbt_erase_shift - this->page_shift); in mark_bbt_region()
1151 oldval = bbt_get_entry(this, block); in mark_bbt_region()
1152 bbt_mark_entry(this, block, BBT_BLOCK_RESERVED); in mark_bbt_region()
1155 nand_update_bbt(this, (loff_t)block << in mark_bbt_region()
1161 block = ((i + 1) * nrblocks) - td->maxblocks; in mark_bbt_region()
1163 block = i * nrblocks; in mark_bbt_region()
1165 oldval = bbt_get_entry(this, block); in mark_bbt_region()
1166 bbt_mark_entry(this, block, BBT_BLOCK_RESERVED); in mark_bbt_region()
1169 block++; in mark_bbt_region()
1177 nand_update_bbt(this, (loff_t)(block - 1) << in mark_bbt_region()
1183 * verify_bbt_descr - verify the bad block description
1187 * This functions performs a few sanity checks on the bad block description
1232 * nand_scan_bbt - [NAND Interface] scan, find, read and maybe create bad block table(s)
1234 * @bd: descriptor for the good/bad block search pattern
1236 * The function checks, if a bad block table(s) is/are already available. If
1238 * the bad block table(s) to the selected place.
1240 * The bad block table memory is allocated here. It must be freed by calling
1253 * Allocate memory (2bit per block) and clear the memory bad block in nand_scan_bbt()
1262 * memory based bad block table. in nand_scan_bbt()
1287 /* Search the bad block table using a pattern in oob */ in nand_scan_bbt()
1312 * Define some generic bad / good block scan pattern which are used
1375 pr_warn("Bad block pattern already allocated; not replacing\n"); in nand_create_badblock_pattern()
1391 * nand_create_bbt - [NAND Interface] Select a default bad block table for the device
1394 * This function selects the default bad block table support for the device and
1401 /* Is a flash based bad block table requested? */ in nand_create_bbt()
1429 * nand_isreserved_bbt - [NAND Interface] Check if a block is reserved
1435 int block; in nand_isreserved_bbt() local
1437 block = (int)(offs >> this->bbt_erase_shift); in nand_isreserved_bbt()
1438 return bbt_get_entry(this, block) == BBT_BLOCK_RESERVED; in nand_isreserved_bbt()
1442 * nand_isbad_bbt - [NAND Interface] Check if a block is bad
1445 * @allowbbt: allow access to bad block table region
1449 int block, res; in nand_isbad_bbt() local
1451 block = (int)(offs >> this->bbt_erase_shift); in nand_isbad_bbt()
1452 res = bbt_get_entry(this, block); in nand_isbad_bbt()
1454 pr_debug("nand_isbad_bbt(): bbt info for offs 0x%08x: (block %d) 0x%02x\n", in nand_isbad_bbt()
1455 (unsigned int)offs, block, res); in nand_isbad_bbt()
1472 * nand_markbad_bbt - [NAND Interface] Mark a block bad in the BBT
1474 * @offs: offset of the bad block
1478 int block, ret = 0; in nand_markbad_bbt() local
1480 block = (int)(offs >> this->bbt_erase_shift); in nand_markbad_bbt()
1482 /* Mark bad block in memory */ in nand_markbad_bbt()
1483 bbt_mark_entry(this, block, BBT_BLOCK_WORN); in nand_markbad_bbt()
1485 /* Update flash-based bad block table */ in nand_markbad_bbt()