• Ivan Kokshaysky's avatar
    [PATCH] PCI: fix bug in pci_setup_bridge() · 530ca2f1
    Ivan Kokshaysky authored
    This bug prevents Alphas with older firmware from booting if there
    is a card with PCI-PCI bridge that supports 32-bit IO.
    This has happened on AS2100 with a quad-tulip card, for example:
     - initially, the I/O window of 21152 bridge was 0x10000-0x10fff,
       as set up by firmware;
     - pci_setup_bridge() is going to change this, say, to 0xa000-0xafff:
       first, it updates PCI_IO_BASE_UPPER16 and PCI_IO_LIMIT_UPPER16
       registers, so that IO window temporarily is at 0x0000-0x0fff,
       which effectively blocks up all legacy IO ports in the lower
       4K range, such as serial, floppy, RTC an so on;
       does debugging printk - machine dies here with recursive
       machine checks as the serial console has gone.
    
    Moving (or disabling) the debugging printk is not a solution -
    there is possibility that timer interrupt (which might access RTC
    ports) occurs between writes to lower and upper parts of the
    base/limit registers.
    
    The patch temporarily disables the IO window of the bridge by
    setting PCI_IO_BASE_UPPER16 > PCI_IO_LIMIT_UPPER16 before doing
    an update. It's safe, as we don't have any active IO behind
    the bridge at this point. Also, it's a NOP for bridges with
    16-bit-only IO.
    Similar (but simpler, as we always clear upper 32 bits) fix
    for 64-bit prefetchable MMIO range.
    530ca2f1
setup-bus.c 15.3 KB