libpayload/libpci: Introduce device class attribute in pci_dev

The device class is read at different places and it is read from the
hardware directly. Therefore, and in preparation to CB:46416, introduce
the device class attribute in the pci_dev struct. With this, there is
only one interaction with the hardware and it's also more user friendly.

Change-Id: I5d56be96f3f0da471246f031ea619e3df8e54cfb
Signed-off-by: Felix Singer <felix.singer@secunet.com>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/46347
Reviewed-by: Nico Huber <nico.h@gmx.de>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
diff --git a/payloads/libpayload/include/pci/pci.h b/payloads/libpayload/include/pci/pci.h
index 8c11d6b..7ec9491 100644
--- a/payloads/libpayload/include/pci/pci.h
+++ b/payloads/libpayload/include/pci/pci.h
@@ -74,6 +74,7 @@
 	u16 domain;
 	u8 bus, dev, func;
 	u16 vendor_id, device_id;
+	u16 device_class;
 	struct pci_dev *next;
 };
 
diff --git a/payloads/libpayload/libpci/libpci.c b/payloads/libpayload/libpci/libpci.c
index 3e3513c..200ae18 100644
--- a/payloads/libpayload/libpci/libpci.c
+++ b/payloads/libpayload/libpci/libpci.c
@@ -178,6 +178,7 @@
 		dev->func = func;
 		dev->vendor_id = val & 0xffff;
 		dev->device_id = (uint16_t)(val >> 16);
+		dev->device_class = pci_read_config16(PCI_DEV(bus, slot, func), PCI_CLASS_DEVICE);
 		dev->next = 0;
 
 		hdr = pci_read_config8(PCI_DEV(bus, slot, func),