[PATCH 083/112] efi: payload: factor C efi_main into dedicated file

Ahmad Fatoum a.fatoum at pengutronix.de
Wed Jan 3 10:12:43 PST 2024


For barebox as EFI payload on ARM, we will not call start_barebox()
ourselves as we will be using PBL, which we don't on x86 yet.

Therefore move that code out of the common init.c into a new
entry-single.c and early-mem.c that can be used as needed.

Signed-off-by: Ahmad Fatoum <a.fatoum at pengutronix.de>
---
 efi/payload/Makefile       |  2 ++
 efi/payload/early-mem.c    | 32 +++++++++++++++++++++++++++
 efi/payload/entry-single.c | 45 ++++++++++++++++++++++++++++++++++++++
 efi/payload/init.c         | 45 --------------------------------------
 include/efi/efi-payload.h  |  3 +++
 5 files changed, 82 insertions(+), 45 deletions(-)
 create mode 100644 efi/payload/early-mem.c
 create mode 100644 efi/payload/entry-single.c

diff --git a/efi/payload/Makefile b/efi/payload/Makefile
index eeed046b0045..71305bee7006 100644
--- a/efi/payload/Makefile
+++ b/efi/payload/Makefile
@@ -5,3 +5,5 @@ obj-y += image.o
 obj-$(CONFIG_OFTREE) += fdt.o
 bbenv-y += env-efi
 obj-$(CONFIG_CMD_IOMEM) += iomem.o
+obj-pbl-$(CONFIG_EFI_PAYLOAD) += early-mem.o
+obj-$(CONFIG_EFI_PAYLOAD) += entry-single.o
diff --git a/efi/payload/early-mem.c b/efi/payload/early-mem.c
new file mode 100644
index 000000000000..24bc1d34cc51
--- /dev/null
+++ b/efi/payload/early-mem.c
@@ -0,0 +1,32 @@
+// SPDX-License-Identifier: GPL-2.0-only
+
+#include <linux/kernel.h>
+#include <linux/sizes.h>
+#include <efi.h>
+#include <efi/efi-payload.h>
+#include <linux/pagemap.h>
+
+efi_physical_addr_t efi_earlymem_alloc(const struct efi_system_table *sys_table,
+				       size_t *memsize)
+{
+	struct efi_boot_services *bs = sys_table->boottime;
+	efi_physical_addr_t mem;
+	efi_status_t efiret;
+
+	mem = IS_ENABLED(CONFIG_X86) ? 0x3fffffff : ~0ULL;
+	for (*memsize = SZ_256M; *memsize >= SZ_8M; *memsize /= 2) {
+		efiret  = bs->allocate_pages(EFI_ALLOCATE_MAX_ADDRESS,
+					     EFI_LOADER_DATA,
+					     *memsize/PAGE_SIZE, &mem);
+		if (!EFI_ERROR(efiret))
+			break;
+		if (efiret != EFI_OUT_OF_RESOURCES)
+			panic("failed to allocate malloc pool: %s\n",
+			      efi_strerror(efiret));
+	}
+	if (EFI_ERROR(efiret))
+		panic("failed to allocate malloc pool: %s\n",
+		      efi_strerror(efiret));
+
+	return mem;
+}
diff --git a/efi/payload/entry-single.c b/efi/payload/entry-single.c
new file mode 100644
index 000000000000..cb7981e03060
--- /dev/null
+++ b/efi/payload/entry-single.c
@@ -0,0 +1,45 @@
+// SPDX-License-Identifier: GPL-2.0-only
+
+#ifdef CONFIG_DEBUG_LL
+#define DEBUG
+#endif
+
+#include <linux/kernel.h>
+#include <linux/sizes.h>
+#include <efi.h>
+#include <efi/efi-payload.h>
+#include <memory.h>
+#include <common.h>
+
+/**
+ * efi-main - Entry point for EFI images
+ */
+void efi_main(efi_handle_t image, struct efi_system_table *sys_table)
+{
+	efi_status_t efiret;
+	size_t memsize;
+	efi_physical_addr_t mem;
+
+#ifdef DEBUG
+	sys_table->con_out->output_string(sys_table->con_out, L"barebox\n");
+#endif
+
+	BS = sys_table->boottime;
+
+	efi_parent_image = image;
+	efi_sys_table = sys_table;
+	RT = sys_table->runtime;
+
+	efiret = BS->open_protocol(efi_parent_image, &efi_loaded_image_protocol_guid,
+			(void **)&efi_loaded_image,
+			efi_parent_image, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL);
+	if (!EFI_ERROR(efiret))
+		BS->handle_protocol(efi_loaded_image->device_handle,
+				&efi_device_path_protocol_guid, (void **)&efi_device_path);
+
+	mem = efi_earlymem_alloc(sys_table, &memsize);
+
+	mem_malloc_init((void *)mem, (void *)mem + memsize - 1);
+
+	start_barebox();
+}
diff --git a/efi/payload/init.c b/efi/payload/init.c
index 906ede38336e..6c790c680602 100644
--- a/efi/payload/init.c
+++ b/efi/payload/init.c
@@ -266,51 +266,6 @@ static int efi_init(void)
 }
 device_efi_initcall(efi_init);
 
-/**
- * efi-main - Entry point for EFI images
- */
-void efi_main(efi_handle_t image, struct efi_system_table *sys_table)
-{
-	efi_physical_addr_t mem;
-	size_t memsize;
-	efi_status_t efiret;
-
-#ifdef DEBUG
-	sys_table->con_out->output_string(sys_table->con_out, L"barebox\n");
-#endif
-
-	BS = sys_table->boottime;
-
-	efi_parent_image = image;
-	efi_sys_table = sys_table;
-	RT = sys_table->runtime;
-
-	efiret = BS->open_protocol(efi_parent_image, &efi_loaded_image_protocol_guid,
-			(void **)&efi_loaded_image,
-			efi_parent_image, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL);
-	if (!EFI_ERROR(efiret))
-		BS->handle_protocol(efi_loaded_image->device_handle,
-				&efi_device_path_protocol_guid, (void **)&efi_device_path);
-
-	mem = IS_ENABLED(CONFIG_X86) ? 0x3fffffff : ~0ULL;
-	for (memsize = SZ_256M; memsize >= SZ_8M; memsize /= 2) {
-		efiret  = BS->allocate_pages(EFI_ALLOCATE_MAX_ADDRESS,
-					     EFI_LOADER_DATA,
-					     memsize/PAGE_SIZE, &mem);
-		if (!EFI_ERROR(efiret))
-			break;
-		if (efiret != EFI_OUT_OF_RESOURCES)
-			panic("failed to allocate malloc pool: %s\n",
-			      efi_strerror(efiret));
-	}
-	if (EFI_ERROR(efiret))
-		panic("failed to allocate malloc pool: %s\n",
-		      efi_strerror(efiret));
-	mem_malloc_init((void *)mem, (void *)mem + memsize - 1);
-
-	start_barebox();
-}
-
 static int efi_core_init(void)
 {
 	struct device *dev;
diff --git a/include/efi/efi-payload.h b/include/efi/efi-payload.h
index 3713ef359228..774c069229ab 100644
--- a/include/efi/efi-payload.h
+++ b/include/efi/efi-payload.h
@@ -25,4 +25,7 @@ int efi_set_variable(char *name, efi_guid_t *vendor, uint32_t attributes,
 		     void *buf, unsigned long size);
 int efi_set_variable_usec(char *name, efi_guid_t *vendor, uint64_t usec);
 
+efi_physical_addr_t efi_earlymem_alloc(const struct efi_system_table *sys_table,
+				       size_t *memsize);
+
 #endif
-- 
2.39.2




More information about the barebox mailing list