/On 06/23/2018 12:03 PM, Bin Meng wrote: > ACPI tables can be passed via EFI configuration table to an EFI > application. This is only supported on x86 so far. > > Signed-off-by: Bin Meng <bmeng...@gmail.com> > --- > > cmd/bootefi.c | 5 +++++ > include/efi_api.h | 8 ++++++++ > include/efi_loader.h | 8 ++++++++ > lib/efi_loader/Makefile | 1 + > lib/efi_loader/efi_acpi.c | 42 ++++++++++++++++++++++++++++++++++++++++++ > 5 files changed, 64 insertions(+) > create mode 100644 lib/efi_loader/efi_acpi.c > > diff --git a/cmd/bootefi.c b/cmd/bootefi.c > index f55a40d..cd755b6 100644 > --- a/cmd/bootefi.c > +++ b/cmd/bootefi.c > @@ -61,6 +61,11 @@ efi_status_t efi_init_obj_list(void) > if (ret != EFI_SUCCESS) > goto out; > #endif > +#ifdef CONFIG_GENERATE_ACPI_TABLE > + ret = efi_acpi_register(); > + if (ret != EFI_SUCCESS) > + goto out; > +#endif > #ifdef CONFIG_GENERATE_SMBIOS_TABLE > ret = efi_smbios_register(); > if (ret != EFI_SUCCESS) > diff --git a/include/efi_api.h b/include/efi_api.h > index 094be6e..69dcbac 100644 > --- a/include/efi_api.h > +++ b/include/efi_api.h > @@ -286,6 +286,14 @@ struct efi_runtime_services { > EFI_GUID(0xeb9d2d31, 0x2d88, 0x11d3, \ > 0x9a, 0x16, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d) > > +#define ACPI_TABLE_GUID \ > + EFI_GUID(0xeb9d2d30, 0x2d88, 0x11d3, \ > + 0x9a, 0x16, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d) > + > +#define ACPI_20_TABLE_GUID \ > + EFI_GUID(0x8868e871, 0xe4f1, 0x11d3, \ > + 0xbc, 0x22, 0x00, 0x80, 0xc7, 0x3c, 0x88, 0x81) > + > struct efi_configuration_table > { > efi_guid_t guid; > diff --git a/include/efi_loader.h b/include/efi_loader.h > index c66252a..d837e7b 100644 > --- a/include/efi_loader.h > +++ b/include/efi_loader.h > @@ -215,6 +215,14 @@ efi_status_t efi_net_register(void); > efi_status_t efi_watchdog_register(void); > /* Called by bootefi to make SMBIOS tables available */ > /** > + * efi_acpi_register() - write out ACPI tables > + * > + * Called by bootefi to make ACPI tables available > + * > + * @return 0 if OK, -ENOMEM if no memory is available for the tables > + */ > +efi_status_t efi_acpi_register(void); > +/** > * efi_smbios_register() - write out SMBIOS tables > * > * Called by bootefi to make SMBIOS tables available > diff --git a/lib/efi_loader/Makefile b/lib/efi_loader/Makefile > index c6046e3..d6402c4 100644 > --- a/lib/efi_loader/Makefile > +++ b/lib/efi_loader/Makefile > @@ -22,4 +22,5 @@ obj-$(CONFIG_LCD) += efi_gop.o > obj-$(CONFIG_DM_VIDEO) += efi_gop.o > obj-$(CONFIG_PARTITIONS) += efi_disk.o > obj-$(CONFIG_NET) += efi_net.o > +obj-$(CONFIG_GENERATE_ACPI_TABLE) += efi_acpi.o > obj-$(CONFIG_GENERATE_SMBIOS_TABLE) += efi_smbios.o > diff --git a/lib/efi_loader/efi_acpi.c b/lib/efi_loader/efi_acpi.c > new file mode 100644 > index 0000000..b09292c > --- /dev/null > +++ b/lib/efi_loader/efi_acpi.c > @@ -0,0 +1,42 @@ > +// SPDX-License-Identifier: GPL-2.0+ > +/* > + * EFI application ACPI tables support > + * > + * Copyright (C) 2018, Bin Meng <bmeng...@gmail.com> > + */ > + > +#include <common.h> > +#include <efi_loader.h> > +#include <asm/acpi_table.h> > + > +static const efi_guid_t acpi_guid = ACPI_20_TABLE_GUID; > + > +/* > + * Install the ACPI table as a configuration table. > + * > + * @return status code > + */ > +efi_status_t efi_acpi_register(void) > +{ > + /* Map within the low 32 bits, to allow for 32bit ACPI tables */ > + u64 acpi = U32_MAX; > + efi_status_t ret; > + > + /* Reserve 64kiB page for ACPI */ > + ret = efi_allocate_pages(EFI_ALLOCATE_MAX_ADDRESS, > + EFI_RUNTIME_SERVICES_DATA, 16, &acpi); > + if (ret != EFI_SUCCESS) > + return ret; > + > + /* > + * Generate ACPI tables - we know that efi_allocate_pages() returns > + * a 4k-aligned address, so it is safe to assume that > + * write_acpi_tables() will write the table at that address. > + */ > + assert(!(acpi & 0xf)); > + write_acpi_tables(acpi); > + > + /* And expose them to our EFI payload */ > + return efi_install_configuration_table(&acpi_guid, > + (void *)(uintptr_t)acpi);
The maximum number of configuration tables is currently hard coded as 2 in efi_boottime.c. I think this limit should be raised. 16 seems reasonable looking at which tables the Linux EFI stub or iPXE can process. In lib/efi_loader/helloworld.c we output the installed configuration tables. Please, add the ACPI 2.0 table there too. This will allow future testing in Travis CI. Best regards Heinrich > +} > _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot