]> git.sur5r.net Git - u-boot/blobdiff - common/env_common.c
MX51: Drop unused header file for mx51evk
[u-boot] / common / env_common.c
index 9be4cc1dbf58e1c2d688a312bf3367d566e819d9..a415ef8efe5d9ba19e2eff4b5c1a990cae08f3fb 100644 (file)
@@ -1,10 +1,10 @@
 /*
- * (C) Copyright 2000-2002
+ * (C) Copyright 2000-2010
  * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
  *
  * (C) Copyright 2001 Sysgo Real-Time Solutions, GmbH <www.elinos.com>
  * Andreas Heppel <aheppel@sysgo.de>
-
+ *
  * See file CREDITS for list of people who contributed to this
  * project.
  *
 #include <command.h>
 #include <environment.h>
 #include <linux/stddef.h>
+#include <search.h>
+#include <errno.h>
 #include <malloc.h>
 
-#ifdef CONFIG_SHOW_BOOT_PROGRESS
-# include <status_led.h>
-# define SHOW_BOOT_PROGRESS(arg)       show_boot_progress(arg)
-#else
-# define SHOW_BOOT_PROGRESS(arg)
-#endif
-
-#ifdef CONFIG_AMIGAONEG3SE
-       extern void enable_nvram(void);
-       extern void disable_nvram(void);
-#endif
-
-#undef DEBUG_ENV
-#ifdef DEBUG_ENV
-#define DEBUGF(fmt,args...) printf(fmt ,##args)
-#else
-#define DEBUGF(fmt,args...)
-#endif
+DECLARE_GLOBAL_DATA_PTR;
 
 extern env_t *env_ptr;
 
@@ -55,7 +40,6 @@ extern void env_relocate_spec (void);
 extern uchar env_get_char_spec(int);
 
 static uchar env_get_char_init (int index);
-uchar (*env_get_char)(int) = env_get_char_init;
 
 /************************************************************************
  * Default settings to be used when no valid environment is found
@@ -97,14 +81,20 @@ uchar default_environment[] = {
 #ifdef CONFIG_ETH3ADDR
        "eth3addr="     MK_STR(CONFIG_ETH3ADDR)         "\0"
 #endif
+#ifdef CONFIG_ETH4ADDR
+       "eth4addr="     MK_STR(CONFIG_ETH4ADDR)         "\0"
+#endif
+#ifdef CONFIG_ETH5ADDR
+       "eth5addr="     MK_STR(CONFIG_ETH5ADDR)         "\0"
+#endif
 #ifdef CONFIG_IPADDR
        "ipaddr="       MK_STR(CONFIG_IPADDR)           "\0"
 #endif
 #ifdef CONFIG_SERVERIP
        "serverip="     MK_STR(CONFIG_SERVERIP)         "\0"
 #endif
-#ifdef CFG_AUTOLOAD
-       "autoload="     CFG_AUTOLOAD                    "\0"
+#ifdef CONFIG_SYS_AUTOLOAD
+       "autoload="     CONFIG_SYS_AUTOLOAD                     "\0"
 #endif
 #ifdef CONFIG_PREBOOT
        "preboot="      CONFIG_PREBOOT                  "\0"
@@ -139,135 +129,117 @@ uchar default_environment[] = {
        "\0"
 };
 
-#if defined(CFG_ENV_IS_IN_NAND)                /* Environment is in Nand Flash */
-int default_environment_size = sizeof(default_environment);
-#endif
-
-void env_crc_update (void)
-{
-       env_ptr->crc = crc32(0, env_ptr->data, ENV_SIZE);
-}
-
 static uchar env_get_char_init (int index)
 {
-       DECLARE_GLOBAL_DATA_PTR;
        uchar c;
 
        /* if crc was bad, use the default environment */
        if (gd->env_valid)
-       {
                c = env_get_char_spec(index);
-       } else {
+       else
                c = default_environment[index];
-       }
 
        return (c);
 }
 
-#ifdef CONFIG_AMIGAONEG3SE
 uchar env_get_char_memory (int index)
 {
-       DECLARE_GLOBAL_DATA_PTR;
-       uchar retval;
-       enable_nvram();
-       if (gd->env_valid) {
-               retval = ( *((uchar *)(gd->env_addr + index)) );
-       } else {
-               retval = ( default_environment[index] );
-       }
-       disable_nvram();
-       return retval;
+       return *env_get_addr(index);
 }
-#else
-uchar env_get_char_memory (int index)
+
+uchar env_get_char (int index)
 {
-       DECLARE_GLOBAL_DATA_PTR;
+       uchar c;
 
-       if (gd->env_valid) {
-               return ( *((uchar *)(gd->env_addr + index)) );
-       } else {
-               return ( default_environment[index] );
-       }
+       /* if relocated to RAM */
+       if (gd->flags & GD_FLG_RELOC)
+               c = env_get_char_memory(index);
+       else
+               c = env_get_char_init(index);
+
+       return (c);
 }
-#endif
 
 uchar *env_get_addr (int index)
 {
-       DECLARE_GLOBAL_DATA_PTR;
+       if (gd->env_valid)
+               return (uchar *)(gd->env_addr + index);
+       else
+               return &default_environment[index];
+}
+
+void set_default_env(const char *s)
+{
+       if (sizeof(default_environment) > ENV_SIZE) {
+               puts("*** Error - default environment is too large\n\n");
+               return;
+       }
 
-       if (gd->env_valid) {
-               return ( ((uchar *)(gd->env_addr + index)) );
+       if (s) {
+               if (*s == '!') {
+                       printf("*** Warning - %s, "
+                               "using default environment\n\n",
+                               s+1);
+               } else {
+                       puts(s);
+               }
        } else {
-               return (&default_environment[index]);
+               puts("Using default environment\n\n");
+       }
+
+       if (himport((char *)default_environment,
+                   sizeof(default_environment), '\0', 0) == 0) {
+               error("Environment import failed: errno = %d\n", errno);
        }
+       gd->flags |= GD_FLG_ENV_READY;
 }
 
-void env_relocate (void)
+/*
+ * Check if CRC is valid and (if yes) import the environment.
+ * Note that "buf" may or may not be aligned.
+ */
+int env_import(const char *buf, int check)
 {
-       DECLARE_GLOBAL_DATA_PTR;
+       env_t *ep = (env_t *)buf;
 
-       DEBUGF ("%s[%d] offset = 0x%lx\n", __FUNCTION__,__LINE__,
-               gd->reloc_off);
+       if (check) {
+               uint32_t crc;
 
-#ifdef CONFIG_AMIGAONEG3SE
-       enable_nvram();
-#endif
+               memcpy(&crc, &ep->crc, sizeof(crc));
 
-#ifdef ENV_IS_EMBEDDED
-       /*
-        * The environment buffer is embedded with the text segment,
-        * just relocate the environment pointer
-        */
-       env_ptr = (env_t *)((ulong)env_ptr + gd->reloc_off);
-       DEBUGF ("%s[%d] embedded ENV at %p\n", __FUNCTION__,__LINE__,env_ptr);
-#else
-       /*
-        * We must allocate a buffer for the environment
-        */
-       env_ptr = (env_t *)malloc (CFG_ENV_SIZE);
-       DEBUGF ("%s[%d] malloced ENV at %p\n", __FUNCTION__,__LINE__,env_ptr);
-#endif
+               if (crc32(0, ep->data, ENV_SIZE) != crc) {
+                       set_default_env("!bad CRC");
+                       return 0;
+               }
+       }
 
-       /*
-        * After relocation to RAM, we can always use the "memory" functions
-        */
-       env_get_char = env_get_char_memory;
+       if (himport((char *)ep->data, ENV_SIZE, '\0', 0)) {
+               gd->flags |= GD_FLG_ENV_READY;
+               return 1;
+       }
 
-       if (gd->env_valid == 0) {
-#if defined(CONFIG_GTH)        || defined(CFG_ENV_IS_NOWHERE)  /* Environment not changable */
-               puts ("Using default environment\n\n");
-#else
-               puts ("*** Warning - bad CRC, using default environment\n\n");
-               SHOW_BOOT_PROGRESS (-1);
-#endif
+       error("Cannot import environment: errno = %d\n", errno);
 
-               if (sizeof(default_environment) > ENV_SIZE)
-               {
-                       puts ("*** Error - default environment is too large\n\n");
-                       return;
-               }
+       set_default_env("!import failed");
+
+       return 0;
+}
 
-               memset (env_ptr, 0, sizeof(env_t));
-               memcpy (env_ptr->data,
-                       default_environment,
-                       sizeof(default_environment));
-#ifdef CFG_REDUNDAND_ENVIRONMENT
-               env_ptr->flags = 0xFF;
+void env_relocate (void)
+{
+       if (gd->env_valid == 0) {
+#if defined(CONFIG_ENV_IS_NOWHERE)     /* Environment not changable */
+               set_default_env(NULL);
+#else
+               show_boot_progress (-60);
 #endif
-               env_crc_update ();
-               gd->env_valid = 1;
-       }
-       else {
+               set_default_env("!bad CRC");
+       } else {
                env_relocate_spec ();
        }
-       gd->env_addr = (ulong)&(env_ptr->data);
-
-#ifdef CONFIG_AMIGAONEG3SE
-       disable_nvram();
-#endif
 }
 
-#ifdef CONFIG_AUTO_COMPLETE
+#if 0 /* need to reimplement - def CONFIG_AUTO_COMPLETE */
 int env_complete(char *var, int maxv, char *cmdv[], int bufsz, char *buf)
 {
        int i, nxt, len, vallen, found;
@@ -283,7 +255,7 @@ int env_complete(char *var, int maxv, char *cmdv[], int bufsz, char *buf)
                for (nxt=i; env_get_char(nxt) != '\0'; ++nxt)
                        ;
 
-               lval = env_get_addr(i);
+               lval = (char *)env_get_addr(i);
                rval = strchr(lval, '=');
                if (rval != NULL) {
                        vallen = rval - lval;