Thread (57 messages) 57 messages, 11 authors, 2015-06-23

[RFC 2/4] PCI: generic: Add support for ARM64 and MSI(x)

From: Lorenzo Pieralisi <hidden>
Date: 2014-09-30 12:03:56
Also in: linux-devicetree, linux-pci, lkml

On Mon, Sep 29, 2014 at 03:36:30PM +0100, Arnd Bergmann wrote:
On Sunday 28 September 2014 15:53:28 suravee.suthikulpanit at amd.com wrote:
quoted
+
+#ifdef CONFIG_ARM64
+struct pci_bus *gen_scan_root_bus(struct device *parent, int bus,
+                                      struct pci_ops *ops, void *sysdata,
+                                      struct list_head *resources)
+{
I don't see anything ARM64 specific in this, the function only uses
the newly added generic helpers.
I do not see it either, it is just a copy'n'paste of common PCI code,
plus msi management.
quoted
 static int gen_pci_probe(struct platform_device *pdev)
 {
@@ -326,6 +385,7 @@ static int gen_pci_probe(struct platform_device *pdev)
        struct device *dev = &pdev->dev;
        struct device_node *np = dev->of_node;
        struct gen_pci *pci = devm_kzalloc(dev, sizeof(*pci), GFP_KERNEL);
+#ifndef CONFIG_ARM64
        struct hw_pci hw = {
                .nr_controllers = 1,
                .private_data   = (void **)&pci,
@@ -333,6 +393,7 @@ static int gen_pci_probe(struct platform_device *pdev)
                .map_irq        = of_irq_parse_and_map_pci,
                .ops            = &gen_pci_ops,
        };
+#endif
 
Same here, I'd suggest marking this "#ifdef CONFIG_ARM" instead, as hw_pci
is an arm32 specific data structure.
I do not think we need hw struct at all, see below, we can write code so
that we do not rely on ARM32 PCI bios, I will have a stab at that and
post the resulting code.
quoted
        if (!pci)
                return -ENOMEM;
@@ -368,8 +429,24 @@ static int gen_pci_probe(struct platform_device *pdev)
                gen_pci_release_of_pci_ranges(pci);
                return err;
        }
+#ifdef CONFIG_ARM64
 
+#ifdef CONFIG_PCI_MSI
+       pci->msi_parent = of_parse_phandle(np, "msi-parent", 0);
+       if (!pci->msi_parent) {
+               dev_err(&pdev->dev, "Failed to allocate msi-parent.\n");
+               return -EINVAL;
+       }
+#endif
We probably want to enable MSI unconditionally on ARM64, so the #ifdef is
not necessary here. However, I don't think that a missing msi-parent should
be a fatal error here: we can still continue without MSI support if this
case.
quoted
+       if (!gen_scan_root_bus(&pdev->dev, pci->cfg.bus_range.start,
+                              &gen_pci_ops, pci, &pci->resources)) {
+               dev_err(&pdev->dev, "failed to enable PCIe ports\n");
+               return -ENODEV;
+       }
+#else
        pci_common_init_dev(dev, &hw);
+#endif /* CONFIG_ARM64 */
Again, just make the pci_common_init_dev() call #ifdef CONFIG_ARM, and move
the generic case after it, outside of the #ifdef.
I went through the code quickly but I think we can (and should) remove
this quite ugly ifdeffery altogether. Most of the functionality in
pci_common_init_dev() can be implemented through the common PCI API (and this
would make this driver arch agnostic as it should be), I will go through ARM32
PCI bios code to check what is executed in detail in pci_common_init_dev() and
make sure that we follow those initialization steps in the resulting probe code
for this PCI generic host controller driver.

Lorenzo
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help