• Paul Mackerras's avatar
    [POWERPC] Cope with PCI host bridge I/O window not starting at 0 · 11fbb00c
    Paul Mackerras authored
    Currently our code to set up the data structures for a PCI host bridge
    and create the mapping for its I/O window assumes that the window
    starts at I/O port 0 on the PCI side.  If this is not true, we can end
    up with I/O port numbers in the resources for PCI devices which will
    cause an oops if a driver tries to access them via inb/outb etc.,
    because there is no mapping for the corresponding addresses.
    
    Normally the I/O window starts at 0, but there are some situations on
    partitioned machines with a hypervisor where the window may not start
    at 0.
    
    This fixes the problem by allocating space for the range from 0 to the
    end of the I/O window.  That is, hose->io_base_virt contains the
    virtual address for I/O port 0 on the PCI bus, and thus the assumption
    that hose->io_base_virt - pci_io_base is the offset between the
    "global" I/O port numbers (those in the PCI device resources) and the
    I/O port numbers on the PCI bus is maintained.
    
    For PCI host bridges that are present at boot, we only map the portion
    of that range that correspond to the bridge's I/O window.  For bridges
    added after boot we ioremap the range from 0 to the end of the I/O
    window, for now; in fact hot-added bridges should be using
    reserve_phb_iospace() and __ioremap_explicit (so they get sensible
    global port numbers), but we don't have the infrastructure yet to do
    that (basically a free_phb_iospace() routine plus appropriate
    locking).
    
    Interestingly, this makes the two arms of the if statement in
    get_bus_io_range do almost exactly the same thing; that function could
    now be simplified in a further patch.
    Signed-off-by: default avatarPaul Mackerras <paulus@samba.org>
    11fbb00c
pci_64.c 37.8 KB