diff options
-rw-r--r-- | src/arch/x86/smbios.c | 28 | ||||
-rw-r--r-- | src/include/smbios.h | 14 | ||||
-rw-r--r-- | src/mainboard/hp/compaq_8200_elite_sff/mainboard.c | 25 |
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 = { |