u-boot.lists.denx.de archive mirror
 help / color / mirror / Atom feed
From: Simon Glass <sjg@chromium.org>
To: U-Boot Mailing List <u-boot@lists.denx.de>
Cc: Ilias Apalodimas <ilias.apalodimas@linaro.org>,
	Christian Melki <christian.melki@t2data.com>,
	Bin Meng <bmeng.cn@gmail.com>,
	Heinrich Schuchardt <xypron.glpk@gmx.de>,
	Tom Rini <trini@konsulko.com>, Simon Glass <sjg@chromium.org>,
	Alexander Graf <agraf@csgraf.de>
Subject: [PATCH v5 20/28] x86: efi: Update efi_get_next_mem_desc() to avoid needing a map
Date: Sat,  4 Dec 2021 08:56:49 -0700	[thread overview]
Message-ID: <20211204085647.v5.20.I28bc9b47c17e9ce562088556d635ed3493b055ed@changeid> (raw)
In-Reply-To: <20211204155657.2913911-1-sjg@chromium.org>

At present this function requires a pointer to struct efi_entry_memmap
but the only field used in there is the desc_size. We want to be able
to use it from the app, so update it to use desc_size directly.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

(no changes since v1)

 arch/x86/cpu/efi/payload.c |  8 ++++----
 cmd/efi.c                  | 34 ++++++++++++++++++----------------
 include/efi.h              |  4 ++--
 3 files changed, 24 insertions(+), 22 deletions(-)

diff --git a/arch/x86/cpu/efi/payload.c b/arch/x86/cpu/efi/payload.c
index 3a9f7d72868..d2aa889a2b9 100644
--- a/arch/x86/cpu/efi/payload.c
+++ b/arch/x86/cpu/efi/payload.c
@@ -50,7 +50,7 @@ ulong board_get_usable_ram_top(ulong total_size)
 
 	end = (struct efi_mem_desc *)((ulong)map + size);
 	desc = map->desc;
-	for (; desc < end; desc = efi_get_next_mem_desc(map, desc)) {
+	for (; desc < end; desc = efi_get_next_mem_desc(desc, map->desc_size)) {
 		if (desc->type != EFI_CONVENTIONAL_MEMORY ||
 		    desc->physical_start >= 1ULL << 32)
 			continue;
@@ -88,7 +88,7 @@ int dram_init(void)
 	end = (struct efi_mem_desc *)((ulong)map + size);
 	gd->ram_size = 0;
 	desc = map->desc;
-	for (; desc < end; desc = efi_get_next_mem_desc(map, desc)) {
+	for (; desc < end; desc = efi_get_next_mem_desc(desc, map->desc_size)) {
 		if (desc->type < EFI_MMAP_IO)
 			gd->ram_size += desc->num_pages << EFI_PAGE_SHIFT;
 	}
@@ -113,7 +113,7 @@ int dram_init_banksize(void)
 	desc = map->desc;
 	for (num_banks = 0;
 	     desc < end && num_banks < CONFIG_NR_DRAM_BANKS;
-	     desc = efi_get_next_mem_desc(map, desc)) {
+	     desc = efi_get_next_mem_desc(desc, map->desc_size)) {
 		/*
 		 * We only use conventional memory and ignore
 		 * anything less than 1MB.
@@ -196,7 +196,7 @@ unsigned int install_e820_map(unsigned int max_entries,
 
 	end = (struct efi_mem_desc *)((ulong)map + size);
 	for (desc = map->desc; desc < end;
-	     desc = efi_get_next_mem_desc(map, desc)) {
+	     desc = efi_get_next_mem_desc(desc, map->desc_size)) {
 		if (desc->num_pages == 0)
 			continue;
 
diff --git a/cmd/efi.c b/cmd/efi.c
index f2ed26bd4b2..d2400acbbba 100644
--- a/cmd/efi.c
+++ b/cmd/efi.c
@@ -75,16 +75,17 @@ static int h_cmp_entry(const void *v1, const void *v2)
 /**
  * efi_build_mem_table() - make a sorted copy of the memory table
  *
- * @map:	Pointer to EFI memory map table
+ * @desc_base:	Pointer to EFI memory map table
  * @size:	Size of table in bytes
+ * @desc_size:	Size of each @desc_base record
  * @skip_bs:	True to skip boot-time memory and merge it with conventional
  *		memory. This will significantly reduce the number of table
  *		entries.
  * Return:	pointer to the new table. It should be freed with free() by the
  *		caller.
  */
-static void *efi_build_mem_table(struct efi_entry_memmap *map, int size,
-				 bool skip_bs)
+static void *efi_build_mem_table(struct efi_mem_desc *desc_base, int size,
+				 int desc_size, bool skip_bs)
 {
 	struct efi_mem_desc *desc, *end, *base, *dest, *prev;
 	int count;
@@ -95,15 +96,16 @@ static void *efi_build_mem_table(struct efi_entry_memmap *map, int size,
 		debug("%s: Cannot allocate %#x bytes\n", __func__, size);
 		return NULL;
 	}
-	end = (struct efi_mem_desc *)((ulong)map + size);
-	count = ((ulong)end - (ulong)map->desc) / map->desc_size;
-	memcpy(base, map->desc, (ulong)end - (ulong)map->desc);
-	qsort(base, count, map->desc_size, h_cmp_entry);
+	end = (void *)desc_base + size;
+	count = ((ulong)end - (ulong)desc_base) / desc_size;
+	memcpy(base, desc_base, (ulong)end - (ulong)desc_base);
+	qsort(base, count, desc_size, h_cmp_entry);
 	prev = NULL;
 	addr = 0;
 	dest = base;
-	end = (struct efi_mem_desc *)((ulong)base + count * map->desc_size);
-	for (desc = base; desc < end; desc = efi_get_next_mem_desc(map, desc)) {
+	end = (struct efi_mem_desc *)((ulong)base + count * desc_size);
+	for (desc = base; desc < end;
+	     desc = efi_get_next_mem_desc(desc, desc_size)) {
 		bool merge = true;
 		u32 type = desc->type;
 
@@ -116,7 +118,7 @@ static void *efi_build_mem_table(struct efi_entry_memmap *map, int size,
 		if (skip_bs && is_boot_services(desc->type))
 			type = EFI_CONVENTIONAL_MEMORY;
 
-		memcpy(dest, desc, map->desc_size);
+		memcpy(dest, desc, desc_size);
 		dest->type = type;
 		if (!skip_bs || !prev)
 			merge = false;
@@ -131,7 +133,7 @@ static void *efi_build_mem_table(struct efi_entry_memmap *map, int size,
 			prev->num_pages += desc->num_pages;
 		} else {
 			prev = dest;
-			dest = efi_get_next_mem_desc(map, dest);
+			dest = efi_get_next_mem_desc(dest, desc_size);
 		}
 		addr = desc->physical_start + (desc->num_pages <<
 				EFI_PAGE_SHIFT);
@@ -143,8 +145,8 @@ static void *efi_build_mem_table(struct efi_entry_memmap *map, int size,
 	return base;
 }
 
-static void efi_print_mem_table(struct efi_entry_memmap *map,
-				struct efi_mem_desc *desc, bool skip_bs)
+static void efi_print_mem_table(struct efi_mem_desc *desc, int desc_size,
+				bool skip_bs)
 {
 	u64 attr_seen[ATTR_SEEN_MAX];
 	int attr_seen_count;
@@ -158,7 +160,7 @@ static void efi_print_mem_table(struct efi_entry_memmap *map,
 	attr_seen_count = 0;
 	addr = 0;
 	for (upto = 0; desc->type != EFI_MAX_MEMORY_TYPE;
-	     upto++, desc = efi_get_next_mem_desc(map, desc)) {
+	     upto++, desc = efi_get_next_mem_desc(desc, desc_size)) {
 		const char *name;
 		u64 size;
 
@@ -238,13 +240,13 @@ static int do_efi_mem(struct cmd_tbl *cmdtp, int flag, int argc,
 		goto done;
 	}
 
-	desc = efi_build_mem_table(map, size, skip_bs);
+	desc = efi_build_mem_table(map->desc, size, map->desc_size, skip_bs);
 	if (!desc) {
 		ret = -ENOMEM;
 		goto done;
 	}
 
-	efi_print_mem_table(map, desc, skip_bs);
+	efi_print_mem_table(desc, map->desc_size, skip_bs);
 	free(desc);
 done:
 	if (ret)
diff --git a/include/efi.h b/include/efi.h
index 69321cc5cc4..1dc806a1267 100644
--- a/include/efi.h
+++ b/include/efi.h
@@ -395,9 +395,9 @@ struct efi_entry_systable {
 };
 
 static inline struct efi_mem_desc *efi_get_next_mem_desc(
-		struct efi_entry_memmap *map, struct efi_mem_desc *desc)
+		struct efi_mem_desc *desc, int desc_size)
 {
-	return (struct efi_mem_desc *)((ulong)desc + map->desc_size);
+	return (struct efi_mem_desc *)((ulong)desc + desc_size);
 }
 
 /**
-- 
2.34.1.400.ga245620fadb-goog


  parent reply	other threads:[~2021-12-04 16:01 UTC|newest]

Thread overview: 54+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-12-04 15:56 [PATCH v5 00/28] efi: Improvements to U-Boot running on top of UEFI Simon Glass
2021-12-04 15:56 ` [PATCH v5 01/28] efi: Rename UCLASS_EFI and IF_TYPE_EFI Simon Glass
2021-12-09 18:38   ` Heinrich Schuchardt
2021-12-04 15:56 ` [PATCH v5 02/28] efi: Add EFI uclass for media Simon Glass
2021-12-09 18:54   ` Heinrich Schuchardt
2021-12-04 15:56 ` [PATCH v5 03/28] efi: Add a media/block driver for EFI block devices Simon Glass
2021-12-09 19:04   ` Heinrich Schuchardt
2021-12-04 15:56 ` [PATCH v5 04/28] efi: Locate all block devices in the app Simon Glass
2021-12-04 18:43   ` Heinrich Schuchardt
2021-12-09 19:23     ` Heinrich Schuchardt
2021-12-17 16:37       ` Simon Glass
2021-12-04 15:56 ` [PATCH v5 05/28] efi: serial: Support arrow keys Simon Glass
2021-12-09 19:39   ` Heinrich Schuchardt
2021-12-17 16:37     ` Simon Glass
2021-12-17 17:09       ` Heinrich Schuchardt
2021-12-17 17:42         ` Simon Glass
2021-12-04 15:56 ` [PATCH v5 06/28] bloblist: Support allocating the bloblist Simon Glass
2021-12-04 15:56 ` [PATCH v5 07/28] x86: Allow booting a kernel from the EFI app Simon Glass
2021-12-04 15:56 ` [PATCH v5 08/28] x86: Don't process the kernel command line unless enabled Simon Glass
2021-12-04 15:56 ` [PATCH v5 09/28] x86: efi: Add room for the binman definition in the dtb Simon Glass
2021-12-04 15:56 ` [PATCH v5 10/28] efi: Drop device_path from struct efi_priv Simon Glass
2021-12-04 15:56 ` [PATCH v5 11/28] efi: Add comments to " Simon Glass
2021-12-04 15:56 ` [PATCH v5 12/28] efi: Fix ll_boot_init() operation with the app Simon Glass
2021-12-04 15:56 ` [PATCH v5 13/28] efi: Add a few comments to the stub Simon Glass
2021-12-04 19:10   ` Heinrich Schuchardt
2021-12-04 15:56 ` [PATCH v5 14/28] efi: Share struct efi_priv between the app and stub code Simon Glass
2021-12-04 15:56 ` [PATCH v5 15/28] efi: Move exit_boot_services into a function Simon Glass
2021-12-04 19:13   ` Heinrich Schuchardt
2021-12-17 16:37     ` Simon Glass
2021-12-04 15:56 ` [PATCH v5 16/28] efi: Check for failure when initing the app Simon Glass
2021-12-09 20:17   ` Heinrich Schuchardt
2021-12-04 15:56 ` [PATCH v5 17/28] efi: Mention that efi_info_get() is only used in the stub Simon Glass
2021-12-09 20:20   ` Heinrich Schuchardt
2021-12-04 15:56 ` [PATCH v5 18/28] efi: Show when allocated pages are used Simon Glass
2021-12-09 19:55   ` Heinrich Schuchardt
2021-12-17 16:37     ` Simon Glass
2021-12-04 15:56 ` [PATCH v5 19/28] efi: Allow easy selection of serial-only operation Simon Glass
2021-12-04 15:56 ` Simon Glass [this message]
2021-12-04 15:56 ` [PATCH v5 21/28] efi: Support the efi command in the app Simon Glass
2021-12-09 20:27   ` Heinrich Schuchardt
2021-12-17 16:37     ` Simon Glass
2021-12-20  2:38       ` AKASHI Takahiro
2021-12-29 13:36         ` Simon Glass
2021-12-04 15:56 ` [PATCH v5 22/28] x86: efi: Show the system-table revision Simon Glass
2021-12-09 20:29   ` Heinrich Schuchardt
2021-12-17 16:37     ` Simon Glass
2021-12-04 15:56 ` [PATCH v5 23/28] x86: efi: Don't set up global_data again with EFI Simon Glass
2021-12-04 15:56 ` [PATCH v5 24/28] x86: efi: Tweak the code used for the 64-bit EFI app Simon Glass
2021-12-04 15:56 ` [PATCH v5 25/28] x86: efi: Round out the link script for 64-bit EFI Simon Glass
2021-12-04 15:56 ` [PATCH v5 26/28] x86: efi: Don't use the 64-bit link script for the EFI app Simon Glass
2021-12-05 14:03   ` Christian Melki
2021-12-04 15:56 ` [PATCH v5 27/28] x86: efi: Set the correct link flags for the 64-bit " Simon Glass
2021-12-05 14:03   ` Christian Melki
2021-12-04 15:56 ` [PATCH v5 28/28] efi: Build the 64-bit app properly Simon Glass

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20211204085647.v5.20.I28bc9b47c17e9ce562088556d635ed3493b055ed@changeid \
    --to=sjg@chromium.org \
    --cc=agraf@csgraf.de \
    --cc=bmeng.cn@gmail.com \
    --cc=christian.melki@t2data.com \
    --cc=ilias.apalodimas@linaro.org \
    --cc=trini@konsulko.com \
    --cc=u-boot@lists.denx.de \
    --cc=xypron.glpk@gmx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).