]> git.ipfire.org Git - people/ms/u-boot.git/blobdiff - env/common.c
ARM: dts: DRA7: use new dra7-specific compatible string
[people/ms/u-boot.git] / env / common.c
index d9c0c4e3f347453e704d0682df743349009bdb47..f21ff700969561d022e63b89dad931aa29beada6 100644 (file)
@@ -27,49 +27,13 @@ struct hsearch_data env_htab = {
        .change_ok = env_flags_validate,
 };
 
-__weak uchar env_get_char_spec(int index)
-{
-       return *((uchar *)(gd->env_addr + index));
-}
-
-static uchar env_get_char_init(int index)
-{
-       /* if crc was bad, use the default environment */
-       if (gd->env_valid)
-               return env_get_char_spec(index);
-       else
-               return default_environment[index];
-}
-
-uchar env_get_char_memory(int index)
-{
-       return *env_get_addr(index);
-}
-
-uchar env_get_char(int index)
-{
-       /* if relocated to RAM */
-       if (gd->flags & GD_FLG_RELOC)
-               return env_get_char_memory(index);
-       else
-               return env_get_char_init(index);
-}
-
-const uchar *env_get_addr(int index)
-{
-       if (gd->env_valid)
-               return (uchar *)(gd->env_addr + index);
-       else
-               return &default_environment[index];
-}
-
 /*
  * Read an environment variable as a boolean
  * Return -1 if variable does not exist (default to true)
  */
-int getenv_yesno(const char *var)
+int env_get_yesno(const char *var)
 {
-       char *s = getenv(var);
+       char *s = env_get(var);
 
        if (s == NULL)
                return -1;
@@ -80,7 +44,7 @@ int getenv_yesno(const char *var)
 /*
  * Look up the variable from the default environment
  */
-char *getenv_default(const char *name)
+char *env_get_default(const char *name)
 {
        char *ret_val;
        unsigned long really_valid = gd->env_valid;
@@ -88,8 +52,8 @@ char *getenv_default(const char *name)
 
        /* Pretend that the image is bad. */
        gd->flags &= ~GD_FLG_ENV_READY;
-       gd->env_valid = 0;
-       ret_val = getenv(name);
+       gd->env_valid = ENV_INVALID;
+       ret_val = env_get(name);
        gd->env_valid = really_valid;
        gd->flags = real_gd_flags;
        return ret_val;
@@ -114,13 +78,13 @@ void set_default_env(const char *s)
                        puts(s);
                }
        } else {
-               puts("Using default environment\n\n");
+               debug("Using default environment\n");
        }
 
        if (himport_r(&env_htab, (char *)default_environment,
                        sizeof(default_environment), '\0', flags, 0,
                        0, NULL) == 0)
-               error("Environment import failed: errno = %d\n", errno);
+               pr_err("Environment import failed: errno = %d\n", errno);
 
        gd->flags |= GD_FLG_ENV_READY;
        gd->flags |= GD_FLG_ENV_DEFAULT;
@@ -139,52 +103,6 @@ int set_default_vars(int nvars, char * const vars[])
                                H_NOCLEAR | H_INTERACTIVE, 0, nvars, vars);
 }
 
-#ifdef CONFIG_ENV_AES
-#include <uboot_aes.h>
-/**
- * env_aes_cbc_get_key() - Get AES-128-CBC key for the environment
- *
- * This function shall return 16-byte array containing AES-128 key used
- * to encrypt and decrypt the environment. This function must be overridden
- * by the implementer as otherwise the environment encryption will not
- * work.
- */
-__weak uint8_t *env_aes_cbc_get_key(void)
-{
-       return NULL;
-}
-
-static int env_aes_cbc_crypt(env_t *env, const int enc)
-{
-       unsigned char *data = env->data;
-       uint8_t *key;
-       uint8_t key_exp[AES_EXPAND_KEY_LENGTH];
-       uint32_t aes_blocks;
-
-       key = env_aes_cbc_get_key();
-       if (!key)
-               return -EINVAL;
-
-       /* First we expand the key. */
-       aes_expand_key(key, key_exp);
-
-       /* Calculate the number of AES blocks to encrypt. */
-       aes_blocks = ENV_SIZE / AES_KEY_LENGTH;
-
-       if (enc)
-               aes_cbc_encrypt_blocks(key_exp, data, data, aes_blocks);
-       else
-               aes_cbc_decrypt_blocks(key_exp, data, data, aes_blocks);
-
-       return 0;
-}
-#else
-static inline int env_aes_cbc_crypt(env_t *env, const int enc)
-{
-       return 0;
-}
-#endif
-
 /*
  * Check if CRC is valid and (if yes) import the environment.
  * Note that "buf" may or may not be aligned.
@@ -192,7 +110,6 @@ static inline int env_aes_cbc_crypt(env_t *env, const int enc)
 int env_import(const char *buf, int check)
 {
        env_t *ep = (env_t *)buf;
-       int ret;
 
        if (check) {
                uint32_t crc;
@@ -201,35 +118,28 @@ int env_import(const char *buf, int check)
 
                if (crc32(0, ep->data, ENV_SIZE) != crc) {
                        set_default_env("!bad CRC");
-                       return 0;
+                       return -EIO;
                }
        }
 
-       /* Decrypt the env if desired. */
-       ret = env_aes_cbc_crypt(ep, 0);
-       if (ret) {
-               error("Failed to decrypt env!\n");
-               set_default_env("!import failed");
-               return ret;
-       }
-
        if (himport_r(&env_htab, (char *)ep->data, ENV_SIZE, '\0', 0, 0,
                        0, NULL)) {
                gd->flags |= GD_FLG_ENV_READY;
-               return 1;
+               return 0;
        }
 
-       error("Cannot import environment: errno = %d\n", errno);
+       pr_err("Cannot import environment: errno = %d\n", errno);
 
        set_default_env("!import failed");
 
-       return 0;
+       return -EIO;
 }
 
 #ifdef CONFIG_SYS_REDUNDAND_ENVIRONMENT
 static unsigned char env_flags;
 
-int env_import_redund(const char *buf1, const char *buf2)
+int env_import_redund(const char *buf1, int buf1_read_fail,
+                     const char *buf2, int buf2_read_fail)
 {
        int crc1_ok, crc2_ok;
        env_t *ep, *tmp_env1, *tmp_env2;
@@ -237,6 +147,24 @@ int env_import_redund(const char *buf1, const char *buf2)
        tmp_env1 = (env_t *)buf1;
        tmp_env2 = (env_t *)buf2;
 
+       if (buf1_read_fail && buf2_read_fail) {
+               puts("*** Error - No Valid Environment Area found\n");
+       } else if (buf1_read_fail || buf2_read_fail) {
+               puts("*** Warning - some problems detected ");
+               puts("reading environment; recovered successfully\n");
+       }
+
+       if (buf1_read_fail && buf2_read_fail) {
+               set_default_env("!bad env area");
+               return -EIO;
+       } else if (!buf1_read_fail && buf2_read_fail) {
+               gd->env_valid = ENV_VALID;
+               return env_import((char *)tmp_env1, 1);
+       } else if (buf1_read_fail && !buf2_read_fail) {
+               gd->env_valid = ENV_REDUND;
+               return env_import((char *)tmp_env2, 1);
+       }
+
        crc1_ok = crc32(0, tmp_env1->data, ENV_SIZE) ==
                        tmp_env1->crc;
        crc2_ok = crc32(0, tmp_env2->data, ENV_SIZE) ==
@@ -244,26 +172,26 @@ int env_import_redund(const char *buf1, const char *buf2)
 
        if (!crc1_ok && !crc2_ok) {
                set_default_env("!bad CRC");
-               return 0;
+               return -EIO;
        } else if (crc1_ok && !crc2_ok) {
-               gd->env_valid = 1;
+               gd->env_valid = ENV_VALID;
        } else if (!crc1_ok && crc2_ok) {
-               gd->env_valid = 2;
+               gd->env_valid = ENV_REDUND;
        } else {
                /* both ok - check serial */
                if (tmp_env1->flags == 255 && tmp_env2->flags == 0)
-                       gd->env_valid = 2;
+                       gd->env_valid = ENV_REDUND;
                else if (tmp_env2->flags == 255 && tmp_env1->flags == 0)
-                       gd->env_valid = 1;
+                       gd->env_valid = ENV_VALID;
                else if (tmp_env1->flags > tmp_env2->flags)
-                       gd->env_valid = 1;
+                       gd->env_valid = ENV_VALID;
                else if (tmp_env2->flags > tmp_env1->flags)
-                       gd->env_valid = 2;
+                       gd->env_valid = ENV_REDUND;
                else /* flags are equal - almost impossible */
-                       gd->env_valid = 1;
+                       gd->env_valid = ENV_VALID;
        }
 
-       if (gd->env_valid == 1)
+       if (gd->env_valid == ENV_VALID)
                ep = tmp_env1;
        else
                ep = tmp_env2;
@@ -278,20 +206,14 @@ int env_export(env_t *env_out)
 {
        char *res;
        ssize_t len;
-       int ret;
 
        res = (char *)env_out->data;
        len = hexport_r(&env_htab, '\0', 0, &res, ENV_SIZE, 0, NULL);
        if (len < 0) {
-               error("Cannot export environment: errno = %d\n", errno);
+               pr_err("Cannot export environment: errno = %d\n", errno);
                return 1;
        }
 
-       /* Encrypt the env if desired. */
-       ret = env_aes_cbc_crypt(env_out, 1);
-       if (ret)
-               return ret;
-
        env_out->crc = crc32(0, env_out->data, ENV_SIZE);
 
 #ifdef CONFIG_SYS_REDUNDAND_ENVIRONMENT
@@ -307,7 +229,7 @@ void env_relocate(void)
        env_reloc();
        env_htab.change_ok += gd->reloc_off;
 #endif
-       if (gd->env_valid == 0) {
+       if (gd->env_valid == ENV_INVALID) {
 #if defined(CONFIG_ENV_IS_NOWHERE) || defined(CONFIG_SPL_BUILD)
                /* Environment not changable */
                set_default_env(NULL);
@@ -316,7 +238,7 @@ void env_relocate(void)
                set_default_env("!bad CRC");
 #endif
        } else {
-               env_relocate_spec();
+               env_load();
        }
 }