From fef96b40422fbeb9cd4221941ef804081113a3b5 Mon Sep 17 00:00:00 2001 From: Helge Deller Date: Sun, 10 Mar 2024 13:30:04 +0100 Subject: parisc: Prefer memory-access over io-access of GSP serial port HP-UX 11.x (64-bit) seems to require memory-mapped serial ports when accessing GSP cards, so change the firmware to pre-map serial ports for memory-accesses. As an example, the rp5470 has this GSP card (Linux output): pci 0000:00:04.0: [103c:128d] type 00 class 0x088000 pci 0000:00:04.1: [103c:1048] type 00 class 0x070002 pci 0000:00:04.1: reg 0x10: [mem 0xffffffff80000000-0xffffffff80000fff] pci 0000:00:04.1: reg 0x14: [io 0x0000-0x003f] Serial: 8250/16550 driver, 4 ports, IRQ sharing enabled serial 0000:00:04.1: enabling device (0142 -> 0143) printk: console [ttyS0] disabled 0000:00:04.1: ttyS0 at MMIO 0xffffffff80000000 (irq = 70, base_baud = 115200) is a 16550A printk: console [ttyS0] enabled printk: bootconsole [ttyB0] disabled 0000:00:04.1: ttyS1 at MMIO 0xffffffff80000008 (irq = 70, base_baud = 115200) is a 16450 0000:00:04.1: ttyS2 at MMIO 0xffffffff80000010 (irq = 70, base_baud = 115200) is a 16550A 0000:00:04.1: ttyS3 at MMIO 0xffffffff80000030 (irq = 70, base_baud = 115200) is a 16550A serial 0000:00:04.1: Couldn t register serial port 0, irq 70, type 2, error -28 Signed-off-by: Helge Deller --- src/parisc/parisc.c | 29 ++++++++++++++++++++++++----- 1 file 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]; -- cgit v1.1