diff options
| -rw-r--r-- | cmd/bootefi.c | 3 | ||||
| -rw-r--r-- | include/efi_api.h | 4 | ||||
| -rw-r--r-- | include/efi_loader.h | 2 | ||||
| -rw-r--r-- | include/smbios.h | 1 | ||||
| -rw-r--r-- | lib/Kconfig | 4 | ||||
| -rw-r--r-- | lib/efi_loader/Makefile | 1 | ||||
| -rw-r--r-- | lib/efi_loader/efi_smbios.c | 32 | ||||
| -rw-r--r-- | lib/smbios.c | 6 | 
8 files changed, 51 insertions, 2 deletions
| diff --git a/cmd/bootefi.c b/cmd/bootefi.c index 38c3b419f23..aa5a01e3a61 100644 --- a/cmd/bootefi.c +++ b/cmd/bootefi.c @@ -205,6 +205,9 @@ static unsigned long do_bootefi_exec(void *efi, void *fdt)  	if (!memcmp(bootefi_device_path[0].str, "N\0e\0t", 6))  		loaded_image_info.device_handle = nethandle;  #endif +#ifdef CONFIG_GENERATE_SMBIOS_TABLE +	efi_smbios_register(); +#endif  	/* Initialize EFI runtime services */  	efi_reset_system_init(); diff --git a/include/efi_api.h b/include/efi_api.h index f572b880798..bdb600e08d7 100644 --- a/include/efi_api.h +++ b/include/efi_api.h @@ -201,6 +201,10 @@ struct efi_runtime_services {  	EFI_GUID(0xb1b621d5, 0xf19c, 0x41a5, \  		 0x83, 0x0b, 0xd9, 0x15, 0x2c, 0x69, 0xaa, 0xe0) +#define SMBIOS_TABLE_GUID \ +	EFI_GUID(0xeb9d2d31, 0x2d88, 0x11d3,  \ +		 0x9a, 0x16, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d) +  struct efi_configuration_table  {  	efi_guid_t guid; diff --git a/include/efi_loader.h b/include/efi_loader.h index 56b2b4719a8..1bc3b3357cf 100644 --- a/include/efi_loader.h +++ b/include/efi_loader.h @@ -85,6 +85,8 @@ int efi_disk_register(void);  int efi_gop_register(void);  /* Called by bootefi to make the network interface available */  int efi_net_register(void **handle); +/* Called by bootefi to make SMBIOS tables available */ +void efi_smbios_register(void);  /* Called by networking code to memorize the dhcp ack package */  void efi_net_set_dhcp_ack(void *pkt, int len); diff --git a/include/smbios.h b/include/smbios.h index 3cbc6876047..d582d4f7abb 100644 --- a/include/smbios.h +++ b/include/smbios.h @@ -55,6 +55,7 @@ struct __packed smbios_entry {  #define BIOS_CHARACTERISTICS_SELECTABLE_BOOT	(1 << 16)  #define BIOS_CHARACTERISTICS_EXT1_ACPI		(1 << 0) +#define BIOS_CHARACTERISTICS_EXT1_UEFI		(1 << 3)  #define BIOS_CHARACTERISTICS_EXT2_TARGET	(1 << 2)  struct __packed smbios_type0 { diff --git a/lib/Kconfig b/lib/Kconfig index 4c098c064e7..b16062fbe33 100644 --- a/lib/Kconfig +++ b/lib/Kconfig @@ -164,12 +164,12 @@ config FDT_FIXUP_PARTITIONS  	  variable.  menu "System tables" -	depends on !EFI && !SYS_COREBOOT +	depends on (!EFI && !SYS_COREBOOT) || (ARM && EFI_LOADER)  config GENERATE_SMBIOS_TABLE  	bool "Generate an SMBIOS (System Management BIOS) table"  	default y -	depends on X86 +	depends on X86 || EFI_LOADER  	help  	  The System Management BIOS (SMBIOS) specification addresses how  	  motherboard and system vendors present management information about diff --git a/lib/efi_loader/Makefile b/lib/efi_loader/Makefile index 2a3849e31b9..12159dd5ce8 100644 --- a/lib/efi_loader/Makefile +++ b/lib/efi_loader/Makefile @@ -12,3 +12,4 @@ obj-y += efi_memory.o  obj-$(CONFIG_LCD) += efi_gop.o  obj-$(CONFIG_PARTITIONS) += efi_disk.o  obj-$(CONFIG_NET) += efi_net.o +obj-$(CONFIG_GENERATE_SMBIOS_TABLE) += efi_smbios.o diff --git a/lib/efi_loader/efi_smbios.c b/lib/efi_loader/efi_smbios.c new file mode 100644 index 00000000000..ac412e7362a --- /dev/null +++ b/lib/efi_loader/efi_smbios.c @@ -0,0 +1,32 @@ +/* + *  EFI application tables support + * + *  Copyright (c) 2016 Alexander Graf + * + *  SPDX-License-Identifier:     GPL-2.0+ + */ + +#include <common.h> +#include <efi_loader.h> +#include <inttypes.h> +#include <smbios.h> + +static const efi_guid_t smbios_guid = SMBIOS_TABLE_GUID; + +void efi_smbios_register(void) +{ +	/* Map within the low 32 bits, to allow for 32bit SMBIOS tables */ +	uint64_t dmi = 0xffffffff; +	/* Reserve 4kb for SMBIOS */ +	uint64_t pages = 1; +	int memtype = EFI_RUNTIME_SERVICES_DATA; + +	if (efi_allocate_pages(1, memtype, pages, &dmi) != EFI_SUCCESS) +		return; + +	/* Generate SMBIOS tables */ +	write_smbios_table(dmi); + +	/* And expose them to our EFI payload */ +	efi_install_configuration_table(&smbios_guid, (void*)(uintptr_t)dmi); +} diff --git a/lib/smbios.c b/lib/smbios.c index 09a90cae830..237f5f05fd5 100644 --- a/lib/smbios.c +++ b/lib/smbios.c @@ -83,14 +83,20 @@ static int smbios_write_type0(uintptr_t *current, int handle)  	t->vendor = smbios_add_string(t->eos, "U-Boot");  	t->bios_ver = smbios_add_string(t->eos, PLAIN_VERSION);  	t->bios_release_date = smbios_add_string(t->eos, U_BOOT_DMI_DATE); +#ifdef CONFIG_ROM_SIZE  	t->bios_rom_size = (CONFIG_ROM_SIZE / 65536) - 1; +#endif  	t->bios_characteristics = BIOS_CHARACTERISTICS_PCI_SUPPORTED |  				  BIOS_CHARACTERISTICS_SELECTABLE_BOOT |  				  BIOS_CHARACTERISTICS_UPGRADEABLE;  #ifdef CONFIG_GENERATE_ACPI_TABLE  	t->bios_characteristics_ext1 = BIOS_CHARACTERISTICS_EXT1_ACPI;  #endif +#ifdef CONFIG_EFI_LOADER +	t->bios_characteristics_ext1 |= BIOS_CHARACTERISTICS_EXT1_UEFI; +#endif  	t->bios_characteristics_ext2 = BIOS_CHARACTERISTICS_EXT2_TARGET; +  	t->bios_major_release = 0xff;  	t->bios_minor_release = 0xff;  	t->ec_major_release = 0xff; | 
