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

<div style="display:none"> Gerrit-Project: coreboot </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: I66b4c4658da9d44941430d8040384d022d76f51e </div>
<div style="display:none"> Gerrit-Change-Number: 25386 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Patrick Rudolph <patrick.rudolph@9elements.com> </div>
<div style="display:none"> Gerrit-Reviewer: Patrick Rudolph <siro@das-labor.org> </div>