diff options
-rw-r--r-- | src/parisc/parisc.c | 29 |
1 files changed, 24 insertions, 5 deletions
diff --git a/src/parisc/parisc.c b/src/parisc/parisc.c index 862fd6f..4317460 100644 --- a/src/parisc/parisc.c +++ b/src/parisc/parisc.c @@ -499,7 +499,8 @@ int DEV_is_serial_device(hppa_device_t *dev) { BUG_ON(!dev); if (dev->pci) - return (dev->pci->class == PCI_CLASS_COMMUNICATION_SERIAL); + return (dev->pci->class == PCI_CLASS_COMMUNICATION_SERIAL || + dev->pci->class == PCI_CLASS_COMMUNICATION_MULTISERIAL); return ((dev->iodc->type & 0xf) == 0x0a); /* HPHW_FIO */ } @@ -2933,7 +2934,8 @@ static void find_serial_pci_card(void) { struct pci_device *pci; hppa_device_t *pdev; - u32 pmem; + unsigned long pmem; + char mm_mapped; if (!has_astro) /* use built-in LASI serial port for console */ return; @@ -2945,9 +2947,26 @@ static void find_serial_pci_card(void) dprintf(1, "PCI: Enabling %pP for primary SERIAL PORT\n", pci); pci_config_maskw(pci->bdf, PCI_COMMAND, 0, PCI_COMMAND_IO | PCI_COMMAND_MEMORY); - pmem = pci_enable_iobar(pci, PCI_BASE_ADDRESS_0); - dprintf(1, "PCI: Enabling %pP for primary SERIAL PORT mem %x\n", pci, pmem); - pmem += IOS_DIST_BASE_ADDR; + /* prefer memory-mapped I/O. Required for GSP for 64-bit HP-UX 11 */ + mm_mapped = 1; + pmem = 0; + if (!pmem && !(pci_config_readl(pci->bdf, PCI_BASE_ADDRESS_0) & PCI_BASE_ADDRESS_SPACE_IO) + && (pci_config_readl(pci->bdf, PCI_BASE_ADDRESS_0) & PCI_BASE_ADDRESS_MEM_MASK)) + pmem = (uintptr_t) pci_enable_membar(pci, PCI_BASE_ADDRESS_0); + if (!pmem && !(pci_config_readl(pci->bdf, PCI_BASE_ADDRESS_1) & PCI_BASE_ADDRESS_SPACE_IO) + && (pci_config_readl(pci->bdf, PCI_BASE_ADDRESS_1) & PCI_BASE_ADDRESS_MEM_MASK)) + pmem = (uintptr_t) pci_enable_membar(pci, PCI_BASE_ADDRESS_1); + if (!pmem) { + mm_mapped = 0; + if (pci_config_readl(pci->bdf, PCI_BASE_ADDRESS_0) & PCI_BASE_ADDRESS_SPACE_IO) + pmem = pci_enable_iobar(pci, PCI_BASE_ADDRESS_0); + else + pmem = pci_enable_iobar(pci, PCI_BASE_ADDRESS_1); + } + dprintf(1, "PCI: Enabling %pP for primary SERIAL PORT %s %lx\n", + pci, mm_mapped ? "mem":"i/o", pmem); + if (!mm_mapped) + pmem += IOS_DIST_BASE_ADDR; /* set serial port for console output and keyboard input */ pdev = &hppa_pci_devices[0]; |