[U-Boot] [PATCH 3/5] efi_loader: Install ACPI configuration tables

Heinrich Schuchardt xypron.glpk at gmx.de
Sun Jun 24 10:12:04 UTC 2018


/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.cn at 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.cn at 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

> +}
> 



More information about the U-Boot mailing list