]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
env: mmc: Apply GPT only on eMMC user HW partition
authorMarek Vasut <marex@denx.de>
Thu, 9 Feb 2023 12:30:10 +0000 (13:30 +0100)
committerTom Rini <trini@konsulko.com>
Thu, 23 Feb 2023 18:32:20 +0000 (13:32 -0500)
Apply the GPT U-Boot environment GUID type look up only on eMMC user
HW partition, do not apply the look up on eMMC boot HW partitions as
mmc_offset_try_partition() assumes either SD partitions or eMMC user
HW partition.

This fixes environment operation on systems where CONFIG_SYS_MMC_ENV_PART
is non-zero and CONFIG_SYS_REDUNDAND_ENVIRONMENT is set.

Fixes: 80105d8fd52 ("env: mmc: select GPT env partition by type guid")
Signed-off-by: Marek Vasut <marex@denx.de>
Reviewed-by: Tom Rini <trini@konsulko.com>
env/mmc.c

index 5b01f657a7a14a76cf206ec3309f49aa830c5775..7a5836ad66c693e300b71e0bc13d502a71e4cd76 100644 (file)
--- a/env/mmc.c
+++ b/env/mmc.c
@@ -94,7 +94,7 @@ static inline int mmc_offset_try_partition(const char *str, int copy, s64 *val)
        return 0;
 }
 
-static inline s64 mmc_offset(int copy)
+static inline s64 mmc_offset(struct mmc *mmc, int copy)
 {
        const struct {
                const char *offset_redund;
@@ -108,8 +108,12 @@ static inline s64 mmc_offset(int copy)
        s64 val = 0, defvalue;
        const char *propname;
        const char *str;
+       int hwpart = 0;
        int err;
 
+       if (IS_ENABLED(CONFIG_SYS_MMC_ENV_PART))
+               hwpart = mmc_get_env_part(mmc);
+
        /* look for the partition in mmc CONFIG_SYS_MMC_ENV_DEV */
        str = ofnode_conf_read_str(dt_prop.partition);
        if (str) {
@@ -121,7 +125,7 @@ static inline s64 mmc_offset(int copy)
        }
 
        /* try the GPT partition with "U-Boot ENV" TYPE GUID */
-       if (IS_ENABLED(CONFIG_PARTITION_TYPE_GUID)) {
+       if (IS_ENABLED(CONFIG_PARTITION_TYPE_GUID) && hwpart == 0) {
                err = mmc_offset_try_partition(NULL, copy, &val);
                if (!err)
                        return val;
@@ -138,7 +142,7 @@ static inline s64 mmc_offset(int copy)
        return ofnode_conf_read_int(propname, defvalue);
 }
 #else
-static inline s64 mmc_offset(int copy)
+static inline s64 mmc_offset(struct mmc *mmc, int copy)
 {
        s64 offset = ENV_MMC_OFFSET;
 
@@ -151,7 +155,7 @@ static inline s64 mmc_offset(int copy)
 
 __weak int mmc_get_env_addr(struct mmc *mmc, int copy, u32 *env_addr)
 {
-       s64 offset = mmc_offset(copy);
+       s64 offset = mmc_offset(mmc, copy);
 
        if (offset == ENV_MMC_INVALID_OFFSET) {
                printf("Invalid ENV offset in MMC, copy=%d\n", copy);