colibri_imx6: fix video stdout in default environment
[oweals/u-boot.git] / env / mmc.c
index ed7bcf16ae0ea075a5169fc3f7036b584dfa174f..a8b661db80af45766811d7620c1b5b5d6dca23e7 100644 (file)
--- a/env/mmc.c
+++ b/env/mmc.c
@@ -1,7 +1,6 @@
+// SPDX-License-Identifier: GPL-2.0+
 /*
  * (C) Copyright 2008-2011 Freescale Semiconductor, Inc.
- *
- * SPDX-License-Identifier:    GPL-2.0+
  */
 
 /* #define DEBUG */
@@ -9,7 +8,8 @@
 #include <common.h>
 
 #include <command.h>
-#include <environment.h>
+#include <env.h>
+#include <env_internal.h>
 #include <fdtdec.h>
 #include <linux/stddef.h>
 #include <malloc.h>
 #define __STR(X) #X
 #define STR(X) __STR(X)
 
-#if defined(CONFIG_ENV_SIZE_REDUND) &&  \
-       (CONFIG_ENV_SIZE_REDUND != CONFIG_ENV_SIZE)
-#error CONFIG_ENV_SIZE_REDUND should be the same as CONFIG_ENV_SIZE
-#endif
-
 DECLARE_GLOBAL_DATA_PTR;
 
-#if !defined(CONFIG_ENV_OFFSET)
-#define CONFIG_ENV_OFFSET 0
-#endif
-
 #if CONFIG_IS_ENABLED(OF_CONTROL)
 static inline int mmc_offset_try_partition(const char *str, s64 *val)
 {
-       disk_partition_t info;
+       struct disk_partition info;
        struct blk_desc *desc;
        int len, i, ret;
 
@@ -156,19 +147,19 @@ static inline int mmc_set_env_part(struct mmc *mmc) {return 0; };
 static const char *init_mmc_for_env(struct mmc *mmc)
 {
        if (!mmc)
-               return "!No MMC card found";
+               return "No MMC card found";
 
-#ifdef CONFIG_BLK
+#if CONFIG_IS_ENABLED(BLK)
        struct udevice *dev;
 
        if (blk_get_from_parent(mmc->dev, &dev))
-               return "!No block device";
+               return "No block device";
 #else
        if (mmc_init(mmc))
-               return "!MMC init failed";
+               return "MMC init failed";
 #endif
        if (mmc_set_env_part(mmc))
-               return "!MMC partition switch failed";
+               return "MMC partition switch failed";
 
        return NULL;
 }
@@ -233,7 +224,6 @@ static int env_mmc_save(void)
                goto fini;
        }
 
-       puts("done\n");
        ret = 0;
 
 #ifdef CONFIG_ENV_OFFSET_REDUND
@@ -244,6 +234,54 @@ fini:
        fini_mmc_for_env(mmc);
        return ret;
 }
+
+#if defined(CONFIG_CMD_ERASEENV)
+static inline int erase_env(struct mmc *mmc, unsigned long size,
+                           unsigned long offset)
+{
+       uint blk_start, blk_cnt, n;
+       struct blk_desc *desc = mmc_get_blk_desc(mmc);
+
+       blk_start       = ALIGN(offset, mmc->write_bl_len) / mmc->write_bl_len;
+       blk_cnt         = ALIGN(size, mmc->write_bl_len) / mmc->write_bl_len;
+
+       n = blk_derase(desc, blk_start, blk_cnt);
+       printf("%d blocks erased: %s\n", n, (n == blk_cnt) ? "OK" : "ERROR");
+
+       return (n == blk_cnt) ? 0 : 1;
+}
+
+static int env_mmc_erase(void)
+{
+       int dev = mmc_get_env_dev();
+       struct mmc *mmc = find_mmc_device(dev);
+       int     ret, copy = 0;
+       u32     offset;
+       const char *errmsg;
+
+       errmsg = init_mmc_for_env(mmc);
+       if (errmsg) {
+               printf("%s\n", errmsg);
+               return 1;
+       }
+
+       if (mmc_get_env_addr(mmc, copy, &offset))
+               return CMD_RET_FAILURE;
+
+       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;
+
+       ret |= erase_env(mmc, CONFIG_ENV_SIZE, offset);
+#endif
+
+       return ret;
+}
+#endif /* CONFIG_CMD_ERASEENV */
 #endif /* CONFIG_CMD_SAVEENV && !CONFIG_SPL_BUILD */
 
 static inline int read_env(struct mmc *mmc, unsigned long size,
@@ -274,6 +312,8 @@ static int env_mmc_load(void)
        ALLOC_CACHE_ALIGN_BUFFER(env_t, tmp_env1, 1);
        ALLOC_CACHE_ALIGN_BUFFER(env_t, tmp_env2, 1);
 
+       mmc_initialize(NULL);
+
        mmc = find_mmc_device(dev);
 
        errmsg = init_mmc_for_env(mmc);
@@ -291,33 +331,14 @@ static int env_mmc_load(void)
        read1_fail = read_env(mmc, CONFIG_ENV_SIZE, offset1, tmp_env1);
        read2_fail = read_env(mmc, CONFIG_ENV_SIZE, offset2, tmp_env2);
 
-       if (read1_fail && read2_fail)
-               puts("*** Error - No Valid Environment Area found\n");
-       else if (read1_fail || read2_fail)
-               puts("*** Warning - some problems detected "
-                    "reading environment; recovered successfully\n");
-
-       if (read1_fail && read2_fail) {
-               errmsg = "!bad CRC";
-               ret = -EIO;
-               goto fini;
-       } else if (!read1_fail && read2_fail) {
-               gd->env_valid = ENV_VALID;
-               env_import((char *)tmp_env1, 1);
-       } else if (read1_fail && !read2_fail) {
-               gd->env_valid = ENV_REDUND;
-               env_import((char *)tmp_env2, 1);
-       } else {
-               env_import_redund((char *)tmp_env1, (char *)tmp_env2);
-       }
-
-       ret = 0;
+       ret = env_import_redund((char *)tmp_env1, read1_fail, (char *)tmp_env2,
+                               read2_fail);
 
 fini:
        fini_mmc_for_env(mmc);
 err:
        if (ret)
-               set_default_env(errmsg);
+               env_set_default(errmsg, 0);
 
 #endif
        return ret;
@@ -332,6 +353,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);
 
@@ -352,14 +374,17 @@ static int env_mmc_load(void)
                goto fini;
        }
 
-       env_import(buf, 1);
-       ret = 0;
+       ret = env_import(buf, 1);
+       if (!ret) {
+               ep = (env_t *)buf;
+               gd->env_addr = (ulong)&ep->data;
+       }
 
 fini:
        fini_mmc_for_env(mmc);
 err:
        if (ret)
-               set_default_env(errmsg);
+               env_set_default(errmsg, 0);
 #endif
        return ret;
 }
@@ -371,5 +396,8 @@ 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
 #endif
 };