| @@ -831,50 +831,74 @@ pci_device_netbsd_map_legacy(struct pci_ | | | @@ -831,50 +831,74 @@ pci_device_netbsd_map_legacy(struct pci_ |
831 | | | 831 | |
832 | static int | | 832 | static int |
833 | pci_device_netbsd_unmap_legacy(struct pci_device *dev, void *addr, | | 833 | pci_device_netbsd_unmap_legacy(struct pci_device *dev, void *addr, |
834 | pciaddr_t size) | | 834 | pciaddr_t size) |
835 | { | | 835 | { |
836 | struct pci_device_mapping map; | | 836 | struct pci_device_mapping map; |
837 | | | 837 | |
838 | map.memory = addr; | | 838 | map.memory = addr; |
839 | map.size = size; | | 839 | map.size = size; |
840 | map.flags = 0; | | 840 | map.flags = 0; |
841 | return pci_device_netbsd_unmap_range(dev, &map); | | 841 | return pci_device_netbsd_unmap_range(dev, &map); |
842 | } | | 842 | } |
843 | | | 843 | |
| | | 844 | static int |
| | | 845 | pci_device_netbsd_has_kernel_driver(struct pci_device *dev) |
| | | 846 | { |
| | | 847 | #ifdef PCI_IOC_DRVNAME |
| | | 848 | /* |
| | | 849 | * NetBSD PCI_IOC_DRVNAME appears at the same time as pci_drvname(3) |
| | | 850 | */ |
| | | 851 | char drvname[16]; |
| | | 852 | |
| | | 853 | if (dev->bus >= nbuses) |
| | | 854 | return 0; |
| | | 855 | |
| | | 856 | /* |
| | | 857 | * vga(4) should be considered "not bound". |
| | | 858 | */ |
| | | 859 | if (pci_drvname(buses[dev->bus].fd, dev->dev, dev->func, |
| | | 860 | drvname, sizeof drvname) == 0 && |
| | | 861 | strncmp(drvname, "vga", 3) != 0) |
| | | 862 | return 1; |
| | | 863 | #endif |
| | | 864 | return 0; |
| | | 865 | } |
| | | 866 | |
844 | static const struct pci_system_methods netbsd_pci_methods = { | | 867 | static const struct pci_system_methods netbsd_pci_methods = { |
845 | .destroy = pci_system_netbsd_destroy, | | 868 | .destroy = pci_system_netbsd_destroy, |
846 | .destroy_device = NULL, | | 869 | .destroy_device = NULL, |
847 | .read_rom = pci_device_netbsd_read_rom, | | 870 | .read_rom = pci_device_netbsd_read_rom, |
848 | .probe = pci_device_netbsd_probe, | | 871 | .probe = pci_device_netbsd_probe, |
849 | .map_range = pci_device_netbsd_map_range, | | 872 | .map_range = pci_device_netbsd_map_range, |
850 | .unmap_range = pci_device_netbsd_unmap_range, | | 873 | .unmap_range = pci_device_netbsd_unmap_range, |
851 | .read = pci_device_netbsd_read, | | 874 | .read = pci_device_netbsd_read, |
852 | .write = pci_device_netbsd_write, | | 875 | .write = pci_device_netbsd_write, |
853 | .fill_capabilities = pci_fill_capabilities_generic, | | 876 | .fill_capabilities = pci_fill_capabilities_generic, |
854 | #if defined(WSDISPLAYIO_GET_BUSID) | | 877 | #if defined(WSDISPLAYIO_GET_BUSID) |
855 | .boot_vga = pci_device_netbsd_boot_vga, | | 878 | .boot_vga = pci_device_netbsd_boot_vga, |
856 | #else | | 879 | #else |
857 | .boot_vga = NULL, | | 880 | .boot_vga = NULL, |
858 | #endif | | 881 | #endif |
859 | .open_legacy_io = pci_device_netbsd_open_legacy_io, | | 882 | .open_legacy_io = pci_device_netbsd_open_legacy_io, |
860 | .read32 = pci_device_netbsd_read32, | | 883 | .read32 = pci_device_netbsd_read32, |
861 | .read16 = pci_device_netbsd_read16, | | 884 | .read16 = pci_device_netbsd_read16, |
862 | .read8 = pci_device_netbsd_read8, | | 885 | .read8 = pci_device_netbsd_read8, |
863 | .write32 = pci_device_netbsd_write32, | | 886 | .write32 = pci_device_netbsd_write32, |
864 | .write16 = pci_device_netbsd_write16, | | 887 | .write16 = pci_device_netbsd_write16, |
865 | .write8 = pci_device_netbsd_write8, | | 888 | .write8 = pci_device_netbsd_write8, |
866 | .map_legacy = pci_device_netbsd_map_legacy, | | 889 | .map_legacy = pci_device_netbsd_map_legacy, |
867 | .unmap_legacy = pci_device_netbsd_unmap_legacy, | | 890 | .unmap_legacy = pci_device_netbsd_unmap_legacy, |
| | | 891 | .has_kernel_driver = pci_device_netbsd_has_kernel_driver, |
868 | }; | | 892 | }; |
869 | | | 893 | |
870 | int | | 894 | int |
871 | pci_system_netbsd_create(void) | | 895 | pci_system_netbsd_create(void) |
872 | { | | 896 | { |
873 | struct pci_device_private *device; | | 897 | struct pci_device_private *device; |
874 | int bus, dev, func, ndevs, nfuncs, domain, pcifd; | | 898 | int bus, dev, func, ndevs, nfuncs, domain, pcifd; |
875 | uint32_t reg; | | 899 | uint32_t reg; |
876 | char netbsd_devname[32]; | | 900 | char netbsd_devname[32]; |
877 | struct pciio_businfo businfo; | | 901 | struct pciio_businfo businfo; |
878 | | | 902 | |
879 | pci_sys = calloc(1, sizeof(struct pci_system)); | | 903 | pci_sys = calloc(1, sizeof(struct pci_system)); |
880 | | | 904 | |