MLK-22279-1 env: Add env_get_offset to override static env offset
authorYe Li <ye.li@nxp.com>
Tue, 16 Jul 2019 08:39:40 +0000 (01:39 -0700)
committerYe Li <ye.li@nxp.com>
Thu, 29 Apr 2021 07:56:19 +0000 (00:56 -0700)
Add env_get_offset interface to override static CONFIG_ENV_OFFSET,
and update env location driver to use env_get_offset. So for different
storage medium, we are able to store the env at different offset.

We don't support this feature when CONFIG_ENV_IS_EMBEDDED is set.

Signed-off-by: Ye Li <ye.li@nxp.com>
(cherry picked from commit 5b12d7cabb14bab9a95af7460b36c6c85db1b328)
(cherry picked from commit 565d9002ac59b03d5bc77c6d88f2b93492166b66)
(cherry picked from commit 445f20fe7162a15fd7415913434f24b6224bbe57)

env/eeprom.c
env/env.c
env/mmc.c
env/nand.c
env/sata.c
env/sf.c
include/env.h

index ba16801..1f36917 100644 (file)
@@ -70,7 +70,7 @@ static int eeprom_bus_write(unsigned dev_addr, unsigned offset,
 int env_eeprom_get_char(int index)
 {
        uchar c;
-       unsigned int off = CONFIG_ENV_OFFSET;
+       unsigned int off = env_get_offset(CONFIG_ENV_OFFSET);
 
 #ifdef CONFIG_ENV_OFFSET_REDUND
        if (gd->env_valid == ENV_REDUND)
@@ -85,7 +85,7 @@ int env_eeprom_get_char(int index)
 static int env_eeprom_load(void)
 {
        char buf_env[CONFIG_ENV_SIZE];
-       unsigned int off = CONFIG_ENV_OFFSET;
+       unsigned int off = env_get_offset(CONFIG_ENV_OFFSET);
 
 #ifdef CONFIG_ENV_OFFSET_REDUND
        ulong len, crc[2], crc_tmp;
@@ -95,7 +95,7 @@ static int env_eeprom_load(void)
 
        eeprom_init(-1);        /* prepare for EEPROM read/write */
 
-       off_env[0] = CONFIG_ENV_OFFSET;
+       off_env[0] = env_get_offset(CONFIG_ENV_OFFSET);
        off_env[1] = CONFIG_ENV_OFFSET_REDUND;
 
        for (i = 0; i < 2; i++) {
@@ -157,7 +157,7 @@ static int env_eeprom_load(void)
 
        /* read old CRC */
        eeprom_bus_read(CONFIG_SYS_DEF_EEPROM_ADDR,
-                       CONFIG_ENV_OFFSET + offsetof(env_t, crc),
+                       env_get_offset(CONFIG_ENV_OFFSET) + offsetof(env_t, crc),
                        (uchar *)&crc, sizeof(ulong));
 
        new = 0;
@@ -167,7 +167,7 @@ static int env_eeprom_load(void)
                int n = (len > sizeof(rdbuf)) ? sizeof(rdbuf) : len;
 
                eeprom_bus_read(CONFIG_SYS_DEF_EEPROM_ADDR,
-                               CONFIG_ENV_OFFSET + off, rdbuf, n);
+                               env_get_offset(CONFIG_ENV_OFFSET) + off, rdbuf, n);
                new = crc32(new, rdbuf, n);
                len -= n;
                off += n;
@@ -180,7 +180,7 @@ static int env_eeprom_load(void)
        }
 #endif /* CONFIG_ENV_OFFSET_REDUND */
 
-       off = CONFIG_ENV_OFFSET;
+       off = env_get_offset(CONFIG_ENV_OFFSET);
 #ifdef CONFIG_ENV_OFFSET_REDUND
        if (gd->env_valid == ENV_REDUND)
                off = CONFIG_ENV_OFFSET_REDUND;
@@ -196,7 +196,7 @@ static int env_eeprom_save(void)
 {
        env_t   env_new;
        int     rc;
-       unsigned int off        = CONFIG_ENV_OFFSET;
+       unsigned int off        = env_get_offset(CONFIG_ENV_OFFSET);
 #ifdef CONFIG_ENV_OFFSET_REDUND
        unsigned int off_red    = CONFIG_ENV_OFFSET_REDUND;
        char flag_obsolete      = ENV_REDUND_OBSOLETE;
@@ -209,7 +209,7 @@ static int env_eeprom_save(void)
 #ifdef CONFIG_ENV_OFFSET_REDUND
        if (gd->env_valid == ENV_VALID) {
                off     = CONFIG_ENV_OFFSET_REDUND;
-               off_red = CONFIG_ENV_OFFSET;
+               off_red = env_get_offset(CONFIG_ENV_OFFSET);
        }
 
        env_new.flags = ENV_REDUND_ACTIVE;
index caefa33..75a4e97 100644 (file)
--- a/env/env.c
+++ b/env/env.c
@@ -391,3 +391,10 @@ int env_select(const char *name)
 
        return -ENODEV;
 }
+
+#ifndef ENV_IS_EMBEDDED
+__weak long long env_get_offset(long long defautl_offset)
+{
+       return defautl_offset;
+}
+#endif
index 9b226be..10434cc 100644 (file)
--- a/env/mmc.c
+++ b/env/mmc.c
@@ -81,7 +81,7 @@ static inline s64 mmc_offset(int copy)
                        return val;
        }
 
-       defvalue = CONFIG_ENV_OFFSET;
+       defvalue = env_get_offset(CONFIG_ENV_OFFSET);
        propname = dt_prop.offset;
 
 #if defined(CONFIG_ENV_OFFSET_REDUND)
@@ -95,7 +95,7 @@ static inline s64 mmc_offset(int copy)
 #else
 static inline s64 mmc_offset(int copy)
 {
-       s64 offset = CONFIG_ENV_OFFSET;
+       s64 offset = env_get_offset(CONFIG_ENV_OFFSET);
 
 #if defined(CONFIG_ENV_OFFSET_REDUND)
        if (copy)
index be82e97..a7e5d59 100644 (file)
@@ -154,7 +154,7 @@ static int writeenv(size_t offset, u_char *buf)
 
 struct nand_env_location {
        const char *name;
-       const nand_erase_options_t erase_opts;
+       nand_erase_options_t erase_opts;
 };
 
 static int erase_and_write_env(const struct nand_env_location *location,
@@ -183,25 +183,17 @@ static int env_nand_save(void)
        int     ret = 0;
        ALLOC_CACHE_ALIGN_BUFFER(env_t, env_new, 1);
        int     env_idx = 0;
-       static const struct nand_env_location location[] = {
-               {
-                       .name = "NAND",
-                       .erase_opts = {
-                               .length = CONFIG_ENV_RANGE,
-                               .offset = CONFIG_ENV_OFFSET,
-                       },
-               },
+       static struct nand_env_location location[2] = {0};
+
+       location[0].name = "NAND";
+       location[0].erase_opts.length = CONFIG_ENV_RANGE;
+       location[0].erase_opts.offset = env_get_offset(CONFIG_ENV_OFFSET);
+
 #ifdef CONFIG_ENV_OFFSET_REDUND
-               {
-                       .name = "redundant NAND",
-                       .erase_opts = {
-                               .length = CONFIG_ENV_RANGE,
-                               .offset = CONFIG_ENV_OFFSET_REDUND,
-                       },
-               },
+       location[1].name = "redundant NAND";
+       location[1].erase_opts.length = CONFIG_ENV_RANGE;
+       location[1].erase_opts.offset = CONFIG_ENV_OFFSET_REDUND;
 #endif
-       };
-
 
        if (CONFIG_ENV_RANGE < CONFIG_ENV_SIZE)
                return 1;
@@ -328,7 +320,7 @@ static int env_nand_load(void)
                goto done;
        }
 
-       read1_fail = readenv(CONFIG_ENV_OFFSET, (u_char *) tmp_env1);
+       read1_fail = readenv(env_get_offset(CONFIG_ENV_OFFSET), (u_char *) tmp_env1);
        read2_fail = readenv(CONFIG_ENV_OFFSET_REDUND, (u_char *) tmp_env2);
 
        ret = env_import_redund((char *)tmp_env1, read1_fail, (char *)tmp_env2,
@@ -367,7 +359,7 @@ static int env_nand_load(void)
        }
 #endif
 
-       ret = readenv(CONFIG_ENV_OFFSET, (u_char *)buf);
+       ret = readenv(env_get_offset(CONFIG_ENV_OFFSET), (u_char *)buf);
        if (ret) {
                env_set_default("readenv() failed", 0);
                return -EIO;
index 9156142..feac296 100644 (file)
@@ -66,7 +66,7 @@ static int env_sata_save(void)
                return 1;
 
        printf("Writing to SATA(%d)...", env_sata);
-       if (write_env(sata, CONFIG_ENV_SIZE, CONFIG_ENV_OFFSET, (u_char *)env_new)) {
+       if (write_env(sata, CONFIG_ENV_SIZE, env_get_offset(CONFIG_ENV_OFFSET), (u_char *)env_new)) {
                puts("failed\n");
                return 1;
        }
@@ -106,7 +106,7 @@ static int env_sata_load(void)
                return -EIO;
        }
 
-       if (read_env(sata, CONFIG_ENV_SIZE, CONFIG_ENV_OFFSET, buf)) {
+       if (read_env(sata, CONFIG_ENV_SIZE, env_get_offset(CONFIG_ENV_OFFSET), buf)) {
                env_set_default(NULL, 0);
                return -EIO;
        }
index 88ec110..97aad53 100644 (file)
--- a/env/sf.c
+++ b/env/sf.c
@@ -86,9 +86,9 @@ static int env_sf_save(void)
 
        if (gd->env_valid == ENV_VALID) {
                env_new_offset = CONFIG_ENV_OFFSET_REDUND;
-               env_offset = CONFIG_ENV_OFFSET;
+               env_offset = env_get_offset(CONFIG_ENV_OFFSET);
        } else {
-               env_new_offset = CONFIG_ENV_OFFSET;
+               env_new_offset = env_get_offset(CONFIG_ENV_OFFSET);
                env_offset = CONFIG_ENV_OFFSET_REDUND;
        }
 
@@ -167,7 +167,7 @@ static int env_sf_load(void)
        if (ret)
                goto out;
 
-       read1_fail = spi_flash_read(env_flash, CONFIG_ENV_OFFSET,
+       read1_fail = spi_flash_read(env_flash, env_get_offset(CONFIG_ENV_OFFSET),
                                    CONFIG_ENV_SIZE, tmp_env1);
        read2_fail = spi_flash_read(env_flash, CONFIG_ENV_OFFSET_REDUND,
                                    CONFIG_ENV_SIZE, tmp_env2);
@@ -198,7 +198,7 @@ static int env_sf_save(void)
        /* Is the sector larger than the env (i.e. embedded) */
        if (CONFIG_ENV_SECT_SIZE > CONFIG_ENV_SIZE) {
                saved_size = CONFIG_ENV_SECT_SIZE - CONFIG_ENV_SIZE;
-               saved_offset = CONFIG_ENV_OFFSET + CONFIG_ENV_SIZE;
+               saved_offset = env_get_offset(CONFIG_ENV_OFFSET) + CONFIG_ENV_SIZE;
                saved_buffer = malloc(saved_size);
                if (!saved_buffer)
                        goto done;
@@ -216,13 +216,13 @@ static int env_sf_save(void)
        sector = DIV_ROUND_UP(CONFIG_ENV_SIZE, CONFIG_ENV_SECT_SIZE);
 
        puts("Erasing SPI flash...");
-       ret = spi_flash_erase(env_flash, CONFIG_ENV_OFFSET,
+       ret = spi_flash_erase(env_flash, env_get_offset(CONFIG_ENV_OFFSET),
                sector * CONFIG_ENV_SECT_SIZE);
        if (ret)
                goto done;
 
        puts("Writing to SPI flash...");
-       ret = spi_flash_write(env_flash, CONFIG_ENV_OFFSET,
+       ret = spi_flash_write(env_flash, env_get_offset(CONFIG_ENV_OFFSET),
                CONFIG_ENV_SIZE, &env_new);
        if (ret)
                goto done;
@@ -260,7 +260,7 @@ static int env_sf_load(void)
                goto out;
 
        ret = spi_flash_read(env_flash,
-               CONFIG_ENV_OFFSET, CONFIG_ENV_SIZE, buf);
+               env_get_offset(CONFIG_ENV_OFFSET), CONFIG_ENV_SIZE, buf);
        if (ret) {
                env_set_default("spi_flash_read() failed", 0);
                goto err_read;
index c15339a..8fb7888 100644 (file)
@@ -377,4 +377,11 @@ int env_get_char(int index);
  * This is used for those unfortunate archs with crappy toolchains
  */
 void env_reloc(void);
+
+#ifdef ENV_IS_EMBEDDED
+#define env_get_offset(x) x
+#else
+long long env_get_offset(long long defautl_offset);
+#endif
+
 #endif