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> Reviewed-on: https://review.coreboot.org/c/coreboot/+/57366 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Nico Huber <nico.h@gmx.de> Reviewed-by: Tim Wawrzynczak <twawrzynczak@chromium.org> Reviewed-by: Felix Held <felix-coreboot@felixheld.de>
This commit is contained in:
parent
869e90a3d4
commit
6a73b2466f
|
@ -1213,6 +1213,16 @@ static int smbios_generate_type9_from_devtree(struct device *dev, int *handle,
|
||||||
dev->path.pci.devfn);
|
dev->path.pci.devfn);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int get_smbios_data(struct device *dev, int *handle, unsigned long *current)
|
||||||
|
{
|
||||||
|
int len = 0;
|
||||||
|
|
||||||
|
len += smbios_generate_type9_from_devtree(dev, handle, current);
|
||||||
|
len += smbios_generate_type41_from_devtree(dev, handle, current);
|
||||||
|
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
|
||||||
static int smbios_walk_device_tree(struct device *tree, int *handle, unsigned long *current)
|
static int smbios_walk_device_tree(struct device *tree, int *handle, unsigned long *current)
|
||||||
{
|
{
|
||||||
struct device *dev;
|
struct device *dev;
|
||||||
|
@ -1222,9 +1232,9 @@ static int smbios_walk_device_tree(struct device *tree, int *handle, unsigned lo
|
||||||
if (dev->enabled && dev->ops && dev->ops->get_smbios_data) {
|
if (dev->enabled && dev->ops && dev->ops->get_smbios_data) {
|
||||||
printk(BIOS_INFO, "%s (%s)\n", dev_path(dev), dev_name(dev));
|
printk(BIOS_INFO, "%s (%s)\n", dev_path(dev), dev_name(dev));
|
||||||
len += dev->ops->get_smbios_data(dev, handle, current);
|
len += dev->ops->get_smbios_data(dev, handle, current);
|
||||||
|
} else {
|
||||||
|
len += get_smbios_data(dev, handle, current);
|
||||||
}
|
}
|
||||||
len += smbios_generate_type9_from_devtree(dev, handle, current);
|
|
||||||
len += smbios_generate_type41_from_devtree(dev, handle, current);
|
|
||||||
}
|
}
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
|
@ -386,6 +386,8 @@ static int ipmi_smbios_data(struct device *dev, int *handle,
|
||||||
register_spacing,
|
register_spacing,
|
||||||
0); // no IRQ
|
0); // no IRQ
|
||||||
|
|
||||||
|
len += get_smbios_data(dev, handle, current);
|
||||||
|
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -9,6 +9,9 @@
|
||||||
|
|
||||||
static int smbios_write_intel_wifi(struct device *dev, int *handle, unsigned long *current)
|
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_type_intel_wifi {
|
||||||
struct smbios_header header;
|
struct smbios_header header;
|
||||||
u8 str;
|
u8 str;
|
||||||
|
@ -29,10 +32,9 @@ static int smbios_write_intel_wifi(struct device *dev, int *handle, unsigned lon
|
||||||
|
|
||||||
int smbios_write_wifi_pcie(struct device *dev, int *handle, unsigned long *current)
|
int smbios_write_wifi_pcie(struct device *dev, int *handle, unsigned long *current)
|
||||||
{
|
{
|
||||||
if (dev->vendor == PCI_VENDOR_ID_INTEL)
|
int len = smbios_write_intel_wifi(dev, handle, current);
|
||||||
return smbios_write_intel_wifi(dev, handle, current);
|
len += get_smbios_data(dev, handle, current);
|
||||||
|
return len;
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int smbios_write_wifi_cnvi(struct device *dev, int *handle, unsigned long *current)
|
int smbios_write_wifi_cnvi(struct device *dev, int *handle, unsigned long *current)
|
||||||
|
|
|
@ -35,6 +35,9 @@ int smbios_write_type41(unsigned long *current, int *handle,
|
||||||
const char *name, u8 instance, u16 segment,
|
const char *name, u8 instance, u16 segment,
|
||||||
u8 bus, u8 device, u8 function, u8 device_type);
|
u8 bus, u8 device, u8 function, u8 device_type);
|
||||||
|
|
||||||
|
struct device;
|
||||||
|
int get_smbios_data(struct device *dev, int *handle, unsigned long *current);
|
||||||
|
|
||||||
const char *smbios_system_manufacturer(void);
|
const char *smbios_system_manufacturer(void);
|
||||||
const char *smbios_system_product_name(void);
|
const char *smbios_system_product_name(void);
|
||||||
const char *smbios_system_serial_number(void);
|
const char *smbios_system_serial_number(void);
|
||||||
|
|
Loading…
Reference in New Issue