src/arch/x86: Add automatic type41 entry creation
SMBIOS Type41 Entries will be automatically created. Type 41 entries define attributes of the onboard devices. Change-Id: Idcb3532a5c05666d6613af4f303df85f4f1f6e97 Signed-off-by: Christian Walter <christian.walter@9elements.com> Reviewed-on: https://review.coreboot.org/c/coreboot/+/32910 Reviewed-by: Philipp Deppenwiese <zaolin.daisuki@gmail.com> Reviewed-by: Patrick Rudolph <siro@das-labor.org> Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
This commit is contained in:
parent
3b4d0e060c
commit
9e5b06297d
|
@ -30,6 +30,9 @@
|
|||
#include <memory_info.h>
|
||||
#include <spd.h>
|
||||
#include <cbmem.h>
|
||||
#include <device/pci_ids.h>
|
||||
#include <device/pci_def.h>
|
||||
#include <device/pci.h>
|
||||
#if CONFIG(CHROMEOS)
|
||||
#include <vendorcode/google/chromeos/gnvs.h>
|
||||
#endif
|
||||
|
@ -50,6 +53,41 @@ static u8 smbios_checksum(u8 *p, u32 length)
|
|||
return -ret;
|
||||
}
|
||||
|
||||
/* Get the device type 41 from the dev struct */
|
||||
static u8 smbios_get_device_type_from_dev(struct device *dev)
|
||||
{
|
||||
u16 pci_basesubclass = (dev->class >> 8) & 0xFFFF;
|
||||
|
||||
switch (pci_basesubclass) {
|
||||
case PCI_CLASS_NOT_DEFINED:
|
||||
return SMBIOS_DEVICE_TYPE_OTHER;
|
||||
case PCI_CLASS_DISPLAY_VGA:
|
||||
case PCI_CLASS_DISPLAY_XGA:
|
||||
case PCI_CLASS_DISPLAY_3D:
|
||||
case PCI_CLASS_DISPLAY_OTHER:
|
||||
return SMBIOS_DEVICE_TYPE_VIDEO;
|
||||
case PCI_CLASS_STORAGE_SCSI:
|
||||
return SMBIOS_DEVICE_TYPE_SCSI;
|
||||
case PCI_CLASS_NETWORK_ETHERNET:
|
||||
return SMBIOS_DEVICE_TYPE_ETHERNET;
|
||||
case PCI_CLASS_NETWORK_TOKEN_RING:
|
||||
return SMBIOS_DEVICE_TYPE_TOKEN_RING;
|
||||
case PCI_CLASS_MULTIMEDIA_VIDEO:
|
||||
case PCI_CLASS_MULTIMEDIA_AUDIO:
|
||||
case PCI_CLASS_MULTIMEDIA_PHONE:
|
||||
case PCI_CLASS_MULTIMEDIA_OTHER:
|
||||
return SMBIOS_DEVICE_TYPE_SOUND;
|
||||
case PCI_CLASS_STORAGE_ATA:
|
||||
return SMBIOS_DEVICE_TYPE_PATA;
|
||||
case PCI_CLASS_STORAGE_SATA:
|
||||
return SMBIOS_DEVICE_TYPE_SATA;
|
||||
case PCI_CLASS_STORAGE_SAS:
|
||||
return SMBIOS_DEVICE_TYPE_SAS;
|
||||
default:
|
||||
return SMBIOS_DEVICE_TYPE_UNKNOWN;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int smbios_add_string(u8 *start, const char *str)
|
||||
{
|
||||
|
@ -999,6 +1037,38 @@ static int smbios_write_type127(unsigned long *current, int handle)
|
|||
return len;
|
||||
}
|
||||
|
||||
/* Generate Type41 entries from devicetree */
|
||||
static int smbios_walk_device_tree_type41(struct device *dev, int *handle,
|
||||
unsigned long *current)
|
||||
{
|
||||
static u8 type41_inst_cnt[SMBIOS_DEVICE_TYPE_COUNT + 1] = {};
|
||||
|
||||
if (dev->path.type != DEVICE_PATH_PCI)
|
||||
return 0;
|
||||
if (!dev->on_mainboard)
|
||||
return 0;
|
||||
|
||||
u8 device_type = smbios_get_device_type_from_dev(dev);
|
||||
|
||||
if (device_type == SMBIOS_DEVICE_TYPE_OTHER ||
|
||||
device_type == SMBIOS_DEVICE_TYPE_UNKNOWN)
|
||||
return 0;
|
||||
|
||||
if (device_type > SMBIOS_DEVICE_TYPE_COUNT)
|
||||
return 0;
|
||||
|
||||
const char *name = get_pci_subclass_name(dev);
|
||||
|
||||
return smbios_write_type41(current, handle,
|
||||
name, // name
|
||||
type41_inst_cnt[device_type]++, // inst
|
||||
0, // segment
|
||||
dev->bus->secondary, //bus
|
||||
PCI_SLOT(dev->path.pci.devfn), // device
|
||||
PCI_FUNC(dev->path.pci.devfn), // func
|
||||
device_type);
|
||||
}
|
||||
|
||||
/* Generate Type9 entries from devicetree */
|
||||
static int smbios_walk_device_tree_type9(struct device *dev, int *handle,
|
||||
unsigned long *current)
|
||||
|
@ -1062,6 +1132,7 @@ static int smbios_walk_device_tree(struct device *tree, int *handle,
|
|||
len += dev->ops->get_smbios_data(dev, handle, current);
|
||||
}
|
||||
len += smbios_walk_device_tree_type9(dev, handle, current);
|
||||
len += smbios_walk_device_tree_type41(dev, handle, current);
|
||||
}
|
||||
return len;
|
||||
}
|
||||
|
|
|
@ -18,7 +18,9 @@
|
|||
#define PCI_CLASS_STORAGE_FLOPPY 0x0102
|
||||
#define PCI_CLASS_STORAGE_IPI 0x0103
|
||||
#define PCI_CLASS_STORAGE_RAID 0x0104
|
||||
#define PCI_CLASS_STORAGE_ATA 0x0105
|
||||
#define PCI_CLASS_STORAGE_SATA 0x0106
|
||||
#define PCI_CLASS_STORAGE_SAS 0x0107
|
||||
#define PCI_CLASS_STORAGE_OTHER 0x0180
|
||||
|
||||
#define PCI_BASE_CLASS_NETWORK 0x02
|
||||
|
|
|
@ -756,6 +756,8 @@ typedef enum {
|
|||
SMBIOS_DEVICE_TYPE_SAS,
|
||||
} smbios_onboard_device_type;
|
||||
|
||||
#define SMBIOS_DEVICE_TYPE_COUNT 10
|
||||
|
||||
struct smbios_type41 {
|
||||
u8 type;
|
||||
u8 length;
|
||||
|
|
Loading…
Reference in New Issue