[PATCH 5/6] env: scsi: add CONFIG_ENV_SCSI_HW_PARTITION

David Lechner dlechner at baylibre.com
Thu Mar 26 23:59:27 CET 2026


Add CONFIG_ENV_SCSI_HW_PARTITION and supporting code to allow loading
the environment directly from a SCSI device without a partition table.
Some platforms store the environment directly on the SCSI device without
a way to look it up by partition UUID.

Signed-off-by: David Lechner <dlechner at baylibre.com>
---
 env/Kconfig | 11 +++++++++++
 env/scsi.c  | 22 ++++++++++++++++++----
 2 files changed, 29 insertions(+), 4 deletions(-)

diff --git a/env/Kconfig b/env/Kconfig
index 5824f762870..ffaf16c581c 100644
--- a/env/Kconfig
+++ b/env/Kconfig
@@ -762,6 +762,17 @@ config ENV_MMC_USE_DT
 	  The 2 defines CONFIG_ENV_OFFSET, CONFIG_ENV_OFFSET_REDUND
 	  are not used as fallback.
 
+config ENV_SCSI_HW_PARTITION
+	string "SCSI hardware partition number"
+	depends on ENV_IS_IN_SCSI
+	default 0
+	help
+	  SCSI hardware partition device number on the platform where the
+	  environment is stored.  Note that this is not related to any software
+	  defined partition table but instead if we are in the user area, which is
+	  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
diff --git a/env/scsi.c b/env/scsi.c
index 1787dcca92a..f4986353da5 100644
--- a/env/scsi.c
+++ b/env/scsi.c
@@ -41,8 +41,14 @@ static inline struct env_scsi_info *env_scsi_get_part(void)
 		is_scsi_scanned = true;
 	}
 
-	if (scsi_get_blk_by_uuid(CONFIG_ENV_SCSI_PART_UUID, &ep->blk, &ep->part))
-		return NULL;
+	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;
+	}
 
 	ep->count = CONFIG_ENV_SIZE / ep->part.blksz;
 
@@ -89,12 +95,20 @@ static int env_scsi_load(void)
 	int ret;
 
 	if (!ep) {
-		env_set_default(CONFIG_ENV_SCSI_PART_UUID " partition not found", 0);
+		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);
+
 		return -ENOENT;
 	}
 
 	if (blk_dread(ep->blk, ep->part.start, ep->count, &envbuf) != ep->count) {
-		env_set_default(CONFIG_ENV_SCSI_PART_UUID " partition read failed", 0);
+		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);
+
 		return -EIO;
 	}
 

-- 
2.43.0



More information about the U-Boot mailing list