Created
August 29, 2019 01:09
-
-
Save pamolloy/dba4cd75a4bb0afac95fb9fff24e4740 to your computer and use it in GitHub Desktop.
U-Boot patch to load a redundant environment from EEPROM
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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