aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Petazzoni <thomas.petazzoni@free-electrons.com>2013-12-26 10:52:41 -0500
committerBjorn Helgaas <bhelgaas@google.com>2014-01-02 16:36:24 -0500
commit31e45ec3a4e73dcbeb51e03ab559812ba3e82cc2 (patch)
treef16697d5fabcd481b2b569a26c0065d74ce1120e
parent339135ff1b5fca9a323ca7af67cebefedf50d4e7 (diff)
PCI: mvebu: Call pci_ioremap_io() at startup instead of dynamically
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: Thomas Petazzoni <thomas.petazzoni@free-electrons.com> Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
-rw-r--r--drivers/pci/host/pci-mvebu.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/drivers/pci/host/pci-mvebu.c b/drivers/pci/host/pci-mvebu.c
index afd2af04980c..18057905689a 100644
--- a/drivers/pci/host/pci-mvebu.c
+++ b/drivers/pci/host/pci-mvebu.c
@@ -342,8 +342,6 @@ static void mvebu_pcie_handle_iobase_change(struct mvebu_pcie_port *port)
342 mvebu_mbus_add_window_remap_by_id(port->io_target, port->io_attr, 342 mvebu_mbus_add_window_remap_by_id(port->io_target, port->io_attr,
343 port->iowin_base, port->iowin_size, 343 port->iowin_base, port->iowin_size,
344 iobase); 344 iobase);
345
346 pci_ioremap_io(iobase, port->iowin_base);
347} 345}
348 346
349static void mvebu_pcie_handle_membase_change(struct mvebu_pcie_port *port) 347static void mvebu_pcie_handle_membase_change(struct mvebu_pcie_port *port)
@@ -988,6 +986,10 @@ static int mvebu_pcie_probe(struct platform_device *pdev)
988 } 986 }
989 987
990 pcie->nports = i; 988 pcie->nports = i;
989
990 for (i = 0; i < (IO_SPACE_LIMIT - SZ_64K); i += SZ_64K)
991 pci_ioremap_io(i, pcie->io.start + i);
992
991 mvebu_pcie_msi_enable(pcie); 993 mvebu_pcie_msi_enable(pcie);
992 mvebu_pcie_enable(pcie); 994 mvebu_pcie_enable(pcie);
993 995