diff options
author | Terry Lv <r65388@freescale.com> | 2009-11-10 22:29:11 +0800 |
---|---|---|
committer | Terry Lv <r65388@freescale.com> | 2009-11-11 11:55:18 +0800 |
commit | 20710100e480543d36b76845c52cdec382f2b43a (patch) | |
tree | 240703f02b2f29379dfae9ca97df234e5d1057ce /common/env_mmc.c | |
parent | 34bc4951031059ccac23bf13fe261804f075880a (diff) | |
download | u-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.c | 289 |
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 */ |