forked from pool/u-boot
36c65f2eed
1 OBS-URL: https://build.opensuse.org/request/show/419605 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/u-boot?expand=0&rev=78
193 lines
5.6 KiB
Diff
193 lines
5.6 KiB
Diff
From 0cf473210474a7b3dd11de4de82ef8fc3a2516e2 Mon Sep 17 00:00:00 2001
|
|
From: Alexander Graf <agraf@suse.de>
|
|
Date: Sun, 7 Aug 2016 13:18:56 +0200
|
|
Subject: [PATCH] smbios: Expose in efi_loader as table
|
|
|
|
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>
|
|
|
|
---
|
|
|
|
v1 -> v2:
|
|
|
|
- Fix whitespace
|
|
---
|
|
cmd/bootefi.c | 3 +++
|
|
include/efi_api.h | 4 ++++
|
|
include/efi_loader.h | 2 ++
|
|
include/smbios.h | 1 +
|
|
lib/Kconfig | 4 ++--
|
|
lib/smbios.c | 36 ++++++++++++++++++++++++++++++++++++
|
|
6 files changed, 48 insertions(+), 2 deletions(-)
|
|
|
|
diff --git a/cmd/bootefi.c b/cmd/bootefi.c
|
|
index a80ed48..ca144ff 100644
|
|
--- a/cmd/bootefi.c
|
|
+++ b/cmd/bootefi.c
|
|
@@ -204,6 +204,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 f572b88..bdb600e 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 ac8b77a..b0e8a7f 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 5962d4c..fb6396a 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 5a14530..d7f75fe 100644
|
|
--- a/lib/Kconfig
|
|
+++ b/lib/Kconfig
|
|
@@ -150,12 +150,12 @@ config SPL_OF_LIBFDT
|
|
version of the device tree.
|
|
|
|
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/smbios.c b/lib/smbios.c
|
|
index 8dfd486..4d85155 100644
|
|
--- a/lib/smbios.c
|
|
+++ b/lib/smbios.c
|
|
@@ -7,10 +7,13 @@
|
|
*/
|
|
|
|
#include <common.h>
|
|
+#include <efi_loader.h>
|
|
#include <smbios.h>
|
|
#include <tables_csum.h>
|
|
#include <version.h>
|
|
+#ifdef CONFIG_X86
|
|
#include <asm/cpu.h>
|
|
+#endif
|
|
|
|
DECLARE_GLOBAL_DATA_PTR;
|
|
|
|
@@ -79,14 +82,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;
|
|
@@ -152,6 +161,7 @@ static int smbios_write_type3(uintptr_t *current, int handle)
|
|
return len;
|
|
}
|
|
|
|
+#ifdef CONFIG_X86
|
|
static int smbios_write_type4(uintptr_t *current, int handle)
|
|
{
|
|
struct smbios_type4 *t = (struct smbios_type4 *)*current;
|
|
@@ -184,6 +194,7 @@ static int smbios_write_type4(uintptr_t *current, int handle)
|
|
|
|
return len;
|
|
}
|
|
+#endif
|
|
|
|
static int smbios_write_type32(uintptr_t *current, int handle)
|
|
{
|
|
@@ -216,7 +227,9 @@ static smbios_write_type smbios_write_funcs[] = {
|
|
smbios_write_type1,
|
|
smbios_write_type2,
|
|
smbios_write_type3,
|
|
+#ifdef CONFIG_X86
|
|
smbios_write_type4,
|
|
+#endif
|
|
smbios_write_type32,
|
|
smbios_write_type127
|
|
};
|
|
@@ -267,3 +280,26 @@ uintptr_t write_smbios_table(uintptr_t addr)
|
|
|
|
return addr;
|
|
}
|
|
+
|
|
+#ifdef CONFIG_EFI_LOADER
|
|
+
|
|
+void efi_smbios_register(void)
|
|
+{
|
|
+ static efi_guid_t smbios_guid = SMBIOS_TABLE_GUID;
|
|
+ /* 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*)dmi);
|
|
+}
|
|
+
|
|
+#endif
|