Angel Pons has uploaded this change for review.

View Change

SMBIOS: Allow skipping default SMBIOS generation

The call to the `get_smbios_data` device operation is followed by
calls to unconditional default functions, which lacks flexibility.
Instead, have devices that implement `get_smbios_data` call these
default functions as needed.

Most `get_smbios_data` implementations are in mainboard code, and are
bound to the root device. The default functions only operate with PCI
devices because of the `dev->path.type != DEVICE_PATH_PCI` checks, so
calling these functions for non-PCI devices is unnecessary. QEMU also
implements `get_smbios_data` but binds it to the domain device, which
isn't PCI either.

Change-Id: Iefbf072b1203d04a98c9d26a30f22cfebe769eb4
Signed-off-by: Angel Pons <th3fanbus@gmail.com>
---
M src/arch/x86/smbios.c
M src/drivers/ipmi/ipmi_kcs_ops.c
M src/drivers/wifi/generic/smbios.c
M src/include/smbios.h
4 files changed, 23 insertions(+), 10 deletions(-)

git pull ssh://review.coreboot.org:29418/coreboot refs/changes/66/57366/1
diff --git a/src/arch/x86/smbios.c b/src/arch/x86/smbios.c
index 2625cb6..687d9a1 100644
--- a/src/arch/x86/smbios.c
+++ b/src/arch/x86/smbios.c
@@ -1130,8 +1130,8 @@
}
}

-static int smbios_generate_type41_from_devtree(struct device *dev, int *handle,
- unsigned long *current)
+int smbios_generate_type41_from_devtree(struct device *dev, int *handle,
+ unsigned long *current)
{
static u8 type41_inst_cnt[SMBIOS_DEVICE_TYPE_COUNT + 1] = {};

@@ -1161,8 +1161,8 @@
device_type);
}

-static int smbios_generate_type9_from_devtree(struct device *dev, int *handle,
- unsigned long *current)
+int smbios_generate_type9_from_devtree(struct device *dev, int *handle,
+ unsigned long *current)
{
enum misc_slot_usage usage;
enum slot_data_bus_bandwidth bandwidth;
@@ -1220,9 +1220,10 @@
if (dev->enabled && dev->ops && dev->ops->get_smbios_data) {
printk(BIOS_INFO, "%s (%s)\n", dev_path(dev), dev_name(dev));
len += dev->ops->get_smbios_data(dev, handle, current);
+ } else {
+ len += smbios_generate_type9_from_devtree(dev, handle, current);
+ len += smbios_generate_type41_from_devtree(dev, handle, current);
}
- len += smbios_generate_type9_from_devtree(dev, handle, current);
- len += smbios_generate_type41_from_devtree(dev, handle, current);
}
return len;
}
diff --git a/src/drivers/ipmi/ipmi_kcs_ops.c b/src/drivers/ipmi/ipmi_kcs_ops.c
index 9d1cac8..22c5280 100644
--- a/src/drivers/ipmi/ipmi_kcs_ops.c
+++ b/src/drivers/ipmi/ipmi_kcs_ops.c
@@ -386,6 +386,9 @@
register_spacing,
0); // no IRQ

+ len += smbios_generate_type9_from_devtree(dev, handle, current);
+ len += smbios_generate_type41_from_devtree(dev, handle, current);
+
return len;
}
#endif
diff --git a/src/drivers/wifi/generic/smbios.c b/src/drivers/wifi/generic/smbios.c
index 793349d..e02acc5 100644
--- a/src/drivers/wifi/generic/smbios.c
+++ b/src/drivers/wifi/generic/smbios.c
@@ -9,6 +9,9 @@

static int smbios_write_intel_wifi(struct device *dev, int *handle, unsigned long *current)
{
+ if (dev->vendor != PCI_VENDOR_ID_INTEL)
+ return 0;
+
struct smbios_type_intel_wifi {
struct smbios_header header;
u8 str;
@@ -29,10 +32,10 @@

int smbios_write_wifi_pcie(struct device *dev, int *handle, unsigned long *current)
{
- if (dev->vendor == PCI_VENDOR_ID_INTEL)
- return smbios_write_intel_wifi(dev, handle, current);
-
- return 0;
+ int len = smbios_write_intel_wifi(dev, handle, current);
+ len += smbios_generate_type9_from_devtree(dev, handle, current);
+ len += smbios_generate_type41_from_devtree(dev, handle, current);
+ return len;
}

int smbios_write_wifi_cnvi(struct device *dev, int *handle, unsigned long *current)
diff --git a/src/include/smbios.h b/src/include/smbios.h
index a98023b..187331a 100644
--- a/src/include/smbios.h
+++ b/src/include/smbios.h
@@ -35,6 +35,12 @@
const char *name, u8 instance, u16 segment,
u8 bus, u8 device, u8 function, u8 device_type);

+struct device;
+int smbios_generate_type9_from_devtree(struct device *dev, int *handle,
+ unsigned long *current);
+int smbios_generate_type41_from_devtree(struct device *dev, int *handle,
+ unsigned long *current);
+
const char *smbios_system_manufacturer(void);
const char *smbios_system_product_name(void);
const char *smbios_system_serial_number(void);

To view, visit change 57366. To unsubscribe, or for help writing mail filters, visit settings.

Gerrit-Project: coreboot
Gerrit-Branch: master
Gerrit-Change-Id: Iefbf072b1203d04a98c9d26a30f22cfebe769eb4
Gerrit-Change-Number: 57366
Gerrit-PatchSet: 1
Gerrit-Owner: Angel Pons <th3fanbus@gmail.com>
Gerrit-MessageType: newchange