aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHelge Deller <deller@gmx.de>2024-03-10 13:30:04 +0100
committerHelge Deller <deller@gmx.de>2024-05-15 15:50:06 +0200
commitfef96b40422fbeb9cd4221941ef804081113a3b5 (patch)
tree6d2458cea2e9506eccce2f94b0b4c13f981e4b19
parent495a7f932b1ac16dc555e97c86d7ae50519ae92e (diff)
downloadseabios-hppa-fef96b40422fbeb9cd4221941ef804081113a3b5.zip
seabios-hppa-fef96b40422fbeb9cd4221941ef804081113a3b5.tar.gz
seabios-hppa-fef96b40422fbeb9cd4221941ef804081113a3b5.tar.bz2
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 <deller@gmx.de>
-rw-r--r--src/parisc/parisc.c29
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];