From ca98982f2890804fc0bf5477c78de94d48384e53 Mon Sep 17 00:00:00 2001 From: Yi Zeng Date: Mon, 12 Mar 2018 15:38:55 +0800 Subject: [PATCH] mtd: add a macro to hide the env region in rsv zone PD#160529: mtd: add a macro to hide the env region in rsv zone when we save the env data in normal partition, the env region in the rsv zone is no needed anymore, so hide it with a macro. Change-Id: Id1b92079d1127ffabf4c1f208b486daad0af3934 Signed-off-by: Yi Zeng --- drivers/amlogic/mtd/aml_env.c | 6 ++-- drivers/amlogic/mtd/aml_mtd.h | 10 +++++++ drivers/amlogic/mtd/aml_nand.c | 2 ++ drivers/amlogic/mtd/m3_nand.c | 2 ++ drivers/amlogic/mtd/rsv_manage.c | 50 ++++++++++++++++++++------------ 5 files changed, 49 insertions(+), 21 deletions(-) diff --git a/drivers/amlogic/mtd/aml_env.c b/drivers/amlogic/mtd/aml_env.c index d468e72b4bd6..ef700e188e4d 100644 --- a/drivers/amlogic/mtd/aml_env.c +++ b/drivers/amlogic/mtd/aml_env.c @@ -21,6 +21,7 @@ #include #include +#ifndef CONFIG_MTD_ENV_IN_NAND #define ENV_NAME "nand_env" static DEFINE_MUTEX(env_mutex); static dev_t uboot_env_no; @@ -28,6 +29,7 @@ struct cdev uboot_env; struct device *uboot_dev; struct class *uboot_env_class; #endif /* AML_NAND_UBOOT */ +#endif struct aml_nand_chip *aml_chip_env; @@ -136,7 +138,7 @@ exit_err: return ret; } - +#ifndef CONFIG_MTD_ENV_IN_NAND #ifndef AML_NAND_UBOOT ssize_t env_show(struct class *class, struct class_attribute *attr, @@ -437,5 +439,5 @@ exit: } return 0; } - +#endif diff --git a/drivers/amlogic/mtd/aml_mtd.h b/drivers/amlogic/mtd/aml_mtd.h index 5dff1a79f659..a218982fda12 100644 --- a/drivers/amlogic/mtd/aml_mtd.h +++ b/drivers/amlogic/mtd/aml_mtd.h @@ -62,6 +62,16 @@ extern struct mtd_info *nand_info[NAND_MAX_DEVICE]; extern unsigned char pagelist_hynix256[128]; #define CONFIG_ENV_SIZE (64*1024U) +/* + * open this macro, the env will store in + * normal partition: "environment". and the + * env region in reserve zone will be hidden + * + * please remember add a partition named + * "environment" in dts file. + * #define CONFIG_MTD_ENV_IN_NAND + */ + /* ** Max page list cnt for usrdef mode */ diff --git a/drivers/amlogic/mtd/aml_nand.c b/drivers/amlogic/mtd/aml_nand.c index e60ffd432f3a..48d848ed203c 100644 --- a/drivers/amlogic/mtd/aml_nand.c +++ b/drivers/amlogic/mtd/aml_nand.c @@ -2127,7 +2127,9 @@ int aml_nand_init(struct aml_nand_chip *aml_chip) pr_info("invalid nand bbt\n"); goto exit_error; } +#ifndef CONFIG_MTD_ENV_IN_NAND aml_nand_env_check(mtd); +#endif aml_nand_key_check(mtd); aml_nand_dtb_check(mtd); diff --git a/drivers/amlogic/mtd/m3_nand.c b/drivers/amlogic/mtd/m3_nand.c index 47760c108577..7aea5114925f 100644 --- a/drivers/amlogic/mtd/m3_nand.c +++ b/drivers/amlogic/mtd/m3_nand.c @@ -1010,7 +1010,9 @@ static int m3_nand_probe(struct aml_nand_platform *plat, unsigned int dev_num) #endif } else { + #ifndef CONFIG_MTD_ENV_IN_NAND aml_ubootenv_init(aml_chip); + #endif aml_key_init(aml_chip); amlnf_dtb_init(aml_chip); } diff --git a/drivers/amlogic/mtd/rsv_manage.c b/drivers/amlogic/mtd/rsv_manage.c index 8ae5cf60b540..25a9f629053d 100644 --- a/drivers/amlogic/mtd/rsv_manage.c +++ b/drivers/amlogic/mtd/rsv_manage.c @@ -802,7 +802,7 @@ int aml_nand_rsv_info_init(struct mtd_info *mtd) { struct aml_nand_chip *aml_chip = mtd_to_nand_chip(mtd); struct nand_chip *chip = mtd->priv; - unsigned int pages_per_blk_shift, bbt_start_block; + unsigned int pages_per_blk_shift, bbt_start_block, vernier; int phys_erase_shift, i; phys_erase_shift = fls(mtd->erasesize) - 1; @@ -812,6 +812,7 @@ int aml_nand_rsv_info_init(struct mtd_info *mtd) bbt_start_block = BOOT_TOTAL_PAGES >> pages_per_blk_shift; bbt_start_block += NAND_GAP_BLOCK_NUM; /*gap occupy 4 blocks*/ + vernier = bbt_start_block; aml_chip->rsv_data_buf = kzalloc(mtd->writesize, GFP_KERNEL); if (aml_chip->rsv_data_buf == NULL) return -ENOMEM; @@ -836,9 +837,10 @@ int aml_nand_rsv_info_init(struct mtd_info *mtd) return -ENOMEM; aml_chip->aml_nandbbt_info->valid_node->phy_blk_addr = -1; - aml_chip->aml_nandbbt_info->start_block = bbt_start_block; + aml_chip->aml_nandbbt_info->start_block = vernier; aml_chip->aml_nandbbt_info->end_block = - aml_chip->aml_nandbbt_info->start_block + NAND_BBT_BLOCK_NUM; + vernier + NAND_BBT_BLOCK_NUM; + vernier += NAND_BBT_BLOCK_NUM; aml_chip->aml_nandbbt_info->size = mtd->size >> phys_erase_shift; memcpy(aml_chip->aml_nandbbt_info->name, BBT_NAND_MAGIC, 4); @@ -850,7 +852,7 @@ int aml_nand_rsv_info_init(struct mtd_info *mtd) return -ENOMEM; } memset(aml_chip->block_status, 0, (mtd->size >> phys_erase_shift)); - +#ifndef CONFIG_MTD_ENV_IN_NAND /*env info init*/ aml_chip->aml_nandenv_info = kzalloc(sizeof(struct aml_nandrsv_info_t), GFP_KERNEL); @@ -864,13 +866,13 @@ int aml_nand_rsv_info_init(struct mtd_info *mtd) return -ENOMEM; aml_chip->aml_nandenv_info->valid_node->phy_blk_addr = -1; - aml_chip->aml_nandenv_info->start_block = - aml_chip->aml_nandbbt_info->end_block; + aml_chip->aml_nandenv_info->start_block = vernier; aml_chip->aml_nandenv_info->end_block = - aml_chip->aml_nandbbt_info->end_block + NAND_ENV_BLOCK_NUM; + vernier + NAND_ENV_BLOCK_NUM; + vernier += NAND_ENV_BLOCK_NUM; aml_chip->aml_nandenv_info->size = CONFIG_ENV_SIZE; memcpy(aml_chip->aml_nandenv_info->name, ENV_NAND_MAGIC, 4); - +#endif aml_chip->aml_nandkey_info = kzalloc(sizeof(struct aml_nandrsv_info_t), GFP_KERNEL); if (aml_chip->aml_nandkey_info == NULL) @@ -884,10 +886,10 @@ int aml_nand_rsv_info_init(struct mtd_info *mtd) return -ENOMEM; aml_chip->aml_nandkey_info->valid_node->phy_blk_addr = -1; - aml_chip->aml_nandkey_info->start_block = - aml_chip->aml_nandenv_info->end_block; + aml_chip->aml_nandkey_info->start_block = vernier; aml_chip->aml_nandkey_info->end_block = - aml_chip->aml_nandenv_info->end_block + NAND_KEY_BLOCK_NUM; + vernier + NAND_KEY_BLOCK_NUM; + vernier += NAND_KEY_BLOCK_NUM; aml_chip->aml_nandkey_info->size = aml_chip->keysize; memcpy(aml_chip->aml_nandkey_info->name, KEY_NAND_MAGIC, 4); @@ -904,18 +906,28 @@ int aml_nand_rsv_info_init(struct mtd_info *mtd) return -ENOMEM; aml_chip->aml_nanddtb_info->valid_node->phy_blk_addr = -1; - aml_chip->aml_nanddtb_info->start_block = - aml_chip->aml_nandkey_info->end_block; + aml_chip->aml_nanddtb_info->start_block = vernier; aml_chip->aml_nanddtb_info->end_block = - aml_chip->aml_nandkey_info->end_block + NAND_DTB_BLOCK_NUM; + vernier + NAND_DTB_BLOCK_NUM; + vernier += NAND_DTB_BLOCK_NUM; aml_chip->aml_nanddtb_info->size = aml_chip->dtbsize; memcpy(aml_chip->aml_nanddtb_info->name, DTB_NAND_MAGIC, 4); - pr_info("bbt_start=%d env_start=%d key_start=%d dtb_start=%d\n", - aml_chip->aml_nandbbt_info->start_block, - aml_chip->aml_nandenv_info->start_block, - aml_chip->aml_nandkey_info->start_block, - aml_chip->aml_nanddtb_info->start_block); + if ((vernier - (BOOT_TOTAL_PAGES >> pages_per_blk_shift)) > + RESERVED_BLOCK_NUM) { + pr_info("ERROR: total blk number is over the limit\n"); + return -ENOMEM; + } + pr_info("bbt_start=%d\n", + aml_chip->aml_nandbbt_info->start_block); +#ifndef CONFIG_MTD_ENV_IN_NAND + pr_info("env_start=%d\n", + aml_chip->aml_nandenv_info->start_block); +#endif + pr_info("key_start=%d\n", + aml_chip->aml_nandkey_info->start_block); + pr_info("dtb_start=%d\n", + aml_chip->aml_nanddtb_info->start_block); return 0; }