Merge tag 'u-boot-amlogic-20211007' of https://source.denx.de/u-boot/custodians/u...
[platform/kernel/u-boot.git] / env / eeprom.c
index ac6b30f..253bdf1 100644 (file)
@@ -1,17 +1,20 @@
+// SPDX-License-Identifier: GPL-2.0+
 /*
  * (C) Copyright 2000-2010
  * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
  *
  * (C) Copyright 2001 Sysgo Real-Time Solutions, GmbH <www.elinos.com>
  * Andreas Heppel <aheppel@sysgo.de>
- *
- * SPDX-License-Identifier:    GPL-2.0+
  */
 
 #include <common.h>
 #include <command.h>
-#include <environment.h>
+#include <eeprom.h>
+#include <env.h>
+#include <env_internal.h>
+#include <asm/global_data.h>
 #include <linux/stddef.h>
+#include <u-boot/crc.h>
 #if defined(CONFIG_I2C_ENV_EEPROM_BUS)
 #include <i2c.h>
 #endif
 
 DECLARE_GLOBAL_DATA_PTR;
 
-env_t *env_ptr;
-
-char *env_name_spec = "EEPROM";
-
 static int eeprom_bus_read(unsigned dev_addr, unsigned offset,
                           uchar *buffer, unsigned cnt)
 {
@@ -65,7 +64,10 @@ static int eeprom_bus_write(unsigned dev_addr, unsigned offset,
        return rcode;
 }
 
-uchar env_get_char_spec(int index)
+/** Call this function from overridden env_get_char_spec() if you need
+ * this functionality.
+ */
+int env_eeprom_get_char(int index)
 {
        uchar c;
        unsigned int off = CONFIG_ENV_OFFSET;
@@ -74,13 +76,13 @@ uchar env_get_char_spec(int index)
        if (gd->env_valid == ENV_REDUND)
                off = CONFIG_ENV_OFFSET_REDUND;
 #endif
-       eeprom_bus_read(CONFIG_SYS_DEF_EEPROM_ADDR,
+       eeprom_bus_read(CONFIG_SYS_I2C_EEPROM_ADDR,
                        off + index + offsetof(env_t, data), &c, 1);
 
        return c;
 }
 
-void env_relocate_spec(void)
+static int env_eeprom_load(void)
 {
        char buf_env[CONFIG_ENV_SIZE];
        unsigned int off = CONFIG_ENV_OFFSET;
@@ -98,11 +100,11 @@ void env_relocate_spec(void)
 
        for (i = 0; i < 2; i++) {
                /* read CRC */
-               eeprom_bus_read(CONFIG_SYS_DEF_EEPROM_ADDR,
+               eeprom_bus_read(CONFIG_SYS_I2C_EEPROM_ADDR,
                                off_env[i] + offsetof(env_t, crc),
                                (uchar *)&crc[i], sizeof(ulong));
                /* read FLAGS */
-               eeprom_bus_read(CONFIG_SYS_DEF_EEPROM_ADDR,
+               eeprom_bus_read(CONFIG_SYS_I2C_EEPROM_ADDR,
                                off_env[i] + offsetof(env_t, flags),
                                (uchar *)&flags[i], sizeof(uchar));
 
@@ -112,7 +114,7 @@ void env_relocate_spec(void)
                while (len > 0) {
                        int n = (len > sizeof(rdbuf)) ? sizeof(rdbuf) : len;
 
-                       eeprom_bus_read(CONFIG_SYS_DEF_EEPROM_ADDR, off,
+                       eeprom_bus_read(CONFIG_SYS_I2C_EEPROM_ADDR, off,
                                        rdbuf, n);
 
                        crc_tmp = crc32(crc_tmp, rdbuf, n);
@@ -126,16 +128,18 @@ void env_relocate_spec(void)
 
        if (!crc_ok[0] && !crc_ok[1]) {
                gd->env_addr    = 0;
-               gd->env_valid   = 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)
+               if (flags[0] == ENV_REDUND_ACTIVE &&
+                   flags[1] == ENV_REDUND_OBSOLETE)
                        gd->env_valid = ENV_VALID;
-               else if (flags[0] == OBSOLETE_FLAG && flags[1] == ACTIVE_FLAG)
+               else if (flags[0] == ENV_REDUND_OBSOLETE &&
+                        flags[1] == ENV_REDUND_ACTIVE)
                        gd->env_valid = ENV_REDUND;
                else if (flags[0] == 0xFF && flags[1] == 0)
                        gd->env_valid = ENV_REDUND;
@@ -152,7 +156,7 @@ void env_relocate_spec(void)
        eeprom_init(-1);        /* prepare for EEPROM read/write */
 
        /* read old CRC */
-       eeprom_bus_read(CONFIG_SYS_DEF_EEPROM_ADDR,
+       eeprom_bus_read(CONFIG_SYS_I2C_EEPROM_ADDR,
                        CONFIG_ENV_OFFSET + offsetof(env_t, crc),
                        (uchar *)&crc, sizeof(ulong));
 
@@ -162,7 +166,7 @@ void env_relocate_spec(void)
        while (len > 0) {
                int n = (len > sizeof(rdbuf)) ? sizeof(rdbuf) : len;
 
-               eeprom_bus_read(CONFIG_SYS_DEF_EEPROM_ADDR,
+               eeprom_bus_read(CONFIG_SYS_I2C_EEPROM_ADDR,
                                CONFIG_ENV_OFFSET + off, rdbuf, n);
                new = crc32(new, rdbuf, n);
                len -= n;
@@ -170,9 +174,9 @@ void env_relocate_spec(void)
        }
 
        if (crc == new) {
-               gd->env_valid   = ENV_VALID;
+               gd->env_valid = ENV_VALID;
        } else {
-               gd->env_valid   = 0;
+               gd->env_valid = ENV_INVALID;
        }
 #endif /* CONFIG_ENV_OFFSET_REDUND */
 
@@ -182,24 +186,22 @@ void env_relocate_spec(void)
                off = CONFIG_ENV_OFFSET_REDUND;
 #endif
 
-       eeprom_bus_read(CONFIG_SYS_DEF_EEPROM_ADDR,
+       eeprom_bus_read(CONFIG_SYS_I2C_EEPROM_ADDR,
                off, (uchar *)buf_env, CONFIG_ENV_SIZE);
 
-       env_import(buf_env, 1);
+       return env_import(buf_env, 1, H_EXTERNAL);
 }
 
-int saveenv(void)
+static int env_eeprom_save(void)
 {
        env_t   env_new;
        int     rc;
        unsigned int off        = CONFIG_ENV_OFFSET;
 #ifdef CONFIG_ENV_OFFSET_REDUND
        unsigned int off_red    = CONFIG_ENV_OFFSET_REDUND;
-       char flag_obsolete      = OBSOLETE_FLAG;
+       char flag_obsolete      = ENV_REDUND_OBSOLETE;
 #endif
 
-       BUG_ON(env_ptr != NULL);
-
        rc = env_export(&env_new);
        if (rc)
                return rc;
@@ -210,15 +212,15 @@ int saveenv(void)
                off_red = CONFIG_ENV_OFFSET;
        }
 
-       env_new.flags = ACTIVE_FLAG;
+       env_new.flags = ENV_REDUND_ACTIVE;
 #endif
 
-       rc = eeprom_bus_write(CONFIG_SYS_DEF_EEPROM_ADDR,
+       rc = eeprom_bus_write(CONFIG_SYS_I2C_EEPROM_ADDR,
                              off, (uchar *)&env_new, CONFIG_ENV_SIZE);
 
 #ifdef CONFIG_ENV_OFFSET_REDUND
        if (rc == 0) {
-               eeprom_bus_write(CONFIG_SYS_DEF_EEPROM_ADDR,
+               eeprom_bus_write(CONFIG_SYS_I2C_EEPROM_ADDR,
                                 off_red + offsetof(env_t, flags),
                                 (uchar *)&flag_obsolete, 1);
 
@@ -231,15 +233,9 @@ int saveenv(void)
        return rc;
 }
 
-/*
- * Initialize Environment use
- *
- * We are still running from ROM, so data use is limited.
- * Use a (moderately small) buffer on the stack
- */
-int env_init(void)
-{
-       gd->env_addr = (ulong)&default_environment[0];
-       gd->env_valid = ENV_VALID;
-       return 0;
-}
+U_BOOT_ENV_LOCATION(eeprom) = {
+       .location       = ENVL_EEPROM,
+       ENV_NAME("EEPROM")
+       .load           = env_eeprom_load,
+       .save           = env_save_ptr(env_eeprom_save),
+};