diff options
author | Ian Moffett <ian@osmora.org> | 2025-09-18 16:22:34 -0400 |
---|---|---|
committer | Ian Moffett <ian@osmora.org> | 2025-09-18 16:22:34 -0400 |
commit | d400ddd723ffb96040bda7a5944374cdaeff1ee6 (patch) | |
tree | 7fcd1131b04fe2ba98e44b47bbc56aa97a4d566e | |
parent | dceb243a1a50364d5510ae4495ac2def8d3536ee (diff) |
kern: pci: Implement device list as TAILQ
Signed-off-by: Ian Moffett <ian@osmora.org>
-rw-r--r-- | src/sys/include/io/pci/pci.h | 2 | ||||
-rw-r--r-- | src/sys/io/pci/pci.c | 20 |
2 files changed, 22 insertions, 0 deletions
diff --git a/src/sys/include/io/pci/pci.h b/src/sys/include/io/pci/pci.h index 8f65aa3..91fb02e 100644 --- a/src/sys/include/io/pci/pci.h +++ b/src/sys/include/io/pci/pci.h @@ -31,6 +31,7 @@ #define _PCI_PCI_H_ 1 #include <sys/types.h> +#include <sys/queue.h> /* PCI specific types */ typedef uint32_t pcireg_t; @@ -52,6 +53,7 @@ struct pci_device { uint8_t func; uint16_t vendor; uint16_t device; + TAILQ_ENTRY(pci_device) link; }; /* 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 <sys/types.h> #include <sys/param.h> #include <sys/cdefs.h> +#include <sys/queue.h> #include <sys/panic.h> #include <sys/syslog.h> +#include <os/kalloc.h> #include <io/pci/pci.h> #include <io/pci/cam.h> +#include <string.h> #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); } |