[PATCH 1/3] apple: Set up file system firmware loader
Mark Kettenis
kettenis at openbsd.org
Fri Jul 14 22:43:21 CEST 2023
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"))
+ 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());
+
lmb_init_and_reserve(&lmb, gd->bd, (void *)gd->fdt_blob);
/* somewhat based on the Linux Kernel boot requirements:
--
2.41.0
More information about the U-Boot
mailing list