From mboxrd@z Thu Jan 1 00:00:00 1970 From: Simon Glass Date: Fri, 12 Aug 2016 11:20:18 -0600 Subject: [U-Boot] [PATCH 5/7] smbios: Expose in efi_loader as table In-Reply-To: <1470665194-19619-6-git-send-email-agraf@suse.de> References: <1470665194-19619-1-git-send-email-agraf@suse.de> <1470665194-19619-6-git-send-email-agraf@suse.de> Message-ID: List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de Hi Alex, On 8 August 2016 at 08:06, Alexander Graf wrote: > 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 > --- > 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 53a6ee3..e241b7d 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 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..b9aa741 100644 > --- a/lib/smbios.c > +++ b/lib/smbios.c > @@ -7,10 +7,13 @@ > */ > > #include > +#include > #include > #include > #include > +#ifdef CONFIG_X86 > #include > +#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 This should become a parameter I think. Since you are making this into generic code, it should avoid arch-specific #ifdefs. > 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 Can this function go into the efi_loader directory instead? > + > +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 > -- > 2.6.6 > Regards, Simon