PCI: Move DT resource setup into devm_pci_alloc_host_bridge()
authorRob Herring <robh@kernel.org>
Wed, 22 Jul 2020 02:25:13 +0000 (20:25 -0600)
committerLorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Tue, 4 Aug 2020 15:36:30 +0000 (16:36 +0100)
Now that pci_parse_request_of_pci_ranges() callers just setup
pci_host_bridge.windows and dma_ranges directly and don't need the bus
range returned, we can just initialize them when allocating the
pci_host_bridge struct.

With this, pci_parse_request_of_pci_ranges() becomes a static function.

Link: https://lore.kernel.org/r/20200722022514.1283916-19-robh@kernel.org
Signed-off-by: Rob Herring <robh@kernel.org>
Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Cc: Bjorn Helgaas <bhelgaas@google.com>
24 files changed:
drivers/pci/controller/cadence/pcie-cadence-host.c
drivers/pci/controller/dwc/pcie-designware-host.c
drivers/pci/controller/mobiveil/pcie-mobiveil-host.c
drivers/pci/controller/pci-aardvark.c
drivers/pci/controller/pci-ftpci100.c
drivers/pci/controller/pci-host-common.c
drivers/pci/controller/pci-loongson.c
drivers/pci/controller/pci-rcar-gen2.c
drivers/pci/controller/pci-tegra.c
drivers/pci/controller/pci-v3-semi.c
drivers/pci/controller/pci-versatile.c
drivers/pci/controller/pci-xgene.c
drivers/pci/controller/pcie-altera.c
drivers/pci/controller/pcie-brcmstb.c
drivers/pci/controller/pcie-iproc-platform.c
drivers/pci/controller/pcie-mediatek.c
drivers/pci/controller/pcie-rcar-host.c
drivers/pci/controller/pcie-rockchip-host.c
drivers/pci/controller/pcie-xilinx-nwl.c
drivers/pci/controller/pcie-xilinx.c
drivers/pci/of.c
drivers/pci/pci.h
drivers/pci/probe.c
include/linux/pci.h

index 39a8a7a..436eb9f 100644 (file)
@@ -171,14 +171,8 @@ static int cdns_pcie_host_init_address_translation(struct cdns_pcie_rc *rc)
 static int cdns_pcie_host_init(struct device *dev,
                               struct cdns_pcie_rc *rc)
 {
-       struct pci_host_bridge *bridge = pci_host_bridge_from_priv(rc);
        int err;
 
-       /* Parse our PCI ranges and request their resources */
-       err = pci_parse_request_of_pci_ranges(dev, &bridge->windows, NULL, NULL);
-       if (err)
-               return err;
-
        err = cdns_pcie_host_init_root_port(rc);
        if (err)
                return err;
index 9775558..f9fa7b1 100644 (file)
@@ -346,11 +346,6 @@ int dw_pcie_host_init(struct pcie_port *pp)
        if (!bridge)
                return -ENOMEM;
 
-       ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows,
-                                             &bridge->dma_ranges, NULL);
-       if (ret)
-               return ret;
-
        /* Get the I/O and memory ranges from DT */
        resource_list_for_each_entry(win, &bridge->windows) {
                switch (resource_type(win->res)) {
index 7250b84..2954d6a 100644 (file)
@@ -577,14 +577,6 @@ int mobiveil_pcie_host_probe(struct mobiveil_pcie *pcie)
        if (!mobiveil_pcie_is_bridge(pcie))
                return -ENODEV;
 
-       /* parse the host bridge base addresses from the device tree file */
-       ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows,
-                                             &bridge->dma_ranges, NULL);
-       if (ret) {
-               dev_err(dev, "Getting bridge resources failed\n");
-               return ret;
-       }
-
        /*
         * configure all inbound and outbound windows and prepare the RC for
         * config access
index 36dc241..7ee14cf 100644 (file)
@@ -1130,13 +1130,6 @@ static int advk_pcie_probe(struct platform_device *pdev)
                return ret;
        }
 
-       ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows,
-                                             &bridge->dma_ranges, NULL);
-       if (ret) {
-               dev_err(dev, "Failed to parse resources\n");
-               return ret;
-       }
-
        pcie->reset_gpio = devm_gpiod_get_from_of_node(dev, dev->of_node,
                                                       "reset-gpios", 0,
                                                       GPIOD_OUT_LOW,
index 5441a5f..94f6ab5 100644 (file)
@@ -465,11 +465,6 @@ static int faraday_pci_probe(struct platform_device *pdev)
        if (IS_ERR(p->base))
                return PTR_ERR(p->base);
 
-       ret = pci_parse_request_of_pci_ranges(dev, &host->windows,
-                                             &host->dma_ranges, NULL);
-       if (ret)
-               return ret;
-
        win = resource_list_first_type(&host->windows, IORESOURCE_IO);
        if (win) {
                io = win->res;
index e662910..5096241 100644 (file)
@@ -25,21 +25,20 @@ static struct pci_config_window *gen_pci_init(struct device *dev,
 {
        int err;
        struct resource cfgres;
-       struct resource *bus_range = NULL;
+       struct resource_entry *bus;
        struct pci_config_window *cfg;
 
-       /* Parse our PCI ranges and request their resources */
-       err = pci_parse_request_of_pci_ranges(dev, &bridge->windows, NULL, &bus_range);
-       if (err)
-               return ERR_PTR(err);
-
        err = of_address_to_resource(dev->of_node, 0, &cfgres);
        if (err) {
                dev_err(dev, "missing \"reg\" property\n");
                return ERR_PTR(err);
        }
 
-       cfg = pci_ecam_create(dev, &cfgres, bus_range, ops);
+       bus = resource_list_first_type(&bridge->windows, IORESOURCE_BUS);
+       if (!bus)
+               return ERR_PTR(-ENODEV);
+
+       cfg = pci_ecam_create(dev, &cfgres, bus->res, ops);
        if (IS_ERR(cfg))
                return cfg;
 
index 0198c15..a7a7fbe 100644 (file)
@@ -218,13 +218,6 @@ static int loongson_pci_probe(struct platform_device *pdev)
                }
        }
 
-       err = pci_parse_request_of_pci_ranges(dev, &bridge->windows,
-                                               &bridge->dma_ranges, NULL);
-       if (err) {
-               dev_err(dev, "failed to get bridge resources\n");
-               return err;
-       }
-
        bridge->sysdata = priv;
        bridge->ops = &loongson_pci_ops;
        bridge->map_irq = loongson_map_irq;
index 7bc6c17..c953003 100644 (file)
@@ -282,7 +282,6 @@ static int rcar_pci_probe(struct platform_device *pdev)
        struct rcar_pci_priv *priv;
        struct pci_host_bridge *bridge;
        void __iomem *reg;
-       int ret;
 
        bridge = devm_pci_alloc_host_bridge(dev, sizeof(*priv));
        if (!bridge)
@@ -315,11 +314,6 @@ static int rcar_pci_probe(struct platform_device *pdev)
                return priv->irq;
        }
 
-       ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows,
-                                             &bridge->dma_ranges, NULL);
-       if (ret)
-               return ret;
-
        bridge->ops = &rcar_pci_ops;
 
        pci_add_flags(PCI_REASSIGN_ALL_BUS);
index 8f37cbe..c75ee4b 100644 (file)
@@ -2682,12 +2682,6 @@ static int tegra_pcie_probe(struct platform_device *pdev)
        INIT_LIST_HEAD(&pcie->ports);
        pcie->dev = dev;
 
-       err = pci_parse_request_of_pci_ranges(dev, &host->windows, NULL, NULL);
-       if (err) {
-               dev_err(dev, "Getting bridge resources failed\n");
-               return err;
-       }
-
        err = tegra_pcie_parse_dt(pcie);
        if (err < 0)
                return err;
index d2619f5..1a2cbc5 100644 (file)
@@ -764,11 +764,6 @@ static int v3_pci_probe(struct platform_device *pdev)
        if (IS_ERR(v3->config_base))
                return PTR_ERR(v3->config_base);
 
-       ret = pci_parse_request_of_pci_ranges(dev, &host->windows,
-                                             &host->dma_ranges, NULL);
-       if (ret)
-               return ret;
-
        /* Get and request error IRQ resource */
        irq = platform_get_irq(pdev, 0);
        if (irq < 0) {
index 66f5c61..fb45f8d 100644 (file)
@@ -67,7 +67,7 @@ static int versatile_pci_probe(struct platform_device *pdev)
        struct device *dev = &pdev->dev;
        struct resource *res;
        struct resource_entry *entry;
-       int ret, i, myslot = -1, mem = 1;
+       int i, myslot = -1, mem = 1;
        u32 val;
        void __iomem *local_pci_cfg_base;
        struct pci_host_bridge *bridge;
@@ -89,11 +89,6 @@ static int versatile_pci_probe(struct platform_device *pdev)
        if (IS_ERR(versatile_cfg_base[1]))
                return PTR_ERR(versatile_cfg_base[1]);
 
-       ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows,
-                                             NULL, NULL);
-       if (ret)
-               return ret;
-
        resource_list_for_each_entry(entry, &bridge->windows) {
                if (resource_type(entry->res) == IORESOURCE_MEM) {
                        writel(entry->res->start >> 28, PCI_IMAP(mem));
index d3aa28e..190234b 100644 (file)
@@ -614,11 +614,6 @@ static int xgene_pcie_probe(struct platform_device *pdev)
        if (ret)
                return ret;
 
-       ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows,
-                                             &bridge->dma_ranges, NULL);
-       if (ret)
-               return ret;
-
        ret = xgene_pcie_setup(port);
        if (ret)
                return ret;
index 4424430..d93489e 100644 (file)
@@ -794,13 +794,6 @@ static int altera_pcie_probe(struct platform_device *pdev)
                return ret;
        }
 
-       ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows,
-                                             &bridge->dma_ranges, NULL);
-       if (ret) {
-               dev_err(dev, "Failed add resources\n");
-               return ret;
-       }
-
        ret = altera_pcie_init_irq_domain(pcie);
        if (ret) {
                dev_err(dev, "Failed creating IRQ Domain\n");
index 20e1aa2..f0f283e 100644 (file)
@@ -970,11 +970,6 @@ static int brcm_pcie_probe(struct platform_device *pdev)
 
        pcie->ssc = of_property_read_bool(np, "brcm,enable-ssc");
 
-       ret = pci_parse_request_of_pci_ranges(pcie->dev, &bridge->windows,
-                                             &bridge->dma_ranges, NULL);
-       if (ret)
-               return ret;
-
        ret = clk_prepare_enable(pcie->clk);
        if (ret) {
                dev_err(&pdev->dev, "could not enable clock\n");
index ff0a81a..7c10c1c 100644 (file)
@@ -95,13 +95,6 @@ static int iproc_pcie_pltfm_probe(struct platform_device *pdev)
        if (IS_ERR(pcie->phy))
                return PTR_ERR(pcie->phy);
 
-       ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows,
-                                             &bridge->dma_ranges, NULL);
-       if (ret) {
-               dev_err(dev, "unable to get PCI host bridge resources\n");
-               return ret;
-       }
-
        /* PAXC doesn't support legacy IRQs, skip mapping */
        switch (pcie->type) {
        case IPROC_PCIE_PAXC:
index ac6dfa0..a745f35 100644 (file)
@@ -1027,15 +1027,8 @@ static int mtk_pcie_setup(struct mtk_pcie *pcie)
        struct device *dev = pcie->dev;
        struct device_node *node = dev->of_node, *child;
        struct mtk_pcie_port *port, *tmp;
-       struct pci_host_bridge *host = pci_host_bridge_from_priv(pcie);
-       struct list_head *windows = &host->windows;
        int err;
 
-       err = pci_parse_request_of_pci_ranges(dev, windows,
-                                             &host->dma_ranges, NULL);
-       if (err)
-               return err;
-
        for_each_available_child_of_node(node, child) {
                int slot;
 
index fa7b893..67f2a9d 100644 (file)
@@ -913,11 +913,6 @@ static int rcar_pcie_probe(struct platform_device *pdev)
        pcie->dev = dev;
        platform_set_drvdata(pdev, host);
 
-       err = pci_parse_request_of_pci_ranges(dev, &bridge->windows,
-                                             &bridge->dma_ranges, NULL);
-       if (err)
-               return err;
-
        pm_runtime_enable(pcie->dev);
        err = pm_runtime_get_sync(pcie->dev);
        if (err < 0) {
index 9a30d08..fed4f6c 100644 (file)
@@ -989,11 +989,6 @@ static int rockchip_pcie_probe(struct platform_device *pdev)
        if (err < 0)
                goto err_deinit_port;
 
-       err = pci_parse_request_of_pci_ranges(dev, &bridge->windows,
-                                             &bridge->dma_ranges, NULL);
-       if (err)
-               goto err_remove_irq_domain;
-
        err = rockchip_pcie_cfg_atu(rockchip);
        if (err)
                goto err_remove_irq_domain;
index 566165c..7e7c23c 100644 (file)
@@ -838,13 +838,6 @@ static int nwl_pcie_probe(struct platform_device *pdev)
                return err;
        }
 
-       err = pci_parse_request_of_pci_ranges(dev, &bridge->windows,
-                                             &bridge->dma_ranges, NULL);
-       if (err) {
-               dev_err(dev, "Getting bridge resources failed\n");
-               return err;
-       }
-
        err = nwl_pcie_init_irq_domain(pcie);
        if (err) {
                dev_err(dev, "Failed creating IRQ Domain\n");
index 7bf80f6..f8b8cce 100644 (file)
@@ -641,13 +641,6 @@ static int xilinx_pcie_probe(struct platform_device *pdev)
                return err;
        }
 
-       err = pci_parse_request_of_pci_ranges(dev, &bridge->windows,
-                                             &bridge->dma_ranges, NULL);
-       if (err) {
-               dev_err(dev, "Getting bridge resources failed\n");
-               return err;
-       }
-
        bridge->sysdata = port;
        bridge->ops = &xilinx_pcie_ops;
        bridge->map_irq = of_irq_parse_and_map_pci;
index cfb940c..5e06aae 100644 (file)
@@ -521,28 +521,26 @@ int of_irq_parse_and_map_pci(const struct pci_dev *dev, u8 slot, u8 pin)
 EXPORT_SYMBOL_GPL(of_irq_parse_and_map_pci);
 #endif /* CONFIG_OF_IRQ */
 
-int pci_parse_request_of_pci_ranges(struct device *dev,
-                                   struct list_head *resources,
-                                   struct list_head *ib_resources,
-                                   struct resource **bus_range)
+static int pci_parse_request_of_pci_ranges(struct device *dev,
+                                          struct pci_host_bridge *bridge)
 {
        int err, res_valid = 0;
        resource_size_t iobase;
        struct resource_entry *win, *tmp;
 
-       INIT_LIST_HEAD(resources);
-       if (ib_resources)
-               INIT_LIST_HEAD(ib_resources);
-       err = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff, resources,
-                                                   ib_resources, &iobase);
+       INIT_LIST_HEAD(&bridge->windows);
+       INIT_LIST_HEAD(&bridge->dma_ranges);
+
+       err = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff, &bridge->windows,
+                                                   &bridge->dma_ranges, &iobase);
        if (err)
                return err;
 
-       err = devm_request_pci_bus_resources(dev, resources);
+       err = devm_request_pci_bus_resources(dev, &bridge->windows);
        if (err)
-               goto out_release_res;
+               return err;
 
-       resource_list_for_each_entry_safe(win, tmp, resources) {
+       resource_list_for_each_entry_safe(win, tmp, &bridge->windows) {
                struct resource *res = win->res;
 
                switch (resource_type(res)) {
@@ -557,10 +555,6 @@ int pci_parse_request_of_pci_ranges(struct device *dev,
                case IORESOURCE_MEM:
                        res_valid |= !(res->flags & IORESOURCE_PREFETCH);
                        break;
-               case IORESOURCE_BUS:
-                       if (bus_range)
-                               *bus_range = res;
-                       break;
                }
        }
 
@@ -568,12 +562,15 @@ int pci_parse_request_of_pci_ranges(struct device *dev,
                dev_warn(dev, "non-prefetchable memory resource required\n");
 
        return 0;
+}
 
- out_release_res:
-       pci_free_resource_list(resources);
-       return err;
+int devm_of_pci_bridge_init(struct device *dev, struct pci_host_bridge *bridge)
+{
+       if (!dev->of_node)
+               return 0;
+
+       return pci_parse_request_of_pci_ranges(dev, bridge);
 }
-EXPORT_SYMBOL_GPL(pci_parse_request_of_pci_ranges);
 
 #endif /* CONFIG_PCI */
 
index 6d3f758..56d6707 100644 (file)
@@ -627,6 +627,8 @@ void pci_release_of_node(struct pci_dev *dev);
 void pci_set_bus_of_node(struct pci_bus *bus);
 void pci_release_bus_of_node(struct pci_bus *bus);
 
+int devm_of_pci_bridge_init(struct device *dev, struct pci_host_bridge *bridge);
+
 #else
 static inline int
 of_pci_parse_bus_range(struct device_node *node, struct resource *res)
@@ -650,6 +652,12 @@ static inline void pci_set_of_node(struct pci_dev *dev) { }
 static inline void pci_release_of_node(struct pci_dev *dev) { }
 static inline void pci_set_bus_of_node(struct pci_bus *bus) { }
 static inline void pci_release_bus_of_node(struct pci_bus *bus) { }
+
+static inline int devm_of_pci_bridge_init(struct device *dev, struct pci_host_bridge *bridge)
+{
+       return 0;
+}
+
 #endif /* CONFIG_OF */
 
 #ifdef CONFIG_PCIEAER
index f850782..998f615 100644 (file)
@@ -635,6 +635,10 @@ struct pci_host_bridge *devm_pci_alloc_host_bridge(struct device *dev,
        if (ret)
                return NULL;
 
+       ret = devm_of_pci_bridge_init(dev, bridge);
+       if (ret)
+               return NULL;
+
        return bridge;
 }
 EXPORT_SYMBOL(devm_pci_alloc_host_bridge);
index c79d833..2830799 100644 (file)
@@ -2303,10 +2303,6 @@ int pci_vpd_find_info_keyword(const u8 *buf, unsigned int off,
 struct device_node;
 struct irq_domain;
 struct irq_domain *pci_host_bridge_of_msi_domain(struct pci_bus *bus);
-int pci_parse_request_of_pci_ranges(struct device *dev,
-                                   struct list_head *resources,
-                                   struct list_head *ib_resources,
-                                   struct resource **bus_range);
 
 /* Arch may override this (weak) */
 struct device_node *pcibios_get_phb_of_node(struct pci_bus *bus);
@@ -2314,14 +2310,6 @@ struct device_node *pcibios_get_phb_of_node(struct pci_bus *bus);
 #else  /* CONFIG_OF */
 static inline struct irq_domain *
 pci_host_bridge_of_msi_domain(struct pci_bus *bus) { return NULL; }
-static inline int
-pci_parse_request_of_pci_ranges(struct device *dev,
-                               struct list_head *resources,
-                               struct list_head *ib_resources,
-                               struct resource **bus_range)
-{
-       return -EINVAL;
-}
 #endif  /* CONFIG_OF */
 
 static inline struct device_node *