mtd: mtd_blk: Optimize map table reinitialization

Change-Id: Ie27c8a215568755857cf67444637b1d89f55bd3a
Signed-off-by: Jon Lin <jon.lin@rock-chips.com>
This commit is contained in:
Jon Lin 2020-04-26 09:56:58 +08:00 committed by Jianhong Chen
parent 2d2c232ae5
commit c9e94690ba
2 changed files with 16 additions and 4 deletions

View File

@ -18,6 +18,9 @@
#define MTD_PART_INFO_MAX_SIZE 512
#define MTD_SINGLE_PART_INFO_MAX_SIZE 40
#define MTD_BLK_TABLE_BLOCK_UNKNOWN (-2)
#define MTD_BLK_TABLE_BLOCK_SHIFT (-1)
static int *mtd_map_blk_table;
int mtd_blk_map_table_init(struct blk_desc *desc,
@ -47,19 +50,23 @@ int mtd_blk_map_table_init(struct blk_desc *desc,
blk_total = (mtd->size + mtd->erasesize - 1) / mtd->erasesize;
if (!mtd_map_blk_table) {
mtd_map_blk_table = (int *)malloc(blk_total * 4);
for (i = 0; i < blk_total; i++)
mtd_map_blk_table[i] = i;
memset(mtd_map_blk_table, MTD_BLK_TABLE_BLOCK_UNKNOWN,
blk_total * 4);
}
blk_begin = (u32)offset / mtd->erasesize;
blk_cnt = ((u32)(offset % mtd->erasesize + length) / mtd->erasesize);
if ((blk_begin + blk_cnt) > blk_total)
blk_cnt = blk_total - blk_begin;
if (mtd_map_blk_table[blk_begin] != MTD_BLK_TABLE_BLOCK_UNKNOWN)
return 0;
j = 0;
/* should not across blk_cnt */
for (i = 0; i < blk_cnt; i++) {
if (j >= blk_cnt)
mtd_map_blk_table[blk_begin + i] = -1;
mtd_map_blk_table[blk_begin + i] = MTD_BLK_TABLE_BLOCK_SHIFT;
for (; j < blk_cnt; j++) {
if (!mtd_block_isbad(mtd, (blk_begin + j) * mtd->erasesize)) {
mtd_map_blk_table[blk_begin + i] = blk_begin + j;
@ -95,7 +102,9 @@ static __maybe_unused int mtd_map_read(struct mtd_info *mtd, loff_t offset,
mapped_offset = offset;
mapped = false;
if (mtd_map_blk_table) {
if (mtd_map_blk_table &&
mtd_map_blk_table[(u64)offset / erasesize] !=
MTD_BLK_TABLE_BLOCK_UNKNOWN) {
mapped = true;
mapped_offset = (loff_t)((u32)mtd_map_blk_table[(u64)offset /
erasesize] * erasesize + block_offset);

View File

@ -12,5 +12,8 @@
* @return mtd part info. If fail, return NULL
*/
char *mtd_part_parse(void);
int mtd_blk_map_table_init(struct blk_desc *desc,
loff_t offset,
size_t length);
#endif