ARM/PCI, designware, xilinx: Use pci_scan_root_bus_msi()
authorLorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Wed, 29 Jul 2015 11:33:18 +0000 (12:33 +0100)
committerBjorn Helgaas <bhelgaas@google.com>
Thu, 20 Aug 2015 17:02:50 +0000 (12:02 -0500)
ARM previously stored the msi_controller pointer in its sysdata, struct
pci_sys_data, and implemented pcibios_msi_controller() to retrieve it.
That made PCI host controller drivers specific to ARM because they had to
put the msi_controller pointer in the ARM-specific pci_sys_data.

There is now a generic mechanism, pci_scan_root_bus_msi(), for giving the
msi_controller pointer to the PCI core.  Use this for all ARM systems and
for the DesignWare and Xilinx PCI host controller drivers.

This removes an ARM dependency from the DesignWare, DRA7xx, EXYNOS, i.MX6,
Keystone, Layerscape, SPEAr13xx, and Xilinx drivers.

[bhelgaas: changelog, split into separate patch]
Suggested-by: Russell King <linux@arm.linux.org.uk>
Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Acked-by: Jingoo Han <jingoohan1@gmail.com>
CC: Pratyush Anand <pratyush.anand@gmail.com>
CC: Arnd Bergmann <arnd@arndb.de>
CC: Simon Horman <horms@verge.net.au>
CC: Russell King <linux@arm.linux.org.uk>
CC: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
CC: Thierry Reding <thierry.reding@gmail.com>
CC: Michal Simek <michal.simek@xilinx.com>
CC: Marc Zyngier <marc.zyngier@arm.com>
arch/arm/include/asm/mach/pci.h
arch/arm/kernel/bios32.c
drivers/pci/host/pcie-designware.c
drivers/pci/host/pcie-xilinx.c

index 28b9bb35949e08a93bdcf940d125cedbe6c55b63..c074e7a319e732ce46cd7d52c9ce94dbba6fedfa 100644 (file)
@@ -19,9 +19,7 @@ struct pci_bus;
 struct device;
 
 struct hw_pci {
-#ifdef CONFIG_PCI_MSI
        struct msi_controller *msi_ctrl;
-#endif
        struct pci_ops  *ops;
        int             nr_controllers;
        void            **private_data;
index 4e95260efb39ba103c4141e00785a429898838b0..283bc1c7b5027b20bcad060b7a990a33543d1b3c 100644 (file)
@@ -486,8 +486,9 @@ static void pcibios_init_hw(struct device *parent, struct hw_pci *hw,
                        if (hw->scan)
                                sys->bus = hw->scan(nr, sys);
                        else
-                               sys->bus = pci_scan_root_bus(parent, sys->busnr,
-                                               hw->ops, sys, &sys->resources);
+                               sys->bus = pci_scan_root_bus_msi(parent,
+                                       sys->busnr, hw->ops, sys,
+                                       &sys->resources, hw->msi_ctrl);
 
                        if (WARN(!sys->bus, "PCI: unable to scan bus!")) {
                                kfree(sys);
index 69486be7181e18287a8a8bd421055b902233e3c4..fe11cc175f7747574f074ba265bc821e7f938c99 100644 (file)
@@ -526,7 +526,6 @@ int dw_pcie_host_init(struct pcie_port *pp)
 
 #ifdef CONFIG_PCI_MSI
        dw_pcie_msi_chip.dev = pp->dev;
-       dw_pci.msi_ctrl = &dw_pcie_msi_chip;
 #endif
 
        dw_pci.nr_controllers = 1;
@@ -708,8 +707,15 @@ static struct pci_bus *dw_pcie_scan_bus(int nr, struct pci_sys_data *sys)
        struct pcie_port *pp = sys_to_pcie(sys);
 
        pp->root_bus_nr = sys->busnr;
-       bus = pci_scan_root_bus(pp->dev, sys->busnr,
-                                 &dw_pcie_ops, sys, &sys->resources);
+
+       if (IS_ENABLED(CONFIG_PCI_MSI))
+               bus = pci_scan_root_bus_msi(pp->dev, sys->busnr, &dw_pcie_ops,
+                                           sys, &sys->resources,
+                                           &dw_pcie_msi_chip);
+       else
+               bus = pci_scan_root_bus(pp->dev, sys->busnr, &dw_pcie_ops,
+                                       sys, &sys->resources);
+
        if (!bus)
                return NULL;
 
index f1a06a091ccb578359656b1d9c4b32c0e99b2d99..38d3114b97d320e0805ec86932553c77ffdd1cba 100644 (file)
@@ -647,9 +647,15 @@ static struct pci_bus *xilinx_pcie_scan_bus(int nr, struct pci_sys_data *sys)
        struct pci_bus *bus;
 
        port->root_busno = sys->busnr;
-       bus = pci_scan_root_bus(port->dev, sys->busnr, &xilinx_pcie_ops,
-                               sys, &sys->resources);
 
+       if (IS_ENABLED(CONFIG_PCI_MSI))
+               bus = pci_scan_root_bus_msi(port->dev, sys->busnr,
+                                           &xilinx_pcie_ops, sys,
+                                           &sys->resources,
+                                           &xilinx_pcie_msi_chip);
+       else
+               bus = pci_scan_root_bus(port->dev, sys->busnr,
+                                       &xilinx_pcie_ops, sys, &sys->resources);
        return bus;
 }
 
@@ -847,7 +853,6 @@ static int xilinx_pcie_probe(struct platform_device *pdev)
 
 #ifdef CONFIG_PCI_MSI
        xilinx_pcie_msi_chip.dev = port->dev;
-       hw.msi_ctrl = &xilinx_pcie_msi_chip;
 #endif
        pci_common_init_dev(dev, &hw);