Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Select an option

  • Save pamolloy/dba4cd75a4bb0afac95fb9fff24e4740 to your computer and use it in GitHub Desktop.

Select an option

Save pamolloy/dba4cd75a4bb0afac95fb9fff24e4740 to your computer and use it in GitHub Desktop.

Revisions

  1. pamolloy created this gist Aug 29, 2019.
    161 changes: 161 additions & 0 deletions 0001-Load-a-redundant-environment-from-EEPROM.patch
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,161 @@
    From e95f003a96096f7d8602ad2edaf1dd0bf4e27c45 Mon Sep 17 00:00:00 2001
    From: Philip Molloy <[email protected]>
    Date: Wed, 28 Aug 2019 21:05:11 -0400
    Subject: [PATCH] Load a redundant environment from EEPROM

    ---
    env/eeprom.c | 128 +++++++++++++--------------------------------------
    1 file changed, 31 insertions(+), 97 deletions(-)

    diff --git a/env/eeprom.c b/env/eeprom.c
    index ac2689cc14..98ba672202 100644
    --- a/env/eeprom.c
    +++ b/env/eeprom.c
    @@ -78,114 +78,48 @@ int env_eeprom_get_char(int index)
    return c;
    }

    +#ifdef CONFIG_ENV_OFFSET_REDUND
    static int env_eeprom_load(void)
    {
    - char buf_env[CONFIG_ENV_SIZE];
    - unsigned int off = CONFIG_ENV_OFFSET;
    + int read1_ret, read2_ret;
    + // TODO(PM): Dynamically allocate using memalign()
    + char buf1[CONFIG_ENV_SIZE];
    + char buf2[CONFIG_ENV_SIZE];

    -#ifdef CONFIG_ENV_OFFSET_REDUND
    - ulong len, crc[2], crc_tmp;
    - unsigned int off_env[2];
    - uchar rdbuf[64], flags[2];
    - int i, crc_ok[2] = {0, 0};
    -
    - eeprom_init(-1); /* prepare for EEPROM read/write */
    -
    - off_env[0] = CONFIG_ENV_OFFSET;
    - off_env[1] = CONFIG_ENV_OFFSET_REDUND;
    -
    - for (i = 0; i < 2; i++) {
    - /* read CRC */
    - eeprom_bus_read(CONFIG_SYS_DEF_EEPROM_ADDR,
    - off_env[i] + offsetof(env_t, crc),
    - (uchar *)&crc[i], sizeof(ulong));
    - /* read FLAGS */
    - eeprom_bus_read(CONFIG_SYS_DEF_EEPROM_ADDR,
    - off_env[i] + offsetof(env_t, flags),
    - (uchar *)&flags[i], sizeof(uchar));
    -
    - crc_tmp = 0;
    - len = ENV_SIZE;
    - off = off_env[i] + offsetof(env_t, data);
    - while (len > 0) {
    - int n = (len > sizeof(rdbuf)) ? sizeof(rdbuf) : len;
    -
    - eeprom_bus_read(CONFIG_SYS_DEF_EEPROM_ADDR, off,
    - rdbuf, n);
    -
    - crc_tmp = crc32(crc_tmp, rdbuf, n);
    - len -= n;
    - off += n;
    - }
    -
    - if (crc_tmp == crc[i])
    - crc_ok[i] = 1;
    - }
    + eeprom_init(-1);

    - if (!crc_ok[0] && !crc_ok[1]) {
    - gd->env_addr = 0;
    - gd->env_valid = ENV_INVALID;
    - } else if (crc_ok[0] && !crc_ok[1]) {
    - gd->env_valid = ENV_VALID;
    - } else if (!crc_ok[0] && crc_ok[1]) {
    - gd->env_valid = ENV_REDUND;
    - } else {
    - /* both ok - check serial */
    - if (flags[0] == ACTIVE_FLAG && flags[1] == OBSOLETE_FLAG)
    - gd->env_valid = ENV_VALID;
    - else if (flags[0] == OBSOLETE_FLAG && flags[1] == ACTIVE_FLAG)
    - gd->env_valid = ENV_REDUND;
    - else if (flags[0] == 0xFF && flags[1] == 0)
    - gd->env_valid = ENV_REDUND;
    - else if (flags[1] == 0xFF && flags[0] == 0)
    - gd->env_valid = ENV_VALID;
    - else /* flags are equal - almost impossible */
    - gd->env_valid = ENV_VALID;
    - }
    + read1_ret = eeprom_bus_read(CONFIG_SYS_DEF_EEPROM_ADDR,
    + CONFIG_ENV_OFFSET,
    + (uchar *)&buf1,
    + CONFIG_ENV_SIZE);

    -#else /* CONFIG_ENV_OFFSET_REDUND */
    - ulong crc, len, new;
    - uchar rdbuf[64];
    -
    - eeprom_init(-1); /* prepare for EEPROM read/write */
    -
    - /* read old CRC */
    - eeprom_bus_read(CONFIG_SYS_DEF_EEPROM_ADDR,
    - CONFIG_ENV_OFFSET + offsetof(env_t, crc),
    - (uchar *)&crc, sizeof(ulong));
    -
    - new = 0;
    - len = ENV_SIZE;
    - off = offsetof(env_t, data);
    - while (len > 0) {
    - int n = (len > sizeof(rdbuf)) ? sizeof(rdbuf) : len;
    -
    - eeprom_bus_read(CONFIG_SYS_DEF_EEPROM_ADDR,
    - CONFIG_ENV_OFFSET + off, rdbuf, n);
    - new = crc32(new, rdbuf, n);
    - len -= n;
    - off += n;
    - }
    + read2_ret = eeprom_bus_read(CONFIG_SYS_DEF_EEPROM_ADDR,
    + CONFIG_ENV_OFFSET_REDUND,
    + (uchar *)&buf2,
    + CONFIG_ENV_SIZE);

    - if (crc == new) {
    - gd->env_valid = ENV_VALID;
    - } else {
    - gd->env_valid = ENV_INVALID;
    - }
    -#endif /* CONFIG_ENV_OFFSET_REDUND */
    + return env_import_redund(buf1, read1_ret, buf2, read2_ret);
    +}
    +#else
    +static int env_eeprom_load(void)
    +{
    + int ret;
    + char buf[CONFIG_ENV_SIZE];

    - off = CONFIG_ENV_OFFSET;
    -#ifdef CONFIG_ENV_OFFSET_REDUND
    - if (gd->env_valid == ENV_REDUND)
    - off = CONFIG_ENV_OFFSET_REDUND;
    -#endif
    + eeprom_init(-1);

    - eeprom_bus_read(CONFIG_SYS_DEF_EEPROM_ADDR,
    - off, (uchar *)buf_env, CONFIG_ENV_SIZE);
    + ret = eeprom_bus_read(CONFIG_SYS_DEF_EEPROM_ADDR,
    + CONFIG_ENV_OFFSET,
    + (uchar *)&buf,
    + CONFIG_ENV_SIZE);
    + // TODO(PM): Handle return value

    - return env_import(buf_env, 1);
    + return env_import(buf, 1);
    }
    +#endif /* CONFIG_ENV_OFFSET_REDUND */
    +

    +// TODO(PM): Review this for changes since env/sf.c has two implementations
    static int env_eeprom_save(void)
    {
    env_t env_new;
    --
    2.17.2