• Thomas Petazzoni's avatar
    PCI: mvebu: Call pci_ioremap_io() at startup instead of dynamically · 31e45ec3
    Thomas Petazzoni authored
    The mvebu PCI host controller driver uses an emulated PCI-to-PCI bridge to
    leverage the core PCI kernel enumeration logic to dynamically create and
    remove the MBus windows needed to access the memory and I/O regions of each
    PCI interface.
    
    In the context of this PCI-to-PCI bridge emulation, the driver emulates
    all reads and writes to the PCI bridge registers.  Upon a write to the
    registers configuring the I/O base and limit, the driver was creating the
    MBus window and calling pci_ioremap_io() to setup the mapping.
    
    However, it turns out that accesses to these registers are made in an IRQ
    disabled context, while pci_ioremap_io() is a potentially sleeping
    function.  Not only this is wrong, but it is causing fairly loud warnings
    at boot time when the appropriate kernel hacking options are enabled.
    
    This patch solves this by moving the pci_ioremap_io() call to the startup
    of the driver.  At this point, we don't know how many PCI interfaces will
    be enabled, so we are simply remapping the entire PCI I/O space to virtual
    addresses.  This is reasonable since this I/O space is limited to 1 MB in
    size, and also because the MBus windows continue to be created in a dynamic
    fashion only when devices need them.
    Signed-off-by: default avatarThomas Petazzoni <thomas.petazzoni@free-electrons.com>
    Signed-off-by: default avatarBjorn Helgaas <bhelgaas@google.com>
    31e45ec3
pci-mvebu.c 26 KB