kernel: mtk_bmt: add support for limiting range of remapping
This can be used to support ubi on top of mtk_bmt without reflashing the boot loader. The boot loader + factory + kernel area is covered, while the rest is passed through as-is Signed-off-by: Felix Fietkau <nbd@nbd.name>
This commit is contained in:
parent
31b6cfb288
commit
b86452f841
|
@ -90,6 +90,9 @@ static struct bmt_desc {
|
||||||
/* How many pages needs to store 'struct bbbt' */
|
/* How many pages needs to store 'struct bbbt' */
|
||||||
u32 bmt_pgs;
|
u32 bmt_pgs;
|
||||||
|
|
||||||
|
const __be32 *remap_range;
|
||||||
|
int remap_range_len;
|
||||||
|
|
||||||
/* to compensate for driver level remapping */
|
/* to compensate for driver level remapping */
|
||||||
u8 oob_offset;
|
u8 oob_offset;
|
||||||
} bmtd = {0};
|
} bmtd = {0};
|
||||||
|
@ -458,17 +461,32 @@ static bool update_bmt(u16 block, int copy_len)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
mapping_block_in_range(int block)
|
||||||
|
{
|
||||||
|
const __be32 *cur = bmtd.remap_range;
|
||||||
|
u32 addr = block << bmtd.blk_shift;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (!cur || !bmtd.remap_range_len)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
for (i = 0; i < bmtd.remap_range_len; i++, cur += 2)
|
||||||
|
if (addr >= be32_to_cpu(cur[0]) && addr < be32_to_cpu(cur[1]))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
u16 get_mapping_block_index(int block)
|
u16 get_mapping_block_index(int block)
|
||||||
{
|
{
|
||||||
int mapping_block;
|
if (block >= bmtd.pool_lba)
|
||||||
|
return block;
|
||||||
|
|
||||||
if (block < bmtd.pool_lba)
|
if (!mapping_block_in_range(block))
|
||||||
mapping_block = bmtd.bbt->bb_tbl[block];
|
return block;
|
||||||
else
|
|
||||||
mapping_block = block;
|
|
||||||
BBT_LOG("0x%x mapped to 0x%x", block, mapping_block);
|
|
||||||
|
|
||||||
return mapping_block;
|
return bmtd.bbt->bb_tbl[block];
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
@ -839,6 +857,10 @@ int mtk_bmt_attach(struct mtd_info *mtd)
|
||||||
&bmt_table_size) != 0)
|
&bmt_table_size) != 0)
|
||||||
bmt_table_size = 0x2000U;
|
bmt_table_size = 0x2000U;
|
||||||
|
|
||||||
|
bmtd.remap_range = of_get_property(np, "mediatek,bmt-remap-range",
|
||||||
|
&bmtd.remap_range_len);
|
||||||
|
bmtd.remap_range_len /= 8;
|
||||||
|
|
||||||
bmtd.mtd = mtd;
|
bmtd.mtd = mtd;
|
||||||
mtk_bmt_replace_ops(mtd);
|
mtk_bmt_replace_ops(mtd);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user