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:
parent
2d2c232ae5
commit
c9e94690ba
|
|
@ -18,6 +18,9 @@
|
||||||
#define MTD_PART_INFO_MAX_SIZE 512
|
#define MTD_PART_INFO_MAX_SIZE 512
|
||||||
#define MTD_SINGLE_PART_INFO_MAX_SIZE 40
|
#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;
|
static int *mtd_map_blk_table;
|
||||||
|
|
||||||
int mtd_blk_map_table_init(struct blk_desc *desc,
|
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;
|
blk_total = (mtd->size + mtd->erasesize - 1) / mtd->erasesize;
|
||||||
if (!mtd_map_blk_table) {
|
if (!mtd_map_blk_table) {
|
||||||
mtd_map_blk_table = (int *)malloc(blk_total * 4);
|
mtd_map_blk_table = (int *)malloc(blk_total * 4);
|
||||||
for (i = 0; i < blk_total; i++)
|
memset(mtd_map_blk_table, MTD_BLK_TABLE_BLOCK_UNKNOWN,
|
||||||
mtd_map_blk_table[i] = i;
|
blk_total * 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
blk_begin = (u32)offset / mtd->erasesize;
|
blk_begin = (u32)offset / mtd->erasesize;
|
||||||
blk_cnt = ((u32)(offset % mtd->erasesize + length) / mtd->erasesize);
|
blk_cnt = ((u32)(offset % mtd->erasesize + length) / mtd->erasesize);
|
||||||
if ((blk_begin + blk_cnt) > blk_total)
|
if ((blk_begin + blk_cnt) > blk_total)
|
||||||
blk_cnt = blk_total - blk_begin;
|
blk_cnt = blk_total - blk_begin;
|
||||||
|
|
||||||
|
if (mtd_map_blk_table[blk_begin] != MTD_BLK_TABLE_BLOCK_UNKNOWN)
|
||||||
|
return 0;
|
||||||
|
|
||||||
j = 0;
|
j = 0;
|
||||||
/* should not across blk_cnt */
|
/* should not across blk_cnt */
|
||||||
for (i = 0; i < blk_cnt; i++) {
|
for (i = 0; i < blk_cnt; i++) {
|
||||||
if (j >= blk_cnt)
|
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++) {
|
for (; j < blk_cnt; j++) {
|
||||||
if (!mtd_block_isbad(mtd, (blk_begin + j) * mtd->erasesize)) {
|
if (!mtd_block_isbad(mtd, (blk_begin + j) * mtd->erasesize)) {
|
||||||
mtd_map_blk_table[blk_begin + i] = blk_begin + j;
|
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_offset = offset;
|
||||||
mapped = false;
|
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 = true;
|
||||||
mapped_offset = (loff_t)((u32)mtd_map_blk_table[(u64)offset /
|
mapped_offset = (loff_t)((u32)mtd_map_blk_table[(u64)offset /
|
||||||
erasesize] * erasesize + block_offset);
|
erasesize] * erasesize + block_offset);
|
||||||
|
|
|
||||||
|
|
@ -12,5 +12,8 @@
|
||||||
* @return mtd part info. If fail, return NULL
|
* @return mtd part info. If fail, return NULL
|
||||||
*/
|
*/
|
||||||
char *mtd_part_parse(void);
|
char *mtd_part_parse(void);
|
||||||
|
int mtd_blk_map_table_init(struct blk_desc *desc,
|
||||||
|
loff_t offset,
|
||||||
|
size_t length);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue