Angel Pons has uploaded this change for review. ( https://review.coreboot.org/c/coreboot/+/57366 )
Change subject: SMBIOS: Allow skipping default SMBIOS generation ......................................................................
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);