Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:Leap:42.2
u-boot-a20-olinuxino-lime
0013-smbios-Expose-in-efi_loader-as-tabl.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 0013-smbios-Expose-in-efi_loader-as-tabl.patch of Package u-boot-a20-olinuxino-lime
From 10a3b9fdb4cdf8d24541222bd8fb065bee88d284 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 38c3b41..aa5a01e 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 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 bb83235..40a69a6 100644 --- a/lib/Kconfig +++ b/lib/Kconfig @@ -155,12 +155,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
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor