mtd: mtd_blk: Add api to get mtd_blk mapped address

Change-Id: I197df5f03e0894584cd2ffb3b7ac1423e84e43df
Signed-off-by: Jon Lin <jon.lin@rock-chips.com>
This commit is contained in:
Jon Lin 2020-05-24 23:34:36 +08:00
parent eaa66b0d6a
commit c402731f2d
1 changed files with 24 additions and 15 deletions

View File

@ -82,6 +82,27 @@ int mtd_blk_map_table_init(struct blk_desc *desc,
} }
} }
static bool get_mtd_blk_map_address(struct mtd_info *mtd, loff_t *off)
{
bool mapped;
loff_t offset = *off;
size_t block_offset = offset & (mtd->erasesize - 1);
mapped = false;
if (!mtd_map_blk_table ||
mtd_map_blk_table[(u64)offset >> mtd->erasesize_shift] ==
MTD_BLK_TABLE_BLOCK_UNKNOWN ||
mtd_map_blk_table[(u64)offset >> mtd->erasesize_shift] ==
0xffffffff)
return mapped;
mapped = true;
*off = (loff_t)(((u32)mtd_map_blk_table[(u64)offset >>
mtd->erasesize_shift] << mtd->erasesize_shift) + block_offset);
return mapped;
}
static __maybe_unused int mtd_map_read(struct mtd_info *mtd, loff_t offset, static __maybe_unused int mtd_map_read(struct mtd_info *mtd, loff_t offset,
size_t *length, size_t *actual, size_t *length, size_t *actual,
loff_t lim, u_char *buffer) loff_t lim, u_char *buffer)
@ -94,23 +115,11 @@ static __maybe_unused int mtd_map_read(struct mtd_info *mtd, loff_t offset,
while (left_to_read > 0) { while (left_to_read > 0) {
size_t block_offset = offset & (erasesize - 1); size_t block_offset = offset & (erasesize - 1);
size_t read_length; size_t read_length;
loff_t mapped_offset;
bool mapped;
if (offset >= mtd->size) if (offset >= mtd->size)
return 0; return 0;
mapped_offset = offset; if (!get_mtd_blk_map_address(mtd, &offset)) {
mapped = false;
if (mtd_map_blk_table &&
mtd_map_blk_table[(u64)offset >> mtd->erasesize_shift] !=
MTD_BLK_TABLE_BLOCK_UNKNOWN) {
mapped = true;
mapped_offset = (loff_t)(((u32)mtd_map_blk_table[(u64)offset >>
mtd->erasesize_shift] << mtd->erasesize_shift) + block_offset);
}
if (!mapped) {
if (mtd_block_isbad(mtd, offset & ~(erasesize - 1))) { if (mtd_block_isbad(mtd, offset & ~(erasesize - 1))) {
printf("Skip bad block 0x%08llx\n", printf("Skip bad block 0x%08llx\n",
offset & ~(erasesize - 1)); offset & ~(erasesize - 1));
@ -124,11 +133,11 @@ static __maybe_unused int mtd_map_read(struct mtd_info *mtd, loff_t offset,
else else
read_length = erasesize - block_offset; read_length = erasesize - block_offset;
rval = mtd_read(mtd, mapped_offset, read_length, &read_length, rval = mtd_read(mtd, offset, read_length, &read_length,
p_buffer); p_buffer);
if (rval && rval != -EUCLEAN) { if (rval && rval != -EUCLEAN) {
printf("NAND read from offset %llx failed %d\n", printf("NAND read from offset %llx failed %d\n",
mapped_offset, rval); offset, rval);
*length -= left_to_read; *length -= left_to_read;
return rval; return rval;
} }