[PATCH v3 3/5] env: scsi: Add support for partition type GUID based environment

David Lechner dlechner at baylibre.com
Tue Apr 21 00:35:39 CEST 2026


On 4/19/26 5:24 AM, Balaji Selvanathan wrote:
> Add support for locating SCSI environment partition using GPT type
> GUID instead of unique UUID. This enables the saveenv command to
> work with partitions identified by their type rather than unique
> identifiers, providing flexibility for systems where partition
> UUIDs may vary across devices but types remain constant.
> 
> Introduce a Kconfig choice statement to select between three partition
> lookup methods. The choice provides mutually exclusive options:
> ENV_SCSI_PART_USE_UUID (default), ENV_SCSI_PART_USE_TYPE_GUID, and
> ENV_SCSI_PART_USE_HW. The corresponding string configs depend on their
> respective selection method, creating a clear configuration structure.
> 
> Introduce CONFIG_ENV_SCSI_PART_TYPE_GUID configuration option that
> allows specifying a partition type GUID for environment storage.
> When SCSI_ENV_PART_USE_TYPE_GUID is enabled, the environment subsystem
> uses the type GUID based lookup method via
> scsi_get_blk_by_type_guid() to find the first matching partition.
> 
> Refactor env/scsi.c to use compile-time preprocessor conditionals
> instead of runtime string checks. Replace the previous logic that
> checked if CONFIG_ENV_SCSI_PART_UUID was empty with explicit #if/#elif
> branches for each method.

Might be a bit cleaner to split the refactor and adding the new option
into two patches. This is quite a bit going on in one patch.

> 
> Elevate hardware partition selection from an implicit fallback to an
> explicit choice (ENV_SCSI_PART_USE_HW), improving configuration clarity.
> Move ENV_SCSI_HW_PARTITION to depend on this new option.
> 
> Signed-off-by: Balaji Selvanathan <balaji.selvanathan at oss.qualcomm.com>
> ---
> Changes in v3:
> - Introduce a new choice config: ENV_SCSI_PART_USE_HW for
>   ENV_SCSI_HW_PARTITION
> - Refactor env_scsi_get_part and env_scsi_load functions based
>   on the choice configs
> 
> Changes in v2:
> - Introduce a Kconfig choice config to select between UUID-based
> and type GUID-based partition lookup methods.
> ---
>  env/Kconfig | 51 +++++++++++++++++++++++++++++++++++++++++++--------
>  env/scsi.c  | 45 +++++++++++++++++++++++++++------------------
>  2 files changed, 70 insertions(+), 26 deletions(-)
> 
> diff --git a/env/Kconfig b/env/Kconfig
> index 7abd82ab6f3..d5d956cb4ce 100644
> --- a/env/Kconfig
> +++ b/env/Kconfig
> @@ -780,10 +780,51 @@ config ENV_MMC_USE_DT
>  	  The 2 defines CONFIG_ENV_OFFSET, CONFIG_ENV_OFFSET_REDUND
>  	  are not used as fallback.
>  

We should update the help of `config ENV_IS_IN_SCSI` as well since it
mentions these options below.

> +choice
> +	prompt "SCSI partition selection method"
> +	depends on ENV_IS_IN_SCSI
> +	default ENV_SCSI_PART_USE_UUID
> +	help
> +	  Select the method to identify the SCSI partition for environment storage.
> +

I wish I would have thought of using `choice` in the recent changes I
did. It is much cleaner to explicitly select which one you want. :-)

> +config ENV_SCSI_PART_USE_UUID
> +	bool "Use partition UUID"
> +	help
> +	  Use the partition's unique UUID to identify the SCSI partition
> +	  for environment storage.
> +
> +config ENV_SCSI_PART_USE_TYPE_GUID
> +	bool "Use partition type GUID"
> +	help
> +	  Use the partition type GUID to identify the SCSI partition
> +	  for environment storage. The first partition matching the
> +	  specified type GUID will be used.
> +
> +config ENV_SCSI_PART_USE_HW
> +	bool "Use hardware partition number"
> +	help
> +	  Use the hardware device number to identify the SCSI device
> +	  for environment storage.
> +
> +endchoice
> +
> +config ENV_SCSI_PART_UUID
> +	string "SCSI partition UUID for saving environment"
> +	depends on ENV_SCSI_PART_USE_UUID
> +	help
> +	  UUID of the SCSI partition that you want to store the environment in.
> +
> +config ENV_SCSI_PART_TYPE_GUID
> +	string "SCSI partition type GUID for saving environment"
> +	depends on ENV_SCSI_PART_USE_TYPE_GUID
> +	help
> +	  Type GUID of the SCSI partition to store the environment in.
> +	  Uses the first partition matching this type GUID.
> +
>  config ENV_SCSI_HW_PARTITION
>  	string "SCSI hardware partition number"
> -	depends on ENV_IS_IN_SCSI
> -	default 0
> +	depends on ENV_SCSI_PART_USE_HW
> +	default "0"

Fixing the quotes here is technically an unrelated change, so could be
a patch on it's own as well.

>  	help
>  	  SCSI hardware partition device number on the platform where the
>  	  environment is stored.  Note that this is not related to any software
> @@ -791,12 +832,6 @@ config ENV_SCSI_HW_PARTITION
>  	  partition 0 or the first boot partition, which is 1 or some other defined
>  	  partition.
>  
> -config ENV_SCSI_PART_UUID
> -	string "SCSI partition UUID for saving environment"
> -	depends on ENV_IS_IN_SCSI
> -	help
> -	  UUID of the SCSI partition that you want to store the environment in.
> -
>  config ENV_USE_DEFAULT_ENV_TEXT_FILE
>  	bool "Create default environment from file"
>  	depends on !COMPILE_TEST
> diff --git a/env/scsi.c b/env/scsi.c
> index 91a6c430302..abb8b0a1dfd 100644
> --- a/env/scsi.c
> +++ b/env/scsi.c
> @@ -41,14 +41,19 @@ static inline struct env_scsi_info *env_scsi_get_part(void)
>  		is_scsi_scanned = true;
>  	}
>  
> -	if (CONFIG_ENV_SCSI_PART_UUID[0] == '\0') {
> -		if (blk_get_device_part_str("scsi", CONFIG_ENV_SCSI_HW_PARTITION,
> -					    &ep->blk, &ep->part, true))
> -			return NULL;
> -	} else {
> -		if (scsi_get_blk_by_uuid(CONFIG_ENV_SCSI_PART_UUID, &ep->blk, &ep->part))
> -			return NULL;
> -	}
> +#if defined(CONFIG_ENV_SCSI_PART_USE_TYPE_GUID)
> +	if (scsi_get_blk_by_type_guid(CONFIG_ENV_SCSI_PART_TYPE_GUID, &ep->blk, &ep->part))
> +		return NULL;
> +
> +#elif defined(CONFIG_ENV_SCSI_PART_USE_UUID)
> +	if (scsi_get_blk_by_uuid(CONFIG_ENV_SCSI_PART_UUID, &ep->blk, &ep->part))
> +		return NULL;
> +
> +#elif defined(CONFIG_ENV_SCSI_PART_USE_HW)
> +	if (blk_get_device_part_str("scsi", CONFIG_ENV_SCSI_HW_PARTITION,
> +				    &ep->blk, &ep->part, true))
> +		return NULL;
> +#endif
>  
>  	ep->count = CONFIG_ENV_SIZE / ep->part.blksz;
>  
> @@ -95,20 +100,24 @@ static int env_scsi_load(void)
>  	int ret;
>  
>  	if (!ep) {
> -		if (CONFIG_ENV_SCSI_PART_UUID[0] == '\0')
> -			env_set_default("SCSI partition " CONFIG_ENV_SCSI_HW_PARTITION " not found", 0);
> -		else
> -			env_set_default(CONFIG_ENV_SCSI_PART_UUID " partition not found", 0);
> -
> +#if defined(CONFIG_ENV_SCSI_PART_USE_TYPE_GUID)
> +		env_set_default(CONFIG_ENV_SCSI_PART_TYPE_GUID " partition not found", 0);

It could be a bit more clear to have a different message for
this one. e.g. "partition type " CONFIG_ENV_SCSI_PART_TYPE_GUID " not found".

> +#elif defined(CONFIG_ENV_SCSI_PART_USE_UUID)
> +		env_set_default(CONFIG_ENV_SCSI_PART_UUID " partition not found", 0);
> +#elif defined(CONFIG_ENV_SCSI_PART_USE_HW)
> +		env_set_default("SCSI partition " CONFIG_ENV_SCSI_HW_PARTITION " not found", 0);
> +#endif
>  		return -ENOENT;
>  	}
>  
>  	if (blk_dread(ep->blk, ep->part.start, ep->count, &envbuf) != ep->count) {
> -		if (CONFIG_ENV_SCSI_PART_UUID[0] == '\0')
> -			env_set_default("SCSI partition " CONFIG_ENV_SCSI_HW_PARTITION " read failed", 0);
> -		else
> -			env_set_default(CONFIG_ENV_SCSI_PART_UUID " partition read failed", 0);
> -
> +#if defined(CONFIG_ENV_SCSI_PART_USE_TYPE_GUID)
> +		env_set_default(CONFIG_ENV_SCSI_PART_TYPE_GUID " partition read failed", 0);

similar as above

> +#elif defined(CONFIG_ENV_SCSI_PART_USE_UUID)
> +		env_set_default(CONFIG_ENV_SCSI_PART_UUID " partition read failed", 0);
> +#elif defined(CONFIG_ENV_SCSI_PART_USE_HW)
> +		env_set_default("SCSI partition " CONFIG_ENV_SCSI_HW_PARTITION " read failed", 0);
> +#endif
>  		return -EIO;
>  	}
>  
> 



More information about the U-Boot mailing list