Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save pamolloy/dba4cd75a4bb0afac95fb9fff24e4740 to your computer and use it in GitHub Desktop.
Save pamolloy/dba4cd75a4bb0afac95fb9fff24e4740 to your computer and use it in GitHub Desktop.
U-Boot patch to load a redundant environment from EEPROM
From e95f003a96096f7d8602ad2edaf1dd0bf4e27c45 Mon Sep 17 00:00:00 2001
From: Philip Molloy <philip@philipmolloy.com>
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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment