Hi,

below is a patch / rfc that allows me to read the envorinment from NAND 
early enough to be used in the console initialisation. It turns out this 
is not only an ARM problem, rather it is common to all platforms storing 
environment in NAND. Similarly, probably, env in SPI flash would have this 
problem on all platforms too. The patch is not meant for mainline in its 
present form because it only solves the problem for platforms, that not 
only have their env in NAND, but also boot from NAND (using nand_spl). 
OTOH, who would want to store environment in NAND if they didn't have to 
boot from it? Anyway, it lacks generality. Also, it contains a couple of 
clean ups, that actually would have to be submitted separately (removal 
of unused "total" variable, and a typo fix in a comment).

So, this is mostly as an inspiration for someone to develop a proper 
patch, or, if we do decide, that this approach is good enough, I'll split 
it up and submit properly.

Thanks
Guennadi
---
Guennadi Liakhovetski, Ph.D.

DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-0 Fax: +49-8142-66989-80  Email: off...@denx.de

diff --git a/common/env_nand.c b/common/env_nand.c
index a8f0de7..1261dd2 100644
--- a/common/env_nand.c
+++ b/common/env_nand.c
@@ -71,9 +71,11 @@ extern int default_environment_size;
 char * env_name_spec = "NAND";
 
 
-#ifdef ENV_IS_EMBEDDED
+#if defined(ENV_IS_EMBEDDED)
 extern uchar environment[];
 env_t *env_ptr = (env_t *)(&environment[0]);
+#elif defined(CFG_ENV_IS_APPENDED)
+env_t *env_ptr = (env_t *)CFG_NAND_ENV_DST;
 #else /* ! ENV_IS_EMBEDDED */
 env_t *env_ptr = 0;
 #endif /* ENV_IS_EMBEDDED */
@@ -105,23 +107,28 @@ uchar env_get_char_spec (int index)
  */
 int env_init(void)
 {
-#if defined(ENV_IS_EMBEDDED)
-       size_t total;
+#if defined(ENV_IS_EMBEDDED) || defined(CFG_ENV_IS_APPENDED)
        int crc1_ok = 0, crc2_ok = 0;
-       env_t *tmp_env1, *tmp_env2;
+       env_t *tmp_env1;
 
-       total = CFG_ENV_SIZE;
+#ifdef CFG_REDUNDAND_ENVIRONMENT
+       env_t *tmp_env2;
 
-       tmp_env1 = env_ptr;
        tmp_env2 = (env_t *)((ulong)env_ptr + CFG_ENV_SIZE);
+       crc2_ok = (crc32(0, tmp_env2->data, ENV_SIZE) == tmp_env2->crc);
+#endif
 
+       tmp_env1 = env_ptr;
        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_addr = (ulong)env_ptr->data;
+
+       if (!crc1_ok && !crc2_ok) {
+               gd->env_addr  = 0;
                gd->env_valid = 0;
-       else if(crc1_ok && !crc2_ok)
+       } else if(crc1_ok && !crc2_ok)
                gd->env_valid = 1;
+#ifdef CFG_REDUNDAND_ENVIRONMENT
        else if(!crc1_ok && crc2_ok)
                gd->env_valid = 2;
        else {
@@ -138,10 +145,13 @@ int env_init(void)
                        gd->env_valid = 1;
        }
 
+       if (gd->env_valid == 2)
+               env_ptr = tmp_env2;
+       else
+#endif
        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];
        gd->env_valid = 1;
@@ -186,12 +196,10 @@ int writeenv(size_t offset, u_char *buf)
 #ifdef CFG_ENV_OFFSET_REDUND
 int saveenv(void)
 {
-       size_t total;
        int ret = 0;
        nand_erase_options_t nand_erase_options;
 
        env_ptr->flags++;
-       total = CFG_ENV_SIZE;
 
        nand_erase_options.length = CFG_ENV_RANGE;
        nand_erase_options.quiet = 0;
@@ -229,7 +237,6 @@ int saveenv(void)
 #else /* ! CFG_ENV_OFFSET_REDUND */
 int saveenv(void)
 {
-       size_t total;
        int ret = 0;
        nand_erase_options_t nand_erase_options;
 
@@ -246,7 +253,6 @@ int saveenv(void)
                return 1;
 
        puts ("Writing to Nand... ");
-       total = CFG_ENV_SIZE;
        if (writeenv(CFG_ENV_OFFSET, (u_char *) env_ptr)) {
                puts("FAILED!\n");
                return 1;
@@ -290,12 +296,9 @@ int readenv (size_t offset, u_char * buf)
 void env_relocate_spec (void)
 {
 #if !defined(ENV_IS_EMBEDDED)
-       size_t total;
        int crc1_ok = 0, crc2_ok = 0;
        env_t *tmp_env1, *tmp_env2;
 
-       total = CFG_ENV_SIZE;
-
        tmp_env1 = (env_t *) malloc(CFG_ENV_SIZE);
        tmp_env2 = (env_t *) malloc(CFG_ENV_SIZE);
 
diff --git a/include/configs/smdk6400.h b/include/configs/smdk6400.h
index 1ee4191..3acf7cd 100644
--- a/include/configs/smdk6400.h
+++ b/include/configs/smdk6400.h
@@ -223,6 +224,8 @@
 #define CFG_UBOOT_BASE         (CFG_MAPPED_RAM_BASE + 0x07e00000)
 
 #define CFG_ENV_OFFSET         0x0040000
+/* Leave enough space for bss, currently __bss_end == 0x57e74800 */
+#define CFG_NAND_ENV_DST       (CFG_UBOOT_BASE + 0x80000)
 
 /* NAND configuration */
 #define CFG_MAX_NAND_DEVICE    1
@@ -284,7 +287,8 @@
 */
 
 /* Settings as above boot configuration */
-#define CFG_ENV_IS_IN_NAND
+#define CFG_ENV_IS_IN_NAND     1
+#define CFG_ENV_IS_APPENDED    1
 #define CONFIG_BOOTARGS                "console=ttySAC,115200"
 
 #if !defined(CONFIG_ENABLE_MMU)
diff --git a/lib_arm/board.c b/lib_arm/board.c
index a093860..2dadfce 100644
--- a/lib_arm/board.c
+++ b/lib_arm/board.c
@@ -282,7 +282,7 @@ init_fnc_t *init_sequence[] = {
        board_init,             /* basic board dependent setup */
        interrupt_init,         /* set up exceptions */
        env_init,               /* initialize environment */
-       init_baudrate,          /* initialze baudrate settings */
+       init_baudrate,          /* initialize baudrate settings */
        serial_init,            /* serial communications setup */
        console_init_f,         /* stage 1 init of console */
        display_banner,         /* say that we are here */
diff --git a/nand_spl/nand_boot.c b/nand_spl/nand_boot.c
index 16d128f..1fe10d2 100644
--- a/nand_spl/nand_boot.c
+++ b/nand_spl/nand_boot.c
@@ -248,6 +248,11 @@ void nand_boot(void)
        ret = nand_load(&nand_info, CFG_NAND_U_BOOT_OFFS, CFG_NAND_U_BOOT_SIZE,
                        (uchar *)CFG_NAND_U_BOOT_DST);
 
+#ifdef CFG_ENV_IS_APPENDED
+       nand_load(&nand_info, CFG_ENV_OFFSET, CFG_ENV_SIZE,
+                 (uchar *)CFG_NAND_ENV_DST);
+#endif
+
        if (nand_chip.select_chip)
                nand_chip.select_chip(&nand_info, -1);
 
_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to