From 11b4d6a2bcd7b9c18b81b38388b7d7c851fb9da3 Mon Sep 17 00:00:00 2001 From: kamkow1 Date: Sat, 29 Nov 2025 23:54:12 +0100 Subject: [PATCH] QEMU PCI testdev driver --- kernel/Makefile | 1 + kernel/pci/pci.c | 2 ++ kernel/pci/qemu/testdev/testdev.c | 36 +++++++++++++++++++++++++++++++ kernel/pci/qemu/testdev/testdev.h | 6 ++++++ 4 files changed, 45 insertions(+) create mode 100644 kernel/pci/qemu/testdev/testdev.c create mode 100644 kernel/pci/qemu/testdev/testdev.h diff --git a/kernel/Makefile b/kernel/Makefile index 02ceafe..0e00004 100644 --- a/kernel/Makefile +++ b/kernel/Makefile @@ -71,6 +71,7 @@ SRCFILES += $(call GRABSRC, \ pci \ pci/ata \ pci/serial \ + pci/qemu/testdev \ cjob \ ) diff --git a/kernel/pci/pci.c b/kernel/pci/pci.c index 790d680..8905abe 100644 --- a/kernel/pci/pci.c +++ b/kernel/pci/pci.c @@ -3,6 +3,7 @@ #include "pci/pci.h" #include "pci/ata/ata.h" #include "pci/serial/serial.h" +#include "pci/qemu/testdev/testdev.h" #include "io/io.h" #include "std/string.h" #include "util/util.h" @@ -194,6 +195,7 @@ PciDev pci_getdev(uint16_t vendorid, uint16_t deviceid, int devtype) { PciInitFn PCI_INIT_ARRAY[PCI_INIT_ARRAY_MAX] = { &pci_ata_init, &pci_serial_init, + &pci_qemu_testdev_init, }; void pci_init_devs(void) { diff --git a/kernel/pci/qemu/testdev/testdev.c b/kernel/pci/qemu/testdev/testdev.c new file mode 100644 index 0000000..fcd8a47 --- /dev/null +++ b/kernel/pci/qemu/testdev/testdev.c @@ -0,0 +1,36 @@ +#include +#include +#include "pci/qemu/testdev/testdev.h" +#include "pci/pci.h" +#include "vmm/vmm.h" +#include "bootinfo/bootinfo.h" +#include "std/string.h" +#include "kprintf.h" + +// REF: https://www.qemu.org/docs/master/specs/pci-testdev.html + +#define TAG "qemu-testdev" + +typedef struct { + PciBar bar0, bar1, bar2; +} QemuTestDev; + +QemuTestDev PCI_QEMU_TESTDEV; + +void pci_qemu_testdev_init(void) { + PciDev dev = pci_getdev(0x1B36, 0x0005, -1); + if (!dev.bits) { + return; + } + + uint8_t progif = pci_read8(dev, PCI_PROGIF); + LOG("pci/"TAG, "progif=0x%02x\n", progif); + + pci_getbar(dev, &PCI_QEMU_TESTDEV.bar0, PCI_BAR0); + pci_getbar(dev, &PCI_QEMU_TESTDEV.bar1, PCI_BAR1); + pci_getbar(dev, &PCI_QEMU_TESTDEV.bar2, PCI_BAR2); + + PCI_LOG_BAR(TAG, PCI_QEMU_TESTDEV.bar0, 0); + PCI_LOG_BAR(TAG, PCI_QEMU_TESTDEV.bar1, 1); + PCI_LOG_BAR(TAG, PCI_QEMU_TESTDEV.bar2, 2); +} diff --git a/kernel/pci/qemu/testdev/testdev.h b/kernel/pci/qemu/testdev/testdev.h new file mode 100644 index 0000000..d0febb4 --- /dev/null +++ b/kernel/pci/qemu/testdev/testdev.h @@ -0,0 +1,6 @@ +#ifndef PCI_QEMU_TESTDEV_TESTDEV_H_ +#define PCI_QEMU_TESTDEV_TESTDEV_H_ + +void pci_qemu_testdev_init(void); + +#endif // PCI_QEMU_TESTDEV_TESTDEV_H_