kernel: add support for mediatek NMBM flash mapping support

This NAND flash remapping method is used on newer MediaTek devices with NAND
flash.

Signed-off-by: Felix Fietkau <nbd@nbd.name>
This commit is contained in:
Felix Fietkau 2022-03-10 15:31:25 +01:00
parent 55e8d52157
commit 06382d1af7
4 changed files with 2361 additions and 4 deletions

View File

@ -392,6 +392,8 @@ int mtk_bmt_attach(struct mtd_info *mtd)
if (of_property_read_bool(np, "mediatek,bmt-v2")) if (of_property_read_bool(np, "mediatek,bmt-v2"))
bmtd.ops = &mtk_bmt_v2_ops; bmtd.ops = &mtk_bmt_v2_ops;
else if (of_property_read_bool(np, "mediatek,nmbm"))
bmtd.ops = &mtk_bmt_nmbm_ops;
else if (of_property_read_bool(np, "mediatek,bbt")) else if (of_property_read_bool(np, "mediatek,bbt"))
bmtd.ops = &mtk_bmt_bbt_ops; bmtd.ops = &mtk_bmt_bbt_ops;
else else
@ -410,14 +412,14 @@ int mtk_bmt_attach(struct mtd_info *mtd)
bmtd.pg_shift = ffs(bmtd.pg_size) - 1; bmtd.pg_shift = ffs(bmtd.pg_size) - 1;
bmtd.total_blks = mtd->size >> bmtd.blk_shift; bmtd.total_blks = mtd->size >> bmtd.blk_shift;
bmtd.data_buf = kzalloc(bmtd.pg_size, GFP_KERNEL); bmtd.data_buf = kzalloc(bmtd.pg_size + bmtd.mtd->oobsize, GFP_KERNEL);
if (!bmtd.data_buf) { if (!bmtd.data_buf) {
pr_info("nand: FATAL ERR: allocate buffer failed!\n"); pr_info("nand: FATAL ERR: allocate buffer failed!\n");
ret = -1; ret = -1;
goto error; goto error;
} }
memset(bmtd.data_buf, 0xff, bmtd.pg_size); memset(bmtd.data_buf, 0xff, bmtd.pg_size + bmtd.mtd->oobsize);
ret = bmtd.ops->init(np); ret = bmtd.ops->init(np);
if (ret) if (ret)

View File

@ -23,6 +23,9 @@ struct mtk_bmt_ops {
int (*debug)(void *data, u64 val); int (*debug)(void *data, u64 val);
}; };
struct bbbt;
struct nmbm_instance;
struct bmt_desc { struct bmt_desc {
struct mtd_info *mtd; struct mtd_info *mtd;
unsigned char *bbt_buf; unsigned char *bbt_buf;
@ -38,7 +41,10 @@ struct bmt_desc {
const struct mtk_bmt_ops *ops; const struct mtk_bmt_ops *ops;
struct bbbt *bbt; union {
struct bbbt *bbt;
struct nmbm_instance *ni;
};
struct dentry *debugfs_dir; struct dentry *debugfs_dir;
@ -70,6 +76,7 @@ struct bmt_desc {
extern struct bmt_desc bmtd; extern struct bmt_desc bmtd;
extern const struct mtk_bmt_ops mtk_bmt_v2_ops; extern const struct mtk_bmt_ops mtk_bmt_v2_ops;
extern const struct mtk_bmt_ops mtk_bmt_bbt_ops; extern const struct mtk_bmt_ops mtk_bmt_bbt_ops;
extern const struct mtk_bmt_ops mtk_bmt_nmbm_ops;
static inline u32 blk_pg(u16 block) static inline u32 blk_pg(u16 block)
{ {

File diff suppressed because it is too large Load Diff

View File

@ -17,7 +17,7 @@
nandcore-objs := core.o bbt.o nandcore-objs := core.o bbt.o
obj-$(CONFIG_MTD_NAND_CORE) += nandcore.o obj-$(CONFIG_MTD_NAND_CORE) += nandcore.o
+obj-$(CONFIG_MTD_NAND_MTK_BMT) += mtk_bmt.o mtk_bmt_v2.o mtk_bmt_bbt.o +obj-$(CONFIG_MTD_NAND_MTK_BMT) += mtk_bmt.o mtk_bmt_v2.o mtk_bmt_bbt.o mtk_bmt_nmbm.o
obj-y += onenand/ obj-y += onenand/
obj-y += raw/ obj-y += raw/