diff options
| author | Tom Rini <[email protected]> | 2025-10-14 08:27:01 -0600 |
|---|---|---|
| committer | Tom Rini <[email protected]> | 2025-10-14 08:27:01 -0600 |
| commit | 14d36cd8da298f895053764632fd58c8afe4badb (patch) | |
| tree | 1cdc43d2d9046481b06895ac6ed0b29bcd414565 | |
| parent | 78406dda9908394bc231a766e0b2259b3d95743c (diff) | |
| parent | 377bc19fd92074bd32e6b29b9133037238ca54dd (diff) | |
Merge tag 'mix-next-14102025' of https://source.denx.de/u-boot/custodians/u-boot-tpm
TPM changes:
Make all drive names defined with U_BOOT_DRIVER unique
TEE changes:
Rework things such that sandbox will also traverse the optee directory
when SANDBOX_TEE is enabled, but only build one of the optee-specific
files when OPTEE is enabled.
EFI changes:
Up to now we were relying on the file extension to accept and load
an image over HTTP. We expected images to be either .iso or .img.
By wiring up internal existing functions we can try to mount any
file extension and reject it only if mounting fails.
part_driver_lookup_type
| -rw-r--r-- | disk/part.c | 18 | ||||
| -rw-r--r-- | drivers/tee/Makefile | 4 | ||||
| -rw-r--r-- | drivers/tee/optee/Makefile | 2 | ||||
| -rw-r--r-- | drivers/tpm/tpm_tis_infineon.c | 2 | ||||
| -rw-r--r-- | include/part.h | 21 | ||||
| -rw-r--r-- | lib/efi_loader/efi_bootmgr.c | 49 |
6 files changed, 60 insertions, 36 deletions
diff --git a/disk/part.c b/disk/part.c index 66e2b3a7219..be2b45d5a29 100644 --- a/disk/part.c +++ b/disk/part.c @@ -47,23 +47,7 @@ static struct part_driver *part_driver_get_type(int part_type) return NULL; } -/** - * part_driver_lookup_type() - Look up the partition driver for a blk device - * - * If @desc->part_type is PART_TYPE_UNKNOWN, this checks each parition driver - * against the blk device to see if there is a valid partition table acceptable - * to that driver. - * - * If @desc->part_type is already set, it just returns the driver for that - * type, without testing if the driver can find a valid partition on the - * descriptor. - * - * On success it updates @desc->part_type if set to PART_TYPE_UNKNOWN on entry - * - * @dev_desc: Device descriptor - * Return: Driver found, or NULL if none - */ -static struct part_driver *part_driver_lookup_type(struct blk_desc *desc) +struct part_driver *part_driver_lookup_type(struct blk_desc *desc) { struct part_driver *drv = ll_entry_start(struct part_driver, part_driver); diff --git a/drivers/tee/Makefile b/drivers/tee/Makefile index ff844195ae1..5bc5df0d380 100644 --- a/drivers/tee/Makefile +++ b/drivers/tee/Makefile @@ -1,8 +1,6 @@ # SPDX-License-Identifier: GPL-2.0+ obj-y += tee-uclass.o -obj-$(CONFIG_SANDBOX) += sandbox.o -obj-$(CONFIG_OPTEE_TA_RPC_TEST) += optee/supplicant.o -obj-$(CONFIG_OPTEE_TA_RPC_TEST) += optee/i2c.o +obj-$(CONFIG_SANDBOX_TEE) += sandbox.o optee/ obj-$(CONFIG_OPTEE) += optee/ obj-y += broadcom/ diff --git a/drivers/tee/optee/Makefile b/drivers/tee/optee/Makefile index 068c6e7aa1b..36ac085ef42 100644 --- a/drivers/tee/optee/Makefile +++ b/drivers/tee/optee/Makefile @@ -1,6 +1,6 @@ # SPDX-License-Identifier: GPL-2.0+ -obj-y += core.o +obj-$(CONFIG_OPTEE) += core.o obj-y += supplicant.o obj-$(CONFIG_DM_I2C) += i2c.o obj-$(CONFIG_SUPPORT_EMMC_RPMB) += rpmb.o diff --git a/drivers/tpm/tpm_tis_infineon.c b/drivers/tpm/tpm_tis_infineon.c index 30f23f8610a..c1e7b98295c 100644 --- a/drivers/tpm/tpm_tis_infineon.c +++ b/drivers/tpm/tpm_tis_infineon.c @@ -626,7 +626,7 @@ static const struct udevice_id tpm_tis_i2c_ids[] = { { } }; -U_BOOT_DRIVER(tpm_tis_i2c) = { +U_BOOT_DRIVER(tpm_tis_infineon) = { .name = "tpm_tis_infineon", .id = UCLASS_TPM, .of_match = tpm_tis_i2c_ids, diff --git a/include/part.h b/include/part.h index b772fb34c8a..6caaa6526aa 100644 --- a/include/part.h +++ b/include/part.h @@ -727,6 +727,24 @@ int part_get_type_by_name(const char *name); */ int part_get_bootable(struct blk_desc *desc); +/** + * part_driver_lookup_type() - Look up the partition driver for a blk device + * + * If @desc->part_type is PART_TYPE_UNKNOWN, this checks each partition driver + * against the blk device to see if there is a valid partition table acceptable + * to that driver. + * + * If @desc->part_type is already set, it just returns the driver for that + * type, without testing if the driver can find a valid partition on the + * descriptor. + * + * On success it updates @desc->part_type if set to PART_TYPE_UNKNOWN on entry + * + * @desc: Device descriptor + * Return: Driver found, or NULL if none + */ +struct part_driver *part_driver_lookup_type(struct blk_desc *desc); + #else static inline int part_driver_get_count(void) { return 0; } @@ -737,6 +755,9 @@ static inline struct part_driver *part_driver_get_first(void) static inline bool part_get_bootable(struct blk_desc *desc) { return false; } +static inline struct part_driver *part_driver_lookup_type(struct blk_desc *desc) +{ return NULL; } + #endif /* CONFIG_PARTITIONS */ #endif /* _PART_H */ diff --git a/lib/efi_loader/efi_bootmgr.c b/lib/efi_loader/efi_bootmgr.c index 662993fb809..a687f4d8e85 100644 --- a/lib/efi_loader/efi_bootmgr.c +++ b/lib/efi_loader/efi_bootmgr.c @@ -17,6 +17,7 @@ #include <log.h> #include <malloc.h> #include <net.h> +#include <part.h> #include <efi_loader.h> #include <efi_variable.h> #include <asm/unaligned.h> @@ -347,6 +348,9 @@ static efi_status_t fill_default_file_path(struct udevice *blk, * @dp: pointer to default file device path * @blk: pointer to created blk udevice * Return: status code + * + * This function handles device creation internally and performs cleanup + * on error paths. */ static efi_status_t prepare_loaded_image(u16 *label, ulong addr, ulong size, struct efi_device_path **dp, @@ -355,10 +359,31 @@ static efi_status_t prepare_loaded_image(u16 *label, ulong addr, ulong size, u64 pages; efi_status_t ret; struct udevice *ramdisk_blk; + struct blk_desc *desc; + struct part_driver *part_drv; + /* Create the ramdisk block device internally */ ramdisk_blk = mount_image(label, addr, size); - if (!ramdisk_blk) - return EFI_LOAD_ERROR; + if (!ramdisk_blk) { + log_warning("Failed to create ramdisk block device\n"); + return EFI_DEVICE_ERROR; + } + + /* Get the block descriptor and detect partitions */ + desc = dev_get_uclass_plat(ramdisk_blk); + if (!desc) { + log_err("Failed to get block descriptor\n"); + ret = EFI_DEVICE_ERROR; + goto err; + } + + /* Use part_driver_lookup_type for comprehensive partition detection */ + part_drv = part_driver_lookup_type(desc); + if (!part_drv) { + log_err("Image is not a valid disk image\n"); + ret = EFI_INVALID_PARAMETER; + goto err; + } ret = fill_default_file_path(ramdisk_blk, dp); if (ret != EFI_SUCCESS) { @@ -407,7 +432,7 @@ static efi_status_t efi_bootmgr_release_uridp(struct uridp_context *ctx) if (!ctx) return ret; - /* cleanup for iso or img image */ + /* cleanup for disk image */ if (ctx->ramdisk_blk_dev) { ret = efi_add_memory_map(ctx->image_addr, ctx->image_size, EFI_CONVENTIONAL_MEMORY); @@ -466,7 +491,6 @@ static efi_status_t try_load_from_uri_path(struct efi_device_path_uri *uridp, { char *s; int err; - int uri_len; efi_status_t ret; void *source_buffer; efi_uintn_t source_size; @@ -516,18 +540,15 @@ static efi_status_t try_load_from_uri_path(struct efi_device_path_uri *uridp, image_size = ALIGN(image_size, SZ_2M); /* - * If the file extension is ".iso" or ".img", mount it and try to load - * the default file. - * If the file is PE-COFF image, load the downloaded file. + * Check if the downloaded file is a disk image or PE-COFF image. + * Try disk image detection first using prepare_loaded_image(). */ - uri_len = strlen(uridp->uri); - if (!strncmp(&uridp->uri[uri_len - 4], ".iso", 4) || - !strncmp(&uridp->uri[uri_len - 4], ".img", 4)) { - ret = prepare_loaded_image(lo_label, image_addr, image_size, - &loaded_dp, &blk); - if (ret != EFI_SUCCESS) - goto err; + /* First, try to treat the image as a disk image */ + ret = prepare_loaded_image(lo_label, image_addr, image_size, + &loaded_dp, &blk); + if (ret == EFI_SUCCESS) { + /* Image is a disk image, set up for disk boot */ source_buffer = NULL; source_size = 0; } else if (efi_check_pe((void *)image_addr, image_size, NULL) == EFI_SUCCESS) { |
