Index: sys/dev/uart/uart_core.c =================================================================== --- sys/dev/uart/uart_core.c +++ sys/dev/uart/uart_core.c @@ -47,6 +47,8 @@ #include #include +#include + #include #include #include @@ -557,8 +559,13 @@ sc->sc_bas.busy_detect = !!(quirks & UART_F_BUSY_DETECT); SLIST_FOREACH(sysdev, &uart_sysdevs, next) { - if (chan == sysdev->bas.chan && - uart_cpu_eqres(&sc->sc_bas, &sysdev->bas)) { + if (chan != sysdev->bas.chan) + continue; + if (uart_cpu_eqres(&sc->sc_bas, &sysdev->bas) || + (sysdev->pci_info.valid && + strcmp(devclass_get_name(device_get_devclass(device_get_parent(dev))), "pci") == 0 && + sysdev->pci_info.bus == pci_get_bus(dev) && + sysdev->pci_info.slot == pci_get_slot(dev))) { /* XXX check if ops matches class. */ sc->sc_sysdev = sysdev; sysdev->bas.rclk = sc->sc_bas.rclk; Index: sys/dev/uart/uart_cpu.h =================================================================== --- sys/dev/uart/uart_cpu.h +++ sys/dev/uart/uart_cpu.h @@ -52,6 +52,15 @@ extern bus_space_tag_t uart_bus_space_io; extern bus_space_tag_t uart_bus_space_mem; +/* + * PCI bus address used for matching devices. + */ +struct uart_pci_info { + uint8_t bus; + uint8_t slot; + uint8_t valid; +}; + /* * Console and debug port device info. */ @@ -72,6 +81,7 @@ void *cookie; /* Type dependent use. */ struct mtx *hwmtx; struct uart_softc *sc; /* valid only from start of attach */ + struct uart_pci_info pci_info; }; int uart_cpu_eqres(struct uart_bas *, struct uart_bas *); Index: sys/dev/uart/uart_cpu_acpi.c =================================================================== --- sys/dev/uart/uart_cpu_acpi.c +++ sys/dev/uart/uart_cpu_acpi.c @@ -182,6 +182,11 @@ (int)spcr->BaudRate); goto out; } + if (spcr->PciVendorId != 0xffff || spcr->PciDeviceId != 0xffff) { + di->pci_info.bus = spcr->PciBus; + di->pci_info.slot = spcr->PciDevice; + di->pci_info.valid = 1; + } /* Apply device tweaks. */ if ((cd->cd_quirks & UART_F_IGNORE_SPCR_REGSHFT) ==