diff options
| author | Tom Rini <[email protected]> | 2026-04-08 11:07:19 -0600 |
|---|---|---|
| committer | Tom Rini <[email protected]> | 2026-04-08 11:07:19 -0600 |
| commit | f0000b4a57e9edf8ff8454b9056d767466dff57f (patch) | |
| tree | 19aae06c807579eeb93e5aae3d89fbfb598b66eb | |
| parent | 8191d234571e39a49490ab3301cea0106a4ebeb3 (diff) | |
| parent | d72c2b63da5c004bb41855577d4fd783598b004a (diff) | |
Merge patch series "env: scsi: support SCSI env without partition UUID"
David Lechner <[email protected]> says:
This is a series adding support for reading U-Boot env directly from
SCSI devices that do not have a partition table, similar to how we can
already do this for MMC devices.
The motivation behind this is that MediaTek's BSP is already using the
same disk images for both MMC and UFS devices, so we need to be able to
read the env from SCSI devices without requiring a partition UUID.
The series starts with cleaning up a few oddities we noticed in the
existing code. Then some refactoring so that the env code manages
calling scsi_scan() so that we don't have to duplicate that for the
new code path. Then finally, the last few patches add and document the
new functionality.
Link: https://lore.kernel.org/r/[email protected]
| -rw-r--r-- | configs/qcom_qcs9100_defconfig | 2 | ||||
| -rw-r--r-- | drivers/scsi/scsi-uclass.c | 8 | ||||
| -rw-r--r-- | env/Kconfig | 30 | ||||
| -rw-r--r-- | env/scsi.c | 28 | ||||
| -rw-r--r-- | include/scsi.h | 5 |
5 files changed, 60 insertions, 13 deletions
diff --git a/configs/qcom_qcs9100_defconfig b/configs/qcom_qcs9100_defconfig index 371448b8b1b..082106157bb 100644 --- a/configs/qcom_qcs9100_defconfig +++ b/configs/qcom_qcs9100_defconfig @@ -11,6 +11,6 @@ CONFIG_REMAKE_ELF=y CONFIG_FASTBOOT_BUF_ADDR=0xdb300000 CONFIG_DEFAULT_DEVICE_TREE="qcom/qcs9100-ride-r3" CONFIG_ENV_IS_IN_SCSI=y -CONFIG_SCSI_ENV_PART_UUID="71cb9cd0-acf1-b6cb-ad91-be9572fe11a9" +CONFIG_ENV_SCSI_PART_UUID="71cb9cd0-acf1-b6cb-ad91-be9572fe11a9" # CONFIG_ENV_IS_DEFAULT is not set # CONFIG_ENV_IS_NOWHERE is not set diff --git a/drivers/scsi/scsi-uclass.c b/drivers/scsi/scsi-uclass.c index 3eb6069649f..39b4c7476d4 100644 --- a/drivers/scsi/scsi-uclass.c +++ b/drivers/scsi/scsi-uclass.c @@ -29,15 +29,9 @@ int scsi_get_blk_by_uuid(const char *uuid, struct blk_desc **blk_desc_ptr, struct disk_partition *part_info_ptr) { - static int is_scsi_scanned; struct blk_desc *blk; int i, ret; - if (!is_scsi_scanned) { - scsi_scan(false /* no verbose */); - is_scsi_scanned = 1; - } - for (i = 0; i < blk_find_max_devnum(UCLASS_SCSI) + 1; i++) { ret = blk_get_desc(UCLASS_SCSI, i, &blk); if (ret) @@ -50,7 +44,7 @@ int scsi_get_blk_by_uuid(const char *uuid, } } - return -1; + return -ENODEV; } int scsi_bus_reset(struct udevice *dev) diff --git a/env/Kconfig b/env/Kconfig index 532adf884da..7abd82ab6f3 100644 --- a/env/Kconfig +++ b/env/Kconfig @@ -294,6 +294,23 @@ config ENV_IS_IN_SCSI Define this if you have an SCSI device which you want to use for the environment. + - CONFIG_ENV_SIZE: + + The size of the partition where the environment is stored in bytes. Must + be a multiple of the partition block size. + + - CONFIG_ENV_SCSI_HW_PARTITION: + + Specifies which SCSI partition the environment is stored in. If not + set, defaults to partition 0, the user area. Common values might be + 1 (first SCSI boot partition), 2 (second SCSI boot partition). Ignored + if CONFIG_ENV_SCSI_PART_UUID is set to non-empty string. + + - CONFIG_ENV_SCSI_PART_UUID: + + UUID of the SCSI partition where the environment is stored. + + config ENV_RANGE hex "Length of the region in which the environment can be written" depends on ENV_IS_IN_NAND @@ -763,7 +780,18 @@ config ENV_MMC_USE_DT The 2 defines CONFIG_ENV_OFFSET, CONFIG_ENV_OFFSET_REDUND are not used as fallback. -config SCSI_ENV_PART_UUID +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 help diff --git a/env/scsi.c b/env/scsi.c index e56891a9899..91a6c430302 100644 --- a/env/scsi.c +++ b/env/scsi.c @@ -33,10 +33,22 @@ static struct env_scsi_info env_part; static inline struct env_scsi_info *env_scsi_get_part(void) { + static bool is_scsi_scanned; struct env_scsi_info *ep = &env_part; - if (scsi_get_blk_by_uuid(CONFIG_SCSI_ENV_PART_UUID, &ep->blk, &ep->part)) - return NULL; + if (!is_scsi_scanned) { + scsi_scan(false /* no verbose */); + 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; + } ep->count = CONFIG_ENV_SIZE / ep->part.blksz; @@ -83,12 +95,20 @@ static int env_scsi_load(void) int ret; if (!ep) { - env_set_default(CONFIG_SCSI_ENV_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_SCSI_ENV_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; } diff --git a/include/scsi.h b/include/scsi.h index 8d6c5116419..2520a8b8fe6 100644 --- a/include/scsi.h +++ b/include/scsi.h @@ -340,6 +340,7 @@ int scsi_bus_reset(struct udevice *dev); * scsi_scan() - Scan all SCSI controllers for available devices * * @vebose: true to show information about each device found + * Return: 0 if OK, -ve on error */ int scsi_scan(bool verbose); @@ -348,15 +349,19 @@ int scsi_scan(bool verbose); * * @dev: SCSI bus * @verbose: true to show information about each device found + * Return: 0 if OK, -ve on error */ int scsi_scan_dev(struct udevice *dev, bool verbose); /** * scsi_get_blk_by_uuid() - Provides SCSI partition information. * + * scsi_scan() must have been called before calling this function. + * * @uuid: UUID of the partition for fetching its info * @blk_desc_ptr: Provides the blk descriptor * @part_info_ptr: Provides partition info + * Return: 0 if OK, -ve on error */ int scsi_get_blk_by_uuid(const char *uuid, struct blk_desc **blk_desc_ptr, struct disk_partition *part_info_ptr); |
