From d400ddd723ffb96040bda7a5944374cdaeff1ee6 Mon Sep 17 00:00:00 2001 From: Ian Moffett Date: Thu, 18 Sep 2025 16:22:34 -0400 Subject: kern: pci: Implement device list as TAILQ Signed-off-by: Ian Moffett --- src/sys/io/pci/pci.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) (limited to 'src/sys/io') diff --git a/src/sys/io/pci/pci.c b/src/sys/io/pci/pci.c index fcb5a8b..49046c8 100644 --- a/src/sys/io/pci/pci.c +++ b/src/sys/io/pci/pci.c @@ -30,10 +30,13 @@ #include #include #include +#include #include #include +#include #include #include +#include #if defined(__PCI_MAX_BUS) #define PCI_MAX_BUS __PCI_MAX_BUS @@ -44,6 +47,7 @@ #define PCI_MAX_BUS 1 #endif /* __PCI_MAX_BUS */ +static TAILQ_HEAD(, pci_device) devlist; static struct cam_hook cam; /* @@ -53,6 +57,7 @@ static struct cam_hook cam; static void pci_register_dev(struct pci_device *dev) { + struct pci_device *devp; pcireg_t vend_dev; uint16_t device_id; uint16_t vendor_id; @@ -88,6 +93,17 @@ pci_register_dev(struct pci_device *dev) dev->bus, dev->slot, dev->func ); + + /* Allocate a seperate one to queue */ + devp = kalloc(sizeof(*devp)); + if (devp == NULL) { + printf("pci_register_dev: failed to alloc devp\n"); + return; + } + + /* Queue a copy */ + memcpy(devp, dev, sizeof(*devp)); + TAILQ_INSERT_TAIL(&devlist, devp, link); } /* @@ -159,6 +175,7 @@ pci_writel(struct pci_device *dp, pcireg_t reg, uint32_t v) void pci_init_bus(void) { + struct pci_device *dp; int error; error = pci_cam_init(&cam); @@ -168,7 +185,10 @@ pci_init_bus(void) } printf("pci: enumerating %d buses\n", PCI_MAX_BUS); + TAILQ_INIT(&devlist); for (int i = 0; i < PCI_MAX_BUS; ++i) { pci_enum_bus(i); } + + printf("bridge: detected %d devices\n", devlist.nelem); } -- cgit v1.2.3