diff --git a/cmd/bootefi.c b/cmd/bootefi.c index 38c3b419f2309f0e12e33736af51f233110dea49..aa5a01e3a619e6f768a0c818cd8c5eec86b1bcbb 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 f572b8807983610851456d50893add1e1842ebae..bdb600e08d7ff9924207940d14d96f8121b9263c 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 56b2b4719a80bdb6bf45b7964b64b8bb9c4ed580..1bc3b3357cf83d21bfded6529d7bff63e42a9b99 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 3cbc687604716c055cef8e01faac6108dede49ec..d582d4f7abb2c9258509450cf042da85d9e1f549 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 4c098c064e76d40c6ceef2ff207513fb8b8e7556..b16062fbe33364204efc8a06ca9b68597281ef70 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 2a3849e31b9597fb93d45b8fca10cc7ca8c97348..12159dd5ce84a03535e789a15a55b6388d404e41 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 0000000000000000000000000000000000000000..ac412e7362a95e8fb62eb86cf67d53a38df6bc12 --- /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 09a90cae83053e1902eaa4737b40e20061c7dc19..237f5f05fd529ac870138c77f788467855604d5c 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;