]> Git Repo - J-u-boot.git/blobdiff - env/mmc.c
env: mmc: Add missing eMMC bootpart restoration to env erase
[J-u-boot.git] / env / mmc.c
index 251ad07d7c08f2a309667e986c5a662008c3666f..e111d8e58817beffc9c32ecaf5236b6ee04d8fcf 100644 (file)
--- a/env/mmc.c
+++ b/env/mmc.c
@@ -6,6 +6,7 @@
 /* #define DEBUG */
 
 #include <common.h>
+#include <asm/global_data.h>
 
 #include <command.h>
 #include <env.h>
@@ -18,6 +19,7 @@
 #include <part.h>
 #include <search.h>
 #include <errno.h>
+#include <dm/ofnode.h>
 
 #define __STR(X) #X
 #define STR(X) __STR(X)
 DECLARE_GLOBAL_DATA_PTR;
 
 #if CONFIG_IS_ENABLED(OF_CONTROL)
-static inline int mmc_offset_try_partition(const char *str, s64 *val)
+static inline int mmc_offset_try_partition(const char *str, int copy, s64 *val)
 {
-       disk_partition_t info;
+       struct disk_partition info;
        struct blk_desc *desc;
        int len, i, ret;
+       char dev_str[4];
 
-       ret = blk_get_device_by_str("mmc", STR(CONFIG_SYS_MMC_ENV_DEV), &desc);
+       snprintf(dev_str, sizeof(dev_str), "%d", mmc_get_env_dev());
+       ret = blk_get_device_by_str("mmc", dev_str, &desc);
        if (ret < 0)
                return (ret);
 
@@ -40,15 +44,15 @@ static inline int mmc_offset_try_partition(const char *str, s64 *val)
                if (ret < 0)
                        return ret;
 
-               if (!strncmp((const char *)info.name, str, sizeof(str)))
+               if (!strncmp((const char *)info.name, str, sizeof(info.name)))
                        break;
        }
 
        /* round up to info.blksz */
-       len = (CONFIG_ENV_SIZE + info.blksz - 1) & ~(info.blksz - 1);
+       len = DIV_ROUND_UP(CONFIG_ENV_SIZE, info.blksz);
 
        /* use the top of the partion for the environment */
-       *val = (info.start + info.size - 1) - len / info.blksz;
+       *val = (info.start + info.size - (1 + copy) * len) * info.blksz;
 
        return 0;
 }
@@ -70,10 +74,10 @@ static inline s64 mmc_offset(int copy)
        int err;
 
        /* look for the partition in mmc CONFIG_SYS_MMC_ENV_DEV */
-       str = fdtdec_get_config_string(gd->fdt_blob, dt_prop.partition);
+       str = ofnode_conf_read_str(dt_prop.partition);
        if (str) {
                /* try to place the environment at end of the partition */
-               err = mmc_offset_try_partition(str, &val);
+               err = mmc_offset_try_partition(str, copy, &val);
                if (!err)
                        return val;
        }
@@ -87,7 +91,7 @@ static inline s64 mmc_offset(int copy)
                propname = dt_prop.offset_redund;
        }
 #endif
-       return fdtdec_get_config_int(gd->fdt_blob, propname, defvalue);
+       return ofnode_conf_read_int(propname, defvalue);
 }
 #else
 static inline s64 mmc_offset(int copy)
@@ -114,11 +118,6 @@ __weak int mmc_get_env_addr(struct mmc *mmc, int copy, u32 *env_addr)
        return 0;
 }
 
-__weak int mmc_get_env_dev(void)
-{
-       return CONFIG_SYS_MMC_ENV_DEV;
-}
-
 #ifdef CONFIG_SYS_MMC_ENV_PART
 __weak uint mmc_get_env_part(struct mmc *mmc)
 {
@@ -235,7 +234,6 @@ fini:
        return ret;
 }
 
-#if defined(CONFIG_CMD_ERASEENV)
 static inline int erase_env(struct mmc *mmc, unsigned long size,
                            unsigned long offset)
 {
@@ -265,23 +263,28 @@ static int env_mmc_erase(void)
                return 1;
        }
 
-       if (mmc_get_env_addr(mmc, copy, &offset))
-               return CMD_RET_FAILURE;
+       if (mmc_get_env_addr(mmc, copy, &offset)) {
+               ret = CMD_RET_FAILURE;
+               goto fini;
+       }
 
        ret = erase_env(mmc, CONFIG_ENV_SIZE, offset);
 
 #ifdef CONFIG_ENV_OFFSET_REDUND
        copy = 1;
 
-       if (mmc_get_env_addr(mmc, copy, &offset))
-               return CMD_RET_FAILURE;
+       if (mmc_get_env_addr(mmc, copy, &offset)) {
+               ret = CMD_RET_FAILURE;
+               goto fini;
+       }
 
        ret |= erase_env(mmc, CONFIG_ENV_SIZE, offset);
 #endif
 
+fini:
+       fini_mmc_for_env(mmc);
        return ret;
 }
-#endif /* CONFIG_CMD_ERASEENV */
 #endif /* CONFIG_CMD_SAVEENV && !CONFIG_SPL_BUILD */
 
 static inline int read_env(struct mmc *mmc, unsigned long size,
@@ -332,7 +335,7 @@ static int env_mmc_load(void)
        read2_fail = read_env(mmc, CONFIG_ENV_SIZE, offset2, tmp_env2);
 
        ret = env_import_redund((char *)tmp_env1, read1_fail, (char *)tmp_env2,
-                               read2_fail);
+                               read2_fail, H_EXTERNAL);
 
 fini:
        fini_mmc_for_env(mmc);
@@ -374,7 +377,7 @@ static int env_mmc_load(void)
                goto fini;
        }
 
-       ret = env_import(buf, 1);
+       ret = env_import(buf, 1, H_EXTERNAL);
        if (!ret) {
                ep = (env_t *)buf;
                gd->env_addr = (ulong)&ep->data;
@@ -396,8 +399,6 @@ U_BOOT_ENV_LOCATION(mmc) = {
        .load           = env_mmc_load,
 #ifndef CONFIG_SPL_BUILD
        .save           = env_save_ptr(env_mmc_save),
-#if defined(CONFIG_CMD_ERASEENV)
-       .erase          = env_mmc_erase,
-#endif
+       .erase          = ENV_ERASE_PTR(env_mmc_erase)
 #endif
 };
This page took 0.02933 seconds and 4 git commands to generate.