[PATCH 1/3] apple: Set up file system firmware loader
Marek Vasut
marex at denx.de
Fri Jul 14 23:27:42 CEST 2023
On 7/14/23 22:43, Mark Kettenis wrote:
> Find the appropriate EFI system partition on the internal NVMe
> storage and set the U-Boot environment variables such that
> the file system firmware loader can load firmware from it.
>
> Signed-off-by: Mark Kettenis <kettenis at openbsd.org>
> ---
> arch/arm/mach-apple/board.c | 60 +++++++++++++++++++++++++++++++++++++
> 1 file changed, 60 insertions(+)
>
> diff --git a/arch/arm/mach-apple/board.c b/arch/arm/mach-apple/board.c
> index d501948118..7799a0f916 100644
> --- a/arch/arm/mach-apple/board.c
> +++ b/arch/arm/mach-apple/board.c
> @@ -8,6 +8,8 @@
> #include <dm/uclass-internal.h>
> #include <efi_loader.h>
> #include <lmb.h>
> +#include <nvme.h>
> +#include <part.h>
>
> #include <asm/armv8/mmu.h>
> #include <asm/global_data.h>
> @@ -539,6 +541,60 @@ u64 get_page_table_size(void)
> return SZ_256K;
> }
>
> +static char *asahi_esp_devpart(void)
> +{
> + struct disk_partition info;
> + struct blk_desc *nvme_blk;
> + const char *uuid = NULL;
> + int devnum, len, p, part, ret;
> + static char devpart[64];
> + struct udevice *dev;
> + ofnode node;
> +
> + if (devpart[0])
> + return devpart;
> +
> + node = ofnode_path("/chosen");
> + if (ofnode_valid(node)) {
> + uuid = ofnode_get_property(node, "asahi,efi-system-partition",
> + &len);
> + }
> +
> + nvme_scan_namespace();
> + for (devnum = 0, part = 0;; devnum++) {
> + nvme_blk = blk_get_devnum_by_uclass_id(UCLASS_NVME, devnum);
> + if (nvme_blk == NULL)
> + break;
> +
> + dev = dev_get_parent(nvme_blk->bdev);
> + if (!device_is_compatible(dev, "apple,nvme-ans2"))
Can we somehow use ofnode_for_each_compatible_node() here ?
That might simplify this code.
> + continue;
> +
> + for (p = 1; p <= MAX_SEARCH_PARTITIONS; p++) {
> + ret = part_get_info(nvme_blk, p, &info);
> + if (ret < 0)
> + break;
> +
> + if (info.bootable & PART_EFI_SYSTEM_PARTITION) {
> + if (uuid && strcasecmp(uuid, info.uuid) == 0) {
> + part = p;
> + break;
> + }
> + if (part == 0)
> + part = p;
> + }
> + }
> +
> + if (part > 0)
> + break;
> + }
> +
> + if (part > 0)
> + snprintf(devpart, sizeof(devpart), "%d:%d", devnum, part);
> +
> + return devpart;
> +}
> +
> #define KERNEL_COMP_SIZE SZ_128M
>
> int board_late_init(void)
> @@ -546,6 +602,10 @@ int board_late_init(void)
> struct lmb lmb;
> u32 status = 0;
>
> + status |= env_set("storage_interface",
> + blk_get_uclass_name(UCLASS_NVME));
> + status |= env_set("fw_dev_part", asahi_esp_devpart());
I think env_set() returns integer (and this could be negative too), so
you might want to check the return value instead of casting it to
unsigned integer.
More information about the U-Boot
mailing list