Message ID | 20240607185240.1892031-31-sughosh.ganu@linaro.org |
---|---|
State | New |
Headers | show |
Series | Make U-Boot memory reservations coherent | expand |
Am 7. Juni 2024 20:52:39 MESZ schrieb Sughosh Ganu <sughosh.ganu@linaro.org>: >Not for committing. Best put "DON'T MERGE" into the title to avoid mishaps in future versions. In the final series we should have unit test covering all relevant aspects of the memory system. Best regards Heinrich > >Signed-off-by: Sughosh Ganu <sughosh.ganu@linaro.org> >--- > cmd/Makefile | 1 + > cmd/efi_memory.c | 155 +++++++++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 156 insertions(+) > create mode 100644 cmd/efi_memory.c > >diff --git a/cmd/Makefile b/cmd/Makefile >index 87133cc27a..35fcc4af5a 100644 >--- a/cmd/Makefile >+++ b/cmd/Makefile >@@ -10,6 +10,7 @@ obj-$(CONFIG_CMD_BOOTM) += bootm.o > obj-y += help.o > obj-y += panic.o > obj-y += version.o >+obj-y += efi_memory.o > > # command > obj-$(CONFIG_CMD_ARMFFA) += armffa.o >diff --git a/cmd/efi_memory.c b/cmd/efi_memory.c >new file mode 100644 >index 0000000000..52ddcb7146 >--- /dev/null >+++ b/cmd/efi_memory.c >@@ -0,0 +1,155 @@ >+// SPDX-License-Identifier: GPL-2.0+ >+/* >+ * Allocate and Free EFI memory >+ * >+ * Copyright (c) 2024 Linaro Limited >+ */ >+ >+#include <command.h> >+#include <efi_loader.h> >+#include <lmb.h> >+#include <vsprintf.h> >+ >+#include <linux/types.h> >+ >+static int do_efi_mem_free(struct cmd_tbl *cmdtp, int flag, int argc, >+ char * const argv[]) >+{ >+ uint64_t addr = 0, size = 0; >+ efi_uintn_t pages; >+ efi_status_t status; >+ >+ if (argc != 3) >+ return CMD_RET_USAGE; >+ >+ argc--; argv++; >+ >+ size = simple_strtoul(argv[0], NULL, 16); >+ if (!size) { >+ printf("Enter valid size for free in Hex\n"); >+ return CMD_RET_USAGE; >+ } >+ >+ >+ addr = simple_strtoul(argv[1], NULL, 16); >+ if (!addr) { >+ printf("Enter a valid address in Hex\n"); >+ return CMD_RET_USAGE; >+ } >+ >+ pages = efi_size_in_pages(size + (addr & EFI_PAGE_MASK)); >+ >+ status = efi_free_pages(addr, pages); >+ if (status != EFI_SUCCESS) { >+ printf("Unable to free memory, error (%#lx)\n", status); >+ return CMD_RET_FAILURE; >+ } >+ >+ return CMD_RET_SUCCESS; >+} >+ >+static int do_efi_mem_alloc(struct cmd_tbl *cmdtp, int flag, int argc, >+ char * const argv[]) >+{ >+ enum efi_allocate_type type; >+ uint64_t addr = 0, size = 0; >+ efi_uintn_t pages; >+ efi_status_t status; >+ bool max = false; >+ >+ if (argc < 2) >+ return CMD_RET_USAGE; >+ >+ argc--; argv++; >+ >+ if (!strcmp("max", argv[0])) { >+ if (argc != 3) >+ return CMD_RET_USAGE; >+ >+ max = true; >+ argv++; >+ argc--; >+ } >+ >+ size = simple_strtoul(argv[0], NULL, 16); >+ if (!size) { >+ printf("Enter valid size for allocation in Hex\n"); >+ return CMD_RET_USAGE; >+ } >+ >+ if (max || argc == 2) { >+ addr = simple_strtoul(argv[1], NULL, 16); >+ if (!addr) { >+ printf("Enter a valid address in Hex\n"); >+ return CMD_RET_USAGE; >+ } >+ } >+ >+ if (max) >+ type = EFI_ALLOCATE_MAX_ADDRESS; >+ else if (addr) >+ type = EFI_ALLOCATE_ADDRESS; >+ else >+ type = EFI_ALLOCATE_ANY_PAGES; >+ >+ pages = efi_size_in_pages(size + (addr & EFI_PAGE_MASK)); >+ status = efi_allocate_pages(type, EFI_BOOT_SERVICES_DATA, pages, >+ &addr); >+ if (status != EFI_SUCCESS) { >+ printf("efi_allocate_pages failed %lx\n", status); >+ return CMD_RET_FAILURE; >+ } else { >+ printf("Address returned %#llx\n", addr); >+ } >+ >+ return CMD_RET_SUCCESS; >+} >+ >+static struct cmd_tbl cmd_efi_mem_sub[] = { >+ U_BOOT_CMD_MKENT(alloc, 3, 0, do_efi_mem_alloc, >+ "", ""), >+ U_BOOT_CMD_MKENT(free, 2, 0, do_efi_mem_free, >+ "", ""), >+}; >+ >+static int do_efi_mem(struct cmd_tbl *cmdtp, int flag, int argc, >+ char *const argv[]) >+{ >+ struct cmd_tbl *cp; >+ efi_status_t r; >+ >+ if (argc < 3) >+ return CMD_RET_USAGE; >+ >+ argc--; argv++; >+ >+ /* Initialize UEFI subsystem */ >+ r = efi_init_obj_list(); >+ if (r != EFI_SUCCESS) { >+ printf("Error: Cannot initialize UEFI sub-system, r = %lu\n", >+ r & ~EFI_ERROR_MASK); >+ return CMD_RET_FAILURE; >+ } >+ >+ cp = find_cmd_tbl(argv[0], cmd_efi_mem_sub, >+ ARRAY_SIZE(cmd_efi_mem_sub)); >+ if (!cp) >+ return CMD_RET_USAGE; >+ >+ return cp->cmd(cmdtp, flag, argc, argv); >+} >+ >+U_BOOT_LONGHELP(efi_mem, >+ "Functions to allocate and free memory\n" >+ "\n" >+ "efi_mem alloc <size> [addr]\n" >+ "efi_mem alloc max <size> <max-addr>\n" >+ "efi_mem free <size> <addr>\n" >+ "\n" >+); >+ >+U_BOOT_CMD( >+ efi_mem, CONFIG_SYS_MAXARGS, 0, do_efi_mem, >+ "Allocate and free EFI memory", >+ efi_mem_help_text >+);
On Sat, 8 Jun 2024 at 09:07, Heinrich Schuchardt <xypron.glpk@gmx.de> wrote: > > > > Am 7. Juni 2024 20:52:39 MESZ schrieb Sughosh Ganu <sughosh.ganu@linaro.org>: > >Not for committing. > > Best put "DON'T MERGE" into the title to avoid mishaps in future versions. Will do. > > In the final series we should have unit test covering all relevant aspects of the memory system. Yes, that's the plan. -sughosh > > Best regards > > Heinrich > > > > >Signed-off-by: Sughosh Ganu <sughosh.ganu@linaro.org> > >--- > > cmd/Makefile | 1 + > > cmd/efi_memory.c | 155 +++++++++++++++++++++++++++++++++++++++++++++++ > > 2 files changed, 156 insertions(+) > > create mode 100644 cmd/efi_memory.c > > > >diff --git a/cmd/Makefile b/cmd/Makefile > >index 87133cc27a..35fcc4af5a 100644 > >--- a/cmd/Makefile > >+++ b/cmd/Makefile > >@@ -10,6 +10,7 @@ obj-$(CONFIG_CMD_BOOTM) += bootm.o > > obj-y += help.o > > obj-y += panic.o > > obj-y += version.o > >+obj-y += efi_memory.o > > > > # command > > obj-$(CONFIG_CMD_ARMFFA) += armffa.o > >diff --git a/cmd/efi_memory.c b/cmd/efi_memory.c > >new file mode 100644 > >index 0000000000..52ddcb7146 > >--- /dev/null > >+++ b/cmd/efi_memory.c > >@@ -0,0 +1,155 @@ > >+// SPDX-License-Identifier: GPL-2.0+ > >+/* > >+ * Allocate and Free EFI memory > >+ * > >+ * Copyright (c) 2024 Linaro Limited > >+ */ > >+ > >+#include <command.h> > >+#include <efi_loader.h> > >+#include <lmb.h> > >+#include <vsprintf.h> > >+ > >+#include <linux/types.h> > >+ > >+static int do_efi_mem_free(struct cmd_tbl *cmdtp, int flag, int argc, > >+ char * const argv[]) > >+{ > >+ uint64_t addr = 0, size = 0; > >+ efi_uintn_t pages; > >+ efi_status_t status; > >+ > >+ if (argc != 3) > >+ return CMD_RET_USAGE; > >+ > >+ argc--; argv++; > >+ > >+ size = simple_strtoul(argv[0], NULL, 16); > >+ if (!size) { > >+ printf("Enter valid size for free in Hex\n"); > >+ return CMD_RET_USAGE; > >+ } > >+ > >+ > >+ addr = simple_strtoul(argv[1], NULL, 16); > >+ if (!addr) { > >+ printf("Enter a valid address in Hex\n"); > >+ return CMD_RET_USAGE; > >+ } > >+ > >+ pages = efi_size_in_pages(size + (addr & EFI_PAGE_MASK)); > >+ > >+ status = efi_free_pages(addr, pages); > >+ if (status != EFI_SUCCESS) { > >+ printf("Unable to free memory, error (%#lx)\n", status); > >+ return CMD_RET_FAILURE; > >+ } > >+ > >+ return CMD_RET_SUCCESS; > >+} > >+ > >+static int do_efi_mem_alloc(struct cmd_tbl *cmdtp, int flag, int argc, > >+ char * const argv[]) > >+{ > >+ enum efi_allocate_type type; > >+ uint64_t addr = 0, size = 0; > >+ efi_uintn_t pages; > >+ efi_status_t status; > >+ bool max = false; > >+ > >+ if (argc < 2) > >+ return CMD_RET_USAGE; > >+ > >+ argc--; argv++; > >+ > >+ if (!strcmp("max", argv[0])) { > >+ if (argc != 3) > >+ return CMD_RET_USAGE; > >+ > >+ max = true; > >+ argv++; > >+ argc--; > >+ } > >+ > >+ size = simple_strtoul(argv[0], NULL, 16); > >+ if (!size) { > >+ printf("Enter valid size for allocation in Hex\n"); > >+ return CMD_RET_USAGE; > >+ } > >+ > >+ if (max || argc == 2) { > >+ addr = simple_strtoul(argv[1], NULL, 16); > >+ if (!addr) { > >+ printf("Enter a valid address in Hex\n"); > >+ return CMD_RET_USAGE; > >+ } > >+ } > >+ > >+ if (max) > >+ type = EFI_ALLOCATE_MAX_ADDRESS; > >+ else if (addr) > >+ type = EFI_ALLOCATE_ADDRESS; > >+ else > >+ type = EFI_ALLOCATE_ANY_PAGES; > >+ > >+ pages = efi_size_in_pages(size + (addr & EFI_PAGE_MASK)); > >+ status = efi_allocate_pages(type, EFI_BOOT_SERVICES_DATA, pages, > >+ &addr); > >+ if (status != EFI_SUCCESS) { > >+ printf("efi_allocate_pages failed %lx\n", status); > >+ return CMD_RET_FAILURE; > >+ } else { > >+ printf("Address returned %#llx\n", addr); > >+ } > >+ > >+ return CMD_RET_SUCCESS; > >+} > >+ > >+static struct cmd_tbl cmd_efi_mem_sub[] = { > >+ U_BOOT_CMD_MKENT(alloc, 3, 0, do_efi_mem_alloc, > >+ "", ""), > >+ U_BOOT_CMD_MKENT(free, 2, 0, do_efi_mem_free, > >+ "", ""), > >+}; > >+ > >+static int do_efi_mem(struct cmd_tbl *cmdtp, int flag, int argc, > >+ char *const argv[]) > >+{ > >+ struct cmd_tbl *cp; > >+ efi_status_t r; > >+ > >+ if (argc < 3) > >+ return CMD_RET_USAGE; > >+ > >+ argc--; argv++; > >+ > >+ /* Initialize UEFI subsystem */ > >+ r = efi_init_obj_list(); > >+ if (r != EFI_SUCCESS) { > >+ printf("Error: Cannot initialize UEFI sub-system, r = %lu\n", > >+ r & ~EFI_ERROR_MASK); > >+ return CMD_RET_FAILURE; > >+ } > >+ > >+ cp = find_cmd_tbl(argv[0], cmd_efi_mem_sub, > >+ ARRAY_SIZE(cmd_efi_mem_sub)); > >+ if (!cp) > >+ return CMD_RET_USAGE; > >+ > >+ return cp->cmd(cmdtp, flag, argc, argv); > >+} > >+ > >+U_BOOT_LONGHELP(efi_mem, > >+ "Functions to allocate and free memory\n" > >+ "\n" > >+ "efi_mem alloc <size> [addr]\n" > >+ "efi_mem alloc max <size> <max-addr>\n" > >+ "efi_mem free <size> <addr>\n" > >+ "\n" > >+); > >+ > >+U_BOOT_CMD( > >+ efi_mem, CONFIG_SYS_MAXARGS, 0, do_efi_mem, > >+ "Allocate and free EFI memory", > >+ efi_mem_help_text > >+);
diff --git a/cmd/Makefile b/cmd/Makefile index 87133cc27a..35fcc4af5a 100644 --- a/cmd/Makefile +++ b/cmd/Makefile @@ -10,6 +10,7 @@ obj-$(CONFIG_CMD_BOOTM) += bootm.o obj-y += help.o obj-y += panic.o obj-y += version.o +obj-y += efi_memory.o # command obj-$(CONFIG_CMD_ARMFFA) += armffa.o diff --git a/cmd/efi_memory.c b/cmd/efi_memory.c new file mode 100644 index 0000000000..52ddcb7146 --- /dev/null +++ b/cmd/efi_memory.c @@ -0,0 +1,155 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Allocate and Free EFI memory + * + * Copyright (c) 2024 Linaro Limited + */ + +#include <command.h> +#include <efi_loader.h> +#include <lmb.h> +#include <vsprintf.h> + +#include <linux/types.h> + +static int do_efi_mem_free(struct cmd_tbl *cmdtp, int flag, int argc, + char * const argv[]) +{ + uint64_t addr = 0, size = 0; + efi_uintn_t pages; + efi_status_t status; + + if (argc != 3) + return CMD_RET_USAGE; + + argc--; argv++; + + size = simple_strtoul(argv[0], NULL, 16); + if (!size) { + printf("Enter valid size for free in Hex\n"); + return CMD_RET_USAGE; + } + + + addr = simple_strtoul(argv[1], NULL, 16); + if (!addr) { + printf("Enter a valid address in Hex\n"); + return CMD_RET_USAGE; + } + + pages = efi_size_in_pages(size + (addr & EFI_PAGE_MASK)); + + status = efi_free_pages(addr, pages); + if (status != EFI_SUCCESS) { + printf("Unable to free memory, error (%#lx)\n", status); + return CMD_RET_FAILURE; + } + + return CMD_RET_SUCCESS; +} + +static int do_efi_mem_alloc(struct cmd_tbl *cmdtp, int flag, int argc, + char * const argv[]) +{ + enum efi_allocate_type type; + uint64_t addr = 0, size = 0; + efi_uintn_t pages; + efi_status_t status; + bool max = false; + + if (argc < 2) + return CMD_RET_USAGE; + + argc--; argv++; + + if (!strcmp("max", argv[0])) { + if (argc != 3) + return CMD_RET_USAGE; + + max = true; + argv++; + argc--; + } + + size = simple_strtoul(argv[0], NULL, 16); + if (!size) { + printf("Enter valid size for allocation in Hex\n"); + return CMD_RET_USAGE; + } + + if (max || argc == 2) { + addr = simple_strtoul(argv[1], NULL, 16); + if (!addr) { + printf("Enter a valid address in Hex\n"); + return CMD_RET_USAGE; + } + } + + if (max) + type = EFI_ALLOCATE_MAX_ADDRESS; + else if (addr) + type = EFI_ALLOCATE_ADDRESS; + else + type = EFI_ALLOCATE_ANY_PAGES; + + pages = efi_size_in_pages(size + (addr & EFI_PAGE_MASK)); + status = efi_allocate_pages(type, EFI_BOOT_SERVICES_DATA, pages, + &addr); + if (status != EFI_SUCCESS) { + printf("efi_allocate_pages failed %lx\n", status); + return CMD_RET_FAILURE; + } else { + printf("Address returned %#llx\n", addr); + } + + return CMD_RET_SUCCESS; +} + +static struct cmd_tbl cmd_efi_mem_sub[] = { + U_BOOT_CMD_MKENT(alloc, 3, 0, do_efi_mem_alloc, + "", ""), + U_BOOT_CMD_MKENT(free, 2, 0, do_efi_mem_free, + "", ""), +}; + +static int do_efi_mem(struct cmd_tbl *cmdtp, int flag, int argc, + char *const argv[]) +{ + struct cmd_tbl *cp; + efi_status_t r; + + if (argc < 3) + return CMD_RET_USAGE; + + argc--; argv++; + + /* Initialize UEFI subsystem */ + r = efi_init_obj_list(); + if (r != EFI_SUCCESS) { + printf("Error: Cannot initialize UEFI sub-system, r = %lu\n", + r & ~EFI_ERROR_MASK); + return CMD_RET_FAILURE; + } + + cp = find_cmd_tbl(argv[0], cmd_efi_mem_sub, + ARRAY_SIZE(cmd_efi_mem_sub)); + if (!cp) + return CMD_RET_USAGE; + + return cp->cmd(cmdtp, flag, argc, argv); +} + +U_BOOT_LONGHELP(efi_mem, + "Functions to allocate and free memory\n" + "\n" + "efi_mem alloc <size> [addr]\n" + "efi_mem alloc max <size> <max-addr>\n" + "efi_mem free <size> <addr>\n" + "\n" +); + +U_BOOT_CMD( + efi_mem, CONFIG_SYS_MAXARGS, 0, do_efi_mem, + "Allocate and free EFI memory", + efi_mem_help_text +);
Not for committing. Signed-off-by: Sughosh Ganu <sughosh.ganu@linaro.org> --- cmd/Makefile | 1 + cmd/efi_memory.c | 155 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 156 insertions(+) create mode 100644 cmd/efi_memory.c