From 28c341ca07169ac8caf9895667938d74bc0119ae Mon Sep 17 00:00:00 2001 From: Javier Tia Date: Thu, 9 Oct 2025 07:17:46 -0600 Subject: part: Export part_driver_lookup_type for external use Make part_driver_lookup_type non-static so it can be used outside part.c. This allows external callers to determine the appropriate partition driver for a block device, enabling more flexible handling of partition types. Add a prototype and kernel-doc comment in part.h to document the function contract. Provide a stub inline implementation returning NULL when partition support is disabled, ensuring build consistency across configurations. Signed-off-by: Javier Tia Reviewed-by: Ilias Apalodimas Signed-off-by: Ilias Apalodimas --- disk/part.c | 18 +----------------- include/part.h | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+), 17 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/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 */ -- cgit v1.3.1 From 038ca2c803cd0f51dad7ebd1d3da96118fb67056 Mon Sep 17 00:00:00 2001 From: Javier Tia Date: Thu, 9 Oct 2025 07:17:47 -0600 Subject: efi_loader: Improve disk image detection in efi_bootmgr Enhances the process for identifying disk images within the EFI boot manager. Utilize part_driver_lookup_type() to verify the validity of a downloaded file as a disk image, rather than depending on file extensions. part_driver_lookup_type() is now used in the prepare_loaded_image() function in the EFI boot manager to detect partitions on a block device created from a downloaded image. This allows the boot manager to boot from any disk image that can be recognized by a partition driver, not just ISO and IMG images. Update prepare_loaded_image() to create the ramdisk block device internally, obtain the blk_desc and use part_driver_lookup_type() to detect a valid partition table. In try_load_from_uri_path(), try prepare_loaded_image() first to detect disk images, and fall back to PE-COFF detection only if that fails. Signed-off-by: Javier Tia Reviewed-by: Ilias Apalodimas Signed-off-by: Ilias Apalodimas --- lib/efi_loader/efi_bootmgr.c | 49 +++++++++++++++++++++++++++++++------------- 1 file changed, 35 insertions(+), 14 deletions(-) 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 #include #include +#include #include #include #include @@ -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) { -- cgit v1.3.1 From 398f988410c94e95b49fe6679d8d848d2a09835a Mon Sep 17 00:00:00 2001 From: Tom Rini Date: Fri, 26 Sep 2025 09:31:44 -0600 Subject: tee: Rework Makefile logic The intention of how this Makefile was written was to allow for sandbox to build and test drivers still while otherwise requiring OPTEE to be enabled. This however didn't work quite right in practice as sandbox could enable some drivers which would then fail to link. 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. Signed-off-by: Tom Rini Acked-by: Ilias Apalodimas Signed-off-by: Ilias Apalodimas --- drivers/tee/Makefile | 4 +--- drivers/tee/optee/Makefile | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) 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 -- cgit v1.3.1 From 377bc19fd92074bd32e6b29b9133037238ca54dd Mon Sep 17 00:00:00 2001 From: Tom Rini Date: Thu, 25 Sep 2025 14:56:23 -0600 Subject: tpm: Make U_BOOT_DRIVER entries unique All instances of the U_BOOT_DRIVER must use a unique name or they will lead to link time failures due to name space conflicts when both are present. In this case the driver was reusing the tpm_tis_i2c name. Signed-off-by: Tom Rini Reviewed-by: Ilias Apalodimas Signed-off-by: Ilias Apalodimas --- drivers/tpm/tpm_tis_infineon.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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, -- cgit v1.3.1