summaryrefslogtreecommitdiff
path: root/common/env_mmc.c
diff options
context:
space:
mode:
authorTerry Lv <r65388@freescale.com>2009-11-10 22:29:11 +0800
committerTerry Lv <r65388@freescale.com>2009-11-11 11:55:18 +0800
commit20710100e480543d36b76845c52cdec382f2b43a (patch)
tree240703f02b2f29379dfae9ca97df234e5d1057ce /common/env_mmc.c
parent34bc4951031059ccac23bf13fe261804f075880a (diff)
downloadu-boot-imx-20710100e480543d36b76845c52cdec382f2b43a.zip
u-boot-imx-20710100e480543d36b76845c52cdec382f2b43a.tar.gz
u-boot-imx-20710100e480543d36b76845c52cdec382f2b43a.tar.bz2
ENGR00118294: Misc changes for v2009.08 upgrade.
Misc changes for v2009.08 upgrade. Signed-off-by: Terry Lv <r65388@freescale.com>
Diffstat (limited to 'common/env_mmc.c')
-rw-r--r--common/env_mmc.c289
1 files changed, 34 insertions, 255 deletions
diff --git a/common/env_mmc.c b/common/env_mmc.c
index 180f39c..5742db0 100644
--- a/common/env_mmc.c
+++ b/common/env_mmc.c
@@ -30,8 +30,6 @@
#include <common.h>
-#if defined(CONFIG_ENV_IS_IN_MMC) /* Environment is in MMC Flash */
-
#include <command.h>
#include <environment.h>
#include <linux/stddef.h>
@@ -48,13 +46,8 @@
#error CONFIG_ENV_SIZE_REDUND should not be less then CONFIG_ENV_SIZE
#endif
-#ifdef CONFIG_INFERNO
-#error CONFIG_INFERNO not supported yet
-#endif
-
/* references to names in env_common.c */
extern uchar default_environment[];
-extern int default_environment_size;
char *env_name_spec = "MMC";
@@ -77,138 +70,54 @@ uchar env_get_char_spec(int index)
return *((uchar *)(gd->env_addr + index));
}
-
-/* this is called before nand_init()
- * so we can't read Nand to validate env data.
- * Mark it OK for now. env_relocate() in env_common.c
- * will call our relocate function which will does
- * the real validation.
- *
- * When using a NAND boot image (like sequoia_nand), the environment
- * can be embedded or attached to the U-Boot image in NAND flash. This way
- * the SPL loads not only the U-Boot image from NAND but also the
- * environment.
- */
int env_init(void)
{
-#if defined(CONFIG_IS_EMBEDDED)
- size_t total;
- int crc1_ok = 0, crc2_ok = 0;
- env_t *tmp_env1, *tmp_env2;
-
- total = CONFIG_ENV_SIZE;
-
- tmp_env1 = env_ptr;
- tmp_env2 = (env_t *)((ulong)env_ptr + CONFIG_ENV_SIZE);
-
- crc1_ok = (crc32(0, tmp_env1->data, ENV_SIZE) == tmp_env1->crc);
- crc2_ok = (crc32(0, tmp_env2->data, ENV_SIZE) == tmp_env2->crc);
-
- if (!crc1_ok && !crc2_ok)
- gd->env_valid = 0;
- else if (crc1_ok && !crc2_ok)
- gd->env_valid = 1;
- else if (!crc1_ok && crc2_ok)
- gd->env_valid = 2;
- else {
- /* both ok - check serial */
- if (tmp_env1->flags == 255 && tmp_env2->flags == 0)
- gd->env_valid = 2;
- else if (tmp_env2->flags == 255 && tmp_env1->flags == 0)
- gd->env_valid = 1;
- else if (tmp_env1->flags > tmp_env2->flags)
- gd->env_valid = 1;
- else if (tmp_env2->flags > tmp_env1->flags)
- gd->env_valid = 2;
- else /* flags are equal - almost impossible */
- gd->env_valid = 1;
- }
-
- if (gd->env_valid == 1)
- env_ptr = tmp_env1;
- else if (gd->env_valid == 2)
- env_ptr = tmp_env2;
-
-#else /* ENV_IS_EMBEDDED */
- gd->env_addr = (ulong)&default_environment[0];
+ /* use default */
+ gd->env_addr = (ulong)&default_environment[0];
gd->env_valid = 1;
-#endif /* ENV_IS_EMBEDDED */
-
return 0;
}
-#ifdef CMD_SAVEENV
-/*
- * The legacy NAND code saved the environment in the first NAND device i.e.,
- * nand_dev_desc + 0. This is also the behaviour using the new NAND code.
- */
-#ifdef CONFIG_ENV_OFFSET_REDUND
-int saveenv(void)
+inline int init_mmc_for_env(struct mmc *mmc)
{
- size_t total;
- uint blk_start = 0, blk_cnt = 0, n = 0;
- struct mmc *mmc = find_mmc_device(0);
-
- env_ptr->flags++;
- total = CONFIG_ENV_SIZE;
-
if (!mmc) {
puts("No MMC card found\n");
- return;
+ return -1;
}
if (mmc_init(mmc)) {
puts("MMC init failed\n");
- return 1;
+ return -1;
}
- if (gd->env_valid == 1) {
- puts("Writing to redundant MMC... ");
- blk_start = (CONFIG_ENV_OFFSET_REDUND % 512) ? \
- ((CONFIG_ENV_OFFSET_REDUND / 512) + 1) : (CONFIG_ENV_OFFSET_REDUND / 512);
- blk_cnt = (total % 512) ? ((total / 512) + 1) : (total / 512);
- n = mmc->block_dev.block_write(0, blk_start , blk_cnt, (u_char *)env_ptr);
- } else {
- puts("Writing to MMC... ");
- blk_start = (CONFIG_ENV_OFFSET % 512) ? \
- ((CONFIG_ENV_OFFSET / 512) + 1) : (CONFIG_ENV_OFFSET / 512);
- blk_cnt = (total % 512) ? ((total / 512) + 1) : (total / 512);
- n = mmc->block_dev.block_write(0, blk_start , blk_cnt, (u_char *)env_ptr);
- }
- if ((n != blk_cnt) || (total != CONFIG_ENV_SIZE)) {
- puts("failed\n");
- return 1;
- }
-
- puts("done\n");
- gd->env_valid = (gd->env_valid == 2 ? 1 : 2);
return 0;
}
-#else /* ! CONFIG_ENV_OFFSET_REDUND */
-int saveenv(void)
+
+#ifdef CMD_SAVEENV
+
+inline int write_env(struct mmc *mmc, unsigned long size,
+ unsigned long offset, const void *buffer)
{
- size_t total;
uint blk_start = 0, blk_cnt = 0, n = 0;
- struct mmc *mmc = find_mmc_device(0);
- if (!mmc) {
- puts("No MMC card found\n");
- return;
- }
+ blk_start = (offset % 512) ? ((offset / 512) + 1) : (offset / 512);
+ blk_cnt = (size % 512) ? ((size / 512) + 1) : (size / 512);
+ n = mmc->block_dev.block_write(0, blk_start , blk_cnt, (u_char *)buffer);
- if (mmc_init(mmc)) {
- puts("MMC init failed\n");
+ return (n == blk_cnt) ? 0 : -1;
+}
+
+int saveenv(void)
+{
+ struct mmc *mmc = find_mmc_device(0);
+
+ if (init_mmc_for_env(mmc))
return 1;
- }
puts("Writing to MMC... ");
- total = CONFIG_ENV_SIZE;
- blk_start = (CONFIG_ENV_OFFSET % 512) ? \
- ((CONFIG_ENV_OFFSET / 512) + 1) : (CONFIG_ENV_OFFSET / 512);
- blk_cnt = (total % 512) ? ((total / 512) + 1) : (total / 512);
- n = mmc->block_dev.block_write(0, blk_start , blk_cnt, (u_char *)env_ptr);
- if ((n != blk_cnt) || (total != CONFIG_ENV_SIZE)) {
+ if (write_env(mmc, CONFIG_ENV_SIZE, \
+ CONFIG_ENV_OFFSET, env_ptr)) {
puts("failed\n");
return 1;
}
@@ -216,172 +125,42 @@ int saveenv(void)
puts("done\n");
return 0;
}
-#endif /* CONFIG_ENV_OFFSET_REDUND */
#endif /* CMD_SAVEENV */
-#ifdef CONFIG_ENV_OFFSET_REDUND
-void env_relocate_spec(void)
+inline int read_env(struct mmc *mmc, unsigned long size,
+ unsigned long offset, const void *buffer)
{
-#if !defined(ENV_IS_EMBEDDED)
- size_t total;
- int crc1_ok = 0, crc2_ok = 0;
- env_t *tmp_env1 = NULL, *tmp_env2 = NULL;
uint blk_start = 0, blk_cnt = 0, n = 0;
- struct mmc *mmc = find_mmc_device(0);
-
- if (!mmc) {
- puts("No MMC card found\n");
- return;
- }
-
- if (mmc_init(mmc)) {
- puts("MMC init failed\n");
- goto use_default;
- }
-
- total = CONFIG_ENV_SIZE;
-
- tmp_env1 = (env_t *)malloc(CONFIG_ENV_SIZE);
- if (!tmp_env1) {
- puts("Not enough memory!\n");
- goto use_default;
- }
- memset(tmp_env1, 0, CONFIG_ENV_SIZE);
-
- tmp_env2 = (env_t *)malloc(CONFIG_ENV_SIZE);
- if (!tmp_env2) {
- puts("Not enough memory!\n");
- goto use_default;
- }
- memset(tmp_env2, 0, CONFIG_ENV_SIZE);
- puts("Loading environment from mmc... ");
+ blk_start = (offset % 512) ? ((offset / 512) + 1) : (offset / 512);
+ blk_cnt = (size % 512) ? ((size / 512) + 1) : (size / 512);
- blk_start = (CONFIG_ENV_OFFSET % 512) ? \
- ((CONFIG_ENV_OFFSET / 512) + 1) : (CONFIG_ENV_OFFSET / 512);
- blk_cnt = (total % 512) ? ((total / 512) + 1) : (total / 512);
+ n = mmc->block_dev.block_read(0, blk_start, blk_cnt, (uchar *)buffer);
- n = mmc->block_dev.block_read(0, blk_start, blk_cnt, (uchar *)tmp_env1);
-
- if (n != blk_cnt) {
- puts("failed\n");
- goto use_default;
- }
- puts("done\n");
-
- puts("Loading redundant environment from mmc... ");
-
- blk_start = (CONFIG_ENV_OFFSET_REDUND % 512) ? \
- ((CONFIG_ENV_OFFSET_REDUND / 512) + 1) : (CONFIG_ENV_OFFSET_REDUND / 512);
- blk_cnt = (total % 512) ? ((total / 512) + 1) : (total / 512);
-
- n = mmc->block_dev.block_read(0, blk_start, blk_cnt, (uchar *)tmp_env2);
-
- if (n != blk_cnt) {
- puts("failed\n");
- goto use_default;
- }
- puts("done\n");
-
- crc1_ok = (crc32(0, tmp_env1->data, ENV_SIZE) == tmp_env1->crc);
- crc2_ok = (crc32(0, tmp_env2->data, ENV_SIZE) == tmp_env2->crc);
-
- if (!crc1_ok && !crc2_ok)
- goto use_default;
- else if (crc1_ok && !crc2_ok)
- gd->env_valid = 1;
- else if (!crc1_ok && crc2_ok)
- gd->env_valid = 2;
- else {
- /* both ok - check serial */
- if (tmp_env1->flags == 255 && tmp_env2->flags == 0)
- gd->env_valid = 2;
- else if (tmp_env2->flags == 255 && tmp_env1->flags == 0)
- gd->env_valid = 1;
- else if (tmp_env1->flags > tmp_env2->flags)
- gd->env_valid = 1;
- else if (tmp_env2->flags > tmp_env1->flags)
- gd->env_valid = 2;
- else /* flags are equal - almost impossible */
- gd->env_valid = 1;
- }
-
- free(env_ptr);
- if (gd->env_valid == 1) {
- env_ptr = tmp_env1;
- free(tmp_env2);
- } else {
- env_ptr = tmp_env2;
- free(tmp_env1);
- }
-
- return;
-
-use_default:
- if (tmp_env1)
- free(tmp_env1);
- if (tmp_env2)
- free(tmp_env2);
- return use_default();
-
-#endif /* ! ENV_IS_EMBEDDED */
+ return (n == blk_cnt) ? 0 : -1;
}
-#else /* ! CONFIG_ENV_OFFSET_REDUND */
-/*
- * The legacy NAND code saved the environment in the first NAND device i.e.,
- * nand_dev_desc + 0. This is also the behaviour using the new NAND code.
- */
+
void env_relocate_spec(void)
{
#if !defined(ENV_IS_EMBEDDED)
- size_t total;
- uint blk_start = 0, blk_cnt = 0, n = 0;
struct mmc *mmc = find_mmc_device(0);
- if (!mmc) {
- puts("No MMC card found\n");
- return;
- }
-
- if (mmc_init(mmc)) {
- puts("MMC init failed\n");
+ if (init_mmc_for_env(mmc))
return;
- }
-
- total = CONFIG_ENV_SIZE;
- blk_start = (CONFIG_ENV_OFFSET % 512) ? \
- ((CONFIG_ENV_OFFSET / 512) + 1) : (CONFIG_ENV_OFFSET / 512);
- blk_cnt = (total % 512) ? ((total / 512) + 1) : (total / 512);
-
- n = mmc->block_dev.block_read(0, blk_start, blk_cnt, (uchar *)env_ptr);
-
- if ((n != blk_cnt) || (total != CONFIG_ENV_SIZE))
+ if (read_env(mmc, CONFIG_ENV_SIZE, CONFIG_ENV_OFFSET, env_ptr))
return use_default();
if (crc32(0, env_ptr->data, ENV_SIZE) != env_ptr->crc)
return use_default();
#endif /* ! ENV_IS_EMBEDDED */
}
-#endif /* CONFIG_ENV_OFFSET_REDUND */
#if !defined(ENV_IS_EMBEDDED)
static void use_default()
{
- puts("*** Warning - bad CRC or MMC Card, using default environment\n\n");
-
- if (default_environment_size > CONFIG_ENV_SIZE) {
- puts("*** Error - default environment is too large\n\n");
- return;
- }
-
- memset(env_ptr, 0, sizeof(env_t));
- memcpy(env_ptr->data,
- default_environment,
- default_environment_size);
- env_ptr->crc = crc32(0, env_ptr->data, ENV_SIZE);
- gd->env_valid = 1;
+ puts ("*** Warning - bad CRC or MMC, using default environment\n\n");
+ set_default_env();
}
#endif
-#endif /* CONFIG_ENV_IS_IN_MMC */