diff options
author | Matthew Green <mrg@NetBSD.org> | 2014-07-26 22:09:30 +0200 |
---|---|---|
committer | Thomas Klausner <wiz@NetBSD.org> | 2014-08-30 22:45:18 +0200 |
commit | b7e42643d2ee6521cf23e6dfe49a8369ba4bf9bb (patch) | |
tree | c4f07446084612802f7425db2d8ab111d85a1d52 | |
parent | 1654a0462723b3b75d7a4a20bedfc653cc3e1f1a (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.c | 24 |
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 |