Lines Matching defs: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)
78 uint8_t entry = chip->bbt[block >> BBT_ENTRY_SHIFT];
79 entry >>= (block & BBT_ENTRY_MASK) * 2;
83 static inline void bbt_mark_entry(struct nand_chip *chip, int block,
86 uint8_t msk = (mark & BBT_ENTRY_MASK) << ((block & BBT_ENTRY_MASK) * 2);
87 chip->bbt[block >> BBT_ENTRY_SHIFT] |= msk;
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",
229 pr_info("nand_read_bbt: bad block at 0x%012llx\n",
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",
408 pr_info("Bad block table at page %d, version 0x%02X\n",
413 /* Scan a given block partially */
451 * create_bbt - [GENERIC] Create a bad block table by scanning the device
454 * @bd: descriptor for the good/bad block search pattern
458 * Create a bad block table by scanning the device for the given good/bad block
509 * search_bbt - [GENERIC] scan the device for a specific bad block table
512 * @td: descriptor for the bad block table
514 * Read the bad block table by searching for a given ident pattern. Search is
516 * downwards. The search starts always at the start of a block. If the option
518 * the bad block information of this chip. This is necessary to provide support
521 * The bbt ident pattern resides in the oob area of the first page in a block.
529 int startblock, block, dir;
558 for (block = 0; block < td->maxblocks; block++) {
560 int actblock = startblock + dir * block;
579 pr_warn("Bad block table not found for chip %d\n", i);
581 pr_info("Bad block table found at page %d, version 0x%02X\n",
588 * search_read_bbts - [GENERIC] scan the device for bad block table(s)
591 * @td: descriptor for the bad block table
592 * @md: descriptor for the bad block table mirror
594 * Search and read the bad block table(s).
615 * This functions returns a positive block number pointing a valid eraseblock
618 * pointing to a valid block we re-use it, otherwise we search for the next
641 * Automatic placement of the bad block table. Search direction
653 int block = startblock + dir * i;
655 /* Check, if the block is bad */
656 switch (bbt_get_entry(this, block)) {
662 page = block << (this->bbt_erase_shift - this->page_shift);
664 /* Check, if the block is used by the mirror table */
666 return block;
673 * mark_bbt_block_bad - Mark one of the block reserved for BBT bad
677 * @block: the BBT block to mark
681 * block as bad using a bad block marker and invalidating the associated
686 int chip, int block)
691 bbt_mark_entry(this, block, BBT_BLOCK_WORN);
693 to = (loff_t)block << this->bbt_erase_shift;
696 pr_warn("nand_bbt: error %d while marking block %d bad\n",
697 res, block);
703 * write_bbt - [GENERIC] (Re)write the bad block table
706 * @td: descriptor for the bad block table
707 * @md: descriptor for the bad block table mirror
710 * (Re)write the bad block table.
735 /* Write bad block table per chip rather than per device? */
752 int block;
754 block = get_bbt_block(this, td, md, chip);
755 if (block < 0) {
756 pr_err("No space left to write bad block table\n");
757 res = block;
762 * get_bbt_block() returns a block number, shift the value to
765 page = block << (this->bbt_erase_shift - this->page_shift);
788 /* Must we save the block contents? */
790 /* Make it block aligned */
796 pr_info("nand_bbt: error reading block for writing the bad block table\n");
799 pr_warn("nand_bbt: ECC error while reading block for writing bad block table\n");
861 pr_warn("nand_bbt: error while erasing BBT block %d\n",
863 mark_bbt_block_bad(this, td, chip, block);
871 pr_warn("nand_bbt: error while writing BBT block %d\n",
873 mark_bbt_block_bad(this, td, chip, block);
877 pr_info("Bad block table written to 0x%012llx, version 0x%02X\n",
886 pr_warn("nand_bbt: error while writing bad block table %d\n", res);
891 * nand_memory_bbt - [GENERIC] create a memory based bad block table
893 * @bd: descriptor for the good/bad block search pattern
910 * @bd: descriptor for the good/bad block search pattern
971 /* Create the bad block table by scanning the device? */
1017 /* Write the bad block table to the device? */
1024 /* Write the mirror bad block table to the device? */
1035 * nand_update_bbt - update bad block table(s)
1037 * @offs: the offset of the newly marked block
1039 * The function updates the bad block table(s).
1073 /* Write the bad block table to the device? */
1079 /* Write the mirror bad block table to the device? */
1090 * mark_bbt_regions - [GENERIC] mark the bad block table regions
1092 * @td: bad block table descriptor
1094 * The bad block table regions are marked as "bad" to prevent accidental
1101 int i, j, chips, block, nrblocks, update;
1118 block = td->pages[i] >> (this->bbt_erase_shift - this->page_shift);
1119 oldval = bbt_get_entry(this, block);
1120 bbt_mark_entry(this, block, BBT_BLOCK_RESERVED);
1123 nand_update_bbt(this, (loff_t)block <<
1129 block = ((i + 1) * nrblocks) - td->maxblocks;
1131 block = i * nrblocks;
1133 oldval = bbt_get_entry(this, block);
1134 bbt_mark_entry(this, block, BBT_BLOCK_RESERVED);
1137 block++;
1145 nand_update_bbt(this, (loff_t)(block - 1) <<
1151 * verify_bbt_descr - verify the bad block description
1155 * This functions performs a few sanity checks on the bad block description
1200 * nand_scan_bbt - [NAND Interface] scan, find, read and maybe create bad block table(s)
1202 * @bd: descriptor for the good/bad block search pattern
1204 * The function checks, if a bad block table(s) is/are already available. If
1206 * the bad block table(s) to the selected place.
1208 * The bad block table memory is allocated here. It must be freed by calling
1221 * Allocate memory (2bit per block) and clear the memory bad block
1230 * memory based bad block table.
1255 /* Search the bad block table using a pattern in oob */
1280 * Define some generic bad / good block scan pattern which are used
1343 pr_warn("Bad block pattern already allocated; not replacing\n");
1359 * nand_create_bbt - [NAND Interface] Select a default bad block table for the device
1362 * This function selects the default bad block table support for the device and
1369 /* Is a flash based bad block table requested? */
1397 * nand_isreserved_bbt - [NAND Interface] Check if a block is reserved
1403 int block;
1405 block = (int)(offs >> this->bbt_erase_shift);
1406 return bbt_get_entry(this, block) == BBT_BLOCK_RESERVED;
1410 * nand_isbad_bbt - [NAND Interface] Check if a block is bad
1413 * @allowbbt: allow access to bad block table region
1417 int block, res;
1419 block = (int)(offs >> this->bbt_erase_shift);
1420 res = bbt_get_entry(this, block);
1422 pr_debug("nand_isbad_bbt(): bbt info for offs 0x%08x: (block %d) 0x%02x\n",
1423 (unsigned int)offs, block, res);
1437 * nand_markbad_bbt - [NAND Interface] Mark a block bad in the BBT
1439 * @offs: offset of the bad block
1443 int block, ret = 0;
1445 block = (int)(offs >> this->bbt_erase_shift);
1447 /* Mark bad block in memory */
1448 bbt_mark_entry(this, block, BBT_BLOCK_WORN);
1450 /* Update flash-based bad block table */