Hello Patrick Rudolph,
I'd like you to do a code review. Please visit
https://review.coreboot.org/25386
to review the following change.
Change subject: src/x86/smbios: Add support for table 38 ......................................................................
src/x86/smbios: Add support for table 38
Add support for table 38 and use it on HP Compaq 8200 Elite SFF.
Tested on HP Compaq 8200. dmidecode prints the table and sensors-detect scans for IPMI compatible devices.
Change-Id: I66b4c4658da9d44941430d8040384d022d76f51e Signed-off-by: Patrick Rudolph siro@das-labor.org --- M src/arch/x86/smbios.c M src/include/smbios.h M src/mainboard/hp/compaq_8200_elite_sff/mainboard.c 3 files changed, 66 insertions(+), 0 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/86/25386/1
diff --git a/src/arch/x86/smbios.c b/src/arch/x86/smbios.c index 7079374..4365166 100644 --- a/src/arch/x86/smbios.c +++ b/src/arch/x86/smbios.c @@ -4,6 +4,7 @@ * Copyright (C) 2015 Timothy Pearson tpearson@raptorengineeringinc.com, * Raptor Engineering * Copyright (C) 2011 Sven Schnelle svens@stackframe.org + * Copyright (C) 2018 Patrick Rudolph siro@das-labor.org * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as @@ -618,6 +619,33 @@ return len; }
+int smbios_write_type38(unsigned long *current, int *handle, + const enum smbios_bmc_interface_type interface_type, + const u8 ipmi_rev, const u8 i2c_addr, const u8 nv_addr, + const u64 base_addr, const u8 base_modifier, + const u8 irq) +{ + struct smbios_type38 *t = (struct smbios_type38 *)*current; + int len = sizeof(struct smbios_type38); + + memset(t, 0, sizeof(struct smbios_type38)); + t->type = SMBIOS_IPMI_DEVICE_INFORMATION; + t->handle = *handle; + t->length = len - 2; + t->interface_type = interface_type; + t->ipmi_rev = ipmi_rev; + t->i2c_slave_addr = i2c_addr; + t->nv_storage_addr = nv_addr; + t->base_address = base_addr; + t->base_address_modifier = base_modifier; + t->irq = irq; + + *current += len; + *handle += 1; + + return len; +} + int smbios_write_type41(unsigned long *current, int *handle, const char *name, u8 instance, u16 segment, u8 bus, u8 device, u8 function) diff --git a/src/include/smbios.h b/src/include/smbios.h index 8fe507e..631a1a5 100644 --- a/src/include/smbios.h +++ b/src/include/smbios.h @@ -26,6 +26,12 @@ int smbios_string_table_len(u8 *start);
/* Used by mainboard to add an on-board device */ +enum smbios_bmc_interface_type; +int smbios_write_type38(unsigned long *current, int *handle, + const enum smbios_bmc_interface_type interface_type, + const u8 ipmi_rev, const u8 i2c_addr, const u8 nv_addr, + const u64 base_addr, const u8 base_modifier, + const u8 irq); int smbios_write_type41(unsigned long *current, int *handle, const char *name, u8 instance, u16 segment, u8 bus, u8 device, u8 function); @@ -216,6 +222,7 @@ SMBIOS_MEMORY_DEVICE = 17, SMBIOS_MEMORY_ARRAY_MAPPED_ADDRESS = 19, SMBIOS_SYSTEM_BOOT_INFORMATION = 32, + SMBIOS_IPMI_DEVICE_INFORMATION = 38, SMBIOS_ONBOARD_DEVICES_EXTENDED_INFORMATION = 41, SMBIOS_END_OF_TABLE = 127, } smbios_struct_type_t; @@ -497,6 +504,13 @@ u8 irq; } __packed;
+enum smbios_bmc_interface_type { + SMBIOS_BMC_INTERFACE_UNKNOWN = 0, + SMBIOS_BMC_INTERFACE_KCS, + SMBIOS_BMC_INTERFACE_SMIC, + SMBIOS_BMC_INTERFACE_BLOCK, +}; + typedef enum { SMBIOS_DEVICE_TYPE_OTHER = 0x01, SMBIOS_DEVICE_TYPE_UNKNOWN, diff --git a/src/mainboard/hp/compaq_8200_elite_sff/mainboard.c b/src/mainboard/hp/compaq_8200_elite_sff/mainboard.c index 7ad4aa6..84f7449 100644 --- a/src/mainboard/hp/compaq_8200_elite_sff/mainboard.c +++ b/src/mainboard/hp/compaq_8200_elite_sff/mainboard.c @@ -17,12 +17,36 @@ #include <device/device.h> #include <drivers/intel/gma/int15.h> #include <southbridge/intel/bd82x6x/pch.h> +#include <smbios.h> + +#if IS_ENABLED(CONFIG_GENERATE_SMBIOS_TABLES) +static int mainboard_smbios_data(device_t dev, int *handle, + unsigned long *current) +{ + int len = 0; + + len += smbios_write_type38( + current, handle, + SMBIOS_BMC_INTERFACE_KCS, + 0x20, // IMPI Version + 0x20, // I2C address + 0xff, // no NV storage + 0xca2 | 1, // IO port interface address + 0, + 0); // no IRQ + + return len; +} +#endif
static void mainboard_enable(device_t dev) { install_intel_vga_int15_handler(GMA_INT15_ACTIVE_LFP_NONE, GMA_INT15_PANEL_FIT_DEFAULT, GMA_INT15_BOOT_DISPLAY_DEFAULT, 0); +#if IS_ENABLED(CONFIG_GENERATE_SMBIOS_TABLES) + dev->ops->get_smbios_data = mainboard_smbios_data; +#endif }
struct chip_operations mainboard_ops = {