summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorIan Moffett <ian@osmora.org>2025-10-11 16:53:43 -0400
committerIan Moffett <ian@osmora.org>2025-10-11 16:53:43 -0400
commit2692a66b0956434df1411cb9c95aaa5e7a7e4e70 (patch)
tree58619bb4f280a3776a087a7db425fec4d7335d45 /src
parentf0b15b392130a89b071985bb7ec21a5b4ff8158b (diff)
kern: pci: Get programming interface from device
Some devices are identified by very specific programming interfaces, therefore this is important to have. Signed-off-by: Ian Moffett <ian@osmora.org>
Diffstat (limited to 'src')
-rw-r--r--src/sys/include/io/pci/pci.h2
-rw-r--r--src/sys/io/pci/pci.c3
2 files changed, 5 insertions, 0 deletions
diff --git a/src/sys/include/io/pci/pci.h b/src/sys/include/io/pci/pci.h
index cab29aa..fbdead1 100644
--- a/src/sys/include/io/pci/pci.h
+++ b/src/sys/include/io/pci/pci.h
@@ -60,6 +60,7 @@ typedef uint32_t pcival_t;
* @bus: Bus number of device
* @slot: Slot number of device
* @func: Function number of device
+ * @prog_if: Programming interface
* @vendor: Vendor ID
* @device: Device ID
* @bar: Base address registers
@@ -68,6 +69,7 @@ struct pci_device {
uint16_t bus;
uint8_t slot;
uint8_t func;
+ uint8_t prog_if;
uint8_t class;
uint8_t subclass;
uint16_t vendor;
diff --git a/src/sys/io/pci/pci.c b/src/sys/io/pci/pci.c
index 76ab616..a21b1e8 100644
--- a/src/sys/io/pci/pci.c
+++ b/src/sys/io/pci/pci.c
@@ -115,6 +115,7 @@ pci_register_dev(struct pci_device *dev)
pcireg_t vend_dev;
uint32_t classrev;
uint8_t class, subclass;
+ uint8_t prog_if;
uint16_t device_id;
uint16_t vendor_id;
@@ -131,6 +132,7 @@ pci_register_dev(struct pci_device *dev)
classrev = pci_readl(dev, PCIREG_CLASSREV);
class = PCIREG_CLASS(classrev);
subclass = PCIREG_SUBCLASS(classrev);
+ prog_if = PCIREG_PROGIF(classrev);
/* Does this device exist? */
if (vendor_id == 0xFFFF) {
@@ -141,6 +143,7 @@ pci_register_dev(struct pci_device *dev)
dev->device = device_id;
dev->class = class;
dev->subclass = subclass;
+ dev->prog_if = prog_if;
/* Set up base address registers */
dev->bar[0] = pci_readl(dev, PCIREG_BAR0);