Merge https://gitlab.denx.de/u-boot/custodians/u-boot-sh
[platform/kernel/u-boot.git] / env / mmc.c
index b24c35c..aca61b7 100644 (file)
--- a/env/mmc.c
+++ b/env/mmc.c
 
 DECLARE_GLOBAL_DATA_PTR;
 
+#if !defined(CONFIG_SYS_MMC_ENV_DEV)
+#define CONFIG_SYS_MMC_ENV_DEV 0
+#endif
+
+__weak int mmc_get_env_dev(void)
+{
+       return CONFIG_SYS_MMC_ENV_DEV;
+}
+
 #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);
 
@@ -45,10 +56,10 @@ static inline int mmc_offset_try_partition(const char *str, s64 *val)
        }
 
        /* 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;
 }
@@ -73,7 +84,7 @@ static inline s64 mmc_offset(int copy)
        str = fdtdec_get_config_string(gd->fdt_blob, 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;
        }
@@ -114,11 +125,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)
 {
@@ -353,6 +359,7 @@ static int env_mmc_load(void)
        int ret;
        int dev = mmc_get_env_dev();
        const char *errmsg;
+       env_t *ep = NULL;
 
        mmc = find_mmc_device(dev);
 
@@ -374,6 +381,10 @@ static int env_mmc_load(void)
        }
 
        ret = env_import(buf, 1);
+       if (!ret) {
+               ep = (env_t *)buf;
+               gd->env_addr = (ulong)&ep->data;
+       }
 
 fini:
        fini_mmc_for_env(mmc);