summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew Green <mrg@NetBSD.org>2014-07-26 22:09:30 +0200
committerThomas Klausner <wiz@NetBSD.org>2014-08-30 22:45:18 +0200
commitb7e42643d2ee6521cf23e6dfe49a8369ba4bf9bb (patch)
treec4f07446084612802f7425db2d8ab111d85a1d52
parent1654a0462723b3b75d7a4a20bedfc653cc3e1f1a (diff)
Implement the kernel_has_driver() method for NetBSD.
This has the benefit of stopping the "vesa" driver from loading on hardware that has been claimed by a kernel driver and thus shouldn't be using "vesa". Reviewed-by: Matthieu Herrb <matthieu@herrb.eu> Signed-off-by: Thomas Klausner <wiz@NetBSD.org>
-rw-r--r--src/netbsd_pci.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/src/netbsd_pci.c b/src/netbsd_pci.c
index e6dae4c..52591b0 100644
--- a/src/netbsd_pci.c
+++ b/src/netbsd_pci.c
@@ -843,6 +843,29 @@ pci_device_netbsd_unmap_legacy(struct pci_device *dev, void *addr,
return pci_device_netbsd_unmap_range(dev, &map);
}
+static int
+pci_device_netbsd_has_kernel_driver(struct pci_device *dev)
+{
+#ifdef PCI_IOC_DRVNAME
+ /*
+ * NetBSD PCI_IOC_DRVNAME appears at the same time as pci_drvname(3)
+ */
+ char drvname[16];
+
+ if (dev->bus >= nbuses)
+ return 0;
+
+ /*
+ * vga(4) should be considered "not bound".
+ */
+ if (pci_drvname(buses[dev->bus].fd, dev->dev, dev->func,
+ drvname, sizeof drvname) == 0 &&
+ strncmp(drvname, "vga", 3) != 0)
+ return 1;
+#endif
+ return 0;
+}
+
static const struct pci_system_methods netbsd_pci_methods = {
.destroy = pci_system_netbsd_destroy,
.destroy_device = NULL,
@@ -867,6 +890,7 @@ static const struct pci_system_methods netbsd_pci_methods = {
.write8 = pci_device_netbsd_write8,
.map_legacy = pci_device_netbsd_map_legacy,
.unmap_legacy = pci_device_netbsd_unmap_legacy,
+ .has_kernel_driver = pci_device_netbsd_has_kernel_driver,
};
int