* [PATCH 00/11] PCI dma-ranges parsing consolidation
@ 2019-09-24 21:46 Rob Herring
2019-09-24 21:46 ` [PATCH 03/11] PCI: mediatek: Use pci_parse_request_of_pci_ranges() Rob Herring
` (2 more replies)
0 siblings, 3 replies; 11+ messages in thread
From: Rob Herring @ 2019-09-24 21:46 UTC (permalink / raw)
To: linux-pci, Bjorn Helgaas, Lorenzo Pieralisi
Cc: Heiko Stuebner, Karthikeyan Mitran, Shawn Lin, Thomas Petazzoni,
Toan Le, Will Deacon, Ryder Lee, Michal Simek, linux-rockchip,
bcm-kernel-feedback-list, Linus Walleij, Ray Jui, Hou Zhiqiang,
Simon Horman, linux-mediatek, Matthias Brugger, linux-arm-kernel,
Scott Branden, Gustavo Pimentel, rfi, linux-renesas-soc,
Tom Joseph, Jingoo Han, Ley
This series moves the DT 'dma-ranges' parsing into common helpers
utilizing a resource list. In the process of doing this, I noticed
several cases where pci_parse_request_of_pci_ranges() could be used so
I converted those drivers first. The last 5 patches make the actual
change to use the common 'dma_ranges' resource list. There's no
(intended) functional change in this series though I'm also working on
a separate series to improve the handling of 'dma-ranges' and dma
masks.
pci-rcar-gen2 is the only remaining driver doing its own dma-ranges
handling as it is still using the old ARM PCI functions. Looks like it
is the last one (in drivers/pci/).
Compile tested only.
Rob
Rob Herring (11):
PCI: aardvark: Use pci_parse_request_of_pci_ranges()
PCI: altera: Use pci_parse_request_of_pci_ranges()
PCI: mediatek: Use pci_parse_request_of_pci_ranges()
PCI: versatile: Enable COMPILE_TEST
PCI: versatile: Use pci_parse_request_of_pci_ranges()
PCI: of: Add inbound resource parsing to helpers
PCI: ftpci100: Use inbound resources for setup
PCI: v3-semi: Use inbound resources for setup
PCI: xgene: Use inbound resources for setup
PCI: iproc: Use inbound resources for setup
PCI: rcar: Use inbound resources for setup
drivers/pci/controller/Kconfig | 2 +-
.../pci/controller/dwc/pcie-designware-host.c | 3 +-
drivers/pci/controller/pci-aardvark.c | 58 ++---------------
drivers/pci/controller/pci-ftpci100.c | 29 ++++-----
drivers/pci/controller/pci-host-common.c | 2 +-
drivers/pci/controller/pci-v3-semi.c | 40 +++++-------
drivers/pci/controller/pci-versatile.c | 62 ++++--------------
drivers/pci/controller/pci-xgene.c | 33 ++++------
drivers/pci/controller/pcie-altera.c | 38 +----------
drivers/pci/controller/pcie-cadence-host.c | 2 +-
drivers/pci/controller/pcie-iproc-platform.c | 1 +
drivers/pci/controller/pcie-iproc.c | 63 +++----------------
drivers/pci/controller/pcie-mediatek.c | 47 +++++---------
drivers/pci/controller/pcie-mobiveil.c | 4 +-
drivers/pci/controller/pcie-rcar.c | 48 ++++++--------
drivers/pci/controller/pcie-rockchip-host.c | 3 +-
drivers/pci/controller/pcie-xilinx-nwl.c | 2 +-
drivers/pci/controller/pcie-xilinx.c | 2 +-
drivers/pci/of.c | 44 ++++++++++++-
drivers/pci/pci.h | 8 ++-
include/linux/pci.h | 2 +
21 files changed, 162 insertions(+), 331 deletions(-)
--
2.20.1
^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH 03/11] PCI: mediatek: Use pci_parse_request_of_pci_ranges()
2019-09-24 21:46 [PATCH 00/11] PCI dma-ranges parsing consolidation Rob Herring
@ 2019-09-24 21:46 ` Rob Herring
2019-09-25 11:34 ` Andrew Murray
2019-09-24 21:46 ` [PATCH 06/11] PCI: of: Add inbound resource parsing to helpers Rob Herring
2019-09-26 8:49 ` [PATCH 00/11] PCI dma-ranges parsing consolidation Andrew Murray
2 siblings, 1 reply; 11+ messages in thread
From: Rob Herring @ 2019-09-24 21:46 UTC (permalink / raw)
To: linux-pci, Bjorn Helgaas, Lorenzo Pieralisi
Cc: Matthias Brugger, Ryder Lee, linux-mediatek, linux-arm-kernel
Convert Mediatek host bridge to use the common
pci_parse_request_of_pci_ranges().
Cc: Ryder Lee <ryder.lee@mediatek.com>
Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Cc: Bjorn Helgaas <bhelgaas@google.com>
Cc: Matthias Brugger <matthias.bgg@gmail.com>
Cc: linux-mediatek@lists.infradead.org
Signed-off-by: Rob Herring <robh@kernel.org>
---
drivers/pci/controller/pcie-mediatek.c | 47 ++++++++++----------------
1 file changed, 17 insertions(+), 30 deletions(-)
diff --git a/drivers/pci/controller/pcie-mediatek.c b/drivers/pci/controller/pcie-mediatek.c
index 80601e1b939e..cea4112b5309 100644
--- a/drivers/pci/controller/pcie-mediatek.c
+++ b/drivers/pci/controller/pcie-mediatek.c
@@ -211,7 +211,6 @@ struct mtk_pcie {
void __iomem *base;
struct clk *free_ck;
- struct resource mem;
struct list_head ports;
const struct mtk_pcie_soc *soc;
unsigned int busnr;
@@ -658,11 +657,23 @@ static int mtk_pcie_setup_irq(struct mtk_pcie_port *port,
static int mtk_pcie_startup_port_v2(struct mtk_pcie_port *port)
{
struct mtk_pcie *pcie = port->pcie;
- struct resource *mem = &pcie->mem;
+ struct pci_host_bridge *host = pci_host_bridge_from_priv(pcie);
+ struct resource *mem = NULL;
+ struct resource_entry *entry;
const struct mtk_pcie_soc *soc = port->pcie->soc;
u32 val;
int err;
+ resource_list_for_each_entry(entry, &host->windows) {
+ if (resource_type(entry->res) != IORESOURCE_MEM)
+ continue;
+
+ mem = entry->res;
+ break;
+ }
+ if (!mem)
+ return -EINVAL;
+
/* MT7622 platforms need to enable LTSSM and ASPM from PCIe subsys */
if (pcie->base) {
val = readl(pcie->base + PCIE_SYS_CFG_V2);
@@ -1017,39 +1028,15 @@ static int mtk_pcie_setup(struct mtk_pcie *pcie)
struct mtk_pcie_port *port, *tmp;
struct pci_host_bridge *host = pci_host_bridge_from_priv(pcie);
struct list_head *windows = &host->windows;
- struct resource_entry *win, *tmp_win;
- resource_size_t io_base;
+ struct resource *bus;
int err;
- err = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff,
- windows, &io_base);
+ err = pci_parse_request_of_pci_ranges(dev, windows,
+ &bus);
if (err)
return err;
- err = devm_request_pci_bus_resources(dev, windows);
- if (err < 0)
- return err;
-
- /* Get the I/O and memory ranges from DT */
- resource_list_for_each_entry_safe(win, tmp_win, windows) {
- switch (resource_type(win->res)) {
- case IORESOURCE_IO:
- err = devm_pci_remap_iospace(dev, win->res, io_base);
- if (err) {
- dev_warn(dev, "error %d: failed to map resource %pR\n",
- err, win->res);
- resource_list_destroy_entry(win);
- }
- break;
- case IORESOURCE_MEM:
- memcpy(&pcie->mem, win->res, sizeof(*win->res));
- pcie->mem.name = "non-prefetchable";
- break;
- case IORESOURCE_BUS:
- pcie->busnr = win->res->start;
- break;
- }
- }
+ pcie->busnr = bus->start;
for_each_available_child_of_node(node, child) {
int slot;
--
2.20.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 06/11] PCI: of: Add inbound resource parsing to helpers
2019-09-24 21:46 [PATCH 00/11] PCI dma-ranges parsing consolidation Rob Herring
2019-09-24 21:46 ` [PATCH 03/11] PCI: mediatek: Use pci_parse_request_of_pci_ranges() Rob Herring
@ 2019-09-24 21:46 ` Rob Herring
2019-09-25 9:00 ` Thomas Petazzoni
` (5 more replies)
2019-09-26 8:49 ` [PATCH 00/11] PCI dma-ranges parsing consolidation Andrew Murray
2 siblings, 6 replies; 11+ messages in thread
From: Rob Herring @ 2019-09-24 21:46 UTC (permalink / raw)
To: linux-pci, Bjorn Helgaas, Lorenzo Pieralisi
Cc: Heiko Stuebner, Karthikeyan Mitran, Linus Walleij,
Thomas Petazzoni, Toan Le, Will Deacon, Ryder Lee, Michal Simek,
linux-rockchip, bcm-kernel-feedback-list, Shawn Lin, Ray Jui,
Hou Zhiqiang, Simon Horman, linux-mediatek, linux-arm-kernel,
Scott Branden, Jingoo Han, rfi, linux-renesas-soc, Tom Joseph,
Gustavo Pimentel, Ley Foon Tan
Extend devm_of_pci_get_host_bridge_resources() and
pci_parse_request_of_pci_ranges() helpers to also parse the inbound
addresses from DT 'dma-ranges' and populate a resource list with the
translated addresses. This will help ensure 'dma-ranges' is always
parsed in a consistent way.
Cc: Jingoo Han <jingoohan1@gmail.com>
Cc: Gustavo Pimentel <gustavo.pimentel@synopsys.com>
Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Cc: Bjorn Helgaas <bhelgaas@google.com>
Cc: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
Cc: Will Deacon <will@kernel.org>
Cc: Linus Walleij <linus.walleij@linaro.org>
Cc: Toan Le <toan@os.amperecomputing.com>
Cc: Ley Foon Tan <lftan@altera.com>
Cc: Tom Joseph <tjoseph@cadence.com>
Cc: Ray Jui <rjui@broadcom.com>
Cc: Scott Branden <sbranden@broadcom.com>
Cc: bcm-kernel-feedback-list@broadcom.com
Cc: Ryder Lee <ryder.lee@mediatek.com>
Cc: Karthikeyan Mitran <m.karthikeyan@mobiveil.co.in>
Cc: Hou Zhiqiang <Zhiqiang.Hou@nxp.com>
Cc: Simon Horman <horms@verge.net.au>
Cc: Shawn Lin <shawn.lin@rock-chips.com>
Cc: Heiko Stuebner <heiko@sntech.de>
Cc: Michal Simek <michal.simek@xilinx.com>
Cc: rfi@lists.rocketboards.org
Cc: linux-mediatek@lists.infradead.org
Cc: linux-renesas-soc@vger.kernel.org
Cc: linux-rockchip@lists.infradead.org
Signed-off-by: Rob Herring <robh@kernel.org>
---
.../pci/controller/dwc/pcie-designware-host.c | 3 +-
drivers/pci/controller/pci-aardvark.c | 2 +-
drivers/pci/controller/pci-ftpci100.c | 3 +-
drivers/pci/controller/pci-host-common.c | 2 +-
drivers/pci/controller/pci-v3-semi.c | 2 +-
drivers/pci/controller/pci-versatile.c | 2 +-
drivers/pci/controller/pci-xgene.c | 1 +
drivers/pci/controller/pcie-altera.c | 2 +-
drivers/pci/controller/pcie-cadence-host.c | 2 +-
drivers/pci/controller/pcie-iproc-platform.c | 1 +
drivers/pci/controller/pcie-mediatek.c | 2 +-
drivers/pci/controller/pcie-mobiveil.c | 4 +-
drivers/pci/controller/pcie-rcar.c | 3 +-
drivers/pci/controller/pcie-rockchip-host.c | 3 +-
drivers/pci/controller/pcie-xilinx-nwl.c | 2 +-
drivers/pci/controller/pcie-xilinx.c | 2 +-
drivers/pci/of.c | 44 ++++++++++++++++++-
drivers/pci/pci.h | 8 +++-
include/linux/pci.h | 2 +
19 files changed, 72 insertions(+), 18 deletions(-)
diff --git a/drivers/pci/controller/dwc/pcie-designware-host.c b/drivers/pci/controller/dwc/pcie-designware-host.c
index f93252d0da5b..0743ae64bb0f 100644
--- a/drivers/pci/controller/dwc/pcie-designware-host.c
+++ b/drivers/pci/controller/dwc/pcie-designware-host.c
@@ -342,7 +342,8 @@ int dw_pcie_host_init(struct pcie_port *pp)
return -ENOMEM;
ret = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff,
- &bridge->windows, &pp->io_base);
+ &bridge->windows, &bridge->dma_ranges,
+ &pp->io_base);
if (ret)
return ret;
diff --git a/drivers/pci/controller/pci-aardvark.c b/drivers/pci/controller/pci-aardvark.c
index ff3af3d34028..c00b391529f3 100644
--- a/drivers/pci/controller/pci-aardvark.c
+++ b/drivers/pci/controller/pci-aardvark.c
@@ -940,7 +940,7 @@ static int advk_pcie_probe(struct platform_device *pdev)
}
ret = pci_parse_request_of_pci_ranges(dev, &pcie->resources,
- &bus);
+ &bridge->dma_ranges, &bus);
if (ret) {
dev_err(dev, "Failed to parse resources\n");
return ret;
diff --git a/drivers/pci/controller/pci-ftpci100.c b/drivers/pci/controller/pci-ftpci100.c
index bf5ece5d9291..3e07a8203736 100644
--- a/drivers/pci/controller/pci-ftpci100.c
+++ b/drivers/pci/controller/pci-ftpci100.c
@@ -481,7 +481,8 @@ static int faraday_pci_probe(struct platform_device *pdev)
return PTR_ERR(p->base);
ret = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff,
- &res, &io_base);
+ &res, &host->dma_ranges,
+ &io_base);
if (ret)
return ret;
diff --git a/drivers/pci/controller/pci-host-common.c b/drivers/pci/controller/pci-host-common.c
index c742881b5061..183381c19ee8 100644
--- a/drivers/pci/controller/pci-host-common.c
+++ b/drivers/pci/controller/pci-host-common.c
@@ -27,7 +27,7 @@ static struct pci_config_window *gen_pci_init(struct device *dev,
struct pci_config_window *cfg;
/* Parse our PCI ranges and request their resources */
- err = pci_parse_request_of_pci_ranges(dev, resources, &bus_range);
+ err = pci_parse_request_of_pci_ranges(dev, resources, NULL, &bus_range);
if (err)
return ERR_PTR(err);
diff --git a/drivers/pci/controller/pci-v3-semi.c b/drivers/pci/controller/pci-v3-semi.c
index d219404bad92..090df766faf9 100644
--- a/drivers/pci/controller/pci-v3-semi.c
+++ b/drivers/pci/controller/pci-v3-semi.c
@@ -794,7 +794,7 @@ static int v3_pci_probe(struct platform_device *pdev)
return PTR_ERR(v3->config_base);
ret = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff, &res,
- &io_base);
+ &host->dma_ranges, &io_base);
if (ret)
return ret;
diff --git a/drivers/pci/controller/pci-versatile.c b/drivers/pci/controller/pci-versatile.c
index 237b1abb26f2..211159f54b4a 100644
--- a/drivers/pci/controller/pci-versatile.c
+++ b/drivers/pci/controller/pci-versatile.c
@@ -93,7 +93,7 @@ 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, &pci_res, NULL);
+ ret = pci_parse_request_of_pci_ranges(dev, &pci_res, NULL, NULL);
if (ret)
return ret;
diff --git a/drivers/pci/controller/pci-xgene.c b/drivers/pci/controller/pci-xgene.c
index ffda3e8b4742..11f27c42c06a 100644
--- a/drivers/pci/controller/pci-xgene.c
+++ b/drivers/pci/controller/pci-xgene.c
@@ -635,6 +635,7 @@ static int xgene_pcie_probe(struct platform_device *pdev)
return ret;
ret = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff, &res,
+ &bridge->dma_ranges,
&iobase);
if (ret)
return ret;
diff --git a/drivers/pci/controller/pcie-altera.c b/drivers/pci/controller/pcie-altera.c
index 2ed00babff5a..fde6a3b16fb9 100644
--- a/drivers/pci/controller/pcie-altera.c
+++ b/drivers/pci/controller/pcie-altera.c
@@ -801,7 +801,7 @@ static int altera_pcie_probe(struct platform_device *pdev)
}
ret = pci_parse_request_of_pci_ranges(dev, &pcie->resources,
- NULL);
+ &bridge->dma_ranges, NULL);
if (ret) {
dev_err(dev, "Failed add resources\n");
return ret;
diff --git a/drivers/pci/controller/pcie-cadence-host.c b/drivers/pci/controller/pcie-cadence-host.c
index 97e251090b4f..a8f7a6284c3e 100644
--- a/drivers/pci/controller/pcie-cadence-host.c
+++ b/drivers/pci/controller/pcie-cadence-host.c
@@ -211,7 +211,7 @@ static int cdns_pcie_host_init(struct device *dev,
int err;
/* Parse our PCI ranges and request their resources */
- err = pci_parse_request_of_pci_ranges(dev, resources, &bus_range);
+ err = pci_parse_request_of_pci_ranges(dev, resources, NULL, &bus_range);
if (err)
return err;
diff --git a/drivers/pci/controller/pcie-iproc-platform.c b/drivers/pci/controller/pcie-iproc-platform.c
index 5a3550b6bb29..62eee2d17f43 100644
--- a/drivers/pci/controller/pcie-iproc-platform.c
+++ b/drivers/pci/controller/pcie-iproc-platform.c
@@ -101,6 +101,7 @@ static int iproc_pcie_pltfm_probe(struct platform_device *pdev)
}
ret = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff, &resources,
+ &bridge->dma_ranges,
&iobase);
if (ret) {
dev_err(dev, "unable to get PCI host bridge resources\n");
diff --git a/drivers/pci/controller/pcie-mediatek.c b/drivers/pci/controller/pcie-mediatek.c
index cea4112b5309..f3996eed152d 100644
--- a/drivers/pci/controller/pcie-mediatek.c
+++ b/drivers/pci/controller/pcie-mediatek.c
@@ -1032,7 +1032,7 @@ static int mtk_pcie_setup(struct mtk_pcie *pcie)
int err;
err = pci_parse_request_of_pci_ranges(dev, windows,
- &bus);
+ &host->dma_ranges, &bus);
if (err)
return err;
diff --git a/drivers/pci/controller/pcie-mobiveil.c b/drivers/pci/controller/pcie-mobiveil.c
index 672e633601c7..93064faaa656 100644
--- a/drivers/pci/controller/pcie-mobiveil.c
+++ b/drivers/pci/controller/pcie-mobiveil.c
@@ -875,7 +875,9 @@ static int mobiveil_pcie_probe(struct platform_device *pdev)
/* parse the host bridge base addresses from the device tree file */
ret = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff,
- &pcie->resources, &iobase);
+ &pcie->resources,
+ &bridge->dma_ranges,
+ &iobase);
if (ret) {
dev_err(dev, "Getting bridge resources failed\n");
return ret;
diff --git a/drivers/pci/controller/pcie-rcar.c b/drivers/pci/controller/pcie-rcar.c
index f6a669a9af41..b8d6e86a5539 100644
--- a/drivers/pci/controller/pcie-rcar.c
+++ b/drivers/pci/controller/pcie-rcar.c
@@ -1138,7 +1138,8 @@ static int rcar_pcie_probe(struct platform_device *pdev)
pcie->dev = dev;
platform_set_drvdata(pdev, pcie);
- err = pci_parse_request_of_pci_ranges(dev, &pcie->resources, NULL);
+ err = pci_parse_request_of_pci_ranges(dev, &pcie->resources,
+ &bridge->dma_ranges, NULL);
if (err)
goto err_free_bridge;
diff --git a/drivers/pci/controller/pcie-rockchip-host.c b/drivers/pci/controller/pcie-rockchip-host.c
index 8d20f1793a61..093b816b9dc9 100644
--- a/drivers/pci/controller/pcie-rockchip-host.c
+++ b/drivers/pci/controller/pcie-rockchip-host.c
@@ -996,7 +996,8 @@ static int rockchip_pcie_probe(struct platform_device *pdev)
goto err_deinit_port;
err = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff,
- &res, &io_base);
+ &res, &bridge->dma_ranges,
+ &io_base);
if (err)
goto err_remove_irq_domain;
diff --git a/drivers/pci/controller/pcie-xilinx-nwl.c b/drivers/pci/controller/pcie-xilinx-nwl.c
index 45c0f344ccd1..5c9132a02d15 100644
--- a/drivers/pci/controller/pcie-xilinx-nwl.c
+++ b/drivers/pci/controller/pcie-xilinx-nwl.c
@@ -846,7 +846,7 @@ static int nwl_pcie_probe(struct platform_device *pdev)
}
err = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff, &res,
- &iobase);
+ &bridge->dma_ranges, &iobase);
if (err) {
dev_err(dev, "Getting bridge resources failed\n");
return err;
diff --git a/drivers/pci/controller/pcie-xilinx.c b/drivers/pci/controller/pcie-xilinx.c
index 5bf3af3b28e6..a95faca30291 100644
--- a/drivers/pci/controller/pcie-xilinx.c
+++ b/drivers/pci/controller/pcie-xilinx.c
@@ -648,7 +648,7 @@ static int xilinx_pcie_probe(struct platform_device *pdev)
}
err = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff, &res,
- &iobase);
+ &bridge->dma_ranges, &iobase);
if (err) {
dev_err(dev, "Getting bridge resources failed\n");
return err;
diff --git a/drivers/pci/of.c b/drivers/pci/of.c
index bc7b27a28795..8d31e078461f 100644
--- a/drivers/pci/of.c
+++ b/drivers/pci/of.c
@@ -257,7 +257,9 @@ EXPORT_SYMBOL_GPL(of_pci_check_probe_only);
*/
int devm_of_pci_get_host_bridge_resources(struct device *dev,
unsigned char busno, unsigned char bus_max,
- struct list_head *resources, resource_size_t *io_base)
+ struct list_head *resources,
+ struct list_head *ib_resources,
+ resource_size_t *io_base)
{
struct device_node *dev_node = dev->of_node;
struct resource *res, tmp_res;
@@ -340,6 +342,42 @@ int devm_of_pci_get_host_bridge_resources(struct device *dev,
pci_add_resource_offset(resources, res, res->start - range.pci_addr);
}
+ /* Check for dma-ranges property */
+ if (!ib_resources)
+ return 0;
+ err = of_pci_dma_range_parser_init(&parser, dev_node);
+ if (err)
+ return 0;
+
+ dev_dbg(dev, "Parsing dma-ranges property...\n");
+ for_each_of_pci_range(&parser, &range) {
+ /*
+ * If we failed translation or got a zero-sized region
+ * then skip this range
+ */
+ if (((range.flags & IORESOURCE_TYPE_BITS) != IORESOURCE_MEM) ||
+ range.cpu_addr == OF_BAD_ADDR || range.size == 0)
+ continue;
+
+ dev_info(dev, "IB MEM %#010llx..%#010llx -> %#010llx\n",
+ range.cpu_addr,
+ range.cpu_addr + range.size - 1, range.pci_addr);
+
+
+ err = of_pci_range_to_resource(&range, dev_node, &tmp_res);
+ if (err)
+ continue;
+
+ res = devm_kmemdup(dev, &tmp_res, sizeof(tmp_res), GFP_KERNEL);
+ if (!res) {
+ err = -ENOMEM;
+ goto failed;
+ }
+
+ pci_add_resource_offset(ib_resources, res,
+ res->start - range.pci_addr);
+ }
+
return 0;
failed:
@@ -482,6 +520,7 @@ EXPORT_SYMBOL_GPL(of_irq_parse_and_map_pci);
int pci_parse_request_of_pci_ranges(struct device *dev,
struct list_head *resources,
+ struct list_head *ib_resources,
struct resource **bus_range)
{
int err, res_valid = 0;
@@ -489,8 +528,9 @@ int pci_parse_request_of_pci_ranges(struct device *dev,
struct resource_entry *win, *tmp;
INIT_LIST_HEAD(resources);
+ INIT_LIST_HEAD(ib_resources);
err = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff, resources,
- &iobase);
+ ib_resources, &iobase);
if (err)
return err;
diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h
index d22d1b807701..790458953c54 100644
--- a/drivers/pci/pci.h
+++ b/drivers/pci/pci.h
@@ -582,11 +582,15 @@ of_pci_get_max_link_speed(struct device_node *node)
#if defined(CONFIG_OF_ADDRESS)
int devm_of_pci_get_host_bridge_resources(struct device *dev,
unsigned char busno, unsigned char bus_max,
- struct list_head *resources, resource_size_t *io_base);
+ struct list_head *resources,
+ struct list_head *ib_resources,
+ resource_size_t *io_base);
#else
static inline int devm_of_pci_get_host_bridge_resources(struct device *dev,
unsigned char busno, unsigned char bus_max,
- struct list_head *resources, resource_size_t *io_base)
+ struct list_head *resources,
+ struct list_head *ib_resources,
+ resource_size_t *io_base);
{
return -EINVAL;
}
diff --git a/include/linux/pci.h b/include/linux/pci.h
index 82e4cd1b7ac3..d57389b86f92 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -2312,6 +2312,7 @@ void pci_release_bus_of_node(struct pci_bus *bus);
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) */
@@ -2326,6 +2327,7 @@ 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;
--
2.20.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH 06/11] PCI: of: Add inbound resource parsing to helpers
2019-09-24 21:46 ` [PATCH 06/11] PCI: of: Add inbound resource parsing to helpers Rob Herring
@ 2019-09-25 9:00 ` Thomas Petazzoni
2019-09-26 8:29 ` Andrew Murray
` (4 subsequent siblings)
5 siblings, 0 replies; 11+ messages in thread
From: Thomas Petazzoni @ 2019-09-25 9:00 UTC (permalink / raw)
To: Rob Herring
Cc: Heiko Stuebner, Karthikeyan Mitran, linux-pci, Linus Walleij,
Ryder Lee, Nadav Haklai, Toan Le, Will Deacon, Lorenzo Pieralisi,
Michal Simek, linux-rockchip, bcm-kernel-feedback-list, Shawn Lin,
Ray Jui, Hou Zhiqiang, Simon Horman, linux-mediatek,
Bjorn Helgaas, linux-arm-kernel, Scott Branden, Jingoo Han, rfi,
linux-renesas-soc, Tom Joseph, Gusta
On Tue, 24 Sep 2019 16:46:25 -0500
Rob Herring <robh@kernel.org> wrote:
> Extend devm_of_pci_get_host_bridge_resources() and
> pci_parse_request_of_pci_ranges() helpers to also parse the inbound
> addresses from DT 'dma-ranges' and populate a resource list with the
> translated addresses. This will help ensure 'dma-ranges' is always
> parsed in a consistent way.
>
> Cc: Jingoo Han <jingoohan1@gmail.com>
> Cc: Gustavo Pimentel <gustavo.pimentel@synopsys.com>
> Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
> Cc: Bjorn Helgaas <bhelgaas@google.com>
> Cc: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
> Cc: Will Deacon <will@kernel.org>
> Cc: Linus Walleij <linus.walleij@linaro.org>
> Cc: Toan Le <toan@os.amperecomputing.com>
> Cc: Ley Foon Tan <lftan@altera.com>
> Cc: Tom Joseph <tjoseph@cadence.com>
> Cc: Ray Jui <rjui@broadcom.com>
> Cc: Scott Branden <sbranden@broadcom.com>
> Cc: bcm-kernel-feedback-list@broadcom.com
> Cc: Ryder Lee <ryder.lee@mediatek.com>
> Cc: Karthikeyan Mitran <m.karthikeyan@mobiveil.co.in>
> Cc: Hou Zhiqiang <Zhiqiang.Hou@nxp.com>
> Cc: Simon Horman <horms@verge.net.au>
> Cc: Shawn Lin <shawn.lin@rock-chips.com>
> Cc: Heiko Stuebner <heiko@sntech.de>
> Cc: Michal Simek <michal.simek@xilinx.com>
> Cc: rfi@lists.rocketboards.org
> Cc: linux-mediatek@lists.infradead.org
> Cc: linux-renesas-soc@vger.kernel.org
> Cc: linux-rockchip@lists.infradead.org
> Signed-off-by: Rob Herring <robh@kernel.org>
> ---
> .../pci/controller/dwc/pcie-designware-host.c | 3 +-
> drivers/pci/controller/pci-aardvark.c | 2 +-
> drivers/pci/controller/pci-ftpci100.c | 3 +-
> drivers/pci/controller/pci-host-common.c | 2 +-
> drivers/pci/controller/pci-v3-semi.c | 2 +-
> drivers/pci/controller/pci-versatile.c | 2 +-
> drivers/pci/controller/pci-xgene.c | 1 +
> drivers/pci/controller/pcie-altera.c | 2 +-
> drivers/pci/controller/pcie-cadence-host.c | 2 +-
> drivers/pci/controller/pcie-iproc-platform.c | 1 +
> drivers/pci/controller/pcie-mediatek.c | 2 +-
> drivers/pci/controller/pcie-mobiveil.c | 4 +-
> drivers/pci/controller/pcie-rcar.c | 3 +-
> drivers/pci/controller/pcie-rockchip-host.c | 3 +-
> drivers/pci/controller/pcie-xilinx-nwl.c | 2 +-
> drivers/pci/controller/pcie-xilinx.c | 2 +-
> drivers/pci/of.c | 44 ++++++++++++++++++-
> drivers/pci/pci.h | 8 +++-
> include/linux/pci.h | 2 +
> 19 files changed, 72 insertions(+), 18 deletions(-)
for the AArdvark bits:
Tested-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
(on Armada 3720-DB, with a E1000E NIC)
Thomas
--
Thomas Petazzoni, CTO, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 03/11] PCI: mediatek: Use pci_parse_request_of_pci_ranges()
2019-09-24 21:46 ` [PATCH 03/11] PCI: mediatek: Use pci_parse_request_of_pci_ranges() Rob Herring
@ 2019-09-25 11:34 ` Andrew Murray
0 siblings, 0 replies; 11+ messages in thread
From: Andrew Murray @ 2019-09-25 11:34 UTC (permalink / raw)
To: Rob Herring
Cc: Lorenzo Pieralisi, linux-pci, Matthias Brugger, Ryder Lee,
linux-mediatek, Bjorn Helgaas, linux-arm-kernel
On Tue, Sep 24, 2019 at 04:46:22PM -0500, Rob Herring wrote:
> Convert Mediatek host bridge to use the common
> pci_parse_request_of_pci_ranges().
>
> Cc: Ryder Lee <ryder.lee@mediatek.com>
> Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
> Cc: Bjorn Helgaas <bhelgaas@google.com>
> Cc: Matthias Brugger <matthias.bgg@gmail.com>
> Cc: linux-mediatek@lists.infradead.org
> Signed-off-by: Rob Herring <robh@kernel.org>
> ---
> drivers/pci/controller/pcie-mediatek.c | 47 ++++++++++----------------
> 1 file changed, 17 insertions(+), 30 deletions(-)
>
> diff --git a/drivers/pci/controller/pcie-mediatek.c b/drivers/pci/controller/pcie-mediatek.c
> index 80601e1b939e..cea4112b5309 100644
> --- a/drivers/pci/controller/pcie-mediatek.c
> +++ b/drivers/pci/controller/pcie-mediatek.c
> @@ -211,7 +211,6 @@ struct mtk_pcie {
> void __iomem *base;
> struct clk *free_ck;
>
> - struct resource mem;
> struct list_head ports;
> const struct mtk_pcie_soc *soc;
> unsigned int busnr;
> @@ -658,11 +657,23 @@ static int mtk_pcie_setup_irq(struct mtk_pcie_port *port,
> static int mtk_pcie_startup_port_v2(struct mtk_pcie_port *port)
> {
> struct mtk_pcie *pcie = port->pcie;
> - struct resource *mem = &pcie->mem;
> + struct pci_host_bridge *host = pci_host_bridge_from_priv(pcie);
> + struct resource *mem = NULL;
> + struct resource_entry *entry;
> const struct mtk_pcie_soc *soc = port->pcie->soc;
> u32 val;
> int err;
>
> + resource_list_for_each_entry(entry, &host->windows) {
> + if (resource_type(entry->res) != IORESOURCE_MEM)
> + continue;
> +
> + mem = entry->res;
> + break;
> + }
> + if (!mem)
> + return -EINVAL;
> +
> /* MT7622 platforms need to enable LTSSM and ASPM from PCIe subsys */
> if (pcie->base) {
> val = readl(pcie->base + PCIE_SYS_CFG_V2);
> @@ -1017,39 +1028,15 @@ static int mtk_pcie_setup(struct mtk_pcie *pcie)
> struct mtk_pcie_port *port, *tmp;
> struct pci_host_bridge *host = pci_host_bridge_from_priv(pcie);
> struct list_head *windows = &host->windows;
> - struct resource_entry *win, *tmp_win;
> - resource_size_t io_base;
> + struct resource *bus;
> int err;
>
> - err = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff,
> - windows, &io_base);
> + err = pci_parse_request_of_pci_ranges(dev, windows,
> + &bus);
> if (err)
> return err;
>
> - err = devm_request_pci_bus_resources(dev, windows);
> - if (err < 0)
> - return err;
> -
> - /* Get the I/O and memory ranges from DT */
> - resource_list_for_each_entry_safe(win, tmp_win, windows) {
> - switch (resource_type(win->res)) {
> - case IORESOURCE_IO:
> - err = devm_pci_remap_iospace(dev, win->res, io_base);
> - if (err) {
> - dev_warn(dev, "error %d: failed to map resource %pR\n",
> - err, win->res);
> - resource_list_destroy_entry(win);
> - }
> - break;
> - case IORESOURCE_MEM:
> - memcpy(&pcie->mem, win->res, sizeof(*win->res));
> - pcie->mem.name = "non-prefetchable";
Using pci_parse_request_of_pci_ranges will now guard against using only
prefetchable memory ranges, whereas the existing code didn't do that. Given
that the current DT users all provide a non-prefetchable range I think this is
OK.
Reviewed-by: Andrew murray <andrew.murray@arm.com>
> - break;
> - case IORESOURCE_BUS:
> - pcie->busnr = win->res->start;
> - break;
> - }
> - }
> + pcie->busnr = bus->start;
>
> for_each_available_child_of_node(node, child) {
> int slot;
> --
> 2.20.1
>
>
> _______________________________________________
> linux-arm-kernel mailing list
> linux-arm-kernel@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 06/11] PCI: of: Add inbound resource parsing to helpers
2019-09-24 21:46 ` [PATCH 06/11] PCI: of: Add inbound resource parsing to helpers Rob Herring
2019-09-25 9:00 ` Thomas Petazzoni
@ 2019-09-26 8:29 ` Andrew Murray
2019-09-26 10:43 ` Gustavo Pimentel
` (3 subsequent siblings)
5 siblings, 0 replies; 11+ messages in thread
From: Andrew Murray @ 2019-09-26 8:29 UTC (permalink / raw)
To: Rob Herring
Cc: Heiko Stuebner, Karthikeyan Mitran, linux-pci, Linus Walleij,
Ryder Lee, Thomas Petazzoni, Toan Le, Will Deacon,
Lorenzo Pieralisi, Michal Simek, linux-rockchip,
bcm-kernel-feedback-list, Shawn Lin, Ray Jui, Hou Zhiqiang,
Simon Horman, linux-mediatek, Bjorn Helgaas, linux-arm-kernel,
Scott Branden, Jingoo Han, rfi, linux-renesas-soc, Tom Joseph
On Tue, Sep 24, 2019 at 04:46:25PM -0500, Rob Herring wrote:
> Extend devm_of_pci_get_host_bridge_resources() and
> pci_parse_request_of_pci_ranges() helpers to also parse the inbound
> addresses from DT 'dma-ranges' and populate a resource list with the
> translated addresses. This will help ensure 'dma-ranges' is always
> parsed in a consistent way.
>
> Cc: Jingoo Han <jingoohan1@gmail.com>
> Cc: Gustavo Pimentel <gustavo.pimentel@synopsys.com>
> Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
> Cc: Bjorn Helgaas <bhelgaas@google.com>
> Cc: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
> Cc: Will Deacon <will@kernel.org>
> Cc: Linus Walleij <linus.walleij@linaro.org>
> Cc: Toan Le <toan@os.amperecomputing.com>
> Cc: Ley Foon Tan <lftan@altera.com>
> Cc: Tom Joseph <tjoseph@cadence.com>
> Cc: Ray Jui <rjui@broadcom.com>
> Cc: Scott Branden <sbranden@broadcom.com>
> Cc: bcm-kernel-feedback-list@broadcom.com
> Cc: Ryder Lee <ryder.lee@mediatek.com>
> Cc: Karthikeyan Mitran <m.karthikeyan@mobiveil.co.in>
> Cc: Hou Zhiqiang <Zhiqiang.Hou@nxp.com>
> Cc: Simon Horman <horms@verge.net.au>
> Cc: Shawn Lin <shawn.lin@rock-chips.com>
> Cc: Heiko Stuebner <heiko@sntech.de>
> Cc: Michal Simek <michal.simek@xilinx.com>
> Cc: rfi@lists.rocketboards.org
> Cc: linux-mediatek@lists.infradead.org
> Cc: linux-renesas-soc@vger.kernel.org
> Cc: linux-rockchip@lists.infradead.org
> Signed-off-by: Rob Herring <robh@kernel.org>
> ---
Reviewed-by: Andrew Murray <andrew.murray@arm.com>
> .../pci/controller/dwc/pcie-designware-host.c | 3 +-
> drivers/pci/controller/pci-aardvark.c | 2 +-
> drivers/pci/controller/pci-ftpci100.c | 3 +-
> drivers/pci/controller/pci-host-common.c | 2 +-
> drivers/pci/controller/pci-v3-semi.c | 2 +-
> drivers/pci/controller/pci-versatile.c | 2 +-
> drivers/pci/controller/pci-xgene.c | 1 +
> drivers/pci/controller/pcie-altera.c | 2 +-
> drivers/pci/controller/pcie-cadence-host.c | 2 +-
> drivers/pci/controller/pcie-iproc-platform.c | 1 +
> drivers/pci/controller/pcie-mediatek.c | 2 +-
> drivers/pci/controller/pcie-mobiveil.c | 4 +-
> drivers/pci/controller/pcie-rcar.c | 3 +-
> drivers/pci/controller/pcie-rockchip-host.c | 3 +-
> drivers/pci/controller/pcie-xilinx-nwl.c | 2 +-
> drivers/pci/controller/pcie-xilinx.c | 2 +-
> drivers/pci/of.c | 44 ++++++++++++++++++-
> drivers/pci/pci.h | 8 +++-
> include/linux/pci.h | 2 +
> 19 files changed, 72 insertions(+), 18 deletions(-)
>
> diff --git a/drivers/pci/controller/dwc/pcie-designware-host.c b/drivers/pci/controller/dwc/pcie-designware-host.c
> index f93252d0da5b..0743ae64bb0f 100644
> --- a/drivers/pci/controller/dwc/pcie-designware-host.c
> +++ b/drivers/pci/controller/dwc/pcie-designware-host.c
> @@ -342,7 +342,8 @@ int dw_pcie_host_init(struct pcie_port *pp)
> return -ENOMEM;
>
> ret = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff,
> - &bridge->windows, &pp->io_base);
> + &bridge->windows, &bridge->dma_ranges,
> + &pp->io_base);
> if (ret)
> return ret;
>
> diff --git a/drivers/pci/controller/pci-aardvark.c b/drivers/pci/controller/pci-aardvark.c
> index ff3af3d34028..c00b391529f3 100644
> --- a/drivers/pci/controller/pci-aardvark.c
> +++ b/drivers/pci/controller/pci-aardvark.c
> @@ -940,7 +940,7 @@ static int advk_pcie_probe(struct platform_device *pdev)
> }
>
> ret = pci_parse_request_of_pci_ranges(dev, &pcie->resources,
> - &bus);
> + &bridge->dma_ranges, &bus);
> if (ret) {
> dev_err(dev, "Failed to parse resources\n");
> return ret;
> diff --git a/drivers/pci/controller/pci-ftpci100.c b/drivers/pci/controller/pci-ftpci100.c
> index bf5ece5d9291..3e07a8203736 100644
> --- a/drivers/pci/controller/pci-ftpci100.c
> +++ b/drivers/pci/controller/pci-ftpci100.c
> @@ -481,7 +481,8 @@ static int faraday_pci_probe(struct platform_device *pdev)
> return PTR_ERR(p->base);
>
> ret = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff,
> - &res, &io_base);
> + &res, &host->dma_ranges,
> + &io_base);
> if (ret)
> return ret;
>
> diff --git a/drivers/pci/controller/pci-host-common.c b/drivers/pci/controller/pci-host-common.c
> index c742881b5061..183381c19ee8 100644
> --- a/drivers/pci/controller/pci-host-common.c
> +++ b/drivers/pci/controller/pci-host-common.c
> @@ -27,7 +27,7 @@ static struct pci_config_window *gen_pci_init(struct device *dev,
> struct pci_config_window *cfg;
>
> /* Parse our PCI ranges and request their resources */
> - err = pci_parse_request_of_pci_ranges(dev, resources, &bus_range);
> + err = pci_parse_request_of_pci_ranges(dev, resources, NULL, &bus_range);
> if (err)
> return ERR_PTR(err);
>
> diff --git a/drivers/pci/controller/pci-v3-semi.c b/drivers/pci/controller/pci-v3-semi.c
> index d219404bad92..090df766faf9 100644
> --- a/drivers/pci/controller/pci-v3-semi.c
> +++ b/drivers/pci/controller/pci-v3-semi.c
> @@ -794,7 +794,7 @@ static int v3_pci_probe(struct platform_device *pdev)
> return PTR_ERR(v3->config_base);
>
> ret = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff, &res,
> - &io_base);
> + &host->dma_ranges, &io_base);
> if (ret)
> return ret;
>
> diff --git a/drivers/pci/controller/pci-versatile.c b/drivers/pci/controller/pci-versatile.c
> index 237b1abb26f2..211159f54b4a 100644
> --- a/drivers/pci/controller/pci-versatile.c
> +++ b/drivers/pci/controller/pci-versatile.c
> @@ -93,7 +93,7 @@ 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, &pci_res, NULL);
> + ret = pci_parse_request_of_pci_ranges(dev, &pci_res, NULL, NULL);
> if (ret)
> return ret;
>
> diff --git a/drivers/pci/controller/pci-xgene.c b/drivers/pci/controller/pci-xgene.c
> index ffda3e8b4742..11f27c42c06a 100644
> --- a/drivers/pci/controller/pci-xgene.c
> +++ b/drivers/pci/controller/pci-xgene.c
> @@ -635,6 +635,7 @@ static int xgene_pcie_probe(struct platform_device *pdev)
> return ret;
>
> ret = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff, &res,
> + &bridge->dma_ranges,
> &iobase);
> if (ret)
> return ret;
> diff --git a/drivers/pci/controller/pcie-altera.c b/drivers/pci/controller/pcie-altera.c
> index 2ed00babff5a..fde6a3b16fb9 100644
> --- a/drivers/pci/controller/pcie-altera.c
> +++ b/drivers/pci/controller/pcie-altera.c
> @@ -801,7 +801,7 @@ static int altera_pcie_probe(struct platform_device *pdev)
> }
>
> ret = pci_parse_request_of_pci_ranges(dev, &pcie->resources,
> - NULL);
> + &bridge->dma_ranges, NULL);
> if (ret) {
> dev_err(dev, "Failed add resources\n");
> return ret;
> diff --git a/drivers/pci/controller/pcie-cadence-host.c b/drivers/pci/controller/pcie-cadence-host.c
> index 97e251090b4f..a8f7a6284c3e 100644
> --- a/drivers/pci/controller/pcie-cadence-host.c
> +++ b/drivers/pci/controller/pcie-cadence-host.c
> @@ -211,7 +211,7 @@ static int cdns_pcie_host_init(struct device *dev,
> int err;
>
> /* Parse our PCI ranges and request their resources */
> - err = pci_parse_request_of_pci_ranges(dev, resources, &bus_range);
> + err = pci_parse_request_of_pci_ranges(dev, resources, NULL, &bus_range);
> if (err)
> return err;
>
> diff --git a/drivers/pci/controller/pcie-iproc-platform.c b/drivers/pci/controller/pcie-iproc-platform.c
> index 5a3550b6bb29..62eee2d17f43 100644
> --- a/drivers/pci/controller/pcie-iproc-platform.c
> +++ b/drivers/pci/controller/pcie-iproc-platform.c
> @@ -101,6 +101,7 @@ static int iproc_pcie_pltfm_probe(struct platform_device *pdev)
> }
>
> ret = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff, &resources,
> + &bridge->dma_ranges,
> &iobase);
> if (ret) {
> dev_err(dev, "unable to get PCI host bridge resources\n");
> diff --git a/drivers/pci/controller/pcie-mediatek.c b/drivers/pci/controller/pcie-mediatek.c
> index cea4112b5309..f3996eed152d 100644
> --- a/drivers/pci/controller/pcie-mediatek.c
> +++ b/drivers/pci/controller/pcie-mediatek.c
> @@ -1032,7 +1032,7 @@ static int mtk_pcie_setup(struct mtk_pcie *pcie)
> int err;
>
> err = pci_parse_request_of_pci_ranges(dev, windows,
> - &bus);
> + &host->dma_ranges, &bus);
> if (err)
> return err;
>
> diff --git a/drivers/pci/controller/pcie-mobiveil.c b/drivers/pci/controller/pcie-mobiveil.c
> index 672e633601c7..93064faaa656 100644
> --- a/drivers/pci/controller/pcie-mobiveil.c
> +++ b/drivers/pci/controller/pcie-mobiveil.c
> @@ -875,7 +875,9 @@ static int mobiveil_pcie_probe(struct platform_device *pdev)
>
> /* parse the host bridge base addresses from the device tree file */
> ret = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff,
> - &pcie->resources, &iobase);
> + &pcie->resources,
> + &bridge->dma_ranges,
> + &iobase);
> if (ret) {
> dev_err(dev, "Getting bridge resources failed\n");
> return ret;
> diff --git a/drivers/pci/controller/pcie-rcar.c b/drivers/pci/controller/pcie-rcar.c
> index f6a669a9af41..b8d6e86a5539 100644
> --- a/drivers/pci/controller/pcie-rcar.c
> +++ b/drivers/pci/controller/pcie-rcar.c
> @@ -1138,7 +1138,8 @@ static int rcar_pcie_probe(struct platform_device *pdev)
> pcie->dev = dev;
> platform_set_drvdata(pdev, pcie);
>
> - err = pci_parse_request_of_pci_ranges(dev, &pcie->resources, NULL);
> + err = pci_parse_request_of_pci_ranges(dev, &pcie->resources,
> + &bridge->dma_ranges, NULL);
> if (err)
> goto err_free_bridge;
>
> diff --git a/drivers/pci/controller/pcie-rockchip-host.c b/drivers/pci/controller/pcie-rockchip-host.c
> index 8d20f1793a61..093b816b9dc9 100644
> --- a/drivers/pci/controller/pcie-rockchip-host.c
> +++ b/drivers/pci/controller/pcie-rockchip-host.c
> @@ -996,7 +996,8 @@ static int rockchip_pcie_probe(struct platform_device *pdev)
> goto err_deinit_port;
>
> err = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff,
> - &res, &io_base);
> + &res, &bridge->dma_ranges,
> + &io_base);
> if (err)
> goto err_remove_irq_domain;
>
> diff --git a/drivers/pci/controller/pcie-xilinx-nwl.c b/drivers/pci/controller/pcie-xilinx-nwl.c
> index 45c0f344ccd1..5c9132a02d15 100644
> --- a/drivers/pci/controller/pcie-xilinx-nwl.c
> +++ b/drivers/pci/controller/pcie-xilinx-nwl.c
> @@ -846,7 +846,7 @@ static int nwl_pcie_probe(struct platform_device *pdev)
> }
>
> err = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff, &res,
> - &iobase);
> + &bridge->dma_ranges, &iobase);
> if (err) {
> dev_err(dev, "Getting bridge resources failed\n");
> return err;
> diff --git a/drivers/pci/controller/pcie-xilinx.c b/drivers/pci/controller/pcie-xilinx.c
> index 5bf3af3b28e6..a95faca30291 100644
> --- a/drivers/pci/controller/pcie-xilinx.c
> +++ b/drivers/pci/controller/pcie-xilinx.c
> @@ -648,7 +648,7 @@ static int xilinx_pcie_probe(struct platform_device *pdev)
> }
>
> err = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff, &res,
> - &iobase);
> + &bridge->dma_ranges, &iobase);
> if (err) {
> dev_err(dev, "Getting bridge resources failed\n");
> return err;
> diff --git a/drivers/pci/of.c b/drivers/pci/of.c
> index bc7b27a28795..8d31e078461f 100644
> --- a/drivers/pci/of.c
> +++ b/drivers/pci/of.c
> @@ -257,7 +257,9 @@ EXPORT_SYMBOL_GPL(of_pci_check_probe_only);
> */
> int devm_of_pci_get_host_bridge_resources(struct device *dev,
> unsigned char busno, unsigned char bus_max,
> - struct list_head *resources, resource_size_t *io_base)
> + struct list_head *resources,
> + struct list_head *ib_resources,
> + resource_size_t *io_base)
> {
> struct device_node *dev_node = dev->of_node;
> struct resource *res, tmp_res;
> @@ -340,6 +342,42 @@ int devm_of_pci_get_host_bridge_resources(struct device *dev,
> pci_add_resource_offset(resources, res, res->start - range.pci_addr);
> }
>
> + /* Check for dma-ranges property */
> + if (!ib_resources)
> + return 0;
> + err = of_pci_dma_range_parser_init(&parser, dev_node);
> + if (err)
> + return 0;
> +
> + dev_dbg(dev, "Parsing dma-ranges property...\n");
> + for_each_of_pci_range(&parser, &range) {
> + /*
> + * If we failed translation or got a zero-sized region
> + * then skip this range
> + */
> + if (((range.flags & IORESOURCE_TYPE_BITS) != IORESOURCE_MEM) ||
> + range.cpu_addr == OF_BAD_ADDR || range.size == 0)
> + continue;
> +
> + dev_info(dev, "IB MEM %#010llx..%#010llx -> %#010llx\n",
> + range.cpu_addr,
> + range.cpu_addr + range.size - 1, range.pci_addr);
> +
> +
> + err = of_pci_range_to_resource(&range, dev_node, &tmp_res);
> + if (err)
> + continue;
> +
> + res = devm_kmemdup(dev, &tmp_res, sizeof(tmp_res), GFP_KERNEL);
> + if (!res) {
> + err = -ENOMEM;
> + goto failed;
> + }
> +
> + pci_add_resource_offset(ib_resources, res,
> + res->start - range.pci_addr);
> + }
> +
> return 0;
>
> failed:
> @@ -482,6 +520,7 @@ EXPORT_SYMBOL_GPL(of_irq_parse_and_map_pci);
>
> int pci_parse_request_of_pci_ranges(struct device *dev,
> struct list_head *resources,
> + struct list_head *ib_resources,
> struct resource **bus_range)
> {
> int err, res_valid = 0;
> @@ -489,8 +528,9 @@ int pci_parse_request_of_pci_ranges(struct device *dev,
> struct resource_entry *win, *tmp;
>
> INIT_LIST_HEAD(resources);
> + INIT_LIST_HEAD(ib_resources);
> err = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff, resources,
> - &iobase);
> + ib_resources, &iobase);
> if (err)
> return err;
>
> diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h
> index d22d1b807701..790458953c54 100644
> --- a/drivers/pci/pci.h
> +++ b/drivers/pci/pci.h
> @@ -582,11 +582,15 @@ of_pci_get_max_link_speed(struct device_node *node)
> #if defined(CONFIG_OF_ADDRESS)
> int devm_of_pci_get_host_bridge_resources(struct device *dev,
> unsigned char busno, unsigned char bus_max,
> - struct list_head *resources, resource_size_t *io_base);
> + struct list_head *resources,
> + struct list_head *ib_resources,
> + resource_size_t *io_base);
> #else
> static inline int devm_of_pci_get_host_bridge_resources(struct device *dev,
> unsigned char busno, unsigned char bus_max,
> - struct list_head *resources, resource_size_t *io_base)
> + struct list_head *resources,
> + struct list_head *ib_resources,
> + resource_size_t *io_base);
> {
> return -EINVAL;
> }
> diff --git a/include/linux/pci.h b/include/linux/pci.h
> index 82e4cd1b7ac3..d57389b86f92 100644
> --- a/include/linux/pci.h
> +++ b/include/linux/pci.h
> @@ -2312,6 +2312,7 @@ void pci_release_bus_of_node(struct pci_bus *bus);
> 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) */
> @@ -2326,6 +2327,7 @@ 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;
> --
> 2.20.1
>
>
> _______________________________________________
> linux-arm-kernel mailing list
> linux-arm-kernel@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 00/11] PCI dma-ranges parsing consolidation
2019-09-24 21:46 [PATCH 00/11] PCI dma-ranges parsing consolidation Rob Herring
2019-09-24 21:46 ` [PATCH 03/11] PCI: mediatek: Use pci_parse_request_of_pci_ranges() Rob Herring
2019-09-24 21:46 ` [PATCH 06/11] PCI: of: Add inbound resource parsing to helpers Rob Herring
@ 2019-09-26 8:49 ` Andrew Murray
2 siblings, 0 replies; 11+ messages in thread
From: Andrew Murray @ 2019-09-26 8:49 UTC (permalink / raw)
To: Rob Herring
Cc: Heiko Stuebner, Karthikeyan Mitran, linux-pci, Shawn Lin,
Ryder Lee, Matthias Brugger, Thomas Petazzoni, Toan Le,
Will Deacon, Lorenzo Pieralisi, Michal Simek, linux-rockchip,
bcm-kernel-feedback-list, Linus Walleij, Ray Jui, Hou Zhiqiang,
Simon Horman, linux-mediatek, Bjorn Helgaas, linux-arm-kernel,
Scott Branden, Gustavo Pimentel, rfi
On Tue, Sep 24, 2019 at 04:46:19PM -0500, Rob Herring wrote:
> This series moves the DT 'dma-ranges' parsing into common helpers
> utilizing a resource list. In the process of doing this, I noticed
> several cases where pci_parse_request_of_pci_ranges() could be used so
> I converted those drivers first. The last 5 patches make the actual
> change to use the common 'dma_ranges' resource list. There's no
> (intended) functional change in this series though I'm also working on
> a separate series to improve the handling of 'dma-ranges' and dma
> masks.
>
> pci-rcar-gen2 is the only remaining driver doing its own dma-ranges
> handling as it is still using the old ARM PCI functions. Looks like it
> is the last one (in drivers/pci/).
It also seems that pcie-tango is using of_pci_dma_range_parser_init
and so parsing dma-ranges. Though it's using the dma_ranges for a
slightly different purpose.
Thanks,
Andrew Murray
>
> Compile tested only.
>
> Rob
>
> Rob Herring (11):
> PCI: aardvark: Use pci_parse_request_of_pci_ranges()
> PCI: altera: Use pci_parse_request_of_pci_ranges()
> PCI: mediatek: Use pci_parse_request_of_pci_ranges()
> PCI: versatile: Enable COMPILE_TEST
> PCI: versatile: Use pci_parse_request_of_pci_ranges()
> PCI: of: Add inbound resource parsing to helpers
> PCI: ftpci100: Use inbound resources for setup
> PCI: v3-semi: Use inbound resources for setup
> PCI: xgene: Use inbound resources for setup
> PCI: iproc: Use inbound resources for setup
> PCI: rcar: Use inbound resources for setup
>
> drivers/pci/controller/Kconfig | 2 +-
> .../pci/controller/dwc/pcie-designware-host.c | 3 +-
> drivers/pci/controller/pci-aardvark.c | 58 ++---------------
> drivers/pci/controller/pci-ftpci100.c | 29 ++++-----
> drivers/pci/controller/pci-host-common.c | 2 +-
> drivers/pci/controller/pci-v3-semi.c | 40 +++++-------
> drivers/pci/controller/pci-versatile.c | 62 ++++--------------
> drivers/pci/controller/pci-xgene.c | 33 ++++------
> drivers/pci/controller/pcie-altera.c | 38 +----------
> drivers/pci/controller/pcie-cadence-host.c | 2 +-
> drivers/pci/controller/pcie-iproc-platform.c | 1 +
> drivers/pci/controller/pcie-iproc.c | 63 +++----------------
> drivers/pci/controller/pcie-mediatek.c | 47 +++++---------
> drivers/pci/controller/pcie-mobiveil.c | 4 +-
> drivers/pci/controller/pcie-rcar.c | 48 ++++++--------
> drivers/pci/controller/pcie-rockchip-host.c | 3 +-
> drivers/pci/controller/pcie-xilinx-nwl.c | 2 +-
> drivers/pci/controller/pcie-xilinx.c | 2 +-
> drivers/pci/of.c | 44 ++++++++++++-
> drivers/pci/pci.h | 8 ++-
> include/linux/pci.h | 2 +
> 21 files changed, 162 insertions(+), 331 deletions(-)
>
> --
> 2.20.1
>
> _______________________________________________
> linux-arm-kernel mailing list
> linux-arm-kernel@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply [flat|nested] 11+ messages in thread
* RE: [PATCH 06/11] PCI: of: Add inbound resource parsing to helpers
2019-09-24 21:46 ` [PATCH 06/11] PCI: of: Add inbound resource parsing to helpers Rob Herring
2019-09-25 9:00 ` Thomas Petazzoni
2019-09-26 8:29 ` Andrew Murray
@ 2019-09-26 10:43 ` Gustavo Pimentel
2019-09-27 16:12 ` Jingoo Han
` (2 subsequent siblings)
5 siblings, 0 replies; 11+ messages in thread
From: Gustavo Pimentel @ 2019-09-26 10:43 UTC (permalink / raw)
To: Rob Herring, linux-pci@vger.kernel.org, Bjorn Helgaas,
Lorenzo Pieralisi
Cc: Heiko Stuebner, Karthikeyan Mitran, Linus Walleij,
Thomas Petazzoni, Toan Le, Will Deacon, Ryder Lee, Michal Simek,
linux-rockchip@lists.infradead.org,
bcm-kernel-feedback-list@broadcom.com, Shawn Lin, Ray Jui,
Hou Zhiqiang, Simon Horman, linux-mediatek@lists.infradead.org,
linux-arm-kernel@lists.infradead.org, Scott Branden, Jingoo Han,
rfi@lists.rocketboards.org
On Tue, Sep 24, 2019 at 22:46:25, Rob Herring <robh@kernel.org> wrote:
> Extend devm_of_pci_get_host_bridge_resources() and
> pci_parse_request_of_pci_ranges() helpers to also parse the inbound
> addresses from DT 'dma-ranges' and populate a resource list with the
> translated addresses. This will help ensure 'dma-ranges' is always
> parsed in a consistent way.
>
> Cc: Jingoo Han <jingoohan1@gmail.com>
> Cc: Gustavo Pimentel <gustavo.pimentel@synopsys.com>
> Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
> Cc: Bjorn Helgaas <bhelgaas@google.com>
> Cc: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
> Cc: Will Deacon <will@kernel.org>
> Cc: Linus Walleij <linus.walleij@linaro.org>
> Cc: Toan Le <toan@os.amperecomputing.com>
> Cc: Ley Foon Tan <lftan@altera.com>
> Cc: Tom Joseph <tjoseph@cadence.com>
> Cc: Ray Jui <rjui@broadcom.com>
> Cc: Scott Branden <sbranden@broadcom.com>
> Cc: bcm-kernel-feedback-list@broadcom.com
> Cc: Ryder Lee <ryder.lee@mediatek.com>
> Cc: Karthikeyan Mitran <m.karthikeyan@mobiveil.co.in>
> Cc: Hou Zhiqiang <Zhiqiang.Hou@nxp.com>
> Cc: Simon Horman <horms@verge.net.au>
> Cc: Shawn Lin <shawn.lin@rock-chips.com>
> Cc: Heiko Stuebner <heiko@sntech.de>
> Cc: Michal Simek <michal.simek@xilinx.com>
> Cc: rfi@lists.rocketboards.org
> Cc: linux-mediatek@lists.infradead.org
> Cc: linux-renesas-soc@vger.kernel.org
> Cc: linux-rockchip@lists.infradead.org
> Signed-off-by: Rob Herring <robh@kernel.org>
> ---
> .../pci/controller/dwc/pcie-designware-host.c | 3 +-
> drivers/pci/controller/pci-aardvark.c | 2 +-
> drivers/pci/controller/pci-ftpci100.c | 3 +-
> drivers/pci/controller/pci-host-common.c | 2 +-
> drivers/pci/controller/pci-v3-semi.c | 2 +-
> drivers/pci/controller/pci-versatile.c | 2 +-
> drivers/pci/controller/pci-xgene.c | 1 +
> drivers/pci/controller/pcie-altera.c | 2 +-
> drivers/pci/controller/pcie-cadence-host.c | 2 +-
> drivers/pci/controller/pcie-iproc-platform.c | 1 +
> drivers/pci/controller/pcie-mediatek.c | 2 +-
> drivers/pci/controller/pcie-mobiveil.c | 4 +-
> drivers/pci/controller/pcie-rcar.c | 3 +-
> drivers/pci/controller/pcie-rockchip-host.c | 3 +-
> drivers/pci/controller/pcie-xilinx-nwl.c | 2 +-
> drivers/pci/controller/pcie-xilinx.c | 2 +-
> drivers/pci/of.c | 44 ++++++++++++++++++-
> drivers/pci/pci.h | 8 +++-
> include/linux/pci.h | 2 +
> 19 files changed, 72 insertions(+), 18 deletions(-)
>
> diff --git a/drivers/pci/controller/dwc/pcie-designware-host.c b/drivers/pci/controller/dwc/pcie-designware-host.c
> index f93252d0da5b..0743ae64bb0f 100644
> --- a/drivers/pci/controller/dwc/pcie-designware-host.c
> +++ b/drivers/pci/controller/dwc/pcie-designware-host.c
> @@ -342,7 +342,8 @@ int dw_pcie_host_init(struct pcie_port *pp)
> return -ENOMEM;
>
> ret = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff,
> - &bridge->windows, &pp->io_base);
> + &bridge->windows, &bridge->dma_ranges,
> + &pp->io_base);
> if (ret)
> return ret;
>
> diff --git a/drivers/pci/controller/pci-aardvark.c b/drivers/pci/controller/pci-aardvark.c
> index ff3af3d34028..c00b391529f3 100644
> --- a/drivers/pci/controller/pci-aardvark.c
> +++ b/drivers/pci/controller/pci-aardvark.c
> @@ -940,7 +940,7 @@ static int advk_pcie_probe(struct platform_device *pdev)
> }
>
> ret = pci_parse_request_of_pci_ranges(dev, &pcie->resources,
> - &bus);
> + &bridge->dma_ranges, &bus);
> if (ret) {
> dev_err(dev, "Failed to parse resources\n");
> return ret;
> diff --git a/drivers/pci/controller/pci-ftpci100.c b/drivers/pci/controller/pci-ftpci100.c
> index bf5ece5d9291..3e07a8203736 100644
> --- a/drivers/pci/controller/pci-ftpci100.c
> +++ b/drivers/pci/controller/pci-ftpci100.c
> @@ -481,7 +481,8 @@ static int faraday_pci_probe(struct platform_device *pdev)
> return PTR_ERR(p->base);
>
> ret = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff,
> - &res, &io_base);
> + &res, &host->dma_ranges,
> + &io_base);
> if (ret)
> return ret;
>
> diff --git a/drivers/pci/controller/pci-host-common.c b/drivers/pci/controller/pci-host-common.c
> index c742881b5061..183381c19ee8 100644
> --- a/drivers/pci/controller/pci-host-common.c
> +++ b/drivers/pci/controller/pci-host-common.c
> @@ -27,7 +27,7 @@ static struct pci_config_window *gen_pci_init(struct device *dev,
> struct pci_config_window *cfg;
>
> /* Parse our PCI ranges and request their resources */
> - err = pci_parse_request_of_pci_ranges(dev, resources, &bus_range);
> + err = pci_parse_request_of_pci_ranges(dev, resources, NULL, &bus_range);
> if (err)
> return ERR_PTR(err);
>
> diff --git a/drivers/pci/controller/pci-v3-semi.c b/drivers/pci/controller/pci-v3-semi.c
> index d219404bad92..090df766faf9 100644
> --- a/drivers/pci/controller/pci-v3-semi.c
> +++ b/drivers/pci/controller/pci-v3-semi.c
> @@ -794,7 +794,7 @@ static int v3_pci_probe(struct platform_device *pdev)
> return PTR_ERR(v3->config_base);
>
> ret = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff, &res,
> - &io_base);
> + &host->dma_ranges, &io_base);
> if (ret)
> return ret;
>
> diff --git a/drivers/pci/controller/pci-versatile.c b/drivers/pci/controller/pci-versatile.c
> index 237b1abb26f2..211159f54b4a 100644
> --- a/drivers/pci/controller/pci-versatile.c
> +++ b/drivers/pci/controller/pci-versatile.c
> @@ -93,7 +93,7 @@ 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, &pci_res, NULL);
> + ret = pci_parse_request_of_pci_ranges(dev, &pci_res, NULL, NULL);
> if (ret)
> return ret;
>
> diff --git a/drivers/pci/controller/pci-xgene.c b/drivers/pci/controller/pci-xgene.c
> index ffda3e8b4742..11f27c42c06a 100644
> --- a/drivers/pci/controller/pci-xgene.c
> +++ b/drivers/pci/controller/pci-xgene.c
> @@ -635,6 +635,7 @@ static int xgene_pcie_probe(struct platform_device *pdev)
> return ret;
>
> ret = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff, &res,
> + &bridge->dma_ranges,
> &iobase);
> if (ret)
> return ret;
> diff --git a/drivers/pci/controller/pcie-altera.c b/drivers/pci/controller/pcie-altera.c
> index 2ed00babff5a..fde6a3b16fb9 100644
> --- a/drivers/pci/controller/pcie-altera.c
> +++ b/drivers/pci/controller/pcie-altera.c
> @@ -801,7 +801,7 @@ static int altera_pcie_probe(struct platform_device *pdev)
> }
>
> ret = pci_parse_request_of_pci_ranges(dev, &pcie->resources,
> - NULL);
> + &bridge->dma_ranges, NULL);
> if (ret) {
> dev_err(dev, "Failed add resources\n");
> return ret;
> diff --git a/drivers/pci/controller/pcie-cadence-host.c b/drivers/pci/controller/pcie-cadence-host.c
> index 97e251090b4f..a8f7a6284c3e 100644
> --- a/drivers/pci/controller/pcie-cadence-host.c
> +++ b/drivers/pci/controller/pcie-cadence-host.c
> @@ -211,7 +211,7 @@ static int cdns_pcie_host_init(struct device *dev,
> int err;
>
> /* Parse our PCI ranges and request their resources */
> - err = pci_parse_request_of_pci_ranges(dev, resources, &bus_range);
> + err = pci_parse_request_of_pci_ranges(dev, resources, NULL, &bus_range);
> if (err)
> return err;
>
> diff --git a/drivers/pci/controller/pcie-iproc-platform.c b/drivers/pci/controller/pcie-iproc-platform.c
> index 5a3550b6bb29..62eee2d17f43 100644
> --- a/drivers/pci/controller/pcie-iproc-platform.c
> +++ b/drivers/pci/controller/pcie-iproc-platform.c
> @@ -101,6 +101,7 @@ static int iproc_pcie_pltfm_probe(struct platform_device *pdev)
> }
>
> ret = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff, &resources,
> + &bridge->dma_ranges,
> &iobase);
> if (ret) {
> dev_err(dev, "unable to get PCI host bridge resources\n");
> diff --git a/drivers/pci/controller/pcie-mediatek.c b/drivers/pci/controller/pcie-mediatek.c
> index cea4112b5309..f3996eed152d 100644
> --- a/drivers/pci/controller/pcie-mediatek.c
> +++ b/drivers/pci/controller/pcie-mediatek.c
> @@ -1032,7 +1032,7 @@ static int mtk_pcie_setup(struct mtk_pcie *pcie)
> int err;
>
> err = pci_parse_request_of_pci_ranges(dev, windows,
> - &bus);
> + &host->dma_ranges, &bus);
> if (err)
> return err;
>
> diff --git a/drivers/pci/controller/pcie-mobiveil.c b/drivers/pci/controller/pcie-mobiveil.c
> index 672e633601c7..93064faaa656 100644
> --- a/drivers/pci/controller/pcie-mobiveil.c
> +++ b/drivers/pci/controller/pcie-mobiveil.c
> @@ -875,7 +875,9 @@ static int mobiveil_pcie_probe(struct platform_device *pdev)
>
> /* parse the host bridge base addresses from the device tree file */
> ret = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff,
> - &pcie->resources, &iobase);
> + &pcie->resources,
> + &bridge->dma_ranges,
> + &iobase);
> if (ret) {
> dev_err(dev, "Getting bridge resources failed\n");
> return ret;
> diff --git a/drivers/pci/controller/pcie-rcar.c b/drivers/pci/controller/pcie-rcar.c
> index f6a669a9af41..b8d6e86a5539 100644
> --- a/drivers/pci/controller/pcie-rcar.c
> +++ b/drivers/pci/controller/pcie-rcar.c
> @@ -1138,7 +1138,8 @@ static int rcar_pcie_probe(struct platform_device *pdev)
> pcie->dev = dev;
> platform_set_drvdata(pdev, pcie);
>
> - err = pci_parse_request_of_pci_ranges(dev, &pcie->resources, NULL);
> + err = pci_parse_request_of_pci_ranges(dev, &pcie->resources,
> + &bridge->dma_ranges, NULL);
> if (err)
> goto err_free_bridge;
>
> diff --git a/drivers/pci/controller/pcie-rockchip-host.c b/drivers/pci/controller/pcie-rockchip-host.c
> index 8d20f1793a61..093b816b9dc9 100644
> --- a/drivers/pci/controller/pcie-rockchip-host.c
> +++ b/drivers/pci/controller/pcie-rockchip-host.c
> @@ -996,7 +996,8 @@ static int rockchip_pcie_probe(struct platform_device *pdev)
> goto err_deinit_port;
>
> err = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff,
> - &res, &io_base);
> + &res, &bridge->dma_ranges,
> + &io_base);
> if (err)
> goto err_remove_irq_domain;
>
> diff --git a/drivers/pci/controller/pcie-xilinx-nwl.c b/drivers/pci/controller/pcie-xilinx-nwl.c
> index 45c0f344ccd1..5c9132a02d15 100644
> --- a/drivers/pci/controller/pcie-xilinx-nwl.c
> +++ b/drivers/pci/controller/pcie-xilinx-nwl.c
> @@ -846,7 +846,7 @@ static int nwl_pcie_probe(struct platform_device *pdev)
> }
>
> err = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff, &res,
> - &iobase);
> + &bridge->dma_ranges, &iobase);
> if (err) {
> dev_err(dev, "Getting bridge resources failed\n");
> return err;
> diff --git a/drivers/pci/controller/pcie-xilinx.c b/drivers/pci/controller/pcie-xilinx.c
> index 5bf3af3b28e6..a95faca30291 100644
> --- a/drivers/pci/controller/pcie-xilinx.c
> +++ b/drivers/pci/controller/pcie-xilinx.c
> @@ -648,7 +648,7 @@ static int xilinx_pcie_probe(struct platform_device *pdev)
> }
>
> err = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff, &res,
> - &iobase);
> + &bridge->dma_ranges, &iobase);
> if (err) {
> dev_err(dev, "Getting bridge resources failed\n");
> return err;
> diff --git a/drivers/pci/of.c b/drivers/pci/of.c
> index bc7b27a28795..8d31e078461f 100644
> --- a/drivers/pci/of.c
> +++ b/drivers/pci/of.c
> @@ -257,7 +257,9 @@ EXPORT_SYMBOL_GPL(of_pci_check_probe_only);
> */
> int devm_of_pci_get_host_bridge_resources(struct device *dev,
> unsigned char busno, unsigned char bus_max,
> - struct list_head *resources, resource_size_t *io_base)
> + struct list_head *resources,
> + struct list_head *ib_resources,
> + resource_size_t *io_base)
> {
> struct device_node *dev_node = dev->of_node;
> struct resource *res, tmp_res;
> @@ -340,6 +342,42 @@ int devm_of_pci_get_host_bridge_resources(struct device *dev,
> pci_add_resource_offset(resources, res, res->start - range.pci_addr);
> }
>
> + /* Check for dma-ranges property */
> + if (!ib_resources)
> + return 0;
> + err = of_pci_dma_range_parser_init(&parser, dev_node);
> + if (err)
> + return 0;
> +
> + dev_dbg(dev, "Parsing dma-ranges property...\n");
> + for_each_of_pci_range(&parser, &range) {
> + /*
> + * If we failed translation or got a zero-sized region
> + * then skip this range
> + */
> + if (((range.flags & IORESOURCE_TYPE_BITS) != IORESOURCE_MEM) ||
> + range.cpu_addr == OF_BAD_ADDR || range.size == 0)
> + continue;
> +
> + dev_info(dev, "IB MEM %#010llx..%#010llx -> %#010llx\n",
> + range.cpu_addr,
> + range.cpu_addr + range.size - 1, range.pci_addr);
> +
> +
> + err = of_pci_range_to_resource(&range, dev_node, &tmp_res);
> + if (err)
> + continue;
> +
> + res = devm_kmemdup(dev, &tmp_res, sizeof(tmp_res), GFP_KERNEL);
> + if (!res) {
> + err = -ENOMEM;
> + goto failed;
> + }
> +
> + pci_add_resource_offset(ib_resources, res,
> + res->start - range.pci_addr);
> + }
> +
> return 0;
>
> failed:
> @@ -482,6 +520,7 @@ EXPORT_SYMBOL_GPL(of_irq_parse_and_map_pci);
>
> int pci_parse_request_of_pci_ranges(struct device *dev,
> struct list_head *resources,
> + struct list_head *ib_resources,
> struct resource **bus_range)
> {
> int err, res_valid = 0;
> @@ -489,8 +528,9 @@ int pci_parse_request_of_pci_ranges(struct device *dev,
> struct resource_entry *win, *tmp;
>
> INIT_LIST_HEAD(resources);
> + INIT_LIST_HEAD(ib_resources);
> err = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff, resources,
> - &iobase);
> + ib_resources, &iobase);
> if (err)
> return err;
>
> diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h
> index d22d1b807701..790458953c54 100644
> --- a/drivers/pci/pci.h
> +++ b/drivers/pci/pci.h
> @@ -582,11 +582,15 @@ of_pci_get_max_link_speed(struct device_node *node)
> #if defined(CONFIG_OF_ADDRESS)
> int devm_of_pci_get_host_bridge_resources(struct device *dev,
> unsigned char busno, unsigned char bus_max,
> - struct list_head *resources, resource_size_t *io_base);
> + struct list_head *resources,
> + struct list_head *ib_resources,
> + resource_size_t *io_base);
> #else
> static inline int devm_of_pci_get_host_bridge_resources(struct device *dev,
> unsigned char busno, unsigned char bus_max,
> - struct list_head *resources, resource_size_t *io_base)
> + struct list_head *resources,
> + struct list_head *ib_resources,
> + resource_size_t *io_base);
> {
> return -EINVAL;
> }
> diff --git a/include/linux/pci.h b/include/linux/pci.h
> index 82e4cd1b7ac3..d57389b86f92 100644
> --- a/include/linux/pci.h
> +++ b/include/linux/pci.h
> @@ -2312,6 +2312,7 @@ void pci_release_bus_of_node(struct pci_bus *bus);
> 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) */
> @@ -2326,6 +2327,7 @@ 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;
> --
> 2.20.1
Seems ok to me.
Acked-by: Gustavo Pimentel <gustavo.pimentel@synopsys.com>
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 06/11] PCI: of: Add inbound resource parsing to helpers
2019-09-24 21:46 ` [PATCH 06/11] PCI: of: Add inbound resource parsing to helpers Rob Herring
` (2 preceding siblings ...)
2019-09-26 10:43 ` Gustavo Pimentel
@ 2019-09-27 16:12 ` Jingoo Han
2019-09-27 16:12 ` Jingoo Han
2020-01-13 9:56 ` Bharat Kumar Gogada
5 siblings, 0 replies; 11+ messages in thread
From: Jingoo Han @ 2019-09-27 16:12 UTC (permalink / raw)
To: Rob Herring, linux-pci@vger.kernel.org, Bjorn Helgaas,
Lorenzo Pieralisi
Cc: Heiko Stuebner, Karthikeyan Mitran, Linus Walleij,
Thomas Petazzoni, Toan Le, Will Deacon, Ryder Lee, Michal Simek,
linux-rockchip@lists.infradead.org,
bcm-kernel-feedback-list@broadcom.com, Shawn Lin, Ray Jui,
Hou Zhiqiang, Simon Horman, linux-mediatek@lists.infradead.org,
linux-arm-kernel@lists.infradead.org, Scott Branden,
Gustavo Pimentel, rfi
> On 9/24/19, 5:46 PM, Rob Herring wrote:
>
> Extend devm_of_pci_get_host_bridge_resources() and
> pci_parse_request_of_pci_ranges() helpers to also parse the inbound
> addresses from DT 'dma-ranges' and populate a resource list with the
> translated addresses. This will help ensure 'dma-ranges' is always
> parsed in a consistent way.
>
> Cc: Jingoo Han <jingoohan1@gmail.com>
For /drivers/pci/controller/dwc/pcie-designware-host.c,
Acked-by: Jingoo Han <jingoohan1@gmail.com>
Best regards,
Jingoo Han
> Cc: Gustavo Pimentel <gustavo.pimentel@synopsys.com>
> Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
> Cc: Bjorn Helgaas <bhelgaas@google.com>
> Cc: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
> Cc: Will Deacon <will@kernel.org>
> Cc: Linus Walleij <linus.walleij@linaro.org>
> Cc: Toan Le <toan@os.amperecomputing.com>
> Cc: Ley Foon Tan <lftan@altera.com>
> Cc: Tom Joseph <tjoseph@cadence.com>
> Cc: Ray Jui <rjui@broadcom.com>
> Cc: Scott Branden <sbranden@broadcom.com>
> Cc: bcm-kernel-feedback-list@broadcom.com
> Cc: Ryder Lee <ryder.lee@mediatek.com>
> Cc: Karthikeyan Mitran <m.karthikeyan@mobiveil.co.in>
> Cc: Hou Zhiqiang <Zhiqiang.Hou@nxp.com>
> Cc: Simon Horman <horms@verge.net.au>
> Cc: Shawn Lin <shawn.lin@rock-chips.com>
> Cc: Heiko Stuebner <heiko@sntech.de>
> Cc: Michal Simek <michal.simek@xilinx.com>
> Cc: rfi@lists.rocketboards.org
> Cc: linux-mediatek@lists.infradead.org
> Cc: linux-renesas-soc@vger.kernel.org
> Cc: linux-rockchip@lists.infradead.org
> Signed-off-by: Rob Herring <robh@kernel.org>
> ---
> .../pci/controller/dwc/pcie-designware-host.c | 3 +-
....
> diff --git a/drivers/pci/controller/dwc/pcie-designware-host.c b/drivers/pci/controller/dwc/pcie-designware-host.c
> index f93252d0da5b..0743ae64bb0f 100644
> --- a/drivers/pci/controller/dwc/pcie-designware-host.c
> +++ b/drivers/pci/controller/dwc/pcie-designware-host.c
> @@ -342,7 +342,8 @@ int dw_pcie_host_init(struct pcie_port *pp)
> return -ENOMEM;
>
> ret = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff,
> - &bridge->windows, &pp->io_base);
> + &bridge->windows, &bridge->dma_ranges,
> + &pp->io_base);
> if (ret)
> return ret;
....
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 06/11] PCI: of: Add inbound resource parsing to helpers
2019-09-24 21:46 ` [PATCH 06/11] PCI: of: Add inbound resource parsing to helpers Rob Herring
` (3 preceding siblings ...)
2019-09-27 16:12 ` Jingoo Han
@ 2019-09-27 16:12 ` Jingoo Han
2020-01-13 9:56 ` Bharat Kumar Gogada
5 siblings, 0 replies; 11+ messages in thread
From: Jingoo Han @ 2019-09-27 16:12 UTC (permalink / raw)
To: Rob Herring, linux-pci@vger.kernel.org, Bjorn Helgaas,
Lorenzo Pieralisi
Cc: Heiko Stuebner, Karthikeyan Mitran, Linus Walleij,
Thomas Petazzoni, Toan Le, Will Deacon, Ryder Lee, Michal Simek,
linux-rockchip@lists.infradead.org,
bcm-kernel-feedback-list@broadcom.com, Shawn Lin, Ray Jui,
Hou Zhiqiang, Simon Horman, linux-mediatek@lists.infradead.org,
linux-arm-kernel@lists.infradead.org, Scott Branden,
Gustavo Pimentel, rfi
> On 9/24/19, 5:46 PM, Rob Herring wrote:
>
> Extend devm_of_pci_get_host_bridge_resources() and
> pci_parse_request_of_pci_ranges() helpers to also parse the inbound
> addresses from DT 'dma-ranges' and populate a resource list with the
> translated addresses. This will help ensure 'dma-ranges' is always
> parsed in a consistent way.
>
> Cc: Jingoo Han <jingoohan1@gmail.com>
For /drivers/pci/controller/dwc/pcie-designware-host.c,
Acked-by: Jingoo Han <jingoohan1@gmail.com>
Best regards,
Jingoo Han
> Cc: Gustavo Pimentel <gustavo.pimentel@synopsys.com>
> Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
> Cc: Bjorn Helgaas <bhelgaas@google.com>
> Cc: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
> Cc: Will Deacon <will@kernel.org>
> Cc: Linus Walleij <linus.walleij@linaro.org>
> Cc: Toan Le <toan@os.amperecomputing.com>
> Cc: Ley Foon Tan <lftan@altera.com>
> Cc: Tom Joseph <tjoseph@cadence.com>
> Cc: Ray Jui <rjui@broadcom.com>
> Cc: Scott Branden <sbranden@broadcom.com>
> Cc: bcm-kernel-feedback-list@broadcom.com
> Cc: Ryder Lee <ryder.lee@mediatek.com>
> Cc: Karthikeyan Mitran <m.karthikeyan@mobiveil.co.in>
> Cc: Hou Zhiqiang <Zhiqiang.Hou@nxp.com>
> Cc: Simon Horman <horms@verge.net.au>
> Cc: Shawn Lin <shawn.lin@rock-chips.com>
> Cc: Heiko Stuebner <heiko@sntech.de>
> Cc: Michal Simek <michal.simek@xilinx.com>
> Cc: rfi@lists.rocketboards.org
> Cc: linux-mediatek@lists.infradead.org
> Cc: linux-renesas-soc@vger.kernel.org
> Cc: linux-rockchip@lists.infradead.org
> Signed-off-by: Rob Herring <robh@kernel.org>
> ---
> .../pci/controller/dwc/pcie-designware-host.c | 3 +-
....
> diff --git a/drivers/pci/controller/dwc/pcie-designware-host.c b/drivers/pci/controller/dwc/pcie-designware-host.c
> index f93252d0da5b..0743ae64bb0f 100644
> --- a/drivers/pci/controller/dwc/pcie-designware-host.c
> +++ b/drivers/pci/controller/dwc/pcie-designware-host.c
> @@ -342,7 +342,8 @@ int dw_pcie_host_init(struct pcie_port *pp)
> return -ENOMEM;
>
> ret = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff,
> - &bridge->windows, &pp->io_base);
> + &bridge->windows, &bridge->dma_ranges,
> + &pp->io_base);
> if (ret)
> return ret;
....
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH 06/11] PCI: of: Add inbound resource parsing to helpers
2019-09-24 21:46 ` [PATCH 06/11] PCI: of: Add inbound resource parsing to helpers Rob Herring
` (4 preceding siblings ...)
2019-09-27 16:12 ` Jingoo Han
@ 2020-01-13 9:56 ` Bharat Kumar Gogada
5 siblings, 0 replies; 11+ messages in thread
From: Bharat Kumar Gogada @ 2020-01-13 9:56 UTC (permalink / raw)
To: git-dev, linux-pci, Bjorn Helgaas, Lorenzo Pieralisi
Cc: Heiko Stuebner, Karthikeyan Mitran, Linus Walleij,
Thomas Petazzoni, Toan Le, Will Deacon, Rob Herring, Ryder Lee,
linux-mediatek, Michal Simek, linux-rockchip,
bcm-kernel-feedback-list, michals, Shawn Lin, Ray Jui,
Hou Zhiqiang, Simon Horman, rgummal, linux-arm-kernel,
Scott Branden, Jingoo Han, rfi, linux-renesas-soc, Tom Joseph,
Gustavo Pimentel, Ley Foon Tan
From: Rob Herring <robh@kernel.org>
Extend devm_of_pci_get_host_bridge_resources() and
pci_parse_request_of_pci_ranges() helpers to also parse the inbound
addresses from DT 'dma-ranges' and populate a resource list with the
translated addresses. This will help ensure 'dma-ranges' is always
parsed in a consistent way.
Cc: Jingoo Han <jingoohan1@gmail.com>
Cc: Gustavo Pimentel <gustavo.pimentel@synopsys.com>
Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Cc: Bjorn Helgaas <bhelgaas@google.com>
Cc: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
Cc: Will Deacon <will@kernel.org>
Cc: Linus Walleij <linus.walleij@linaro.org>
Cc: Toan Le <toan@os.amperecomputing.com>
Cc: Ley Foon Tan <lftan@altera.com>
Cc: Tom Joseph <tjoseph@cadence.com>
Cc: Ray Jui <rjui@broadcom.com>
Cc: Scott Branden <sbranden@broadcom.com>
Cc: bcm-kernel-feedback-list@broadcom.com
Cc: Ryder Lee <ryder.lee@mediatek.com>
Cc: Karthikeyan Mitran <m.karthikeyan@mobiveil.co.in>
Cc: Hou Zhiqiang <Zhiqiang.Hou@nxp.com>
Cc: Simon Horman <horms@verge.net.au>
Cc: Shawn Lin <shawn.lin@rock-chips.com>
Cc: Heiko Stuebner <heiko@sntech.de>
Cc: Michal Simek <michal.simek@xilinx.com>
Cc: rfi@lists.rocketboards.org
Cc: linux-mediatek@lists.infradead.org
Cc: linux-renesas-soc@vger.kernel.org
Cc: linux-rockchip@lists.infradead.org
Signed-off-by: Rob Herring <robh@kernel.org>
Tested-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
Reviewed-by: Andrew Murray <andrew.murray@arm.com>
Acked-by: Gustavo Pimentel <gustavo.pimentel@synopsys.com>
Acked-by: Jingoo Han <jingoohan1@gmail.com>
Acked-by: Jingoo Han <jingoohan1@gmail.com>
---
.../pci/controller/dwc/pcie-designware-host.c | 3 +-
drivers/pci/controller/pci-aardvark.c | 2 +-
drivers/pci/controller/pci-ftpci100.c | 3 +-
drivers/pci/controller/pci-host-common.c | 2 +-
drivers/pci/controller/pci-v3-semi.c | 2 +-
drivers/pci/controller/pci-versatile.c | 2 +-
drivers/pci/controller/pci-xgene.c | 1 +
drivers/pci/controller/pcie-altera.c | 2 +-
drivers/pci/controller/pcie-cadence-host.c | 2 +-
drivers/pci/controller/pcie-iproc-platform.c | 1 +
drivers/pci/controller/pcie-mediatek.c | 2 +-
drivers/pci/controller/pcie-mobiveil.c | 4 +-
drivers/pci/controller/pcie-rcar.c | 3 +-
drivers/pci/controller/pcie-rockchip-host.c | 3 +-
drivers/pci/controller/pcie-xilinx-nwl.c | 2 +-
drivers/pci/controller/pcie-xilinx.c | 2 +-
drivers/pci/of.c | 44 ++++++++++++++++++-
drivers/pci/pci.h | 8 +++-
include/linux/pci.h | 2 +
19 files changed, 72 insertions(+), 18 deletions(-)
diff --git a/drivers/pci/controller/dwc/pcie-designware-host.c b/drivers/pci/controller/dwc/pcie-designware-host.c
index f93252d0da5b..0743ae64bb0f 100644
--- a/drivers/pci/controller/dwc/pcie-designware-host.c
+++ b/drivers/pci/controller/dwc/pcie-designware-host.c
@@ -342,7 +342,8 @@ int dw_pcie_host_init(struct pcie_port *pp)
return -ENOMEM;
ret = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff,
- &bridge->windows, &pp->io_base);
+ &bridge->windows, &bridge->dma_ranges,
+ &pp->io_base);
if (ret)
return ret;
diff --git a/drivers/pci/controller/pci-aardvark.c b/drivers/pci/controller/pci-aardvark.c
index ff3af3d34028..c00b391529f3 100644
--- a/drivers/pci/controller/pci-aardvark.c
+++ b/drivers/pci/controller/pci-aardvark.c
@@ -940,7 +940,7 @@ static int advk_pcie_probe(struct platform_device *pdev)
}
ret = pci_parse_request_of_pci_ranges(dev, &pcie->resources,
- &bus);
+ &bridge->dma_ranges, &bus);
if (ret) {
dev_err(dev, "Failed to parse resources\n");
return ret;
diff --git a/drivers/pci/controller/pci-ftpci100.c b/drivers/pci/controller/pci-ftpci100.c
index bf5ece5d9291..3e07a8203736 100644
--- a/drivers/pci/controller/pci-ftpci100.c
+++ b/drivers/pci/controller/pci-ftpci100.c
@@ -481,7 +481,8 @@ static int faraday_pci_probe(struct platform_device *pdev)
return PTR_ERR(p->base);
ret = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff,
- &res, &io_base);
+ &res, &host->dma_ranges,
+ &io_base);
if (ret)
return ret;
diff --git a/drivers/pci/controller/pci-host-common.c b/drivers/pci/controller/pci-host-common.c
index c742881b5061..183381c19ee8 100644
--- a/drivers/pci/controller/pci-host-common.c
+++ b/drivers/pci/controller/pci-host-common.c
@@ -27,7 +27,7 @@ static struct pci_config_window *gen_pci_init(struct device *dev,
struct pci_config_window *cfg;
/* Parse our PCI ranges and request their resources */
- err = pci_parse_request_of_pci_ranges(dev, resources, &bus_range);
+ err = pci_parse_request_of_pci_ranges(dev, resources, NULL, &bus_range);
if (err)
return ERR_PTR(err);
diff --git a/drivers/pci/controller/pci-v3-semi.c b/drivers/pci/controller/pci-v3-semi.c
index d219404bad92..090df766faf9 100644
--- a/drivers/pci/controller/pci-v3-semi.c
+++ b/drivers/pci/controller/pci-v3-semi.c
@@ -794,7 +794,7 @@ static int v3_pci_probe(struct platform_device *pdev)
return PTR_ERR(v3->config_base);
ret = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff, &res,
- &io_base);
+ &host->dma_ranges, &io_base);
if (ret)
return ret;
diff --git a/drivers/pci/controller/pci-versatile.c b/drivers/pci/controller/pci-versatile.c
index 237b1abb26f2..211159f54b4a 100644
--- a/drivers/pci/controller/pci-versatile.c
+++ b/drivers/pci/controller/pci-versatile.c
@@ -93,7 +93,7 @@ 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, &pci_res, NULL);
+ ret = pci_parse_request_of_pci_ranges(dev, &pci_res, NULL, NULL);
if (ret)
return ret;
diff --git a/drivers/pci/controller/pci-xgene.c b/drivers/pci/controller/pci-xgene.c
index ffda3e8b4742..11f27c42c06a 100644
--- a/drivers/pci/controller/pci-xgene.c
+++ b/drivers/pci/controller/pci-xgene.c
@@ -635,6 +635,7 @@ static int xgene_pcie_probe(struct platform_device *pdev)
return ret;
ret = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff, &res,
+ &bridge->dma_ranges,
&iobase);
if (ret)
return ret;
diff --git a/drivers/pci/controller/pcie-altera.c b/drivers/pci/controller/pcie-altera.c
index 2ed00babff5a..fde6a3b16fb9 100644
--- a/drivers/pci/controller/pcie-altera.c
+++ b/drivers/pci/controller/pcie-altera.c
@@ -801,7 +801,7 @@ static int altera_pcie_probe(struct platform_device *pdev)
}
ret = pci_parse_request_of_pci_ranges(dev, &pcie->resources,
- NULL);
+ &bridge->dma_ranges, NULL);
if (ret) {
dev_err(dev, "Failed add resources\n");
return ret;
diff --git a/drivers/pci/controller/pcie-cadence-host.c b/drivers/pci/controller/pcie-cadence-host.c
index 97e251090b4f..a8f7a6284c3e 100644
--- a/drivers/pci/controller/pcie-cadence-host.c
+++ b/drivers/pci/controller/pcie-cadence-host.c
@@ -211,7 +211,7 @@ static int cdns_pcie_host_init(struct device *dev,
int err;
/* Parse our PCI ranges and request their resources */
- err = pci_parse_request_of_pci_ranges(dev, resources, &bus_range);
+ err = pci_parse_request_of_pci_ranges(dev, resources, NULL, &bus_range);
if (err)
return err;
diff --git a/drivers/pci/controller/pcie-iproc-platform.c b/drivers/pci/controller/pcie-iproc-platform.c
index 5a3550b6bb29..62eee2d17f43 100644
--- a/drivers/pci/controller/pcie-iproc-platform.c
+++ b/drivers/pci/controller/pcie-iproc-platform.c
@@ -101,6 +101,7 @@ static int iproc_pcie_pltfm_probe(struct platform_device *pdev)
}
ret = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff, &resources,
+ &bridge->dma_ranges,
&iobase);
if (ret) {
dev_err(dev, "unable to get PCI host bridge resources\n");
diff --git a/drivers/pci/controller/pcie-mediatek.c b/drivers/pci/controller/pcie-mediatek.c
index cea4112b5309..f3996eed152d 100644
--- a/drivers/pci/controller/pcie-mediatek.c
+++ b/drivers/pci/controller/pcie-mediatek.c
@@ -1032,7 +1032,7 @@ static int mtk_pcie_setup(struct mtk_pcie *pcie)
int err;
err = pci_parse_request_of_pci_ranges(dev, windows,
- &bus);
+ &host->dma_ranges, &bus);
if (err)
return err;
diff --git a/drivers/pci/controller/pcie-mobiveil.c b/drivers/pci/controller/pcie-mobiveil.c
index 672e633601c7..93064faaa656 100644
--- a/drivers/pci/controller/pcie-mobiveil.c
+++ b/drivers/pci/controller/pcie-mobiveil.c
@@ -875,7 +875,9 @@ static int mobiveil_pcie_probe(struct platform_device *pdev)
/* parse the host bridge base addresses from the device tree file */
ret = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff,
- &pcie->resources, &iobase);
+ &pcie->resources,
+ &bridge->dma_ranges,
+ &iobase);
if (ret) {
dev_err(dev, "Getting bridge resources failed\n");
return ret;
diff --git a/drivers/pci/controller/pcie-rcar.c b/drivers/pci/controller/pcie-rcar.c
index f6a669a9af41..b8d6e86a5539 100644
--- a/drivers/pci/controller/pcie-rcar.c
+++ b/drivers/pci/controller/pcie-rcar.c
@@ -1138,7 +1138,8 @@ static int rcar_pcie_probe(struct platform_device *pdev)
pcie->dev = dev;
platform_set_drvdata(pdev, pcie);
- err = pci_parse_request_of_pci_ranges(dev, &pcie->resources, NULL);
+ err = pci_parse_request_of_pci_ranges(dev, &pcie->resources,
+ &bridge->dma_ranges, NULL);
if (err)
goto err_free_bridge;
diff --git a/drivers/pci/controller/pcie-rockchip-host.c b/drivers/pci/controller/pcie-rockchip-host.c
index 8d20f1793a61..093b816b9dc9 100644
--- a/drivers/pci/controller/pcie-rockchip-host.c
+++ b/drivers/pci/controller/pcie-rockchip-host.c
@@ -996,7 +996,8 @@ static int rockchip_pcie_probe(struct platform_device *pdev)
goto err_deinit_port;
err = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff,
- &res, &io_base);
+ &res, &bridge->dma_ranges,
+ &io_base);
if (err)
goto err_remove_irq_domain;
diff --git a/drivers/pci/controller/pcie-xilinx-nwl.c b/drivers/pci/controller/pcie-xilinx-nwl.c
index 45c0f344ccd1..5c9132a02d15 100644
--- a/drivers/pci/controller/pcie-xilinx-nwl.c
+++ b/drivers/pci/controller/pcie-xilinx-nwl.c
@@ -846,7 +846,7 @@ static int nwl_pcie_probe(struct platform_device *pdev)
}
err = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff, &res,
- &iobase);
+ &bridge->dma_ranges, &iobase);
if (err) {
dev_err(dev, "Getting bridge resources failed\n");
return err;
diff --git a/drivers/pci/controller/pcie-xilinx.c b/drivers/pci/controller/pcie-xilinx.c
index 5bf3af3b28e6..a95faca30291 100644
--- a/drivers/pci/controller/pcie-xilinx.c
+++ b/drivers/pci/controller/pcie-xilinx.c
@@ -648,7 +648,7 @@ static int xilinx_pcie_probe(struct platform_device *pdev)
}
err = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff, &res,
- &iobase);
+ &bridge->dma_ranges, &iobase);
if (err) {
dev_err(dev, "Getting bridge resources failed\n");
return err;
diff --git a/drivers/pci/of.c b/drivers/pci/of.c
index bc7b27a28795..8d31e078461f 100644
--- a/drivers/pci/of.c
+++ b/drivers/pci/of.c
@@ -257,7 +257,9 @@ EXPORT_SYMBOL_GPL(of_pci_check_probe_only);
*/
int devm_of_pci_get_host_bridge_resources(struct device *dev,
unsigned char busno, unsigned char bus_max,
- struct list_head *resources, resource_size_t *io_base)
+ struct list_head *resources,
+ struct list_head *ib_resources,
+ resource_size_t *io_base)
{
struct device_node *dev_node = dev->of_node;
struct resource *res, tmp_res;
@@ -340,6 +342,42 @@ int devm_of_pci_get_host_bridge_resources(struct device *dev,
pci_add_resource_offset(resources, res, res->start - range.pci_addr);
}
+ /* Check for dma-ranges property */
+ if (!ib_resources)
+ return 0;
+ err = of_pci_dma_range_parser_init(&parser, dev_node);
+ if (err)
+ return 0;
+
+ dev_dbg(dev, "Parsing dma-ranges property...\n");
+ for_each_of_pci_range(&parser, &range) {
+ /*
+ * If we failed translation or got a zero-sized region
+ * then skip this range
+ */
+ if (((range.flags & IORESOURCE_TYPE_BITS) != IORESOURCE_MEM) ||
+ range.cpu_addr == OF_BAD_ADDR || range.size == 0)
+ continue;
+
+ dev_info(dev, "IB MEM %#010llx..%#010llx -> %#010llx\n",
+ range.cpu_addr,
+ range.cpu_addr + range.size - 1, range.pci_addr);
+
+
+ err = of_pci_range_to_resource(&range, dev_node, &tmp_res);
+ if (err)
+ continue;
+
+ res = devm_kmemdup(dev, &tmp_res, sizeof(tmp_res), GFP_KERNEL);
+ if (!res) {
+ err = -ENOMEM;
+ goto failed;
+ }
+
+ pci_add_resource_offset(ib_resources, res,
+ res->start - range.pci_addr);
+ }
+
return 0;
failed:
@@ -482,6 +520,7 @@ EXPORT_SYMBOL_GPL(of_irq_parse_and_map_pci);
int pci_parse_request_of_pci_ranges(struct device *dev,
struct list_head *resources,
+ struct list_head *ib_resources,
struct resource **bus_range)
{
int err, res_valid = 0;
@@ -489,8 +528,9 @@ int pci_parse_request_of_pci_ranges(struct device *dev,
struct resource_entry *win, *tmp;
INIT_LIST_HEAD(resources);
+ INIT_LIST_HEAD(ib_resources);
err = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff, resources,
- &iobase);
+ ib_resources, &iobase);
if (err)
return err;
diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h
index d22d1b807701..790458953c54 100644
--- a/drivers/pci/pci.h
+++ b/drivers/pci/pci.h
@@ -582,11 +582,15 @@ of_pci_get_max_link_speed(struct device_node *node)
#if defined(CONFIG_OF_ADDRESS)
int devm_of_pci_get_host_bridge_resources(struct device *dev,
unsigned char busno, unsigned char bus_max,
- struct list_head *resources, resource_size_t *io_base);
+ struct list_head *resources,
+ struct list_head *ib_resources,
+ resource_size_t *io_base);
#else
static inline int devm_of_pci_get_host_bridge_resources(struct device *dev,
unsigned char busno, unsigned char bus_max,
- struct list_head *resources, resource_size_t *io_base)
+ struct list_head *resources,
+ struct list_head *ib_resources,
+ resource_size_t *io_base);
{
return -EINVAL;
}
diff --git a/include/linux/pci.h b/include/linux/pci.h
index 82e4cd1b7ac3..d57389b86f92 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -2312,6 +2312,7 @@ void pci_release_bus_of_node(struct pci_bus *bus);
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) */
@@ -2326,6 +2327,7 @@ 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;
_______________________________________________
Linux-mediatek mailing list
Linux-mediatek@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-mediatek
^ permalink raw reply related [flat|nested] 11+ messages in thread
end of thread, other threads:[~2020-01-13 9:59 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2019-09-24 21:46 [PATCH 00/11] PCI dma-ranges parsing consolidation Rob Herring
2019-09-24 21:46 ` [PATCH 03/11] PCI: mediatek: Use pci_parse_request_of_pci_ranges() Rob Herring
2019-09-25 11:34 ` Andrew Murray
2019-09-24 21:46 ` [PATCH 06/11] PCI: of: Add inbound resource parsing to helpers Rob Herring
2019-09-25 9:00 ` Thomas Petazzoni
2019-09-26 8:29 ` Andrew Murray
2019-09-26 10:43 ` Gustavo Pimentel
2019-09-27 16:12 ` Jingoo Han
2019-09-27 16:12 ` Jingoo Han
2020-01-13 9:56 ` Bharat Kumar Gogada
2019-09-26 8:49 ` [PATCH 00/11] PCI dma-ranges parsing consolidation Andrew Murray
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).