env: enable accessing the environment in an EXT4 partition
authorJorge Ramirez-Ortiz <jorge.ramirez-ortiz@linaro.org>
Wed, 10 Jan 2018 10:33:48 +0000 (11:33 +0100)
committerTom Rini <trini@konsulko.com>
Mon, 15 Jan 2018 21:28:57 +0000 (16:28 -0500)
For example to store the environment in a file named "/uboot.env" in MMC
"0", where partition "1" contains the EXT4 filesystem, the following
configs should be added to the board's default config:

  CONFIG_ENV_IS_IN_EXT4=y
  CONFIG_ENV_EXT4_DEVICE_AND_PART="0:1"
  CONFIG_ENV_EXT4_FILE="/uboot.env"
  CONFIG_ENV_EXT4_INTERFACE="mmc"

Signed-off-by: Jorge Ramirez-Ortiz <jorge.ramirez-ortiz@linaro.org>
[trini: Fix some line over 80 chars issues]
Signed-off-by: Tom Rini <trini@konsulko.com>
env/Kconfig
env/env.c
env/ext4.c

index bef6e89bfc3cc670077c5fb4cd80cbf5e29974bb..692f8633b809d222868bb3c3057393ef69b058cb 100644 (file)
@@ -81,6 +81,13 @@ config ENV_IS_IN_FAT
          - CONFIG_FAT_WRITE:
          This must be enabled. Otherwise it cannot save the environment file.
 
+config ENV_IS_IN_EXT4
+       bool "Environment is in a EXT4 filesystem"
+       depends on !CHAIN_OF_TRUST
+       select EXT4_WRITE
+       help
+         Define this if you want to use the EXT4 file system for the environment.
+
 config ENV_IS_IN_FLASH
        bool "Environment in flash memory"
        depends on !CHAIN_OF_TRUST
@@ -396,6 +403,38 @@ config ENV_FAT_FILE
          It's a string of the FAT file name. This file use to store the
          environment.
 
+config ENV_EXT4_INTERFACE
+       string "Name of the block device for the environment"
+       depends on ENV_IS_IN_EXT4
+       help
+         Define this to a string that is the name of the block device.
+
+config ENV_EXT4_DEVICE_AND_PART
+       string "Device and partition for where to store the environemt in EXT4"
+       depends on ENV_IS_IN_EXT4
+       help
+         Define this to a string to specify the partition of the device. It can
+         be as following:
+
+           "D:P", "D:0", "D", "D:" or "D:auto" (D, P are integers. And P >= 1)
+              - "D:P": device D partition P. Error occurs if device D has no
+                       partition table.
+              - "D:0": device D.
+              - "D" or "D:": device D partition 1 if device D has partition
+                             table, or the whole device D if has no partition
+                             table.
+              - "D:auto": first partition in device D with bootable flag set.
+                          If none, first valid partition in device D. If no
+                          partition table then means device D.
+
+config ENV_EXT4_FILE
+       string "Name of the EXT4 file to use for the environemnt"
+       depends on ENV_IS_IN_EXT4
+       default "uboot.env"
+       help
+         It's a string of the EXT4 file name. This file use to store the
+         environment (explicit path to the file)
+
 if ARCH_SUNXI
 
 config ENV_OFFSET
index 76a5608628fc3c1b9c1be12bcffb5b6843a5f3dd..7455632fd365880e7c60c89fd6617173b697ae47 100644 (file)
--- a/env/env.c
+++ b/env/env.c
@@ -32,6 +32,8 @@ static enum env_location env_get_default_location(void)
                return ENVL_EEPROM;
        else if IS_ENABLED(CONFIG_ENV_IS_IN_FAT)
                return ENVL_FAT;
+       else if IS_ENABLED(CONFIG_ENV_IS_IN_EXT4)
+               return ENVL_EXT4;
        else if IS_ENABLED(CONFIG_ENV_IS_IN_FLASH)
                return ENVL_FLASH;
        else if IS_ENABLED(CONFIG_ENV_IS_IN_MMC)
index 65202213d3a80328f1117e5153c6178cc957ca8e..9cdf28e79f1a56399e2ca8f0982a4993a4ffc4cc 100644 (file)
@@ -46,9 +46,9 @@ static int env_ext4_save(void)
        if (err)
                return err;
 
-       part = blk_get_device_part_str(EXT4_ENV_INTERFACE,
-                                       EXT4_ENV_DEVICE_AND_PART,
-                                       &dev_desc, &info, 1);
+       part = blk_get_device_part_str(CONFIG_ENV_EXT4_INTERFACE,
+                                      CONFIG_ENV_EXT4_DEVICE_AND_PART,
+                                      &dev_desc, &info, 1);
        if (part < 0)
                return 1;
 
@@ -57,16 +57,19 @@ static int env_ext4_save(void)
 
        if (!ext4fs_mount(info.size)) {
                printf("\n** Unable to use %s %s for saveenv **\n",
-                      EXT4_ENV_INTERFACE, EXT4_ENV_DEVICE_AND_PART);
+                      CONFIG_ENV_EXT4_INTERFACE,
+                      CONFIG_ENV_EXT4_DEVICE_AND_PART);
                return 1;
        }
 
-       err = ext4fs_write(EXT4_ENV_FILE, (void *)&env_new, sizeof(env_t));
+       err = ext4fs_write(CONFIG_ENV_EXT4_FILE, (void *)&env_new,
+                          sizeof(env_t));
        ext4fs_close();
 
        if (err == -1) {
                printf("\n** Unable to write \"%s\" from %s%d:%d **\n",
-                       EXT4_ENV_FILE, EXT4_ENV_INTERFACE, dev, part);
+                       CONFIG_ENV_EXT4_FILE, CONFIG_ENV_EXT4_INTERFACE, dev,
+                       part);
                return 1;
        }
 
@@ -84,9 +87,9 @@ static int env_ext4_load(void)
        int err;
        loff_t off;
 
-       part = blk_get_device_part_str(EXT4_ENV_INTERFACE,
-                                       EXT4_ENV_DEVICE_AND_PART,
-                                       &dev_desc, &info, 1);
+       part = blk_get_device_part_str(CONFIG_ENV_EXT4_INTERFACE,
+                                      CONFIG_ENV_EXT4_DEVICE_AND_PART,
+                                      &dev_desc, &info, 1);
        if (part < 0)
                goto err_env_relocate;
 
@@ -95,16 +98,19 @@ static int env_ext4_load(void)
 
        if (!ext4fs_mount(info.size)) {
                printf("\n** Unable to use %s %s for loading the env **\n",
-                      EXT4_ENV_INTERFACE, EXT4_ENV_DEVICE_AND_PART);
+                      CONFIG_ENV_EXT4_INTERFACE,
+                      CONFIG_ENV_EXT4_DEVICE_AND_PART);
                goto err_env_relocate;
        }
 
-       err = ext4_read_file(EXT4_ENV_FILE, buf, 0, CONFIG_ENV_SIZE, &off);
+       err = ext4_read_file(CONFIG_ENV_EXT4_FILE, buf, 0, CONFIG_ENV_SIZE,
+                            &off);
        ext4fs_close();
 
        if (err == -1) {
                printf("\n** Unable to read \"%s\" from %s%d:%d **\n",
-                       EXT4_ENV_FILE, EXT4_ENV_INTERFACE, dev, part);
+                       CONFIG_ENV_EXT4_FILE, CONFIG_ENV_EXT4_INTERFACE, dev,
+                       part);
                goto err_env_relocate;
        }