smbios: Expose in efi_loader as table
authorAlexander Graf <agraf@suse.de>
Thu, 18 Aug 2016 23:23:29 +0000 (01:23 +0200)
committerAlexander Graf <agraf@suse.de>
Wed, 19 Oct 2016 07:01:52 +0000 (09:01 +0200)
We can pass SMBIOS easily as EFI configuration table to an EFI payload. This
patch adds enablement for that case.

While at it, we also enable SMBIOS generation for ARM systems, since they support
EFI_LOADER.

Signed-off-by: Alexander Graf <agraf@suse.de>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
cmd/bootefi.c
include/efi_api.h
include/efi_loader.h
include/smbios.h
lib/Kconfig
lib/efi_loader/Makefile
lib/efi_loader/efi_smbios.c [new file with mode: 0644]
lib/smbios.c

index 38c3b419f2309f0e12e33736af51f233110dea49..aa5a01e3a619e6f768a0c818cd8c5eec86b1bcbb 100644 (file)
@@ -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();
index f572b8807983610851456d50893add1e1842ebae..bdb600e08d7ff9924207940d14d96f8121b9263c 100644 (file)
@@ -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;
index 56b2b4719a80bdb6bf45b7964b64b8bb9c4ed580..1bc3b3357cf83d21bfded6529d7bff63e42a9b99 100644 (file)
@@ -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);
index 3cbc687604716c055cef8e01faac6108dede49ec..d582d4f7abb2c9258509450cf042da85d9e1f549 100644 (file)
@@ -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 {
index 4c098c064e76d40c6ceef2ff207513fb8b8e7556..b16062fbe33364204efc8a06ca9b68597281ef70 100644 (file)
@@ -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
index 2a3849e31b9597fb93d45b8fca10cc7ca8c97348..12159dd5ce84a03535e789a15a55b6388d404e41 100644 (file)
@@ -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 (file)
index 0000000..ac412e7
--- /dev/null
@@ -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);
+}
index 09a90cae83053e1902eaa4737b40e20061c7dc19..237f5f05fd529ac870138c77f788467855604d5c 100644 (file)
@@ -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;