summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPatrick Rudolph <patrick.rudolph@9elements.com>2018-03-27 16:17:12 +0200
committerPhilipp Deppenwiese <zaolin.daisuki@gmail.com>2018-07-19 13:50:28 +0000
commitfe98e90671b1ff06e924ae09062814050bdb3996 (patch)
treefde13edbef37b6fc2267b20a3cab78138ee4de5f
parent53485124513a76ebe85a80f59e8dff9915f518bd (diff)
arch/x86/smbios: Add support for table 38
Add support for SMBIOS table 'IPMI Device Information' 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> Reviewed-on: https://review.coreboot.org/25386 Reviewed-by: Felix Held <felix-coreboot@felixheld.de> Reviewed-by: Philipp Deppenwiese <zaolin.daisuki@gmail.com> Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
-rw-r--r--src/arch/x86/smbios.c28
-rw-r--r--src/include/smbios.h14
-rw-r--r--src/mainboard/hp/compaq_8200_elite_sff/mainboard.c25
3 files changed, 67 insertions, 0 deletions
diff --git a/src/arch/x86/smbios.c b/src/arch/x86/smbios.c
index da1b711535..582ae8da11 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
@@ -629,6 +630,33 @@ static int smbios_write_type32(unsigned long *current, int handle)
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 8fe507ea53..631a1a59be 100644
--- a/src/include/smbios.h
+++ b/src/include/smbios.h
@@ -26,6 +26,12 @@ int smbios_add_string(u8 *start, const char *str);
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 @@ typedef enum {
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 @@ struct smbios_type38 {
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 527b0d1980..a1b5a0938d 100644
--- a/src/mainboard/hp/compaq_8200_elite_sff/mainboard.c
+++ b/src/mainboard/hp/compaq_8200_elite_sff/mainboard.c
@@ -17,12 +17,37 @@
#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(struct device *dev, int *handle,
+ unsigned long *current)
+{
+ int len = 0;
+
+ // add IPMI Device Information
+ len += smbios_write_type38(
+ current, handle,
+ SMBIOS_BMC_INTERFACE_KCS,
+ 0x20, // IPMI Version
+ 0x20, // I2C address
+ 0xff, // no NV storage
+ 0, // IO port interface address
+ 0,
+ 0); // no IRQ
+
+ return len;
+}
+#endif
static void mainboard_enable(struct device *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 = {