summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Moffett <ian@osmora.org>2025-09-18 16:22:34 -0400
committerIan Moffett <ian@osmora.org>2025-09-18 16:22:34 -0400
commitd400ddd723ffb96040bda7a5944374cdaeff1ee6 (patch)
tree7fcd1131b04fe2ba98e44b47bbc56aa97a4d566e
parentdceb243a1a50364d5510ae4495ac2def8d3536ee (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.h2
-rw-r--r--src/sys/io/pci/pci.c20
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);
}