env: scsi: add CONFIG_ENV_SCSI_HW_PARTITION

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@baylibre.com>
This commit is contained in:
David Lechner
2026-04-08 11:07:07 -06:00
committed by Tom Rini
parent b382cd0973
commit 83223d4f86
2 changed files with 29 additions and 4 deletions
Vendored
+11
View File
@@ -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
Vendored
+18 -4
View File
@@ -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;
}