[coreboot-gerrit] Change in coreboot[master]: src/x86/smbios: Add support for table 38

Patrick Rudolph (Code Review) gerrit at coreboot.org
Tue Mar 27 16:27:31 CEST 2018


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 at 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 at raptorengineeringinc.com>,
  * Raptor Engineering
  * Copyright (C) 2011 Sven Schnelle <svens at stackframe.org>
+ * Copyright (C) 2018 Patrick Rudolph <siro at 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 = {

-- 
To view, visit https://review.coreboot.org/25386
To unsubscribe, or for help writing mail filters, visit https://review.coreboot.org/settings

Gerrit-Project: coreboot
Gerrit-Branch: master
Gerrit-MessageType: newchange
Gerrit-Change-Id: I66b4c4658da9d44941430d8040384d022d76f51e
Gerrit-Change-Number: 25386
Gerrit-PatchSet: 1
Gerrit-Owner: Patrick Rudolph <patrick.rudolph at 9elements.com>
Gerrit-Reviewer: Patrick Rudolph <siro at das-labor.org>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.coreboot.org/pipermail/coreboot-gerrit/attachments/20180327/4c92ae3c/attachment.html>


More information about the coreboot-gerrit mailing list