linux-pci.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v3 00/25] PCI host resource consolidation
@ 2019-10-28 16:32 Rob Herring
  2019-10-28 16:32 ` [PATCH v3 01/25] resource: Add a resource_list_first_type helper Rob Herring
                   ` (25 more replies)
  0 siblings, 26 replies; 49+ messages in thread
From: Rob Herring @ 2019-10-28 16:32 UTC (permalink / raw)
  To: Andrew Murray, Bjorn Helgaas, Lorenzo Pieralisi
  Cc: linux-pci, linux-arm-kernel, bcm-kernel-feedback-list,
	Christoph Hellwig, Gustavo Pimentel, Heiko Stuebner,
	Hou Zhiqiang, Jingoo Han, Karthikeyan Mitran, Ley Foon Tan,
	Linus Walleij, linux-mediatek, linux-renesas-soc, linux-rockchip,
	Matthias Brugger, Michal Simek, Ray Jui, rfi, Ryder Lee,
	Scott Branden, Shawn Lin, Simon Horman, Srinath Mannam,
	Thomas Petazzoni, Toan Le, Tom Joseph, Will Deacon

This started with just dma-ranges parsing consolidation, but has expanded
to converting all host drivers to use pci_parse_request_of_pci_ranges()
rather than devm_of_pci_get_host_bridge_resources(). This series moves
the DT 'dma-ranges' parsing into common helpers utilizing a resource list.
There's no (intended) functional change in this series though I'm also
working on a separate series now in dt/next to improve the handling of
'dma-ranges' and dma masks.

The last patch may need to wait if there's any new users of
devm_of_pci_get_host_bridge_resources.

Only versatile has been tested (on QEMU). The rest is compiled only. A git
branch is here[1].

v3:
- Fix >80 char lines
- Rename resource_list_get_entry_of_type to resource_list_first_type

Rob

[1] git://git.kernel.org/pub/scm/linux/kernel/git/robh/linux.git pci-ranges-cleanup-v3


Rob Herring (25):
  resource: Add a resource_list_first_type helper
  PCI: Export pci_parse_request_of_pci_ranges()
  PCI: aardvark: Use pci_parse_request_of_pci_ranges()
  PCI: altera: Use pci_parse_request_of_pci_ranges()
  PCI: dwc: Use pci_parse_request_of_pci_ranges()
  PCI: faraday: Use pci_parse_request_of_pci_ranges()
  PCI: iproc: Use pci_parse_request_of_pci_ranges()
  PCI: mediatek: Use pci_parse_request_of_pci_ranges()
  PCI: mobiveil: Use pci_parse_request_of_pci_ranges()
  PCI: rockchip: Use pci_parse_request_of_pci_ranges()
  PCI: rockchip: Drop storing driver private outbound resource data
  PCI: v3-semi: Use pci_parse_request_of_pci_ranges()
  PCI: xgene: Use pci_parse_request_of_pci_ranges()
  PCI: xilinx: Use pci_parse_request_of_pci_ranges()
  PCI: xilinx-nwl: Use pci_parse_request_of_pci_ranges()
  PCI: versatile: Use pci_parse_request_of_pci_ranges()
  PCI: versatile: Remove usage of PHYS_OFFSET
  PCI: versatile: Enable COMPILE_TEST
  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
  PCI: Make devm_of_pci_get_host_bridge_resources() static

 drivers/pci/controller/Kconfig                |  2 +-
 .../pci/controller/dwc/pcie-designware-host.c | 29 ++----
 drivers/pci/controller/pci-aardvark.c         | 60 +------------
 drivers/pci/controller/pci-ftpci100.c         | 79 +++++-----------
 drivers/pci/controller/pci-host-common.c      |  2 +-
 drivers/pci/controller/pci-v3-semi.c          | 74 +++++----------
 drivers/pci/controller/pci-versatile.c        | 71 ++++-----------
 drivers/pci/controller/pci-xgene.c            | 73 +++++----------
 drivers/pci/controller/pcie-altera.c          | 41 +--------
 drivers/pci/controller/pcie-cadence-host.c    |  2 +-
 drivers/pci/controller/pcie-iproc-platform.c  |  9 +-
 drivers/pci/controller/pcie-iproc.c           | 82 ++++-------------
 drivers/pci/controller/pcie-mediatek.c        | 43 +++------
 drivers/pci/controller/pcie-mobiveil.c        | 27 ++----
 drivers/pci/controller/pcie-rcar.c            | 48 ++++------
 drivers/pci/controller/pcie-rockchip-host.c   | 89 +++++++------------
 drivers/pci/controller/pcie-rockchip.h        |  5 --
 drivers/pci/controller/pcie-xilinx-nwl.c      | 21 ++---
 drivers/pci/controller/pcie-xilinx.c          | 18 +---
 drivers/pci/of.c                              | 51 +++++++++--
 drivers/pci/pci.h                             | 13 ---
 include/linux/pci.h                           |  9 +-
 include/linux/resource_ext.h                  | 12 +++
 23 files changed, 261 insertions(+), 599 deletions(-)

--
2.20.1

^ permalink raw reply	[flat|nested] 49+ messages in thread

* [PATCH v3 01/25] resource: Add a resource_list_first_type helper
  2019-10-28 16:32 [PATCH v3 00/25] PCI host resource consolidation Rob Herring
@ 2019-10-28 16:32 ` Rob Herring
  2019-10-28 16:32 ` [PATCH v3 02/25] PCI: Export pci_parse_request_of_pci_ranges() Rob Herring
                   ` (24 subsequent siblings)
  25 siblings, 0 replies; 49+ messages in thread
From: Rob Herring @ 2019-10-28 16:32 UTC (permalink / raw)
  To: Andrew Murray, Bjorn Helgaas, Lorenzo Pieralisi
  Cc: linux-pci, linux-arm-kernel, bcm-kernel-feedback-list,
	Christoph Hellwig, Gustavo Pimentel, Heiko Stuebner,
	Hou Zhiqiang, Jingoo Han, Karthikeyan Mitran, Ley Foon Tan,
	Linus Walleij, linux-mediatek, linux-renesas-soc, linux-rockchip,
	Matthias Brugger, Michal Simek, Ray Jui, rfi, Ryder Lee,
	Scott Branden, Shawn Lin, Simon Horman, Srinath Mannam,
	Thomas Petazzoni, Toan Le, Tom Joseph, Will Deacon

A common pattern is looping over a resource_list just to get a matching
entry with a specific type. Add resource_list_first_type() helper which
implements this.

Signed-off-by: Rob Herring <robh@kernel.org>
---
v3:
- Rename resource_list_get_entry_of_type to resource_list_first_type

 include/linux/resource_ext.h | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/include/linux/resource_ext.h b/include/linux/resource_ext.h
index 06da59b23b79..ff0339df56af 100644
--- a/include/linux/resource_ext.h
+++ b/include/linux/resource_ext.h
@@ -66,4 +66,16 @@ resource_list_destroy_entry(struct resource_entry *entry)
 #define resource_list_for_each_entry_safe(entry, tmp, list)	\
 	list_for_each_entry_safe((entry), (tmp), (list), node)

+static inline struct resource_entry *
+resource_list_first_type(struct list_head *list, unsigned long type)
+{
+	struct resource_entry *entry;
+
+	resource_list_for_each_entry(entry, list) {
+		if (resource_type(entry->res) == type)
+			return entry;
+	}
+	return NULL;
+}
+
 #endif /* _LINUX_RESOURCE_EXT_H */
--
2.20.1

^ permalink raw reply related	[flat|nested] 49+ messages in thread

* [PATCH v3 02/25] PCI: Export pci_parse_request_of_pci_ranges()
  2019-10-28 16:32 [PATCH v3 00/25] PCI host resource consolidation Rob Herring
  2019-10-28 16:32 ` [PATCH v3 01/25] resource: Add a resource_list_first_type helper Rob Herring
@ 2019-10-28 16:32 ` Rob Herring
  2019-10-28 16:32 ` [PATCH v3 03/25] PCI: aardvark: Use pci_parse_request_of_pci_ranges() Rob Herring
                   ` (23 subsequent siblings)
  25 siblings, 0 replies; 49+ messages in thread
From: Rob Herring @ 2019-10-28 16:32 UTC (permalink / raw)
  To: Andrew Murray, Bjorn Helgaas, Lorenzo Pieralisi
  Cc: linux-pci, linux-arm-kernel, bcm-kernel-feedback-list,
	Christoph Hellwig, Gustavo Pimentel, Heiko Stuebner,
	Hou Zhiqiang, Jingoo Han, Karthikeyan Mitran, Ley Foon Tan,
	Linus Walleij, linux-mediatek, linux-renesas-soc, linux-rockchip,
	Matthias Brugger, Michal Simek, Ray Jui, rfi, Ryder Lee,
	Scott Branden, Shawn Lin, Simon Horman, Srinath Mannam,
	Thomas Petazzoni, Toan Le, Tom Joseph, Will Deacon

pci_parse_request_of_pci_ranges() is missing a module export, so add it.

Cc: Bjorn Helgaas <bhelgaas@google.com>
Reviewed-by: Andrew Murray <andrew.murray@arm.com>
Signed-off-by: Rob Herring <robh@kernel.org>
---
 drivers/pci/of.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/pci/of.c b/drivers/pci/of.c
index 36891e7deee3..f3da49a31db4 100644
--- a/drivers/pci/of.c
+++ b/drivers/pci/of.c
@@ -530,6 +530,7 @@ int pci_parse_request_of_pci_ranges(struct device *dev,
 	pci_free_resource_list(resources);
 	return err;
 }
+EXPORT_SYMBOL_GPL(pci_parse_request_of_pci_ranges);
 
 #endif /* CONFIG_PCI */
 
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 49+ messages in thread

* [PATCH v3 03/25] PCI: aardvark: Use pci_parse_request_of_pci_ranges()
  2019-10-28 16:32 [PATCH v3 00/25] PCI host resource consolidation Rob Herring
  2019-10-28 16:32 ` [PATCH v3 01/25] resource: Add a resource_list_first_type helper Rob Herring
  2019-10-28 16:32 ` [PATCH v3 02/25] PCI: Export pci_parse_request_of_pci_ranges() Rob Herring
@ 2019-10-28 16:32 ` Rob Herring
  2019-10-28 16:32 ` [PATCH v3 04/25] PCI: altera: " Rob Herring
                   ` (22 subsequent siblings)
  25 siblings, 0 replies; 49+ messages in thread
From: Rob Herring @ 2019-10-28 16:32 UTC (permalink / raw)
  To: Andrew Murray, Bjorn Helgaas, Lorenzo Pieralisi
  Cc: linux-pci, linux-arm-kernel, bcm-kernel-feedback-list,
	Christoph Hellwig, Gustavo Pimentel, Heiko Stuebner,
	Hou Zhiqiang, Jingoo Han, Karthikeyan Mitran, Ley Foon Tan,
	Linus Walleij, linux-mediatek, linux-renesas-soc, linux-rockchip,
	Matthias Brugger, Michal Simek, Ray Jui, rfi, Ryder Lee,
	Scott Branden, Shawn Lin, Simon Horman, Srinath Mannam,
	Thomas Petazzoni, Toan Le, Tom Joseph, Will Deacon

Convert aardvark to use the common pci_parse_request_of_pci_ranges().

There's no need to assign the resources to a temporary list first. Just
use bridge->windows directly and remove all the temporary list handling.

Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Cc: Bjorn Helgaas <bhelgaas@google.com>
Tested-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
Reviewed-by: Andrew Murray <andrew.murray@arm.com>
Signed-off-by: Rob Herring <robh@kernel.org>
---
v2:
- Remove the temporary list
---
 drivers/pci/controller/pci-aardvark.c | 60 ++-------------------------
 1 file changed, 4 insertions(+), 56 deletions(-)

diff --git a/drivers/pci/controller/pci-aardvark.c b/drivers/pci/controller/pci-aardvark.c
index fc0fe4d4de49..9cbeba507f0c 100644
--- a/drivers/pci/controller/pci-aardvark.c
+++ b/drivers/pci/controller/pci-aardvark.c
@@ -186,7 +186,6 @@
 struct advk_pcie {
 	struct platform_device *pdev;
 	void __iomem *base;
-	struct list_head resources;
 	struct irq_domain *irq_domain;
 	struct irq_chip irq_chip;
 	struct irq_domain *msi_domain;
@@ -910,63 +909,11 @@ static irqreturn_t advk_pcie_irq_handler(int irq, void *arg)
 	return IRQ_HANDLED;
 }
 
-static int advk_pcie_parse_request_of_pci_ranges(struct advk_pcie *pcie)
-{
-	int err, res_valid = 0;
-	struct device *dev = &pcie->pdev->dev;
-	struct resource_entry *win, *tmp;
-	resource_size_t iobase;
-
-	INIT_LIST_HEAD(&pcie->resources);
-
-	err = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff,
-						    &pcie->resources, &iobase);
-	if (err)
-		return err;
-
-	err = devm_request_pci_bus_resources(dev, &pcie->resources);
-	if (err)
-		goto out_release_res;
-
-	resource_list_for_each_entry_safe(win, tmp, &pcie->resources) {
-		struct resource *res = win->res;
-
-		switch (resource_type(res)) {
-		case IORESOURCE_IO:
-			err = devm_pci_remap_iospace(dev, res, iobase);
-			if (err) {
-				dev_warn(dev, "error %d: failed to map resource %pR\n",
-					 err, res);
-				resource_list_destroy_entry(win);
-			}
-			break;
-		case IORESOURCE_MEM:
-			res_valid |= !(res->flags & IORESOURCE_PREFETCH);
-			break;
-		case IORESOURCE_BUS:
-			pcie->root_bus_nr = res->start;
-			break;
-		}
-	}
-
-	if (!res_valid) {
-		dev_err(dev, "non-prefetchable memory resource required\n");
-		err = -EINVAL;
-		goto out_release_res;
-	}
-
-	return 0;
-
-out_release_res:
-	pci_free_resource_list(&pcie->resources);
-	return err;
-}
-
 static int advk_pcie_probe(struct platform_device *pdev)
 {
 	struct device *dev = &pdev->dev;
 	struct advk_pcie *pcie;
-	struct resource *res;
+	struct resource *res, *bus;
 	struct pci_host_bridge *bridge;
 	int ret, irq;
 
@@ -991,11 +938,13 @@ static int advk_pcie_probe(struct platform_device *pdev)
 		return ret;
 	}
 
-	ret = advk_pcie_parse_request_of_pci_ranges(pcie);
+	ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows,
+					      &bus);
 	if (ret) {
 		dev_err(dev, "Failed to parse resources\n");
 		return ret;
 	}
+	pcie->root_bus_nr = bus->start;
 
 	advk_pcie_setup_hw(pcie);
 
@@ -1014,7 +963,6 @@ static int advk_pcie_probe(struct platform_device *pdev)
 		return ret;
 	}
 
-	list_splice_init(&pcie->resources, &bridge->windows);
 	bridge->dev.parent = dev;
 	bridge->sysdata = pcie;
 	bridge->busnr = 0;
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 49+ messages in thread

* [PATCH v3 04/25] PCI: altera: Use pci_parse_request_of_pci_ranges()
  2019-10-28 16:32 [PATCH v3 00/25] PCI host resource consolidation Rob Herring
                   ` (2 preceding siblings ...)
  2019-10-28 16:32 ` [PATCH v3 03/25] PCI: aardvark: Use pci_parse_request_of_pci_ranges() Rob Herring
@ 2019-10-28 16:32 ` Rob Herring
  2019-10-28 16:32 ` [PATCH v3 05/25] PCI: dwc: " Rob Herring
                   ` (21 subsequent siblings)
  25 siblings, 0 replies; 49+ messages in thread
From: Rob Herring @ 2019-10-28 16:32 UTC (permalink / raw)
  To: Andrew Murray, Bjorn Helgaas, Lorenzo Pieralisi
  Cc: linux-pci, linux-arm-kernel, bcm-kernel-feedback-list,
	Christoph Hellwig, Gustavo Pimentel, Heiko Stuebner,
	Hou Zhiqiang, Jingoo Han, Karthikeyan Mitran, Ley Foon Tan,
	Linus Walleij, linux-mediatek, linux-renesas-soc, linux-rockchip,
	Matthias Brugger, Michal Simek, Ray Jui, rfi, Ryder Lee,
	Scott Branden, Shawn Lin, Simon Horman, Srinath Mannam,
	Thomas Petazzoni, Toan Le, Tom Joseph, Will Deacon

Convert altera host bridge to use the common
pci_parse_request_of_pci_ranges().

There's no need to assign the resources to a temporary list first. Just
use bridge->windows directly and remove all the temporary list handling.

If an I/O range is present, then it will now be mapped. It's expected
that h/w which doesn't support I/O range will not define one.

Cc: Ley Foon Tan <lftan@altera.com>
Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Cc: Bjorn Helgaas <bhelgaas@google.com>
Cc: rfi@lists.rocketboards.org
Reviewed-by: Andrew Murray <andrew.murray@arm.com>
Signed-off-by: Rob Herring <robh@kernel.org>
---
v2:
- Remove temporary resource list
---
 drivers/pci/controller/pcie-altera.c | 41 ++--------------------------
 1 file changed, 2 insertions(+), 39 deletions(-)

diff --git a/drivers/pci/controller/pcie-altera.c b/drivers/pci/controller/pcie-altera.c
index d2497ca43828..ba025efeae28 100644
--- a/drivers/pci/controller/pcie-altera.c
+++ b/drivers/pci/controller/pcie-altera.c
@@ -92,7 +92,6 @@ struct altera_pcie {
 	u8			root_bus_nr;
 	struct irq_domain	*irq_domain;
 	struct resource		bus_range;
-	struct list_head	resources;
 	const struct altera_pcie_data	*pcie_data;
 };
 
@@ -670,39 +669,6 @@ static void altera_pcie_isr(struct irq_desc *desc)
 	chained_irq_exit(chip, desc);
 }
 
-static int altera_pcie_parse_request_of_pci_ranges(struct altera_pcie *pcie)
-{
-	int err, res_valid = 0;
-	struct device *dev = &pcie->pdev->dev;
-	struct resource_entry *win;
-
-	err = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff,
-						    &pcie->resources, NULL);
-	if (err)
-		return err;
-
-	err = devm_request_pci_bus_resources(dev, &pcie->resources);
-	if (err)
-		goto out_release_res;
-
-	resource_list_for_each_entry(win, &pcie->resources) {
-		struct resource *res = win->res;
-
-		if (resource_type(res) == IORESOURCE_MEM)
-			res_valid |= !(res->flags & IORESOURCE_PREFETCH);
-	}
-
-	if (res_valid)
-		return 0;
-
-	dev_err(dev, "non-prefetchable memory resource required\n");
-	err = -EINVAL;
-
-out_release_res:
-	pci_free_resource_list(&pcie->resources);
-	return err;
-}
-
 static int altera_pcie_init_irq_domain(struct altera_pcie *pcie)
 {
 	struct device *dev = &pcie->pdev->dev;
@@ -833,9 +799,8 @@ static int altera_pcie_probe(struct platform_device *pdev)
 		return ret;
 	}
 
-	INIT_LIST_HEAD(&pcie->resources);
-
-	ret = altera_pcie_parse_request_of_pci_ranges(pcie);
+	ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows,
+					      NULL);
 	if (ret) {
 		dev_err(dev, "Failed add resources\n");
 		return ret;
@@ -853,7 +818,6 @@ static int altera_pcie_probe(struct platform_device *pdev)
 	cra_writel(pcie, P2A_INT_ENA_ALL, P2A_INT_ENABLE);
 	altera_pcie_host_init(pcie);
 
-	list_splice_init(&pcie->resources, &bridge->windows);
 	bridge->dev.parent = dev;
 	bridge->sysdata = pcie;
 	bridge->busnr = pcie->root_bus_nr;
@@ -884,7 +848,6 @@ static int altera_pcie_remove(struct platform_device *pdev)
 
 	pci_stop_root_bus(bridge->bus);
 	pci_remove_root_bus(bridge->bus);
-	pci_free_resource_list(&pcie->resources);
 	altera_pcie_irq_teardown(pcie);
 
 	return 0;
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 49+ messages in thread

* [PATCH v3 05/25] PCI: dwc: Use pci_parse_request_of_pci_ranges()
  2019-10-28 16:32 [PATCH v3 00/25] PCI host resource consolidation Rob Herring
                   ` (3 preceding siblings ...)
  2019-10-28 16:32 ` [PATCH v3 04/25] PCI: altera: " Rob Herring
@ 2019-10-28 16:32 ` Rob Herring
  2019-10-28 16:32 ` [PATCH v3 06/25] PCI: faraday: " Rob Herring
                   ` (20 subsequent siblings)
  25 siblings, 0 replies; 49+ messages in thread
From: Rob Herring @ 2019-10-28 16:32 UTC (permalink / raw)
  To: Andrew Murray, Bjorn Helgaas, Lorenzo Pieralisi
  Cc: linux-pci, linux-arm-kernel, bcm-kernel-feedback-list,
	Christoph Hellwig, Gustavo Pimentel, Heiko Stuebner,
	Hou Zhiqiang, Jingoo Han, Karthikeyan Mitran, Ley Foon Tan,
	Linus Walleij, linux-mediatek, linux-renesas-soc, linux-rockchip,
	Matthias Brugger, Michal Simek, Ray Jui, rfi, Ryder Lee,
	Scott Branden, Shawn Lin, Simon Horman, Srinath Mannam,
	Thomas Petazzoni, Toan Le, Tom Joseph, Will Deacon

Convert the Designware host bridge to use the common
pci_parse_request_of_pci_ranges().

Cc: Jingoo Han <jingoohan1@gmail.com>
Cc: Gustavo Pimentel <gustavo.pimentel@synopsys.com>
Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Cc: Andrew Murray <andrew.murray@arm.com>
Cc: Bjorn Helgaas <bhelgaas@google.com>
Signed-off-by: Rob Herring <robh@kernel.org>
---
 .../pci/controller/dwc/pcie-designware-host.c | 28 ++++++-------------
 1 file changed, 8 insertions(+), 20 deletions(-)

diff --git a/drivers/pci/controller/dwc/pcie-designware-host.c b/drivers/pci/controller/dwc/pcie-designware-host.c
index 0f36a926059a..aeec8b65eb97 100644
--- a/drivers/pci/controller/dwc/pcie-designware-host.c
+++ b/drivers/pci/controller/dwc/pcie-designware-host.c
@@ -319,7 +319,7 @@ int dw_pcie_host_init(struct pcie_port *pp)
 	struct device *dev = pci->dev;
 	struct device_node *np = dev->of_node;
 	struct platform_device *pdev = to_platform_device(dev);
-	struct resource_entry *win, *tmp;
+	struct resource_entry *win;
 	struct pci_bus *child;
 	struct pci_host_bridge *bridge;
 	struct resource *cfg_res;
@@ -342,31 +342,19 @@ int dw_pcie_host_init(struct pcie_port *pp)
 	if (!bridge)
 		return -ENOMEM;
 
-	ret = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff,
-					&bridge->windows, &pp->io_base);
-	if (ret)
-		return ret;
-
-	ret = devm_request_pci_bus_resources(dev, &bridge->windows);
+	ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows, NULL);
 	if (ret)
 		return ret;
 
 	/* Get the I/O and memory ranges from DT */
-	resource_list_for_each_entry_safe(win, tmp, &bridge->windows) {
+	resource_list_for_each_entry(win, &bridge->windows) {
 		switch (resource_type(win->res)) {
 		case IORESOURCE_IO:
-			ret = devm_pci_remap_iospace(dev, win->res,
-						     pp->io_base);
-			if (ret) {
-				dev_warn(dev, "Error %d: failed to map resource %pR\n",
-					 ret, win->res);
-				resource_list_destroy_entry(win);
-			} else {
-				pp->io = win->res;
-				pp->io->name = "I/O";
-				pp->io_size = resource_size(pp->io);
-				pp->io_bus_addr = pp->io->start - win->offset;
-			}
+			pp->io = win->res;
+			pp->io->name = "I/O";
+			pp->io_size = resource_size(pp->io);
+			pp->io_bus_addr = pp->io->start - win->offset;
+			pp->io_base = pci_pio_to_address(pp->io->start);
 			break;
 		case IORESOURCE_MEM:
 			pp->mem = win->res;
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 49+ messages in thread

* [PATCH v3 06/25] PCI: faraday: Use pci_parse_request_of_pci_ranges()
  2019-10-28 16:32 [PATCH v3 00/25] PCI host resource consolidation Rob Herring
                   ` (4 preceding siblings ...)
  2019-10-28 16:32 ` [PATCH v3 05/25] PCI: dwc: " Rob Herring
@ 2019-10-28 16:32 ` Rob Herring
  2019-11-03 19:12   ` Linus Walleij
  2019-10-28 16:32 ` [PATCH v3 07/25] PCI: iproc: " Rob Herring
                   ` (19 subsequent siblings)
  25 siblings, 1 reply; 49+ messages in thread
From: Rob Herring @ 2019-10-28 16:32 UTC (permalink / raw)
  To: Andrew Murray, Bjorn Helgaas, Lorenzo Pieralisi
  Cc: linux-pci, linux-arm-kernel, bcm-kernel-feedback-list,
	Christoph Hellwig, Gustavo Pimentel, Heiko Stuebner,
	Hou Zhiqiang, Jingoo Han, Karthikeyan Mitran, Ley Foon Tan,
	Linus Walleij, linux-mediatek, linux-renesas-soc, linux-rockchip,
	Matthias Brugger, Michal Simek, Ray Jui, rfi, Ryder Lee,
	Scott Branden, Shawn Lin, Simon Horman, Srinath Mannam,
	Thomas Petazzoni, Toan Le, Tom Joseph, Will Deacon

Convert the Faraday host bridge to use the common
pci_parse_request_of_pci_ranges().

There's no need to assign the resources to a temporary list first. Just
use bridge->windows directly and remove all the temporary list handling.

Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Cc: Bjorn Helgaas <bhelgaas@google.com>
Reviewed-by: Andrew Murray <andrew.murray@arm.com>
Signed-off-by: Rob Herring <robh@kernel.org>
---
v2:
 - Remove temporary resource list
---
 drivers/pci/controller/pci-ftpci100.c | 51 ++++++---------------------
 1 file changed, 11 insertions(+), 40 deletions(-)

diff --git a/drivers/pci/controller/pci-ftpci100.c b/drivers/pci/controller/pci-ftpci100.c
index bf5ece5d9291..75603348b88a 100644
--- a/drivers/pci/controller/pci-ftpci100.c
+++ b/drivers/pci/controller/pci-ftpci100.c
@@ -430,10 +430,8 @@ static int faraday_pci_probe(struct platform_device *pdev)
 	const struct faraday_pci_variant *variant =
 		of_device_get_match_data(dev);
 	struct resource *regs;
-	resource_size_t io_base;
 	struct resource_entry *win;
 	struct faraday_pci *p;
-	struct resource *mem;
 	struct resource *io;
 	struct pci_host_bridge *host;
 	struct clk *clk;
@@ -441,7 +439,6 @@ static int faraday_pci_probe(struct platform_device *pdev)
 	unsigned char cur_bus_speed = PCI_SPEED_33MHz;
 	int ret;
 	u32 val;
-	LIST_HEAD(res);
 
 	host = devm_pci_alloc_host_bridge(dev, sizeof(*p));
 	if (!host)
@@ -480,44 +477,20 @@ static int faraday_pci_probe(struct platform_device *pdev)
 	if (IS_ERR(p->base))
 		return PTR_ERR(p->base);
 
-	ret = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff,
-						    &res, &io_base);
+	ret = pci_parse_request_of_pci_ranges(dev, &host->windows, NULL);
 	if (ret)
 		return ret;
 
-	ret = devm_request_pci_bus_resources(dev, &res);
-	if (ret)
-		return ret;
-
-	/* Get the I/O and memory ranges from DT */
-	resource_list_for_each_entry(win, &res) {
-		switch (resource_type(win->res)) {
-		case IORESOURCE_IO:
-			io = win->res;
-			io->name = "Gemini PCI I/O";
-			if (!faraday_res_to_memcfg(io->start - win->offset,
-						   resource_size(io), &val)) {
-				/* setup I/O space size */
-				writel(val, p->base + PCI_IOSIZE);
-			} else {
-				dev_err(dev, "illegal IO mem size\n");
-				return -EINVAL;
-			}
-			ret = devm_pci_remap_iospace(dev, io, io_base);
-			if (ret) {
-				dev_warn(dev, "error %d: failed to map resource %pR\n",
-					 ret, io);
-				continue;
-			}
-			break;
-		case IORESOURCE_MEM:
-			mem = win->res;
-			mem->name = "Gemini PCI MEM";
-			break;
-		case IORESOURCE_BUS:
-			break;
-		default:
-			break;
+	win = resource_list_first_type(&host->windows, IORESOURCE_IO);
+	if (win) {
+		io = win->res;
+		if (!faraday_res_to_memcfg(io->start - win->offset,
+					   resource_size(io), &val)) {
+			/* setup I/O space size */
+			writel(val, p->base + PCI_IOSIZE);
+		} else {
+			dev_err(dev, "illegal IO mem size\n");
+			return -EINVAL;
 		}
 	}
 
@@ -569,7 +542,6 @@ static int faraday_pci_probe(struct platform_device *pdev)
 	if (ret)
 		return ret;
 
-	list_splice_init(&res, &host->windows);
 	ret = pci_scan_root_bus_bridge(host);
 	if (ret) {
 		dev_err(dev, "failed to scan host: %d\n", ret);
@@ -581,7 +553,6 @@ static int faraday_pci_probe(struct platform_device *pdev)
 
 	pci_bus_assign_resources(p->bus);
 	pci_bus_add_devices(p->bus);
-	pci_free_resource_list(&res);
 
 	return 0;
 }
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 49+ messages in thread

* [PATCH v3 07/25] PCI: iproc: Use pci_parse_request_of_pci_ranges()
  2019-10-28 16:32 [PATCH v3 00/25] PCI host resource consolidation Rob Herring
                   ` (5 preceding siblings ...)
  2019-10-28 16:32 ` [PATCH v3 06/25] PCI: faraday: " Rob Herring
@ 2019-10-28 16:32 ` Rob Herring
  2019-10-29 15:58   ` Srinath Mannam
  2019-10-28 16:32 ` [PATCH v3 08/25] PCI: mediatek: " Rob Herring
                   ` (18 subsequent siblings)
  25 siblings, 1 reply; 49+ messages in thread
From: Rob Herring @ 2019-10-28 16:32 UTC (permalink / raw)
  To: Andrew Murray, Bjorn Helgaas, Lorenzo Pieralisi
  Cc: linux-pci, linux-arm-kernel, bcm-kernel-feedback-list,
	Christoph Hellwig, Gustavo Pimentel, Heiko Stuebner,
	Hou Zhiqiang, Jingoo Han, Karthikeyan Mitran, Ley Foon Tan,
	Linus Walleij, linux-mediatek, linux-renesas-soc, linux-rockchip,
	Matthias Brugger, Michal Simek, Ray Jui, rfi, Ryder Lee,
	Scott Branden, Shawn Lin, Simon Horman, Srinath Mannam,
	Thomas Petazzoni, Toan Le, Tom Joseph, Will Deacon

Convert the iProc host bridge to use the common
pci_parse_request_of_pci_ranges().

There's no need to assign the resources to a temporary list, so just use
bridge->windows directly.

Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Cc: Bjorn Helgaas <bhelgaas@google.com>
Cc: Ray Jui <rjui@broadcom.com>
Cc: Scott Branden <sbranden@broadcom.com>
Cc: bcm-kernel-feedback-list@broadcom.com
Reviewed-by: Andrew Murray <andrew.murray@arm.com>
Signed-off-by: Rob Herring <robh@kernel.org>
---
 drivers/pci/controller/pcie-iproc-platform.c | 8 ++------
 drivers/pci/controller/pcie-iproc.c          | 5 -----
 2 files changed, 2 insertions(+), 11 deletions(-)

diff --git a/drivers/pci/controller/pcie-iproc-platform.c b/drivers/pci/controller/pcie-iproc-platform.c
index 9ee6200a66f4..375d815f7301 100644
--- a/drivers/pci/controller/pcie-iproc-platform.c
+++ b/drivers/pci/controller/pcie-iproc-platform.c
@@ -43,8 +43,6 @@ static int iproc_pcie_pltfm_probe(struct platform_device *pdev)
 	struct iproc_pcie *pcie;
 	struct device_node *np = dev->of_node;
 	struct resource reg;
-	resource_size_t iobase = 0;
-	LIST_HEAD(resources);
 	struct pci_host_bridge *bridge;
 	int ret;
 
@@ -97,8 +95,7 @@ static int iproc_pcie_pltfm_probe(struct platform_device *pdev)
 	if (IS_ERR(pcie->phy))
 		return PTR_ERR(pcie->phy);
 
-	ret = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff, &resources,
-						    &iobase);
+	ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows, NULL);
 	if (ret) {
 		dev_err(dev, "unable to get PCI host bridge resources\n");
 		return ret;
@@ -113,10 +110,9 @@ static int iproc_pcie_pltfm_probe(struct platform_device *pdev)
 		pcie->map_irq = of_irq_parse_and_map_pci;
 	}
 
-	ret = iproc_pcie_setup(pcie, &resources);
+	ret = iproc_pcie_setup(pcie, &bridge->windows);
 	if (ret) {
 		dev_err(dev, "PCIe controller setup failed\n");
-		pci_free_resource_list(&resources);
 		return ret;
 	}
 
diff --git a/drivers/pci/controller/pcie-iproc.c b/drivers/pci/controller/pcie-iproc.c
index 2d457bfdaf66..223335ee791a 100644
--- a/drivers/pci/controller/pcie-iproc.c
+++ b/drivers/pci/controller/pcie-iproc.c
@@ -1498,10 +1498,6 @@ int iproc_pcie_setup(struct iproc_pcie *pcie, struct list_head *res)
 		return ret;
 	}
 
-	ret = devm_request_pci_bus_resources(dev, res);
-	if (ret)
-		return ret;
-
 	ret = phy_init(pcie->phy);
 	if (ret) {
 		dev_err(dev, "unable to initialize PCIe PHY\n");
@@ -1543,7 +1539,6 @@ int iproc_pcie_setup(struct iproc_pcie *pcie, struct list_head *res)
 		if (iproc_pcie_msi_enable(pcie))
 			dev_info(dev, "not using iProc MSI\n");
 
-	list_splice_init(res, &host->windows);
 	host->busnr = 0;
 	host->dev.parent = dev;
 	host->ops = &iproc_pcie_ops;
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 49+ messages in thread

* [PATCH v3 08/25] PCI: mediatek: Use pci_parse_request_of_pci_ranges()
  2019-10-28 16:32 [PATCH v3 00/25] PCI host resource consolidation Rob Herring
                   ` (6 preceding siblings ...)
  2019-10-28 16:32 ` [PATCH v3 07/25] PCI: iproc: " Rob Herring
@ 2019-10-28 16:32 ` Rob Herring
  2019-10-28 16:32 ` [PATCH v3 09/25] PCI: mobiveil: " Rob Herring
                   ` (17 subsequent siblings)
  25 siblings, 0 replies; 49+ messages in thread
From: Rob Herring @ 2019-10-28 16:32 UTC (permalink / raw)
  To: Andrew Murray, Bjorn Helgaas, Lorenzo Pieralisi
  Cc: linux-pci, linux-arm-kernel, bcm-kernel-feedback-list,
	Christoph Hellwig, Gustavo Pimentel, Heiko Stuebner,
	Hou Zhiqiang, Jingoo Han, Karthikeyan Mitran, Ley Foon Tan,
	Linus Walleij, linux-mediatek, linux-renesas-soc, linux-rockchip,
	Matthias Brugger, Michal Simek, Ray Jui, rfi, Ryder Lee,
	Scott Branden, Shawn Lin, Simon Horman, Srinath Mannam,
	Thomas Petazzoni, Toan Le, Tom Joseph, Will Deacon

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
Reviewed-by: Andrew Murray <andrew.murray@arm.com>
Signed-off-by: Rob Herring <robh@kernel.org>
---
v2:
- Use resource_list_get_entry_of_type
---
 drivers/pci/controller/pcie-mediatek.c | 43 ++++++++------------------
 1 file changed, 13 insertions(+), 30 deletions(-)

diff --git a/drivers/pci/controller/pcie-mediatek.c b/drivers/pci/controller/pcie-mediatek.c
index 626a7c352dfd..d9206a3cd56b 100644
--- a/drivers/pci/controller/pcie-mediatek.c
+++ b/drivers/pci/controller/pcie-mediatek.c
@@ -216,7 +216,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;
@@ -661,11 +660,19 @@ 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;
 
+	entry = resource_list_first_type(&host->windows, IORESOURCE_MEM);
+	if (entry)
+		mem = entry->res;
+	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);
@@ -1023,39 +1030,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] 49+ messages in thread

* [PATCH v3 09/25] PCI: mobiveil: Use pci_parse_request_of_pci_ranges()
  2019-10-28 16:32 [PATCH v3 00/25] PCI host resource consolidation Rob Herring
                   ` (7 preceding siblings ...)
  2019-10-28 16:32 ` [PATCH v3 08/25] PCI: mediatek: " Rob Herring
@ 2019-10-28 16:32 ` Rob Herring
  2019-10-29  9:00   ` Z.q. Hou
  2019-10-28 16:32 ` [PATCH v3 10/25] PCI: rockchip: " Rob Herring
                   ` (16 subsequent siblings)
  25 siblings, 1 reply; 49+ messages in thread
From: Rob Herring @ 2019-10-28 16:32 UTC (permalink / raw)
  To: Andrew Murray, Bjorn Helgaas, Lorenzo Pieralisi
  Cc: linux-pci, linux-arm-kernel, bcm-kernel-feedback-list,
	Christoph Hellwig, Gustavo Pimentel, Heiko Stuebner,
	Hou Zhiqiang, Jingoo Han, Karthikeyan Mitran, Ley Foon Tan,
	Linus Walleij, linux-mediatek, linux-renesas-soc, linux-rockchip,
	Matthias Brugger, Michal Simek, Ray Jui, rfi, Ryder Lee,
	Scott Branden, Shawn Lin, Simon Horman, Srinath Mannam,
	Thomas Petazzoni, Toan Le, Tom Joseph, Will Deacon

Convert the Mobiveil host bridge to use the common
pci_parse_request_of_pci_ranges().

There's no need to assign the resources to a temporary list first. Just
use bridge->windows directly and remove all the temporary list handling.

Cc: Karthikeyan Mitran <m.karthikeyan@mobiveil.co.in>
Cc: Hou Zhiqiang <Zhiqiang.Hou@nxp.com>
Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Cc: Bjorn Helgaas <bhelgaas@google.com>
Reviewed-by: Andrew Murray <andrew.murray@arm.com>
Signed-off-by: Rob Herring <robh@kernel.org>
---
 drivers/pci/controller/pcie-mobiveil.c | 26 +++++++-------------------
 1 file changed, 7 insertions(+), 19 deletions(-)

diff --git a/drivers/pci/controller/pcie-mobiveil.c b/drivers/pci/controller/pcie-mobiveil.c
index a45a6447b01d..4eab8624ce4d 100644
--- a/drivers/pci/controller/pcie-mobiveil.c
+++ b/drivers/pci/controller/pcie-mobiveil.c
@@ -140,7 +140,6 @@ struct mobiveil_msi {			/* MSI information */
 
 struct mobiveil_pcie {
 	struct platform_device *pdev;
-	struct list_head resources;
 	void __iomem *config_axi_slave_base;	/* endpoint config base */
 	void __iomem *csr_axi_slave_base;	/* root port config base */
 	void __iomem *apb_csr_base;	/* MSI register base */
@@ -575,6 +574,7 @@ static void mobiveil_pcie_enable_msi(struct mobiveil_pcie *pcie)
 
 static int mobiveil_host_init(struct mobiveil_pcie *pcie)
 {
+	struct pci_host_bridge *bridge = pci_host_bridge_from_priv(pcie);
 	u32 value, pab_ctrl, type;
 	struct resource_entry *win;
 
@@ -631,7 +631,7 @@ static int mobiveil_host_init(struct mobiveil_pcie *pcie)
 	program_ib_windows(pcie, WIN_NUM_0, 0, 0, MEM_WINDOW_TYPE, IB_WIN_SIZE);
 
 	/* Get the I/O and memory ranges from DT */
-	resource_list_for_each_entry(win, &pcie->resources) {
+	resource_list_for_each_entry(win, &bridge->windows) {
 		if (resource_type(win->res) == IORESOURCE_MEM)
 			type = MEM_WINDOW_TYPE;
 		else if (resource_type(win->res) == IORESOURCE_IO)
@@ -857,7 +857,6 @@ static int mobiveil_pcie_probe(struct platform_device *pdev)
 	struct pci_bus *child;
 	struct pci_host_bridge *bridge;
 	struct device *dev = &pdev->dev;
-	resource_size_t iobase;
 	int ret;
 
 	/* allocate the PCIe port */
@@ -875,11 +874,8 @@ static int mobiveil_pcie_probe(struct platform_device *pdev)
 		return ret;
 	}
 
-	INIT_LIST_HEAD(&pcie->resources);
-
 	/* 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);
+	ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows, NULL);
 	if (ret) {
 		dev_err(dev, "Getting bridge resources failed\n");
 		return ret;
@@ -892,24 +888,19 @@ static int mobiveil_pcie_probe(struct platform_device *pdev)
 	ret = mobiveil_host_init(pcie);
 	if (ret) {
 		dev_err(dev, "Failed to initialize host\n");
-		goto error;
+		return ret;
 	}
 
 	/* initialize the IRQ domains */
 	ret = mobiveil_pcie_init_irq_domain(pcie);
 	if (ret) {
 		dev_err(dev, "Failed creating IRQ Domain\n");
-		goto error;
+		return ret;
 	}
 
 	irq_set_chained_handler_and_data(pcie->irq, mobiveil_pcie_isr, pcie);
 
-	ret = devm_request_pci_bus_resources(dev, &pcie->resources);
-	if (ret)
-		goto error;
-
 	/* Initialize bridge */
-	list_splice_init(&pcie->resources, &bridge->windows);
 	bridge->dev.parent = dev;
 	bridge->sysdata = pcie;
 	bridge->busnr = pcie->root_bus_nr;
@@ -920,13 +911,13 @@ static int mobiveil_pcie_probe(struct platform_device *pdev)
 	ret = mobiveil_bringup_link(pcie);
 	if (ret) {
 		dev_info(dev, "link bring-up failed\n");
-		goto error;
+		return ret;
 	}
 
 	/* setup the kernel resources for the newly added PCIe root bus */
 	ret = pci_scan_root_bus_bridge(bridge);
 	if (ret)
-		goto error;
+		return ret;
 
 	bus = bridge->bus;
 
@@ -936,9 +927,6 @@ static int mobiveil_pcie_probe(struct platform_device *pdev)
 	pci_bus_add_devices(bus);
 
 	return 0;
-error:
-	pci_free_resource_list(&pcie->resources);
-	return ret;
 }
 
 static const struct of_device_id mobiveil_pcie_of_match[] = {
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 49+ messages in thread

* [PATCH v3 10/25] PCI: rockchip: Use pci_parse_request_of_pci_ranges()
  2019-10-28 16:32 [PATCH v3 00/25] PCI host resource consolidation Rob Herring
                   ` (8 preceding siblings ...)
  2019-10-28 16:32 ` [PATCH v3 09/25] PCI: mobiveil: " Rob Herring
@ 2019-10-28 16:32 ` Rob Herring
  2019-12-05 17:56   ` Enric Balletbo Serra
  2019-10-28 16:32 ` [PATCH v3 11/25] PCI: rockchip: Drop storing driver private outbound resource data Rob Herring
                   ` (15 subsequent siblings)
  25 siblings, 1 reply; 49+ messages in thread
From: Rob Herring @ 2019-10-28 16:32 UTC (permalink / raw)
  To: Andrew Murray, Bjorn Helgaas, Lorenzo Pieralisi
  Cc: linux-pci, linux-arm-kernel, bcm-kernel-feedback-list,
	Christoph Hellwig, Gustavo Pimentel, Heiko Stuebner,
	Hou Zhiqiang, Jingoo Han, Karthikeyan Mitran, Ley Foon Tan,
	Linus Walleij, linux-mediatek, linux-renesas-soc, linux-rockchip,
	Matthias Brugger, Michal Simek, Ray Jui, rfi, Ryder Lee,
	Scott Branden, Shawn Lin, Simon Horman, Srinath Mannam,
	Thomas Petazzoni, Toan Le, Tom Joseph, Will Deacon

Convert the Rockchip host bridge to use the common
pci_parse_request_of_pci_ranges().

There's no need to assign the resources to a temporary list first. Just
use bridge->windows directly and remove all the temporary list handling.

Cc: Shawn Lin <shawn.lin@rock-chips.com>
Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Cc: Andrew Murray <andrew.murray@arm.com>
Cc: Bjorn Helgaas <bhelgaas@google.com>
Cc: Heiko Stuebner <heiko@sntech.de>
Cc: linux-rockchip@lists.infradead.org
Signed-off-by: Rob Herring <robh@kernel.org>
---
 drivers/pci/controller/pcie-rockchip-host.c | 36 ++++-----------------
 1 file changed, 7 insertions(+), 29 deletions(-)

diff --git a/drivers/pci/controller/pcie-rockchip-host.c b/drivers/pci/controller/pcie-rockchip-host.c
index ef8e677ce9d1..8d2e6f2e141e 100644
--- a/drivers/pci/controller/pcie-rockchip-host.c
+++ b/drivers/pci/controller/pcie-rockchip-host.c
@@ -950,14 +950,10 @@ static int rockchip_pcie_probe(struct platform_device *pdev)
 	struct device *dev = &pdev->dev;
 	struct pci_bus *bus, *child;
 	struct pci_host_bridge *bridge;
+	struct resource *bus_res;
 	struct resource_entry *win;
-	resource_size_t io_base;
-	struct resource	*mem;
-	struct resource	*io;
 	int err;
 
-	LIST_HEAD(res);
-
 	if (!dev->of_node)
 		return -ENODEV;
 
@@ -995,29 +991,20 @@ static int rockchip_pcie_probe(struct platform_device *pdev)
 	if (err < 0)
 		goto err_deinit_port;
 
-	err = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff,
-						    &res, &io_base);
+	err = pci_parse_request_of_pci_ranges(dev, &bridge->windows, &bus_res);
 	if (err)
 		goto err_remove_irq_domain;
 
-	err = devm_request_pci_bus_resources(dev, &res);
-	if (err)
-		goto err_free_res;
+	rockchip->root_bus_nr = bus_res->start;
 
 	/* Get the I/O and memory ranges from DT */
-	resource_list_for_each_entry(win, &res) {
+	resource_list_for_each_entry(win, &bridge->windows) {
 		switch (resource_type(win->res)) {
 		case IORESOURCE_IO:
 			io = win->res;
 			io->name = "I/O";
 			rockchip->io_size = resource_size(io);
 			rockchip->io_bus_addr = io->start - win->offset;
-			err = pci_remap_iospace(io, io_base);
-			if (err) {
-				dev_warn(dev, "error %d: failed to map resource %pR\n",
-					 err, io);
-				continue;
-			}
 			rockchip->io = io;
 			break;
 		case IORESOURCE_MEM:
@@ -1026,9 +1013,6 @@ static int rockchip_pcie_probe(struct platform_device *pdev)
 			rockchip->mem_size = resource_size(mem);
 			rockchip->mem_bus_addr = mem->start - win->offset;
 			break;
-		case IORESOURCE_BUS:
-			rockchip->root_bus_nr = win->res->start;
-			break;
 		default:
 			continue;
 		}
@@ -1036,15 +1020,14 @@ static int rockchip_pcie_probe(struct platform_device *pdev)
 
 	err = rockchip_pcie_cfg_atu(rockchip);
 	if (err)
-		goto err_unmap_iospace;
+		goto err_remove_irq_domain;
 
 	rockchip->msg_region = devm_ioremap(dev, rockchip->msg_bus_addr, SZ_1M);
 	if (!rockchip->msg_region) {
 		err = -ENOMEM;
-		goto err_unmap_iospace;
+		goto err_remove_irq_domain;
 	}
 
-	list_splice_init(&res, &bridge->windows);
 	bridge->dev.parent = dev;
 	bridge->sysdata = rockchip;
 	bridge->busnr = 0;
@@ -1054,7 +1037,7 @@ static int rockchip_pcie_probe(struct platform_device *pdev)
 
 	err = pci_scan_root_bus_bridge(bridge);
 	if (err < 0)
-		goto err_unmap_iospace;
+		goto err_remove_irq_domain;
 
 	bus = bridge->bus;
 
@@ -1068,10 +1051,6 @@ static int rockchip_pcie_probe(struct platform_device *pdev)
 	pci_bus_add_devices(bus);
 	return 0;
 
-err_unmap_iospace:
-	pci_unmap_iospace(rockchip->io);
-err_free_res:
-	pci_free_resource_list(&res);
 err_remove_irq_domain:
 	irq_domain_remove(rockchip->irq_domain);
 err_deinit_port:
@@ -1097,7 +1076,6 @@ static int rockchip_pcie_remove(struct platform_device *pdev)
 
 	pci_stop_root_bus(rockchip->root_bus);
 	pci_remove_root_bus(rockchip->root_bus);
-	pci_unmap_iospace(rockchip->io);
 	irq_domain_remove(rockchip->irq_domain);
 
 	rockchip_pcie_deinit_phys(rockchip);
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 49+ messages in thread

* [PATCH v3 11/25] PCI: rockchip: Drop storing driver private outbound resource data
  2019-10-28 16:32 [PATCH v3 00/25] PCI host resource consolidation Rob Herring
                   ` (9 preceding siblings ...)
  2019-10-28 16:32 ` [PATCH v3 10/25] PCI: rockchip: " Rob Herring
@ 2019-10-28 16:32 ` Rob Herring
  2019-12-06 15:36   ` Lorenzo Pieralisi
  2019-10-28 16:32 ` [PATCH v3 12/25] PCI: v3-semi: Use pci_parse_request_of_pci_ranges() Rob Herring
                   ` (14 subsequent siblings)
  25 siblings, 1 reply; 49+ messages in thread
From: Rob Herring @ 2019-10-28 16:32 UTC (permalink / raw)
  To: Andrew Murray, Bjorn Helgaas, Lorenzo Pieralisi
  Cc: linux-pci, linux-arm-kernel, bcm-kernel-feedback-list,
	Christoph Hellwig, Gustavo Pimentel, Heiko Stuebner,
	Hou Zhiqiang, Jingoo Han, Karthikeyan Mitran, Ley Foon Tan,
	Linus Walleij, linux-mediatek, linux-renesas-soc, linux-rockchip,
	Matthias Brugger, Michal Simek, Ray Jui, rfi, Ryder Lee,
	Scott Branden, Shawn Lin, Simon Horman, Srinath Mannam,
	Thomas Petazzoni, Toan Le, Tom Joseph, Will Deacon

The Rockchip host bridge driver doesn't need to store outboard resources
in its private struct as they are already stored in struct
pci_host_bridge.

Cc: Shawn Lin <shawn.lin@rock-chips.com>
Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Cc: Andrew Murray <andrew.murray@arm.com>
Cc: Bjorn Helgaas <bhelgaas@google.com>
Cc: Heiko Stuebner <heiko@sntech.de>
Cc: linux-rockchip@lists.infradead.org
Signed-off-by: Rob Herring <robh@kernel.org>
---
 drivers/pci/controller/pcie-rockchip-host.c | 54 +++++++++------------
 drivers/pci/controller/pcie-rockchip.h      |  5 --
 2 files changed, 23 insertions(+), 36 deletions(-)

diff --git a/drivers/pci/controller/pcie-rockchip-host.c b/drivers/pci/controller/pcie-rockchip-host.c
index 8d2e6f2e141e..f375e55ea02e 100644
--- a/drivers/pci/controller/pcie-rockchip-host.c
+++ b/drivers/pci/controller/pcie-rockchip-host.c
@@ -806,19 +806,28 @@ static int rockchip_pcie_prog_ib_atu(struct rockchip_pcie *rockchip,
 static int rockchip_pcie_cfg_atu(struct rockchip_pcie *rockchip)
 {
 	struct device *dev = rockchip->dev;
+	struct pci_host_bridge *bridge = pci_host_bridge_from_priv(rockchip);
+	struct resource_entry *entry;
+	u64 pci_addr, size;
 	int offset;
 	int err;
 	int reg_no;
 
 	rockchip_pcie_cfg_configuration_accesses(rockchip,
 						 AXI_WRAPPER_TYPE0_CFG);
+	entry = resource_list_first_type(&bridge->windows, IORESOURCE_MEM);
+	if (!entry)
+		return -ENODEV;
+
+	size = resource_size(entry->res);
+	pci_addr = entry->res->start - entry->offset;
+	rockchip->msg_bus_addr = pci_addr;
 
-	for (reg_no = 0; reg_no < (rockchip->mem_size >> 20); reg_no++) {
+	for (reg_no = 0; reg_no < (size >> 20); reg_no++) {
 		err = rockchip_pcie_prog_ob_atu(rockchip, reg_no + 1,
 						AXI_WRAPPER_MEM_WRITE,
 						20 - 1,
-						rockchip->mem_bus_addr +
-						(reg_no << 20),
+						pci_addr + (reg_no << 20),
 						0);
 		if (err) {
 			dev_err(dev, "program RC mem outbound ATU failed\n");
@@ -832,14 +841,20 @@ static int rockchip_pcie_cfg_atu(struct rockchip_pcie *rockchip)
 		return err;
 	}
 
-	offset = rockchip->mem_size >> 20;
-	for (reg_no = 0; reg_no < (rockchip->io_size >> 20); reg_no++) {
+	entry = resource_list_first_type(&bridge->windows, IORESOURCE_IO);
+	if (!entry)
+		return -ENODEV;
+
+	size = resource_size(entry->res);
+	pci_addr = entry->res->start - entry->offset;
+
+	offset = size >> 20;
+	for (reg_no = 0; reg_no < (size >> 20); reg_no++) {
 		err = rockchip_pcie_prog_ob_atu(rockchip,
 						reg_no + 1 + offset,
 						AXI_WRAPPER_IO_WRITE,
 						20 - 1,
-						rockchip->io_bus_addr +
-						(reg_no << 20),
+						pci_addr + (reg_no << 20),
 						0);
 		if (err) {
 			dev_err(dev, "program RC io outbound ATU failed\n");
@@ -852,8 +867,7 @@ static int rockchip_pcie_cfg_atu(struct rockchip_pcie *rockchip)
 				  AXI_WRAPPER_NOR_MSG,
 				  20 - 1, 0, 0);
 
-	rockchip->msg_bus_addr = rockchip->mem_bus_addr +
-					((reg_no + offset) << 20);
+	rockchip->msg_bus_addr += ((reg_no + offset) << 20);
 	return err;
 }
 
@@ -951,7 +965,6 @@ static int rockchip_pcie_probe(struct platform_device *pdev)
 	struct pci_bus *bus, *child;
 	struct pci_host_bridge *bridge;
 	struct resource *bus_res;
-	struct resource_entry *win;
 	int err;
 
 	if (!dev->of_node)
@@ -997,27 +1010,6 @@ static int rockchip_pcie_probe(struct platform_device *pdev)
 
 	rockchip->root_bus_nr = bus_res->start;
 
-	/* Get the I/O and memory ranges from DT */
-	resource_list_for_each_entry(win, &bridge->windows) {
-		switch (resource_type(win->res)) {
-		case IORESOURCE_IO:
-			io = win->res;
-			io->name = "I/O";
-			rockchip->io_size = resource_size(io);
-			rockchip->io_bus_addr = io->start - win->offset;
-			rockchip->io = io;
-			break;
-		case IORESOURCE_MEM:
-			mem = win->res;
-			mem->name = "MEM";
-			rockchip->mem_size = resource_size(mem);
-			rockchip->mem_bus_addr = mem->start - win->offset;
-			break;
-		default:
-			continue;
-		}
-	}
-
 	err = rockchip_pcie_cfg_atu(rockchip);
 	if (err)
 		goto err_remove_irq_domain;
diff --git a/drivers/pci/controller/pcie-rockchip.h b/drivers/pci/controller/pcie-rockchip.h
index 8e87a059ce73..bef42a803b56 100644
--- a/drivers/pci/controller/pcie-rockchip.h
+++ b/drivers/pci/controller/pcie-rockchip.h
@@ -304,13 +304,8 @@ struct rockchip_pcie {
 	struct	irq_domain *irq_domain;
 	int     offset;
 	struct pci_bus *root_bus;
-	struct resource *io;
-	phys_addr_t io_bus_addr;
-	u32     io_size;
 	void    __iomem *msg_region;
-	u32     mem_size;
 	phys_addr_t msg_bus_addr;
-	phys_addr_t mem_bus_addr;
 	bool is_rc;
 	struct resource *mem_res;
 };
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 49+ messages in thread

* [PATCH v3 12/25] PCI: v3-semi: Use pci_parse_request_of_pci_ranges()
  2019-10-28 16:32 [PATCH v3 00/25] PCI host resource consolidation Rob Herring
                   ` (10 preceding siblings ...)
  2019-10-28 16:32 ` [PATCH v3 11/25] PCI: rockchip: Drop storing driver private outbound resource data Rob Herring
@ 2019-10-28 16:32 ` Rob Herring
  2019-10-28 16:32 ` [PATCH v3 13/25] PCI: xgene: " Rob Herring
                   ` (13 subsequent siblings)
  25 siblings, 0 replies; 49+ messages in thread
From: Rob Herring @ 2019-10-28 16:32 UTC (permalink / raw)
  To: Andrew Murray, Bjorn Helgaas, Lorenzo Pieralisi
  Cc: linux-pci, linux-arm-kernel, bcm-kernel-feedback-list,
	Christoph Hellwig, Gustavo Pimentel, Heiko Stuebner,
	Hou Zhiqiang, Jingoo Han, Karthikeyan Mitran, Ley Foon Tan,
	Linus Walleij, linux-mediatek, linux-renesas-soc, linux-rockchip,
	Matthias Brugger, Michal Simek, Ray Jui, rfi, Ryder Lee,
	Scott Branden, Shawn Lin, Simon Horman, Srinath Mannam,
	Thomas Petazzoni, Toan Le, Tom Joseph, Will Deacon

Convert V3 host bridge to use the common
pci_parse_request_of_pci_ranges().

Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Cc: Andrew Murray <andrew.murray@arm.com>
Cc: Bjorn Helgaas <bhelgaas@google.com>
Acked-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Rob Herring <robh@kernel.org>
---
 drivers/pci/controller/pci-v3-semi.c | 35 +++++-----------------------
 1 file changed, 6 insertions(+), 29 deletions(-)

diff --git a/drivers/pci/controller/pci-v3-semi.c b/drivers/pci/controller/pci-v3-semi.c
index d219404bad92..96677520f6c1 100644
--- a/drivers/pci/controller/pci-v3-semi.c
+++ b/drivers/pci/controller/pci-v3-semi.c
@@ -241,10 +241,8 @@ struct v3_pci {
 	void __iomem *config_base;
 	struct pci_bus *bus;
 	u32 config_mem;
-	u32 io_mem;
 	u32 non_pre_mem;
 	u32 pre_mem;
-	phys_addr_t io_bus_addr;
 	phys_addr_t non_pre_bus_addr;
 	phys_addr_t pre_bus_addr;
 	struct regmap *map;
@@ -520,35 +518,22 @@ static int v3_integrator_init(struct v3_pci *v3)
 }
 
 static int v3_pci_setup_resource(struct v3_pci *v3,
-				 resource_size_t io_base,
 				 struct pci_host_bridge *host,
 				 struct resource_entry *win)
 {
 	struct device *dev = v3->dev;
 	struct resource *mem;
 	struct resource *io;
-	int ret;
 
 	switch (resource_type(win->res)) {
 	case IORESOURCE_IO:
 		io = win->res;
-		io->name = "V3 PCI I/O";
-		v3->io_mem = io_base;
-		v3->io_bus_addr = io->start - win->offset;
-		dev_dbg(dev, "I/O window %pR, bus addr %pap\n",
-			io, &v3->io_bus_addr);
-		ret = devm_pci_remap_iospace(dev, io, io_base);
-		if (ret) {
-			dev_warn(dev,
-				 "error %d: failed to map resource %pR\n",
-				 ret, io);
-			return ret;
-		}
+
 		/* Setup window 2 - PCI I/O */
-		writel(v3_addr_to_lb_base2(v3->io_mem) |
+		writel(v3_addr_to_lb_base2(pci_pio_to_address(io->start)) |
 		       V3_LB_BASE2_ENABLE,
 		       v3->base + V3_LB_BASE2);
-		writew(v3_addr_to_lb_map2(v3->io_bus_addr),
+		writew(v3_addr_to_lb_map2(io->start - win->offset),
 		       v3->base + V3_LB_MAP2);
 		break;
 	case IORESOURCE_MEM:
@@ -732,7 +717,6 @@ static int v3_pci_probe(struct platform_device *pdev)
 {
 	struct device *dev = &pdev->dev;
 	struct device_node *np = dev->of_node;
-	resource_size_t io_base;
 	struct resource *regs;
 	struct resource_entry *win;
 	struct v3_pci *v3;
@@ -741,7 +725,6 @@ static int v3_pci_probe(struct platform_device *pdev)
 	u16 val;
 	int irq;
 	int ret;
-	LIST_HEAD(res);
 
 	host = pci_alloc_host_bridge(sizeof(*v3));
 	if (!host)
@@ -793,12 +776,7 @@ static int v3_pci_probe(struct platform_device *pdev)
 	if (IS_ERR(v3->config_base))
 		return PTR_ERR(v3->config_base);
 
-	ret = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff, &res,
-						    &io_base);
-	if (ret)
-		return ret;
-
-	ret = devm_request_pci_bus_resources(dev, &res);
+	ret = pci_parse_request_of_pci_ranges(dev, &host->windows, NULL);
 	if (ret)
 		return ret;
 
@@ -852,8 +830,8 @@ static int v3_pci_probe(struct platform_device *pdev)
 	writew(val, v3->base + V3_PCI_CMD);
 
 	/* Get the I/O and memory ranges from DT */
-	resource_list_for_each_entry(win, &res) {
-		ret = v3_pci_setup_resource(v3, io_base, host, win);
+	resource_list_for_each_entry(win, &host->windows) {
+		ret = v3_pci_setup_resource(v3, host, win);
 		if (ret) {
 			dev_err(dev, "error setting up resources\n");
 			return ret;
@@ -931,7 +909,6 @@ static int v3_pci_probe(struct platform_device *pdev)
 	val |= V3_SYSTEM_M_LOCK;
 	writew(val, v3->base + V3_SYSTEM);
 
-	list_splice_init(&res, &host->windows);
 	ret = pci_scan_root_bus_bridge(host);
 	if (ret) {
 		dev_err(dev, "failed to register host: %d\n", ret);
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 49+ messages in thread

* [PATCH v3 13/25] PCI: xgene: Use pci_parse_request_of_pci_ranges()
  2019-10-28 16:32 [PATCH v3 00/25] PCI host resource consolidation Rob Herring
                   ` (11 preceding siblings ...)
  2019-10-28 16:32 ` [PATCH v3 12/25] PCI: v3-semi: Use pci_parse_request_of_pci_ranges() Rob Herring
@ 2019-10-28 16:32 ` Rob Herring
  2019-10-28 16:32 ` [PATCH v3 14/25] PCI: xilinx: " Rob Herring
                   ` (12 subsequent siblings)
  25 siblings, 0 replies; 49+ messages in thread
From: Rob Herring @ 2019-10-28 16:32 UTC (permalink / raw)
  To: Andrew Murray, Bjorn Helgaas, Lorenzo Pieralisi
  Cc: linux-pci, linux-arm-kernel, bcm-kernel-feedback-list,
	Christoph Hellwig, Gustavo Pimentel, Heiko Stuebner,
	Hou Zhiqiang, Jingoo Han, Karthikeyan Mitran, Ley Foon Tan,
	Linus Walleij, linux-mediatek, linux-renesas-soc, linux-rockchip,
	Matthias Brugger, Michal Simek, Ray Jui, rfi, Ryder Lee,
	Scott Branden, Shawn Lin, Simon Horman, Srinath Mannam,
	Thomas Petazzoni, Toan Le, Tom Joseph, Will Deacon

Convert the xgene host bridge to use the common
pci_parse_request_of_pci_ranges().

There's no need to assign the resources to a temporary list first. Just
use bridge->windows directly and remove all the temporary list handling.

Cc: Toan Le <toan@os.amperecomputing.com>
Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Cc: Andrew Murray <andrew.murray@arm.com>
Cc: Bjorn Helgaas <bhelgaas@google.com>
Signed-off-by: Rob Herring <robh@kernel.org>
---
 drivers/pci/controller/pci-xgene.c | 39 +++++++++---------------------
 1 file changed, 11 insertions(+), 28 deletions(-)

diff --git a/drivers/pci/controller/pci-xgene.c b/drivers/pci/controller/pci-xgene.c
index ffda3e8b4742..7d0f0395a479 100644
--- a/drivers/pci/controller/pci-xgene.c
+++ b/drivers/pci/controller/pci-xgene.c
@@ -405,15 +405,13 @@ static void xgene_pcie_setup_cfg_reg(struct xgene_pcie_port *port)
 	xgene_pcie_writel(port, CFGCTL, EN_REG);
 }
 
-static int xgene_pcie_map_ranges(struct xgene_pcie_port *port,
-				 struct list_head *res,
-				 resource_size_t io_base)
+static int xgene_pcie_map_ranges(struct xgene_pcie_port *port)
 {
+	struct pci_host_bridge *bridge = pci_host_bridge_from_priv(port);
 	struct resource_entry *window;
 	struct device *dev = port->dev;
-	int ret;
 
-	resource_list_for_each_entry(window, res) {
+	resource_list_for_each_entry(window, &bridge->windows) {
 		struct resource *res = window->res;
 		u64 restype = resource_type(res);
 
@@ -421,11 +419,9 @@ static int xgene_pcie_map_ranges(struct xgene_pcie_port *port,
 
 		switch (restype) {
 		case IORESOURCE_IO:
-			xgene_pcie_setup_ob_reg(port, res, OMR3BARL, io_base,
+			xgene_pcie_setup_ob_reg(port, res, OMR3BARL,
+						pci_pio_to_address(res->start),
 						res->start - window->offset);
-			ret = devm_pci_remap_iospace(dev, res, io_base);
-			if (ret < 0)
-				return ret;
 			break;
 		case IORESOURCE_MEM:
 			if (res->flags & IORESOURCE_PREFETCH)
@@ -567,8 +563,7 @@ static void xgene_pcie_clear_config(struct xgene_pcie_port *port)
 		xgene_pcie_writel(port, i, 0);
 }
 
-static int xgene_pcie_setup(struct xgene_pcie_port *port, struct list_head *res,
-			    resource_size_t io_base)
+static int xgene_pcie_setup(struct xgene_pcie_port *port)
 {
 	struct device *dev = port->dev;
 	u32 val, lanes = 0, speed = 0;
@@ -580,7 +575,7 @@ static int xgene_pcie_setup(struct xgene_pcie_port *port, struct list_head *res,
 	val = (XGENE_PCIE_DEVICEID << 16) | XGENE_PCIE_VENDORID;
 	xgene_pcie_writel(port, BRIDGE_CFG_0, val);
 
-	ret = xgene_pcie_map_ranges(port, res, io_base);
+	ret = xgene_pcie_map_ranges(port);
 	if (ret)
 		return ret;
 
@@ -607,11 +602,9 @@ static int xgene_pcie_probe(struct platform_device *pdev)
 	struct device *dev = &pdev->dev;
 	struct device_node *dn = dev->of_node;
 	struct xgene_pcie_port *port;
-	resource_size_t iobase = 0;
 	struct pci_bus *bus, *child;
 	struct pci_host_bridge *bridge;
 	int ret;
-	LIST_HEAD(res);
 
 	bridge = devm_pci_alloc_host_bridge(dev, sizeof(*port));
 	if (!bridge)
@@ -634,20 +627,14 @@ static int xgene_pcie_probe(struct platform_device *pdev)
 	if (ret)
 		return ret;
 
-	ret = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff, &res,
-						    &iobase);
+	ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows, NULL);
 	if (ret)
 		return ret;
 
-	ret = devm_request_pci_bus_resources(dev, &res);
-	if (ret)
-		goto error;
-
-	ret = xgene_pcie_setup(port, &res, iobase);
+	ret = xgene_pcie_setup(port);
 	if (ret)
-		goto error;
+		return ret;
 
-	list_splice_init(&res, &bridge->windows);
 	bridge->dev.parent = dev;
 	bridge->sysdata = port;
 	bridge->busnr = 0;
@@ -657,7 +644,7 @@ static int xgene_pcie_probe(struct platform_device *pdev)
 
 	ret = pci_scan_root_bus_bridge(bridge);
 	if (ret < 0)
-		goto error;
+		return ret;
 
 	bus = bridge->bus;
 
@@ -666,10 +653,6 @@ static int xgene_pcie_probe(struct platform_device *pdev)
 		pcie_bus_configure_settings(child);
 	pci_bus_add_devices(bus);
 	return 0;
-
-error:
-	pci_free_resource_list(&res);
-	return ret;
 }
 
 static const struct of_device_id xgene_pcie_match_table[] = {
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 49+ messages in thread

* [PATCH v3 14/25] PCI: xilinx: Use pci_parse_request_of_pci_ranges()
  2019-10-28 16:32 [PATCH v3 00/25] PCI host resource consolidation Rob Herring
                   ` (12 preceding siblings ...)
  2019-10-28 16:32 ` [PATCH v3 13/25] PCI: xgene: " Rob Herring
@ 2019-10-28 16:32 ` Rob Herring
  2019-10-28 16:32 ` [PATCH v3 15/25] PCI: xilinx-nwl: " Rob Herring
                   ` (11 subsequent siblings)
  25 siblings, 0 replies; 49+ messages in thread
From: Rob Herring @ 2019-10-28 16:32 UTC (permalink / raw)
  To: Andrew Murray, Bjorn Helgaas, Lorenzo Pieralisi
  Cc: linux-pci, linux-arm-kernel, bcm-kernel-feedback-list,
	Christoph Hellwig, Gustavo Pimentel, Heiko Stuebner,
	Hou Zhiqiang, Jingoo Han, Karthikeyan Mitran, Ley Foon Tan,
	Linus Walleij, linux-mediatek, linux-renesas-soc, linux-rockchip,
	Matthias Brugger, Michal Simek, Ray Jui, rfi, Ryder Lee,
	Scott Branden, Shawn Lin, Simon Horman, Srinath Mannam,
	Thomas Petazzoni, Toan Le, Tom Joseph, Will Deacon

Convert the Xilinx host bridge to use the common
pci_parse_request_of_pci_ranges().

There's no need to assign the resources to a temporary list first. Just
use bridge->windows directly and remove all the temporary list handling.

Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Cc: Andrew Murray <andrew.murray@arm.com>
Cc: Bjorn Helgaas <bhelgaas@google.com>
Cc: Michal Simek <michal.simek@xilinx.com>
Signed-off-by: Rob Herring <robh@kernel.org>
---
 drivers/pci/controller/pcie-xilinx.c | 17 ++---------------
 1 file changed, 2 insertions(+), 15 deletions(-)

diff --git a/drivers/pci/controller/pcie-xilinx.c b/drivers/pci/controller/pcie-xilinx.c
index 5bf3af3b28e6..257702288787 100644
--- a/drivers/pci/controller/pcie-xilinx.c
+++ b/drivers/pci/controller/pcie-xilinx.c
@@ -619,8 +619,6 @@ static int xilinx_pcie_probe(struct platform_device *pdev)
 	struct pci_bus *bus, *child;
 	struct pci_host_bridge *bridge;
 	int err;
-	resource_size_t iobase = 0;
-	LIST_HEAD(res);
 
 	if (!dev->of_node)
 		return -ENODEV;
@@ -647,19 +645,12 @@ static int xilinx_pcie_probe(struct platform_device *pdev)
 		return err;
 	}
 
-	err = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff, &res,
-						    &iobase);
+	err = pci_parse_request_of_pci_ranges(dev, &bridge->windows, NULL);
 	if (err) {
 		dev_err(dev, "Getting bridge resources failed\n");
 		return err;
 	}
 
-	err = devm_request_pci_bus_resources(dev, &res);
-	if (err)
-		goto error;
-
-
-	list_splice_init(&res, &bridge->windows);
 	bridge->dev.parent = dev;
 	bridge->sysdata = port;
 	bridge->busnr = 0;
@@ -673,7 +664,7 @@ static int xilinx_pcie_probe(struct platform_device *pdev)
 #endif
 	err = pci_scan_root_bus_bridge(bridge);
 	if (err < 0)
-		goto error;
+		return err;
 
 	bus = bridge->bus;
 
@@ -682,10 +673,6 @@ static int xilinx_pcie_probe(struct platform_device *pdev)
 		pcie_bus_configure_settings(child);
 	pci_bus_add_devices(bus);
 	return 0;
-
-error:
-	pci_free_resource_list(&res);
-	return err;
 }
 
 static const struct of_device_id xilinx_pcie_of_match[] = {
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 49+ messages in thread

* [PATCH v3 15/25] PCI: xilinx-nwl: Use pci_parse_request_of_pci_ranges()
  2019-10-28 16:32 [PATCH v3 00/25] PCI host resource consolidation Rob Herring
                   ` (13 preceding siblings ...)
  2019-10-28 16:32 ` [PATCH v3 14/25] PCI: xilinx: " Rob Herring
@ 2019-10-28 16:32 ` Rob Herring
  2019-10-28 16:32 ` [PATCH v3 16/25] PCI: versatile: " Rob Herring
                   ` (10 subsequent siblings)
  25 siblings, 0 replies; 49+ messages in thread
From: Rob Herring @ 2019-10-28 16:32 UTC (permalink / raw)
  To: Andrew Murray, Bjorn Helgaas, Lorenzo Pieralisi
  Cc: linux-pci, linux-arm-kernel, bcm-kernel-feedback-list,
	Christoph Hellwig, Gustavo Pimentel, Heiko Stuebner,
	Hou Zhiqiang, Jingoo Han, Karthikeyan Mitran, Ley Foon Tan,
	Linus Walleij, linux-mediatek, linux-renesas-soc, linux-rockchip,
	Matthias Brugger, Michal Simek, Ray Jui, rfi, Ryder Lee,
	Scott Branden, Shawn Lin, Simon Horman, Srinath Mannam,
	Thomas Petazzoni, Toan Le, Tom Joseph, Will Deacon

Convert the xilinx-nwl host bridge to use the common
pci_parse_request_of_pci_ranges().

There's no need to assign the resources to a temporary list first. Just
use bridge->windows directly and remove all the temporary list handling.

Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Cc: Andrew Murray <andrew.murray@arm.com>
Cc: Bjorn Helgaas <bhelgaas@google.com>
Cc: Michal Simek <michal.simek@xilinx.com>
Signed-off-by: Rob Herring <robh@kernel.org>
---
 drivers/pci/controller/pcie-xilinx-nwl.c | 20 ++++----------------
 1 file changed, 4 insertions(+), 16 deletions(-)

diff --git a/drivers/pci/controller/pcie-xilinx-nwl.c b/drivers/pci/controller/pcie-xilinx-nwl.c
index 45c0f344ccd1..e135a4b60489 100644
--- a/drivers/pci/controller/pcie-xilinx-nwl.c
+++ b/drivers/pci/controller/pcie-xilinx-nwl.c
@@ -821,8 +821,6 @@ static int nwl_pcie_probe(struct platform_device *pdev)
 	struct pci_bus *child;
 	struct pci_host_bridge *bridge;
 	int err;
-	resource_size_t iobase = 0;
-	LIST_HEAD(res);
 
 	bridge = devm_pci_alloc_host_bridge(dev, sizeof(*pcie));
 	if (!bridge)
@@ -845,24 +843,18 @@ static int nwl_pcie_probe(struct platform_device *pdev)
 		return err;
 	}
 
-	err = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff, &res,
-						    &iobase);
+	err = pci_parse_request_of_pci_ranges(dev, &bridge->windows, NULL);
 	if (err) {
 		dev_err(dev, "Getting bridge resources failed\n");
 		return err;
 	}
 
-	err = devm_request_pci_bus_resources(dev, &res);
-	if (err)
-		goto error;
-
 	err = nwl_pcie_init_irq_domain(pcie);
 	if (err) {
 		dev_err(dev, "Failed creating IRQ Domain\n");
-		goto error;
+		return err;
 	}
 
-	list_splice_init(&res, &bridge->windows);
 	bridge->dev.parent = dev;
 	bridge->sysdata = pcie;
 	bridge->busnr = pcie->root_busno;
@@ -874,13 +866,13 @@ static int nwl_pcie_probe(struct platform_device *pdev)
 		err = nwl_pcie_enable_msi(pcie);
 		if (err < 0) {
 			dev_err(dev, "failed to enable MSI support: %d\n", err);
-			goto error;
+			return err;
 		}
 	}
 
 	err = pci_scan_root_bus_bridge(bridge);
 	if (err)
-		goto error;
+		return err;
 
 	bus = bridge->bus;
 
@@ -889,10 +881,6 @@ static int nwl_pcie_probe(struct platform_device *pdev)
 		pcie_bus_configure_settings(child);
 	pci_bus_add_devices(bus);
 	return 0;
-
-error:
-	pci_free_resource_list(&res);
-	return err;
 }
 
 static struct platform_driver nwl_pcie_driver = {
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 49+ messages in thread

* [PATCH v3 16/25] PCI: versatile: Use pci_parse_request_of_pci_ranges()
  2019-10-28 16:32 [PATCH v3 00/25] PCI host resource consolidation Rob Herring
                   ` (14 preceding siblings ...)
  2019-10-28 16:32 ` [PATCH v3 15/25] PCI: xilinx-nwl: " Rob Herring
@ 2019-10-28 16:32 ` Rob Herring
  2019-10-28 16:32 ` [PATCH v3 17/25] PCI: versatile: Remove usage of PHYS_OFFSET Rob Herring
                   ` (9 subsequent siblings)
  25 siblings, 0 replies; 49+ messages in thread
From: Rob Herring @ 2019-10-28 16:32 UTC (permalink / raw)
  To: Andrew Murray, Bjorn Helgaas, Lorenzo Pieralisi
  Cc: linux-pci, linux-arm-kernel, bcm-kernel-feedback-list,
	Christoph Hellwig, Gustavo Pimentel, Heiko Stuebner,
	Hou Zhiqiang, Jingoo Han, Karthikeyan Mitran, Ley Foon Tan,
	Linus Walleij, linux-mediatek, linux-renesas-soc, linux-rockchip,
	Matthias Brugger, Michal Simek, Ray Jui, rfi, Ryder Lee,
	Scott Branden, Shawn Lin, Simon Horman, Srinath Mannam,
	Thomas Petazzoni, Toan Le, Tom Joseph, Will Deacon

Convert ARM Versatile host bridge to use the common
pci_parse_request_of_pci_ranges().

There's no need to assign the resources to a temporary list first. Just
use bridge->windows directly and remove all the temporary list handling.

Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Cc: Bjorn Helgaas <bhelgaas@google.com>
Acked-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Rob Herring <robh@kernel.org>
---
v2:
- Fix 'mem' initial value to 1
- Remove temporary resource list
---
 drivers/pci/controller/pci-versatile.c | 64 +++++---------------------
 1 file changed, 11 insertions(+), 53 deletions(-)

diff --git a/drivers/pci/controller/pci-versatile.c b/drivers/pci/controller/pci-versatile.c
index f59ad2728c0b..18697f2ea345 100644
--- a/drivers/pci/controller/pci-versatile.c
+++ b/drivers/pci/controller/pci-versatile.c
@@ -62,65 +62,16 @@ static struct pci_ops pci_versatile_ops = {
 	.write	= pci_generic_config_write,
 };
 
-static int versatile_pci_parse_request_of_pci_ranges(struct device *dev,
-						     struct list_head *res)
-{
-	int err, mem = 1, res_valid = 0;
-	resource_size_t iobase;
-	struct resource_entry *win, *tmp;
-
-	err = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff, res, &iobase);
-	if (err)
-		return err;
-
-	err = devm_request_pci_bus_resources(dev, res);
-	if (err)
-		goto out_release_res;
-
-	resource_list_for_each_entry_safe(win, tmp, res) {
-		struct resource *res = win->res;
-
-		switch (resource_type(res)) {
-		case IORESOURCE_IO:
-			err = devm_pci_remap_iospace(dev, res, iobase);
-			if (err) {
-				dev_warn(dev, "error %d: failed to map resource %pR\n",
-					 err, res);
-				resource_list_destroy_entry(win);
-			}
-			break;
-		case IORESOURCE_MEM:
-			res_valid |= !(res->flags & IORESOURCE_PREFETCH);
-
-			writel(res->start >> 28, PCI_IMAP(mem));
-			writel(PHYS_OFFSET >> 28, PCI_SMAP(mem));
-			mem++;
-
-			break;
-		}
-	}
-
-	if (res_valid)
-		return 0;
-
-	dev_err(dev, "non-prefetchable memory resource required\n");
-	err = -EINVAL;
-
-out_release_res:
-	pci_free_resource_list(res);
-	return err;
-}
-
 static int versatile_pci_probe(struct platform_device *pdev)
 {
 	struct device *dev = &pdev->dev;
 	struct resource *res;
-	int ret, i, myslot = -1;
+	struct resource_entry *entry;
+	int ret, i, myslot = -1, mem = 1;
 	u32 val;
 	void __iomem *local_pci_cfg_base;
 	struct pci_bus *bus, *child;
 	struct pci_host_bridge *bridge;
-	LIST_HEAD(pci_res);
 
 	bridge = devm_pci_alloc_host_bridge(dev, 0);
 	if (!bridge)
@@ -141,10 +92,18 @@ static int versatile_pci_probe(struct platform_device *pdev)
 	if (IS_ERR(versatile_cfg_base[1]))
 		return PTR_ERR(versatile_cfg_base[1]);
 
-	ret = versatile_pci_parse_request_of_pci_ranges(dev, &pci_res);
+	ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows, 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));
+			writel(PHYS_OFFSET >> 28, PCI_SMAP(mem));
+			mem++;
+		}
+	}
+
 	/*
 	 * We need to discover the PCI core first to configure itself
 	 * before the main PCI probing is performed
@@ -197,7 +156,6 @@ static int versatile_pci_probe(struct platform_device *pdev)
 	pci_add_flags(PCI_ENABLE_PROC_DOMAINS);
 	pci_add_flags(PCI_REASSIGN_ALL_BUS);
 
-	list_splice_init(&pci_res, &bridge->windows);
 	bridge->dev.parent = dev;
 	bridge->sysdata = NULL;
 	bridge->busnr = 0;
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 49+ messages in thread

* [PATCH v3 17/25] PCI: versatile: Remove usage of PHYS_OFFSET
  2019-10-28 16:32 [PATCH v3 00/25] PCI host resource consolidation Rob Herring
                   ` (15 preceding siblings ...)
  2019-10-28 16:32 ` [PATCH v3 16/25] PCI: versatile: " Rob Herring
@ 2019-10-28 16:32 ` Rob Herring
  2019-10-28 16:32 ` [PATCH v3 18/25] PCI: versatile: Enable COMPILE_TEST Rob Herring
                   ` (8 subsequent siblings)
  25 siblings, 0 replies; 49+ messages in thread
From: Rob Herring @ 2019-10-28 16:32 UTC (permalink / raw)
  To: Andrew Murray, Bjorn Helgaas, Lorenzo Pieralisi
  Cc: linux-pci, linux-arm-kernel, bcm-kernel-feedback-list,
	Christoph Hellwig, Gustavo Pimentel, Heiko Stuebner,
	Hou Zhiqiang, Jingoo Han, Karthikeyan Mitran, Ley Foon Tan,
	Linus Walleij, linux-mediatek, linux-renesas-soc, linux-rockchip,
	Matthias Brugger, Michal Simek, Ray Jui, rfi, Ryder Lee,
	Scott Branden, Shawn Lin, Simon Horman, Srinath Mannam,
	Thomas Petazzoni, Toan Le, Tom Joseph, Will Deacon

PHYS_OFFSET is not universally defined on all arches and using it prevents
enabling COMPILE_TEST. PAGE_OFFSET and __pa() are always available, so use
them to get the physical start of memory address.

This should have probably used 'dma-ranges' to get the address, but we
don't want to force a DT update to do that. At least in QEMU, the SMAP
registers have no effect (or perhaps the only value that is handled is 0).

Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Cc: Andrew Murray <andrew.murray@arm.com>
Cc: Bjorn Helgaas <bhelgaas@google.com>
Acked-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Rob Herring <robh@kernel.org>
---
 drivers/pci/controller/pci-versatile.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/drivers/pci/controller/pci-versatile.c b/drivers/pci/controller/pci-versatile.c
index 18697f2ea345..eae1b859990b 100644
--- a/drivers/pci/controller/pci-versatile.c
+++ b/drivers/pci/controller/pci-versatile.c
@@ -99,7 +99,7 @@ static int versatile_pci_probe(struct platform_device *pdev)
 	resource_list_for_each_entry(entry, &bridge->windows) {
 		if (resource_type(entry->res) == IORESOURCE_MEM) {
 			writel(entry->res->start >> 28, PCI_IMAP(mem));
-			writel(PHYS_OFFSET >> 28, PCI_SMAP(mem));
+			writel(__pa(PAGE_OFFSET) >> 28, PCI_SMAP(mem));
 			mem++;
 		}
 	}
@@ -136,9 +136,9 @@ static int versatile_pci_probe(struct platform_device *pdev)
 	/*
 	 * Configure the PCI inbound memory windows to be 1:1 mapped to SDRAM
 	 */
-	writel(PHYS_OFFSET, local_pci_cfg_base + PCI_BASE_ADDRESS_0);
-	writel(PHYS_OFFSET, local_pci_cfg_base + PCI_BASE_ADDRESS_1);
-	writel(PHYS_OFFSET, local_pci_cfg_base + PCI_BASE_ADDRESS_2);
+	writel(__pa(PAGE_OFFSET), local_pci_cfg_base + PCI_BASE_ADDRESS_0);
+	writel(__pa(PAGE_OFFSET), local_pci_cfg_base + PCI_BASE_ADDRESS_1);
+	writel(__pa(PAGE_OFFSET), local_pci_cfg_base + PCI_BASE_ADDRESS_2);
 
 	/*
 	 * For many years the kernel and QEMU were symbiotically buggy
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 49+ messages in thread

* [PATCH v3 18/25] PCI: versatile: Enable COMPILE_TEST
  2019-10-28 16:32 [PATCH v3 00/25] PCI host resource consolidation Rob Herring
                   ` (16 preceding siblings ...)
  2019-10-28 16:32 ` [PATCH v3 17/25] PCI: versatile: Remove usage of PHYS_OFFSET Rob Herring
@ 2019-10-28 16:32 ` Rob Herring
  2019-10-28 16:32 ` [PATCH v3 19/25] PCI: of: Add inbound resource parsing to helpers Rob Herring
                   ` (7 subsequent siblings)
  25 siblings, 0 replies; 49+ messages in thread
From: Rob Herring @ 2019-10-28 16:32 UTC (permalink / raw)
  To: Andrew Murray, Bjorn Helgaas, Lorenzo Pieralisi
  Cc: linux-pci, linux-arm-kernel, bcm-kernel-feedback-list,
	Christoph Hellwig, Gustavo Pimentel, Heiko Stuebner,
	Hou Zhiqiang, Jingoo Han, Karthikeyan Mitran, Ley Foon Tan,
	Linus Walleij, linux-mediatek, linux-renesas-soc, linux-rockchip,
	Matthias Brugger, Michal Simek, Ray Jui, rfi, Ryder Lee,
	Scott Branden, Shawn Lin, Simon Horman, Srinath Mannam,
	Thomas Petazzoni, Toan Le, Tom Joseph, Will Deacon

Since commit a574795bc383 ("PCI: generic,versatile: Remove unused
pci_sys_data structures") the build dependency on ARM is gone, so let's
enable COMPILE_TEST for versatile.

Reviewed-by: Andrew Murray <andrew.murray@arm.com>
Acked-by: Linus Walleij <linus.walleij@linaro.org>
Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Cc: Bjorn Helgaas <bhelgaas@google.com>
Signed-off-by: Rob Herring <robh@kernel.org>
---
 drivers/pci/controller/Kconfig | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/pci/controller/Kconfig b/drivers/pci/controller/Kconfig
index 70e078238899..f5de9119e8d3 100644
--- a/drivers/pci/controller/Kconfig
+++ b/drivers/pci/controller/Kconfig
@@ -135,7 +135,7 @@ config PCI_V3_SEMI
 
 config PCI_VERSATILE
 	bool "ARM Versatile PB PCI controller"
-	depends on ARCH_VERSATILE
+	depends on ARCH_VERSATILE || COMPILE_TEST
 
 config PCIE_IPROC
 	tristate
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 49+ messages in thread

* [PATCH v3 19/25] PCI: of: Add inbound resource parsing to helpers
  2019-10-28 16:32 [PATCH v3 00/25] PCI host resource consolidation Rob Herring
                   ` (17 preceding siblings ...)
  2019-10-28 16:32 ` [PATCH v3 18/25] PCI: versatile: Enable COMPILE_TEST Rob Herring
@ 2019-10-28 16:32 ` Rob Herring
  2019-10-29 11:07   ` Lorenzo Pieralisi
  2019-10-28 16:32 ` [PATCH v3 20/25] PCI: ftpci100: Use inbound resources for setup Rob Herring
                   ` (6 subsequent siblings)
  25 siblings, 1 reply; 49+ messages in thread
From: Rob Herring @ 2019-10-28 16:32 UTC (permalink / raw)
  To: Andrew Murray, Bjorn Helgaas, Lorenzo Pieralisi
  Cc: linux-pci, linux-arm-kernel, bcm-kernel-feedback-list,
	Christoph Hellwig, Gustavo Pimentel, Heiko Stuebner,
	Hou Zhiqiang, Jingoo Han, Karthikeyan Mitran, Ley Foon Tan,
	Linus Walleij, linux-mediatek, linux-renesas-soc, linux-rockchip,
	Matthias Brugger, Michal Simek, Ray Jui, rfi, Ryder Lee,
	Scott Branden, Shawn Lin, Simon Horman, Srinath Mannam,
	Thomas Petazzoni, Toan Le, Tom Joseph, Will Deacon

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
Tested-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com> # for AArdvark
Reviewed-by: Andrew Murray <andrew.murray@arm.com>
Acked-by: Gustavo Pimentel <gustavo.pimentel@synopsys.com>
Signed-off-by: Rob Herring <robh@kernel.org>
---
v2:
 - Fix crash in INIT_LIST_HEAD when ib_resources is NULL
---
 .../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          |  3 +-
 drivers/pci/controller/pci-versatile.c        |  3 +-
 drivers/pci/controller/pci-xgene.c            |  3 +-
 drivers/pci/controller/pcie-altera.c          |  2 +-
 drivers/pci/controller/pcie-cadence-host.c    |  2 +-
 drivers/pci/controller/pcie-iproc-platform.c  |  3 +-
 drivers/pci/controller/pcie-mediatek.c        |  2 +-
 drivers/pci/controller/pcie-mobiveil.c        |  3 +-
 drivers/pci/controller/pcie-rcar.c            |  3 +-
 drivers/pci/controller/pcie-rockchip-host.c   |  3 +-
 drivers/pci/controller/pcie-xilinx-nwl.c      |  3 +-
 drivers/pci/controller/pcie-xilinx.c          |  3 +-
 drivers/pci/of.c                              | 45 ++++++++++++++++++-
 drivers/pci/pci.h                             |  8 +++-
 include/linux/pci.h                           |  9 ++--
 19 files changed, 82 insertions(+), 23 deletions(-)

diff --git a/drivers/pci/controller/dwc/pcie-designware-host.c b/drivers/pci/controller/dwc/pcie-designware-host.c
index aeec8b65eb97..f7b1d80c4a0a 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)
 	if (!bridge)
 		return -ENOMEM;
 
-	ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows, NULL);
+	ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows,
+					      &bridge->dma_ranges, NULL);
 	if (ret)
 		return ret;
 
diff --git a/drivers/pci/controller/pci-aardvark.c b/drivers/pci/controller/pci-aardvark.c
index 9cbeba507f0c..b34eaa2cd762 100644
--- a/drivers/pci/controller/pci-aardvark.c
+++ b/drivers/pci/controller/pci-aardvark.c
@@ -939,7 +939,7 @@ static int advk_pcie_probe(struct platform_device *pdev)
 	}
 
 	ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows,
-					      &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 75603348b88a..66288b94e92d 100644
--- a/drivers/pci/controller/pci-ftpci100.c
+++ b/drivers/pci/controller/pci-ftpci100.c
@@ -477,7 +477,8 @@ 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, NULL);
+	ret = pci_parse_request_of_pci_ranges(dev, &host->windows,
+					      &host->dma_ranges, NULL);
 	if (ret)
 		return ret;
 
diff --git a/drivers/pci/controller/pci-host-common.c b/drivers/pci/controller/pci-host-common.c
index c8cb9c5188a4..250a3fc80ec6 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 96677520f6c1..2209c7671115 100644
--- a/drivers/pci/controller/pci-v3-semi.c
+++ b/drivers/pci/controller/pci-v3-semi.c
@@ -776,7 +776,8 @@ 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, NULL);
+	ret = pci_parse_request_of_pci_ranges(dev, &host->windows,
+					      &host->dma_ranges, NULL);
 	if (ret)
 		return ret;
 
diff --git a/drivers/pci/controller/pci-versatile.c b/drivers/pci/controller/pci-versatile.c
index eae1b859990b..b911359b6d81 100644
--- a/drivers/pci/controller/pci-versatile.c
+++ b/drivers/pci/controller/pci-versatile.c
@@ -92,7 +92,8 @@ 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);
+	ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows,
+					      NULL, NULL);
 	if (ret)
 		return ret;
 
diff --git a/drivers/pci/controller/pci-xgene.c b/drivers/pci/controller/pci-xgene.c
index 7d0f0395a479..9408269d943d 100644
--- a/drivers/pci/controller/pci-xgene.c
+++ b/drivers/pci/controller/pci-xgene.c
@@ -627,7 +627,8 @@ static int xgene_pcie_probe(struct platform_device *pdev)
 	if (ret)
 		return ret;
 
-	ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows, NULL);
+	ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows,
+					      &bridge->dma_ranges, NULL);
 	if (ret)
 		return ret;
 
diff --git a/drivers/pci/controller/pcie-altera.c b/drivers/pci/controller/pcie-altera.c
index ba025efeae28..b447c3e4abad 100644
--- a/drivers/pci/controller/pcie-altera.c
+++ b/drivers/pci/controller/pcie-altera.c
@@ -800,7 +800,7 @@ static int altera_pcie_probe(struct platform_device *pdev)
 	}
 
 	ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows,
-					      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 375d815f7301..ff0a81a632a1 100644
--- a/drivers/pci/controller/pcie-iproc-platform.c
+++ b/drivers/pci/controller/pcie-iproc-platform.c
@@ -95,7 +95,8 @@ 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, NULL);
+	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;
diff --git a/drivers/pci/controller/pcie-mediatek.c b/drivers/pci/controller/pcie-mediatek.c
index d9206a3cd56b..cb982891b22b 100644
--- a/drivers/pci/controller/pcie-mediatek.c
+++ b/drivers/pci/controller/pcie-mediatek.c
@@ -1034,7 +1034,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 4eab8624ce4d..257ba49c177c 100644
--- a/drivers/pci/controller/pcie-mobiveil.c
+++ b/drivers/pci/controller/pcie-mobiveil.c
@@ -875,7 +875,8 @@ static int mobiveil_pcie_probe(struct platform_device *pdev)
 	}
 
 	/* parse the host bridge base addresses from the device tree file */
-	ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows, NULL);
+	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;
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 f375e55ea02e..ee83f8494ee9 100644
--- a/drivers/pci/controller/pcie-rockchip-host.c
+++ b/drivers/pci/controller/pcie-rockchip-host.c
@@ -1004,7 +1004,8 @@ 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, &bus_res);
+	err = pci_parse_request_of_pci_ranges(dev, &bridge->windows,
+					      &bridge->dma_ranges, &bus_res);
 	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 e135a4b60489..9bd1427f2fd6 100644
--- a/drivers/pci/controller/pcie-xilinx-nwl.c
+++ b/drivers/pci/controller/pcie-xilinx-nwl.c
@@ -843,7 +843,8 @@ static int nwl_pcie_probe(struct platform_device *pdev)
 		return err;
 	}
 
-	err = pci_parse_request_of_pci_ranges(dev, &bridge->windows, NULL);
+	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;
diff --git a/drivers/pci/controller/pcie-xilinx.c b/drivers/pci/controller/pcie-xilinx.c
index 257702288787..98e55297815b 100644
--- a/drivers/pci/controller/pcie-xilinx.c
+++ b/drivers/pci/controller/pcie-xilinx.c
@@ -645,7 +645,8 @@ static int xilinx_pcie_probe(struct platform_device *pdev)
 		return err;
 	}
 
-	err = pci_parse_request_of_pci_ranges(dev, &bridge->windows, NULL);
+	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;
diff --git a/drivers/pci/of.c b/drivers/pci/of.c
index f3da49a31db4..0b1e4623dfcf 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,10 @@ int pci_parse_request_of_pci_ranges(struct device *dev,
 	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,
-						    &iobase);
+						    ib_resources, &iobase);
 	if (err)
 		return err;
 
diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h
index 3f6947ee3324..6692c4fe4290 100644
--- a/drivers/pci/pci.h
+++ b/drivers/pci/pci.h
@@ -633,11 +633,15 @@ static inline void pci_release_bus_of_node(struct pci_bus *bus) { }
 #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 f9088c89a534..5cb94916eaa1 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -2278,6 +2278,7 @@ 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) */
@@ -2286,9 +2287,11 @@ 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 resource **bus_range)
+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] 49+ messages in thread

* [PATCH v3 20/25] PCI: ftpci100: Use inbound resources for setup
  2019-10-28 16:32 [PATCH v3 00/25] PCI host resource consolidation Rob Herring
                   ` (18 preceding siblings ...)
  2019-10-28 16:32 ` [PATCH v3 19/25] PCI: of: Add inbound resource parsing to helpers Rob Herring
@ 2019-10-28 16:32 ` Rob Herring
  2019-10-28 16:32 ` [PATCH v3 21/25] PCI: v3-semi: " Rob Herring
                   ` (5 subsequent siblings)
  25 siblings, 0 replies; 49+ messages in thread
From: Rob Herring @ 2019-10-28 16:32 UTC (permalink / raw)
  To: Andrew Murray, Bjorn Helgaas, Lorenzo Pieralisi
  Cc: linux-pci, linux-arm-kernel, bcm-kernel-feedback-list,
	Christoph Hellwig, Gustavo Pimentel, Heiko Stuebner,
	Hou Zhiqiang, Jingoo Han, Karthikeyan Mitran, Ley Foon Tan,
	Linus Walleij, linux-mediatek, linux-renesas-soc, linux-rockchip,
	Matthias Brugger, Michal Simek, Ray Jui, rfi, Ryder Lee,
	Scott Branden, Shawn Lin, Simon Horman, Srinath Mannam,
	Thomas Petazzoni, Toan Le, Tom Joseph, Will Deacon

Now that the helpers provide the inbound resources in the host bridge
'dma_ranges' resource list, convert Faraday ftpci100 host bridge to use
the resource list to setup the inbound addresses.

Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Cc: Bjorn Helgaas <bhelgaas@google.com>
Reviewed-by: Andrew Murray <andrew.murray@arm.com>
Acked-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Rob Herring <robh@kernel.org>
---
 drivers/pci/controller/pci-ftpci100.c | 27 ++++++++++-----------------
 1 file changed, 10 insertions(+), 17 deletions(-)

diff --git a/drivers/pci/controller/pci-ftpci100.c b/drivers/pci/controller/pci-ftpci100.c
index 66288b94e92d..1b67564de7af 100644
--- a/drivers/pci/controller/pci-ftpci100.c
+++ b/drivers/pci/controller/pci-ftpci100.c
@@ -375,12 +375,11 @@ static int faraday_pci_setup_cascaded_irq(struct faraday_pci *p)
 	return 0;
 }
 
-static int faraday_pci_parse_map_dma_ranges(struct faraday_pci *p,
-					    struct device_node *np)
+static int faraday_pci_parse_map_dma_ranges(struct faraday_pci *p)
 {
-	struct of_pci_range range;
-	struct of_pci_range_parser parser;
 	struct device *dev = p->dev;
+	struct pci_host_bridge *bridge = pci_host_bridge_from_priv(p);
+	struct resource_entry *entry;
 	u32 confreg[3] = {
 		FARADAY_PCI_MEM1_BASE_SIZE,
 		FARADAY_PCI_MEM2_BASE_SIZE,
@@ -389,19 +388,13 @@ static int faraday_pci_parse_map_dma_ranges(struct faraday_pci *p,
 	int i = 0;
 	u32 val;
 
-	if (of_pci_dma_range_parser_init(&parser, np)) {
-		dev_err(dev, "missing dma-ranges property\n");
-		return -EINVAL;
-	}
-
-	/*
-	 * Get the dma-ranges from the device tree
-	 */
-	for_each_of_pci_range(&parser, &range) {
-		u64 end = range.pci_addr + range.size - 1;
+	resource_list_for_each_entry(entry, &bridge->dma_ranges) {
+		u64 pci_addr = entry->res->start - entry->offset;
+		u64 end = entry->res->end - entry->offset;
 		int ret;
 
-		ret = faraday_res_to_memcfg(range.pci_addr, range.size, &val);
+		ret = faraday_res_to_memcfg(pci_addr,
+					    resource_size(entry->res), &val);
 		if (ret) {
 			dev_err(dev,
 				"DMA range %d: illegal MEM resource size\n", i);
@@ -409,7 +402,7 @@ static int faraday_pci_parse_map_dma_ranges(struct faraday_pci *p,
 		}
 
 		dev_info(dev, "DMA MEM%d BASE: 0x%016llx -> 0x%016llx config %08x\n",
-			 i + 1, range.pci_addr, end, val);
+			 i + 1, pci_addr, end, val);
 		if (i <= 2) {
 			faraday_raw_pci_write_config(p, 0, 0, confreg[i],
 						     4, val);
@@ -539,7 +532,7 @@ static int faraday_pci_probe(struct platform_device *pdev)
 			cur_bus_speed = PCI_SPEED_66MHz;
 	}
 
-	ret = faraday_pci_parse_map_dma_ranges(p, dev->of_node);
+	ret = faraday_pci_parse_map_dma_ranges(p);
 	if (ret)
 		return ret;
 
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 49+ messages in thread

* [PATCH v3 21/25] PCI: v3-semi: Use inbound resources for setup
  2019-10-28 16:32 [PATCH v3 00/25] PCI host resource consolidation Rob Herring
                   ` (19 preceding siblings ...)
  2019-10-28 16:32 ` [PATCH v3 20/25] PCI: ftpci100: Use inbound resources for setup Rob Herring
@ 2019-10-28 16:32 ` Rob Herring
  2019-10-28 16:32 ` [PATCH v3 22/25] PCI: xgene: " Rob Herring
                   ` (4 subsequent siblings)
  25 siblings, 0 replies; 49+ messages in thread
From: Rob Herring @ 2019-10-28 16:32 UTC (permalink / raw)
  To: Andrew Murray, Bjorn Helgaas, Lorenzo Pieralisi
  Cc: linux-pci, linux-arm-kernel, bcm-kernel-feedback-list,
	Christoph Hellwig, Gustavo Pimentel, Heiko Stuebner,
	Hou Zhiqiang, Jingoo Han, Karthikeyan Mitran, Ley Foon Tan,
	Linus Walleij, linux-mediatek, linux-renesas-soc, linux-rockchip,
	Matthias Brugger, Michal Simek, Ray Jui, rfi, Ryder Lee,
	Scott Branden, Shawn Lin, Simon Horman, Srinath Mannam,
	Thomas Petazzoni, Toan Le, Tom Joseph, Will Deacon

Now that the helpers provide the inbound resources in the host bridge
'dma_ranges' resource list, convert the v3-semi host bridge to use
the resource list to setup the inbound addresses.

Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Cc: Bjorn Helgaas <bhelgaas@google.com>
Reviewed-by: Andrew Murray <andrew.murray@arm.com>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Rob Herring <robh@kernel.org>
---
 drivers/pci/controller/pci-v3-semi.c | 38 ++++++++++++----------------
 1 file changed, 16 insertions(+), 22 deletions(-)

diff --git a/drivers/pci/controller/pci-v3-semi.c b/drivers/pci/controller/pci-v3-semi.c
index 2209c7671115..bd05221f5a22 100644
--- a/drivers/pci/controller/pci-v3-semi.c
+++ b/drivers/pci/controller/pci-v3-semi.c
@@ -598,28 +598,30 @@ static int v3_pci_setup_resource(struct v3_pci *v3,
 }
 
 static int v3_get_dma_range_config(struct v3_pci *v3,
-				   struct of_pci_range *range,
+				   struct resource_entry *entry,
 				   u32 *pci_base, u32 *pci_map)
 {
 	struct device *dev = v3->dev;
-	u64 cpu_end = range->cpu_addr + range->size - 1;
-	u64 pci_end = range->pci_addr + range->size - 1;
+	u64 cpu_addr = entry->res->start;
+	u64 cpu_end = entry->res->end;
+	u64 pci_end = cpu_end - entry->offset;
+	u64 pci_addr = entry->res->start - entry->offset;
 	u32 val;
 
-	if (range->pci_addr & ~V3_PCI_BASE_M_ADR_BASE) {
+	if (pci_addr & ~V3_PCI_BASE_M_ADR_BASE) {
 		dev_err(dev, "illegal range, only PCI bits 31..20 allowed\n");
 		return -EINVAL;
 	}
-	val = ((u32)range->pci_addr) & V3_PCI_BASE_M_ADR_BASE;
+	val = ((u32)pci_addr) & V3_PCI_BASE_M_ADR_BASE;
 	*pci_base = val;
 
-	if (range->cpu_addr & ~V3_PCI_MAP_M_MAP_ADR) {
+	if (cpu_addr & ~V3_PCI_MAP_M_MAP_ADR) {
 		dev_err(dev, "illegal range, only CPU bits 31..20 allowed\n");
 		return -EINVAL;
 	}
-	val = ((u32)range->cpu_addr) & V3_PCI_MAP_M_MAP_ADR;
+	val = ((u32)cpu_addr) & V3_PCI_MAP_M_MAP_ADR;
 
-	switch (range->size) {
+	switch (resource_size(entry->res)) {
 	case SZ_1M:
 		val |= V3_LB_BASE_ADR_SIZE_1MB;
 		break;
@@ -667,8 +669,8 @@ static int v3_get_dma_range_config(struct v3_pci *v3,
 	dev_dbg(dev,
 		"DMA MEM CPU: 0x%016llx -> 0x%016llx => "
 		"PCI: 0x%016llx -> 0x%016llx base %08x map %08x\n",
-		range->cpu_addr, cpu_end,
-		range->pci_addr, pci_end,
+		cpu_addr, cpu_end,
+		pci_addr, pci_end,
 		*pci_base, *pci_map);
 
 	return 0;
@@ -677,24 +679,16 @@ static int v3_get_dma_range_config(struct v3_pci *v3,
 static int v3_pci_parse_map_dma_ranges(struct v3_pci *v3,
 				       struct device_node *np)
 {
-	struct of_pci_range range;
-	struct of_pci_range_parser parser;
+	struct pci_host_bridge *bridge = pci_host_bridge_from_priv(v3);
 	struct device *dev = v3->dev;
+	struct resource_entry *entry;
 	int i = 0;
 
-	if (of_pci_dma_range_parser_init(&parser, np)) {
-		dev_err(dev, "missing dma-ranges property\n");
-		return -EINVAL;
-	}
-
-	/*
-	 * Get the dma-ranges from the device tree
-	 */
-	for_each_of_pci_range(&parser, &range) {
+	resource_list_for_each_entry(entry, &bridge->dma_ranges) {
 		int ret;
 		u32 pci_base, pci_map;
 
-		ret = v3_get_dma_range_config(v3, &range, &pci_base, &pci_map);
+		ret = v3_get_dma_range_config(v3, entry, &pci_base, &pci_map);
 		if (ret)
 			return ret;
 
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 49+ messages in thread

* [PATCH v3 22/25] PCI: xgene: Use inbound resources for setup
  2019-10-28 16:32 [PATCH v3 00/25] PCI host resource consolidation Rob Herring
                   ` (20 preceding siblings ...)
  2019-10-28 16:32 ` [PATCH v3 21/25] PCI: v3-semi: " Rob Herring
@ 2019-10-28 16:32 ` Rob Herring
  2019-10-28 16:32 ` [PATCH v3 23/25] PCI: iproc: " Rob Herring
                   ` (3 subsequent siblings)
  25 siblings, 0 replies; 49+ messages in thread
From: Rob Herring @ 2019-10-28 16:32 UTC (permalink / raw)
  To: Andrew Murray, Bjorn Helgaas, Lorenzo Pieralisi
  Cc: linux-pci, linux-arm-kernel, bcm-kernel-feedback-list,
	Christoph Hellwig, Gustavo Pimentel, Heiko Stuebner,
	Hou Zhiqiang, Jingoo Han, Karthikeyan Mitran, Ley Foon Tan,
	Linus Walleij, linux-mediatek, linux-renesas-soc, linux-rockchip,
	Matthias Brugger, Michal Simek, Ray Jui, rfi, Ryder Lee,
	Scott Branden, Shawn Lin, Simon Horman, Srinath Mannam,
	Thomas Petazzoni, Toan Le, Tom Joseph, Will Deacon

Now that the helpers provide the inbound resources in the host bridge
'dma_ranges' resource list, convert the Xgene host bridge to use the
resource list to setup the inbound addresses.

Cc: Toan Le <toan@os.amperecomputing.com>
Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Cc: Bjorn Helgaas <bhelgaas@google.com>
Reviewed-by: Andrew Murray <andrew.murray@arm.com>
Signed-off-by: Rob Herring <robh@kernel.org>
---
 drivers/pci/controller/pci-xgene.c | 33 ++++++++++--------------------
 1 file changed, 11 insertions(+), 22 deletions(-)

diff --git a/drivers/pci/controller/pci-xgene.c b/drivers/pci/controller/pci-xgene.c
index 9408269d943d..de195fd430dc 100644
--- a/drivers/pci/controller/pci-xgene.c
+++ b/drivers/pci/controller/pci-xgene.c
@@ -481,27 +481,28 @@ static int xgene_pcie_select_ib_reg(u8 *ib_reg_mask, u64 size)
 }
 
 static void xgene_pcie_setup_ib_reg(struct xgene_pcie_port *port,
-				    struct of_pci_range *range, u8 *ib_reg_mask)
+				    struct resource_entry *entry,
+				    u8 *ib_reg_mask)
 {
 	void __iomem *cfg_base = port->cfg_base;
 	struct device *dev = port->dev;
 	void *bar_addr;
 	u32 pim_reg;
-	u64 cpu_addr = range->cpu_addr;
-	u64 pci_addr = range->pci_addr;
-	u64 size = range->size;
+	u64 cpu_addr = entry->res->start;
+	u64 pci_addr = cpu_addr - entry->offset;
+	u64 size = resource_size(entry->res);
 	u64 mask = ~(size - 1) | EN_REG;
 	u32 flags = PCI_BASE_ADDRESS_MEM_TYPE_64;
 	u32 bar_low;
 	int region;
 
-	region = xgene_pcie_select_ib_reg(ib_reg_mask, range->size);
+	region = xgene_pcie_select_ib_reg(ib_reg_mask, size);
 	if (region < 0) {
 		dev_warn(dev, "invalid pcie dma-range config\n");
 		return;
 	}
 
-	if (range->flags & IORESOURCE_PREFETCH)
+	if (entry->res->flags & IORESOURCE_PREFETCH)
 		flags |= PCI_BASE_ADDRESS_MEM_PREFETCH;
 
 	bar_low = pcie_bar_low_val((u32)cpu_addr, flags);
@@ -532,25 +533,13 @@ static void xgene_pcie_setup_ib_reg(struct xgene_pcie_port *port,
 
 static int xgene_pcie_parse_map_dma_ranges(struct xgene_pcie_port *port)
 {
-	struct device_node *np = port->node;
-	struct of_pci_range range;
-	struct of_pci_range_parser parser;
-	struct device *dev = port->dev;
+	struct pci_host_bridge *bridge = pci_host_bridge_from_priv(port);
+	struct resource_entry *entry;
 	u8 ib_reg_mask = 0;
 
-	if (of_pci_dma_range_parser_init(&parser, np)) {
-		dev_err(dev, "missing dma-ranges property\n");
-		return -EINVAL;
-	}
-
-	/* Get the dma-ranges from DT */
-	for_each_of_pci_range(&parser, &range) {
-		u64 end = range.cpu_addr + range.size - 1;
+	resource_list_for_each_entry(entry, &bridge->dma_ranges)
+		xgene_pcie_setup_ib_reg(port, entry, &ib_reg_mask);
 
-		dev_dbg(dev, "0x%08x 0x%016llx..0x%016llx -> 0x%016llx\n",
-			range.flags, range.cpu_addr, end, range.pci_addr);
-		xgene_pcie_setup_ib_reg(port, &range, &ib_reg_mask);
-	}
 	return 0;
 }
 
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 49+ messages in thread

* [PATCH v3 23/25] PCI: iproc: Use inbound resources for setup
  2019-10-28 16:32 [PATCH v3 00/25] PCI host resource consolidation Rob Herring
                   ` (21 preceding siblings ...)
  2019-10-28 16:32 ` [PATCH v3 22/25] PCI: xgene: " Rob Herring
@ 2019-10-28 16:32 ` Rob Herring
  2019-10-29 15:59   ` Srinath Mannam
  2019-10-28 16:32 ` [PATCH v3 24/25] PCI: rcar: " Rob Herring
                   ` (2 subsequent siblings)
  25 siblings, 1 reply; 49+ messages in thread
From: Rob Herring @ 2019-10-28 16:32 UTC (permalink / raw)
  To: Andrew Murray, Bjorn Helgaas, Lorenzo Pieralisi
  Cc: linux-pci, linux-arm-kernel, bcm-kernel-feedback-list,
	Christoph Hellwig, Gustavo Pimentel, Heiko Stuebner,
	Hou Zhiqiang, Jingoo Han, Karthikeyan Mitran, Ley Foon Tan,
	Linus Walleij, linux-mediatek, linux-renesas-soc, linux-rockchip,
	Matthias Brugger, Michal Simek, Ray Jui, rfi, Ryder Lee,
	Scott Branden, Shawn Lin, Simon Horman, Srinath Mannam,
	Thomas Petazzoni, Toan Le, Tom Joseph, Will Deacon

Now that the helpers provide the inbound resources in the host bridge
'dma_ranges' resource list, convert Broadcom iProc host bridge to use
the resource list to setup the inbound addresses.

Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Cc: Bjorn Helgaas <bhelgaas@google.com>
Cc: Ray Jui <rjui@broadcom.com>
Cc: Scott Branden <sbranden@broadcom.com>
Cc: bcm-kernel-feedback-list@broadcom.com
Reviewed-by: Andrew Murray <andrew.murray@arm.com>
Signed-off-by: Rob Herring <robh@kernel.org>
---
v2:
 - Fix iproc_pcie_paxb_v2_msi_steer() to use resource_entry
---
 drivers/pci/controller/pcie-iproc.c | 77 +++++++----------------------
 1 file changed, 17 insertions(+), 60 deletions(-)

diff --git a/drivers/pci/controller/pcie-iproc.c b/drivers/pci/controller/pcie-iproc.c
index 223335ee791a..f4d78e66846e 100644
--- a/drivers/pci/controller/pcie-iproc.c
+++ b/drivers/pci/controller/pcie-iproc.c
@@ -1122,15 +1122,16 @@ static int iproc_pcie_ib_write(struct iproc_pcie *pcie, int region_idx,
 }
 
 static int iproc_pcie_setup_ib(struct iproc_pcie *pcie,
-			       struct of_pci_range *range,
+			       struct resource_entry *entry,
 			       enum iproc_pcie_ib_map_type type)
 {
 	struct device *dev = pcie->dev;
 	struct iproc_pcie_ib *ib = &pcie->ib;
 	int ret;
 	unsigned int region_idx, size_idx;
-	u64 axi_addr = range->cpu_addr, pci_addr = range->pci_addr;
-	resource_size_t size = range->size;
+	u64 axi_addr = entry->res->start;
+	u64 pci_addr = entry->res->start - entry->offset;
+	resource_size_t size = resource_size(entry->res);
 
 	/* iterate through all IARR mapping regions */
 	for (region_idx = 0; region_idx < ib->nr_regions; region_idx++) {
@@ -1182,66 +1183,19 @@ static int iproc_pcie_setup_ib(struct iproc_pcie *pcie,
 	return ret;
 }
 
-static int iproc_pcie_add_dma_range(struct device *dev,
-				    struct list_head *resources,
-				    struct of_pci_range *range)
-{
-	struct resource *res;
-	struct resource_entry *entry, *tmp;
-	struct list_head *head = resources;
-
-	res = devm_kzalloc(dev, sizeof(struct resource), GFP_KERNEL);
-	if (!res)
-		return -ENOMEM;
-
-	resource_list_for_each_entry(tmp, resources) {
-		if (tmp->res->start < range->cpu_addr)
-			head = &tmp->node;
-	}
-
-	res->start = range->cpu_addr;
-	res->end = res->start + range->size - 1;
-
-	entry = resource_list_create_entry(res, 0);
-	if (!entry)
-		return -ENOMEM;
-
-	entry->offset = res->start - range->cpu_addr;
-	resource_list_add(entry, head);
-
-	return 0;
-}
-
 static int iproc_pcie_map_dma_ranges(struct iproc_pcie *pcie)
 {
 	struct pci_host_bridge *host = pci_host_bridge_from_priv(pcie);
-	struct of_pci_range range;
-	struct of_pci_range_parser parser;
-	int ret;
-	LIST_HEAD(resources);
-
-	/* Get the dma-ranges from DT */
-	ret = of_pci_dma_range_parser_init(&parser, pcie->dev->of_node);
-	if (ret)
-		return ret;
+	struct resource_entry *entry;
+	int ret = 0;
 
-	for_each_of_pci_range(&parser, &range) {
-		ret = iproc_pcie_add_dma_range(pcie->dev,
-					       &resources,
-					       &range);
-		if (ret)
-			goto out;
+	resource_list_for_each_entry(entry, &host->dma_ranges) {
 		/* Each range entry corresponds to an inbound mapping region */
-		ret = iproc_pcie_setup_ib(pcie, &range, IPROC_PCIE_IB_MAP_MEM);
+		ret = iproc_pcie_setup_ib(pcie, entry, IPROC_PCIE_IB_MAP_MEM);
 		if (ret)
-			goto out;
+			break;
 	}
 
-	list_splice_init(&resources, &host->dma_ranges);
-
-	return 0;
-out:
-	pci_free_resource_list(&resources);
 	return ret;
 }
 
@@ -1276,13 +1230,16 @@ static int iproce_pcie_get_msi(struct iproc_pcie *pcie,
 static int iproc_pcie_paxb_v2_msi_steer(struct iproc_pcie *pcie, u64 msi_addr)
 {
 	int ret;
-	struct of_pci_range range;
+	struct resource_entry entry;
+
+	memset(&entry, 0, sizeof(entry));
+	entry.res = &entry.__res;
 
-	memset(&range, 0, sizeof(range));
-	range.size = SZ_32K;
-	range.pci_addr = range.cpu_addr = msi_addr & ~(range.size - 1);
+	msi_addr &= ~(SZ_32K - 1);
+	entry.res->start = msi_addr;
+	entry.res->end = msi_addr + SZ_32K - 1;
 
-	ret = iproc_pcie_setup_ib(pcie, &range, IPROC_PCIE_IB_MAP_IO);
+	ret = iproc_pcie_setup_ib(pcie, &entry, IPROC_PCIE_IB_MAP_IO);
 	return ret;
 }
 
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 49+ messages in thread

* [PATCH v3 24/25] PCI: rcar: Use inbound resources for setup
  2019-10-28 16:32 [PATCH v3 00/25] PCI host resource consolidation Rob Herring
                   ` (22 preceding siblings ...)
  2019-10-28 16:32 ` [PATCH v3 23/25] PCI: iproc: " Rob Herring
@ 2019-10-28 16:32 ` Rob Herring
  2019-10-28 16:32 ` [PATCH v3 25/25] PCI: Make devm_of_pci_get_host_bridge_resources() static Rob Herring
  2019-10-31 10:57 ` [PATCH v3 00/25] PCI host resource consolidation Lorenzo Pieralisi
  25 siblings, 0 replies; 49+ messages in thread
From: Rob Herring @ 2019-10-28 16:32 UTC (permalink / raw)
  To: Andrew Murray, Bjorn Helgaas, Lorenzo Pieralisi
  Cc: linux-pci, linux-arm-kernel, bcm-kernel-feedback-list,
	Christoph Hellwig, Gustavo Pimentel, Heiko Stuebner,
	Hou Zhiqiang, Jingoo Han, Karthikeyan Mitran, Ley Foon Tan,
	Linus Walleij, linux-mediatek, linux-renesas-soc, linux-rockchip,
	Matthias Brugger, Michal Simek, Ray Jui, rfi, Ryder Lee,
	Scott Branden, Shawn Lin, Simon Horman, Srinath Mannam,
	Thomas Petazzoni, Toan Le, Tom Joseph, Will Deacon

Now that the helpers provide the inbound resources in the host bridge
'dma_ranges' resource list, convert Renesas R-Car PCIe host bridge to
use the resource list to setup the inbound addresses.

Cc: Simon Horman <horms@verge.net.au>
Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Cc: Bjorn Helgaas <bhelgaas@google.com>
Signed-off-by: Rob Herring <robh@kernel.org>
---
 drivers/pci/controller/pcie-rcar.c | 45 +++++++++++-------------------
 1 file changed, 16 insertions(+), 29 deletions(-)

diff --git a/drivers/pci/controller/pcie-rcar.c b/drivers/pci/controller/pcie-rcar.c
index b8d6e86a5539..453c931aaf77 100644
--- a/drivers/pci/controller/pcie-rcar.c
+++ b/drivers/pci/controller/pcie-rcar.c
@@ -1014,16 +1014,16 @@ static int rcar_pcie_get_resources(struct rcar_pcie *pcie)
 }
 
 static int rcar_pcie_inbound_ranges(struct rcar_pcie *pcie,
-				    struct of_pci_range *range,
+				    struct resource_entry *entry,
 				    int *index)
 {
-	u64 restype = range->flags;
-	u64 cpu_addr = range->cpu_addr;
-	u64 cpu_end = range->cpu_addr + range->size;
-	u64 pci_addr = range->pci_addr;
+	u64 restype = entry->res->flags;
+	u64 cpu_addr = entry->res->start;
+	u64 cpu_end = entry->res->end;
+	u64 pci_addr = entry->res->start - entry->offset;
 	u32 flags = LAM_64BIT | LAR_ENABLE;
 	u64 mask;
-	u64 size;
+	u64 size = resource_size(entry->res);
 	int idx = *index;
 
 	if (restype & IORESOURCE_PREFETCH)
@@ -1037,9 +1037,7 @@ static int rcar_pcie_inbound_ranges(struct rcar_pcie *pcie,
 		unsigned long nr_zeros = __ffs64(cpu_addr);
 		u64 alignment = 1ULL << nr_zeros;
 
-		size = min(range->size, alignment);
-	} else {
-		size = range->size;
+		size = min(size, alignment);
 	}
 	/* Hardware supports max 4GiB inbound region */
 	size = min(size, 1ULL << 32);
@@ -1078,30 +1076,19 @@ static int rcar_pcie_inbound_ranges(struct rcar_pcie *pcie,
 	return 0;
 }
 
-static int rcar_pcie_parse_map_dma_ranges(struct rcar_pcie *pcie,
-					  struct device_node *np)
+static int rcar_pcie_parse_map_dma_ranges(struct rcar_pcie *pcie)
 {
-	struct of_pci_range range;
-	struct of_pci_range_parser parser;
-	int index = 0;
-	int err;
-
-	if (of_pci_dma_range_parser_init(&parser, np))
-		return -EINVAL;
-
-	/* Get the dma-ranges from DT */
-	for_each_of_pci_range(&parser, &range) {
-		u64 end = range.cpu_addr + range.size - 1;
-
-		dev_dbg(pcie->dev, "0x%08x 0x%016llx..0x%016llx -> 0x%016llx\n",
-			range.flags, range.cpu_addr, end, range.pci_addr);
+	struct pci_host_bridge *bridge = pci_host_bridge_from_priv(pcie);
+	struct resource_entry *entry;
+	int index = 0, err = 0;
 
-		err = rcar_pcie_inbound_ranges(pcie, &range, &index);
+	resource_list_for_each_entry(entry, &bridge->dma_ranges) {
+		err = rcar_pcie_inbound_ranges(pcie, entry, &index);
 		if (err)
-			return err;
+			break;
 	}
 
-	return 0;
+	return err;
 }
 
 static const struct of_device_id rcar_pcie_of_match[] = {
@@ -1162,7 +1149,7 @@ static int rcar_pcie_probe(struct platform_device *pdev)
 		goto err_unmap_msi_irqs;
 	}
 
-	err = rcar_pcie_parse_map_dma_ranges(pcie, dev->of_node);
+	err = rcar_pcie_parse_map_dma_ranges(pcie);
 	if (err)
 		goto err_clk_disable;
 
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 49+ messages in thread

* [PATCH v3 25/25] PCI: Make devm_of_pci_get_host_bridge_resources() static
  2019-10-28 16:32 [PATCH v3 00/25] PCI host resource consolidation Rob Herring
                   ` (23 preceding siblings ...)
  2019-10-28 16:32 ` [PATCH v3 24/25] PCI: rcar: " Rob Herring
@ 2019-10-28 16:32 ` Rob Herring
  2019-10-31 10:57 ` [PATCH v3 00/25] PCI host resource consolidation Lorenzo Pieralisi
  25 siblings, 0 replies; 49+ messages in thread
From: Rob Herring @ 2019-10-28 16:32 UTC (permalink / raw)
  To: Andrew Murray, Bjorn Helgaas, Lorenzo Pieralisi
  Cc: linux-pci, linux-arm-kernel, bcm-kernel-feedback-list,
	Christoph Hellwig, Gustavo Pimentel, Heiko Stuebner,
	Hou Zhiqiang, Jingoo Han, Karthikeyan Mitran, Ley Foon Tan,
	Linus Walleij, linux-mediatek, linux-renesas-soc, linux-rockchip,
	Matthias Brugger, Michal Simek, Ray Jui, rfi, Ryder Lee,
	Scott Branden, Shawn Lin, Simon Horman, Srinath Mannam,
	Thomas Petazzoni, Toan Le, Tom Joseph, Will Deacon

Now that all the PCI host drivers are using pci_parse_request_of_pci_ranges(),
make devm_of_pci_get_host_bridge_resources() static.

Cc: Bjorn Helgaas <bhelgaas@google.com>
Signed-off-by: Rob Herring <robh@kernel.org>
---
 drivers/pci/of.c  |  5 +----
 drivers/pci/pci.h | 17 -----------------
 2 files changed, 1 insertion(+), 21 deletions(-)

diff --git a/drivers/pci/of.c b/drivers/pci/of.c
index 0b1e4623dfcf..00e4b9fcb41d 100644
--- a/drivers/pci/of.c
+++ b/drivers/pci/of.c
@@ -236,7 +236,6 @@ void of_pci_check_probe_only(void)
 }
 EXPORT_SYMBOL_GPL(of_pci_check_probe_only);
 
-#if defined(CONFIG_OF_ADDRESS)
 /**
  * devm_of_pci_get_host_bridge_resources() - Resource-managed parsing of PCI
  *                                           host bridge resources from DT
@@ -255,7 +254,7 @@ EXPORT_SYMBOL_GPL(of_pci_check_probe_only);
  * It returns zero if the range parsing has been successful or a standard error
  * value if it failed.
  */
-int devm_of_pci_get_host_bridge_resources(struct device *dev,
+static int devm_of_pci_get_host_bridge_resources(struct device *dev,
 			unsigned char busno, unsigned char bus_max,
 			struct list_head *resources,
 			struct list_head *ib_resources,
@@ -384,8 +383,6 @@ int devm_of_pci_get_host_bridge_resources(struct device *dev,
 	pci_free_resource_list(resources);
 	return err;
 }
-EXPORT_SYMBOL_GPL(devm_of_pci_get_host_bridge_resources);
-#endif /* CONFIG_OF_ADDRESS */
 
 #if IS_ENABLED(CONFIG_OF_IRQ)
 /**
diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h
index 6692c4fe4290..118a4974537b 100644
--- a/drivers/pci/pci.h
+++ b/drivers/pci/pci.h
@@ -630,23 +630,6 @@ static inline void pci_set_bus_of_node(struct pci_bus *bus) { }
 static inline void pci_release_bus_of_node(struct pci_bus *bus) { }
 #endif /* CONFIG_OF */
 
-#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,
-			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,
-			struct list_head *ib_resources,
-			resource_size_t *io_base)
-{
-	return -EINVAL;
-}
-#endif
-
 #ifdef CONFIG_PCIEAER
 void pci_no_aer(void);
 void pci_aer_init(struct pci_dev *dev);
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 49+ messages in thread

* RE: [PATCH v3 09/25] PCI: mobiveil: Use pci_parse_request_of_pci_ranges()
  2019-10-28 16:32 ` [PATCH v3 09/25] PCI: mobiveil: " Rob Herring
@ 2019-10-29  9:00   ` Z.q. Hou
  0 siblings, 0 replies; 49+ messages in thread
From: Z.q. Hou @ 2019-10-29  9:00 UTC (permalink / raw)
  To: Rob Herring, Andrew Murray, Bjorn Helgaas, Lorenzo Pieralisi
  Cc: linux-pci, linux-arm-kernel, bcm-kernel-feedback-list,
	Christoph Hellwig, Gustavo Pimentel, Heiko Stuebner, Jingoo Han,
	Karthikeyan Mitran, Ley Foon Tan, Linus Walleij, linux-mediatek,
	linux-renesas-soc, linux-rockchip, Matthias Brugger,
	Michal Simek, Ray Jui, rfi, Ryder Lee, Scott Branden, Shawn Lin,
	Simon Horman, Srinath Mannam, Thomas Petazzoni, Toan Le,
	Tom Joseph, Will Deacon



> -----Original Message-----
> From: Rob Herring <robh@kernel.org>
> Sent: 2019年10月29日 0:33
> To: Andrew Murray <andrew.murray@arm.com>; Bjorn Helgaas
> <bhelgaas@google.com>; Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
> Cc: linux-pci@vger.kernel.org; linux-arm-kernel@lists.infradead.org;
> bcm-kernel-feedback-list@broadcom.com; Christoph Hellwig
> <hch@infradead.org>; Gustavo Pimentel
> <gustavo.pimentel@synopsys.com>; Heiko Stuebner <heiko@sntech.de>;
> Z.q. Hou <zhiqiang.hou@nxp.com>; Jingoo Han <jingoohan1@gmail.com>;
> Karthikeyan Mitran <m.karthikeyan@mobiveil.co.in>; Ley Foon Tan
> <lftan@altera.com>; Linus Walleij <linus.walleij@linaro.org>;
> linux-mediatek@lists.infradead.org; linux-renesas-soc@vger.kernel.org;
> linux-rockchip@lists.infradead.org; Matthias Brugger
> <matthias.bgg@gmail.com>; Michal Simek <michal.simek@xilinx.com>; Ray
> Jui <rjui@broadcom.com>; rfi@lists.rocketboards.org; Ryder Lee
> <ryder.lee@mediatek.com>; Scott Branden <sbranden@broadcom.com>;
> Shawn Lin <shawn.lin@rock-chips.com>; Simon Horman
> <horms@verge.net.au>; Srinath Mannam
> <srinath.mannam@broadcom.com>; Thomas Petazzoni
> <thomas.petazzoni@bootlin.com>; Toan Le
> <toan@os.amperecomputing.com>; Tom Joseph <tjoseph@cadence.com>;
> Will Deacon <will@kernel.org>
> Subject: [PATCH v3 09/25] PCI: mobiveil: Use
> pci_parse_request_of_pci_ranges()
> 
> Convert the Mobiveil host bridge to use the common
> pci_parse_request_of_pci_ranges().
> 
> There's no need to assign the resources to a temporary list first. Just use
> bridge->windows directly and remove all the temporary list handling.
> 
> Cc: Karthikeyan Mitran <m.karthikeyan@mobiveil.co.in>
> Cc: Hou Zhiqiang <Zhiqiang.Hou@nxp.com>
> Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
> Cc: Bjorn Helgaas <bhelgaas@google.com>
> Reviewed-by: Andrew Murray <andrew.murray@arm.com>
> Signed-off-by: Rob Herring <robh@kernel.org>
> ---
>  drivers/pci/controller/pcie-mobiveil.c | 26 +++++++-------------------
>  1 file changed, 7 insertions(+), 19 deletions(-)
> 
> diff --git a/drivers/pci/controller/pcie-mobiveil.c
> b/drivers/pci/controller/pcie-mobiveil.c
> index a45a6447b01d..4eab8624ce4d 100644
> --- a/drivers/pci/controller/pcie-mobiveil.c
> +++ b/drivers/pci/controller/pcie-mobiveil.c
> @@ -140,7 +140,6 @@ struct mobiveil_msi {			/* MSI information
> */
> 
>  struct mobiveil_pcie {
>  	struct platform_device *pdev;
> -	struct list_head resources;
>  	void __iomem *config_axi_slave_base;	/* endpoint config base */
>  	void __iomem *csr_axi_slave_base;	/* root port config base */
>  	void __iomem *apb_csr_base;	/* MSI register base */
> @@ -575,6 +574,7 @@ static void mobiveil_pcie_enable_msi(struct
> mobiveil_pcie *pcie)
> 
>  static int mobiveil_host_init(struct mobiveil_pcie *pcie)  {
> +	struct pci_host_bridge *bridge = pci_host_bridge_from_priv(pcie);
>  	u32 value, pab_ctrl, type;
>  	struct resource_entry *win;
> 
> @@ -631,7 +631,7 @@ static int mobiveil_host_init(struct mobiveil_pcie
> *pcie)
>  	program_ib_windows(pcie, WIN_NUM_0, 0, 0, MEM_WINDOW_TYPE,
> IB_WIN_SIZE);
> 
>  	/* Get the I/O and memory ranges from DT */
> -	resource_list_for_each_entry(win, &pcie->resources) {
> +	resource_list_for_each_entry(win, &bridge->windows) {
>  		if (resource_type(win->res) == IORESOURCE_MEM)
>  			type = MEM_WINDOW_TYPE;
>  		else if (resource_type(win->res) == IORESOURCE_IO) @@ -857,7
> +857,6 @@ static int mobiveil_pcie_probe(struct platform_device *pdev)
>  	struct pci_bus *child;
>  	struct pci_host_bridge *bridge;
>  	struct device *dev = &pdev->dev;
> -	resource_size_t iobase;
>  	int ret;
> 
>  	/* allocate the PCIe port */
> @@ -875,11 +874,8 @@ static int mobiveil_pcie_probe(struct
> platform_device *pdev)
>  		return ret;
>  	}
> 
> -	INIT_LIST_HEAD(&pcie->resources);
> -
>  	/* 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);
> +	ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows, NULL);
>  	if (ret) {
>  		dev_err(dev, "Getting bridge resources failed\n");
>  		return ret;
> @@ -892,24 +888,19 @@ static int mobiveil_pcie_probe(struct
> platform_device *pdev)
>  	ret = mobiveil_host_init(pcie);
>  	if (ret) {
>  		dev_err(dev, "Failed to initialize host\n");
> -		goto error;
> +		return ret;
>  	}
> 
>  	/* initialize the IRQ domains */
>  	ret = mobiveil_pcie_init_irq_domain(pcie);
>  	if (ret) {
>  		dev_err(dev, "Failed creating IRQ Domain\n");
> -		goto error;
> +		return ret;
>  	}
> 
>  	irq_set_chained_handler_and_data(pcie->irq, mobiveil_pcie_isr, pcie);
> 
> -	ret = devm_request_pci_bus_resources(dev, &pcie->resources);
> -	if (ret)
> -		goto error;
> -
>  	/* Initialize bridge */
> -	list_splice_init(&pcie->resources, &bridge->windows);
>  	bridge->dev.parent = dev;
>  	bridge->sysdata = pcie;
>  	bridge->busnr = pcie->root_bus_nr;
> @@ -920,13 +911,13 @@ static int mobiveil_pcie_probe(struct
> platform_device *pdev)
>  	ret = mobiveil_bringup_link(pcie);
>  	if (ret) {
>  		dev_info(dev, "link bring-up failed\n");
> -		goto error;
> +		return ret;
>  	}
> 
>  	/* setup the kernel resources for the newly added PCIe root bus */
>  	ret = pci_scan_root_bus_bridge(bridge);
>  	if (ret)
> -		goto error;
> +		return ret;
> 
>  	bus = bridge->bus;
> 
> @@ -936,9 +927,6 @@ static int mobiveil_pcie_probe(struct
> platform_device *pdev)
>  	pci_bus_add_devices(bus);
> 
>  	return 0;
> -error:
> -	pci_free_resource_list(&pcie->resources);
> -	return ret;
>  }
> 
>  static const struct of_device_id mobiveil_pcie_of_match[] = {
> --
> 2.20.1

Reviewed-by: Hou Zhiqiang <Zhiqiang.Hou@nxp.com>

^ permalink raw reply	[flat|nested] 49+ messages in thread

* Re: [PATCH v3 19/25] PCI: of: Add inbound resource parsing to helpers
  2019-10-28 16:32 ` [PATCH v3 19/25] PCI: of: Add inbound resource parsing to helpers Rob Herring
@ 2019-10-29 11:07   ` Lorenzo Pieralisi
  2019-10-29 15:56     ` Srinath Mannam
  2019-10-29 22:12     ` Bjorn Helgaas
  0 siblings, 2 replies; 49+ messages in thread
From: Lorenzo Pieralisi @ 2019-10-29 11:07 UTC (permalink / raw)
  To: Rob Herring, Bjorn Helgaas
  Cc: Andrew Murray, linux-pci, linux-arm-kernel,
	bcm-kernel-feedback-list, Christoph Hellwig, Gustavo Pimentel,
	Heiko Stuebner, Hou Zhiqiang, Jingoo Han, Karthikeyan Mitran,
	Ley Foon Tan, Linus Walleij, linux-mediatek, linux-renesas-soc,
	linux-rockchip, Matthias Brugger, Michal Simek, Ray Jui, rfi,
	Ryder Lee, Scott Branden, Shawn Lin, Simon Horman,
	Srinath Mannam, Thomas Petazzoni, Toan Le, Tom Joseph,
	Will Deacon

On Mon, Oct 28, 2019 at 11:32:50AM -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
> Tested-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com> # for AArdvark
> Reviewed-by: Andrew Murray <andrew.murray@arm.com>
> Acked-by: Gustavo Pimentel <gustavo.pimentel@synopsys.com>
> Signed-off-by: Rob Herring <robh@kernel.org>
> ---
> v2:
>  - Fix crash in INIT_LIST_HEAD when ib_resources is NULL
> ---
>  .../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          |  3 +-
>  drivers/pci/controller/pci-versatile.c        |  3 +-
>  drivers/pci/controller/pci-xgene.c            |  3 +-
>  drivers/pci/controller/pcie-altera.c          |  2 +-
>  drivers/pci/controller/pcie-cadence-host.c    |  2 +-
>  drivers/pci/controller/pcie-iproc-platform.c  |  3 +-
>  drivers/pci/controller/pcie-mediatek.c        |  2 +-
>  drivers/pci/controller/pcie-mobiveil.c        |  3 +-
>  drivers/pci/controller/pcie-rcar.c            |  3 +-
>  drivers/pci/controller/pcie-rockchip-host.c   |  3 +-
>  drivers/pci/controller/pcie-xilinx-nwl.c      |  3 +-
>  drivers/pci/controller/pcie-xilinx.c          |  3 +-
>  drivers/pci/of.c                              | 45 ++++++++++++++++++-
>  drivers/pci/pci.h                             |  8 +++-
>  include/linux/pci.h                           |  9 ++--
>  19 files changed, 82 insertions(+), 23 deletions(-)

Hi Bjorn,

please let me know if you are OK with this patch, the series is
ready to go upstream IMO.

Thanks,
Lorenzo

> diff --git a/drivers/pci/controller/dwc/pcie-designware-host.c b/drivers/pci/controller/dwc/pcie-designware-host.c
> index aeec8b65eb97..f7b1d80c4a0a 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)
>  	if (!bridge)
>  		return -ENOMEM;
>  
> -	ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows, NULL);
> +	ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows,
> +					      &bridge->dma_ranges, NULL);
>  	if (ret)
>  		return ret;
>  
> diff --git a/drivers/pci/controller/pci-aardvark.c b/drivers/pci/controller/pci-aardvark.c
> index 9cbeba507f0c..b34eaa2cd762 100644
> --- a/drivers/pci/controller/pci-aardvark.c
> +++ b/drivers/pci/controller/pci-aardvark.c
> @@ -939,7 +939,7 @@ static int advk_pcie_probe(struct platform_device *pdev)
>  	}
>  
>  	ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows,
> -					      &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 75603348b88a..66288b94e92d 100644
> --- a/drivers/pci/controller/pci-ftpci100.c
> +++ b/drivers/pci/controller/pci-ftpci100.c
> @@ -477,7 +477,8 @@ 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, NULL);
> +	ret = pci_parse_request_of_pci_ranges(dev, &host->windows,
> +					      &host->dma_ranges, NULL);
>  	if (ret)
>  		return ret;
>  
> diff --git a/drivers/pci/controller/pci-host-common.c b/drivers/pci/controller/pci-host-common.c
> index c8cb9c5188a4..250a3fc80ec6 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 96677520f6c1..2209c7671115 100644
> --- a/drivers/pci/controller/pci-v3-semi.c
> +++ b/drivers/pci/controller/pci-v3-semi.c
> @@ -776,7 +776,8 @@ 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, NULL);
> +	ret = pci_parse_request_of_pci_ranges(dev, &host->windows,
> +					      &host->dma_ranges, NULL);
>  	if (ret)
>  		return ret;
>  
> diff --git a/drivers/pci/controller/pci-versatile.c b/drivers/pci/controller/pci-versatile.c
> index eae1b859990b..b911359b6d81 100644
> --- a/drivers/pci/controller/pci-versatile.c
> +++ b/drivers/pci/controller/pci-versatile.c
> @@ -92,7 +92,8 @@ 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);
> +	ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows,
> +					      NULL, NULL);
>  	if (ret)
>  		return ret;
>  
> diff --git a/drivers/pci/controller/pci-xgene.c b/drivers/pci/controller/pci-xgene.c
> index 7d0f0395a479..9408269d943d 100644
> --- a/drivers/pci/controller/pci-xgene.c
> +++ b/drivers/pci/controller/pci-xgene.c
> @@ -627,7 +627,8 @@ static int xgene_pcie_probe(struct platform_device *pdev)
>  	if (ret)
>  		return ret;
>  
> -	ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows, NULL);
> +	ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows,
> +					      &bridge->dma_ranges, NULL);
>  	if (ret)
>  		return ret;
>  
> diff --git a/drivers/pci/controller/pcie-altera.c b/drivers/pci/controller/pcie-altera.c
> index ba025efeae28..b447c3e4abad 100644
> --- a/drivers/pci/controller/pcie-altera.c
> +++ b/drivers/pci/controller/pcie-altera.c
> @@ -800,7 +800,7 @@ static int altera_pcie_probe(struct platform_device *pdev)
>  	}
>  
>  	ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows,
> -					      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 375d815f7301..ff0a81a632a1 100644
> --- a/drivers/pci/controller/pcie-iproc-platform.c
> +++ b/drivers/pci/controller/pcie-iproc-platform.c
> @@ -95,7 +95,8 @@ 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, NULL);
> +	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;
> diff --git a/drivers/pci/controller/pcie-mediatek.c b/drivers/pci/controller/pcie-mediatek.c
> index d9206a3cd56b..cb982891b22b 100644
> --- a/drivers/pci/controller/pcie-mediatek.c
> +++ b/drivers/pci/controller/pcie-mediatek.c
> @@ -1034,7 +1034,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 4eab8624ce4d..257ba49c177c 100644
> --- a/drivers/pci/controller/pcie-mobiveil.c
> +++ b/drivers/pci/controller/pcie-mobiveil.c
> @@ -875,7 +875,8 @@ static int mobiveil_pcie_probe(struct platform_device *pdev)
>  	}
>  
>  	/* parse the host bridge base addresses from the device tree file */
> -	ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows, NULL);
> +	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;
> 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 f375e55ea02e..ee83f8494ee9 100644
> --- a/drivers/pci/controller/pcie-rockchip-host.c
> +++ b/drivers/pci/controller/pcie-rockchip-host.c
> @@ -1004,7 +1004,8 @@ 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, &bus_res);
> +	err = pci_parse_request_of_pci_ranges(dev, &bridge->windows,
> +					      &bridge->dma_ranges, &bus_res);
>  	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 e135a4b60489..9bd1427f2fd6 100644
> --- a/drivers/pci/controller/pcie-xilinx-nwl.c
> +++ b/drivers/pci/controller/pcie-xilinx-nwl.c
> @@ -843,7 +843,8 @@ static int nwl_pcie_probe(struct platform_device *pdev)
>  		return err;
>  	}
>  
> -	err = pci_parse_request_of_pci_ranges(dev, &bridge->windows, NULL);
> +	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;
> diff --git a/drivers/pci/controller/pcie-xilinx.c b/drivers/pci/controller/pcie-xilinx.c
> index 257702288787..98e55297815b 100644
> --- a/drivers/pci/controller/pcie-xilinx.c
> +++ b/drivers/pci/controller/pcie-xilinx.c
> @@ -645,7 +645,8 @@ static int xilinx_pcie_probe(struct platform_device *pdev)
>  		return err;
>  	}
>  
> -	err = pci_parse_request_of_pci_ranges(dev, &bridge->windows, NULL);
> +	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;
> diff --git a/drivers/pci/of.c b/drivers/pci/of.c
> index f3da49a31db4..0b1e4623dfcf 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,10 @@ int pci_parse_request_of_pci_ranges(struct device *dev,
>  	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,
> -						    &iobase);
> +						    ib_resources, &iobase);
>  	if (err)
>  		return err;
>  
> diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h
> index 3f6947ee3324..6692c4fe4290 100644
> --- a/drivers/pci/pci.h
> +++ b/drivers/pci/pci.h
> @@ -633,11 +633,15 @@ static inline void pci_release_bus_of_node(struct pci_bus *bus) { }
>  #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 f9088c89a534..5cb94916eaa1 100644
> --- a/include/linux/pci.h
> +++ b/include/linux/pci.h
> @@ -2278,6 +2278,7 @@ 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) */
> @@ -2286,9 +2287,11 @@ 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 resource **bus_range)
> +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	[flat|nested] 49+ messages in thread

* Re: [PATCH v3 19/25] PCI: of: Add inbound resource parsing to helpers
  2019-10-29 11:07   ` Lorenzo Pieralisi
@ 2019-10-29 15:56     ` Srinath Mannam
  2019-10-29 17:34       ` Lorenzo Pieralisi
  2019-10-29 22:12     ` Bjorn Helgaas
  1 sibling, 1 reply; 49+ messages in thread
From: Srinath Mannam @ 2019-10-29 15:56 UTC (permalink / raw)
  To: Lorenzo Pieralisi
  Cc: Rob Herring, Bjorn Helgaas, Andrew Murray, linux-pci, Linux ARM,
	BCM Kernel Feedback, Christoph Hellwig, Gustavo Pimentel,
	Heiko Stuebner, Hou Zhiqiang, Jingoo Han, Karthikeyan Mitran,
	Ley Foon Tan, Linus Walleij, linux-mediatek, linux-renesas-soc,
	linux-rockchip, Matthias Brugger, Michal Simek, Ray Jui, rfi,
	Ryder Lee, Scott Branden, Shawn Lin, Simon Horman,
	Thomas Petazzoni, Toan Le, Tom Joseph, Will Deacon

Hi Lorenzo,

All changes are looks good to me.
I have one doubt regarding, resources added in the
"bridge->dma_ranges" list are expected to be in sorted order which are
used in "iova_reserve_pci_windows". Please correct me if I missed any
patch specific to this.

Regards,
Srinath.

On Tue, Oct 29, 2019 at 4:37 PM Lorenzo Pieralisi
<lorenzo.pieralisi@arm.com> wrote:
>
> On Mon, Oct 28, 2019 at 11:32:50AM -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
> > Tested-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com> # for AArdvark
> > Reviewed-by: Andrew Murray <andrew.murray@arm.com>
> > Acked-by: Gustavo Pimentel <gustavo.pimentel@synopsys.com>
> > Signed-off-by: Rob Herring <robh@kernel.org>
> > ---
> > v2:
> >  - Fix crash in INIT_LIST_HEAD when ib_resources is NULL
> > ---
> >  .../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          |  3 +-
> >  drivers/pci/controller/pci-versatile.c        |  3 +-
> >  drivers/pci/controller/pci-xgene.c            |  3 +-
> >  drivers/pci/controller/pcie-altera.c          |  2 +-
> >  drivers/pci/controller/pcie-cadence-host.c    |  2 +-
> >  drivers/pci/controller/pcie-iproc-platform.c  |  3 +-
> >  drivers/pci/controller/pcie-mediatek.c        |  2 +-
> >  drivers/pci/controller/pcie-mobiveil.c        |  3 +-
> >  drivers/pci/controller/pcie-rcar.c            |  3 +-
> >  drivers/pci/controller/pcie-rockchip-host.c   |  3 +-
> >  drivers/pci/controller/pcie-xilinx-nwl.c      |  3 +-
> >  drivers/pci/controller/pcie-xilinx.c          |  3 +-
> >  drivers/pci/of.c                              | 45 ++++++++++++++++++-
> >  drivers/pci/pci.h                             |  8 +++-
> >  include/linux/pci.h                           |  9 ++--
> >  19 files changed, 82 insertions(+), 23 deletions(-)
>
> Hi Bjorn,
>
> please let me know if you are OK with this patch, the series is
> ready to go upstream IMO.
>
> Thanks,
> Lorenzo
>
> > diff --git a/drivers/pci/controller/dwc/pcie-designware-host.c b/drivers/pci/controller/dwc/pcie-designware-host.c
> > index aeec8b65eb97..f7b1d80c4a0a 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)
> >       if (!bridge)
> >               return -ENOMEM;
> >
> > -     ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows, NULL);
> > +     ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows,
> > +                                           &bridge->dma_ranges, NULL);
> >       if (ret)
> >               return ret;
> >
> > diff --git a/drivers/pci/controller/pci-aardvark.c b/drivers/pci/controller/pci-aardvark.c
> > index 9cbeba507f0c..b34eaa2cd762 100644
> > --- a/drivers/pci/controller/pci-aardvark.c
> > +++ b/drivers/pci/controller/pci-aardvark.c
> > @@ -939,7 +939,7 @@ static int advk_pcie_probe(struct platform_device *pdev)
> >       }
> >
> >       ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows,
> > -                                           &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 75603348b88a..66288b94e92d 100644
> > --- a/drivers/pci/controller/pci-ftpci100.c
> > +++ b/drivers/pci/controller/pci-ftpci100.c
> > @@ -477,7 +477,8 @@ 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, NULL);
> > +     ret = pci_parse_request_of_pci_ranges(dev, &host->windows,
> > +                                           &host->dma_ranges, NULL);
> >       if (ret)
> >               return ret;
> >
> > diff --git a/drivers/pci/controller/pci-host-common.c b/drivers/pci/controller/pci-host-common.c
> > index c8cb9c5188a4..250a3fc80ec6 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 96677520f6c1..2209c7671115 100644
> > --- a/drivers/pci/controller/pci-v3-semi.c
> > +++ b/drivers/pci/controller/pci-v3-semi.c
> > @@ -776,7 +776,8 @@ 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, NULL);
> > +     ret = pci_parse_request_of_pci_ranges(dev, &host->windows,
> > +                                           &host->dma_ranges, NULL);
> >       if (ret)
> >               return ret;
> >
> > diff --git a/drivers/pci/controller/pci-versatile.c b/drivers/pci/controller/pci-versatile.c
> > index eae1b859990b..b911359b6d81 100644
> > --- a/drivers/pci/controller/pci-versatile.c
> > +++ b/drivers/pci/controller/pci-versatile.c
> > @@ -92,7 +92,8 @@ 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);
> > +     ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows,
> > +                                           NULL, NULL);
> >       if (ret)
> >               return ret;
> >
> > diff --git a/drivers/pci/controller/pci-xgene.c b/drivers/pci/controller/pci-xgene.c
> > index 7d0f0395a479..9408269d943d 100644
> > --- a/drivers/pci/controller/pci-xgene.c
> > +++ b/drivers/pci/controller/pci-xgene.c
> > @@ -627,7 +627,8 @@ static int xgene_pcie_probe(struct platform_device *pdev)
> >       if (ret)
> >               return ret;
> >
> > -     ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows, NULL);
> > +     ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows,
> > +                                           &bridge->dma_ranges, NULL);
> >       if (ret)
> >               return ret;
> >
> > diff --git a/drivers/pci/controller/pcie-altera.c b/drivers/pci/controller/pcie-altera.c
> > index ba025efeae28..b447c3e4abad 100644
> > --- a/drivers/pci/controller/pcie-altera.c
> > +++ b/drivers/pci/controller/pcie-altera.c
> > @@ -800,7 +800,7 @@ static int altera_pcie_probe(struct platform_device *pdev)
> >       }
> >
> >       ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows,
> > -                                           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 375d815f7301..ff0a81a632a1 100644
> > --- a/drivers/pci/controller/pcie-iproc-platform.c
> > +++ b/drivers/pci/controller/pcie-iproc-platform.c
> > @@ -95,7 +95,8 @@ 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, NULL);
> > +     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;
> > diff --git a/drivers/pci/controller/pcie-mediatek.c b/drivers/pci/controller/pcie-mediatek.c
> > index d9206a3cd56b..cb982891b22b 100644
> > --- a/drivers/pci/controller/pcie-mediatek.c
> > +++ b/drivers/pci/controller/pcie-mediatek.c
> > @@ -1034,7 +1034,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 4eab8624ce4d..257ba49c177c 100644
> > --- a/drivers/pci/controller/pcie-mobiveil.c
> > +++ b/drivers/pci/controller/pcie-mobiveil.c
> > @@ -875,7 +875,8 @@ static int mobiveil_pcie_probe(struct platform_device *pdev)
> >       }
> >
> >       /* parse the host bridge base addresses from the device tree file */
> > -     ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows, NULL);
> > +     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;
> > 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 f375e55ea02e..ee83f8494ee9 100644
> > --- a/drivers/pci/controller/pcie-rockchip-host.c
> > +++ b/drivers/pci/controller/pcie-rockchip-host.c
> > @@ -1004,7 +1004,8 @@ 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, &bus_res);
> > +     err = pci_parse_request_of_pci_ranges(dev, &bridge->windows,
> > +                                           &bridge->dma_ranges, &bus_res);
> >       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 e135a4b60489..9bd1427f2fd6 100644
> > --- a/drivers/pci/controller/pcie-xilinx-nwl.c
> > +++ b/drivers/pci/controller/pcie-xilinx-nwl.c
> > @@ -843,7 +843,8 @@ static int nwl_pcie_probe(struct platform_device *pdev)
> >               return err;
> >       }
> >
> > -     err = pci_parse_request_of_pci_ranges(dev, &bridge->windows, NULL);
> > +     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;
> > diff --git a/drivers/pci/controller/pcie-xilinx.c b/drivers/pci/controller/pcie-xilinx.c
> > index 257702288787..98e55297815b 100644
> > --- a/drivers/pci/controller/pcie-xilinx.c
> > +++ b/drivers/pci/controller/pcie-xilinx.c
> > @@ -645,7 +645,8 @@ static int xilinx_pcie_probe(struct platform_device *pdev)
> >               return err;
> >       }
> >
> > -     err = pci_parse_request_of_pci_ranges(dev, &bridge->windows, NULL);
> > +     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;
> > diff --git a/drivers/pci/of.c b/drivers/pci/of.c
> > index f3da49a31db4..0b1e4623dfcf 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,10 @@ int pci_parse_request_of_pci_ranges(struct device *dev,
> >       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,
> > -                                                 &iobase);
> > +                                                 ib_resources, &iobase);
> >       if (err)
> >               return err;
> >
> > diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h
> > index 3f6947ee3324..6692c4fe4290 100644
> > --- a/drivers/pci/pci.h
> > +++ b/drivers/pci/pci.h
> > @@ -633,11 +633,15 @@ static inline void pci_release_bus_of_node(struct pci_bus *bus) { }
> >  #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 f9088c89a534..5cb94916eaa1 100644
> > --- a/include/linux/pci.h
> > +++ b/include/linux/pci.h
> > @@ -2278,6 +2278,7 @@ 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) */
> > @@ -2286,9 +2287,11 @@ 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 resource **bus_range)
> > +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	[flat|nested] 49+ messages in thread

* Re: [PATCH v3 07/25] PCI: iproc: Use pci_parse_request_of_pci_ranges()
  2019-10-28 16:32 ` [PATCH v3 07/25] PCI: iproc: " Rob Herring
@ 2019-10-29 15:58   ` Srinath Mannam
  2019-10-29 17:09     ` Florian Fainelli
  0 siblings, 1 reply; 49+ messages in thread
From: Srinath Mannam @ 2019-10-29 15:58 UTC (permalink / raw)
  To: Rob Herring
  Cc: Andrew Murray, Bjorn Helgaas, Lorenzo Pieralisi, linux-pci,
	Linux ARM, BCM Kernel Feedback, Christoph Hellwig,
	Gustavo Pimentel, Heiko Stuebner, Hou Zhiqiang, Jingoo Han,
	Karthikeyan Mitran, Ley Foon Tan, Linus Walleij, linux-mediatek,
	linux-renesas-soc, linux-rockchip, Matthias Brugger,
	Michal Simek, Ray Jui, rfi, Ryder Lee, Scott Branden, Shawn Lin,
	Simon Horman, Thomas Petazzoni, Toan Le, Tom Joseph, Will Deacon

Hi Rob,

I reviewed and verified this change.. It is working fine.

Regards,
Srinath.

On Mon, Oct 28, 2019 at 10:03 PM Rob Herring <robh@kernel.org> wrote:
>
> Convert the iProc host bridge to use the common
> pci_parse_request_of_pci_ranges().
>
> There's no need to assign the resources to a temporary list, so just use
> bridge->windows directly.
>
> Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
> Cc: Bjorn Helgaas <bhelgaas@google.com>
> Cc: Ray Jui <rjui@broadcom.com>
> Cc: Scott Branden <sbranden@broadcom.com>
> Cc: bcm-kernel-feedback-list@broadcom.com
> Reviewed-by: Andrew Murray <andrew.murray@arm.com>
> Signed-off-by: Rob Herring <robh@kernel.org>
> ---
>  drivers/pci/controller/pcie-iproc-platform.c | 8 ++------
>  drivers/pci/controller/pcie-iproc.c          | 5 -----
>  2 files changed, 2 insertions(+), 11 deletions(-)
>
> diff --git a/drivers/pci/controller/pcie-iproc-platform.c b/drivers/pci/controller/pcie-iproc-platform.c
> index 9ee6200a66f4..375d815f7301 100644
> --- a/drivers/pci/controller/pcie-iproc-platform.c
> +++ b/drivers/pci/controller/pcie-iproc-platform.c
> @@ -43,8 +43,6 @@ static int iproc_pcie_pltfm_probe(struct platform_device *pdev)
>         struct iproc_pcie *pcie;
>         struct device_node *np = dev->of_node;
>         struct resource reg;
> -       resource_size_t iobase = 0;
> -       LIST_HEAD(resources);
>         struct pci_host_bridge *bridge;
>         int ret;
>
> @@ -97,8 +95,7 @@ static int iproc_pcie_pltfm_probe(struct platform_device *pdev)
>         if (IS_ERR(pcie->phy))
>                 return PTR_ERR(pcie->phy);
>
> -       ret = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff, &resources,
> -                                                   &iobase);
> +       ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows, NULL);
>         if (ret) {
>                 dev_err(dev, "unable to get PCI host bridge resources\n");
>                 return ret;
> @@ -113,10 +110,9 @@ static int iproc_pcie_pltfm_probe(struct platform_device *pdev)
>                 pcie->map_irq = of_irq_parse_and_map_pci;
>         }
>
> -       ret = iproc_pcie_setup(pcie, &resources);
> +       ret = iproc_pcie_setup(pcie, &bridge->windows);
>         if (ret) {
>                 dev_err(dev, "PCIe controller setup failed\n");
> -               pci_free_resource_list(&resources);
>                 return ret;
>         }
>
> diff --git a/drivers/pci/controller/pcie-iproc.c b/drivers/pci/controller/pcie-iproc.c
> index 2d457bfdaf66..223335ee791a 100644
> --- a/drivers/pci/controller/pcie-iproc.c
> +++ b/drivers/pci/controller/pcie-iproc.c
> @@ -1498,10 +1498,6 @@ int iproc_pcie_setup(struct iproc_pcie *pcie, struct list_head *res)
>                 return ret;
>         }
>
> -       ret = devm_request_pci_bus_resources(dev, res);
> -       if (ret)
> -               return ret;
> -
>         ret = phy_init(pcie->phy);
>         if (ret) {
>                 dev_err(dev, "unable to initialize PCIe PHY\n");
> @@ -1543,7 +1539,6 @@ int iproc_pcie_setup(struct iproc_pcie *pcie, struct list_head *res)
>                 if (iproc_pcie_msi_enable(pcie))
>                         dev_info(dev, "not using iProc MSI\n");
>
> -       list_splice_init(res, &host->windows);
>         host->busnr = 0;
>         host->dev.parent = dev;
>         host->ops = &iproc_pcie_ops;
> --
> 2.20.1
>

^ permalink raw reply	[flat|nested] 49+ messages in thread

* Re: [PATCH v3 23/25] PCI: iproc: Use inbound resources for setup
  2019-10-28 16:32 ` [PATCH v3 23/25] PCI: iproc: " Rob Herring
@ 2019-10-29 15:59   ` Srinath Mannam
  0 siblings, 0 replies; 49+ messages in thread
From: Srinath Mannam @ 2019-10-29 15:59 UTC (permalink / raw)
  To: Rob Herring
  Cc: Andrew Murray, Bjorn Helgaas, Lorenzo Pieralisi, linux-pci,
	Linux ARM, BCM Kernel Feedback, Christoph Hellwig,
	Gustavo Pimentel, Heiko Stuebner, Hou Zhiqiang, Jingoo Han,
	Karthikeyan Mitran, Ley Foon Tan, Linus Walleij, linux-mediatek,
	linux-renesas-soc, linux-rockchip, Matthias Brugger,
	Michal Simek, Ray Jui, rfi, Ryder Lee, Scott Branden, Shawn Lin,
	Simon Horman, Thomas Petazzoni, Toan Le, Tom Joseph, Will Deacon

Hi Rob,

I reviewed and verified this change.. It is working fine.

Regards,
Srinath.

On Mon, Oct 28, 2019 at 10:03 PM Rob Herring <robh@kernel.org> wrote:
>
> Now that the helpers provide the inbound resources in the host bridge
> 'dma_ranges' resource list, convert Broadcom iProc host bridge to use
> the resource list to setup the inbound addresses.
>
> Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
> Cc: Bjorn Helgaas <bhelgaas@google.com>
> Cc: Ray Jui <rjui@broadcom.com>
> Cc: Scott Branden <sbranden@broadcom.com>
> Cc: bcm-kernel-feedback-list@broadcom.com
> Reviewed-by: Andrew Murray <andrew.murray@arm.com>
> Signed-off-by: Rob Herring <robh@kernel.org>
> ---
> v2:
>  - Fix iproc_pcie_paxb_v2_msi_steer() to use resource_entry
> ---
>  drivers/pci/controller/pcie-iproc.c | 77 +++++++----------------------
>  1 file changed, 17 insertions(+), 60 deletions(-)
>
> diff --git a/drivers/pci/controller/pcie-iproc.c b/drivers/pci/controller/pcie-iproc.c
> index 223335ee791a..f4d78e66846e 100644
> --- a/drivers/pci/controller/pcie-iproc.c
> +++ b/drivers/pci/controller/pcie-iproc.c
> @@ -1122,15 +1122,16 @@ static int iproc_pcie_ib_write(struct iproc_pcie *pcie, int region_idx,
>  }
>
>  static int iproc_pcie_setup_ib(struct iproc_pcie *pcie,
> -                              struct of_pci_range *range,
> +                              struct resource_entry *entry,
>                                enum iproc_pcie_ib_map_type type)
>  {
>         struct device *dev = pcie->dev;
>         struct iproc_pcie_ib *ib = &pcie->ib;
>         int ret;
>         unsigned int region_idx, size_idx;
> -       u64 axi_addr = range->cpu_addr, pci_addr = range->pci_addr;
> -       resource_size_t size = range->size;
> +       u64 axi_addr = entry->res->start;
> +       u64 pci_addr = entry->res->start - entry->offset;
> +       resource_size_t size = resource_size(entry->res);
>
>         /* iterate through all IARR mapping regions */
>         for (region_idx = 0; region_idx < ib->nr_regions; region_idx++) {
> @@ -1182,66 +1183,19 @@ static int iproc_pcie_setup_ib(struct iproc_pcie *pcie,
>         return ret;
>  }
>
> -static int iproc_pcie_add_dma_range(struct device *dev,
> -                                   struct list_head *resources,
> -                                   struct of_pci_range *range)
> -{
> -       struct resource *res;
> -       struct resource_entry *entry, *tmp;
> -       struct list_head *head = resources;
> -
> -       res = devm_kzalloc(dev, sizeof(struct resource), GFP_KERNEL);
> -       if (!res)
> -               return -ENOMEM;
> -
> -       resource_list_for_each_entry(tmp, resources) {
> -               if (tmp->res->start < range->cpu_addr)
> -                       head = &tmp->node;
> -       }
> -
> -       res->start = range->cpu_addr;
> -       res->end = res->start + range->size - 1;
> -
> -       entry = resource_list_create_entry(res, 0);
> -       if (!entry)
> -               return -ENOMEM;
> -
> -       entry->offset = res->start - range->cpu_addr;
> -       resource_list_add(entry, head);
> -
> -       return 0;
> -}
> -
>  static int iproc_pcie_map_dma_ranges(struct iproc_pcie *pcie)
>  {
>         struct pci_host_bridge *host = pci_host_bridge_from_priv(pcie);
> -       struct of_pci_range range;
> -       struct of_pci_range_parser parser;
> -       int ret;
> -       LIST_HEAD(resources);
> -
> -       /* Get the dma-ranges from DT */
> -       ret = of_pci_dma_range_parser_init(&parser, pcie->dev->of_node);
> -       if (ret)
> -               return ret;
> +       struct resource_entry *entry;
> +       int ret = 0;
>
> -       for_each_of_pci_range(&parser, &range) {
> -               ret = iproc_pcie_add_dma_range(pcie->dev,
> -                                              &resources,
> -                                              &range);
> -               if (ret)
> -                       goto out;
> +       resource_list_for_each_entry(entry, &host->dma_ranges) {
>                 /* Each range entry corresponds to an inbound mapping region */
> -               ret = iproc_pcie_setup_ib(pcie, &range, IPROC_PCIE_IB_MAP_MEM);
> +               ret = iproc_pcie_setup_ib(pcie, entry, IPROC_PCIE_IB_MAP_MEM);
>                 if (ret)
> -                       goto out;
> +                       break;
>         }
>
> -       list_splice_init(&resources, &host->dma_ranges);
> -
> -       return 0;
> -out:
> -       pci_free_resource_list(&resources);
>         return ret;
>  }
>
> @@ -1276,13 +1230,16 @@ static int iproce_pcie_get_msi(struct iproc_pcie *pcie,
>  static int iproc_pcie_paxb_v2_msi_steer(struct iproc_pcie *pcie, u64 msi_addr)
>  {
>         int ret;
> -       struct of_pci_range range;
> +       struct resource_entry entry;
> +
> +       memset(&entry, 0, sizeof(entry));
> +       entry.res = &entry.__res;
>
> -       memset(&range, 0, sizeof(range));
> -       range.size = SZ_32K;
> -       range.pci_addr = range.cpu_addr = msi_addr & ~(range.size - 1);
> +       msi_addr &= ~(SZ_32K - 1);
> +       entry.res->start = msi_addr;
> +       entry.res->end = msi_addr + SZ_32K - 1;
>
> -       ret = iproc_pcie_setup_ib(pcie, &range, IPROC_PCIE_IB_MAP_IO);
> +       ret = iproc_pcie_setup_ib(pcie, &entry, IPROC_PCIE_IB_MAP_IO);
>         return ret;
>  }
>
> --
> 2.20.1
>

^ permalink raw reply	[flat|nested] 49+ messages in thread

* Re: [PATCH v3 07/25] PCI: iproc: Use pci_parse_request_of_pci_ranges()
  2019-10-29 15:58   ` Srinath Mannam
@ 2019-10-29 17:09     ` Florian Fainelli
  0 siblings, 0 replies; 49+ messages in thread
From: Florian Fainelli @ 2019-10-29 17:09 UTC (permalink / raw)
  To: Srinath Mannam, Rob Herring
  Cc: Heiko Stuebner, Karthikeyan Mitran, linux-pci, Linus Walleij,
	Matthias Brugger, Thomas Petazzoni, Toan Le, Will Deacon,
	Lorenzo Pieralisi, Michal Simek, Christoph Hellwig,
	linux-rockchip, BCM Kernel Feedback, Shawn Lin, Ray Jui,
	Hou Zhiqiang, Ryder Lee, linux-mediatek, Andrew Murray,
	Bjorn Helgaas, Linux ARM, Scott Branden, Jingoo Han, rfi,
	linux-renesas-soc, Tom Joseph, Simon Horman, Gustavo Pimentel,
	Ley Foon Tan

On 10/29/19 8:58 AM, Srinath Mannam wrote:
> Hi Rob,
> 
> I reviewed and verified this change.. It is working fine.

You can make that more explicit with a Reviewed-by and Tested-by tag,
that way it gets picked up by patchwork and can be part of the commit
message when this gets applied.
-- 
Florian

^ permalink raw reply	[flat|nested] 49+ messages in thread

* Re: [PATCH v3 19/25] PCI: of: Add inbound resource parsing to helpers
  2019-10-29 15:56     ` Srinath Mannam
@ 2019-10-29 17:34       ` Lorenzo Pieralisi
  2019-10-30  6:44         ` Srinath Mannam
  0 siblings, 1 reply; 49+ messages in thread
From: Lorenzo Pieralisi @ 2019-10-29 17:34 UTC (permalink / raw)
  To: Srinath Mannam
  Cc: Rob Herring, Bjorn Helgaas, Andrew Murray, linux-pci, Linux ARM,
	BCM Kernel Feedback, Christoph Hellwig, Gustavo Pimentel,
	Heiko Stuebner, Hou Zhiqiang, Jingoo Han, Karthikeyan Mitran,
	Ley Foon Tan, Linus Walleij, linux-mediatek, linux-renesas-soc,
	linux-rockchip, Matthias Brugger, Michal Simek, Ray Jui, rfi,
	Ryder Lee, Scott Branden, Shawn Lin, Simon Horman,
	Thomas Petazzoni, Toan Le, Tom Joseph, Will Deacon

On Tue, Oct 29, 2019 at 09:26:51PM +0530, Srinath Mannam wrote:
> Hi Lorenzo,
> 
> All changes are looks good to me.
> I have one doubt regarding, resources added in the
> "bridge->dma_ranges" list are expected to be in sorted order which are
> used in "iova_reserve_pci_windows". Please correct me if I missed any
> patch specific to this.

No I don't think so, it is just that we need to decide which piece of
code should sort that list, whether in this patchset or by patching the
kernel in iova_reserve_pci_windows().

I tend to think the sorting should be done in iova_reserve_pci_windows()
because that's where the requirement is.

Lorenzo

> Regards,
> Srinath.
> 
> On Tue, Oct 29, 2019 at 4:37 PM Lorenzo Pieralisi
> <lorenzo.pieralisi@arm.com> wrote:
> >
> > On Mon, Oct 28, 2019 at 11:32:50AM -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
> > > Tested-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com> # for AArdvark
> > > Reviewed-by: Andrew Murray <andrew.murray@arm.com>
> > > Acked-by: Gustavo Pimentel <gustavo.pimentel@synopsys.com>
> > > Signed-off-by: Rob Herring <robh@kernel.org>
> > > ---
> > > v2:
> > >  - Fix crash in INIT_LIST_HEAD when ib_resources is NULL
> > > ---
> > >  .../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          |  3 +-
> > >  drivers/pci/controller/pci-versatile.c        |  3 +-
> > >  drivers/pci/controller/pci-xgene.c            |  3 +-
> > >  drivers/pci/controller/pcie-altera.c          |  2 +-
> > >  drivers/pci/controller/pcie-cadence-host.c    |  2 +-
> > >  drivers/pci/controller/pcie-iproc-platform.c  |  3 +-
> > >  drivers/pci/controller/pcie-mediatek.c        |  2 +-
> > >  drivers/pci/controller/pcie-mobiveil.c        |  3 +-
> > >  drivers/pci/controller/pcie-rcar.c            |  3 +-
> > >  drivers/pci/controller/pcie-rockchip-host.c   |  3 +-
> > >  drivers/pci/controller/pcie-xilinx-nwl.c      |  3 +-
> > >  drivers/pci/controller/pcie-xilinx.c          |  3 +-
> > >  drivers/pci/of.c                              | 45 ++++++++++++++++++-
> > >  drivers/pci/pci.h                             |  8 +++-
> > >  include/linux/pci.h                           |  9 ++--
> > >  19 files changed, 82 insertions(+), 23 deletions(-)
> >
> > Hi Bjorn,
> >
> > please let me know if you are OK with this patch, the series is
> > ready to go upstream IMO.
> >
> > Thanks,
> > Lorenzo
> >
> > > diff --git a/drivers/pci/controller/dwc/pcie-designware-host.c b/drivers/pci/controller/dwc/pcie-designware-host.c
> > > index aeec8b65eb97..f7b1d80c4a0a 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)
> > >       if (!bridge)
> > >               return -ENOMEM;
> > >
> > > -     ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows, NULL);
> > > +     ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows,
> > > +                                           &bridge->dma_ranges, NULL);
> > >       if (ret)
> > >               return ret;
> > >
> > > diff --git a/drivers/pci/controller/pci-aardvark.c b/drivers/pci/controller/pci-aardvark.c
> > > index 9cbeba507f0c..b34eaa2cd762 100644
> > > --- a/drivers/pci/controller/pci-aardvark.c
> > > +++ b/drivers/pci/controller/pci-aardvark.c
> > > @@ -939,7 +939,7 @@ static int advk_pcie_probe(struct platform_device *pdev)
> > >       }
> > >
> > >       ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows,
> > > -                                           &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 75603348b88a..66288b94e92d 100644
> > > --- a/drivers/pci/controller/pci-ftpci100.c
> > > +++ b/drivers/pci/controller/pci-ftpci100.c
> > > @@ -477,7 +477,8 @@ 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, NULL);
> > > +     ret = pci_parse_request_of_pci_ranges(dev, &host->windows,
> > > +                                           &host->dma_ranges, NULL);
> > >       if (ret)
> > >               return ret;
> > >
> > > diff --git a/drivers/pci/controller/pci-host-common.c b/drivers/pci/controller/pci-host-common.c
> > > index c8cb9c5188a4..250a3fc80ec6 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 96677520f6c1..2209c7671115 100644
> > > --- a/drivers/pci/controller/pci-v3-semi.c
> > > +++ b/drivers/pci/controller/pci-v3-semi.c
> > > @@ -776,7 +776,8 @@ 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, NULL);
> > > +     ret = pci_parse_request_of_pci_ranges(dev, &host->windows,
> > > +                                           &host->dma_ranges, NULL);
> > >       if (ret)
> > >               return ret;
> > >
> > > diff --git a/drivers/pci/controller/pci-versatile.c b/drivers/pci/controller/pci-versatile.c
> > > index eae1b859990b..b911359b6d81 100644
> > > --- a/drivers/pci/controller/pci-versatile.c
> > > +++ b/drivers/pci/controller/pci-versatile.c
> > > @@ -92,7 +92,8 @@ 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);
> > > +     ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows,
> > > +                                           NULL, NULL);
> > >       if (ret)
> > >               return ret;
> > >
> > > diff --git a/drivers/pci/controller/pci-xgene.c b/drivers/pci/controller/pci-xgene.c
> > > index 7d0f0395a479..9408269d943d 100644
> > > --- a/drivers/pci/controller/pci-xgene.c
> > > +++ b/drivers/pci/controller/pci-xgene.c
> > > @@ -627,7 +627,8 @@ static int xgene_pcie_probe(struct platform_device *pdev)
> > >       if (ret)
> > >               return ret;
> > >
> > > -     ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows, NULL);
> > > +     ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows,
> > > +                                           &bridge->dma_ranges, NULL);
> > >       if (ret)
> > >               return ret;
> > >
> > > diff --git a/drivers/pci/controller/pcie-altera.c b/drivers/pci/controller/pcie-altera.c
> > > index ba025efeae28..b447c3e4abad 100644
> > > --- a/drivers/pci/controller/pcie-altera.c
> > > +++ b/drivers/pci/controller/pcie-altera.c
> > > @@ -800,7 +800,7 @@ static int altera_pcie_probe(struct platform_device *pdev)
> > >       }
> > >
> > >       ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows,
> > > -                                           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 375d815f7301..ff0a81a632a1 100644
> > > --- a/drivers/pci/controller/pcie-iproc-platform.c
> > > +++ b/drivers/pci/controller/pcie-iproc-platform.c
> > > @@ -95,7 +95,8 @@ 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, NULL);
> > > +     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;
> > > diff --git a/drivers/pci/controller/pcie-mediatek.c b/drivers/pci/controller/pcie-mediatek.c
> > > index d9206a3cd56b..cb982891b22b 100644
> > > --- a/drivers/pci/controller/pcie-mediatek.c
> > > +++ b/drivers/pci/controller/pcie-mediatek.c
> > > @@ -1034,7 +1034,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 4eab8624ce4d..257ba49c177c 100644
> > > --- a/drivers/pci/controller/pcie-mobiveil.c
> > > +++ b/drivers/pci/controller/pcie-mobiveil.c
> > > @@ -875,7 +875,8 @@ static int mobiveil_pcie_probe(struct platform_device *pdev)
> > >       }
> > >
> > >       /* parse the host bridge base addresses from the device tree file */
> > > -     ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows, NULL);
> > > +     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;
> > > 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 f375e55ea02e..ee83f8494ee9 100644
> > > --- a/drivers/pci/controller/pcie-rockchip-host.c
> > > +++ b/drivers/pci/controller/pcie-rockchip-host.c
> > > @@ -1004,7 +1004,8 @@ 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, &bus_res);
> > > +     err = pci_parse_request_of_pci_ranges(dev, &bridge->windows,
> > > +                                           &bridge->dma_ranges, &bus_res);
> > >       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 e135a4b60489..9bd1427f2fd6 100644
> > > --- a/drivers/pci/controller/pcie-xilinx-nwl.c
> > > +++ b/drivers/pci/controller/pcie-xilinx-nwl.c
> > > @@ -843,7 +843,8 @@ static int nwl_pcie_probe(struct platform_device *pdev)
> > >               return err;
> > >       }
> > >
> > > -     err = pci_parse_request_of_pci_ranges(dev, &bridge->windows, NULL);
> > > +     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;
> > > diff --git a/drivers/pci/controller/pcie-xilinx.c b/drivers/pci/controller/pcie-xilinx.c
> > > index 257702288787..98e55297815b 100644
> > > --- a/drivers/pci/controller/pcie-xilinx.c
> > > +++ b/drivers/pci/controller/pcie-xilinx.c
> > > @@ -645,7 +645,8 @@ static int xilinx_pcie_probe(struct platform_device *pdev)
> > >               return err;
> > >       }
> > >
> > > -     err = pci_parse_request_of_pci_ranges(dev, &bridge->windows, NULL);
> > > +     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;
> > > diff --git a/drivers/pci/of.c b/drivers/pci/of.c
> > > index f3da49a31db4..0b1e4623dfcf 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,10 @@ int pci_parse_request_of_pci_ranges(struct device *dev,
> > >       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,
> > > -                                                 &iobase);
> > > +                                                 ib_resources, &iobase);
> > >       if (err)
> > >               return err;
> > >
> > > diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h
> > > index 3f6947ee3324..6692c4fe4290 100644
> > > --- a/drivers/pci/pci.h
> > > +++ b/drivers/pci/pci.h
> > > @@ -633,11 +633,15 @@ static inline void pci_release_bus_of_node(struct pci_bus *bus) { }
> > >  #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 f9088c89a534..5cb94916eaa1 100644
> > > --- a/include/linux/pci.h
> > > +++ b/include/linux/pci.h
> > > @@ -2278,6 +2278,7 @@ 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) */
> > > @@ -2286,9 +2287,11 @@ 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 resource **bus_range)
> > > +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	[flat|nested] 49+ messages in thread

* Re: [PATCH v3 19/25] PCI: of: Add inbound resource parsing to helpers
  2019-10-29 11:07   ` Lorenzo Pieralisi
  2019-10-29 15:56     ` Srinath Mannam
@ 2019-10-29 22:12     ` Bjorn Helgaas
  1 sibling, 0 replies; 49+ messages in thread
From: Bjorn Helgaas @ 2019-10-29 22:12 UTC (permalink / raw)
  To: Lorenzo Pieralisi
  Cc: Rob Herring, Andrew Murray, linux-pci, linux-arm-kernel,
	bcm-kernel-feedback-list, Christoph Hellwig, Gustavo Pimentel,
	Heiko Stuebner, Hou Zhiqiang, Jingoo Han, Karthikeyan Mitran,
	Ley Foon Tan, Linus Walleij, linux-mediatek, linux-renesas-soc,
	linux-rockchip, Matthias Brugger, Michal Simek, Ray Jui, rfi,
	Ryder Lee, Scott Branden, Shawn Lin, Simon Horman,
	Srinath Mannam, Thomas Petazzoni, Toan Le, Tom Joseph,
	Will Deacon

On Tue, Oct 29, 2019 at 11:07:51AM +0000, Lorenzo Pieralisi wrote:
> On Mon, Oct 28, 2019 at 11:32:50AM -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
> > Tested-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com> # for AArdvark
> > Reviewed-by: Andrew Murray <andrew.murray@arm.com>
> > Acked-by: Gustavo Pimentel <gustavo.pimentel@synopsys.com>
> > Signed-off-by: Rob Herring <robh@kernel.org>
> > ---
> > v2:
> >  - Fix crash in INIT_LIST_HEAD when ib_resources is NULL
> > ---
> >  .../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          |  3 +-
> >  drivers/pci/controller/pci-versatile.c        |  3 +-
> >  drivers/pci/controller/pci-xgene.c            |  3 +-
> >  drivers/pci/controller/pcie-altera.c          |  2 +-
> >  drivers/pci/controller/pcie-cadence-host.c    |  2 +-
> >  drivers/pci/controller/pcie-iproc-platform.c  |  3 +-
> >  drivers/pci/controller/pcie-mediatek.c        |  2 +-
> >  drivers/pci/controller/pcie-mobiveil.c        |  3 +-
> >  drivers/pci/controller/pcie-rcar.c            |  3 +-
> >  drivers/pci/controller/pcie-rockchip-host.c   |  3 +-
> >  drivers/pci/controller/pcie-xilinx-nwl.c      |  3 +-
> >  drivers/pci/controller/pcie-xilinx.c          |  3 +-
> >  drivers/pci/of.c                              | 45 ++++++++++++++++++-
> >  drivers/pci/pci.h                             |  8 +++-
> >  include/linux/pci.h                           |  9 ++--
> >  19 files changed, 82 insertions(+), 23 deletions(-)
> 
> Hi Bjorn,
> 
> please let me know if you are OK with this patch, the series is
> ready to go upstream IMO.

Yep, looks good to me.  If you want it:

Acked-by: Bjorn Helgaas <bhelgaas@google.com>

^ permalink raw reply	[flat|nested] 49+ messages in thread

* Re: [PATCH v3 19/25] PCI: of: Add inbound resource parsing to helpers
  2019-10-29 17:34       ` Lorenzo Pieralisi
@ 2019-10-30  6:44         ` Srinath Mannam
  2019-10-30 11:48           ` Lorenzo Pieralisi
  0 siblings, 1 reply; 49+ messages in thread
From: Srinath Mannam @ 2019-10-30  6:44 UTC (permalink / raw)
  To: Lorenzo Pieralisi
  Cc: Rob Herring, Bjorn Helgaas, Andrew Murray, linux-pci, Linux ARM,
	BCM Kernel Feedback, Christoph Hellwig, Gustavo Pimentel,
	Heiko Stuebner, Hou Zhiqiang, Jingoo Han, Karthikeyan Mitran,
	Ley Foon Tan, Linus Walleij, linux-mediatek, linux-renesas-soc,
	linux-rockchip, Matthias Brugger, Michal Simek, Ray Jui, rfi,
	Ryder Lee, Scott Branden, Shawn Lin, Simon Horman,
	Thomas Petazzoni, Toan Le, Tom Joseph, Will Deacon

Hi Lorenzo,

Thanks for the details.
Based on Robin's comment in the old patch, I thought dma_ranges list
will be in sorted order.
https://lore.kernel.org/lkml/741a4210-251c-9c00-d4a7-bc7ebf8cd57b@arm.com/

Now, another patch is required to sort the list before reserving in
iova_reserve_pci_windows() function.

Regards,
Srinath.


On Tue, Oct 29, 2019 at 11:04 PM Lorenzo Pieralisi
<lorenzo.pieralisi@arm.com> wrote:
>
> On Tue, Oct 29, 2019 at 09:26:51PM +0530, Srinath Mannam wrote:
> > Hi Lorenzo,
> >
> > All changes are looks good to me.
> > I have one doubt regarding, resources added in the
> > "bridge->dma_ranges" list are expected to be in sorted order which are
> > used in "iova_reserve_pci_windows". Please correct me if I missed any
> > patch specific to this.
>
> No I don't think so, it is just that we need to decide which piece of
> code should sort that list, whether in this patchset or by patching the
> kernel in iova_reserve_pci_windows().
>
> I tend to think the sorting should be done in iova_reserve_pci_windows()
> because that's where the requirement is.
>
> Lorenzo
>
> > Regards,
> > Srinath.
> >
> > On Tue, Oct 29, 2019 at 4:37 PM Lorenzo Pieralisi
> > <lorenzo.pieralisi@arm.com> wrote:
> > >
> > > On Mon, Oct 28, 2019 at 11:32:50AM -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
> > > > Tested-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com> # for AArdvark
> > > > Reviewed-by: Andrew Murray <andrew.murray@arm.com>
> > > > Acked-by: Gustavo Pimentel <gustavo.pimentel@synopsys.com>
> > > > Signed-off-by: Rob Herring <robh@kernel.org>
> > > > ---
> > > > v2:
> > > >  - Fix crash in INIT_LIST_HEAD when ib_resources is NULL
> > > > ---
> > > >  .../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          |  3 +-
> > > >  drivers/pci/controller/pci-versatile.c        |  3 +-
> > > >  drivers/pci/controller/pci-xgene.c            |  3 +-
> > > >  drivers/pci/controller/pcie-altera.c          |  2 +-
> > > >  drivers/pci/controller/pcie-cadence-host.c    |  2 +-
> > > >  drivers/pci/controller/pcie-iproc-platform.c  |  3 +-
> > > >  drivers/pci/controller/pcie-mediatek.c        |  2 +-
> > > >  drivers/pci/controller/pcie-mobiveil.c        |  3 +-
> > > >  drivers/pci/controller/pcie-rcar.c            |  3 +-
> > > >  drivers/pci/controller/pcie-rockchip-host.c   |  3 +-
> > > >  drivers/pci/controller/pcie-xilinx-nwl.c      |  3 +-
> > > >  drivers/pci/controller/pcie-xilinx.c          |  3 +-
> > > >  drivers/pci/of.c                              | 45 ++++++++++++++++++-
> > > >  drivers/pci/pci.h                             |  8 +++-
> > > >  include/linux/pci.h                           |  9 ++--
> > > >  19 files changed, 82 insertions(+), 23 deletions(-)
> > >
> > > Hi Bjorn,
> > >
> > > please let me know if you are OK with this patch, the series is
> > > ready to go upstream IMO.
> > >
> > > Thanks,
> > > Lorenzo
> > >
> > > > diff --git a/drivers/pci/controller/dwc/pcie-designware-host.c b/drivers/pci/controller/dwc/pcie-designware-host.c
> > > > index aeec8b65eb97..f7b1d80c4a0a 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)
> > > >       if (!bridge)
> > > >               return -ENOMEM;
> > > >
> > > > -     ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows, NULL);
> > > > +     ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows,
> > > > +                                           &bridge->dma_ranges, NULL);
> > > >       if (ret)
> > > >               return ret;
> > > >
> > > > diff --git a/drivers/pci/controller/pci-aardvark.c b/drivers/pci/controller/pci-aardvark.c
> > > > index 9cbeba507f0c..b34eaa2cd762 100644
> > > > --- a/drivers/pci/controller/pci-aardvark.c
> > > > +++ b/drivers/pci/controller/pci-aardvark.c
> > > > @@ -939,7 +939,7 @@ static int advk_pcie_probe(struct platform_device *pdev)
> > > >       }
> > > >
> > > >       ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows,
> > > > -                                           &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 75603348b88a..66288b94e92d 100644
> > > > --- a/drivers/pci/controller/pci-ftpci100.c
> > > > +++ b/drivers/pci/controller/pci-ftpci100.c
> > > > @@ -477,7 +477,8 @@ 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, NULL);
> > > > +     ret = pci_parse_request_of_pci_ranges(dev, &host->windows,
> > > > +                                           &host->dma_ranges, NULL);
> > > >       if (ret)
> > > >               return ret;
> > > >
> > > > diff --git a/drivers/pci/controller/pci-host-common.c b/drivers/pci/controller/pci-host-common.c
> > > > index c8cb9c5188a4..250a3fc80ec6 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 96677520f6c1..2209c7671115 100644
> > > > --- a/drivers/pci/controller/pci-v3-semi.c
> > > > +++ b/drivers/pci/controller/pci-v3-semi.c
> > > > @@ -776,7 +776,8 @@ 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, NULL);
> > > > +     ret = pci_parse_request_of_pci_ranges(dev, &host->windows,
> > > > +                                           &host->dma_ranges, NULL);
> > > >       if (ret)
> > > >               return ret;
> > > >
> > > > diff --git a/drivers/pci/controller/pci-versatile.c b/drivers/pci/controller/pci-versatile.c
> > > > index eae1b859990b..b911359b6d81 100644
> > > > --- a/drivers/pci/controller/pci-versatile.c
> > > > +++ b/drivers/pci/controller/pci-versatile.c
> > > > @@ -92,7 +92,8 @@ 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);
> > > > +     ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows,
> > > > +                                           NULL, NULL);
> > > >       if (ret)
> > > >               return ret;
> > > >
> > > > diff --git a/drivers/pci/controller/pci-xgene.c b/drivers/pci/controller/pci-xgene.c
> > > > index 7d0f0395a479..9408269d943d 100644
> > > > --- a/drivers/pci/controller/pci-xgene.c
> > > > +++ b/drivers/pci/controller/pci-xgene.c
> > > > @@ -627,7 +627,8 @@ static int xgene_pcie_probe(struct platform_device *pdev)
> > > >       if (ret)
> > > >               return ret;
> > > >
> > > > -     ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows, NULL);
> > > > +     ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows,
> > > > +                                           &bridge->dma_ranges, NULL);
> > > >       if (ret)
> > > >               return ret;
> > > >
> > > > diff --git a/drivers/pci/controller/pcie-altera.c b/drivers/pci/controller/pcie-altera.c
> > > > index ba025efeae28..b447c3e4abad 100644
> > > > --- a/drivers/pci/controller/pcie-altera.c
> > > > +++ b/drivers/pci/controller/pcie-altera.c
> > > > @@ -800,7 +800,7 @@ static int altera_pcie_probe(struct platform_device *pdev)
> > > >       }
> > > >
> > > >       ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows,
> > > > -                                           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 375d815f7301..ff0a81a632a1 100644
> > > > --- a/drivers/pci/controller/pcie-iproc-platform.c
> > > > +++ b/drivers/pci/controller/pcie-iproc-platform.c
> > > > @@ -95,7 +95,8 @@ 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, NULL);
> > > > +     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;
> > > > diff --git a/drivers/pci/controller/pcie-mediatek.c b/drivers/pci/controller/pcie-mediatek.c
> > > > index d9206a3cd56b..cb982891b22b 100644
> > > > --- a/drivers/pci/controller/pcie-mediatek.c
> > > > +++ b/drivers/pci/controller/pcie-mediatek.c
> > > > @@ -1034,7 +1034,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 4eab8624ce4d..257ba49c177c 100644
> > > > --- a/drivers/pci/controller/pcie-mobiveil.c
> > > > +++ b/drivers/pci/controller/pcie-mobiveil.c
> > > > @@ -875,7 +875,8 @@ static int mobiveil_pcie_probe(struct platform_device *pdev)
> > > >       }
> > > >
> > > >       /* parse the host bridge base addresses from the device tree file */
> > > > -     ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows, NULL);
> > > > +     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;
> > > > 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 f375e55ea02e..ee83f8494ee9 100644
> > > > --- a/drivers/pci/controller/pcie-rockchip-host.c
> > > > +++ b/drivers/pci/controller/pcie-rockchip-host.c
> > > > @@ -1004,7 +1004,8 @@ 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, &bus_res);
> > > > +     err = pci_parse_request_of_pci_ranges(dev, &bridge->windows,
> > > > +                                           &bridge->dma_ranges, &bus_res);
> > > >       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 e135a4b60489..9bd1427f2fd6 100644
> > > > --- a/drivers/pci/controller/pcie-xilinx-nwl.c
> > > > +++ b/drivers/pci/controller/pcie-xilinx-nwl.c
> > > > @@ -843,7 +843,8 @@ static int nwl_pcie_probe(struct platform_device *pdev)
> > > >               return err;
> > > >       }
> > > >
> > > > -     err = pci_parse_request_of_pci_ranges(dev, &bridge->windows, NULL);
> > > > +     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;
> > > > diff --git a/drivers/pci/controller/pcie-xilinx.c b/drivers/pci/controller/pcie-xilinx.c
> > > > index 257702288787..98e55297815b 100644
> > > > --- a/drivers/pci/controller/pcie-xilinx.c
> > > > +++ b/drivers/pci/controller/pcie-xilinx.c
> > > > @@ -645,7 +645,8 @@ static int xilinx_pcie_probe(struct platform_device *pdev)
> > > >               return err;
> > > >       }
> > > >
> > > > -     err = pci_parse_request_of_pci_ranges(dev, &bridge->windows, NULL);
> > > > +     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;
> > > > diff --git a/drivers/pci/of.c b/drivers/pci/of.c
> > > > index f3da49a31db4..0b1e4623dfcf 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,10 @@ int pci_parse_request_of_pci_ranges(struct device *dev,
> > > >       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,
> > > > -                                                 &iobase);
> > > > +                                                 ib_resources, &iobase);
> > > >       if (err)
> > > >               return err;
> > > >
> > > > diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h
> > > > index 3f6947ee3324..6692c4fe4290 100644
> > > > --- a/drivers/pci/pci.h
> > > > +++ b/drivers/pci/pci.h
> > > > @@ -633,11 +633,15 @@ static inline void pci_release_bus_of_node(struct pci_bus *bus) { }
> > > >  #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 f9088c89a534..5cb94916eaa1 100644
> > > > --- a/include/linux/pci.h
> > > > +++ b/include/linux/pci.h
> > > > @@ -2278,6 +2278,7 @@ 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) */
> > > > @@ -2286,9 +2287,11 @@ 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 resource **bus_range)
> > > > +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	[flat|nested] 49+ messages in thread

* Re: [PATCH v3 19/25] PCI: of: Add inbound resource parsing to helpers
  2019-10-30  6:44         ` Srinath Mannam
@ 2019-10-30 11:48           ` Lorenzo Pieralisi
  2019-10-30 12:49             ` Robin Murphy
  0 siblings, 1 reply; 49+ messages in thread
From: Lorenzo Pieralisi @ 2019-10-30 11:48 UTC (permalink / raw)
  To: Srinath Mannam
  Cc: Rob Herring, Bjorn Helgaas, Andrew Murray, linux-pci, Linux ARM,
	BCM Kernel Feedback, Christoph Hellwig, Gustavo Pimentel,
	Heiko Stuebner, Hou Zhiqiang, Jingoo Han, Karthikeyan Mitran,
	Ley Foon Tan, Linus Walleij, linux-mediatek, linux-renesas-soc,
	linux-rockchip, Matthias Brugger, Michal Simek, Ray Jui, rfi,
	Ryder Lee, Scott Branden, Shawn Lin, Simon Horman,
	Thomas Petazzoni, Toan Le, Tom Joseph, Will Deacon, robin.murphy

[+Cc Robin]

On Wed, Oct 30, 2019 at 12:14:54PM +0530, Srinath Mannam wrote:
> Hi Lorenzo,
> 
> Thanks for the details.
> Based on Robin's comment in the old patch, I thought dma_ranges list
> will be in sorted order.
> https://lore.kernel.org/lkml/741a4210-251c-9c00-d4a7-bc7ebf8cd57b@arm.com/
> 
> Now, another patch is required to sort the list before reserving in
> iova_reserve_pci_windows() function.
> 
> Regards,
> Srinath.

Don't top-post please.

https://en.wikipedia.org/wiki/Posting_style#Top-posting

Yes, the dma_ranges list must be sorted somehow I reckon
iova_reserve_pci_windows() is where it should be done (since that's
where the requirement is) or it can be done in
devm_of_pci_get_host_bridge_resources().

Thoughts ?

Lorenzo

> On Tue, Oct 29, 2019 at 11:04 PM Lorenzo Pieralisi
> <lorenzo.pieralisi@arm.com> wrote:
> >
> > On Tue, Oct 29, 2019 at 09:26:51PM +0530, Srinath Mannam wrote:
> > > Hi Lorenzo,
> > >
> > > All changes are looks good to me.
> > > I have one doubt regarding, resources added in the
> > > "bridge->dma_ranges" list are expected to be in sorted order which are
> > > used in "iova_reserve_pci_windows". Please correct me if I missed any
> > > patch specific to this.
> >
> > No I don't think so, it is just that we need to decide which piece of
> > code should sort that list, whether in this patchset or by patching the
> > kernel in iova_reserve_pci_windows().
> >
> > I tend to think the sorting should be done in iova_reserve_pci_windows()
> > because that's where the requirement is.
> >
> > Lorenzo
> >
> > > Regards,
> > > Srinath.
> > >
> > > On Tue, Oct 29, 2019 at 4:37 PM Lorenzo Pieralisi
> > > <lorenzo.pieralisi@arm.com> wrote:
> > > >
> > > > On Mon, Oct 28, 2019 at 11:32:50AM -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
> > > > > Tested-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com> # for AArdvark
> > > > > Reviewed-by: Andrew Murray <andrew.murray@arm.com>
> > > > > Acked-by: Gustavo Pimentel <gustavo.pimentel@synopsys.com>
> > > > > Signed-off-by: Rob Herring <robh@kernel.org>
> > > > > ---
> > > > > v2:
> > > > >  - Fix crash in INIT_LIST_HEAD when ib_resources is NULL
> > > > > ---
> > > > >  .../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          |  3 +-
> > > > >  drivers/pci/controller/pci-versatile.c        |  3 +-
> > > > >  drivers/pci/controller/pci-xgene.c            |  3 +-
> > > > >  drivers/pci/controller/pcie-altera.c          |  2 +-
> > > > >  drivers/pci/controller/pcie-cadence-host.c    |  2 +-
> > > > >  drivers/pci/controller/pcie-iproc-platform.c  |  3 +-
> > > > >  drivers/pci/controller/pcie-mediatek.c        |  2 +-
> > > > >  drivers/pci/controller/pcie-mobiveil.c        |  3 +-
> > > > >  drivers/pci/controller/pcie-rcar.c            |  3 +-
> > > > >  drivers/pci/controller/pcie-rockchip-host.c   |  3 +-
> > > > >  drivers/pci/controller/pcie-xilinx-nwl.c      |  3 +-
> > > > >  drivers/pci/controller/pcie-xilinx.c          |  3 +-
> > > > >  drivers/pci/of.c                              | 45 ++++++++++++++++++-
> > > > >  drivers/pci/pci.h                             |  8 +++-
> > > > >  include/linux/pci.h                           |  9 ++--
> > > > >  19 files changed, 82 insertions(+), 23 deletions(-)
> > > >
> > > > Hi Bjorn,
> > > >
> > > > please let me know if you are OK with this patch, the series is
> > > > ready to go upstream IMO.
> > > >
> > > > Thanks,
> > > > Lorenzo
> > > >
> > > > > diff --git a/drivers/pci/controller/dwc/pcie-designware-host.c b/drivers/pci/controller/dwc/pcie-designware-host.c
> > > > > index aeec8b65eb97..f7b1d80c4a0a 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)
> > > > >       if (!bridge)
> > > > >               return -ENOMEM;
> > > > >
> > > > > -     ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows, NULL);
> > > > > +     ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows,
> > > > > +                                           &bridge->dma_ranges, NULL);
> > > > >       if (ret)
> > > > >               return ret;
> > > > >
> > > > > diff --git a/drivers/pci/controller/pci-aardvark.c b/drivers/pci/controller/pci-aardvark.c
> > > > > index 9cbeba507f0c..b34eaa2cd762 100644
> > > > > --- a/drivers/pci/controller/pci-aardvark.c
> > > > > +++ b/drivers/pci/controller/pci-aardvark.c
> > > > > @@ -939,7 +939,7 @@ static int advk_pcie_probe(struct platform_device *pdev)
> > > > >       }
> > > > >
> > > > >       ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows,
> > > > > -                                           &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 75603348b88a..66288b94e92d 100644
> > > > > --- a/drivers/pci/controller/pci-ftpci100.c
> > > > > +++ b/drivers/pci/controller/pci-ftpci100.c
> > > > > @@ -477,7 +477,8 @@ 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, NULL);
> > > > > +     ret = pci_parse_request_of_pci_ranges(dev, &host->windows,
> > > > > +                                           &host->dma_ranges, NULL);
> > > > >       if (ret)
> > > > >               return ret;
> > > > >
> > > > > diff --git a/drivers/pci/controller/pci-host-common.c b/drivers/pci/controller/pci-host-common.c
> > > > > index c8cb9c5188a4..250a3fc80ec6 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 96677520f6c1..2209c7671115 100644
> > > > > --- a/drivers/pci/controller/pci-v3-semi.c
> > > > > +++ b/drivers/pci/controller/pci-v3-semi.c
> > > > > @@ -776,7 +776,8 @@ 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, NULL);
> > > > > +     ret = pci_parse_request_of_pci_ranges(dev, &host->windows,
> > > > > +                                           &host->dma_ranges, NULL);
> > > > >       if (ret)
> > > > >               return ret;
> > > > >
> > > > > diff --git a/drivers/pci/controller/pci-versatile.c b/drivers/pci/controller/pci-versatile.c
> > > > > index eae1b859990b..b911359b6d81 100644
> > > > > --- a/drivers/pci/controller/pci-versatile.c
> > > > > +++ b/drivers/pci/controller/pci-versatile.c
> > > > > @@ -92,7 +92,8 @@ 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);
> > > > > +     ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows,
> > > > > +                                           NULL, NULL);
> > > > >       if (ret)
> > > > >               return ret;
> > > > >
> > > > > diff --git a/drivers/pci/controller/pci-xgene.c b/drivers/pci/controller/pci-xgene.c
> > > > > index 7d0f0395a479..9408269d943d 100644
> > > > > --- a/drivers/pci/controller/pci-xgene.c
> > > > > +++ b/drivers/pci/controller/pci-xgene.c
> > > > > @@ -627,7 +627,8 @@ static int xgene_pcie_probe(struct platform_device *pdev)
> > > > >       if (ret)
> > > > >               return ret;
> > > > >
> > > > > -     ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows, NULL);
> > > > > +     ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows,
> > > > > +                                           &bridge->dma_ranges, NULL);
> > > > >       if (ret)
> > > > >               return ret;
> > > > >
> > > > > diff --git a/drivers/pci/controller/pcie-altera.c b/drivers/pci/controller/pcie-altera.c
> > > > > index ba025efeae28..b447c3e4abad 100644
> > > > > --- a/drivers/pci/controller/pcie-altera.c
> > > > > +++ b/drivers/pci/controller/pcie-altera.c
> > > > > @@ -800,7 +800,7 @@ static int altera_pcie_probe(struct platform_device *pdev)
> > > > >       }
> > > > >
> > > > >       ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows,
> > > > > -                                           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 375d815f7301..ff0a81a632a1 100644
> > > > > --- a/drivers/pci/controller/pcie-iproc-platform.c
> > > > > +++ b/drivers/pci/controller/pcie-iproc-platform.c
> > > > > @@ -95,7 +95,8 @@ 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, NULL);
> > > > > +     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;
> > > > > diff --git a/drivers/pci/controller/pcie-mediatek.c b/drivers/pci/controller/pcie-mediatek.c
> > > > > index d9206a3cd56b..cb982891b22b 100644
> > > > > --- a/drivers/pci/controller/pcie-mediatek.c
> > > > > +++ b/drivers/pci/controller/pcie-mediatek.c
> > > > > @@ -1034,7 +1034,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 4eab8624ce4d..257ba49c177c 100644
> > > > > --- a/drivers/pci/controller/pcie-mobiveil.c
> > > > > +++ b/drivers/pci/controller/pcie-mobiveil.c
> > > > > @@ -875,7 +875,8 @@ static int mobiveil_pcie_probe(struct platform_device *pdev)
> > > > >       }
> > > > >
> > > > >       /* parse the host bridge base addresses from the device tree file */
> > > > > -     ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows, NULL);
> > > > > +     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;
> > > > > 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 f375e55ea02e..ee83f8494ee9 100644
> > > > > --- a/drivers/pci/controller/pcie-rockchip-host.c
> > > > > +++ b/drivers/pci/controller/pcie-rockchip-host.c
> > > > > @@ -1004,7 +1004,8 @@ 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, &bus_res);
> > > > > +     err = pci_parse_request_of_pci_ranges(dev, &bridge->windows,
> > > > > +                                           &bridge->dma_ranges, &bus_res);
> > > > >       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 e135a4b60489..9bd1427f2fd6 100644
> > > > > --- a/drivers/pci/controller/pcie-xilinx-nwl.c
> > > > > +++ b/drivers/pci/controller/pcie-xilinx-nwl.c
> > > > > @@ -843,7 +843,8 @@ static int nwl_pcie_probe(struct platform_device *pdev)
> > > > >               return err;
> > > > >       }
> > > > >
> > > > > -     err = pci_parse_request_of_pci_ranges(dev, &bridge->windows, NULL);
> > > > > +     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;
> > > > > diff --git a/drivers/pci/controller/pcie-xilinx.c b/drivers/pci/controller/pcie-xilinx.c
> > > > > index 257702288787..98e55297815b 100644
> > > > > --- a/drivers/pci/controller/pcie-xilinx.c
> > > > > +++ b/drivers/pci/controller/pcie-xilinx.c
> > > > > @@ -645,7 +645,8 @@ static int xilinx_pcie_probe(struct platform_device *pdev)
> > > > >               return err;
> > > > >       }
> > > > >
> > > > > -     err = pci_parse_request_of_pci_ranges(dev, &bridge->windows, NULL);
> > > > > +     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;
> > > > > diff --git a/drivers/pci/of.c b/drivers/pci/of.c
> > > > > index f3da49a31db4..0b1e4623dfcf 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,10 @@ int pci_parse_request_of_pci_ranges(struct device *dev,
> > > > >       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,
> > > > > -                                                 &iobase);
> > > > > +                                                 ib_resources, &iobase);
> > > > >       if (err)
> > > > >               return err;
> > > > >
> > > > > diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h
> > > > > index 3f6947ee3324..6692c4fe4290 100644
> > > > > --- a/drivers/pci/pci.h
> > > > > +++ b/drivers/pci/pci.h
> > > > > @@ -633,11 +633,15 @@ static inline void pci_release_bus_of_node(struct pci_bus *bus) { }
> > > > >  #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 f9088c89a534..5cb94916eaa1 100644
> > > > > --- a/include/linux/pci.h
> > > > > +++ b/include/linux/pci.h
> > > > > @@ -2278,6 +2278,7 @@ 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) */
> > > > > @@ -2286,9 +2287,11 @@ 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 resource **bus_range)
> > > > > +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	[flat|nested] 49+ messages in thread

* Re: [PATCH v3 19/25] PCI: of: Add inbound resource parsing to helpers
  2019-10-30 11:48           ` Lorenzo Pieralisi
@ 2019-10-30 12:49             ` Robin Murphy
  2019-10-30 14:56               ` Lorenzo Pieralisi
  0 siblings, 1 reply; 49+ messages in thread
From: Robin Murphy @ 2019-10-30 12:49 UTC (permalink / raw)
  To: Lorenzo Pieralisi, Srinath Mannam
  Cc: Rob Herring, Bjorn Helgaas, Andrew Murray, linux-pci, Linux ARM,
	BCM Kernel Feedback, Christoph Hellwig, Gustavo Pimentel,
	Heiko Stuebner, Hou Zhiqiang, Jingoo Han, Karthikeyan Mitran,
	Ley Foon Tan, Linus Walleij, linux-mediatek, linux-renesas-soc,
	linux-rockchip, Matthias Brugger, Michal Simek, Ray Jui, rfi,
	Ryder Lee, Scott Branden, Shawn Lin, Simon Horman,
	Thomas Petazzoni, Toan Le, Tom Joseph, Will Deacon

On 30/10/2019 11:48, Lorenzo Pieralisi wrote:
> [+Cc Robin]
> 
> On Wed, Oct 30, 2019 at 12:14:54PM +0530, Srinath Mannam wrote:
>> Hi Lorenzo,
>>
>> Thanks for the details.
>> Based on Robin's comment in the old patch, I thought dma_ranges list
>> will be in sorted order.
>> https://lore.kernel.org/lkml/741a4210-251c-9c00-d4a7-bc7ebf8cd57b@arm.com/
>>
>> Now, another patch is required to sort the list before reserving in
>> iova_reserve_pci_windows() function.
>>
>> Regards,
>> Srinath.
> 
> Don't top-post please.
> 
> https://en.wikipedia.org/wiki/Posting_style#Top-posting
> 
> Yes, the dma_ranges list must be sorted somehow I reckon
> iova_reserve_pci_windows() is where it should be done (since that's
> where the requirement is) or it can be done in
> devm_of_pci_get_host_bridge_resources().
> 
> Thoughts ?

Right, strictly it's only iova_reserve_pci_windows() that needs the list 
sorted, it just worked out that maintaining the list in sorted order by 
construction took a fair bit less code than explicitly sorting it. In 
terms of preserving that behaviour in a slightly more generalised 
fashion I suppose we could add something like:

void pci_add_resource_offset_sorted(struct list_head *resources,
				struct resource *res,
				resource_size_t offset)
{
	struct resource_entry *entry;

	resource_list_for_each_entry(entry, resources)
		if (entry->res.start > res.start)
			break;
	
	pci_add_resource_offset(&entry->node, res, offset);
}

but if you'd rather add a specific resource_list_sort() or even just 
open-code it in iommu-dma, I don't have any real preference. The "least 
code necessary" approach definitely made sense when individual drivers 
were expected to build their own lists, but once it gets generalised 
then having a sensible and robust API becomes a more important 
consideration.

Robin.

> 
> Lorenzo
> 
>> On Tue, Oct 29, 2019 at 11:04 PM Lorenzo Pieralisi
>> <lorenzo.pieralisi@arm.com> wrote:
>>>
>>> On Tue, Oct 29, 2019 at 09:26:51PM +0530, Srinath Mannam wrote:
>>>> Hi Lorenzo,
>>>>
>>>> All changes are looks good to me.
>>>> I have one doubt regarding, resources added in the
>>>> "bridge->dma_ranges" list are expected to be in sorted order which are
>>>> used in "iova_reserve_pci_windows". Please correct me if I missed any
>>>> patch specific to this.
>>>
>>> No I don't think so, it is just that we need to decide which piece of
>>> code should sort that list, whether in this patchset or by patching the
>>> kernel in iova_reserve_pci_windows().
>>>
>>> I tend to think the sorting should be done in iova_reserve_pci_windows()
>>> because that's where the requirement is.
>>>
>>> Lorenzo
>>>
>>>> Regards,
>>>> Srinath.
>>>>
>>>> On Tue, Oct 29, 2019 at 4:37 PM Lorenzo Pieralisi
>>>> <lorenzo.pieralisi@arm.com> wrote:
>>>>>
>>>>> On Mon, Oct 28, 2019 at 11:32:50AM -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
>>>>>> Tested-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com> # for AArdvark
>>>>>> Reviewed-by: Andrew Murray <andrew.murray@arm.com>
>>>>>> Acked-by: Gustavo Pimentel <gustavo.pimentel@synopsys.com>
>>>>>> Signed-off-by: Rob Herring <robh@kernel.org>
>>>>>> ---
>>>>>> v2:
>>>>>>   - Fix crash in INIT_LIST_HEAD when ib_resources is NULL
>>>>>> ---
>>>>>>   .../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          |  3 +-
>>>>>>   drivers/pci/controller/pci-versatile.c        |  3 +-
>>>>>>   drivers/pci/controller/pci-xgene.c            |  3 +-
>>>>>>   drivers/pci/controller/pcie-altera.c          |  2 +-
>>>>>>   drivers/pci/controller/pcie-cadence-host.c    |  2 +-
>>>>>>   drivers/pci/controller/pcie-iproc-platform.c  |  3 +-
>>>>>>   drivers/pci/controller/pcie-mediatek.c        |  2 +-
>>>>>>   drivers/pci/controller/pcie-mobiveil.c        |  3 +-
>>>>>>   drivers/pci/controller/pcie-rcar.c            |  3 +-
>>>>>>   drivers/pci/controller/pcie-rockchip-host.c   |  3 +-
>>>>>>   drivers/pci/controller/pcie-xilinx-nwl.c      |  3 +-
>>>>>>   drivers/pci/controller/pcie-xilinx.c          |  3 +-
>>>>>>   drivers/pci/of.c                              | 45 ++++++++++++++++++-
>>>>>>   drivers/pci/pci.h                             |  8 +++-
>>>>>>   include/linux/pci.h                           |  9 ++--
>>>>>>   19 files changed, 82 insertions(+), 23 deletions(-)
>>>>>
>>>>> Hi Bjorn,
>>>>>
>>>>> please let me know if you are OK with this patch, the series is
>>>>> ready to go upstream IMO.
>>>>>
>>>>> Thanks,
>>>>> Lorenzo
>>>>>
>>>>>> diff --git a/drivers/pci/controller/dwc/pcie-designware-host.c b/drivers/pci/controller/dwc/pcie-designware-host.c
>>>>>> index aeec8b65eb97..f7b1d80c4a0a 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)
>>>>>>        if (!bridge)
>>>>>>                return -ENOMEM;
>>>>>>
>>>>>> -     ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows, NULL);
>>>>>> +     ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows,
>>>>>> +                                           &bridge->dma_ranges, NULL);
>>>>>>        if (ret)
>>>>>>                return ret;
>>>>>>
>>>>>> diff --git a/drivers/pci/controller/pci-aardvark.c b/drivers/pci/controller/pci-aardvark.c
>>>>>> index 9cbeba507f0c..b34eaa2cd762 100644
>>>>>> --- a/drivers/pci/controller/pci-aardvark.c
>>>>>> +++ b/drivers/pci/controller/pci-aardvark.c
>>>>>> @@ -939,7 +939,7 @@ static int advk_pcie_probe(struct platform_device *pdev)
>>>>>>        }
>>>>>>
>>>>>>        ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows,
>>>>>> -                                           &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 75603348b88a..66288b94e92d 100644
>>>>>> --- a/drivers/pci/controller/pci-ftpci100.c
>>>>>> +++ b/drivers/pci/controller/pci-ftpci100.c
>>>>>> @@ -477,7 +477,8 @@ 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, NULL);
>>>>>> +     ret = pci_parse_request_of_pci_ranges(dev, &host->windows,
>>>>>> +                                           &host->dma_ranges, NULL);
>>>>>>        if (ret)
>>>>>>                return ret;
>>>>>>
>>>>>> diff --git a/drivers/pci/controller/pci-host-common.c b/drivers/pci/controller/pci-host-common.c
>>>>>> index c8cb9c5188a4..250a3fc80ec6 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 96677520f6c1..2209c7671115 100644
>>>>>> --- a/drivers/pci/controller/pci-v3-semi.c
>>>>>> +++ b/drivers/pci/controller/pci-v3-semi.c
>>>>>> @@ -776,7 +776,8 @@ 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, NULL);
>>>>>> +     ret = pci_parse_request_of_pci_ranges(dev, &host->windows,
>>>>>> +                                           &host->dma_ranges, NULL);
>>>>>>        if (ret)
>>>>>>                return ret;
>>>>>>
>>>>>> diff --git a/drivers/pci/controller/pci-versatile.c b/drivers/pci/controller/pci-versatile.c
>>>>>> index eae1b859990b..b911359b6d81 100644
>>>>>> --- a/drivers/pci/controller/pci-versatile.c
>>>>>> +++ b/drivers/pci/controller/pci-versatile.c
>>>>>> @@ -92,7 +92,8 @@ 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);
>>>>>> +     ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows,
>>>>>> +                                           NULL, NULL);
>>>>>>        if (ret)
>>>>>>                return ret;
>>>>>>
>>>>>> diff --git a/drivers/pci/controller/pci-xgene.c b/drivers/pci/controller/pci-xgene.c
>>>>>> index 7d0f0395a479..9408269d943d 100644
>>>>>> --- a/drivers/pci/controller/pci-xgene.c
>>>>>> +++ b/drivers/pci/controller/pci-xgene.c
>>>>>> @@ -627,7 +627,8 @@ static int xgene_pcie_probe(struct platform_device *pdev)
>>>>>>        if (ret)
>>>>>>                return ret;
>>>>>>
>>>>>> -     ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows, NULL);
>>>>>> +     ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows,
>>>>>> +                                           &bridge->dma_ranges, NULL);
>>>>>>        if (ret)
>>>>>>                return ret;
>>>>>>
>>>>>> diff --git a/drivers/pci/controller/pcie-altera.c b/drivers/pci/controller/pcie-altera.c
>>>>>> index ba025efeae28..b447c3e4abad 100644
>>>>>> --- a/drivers/pci/controller/pcie-altera.c
>>>>>> +++ b/drivers/pci/controller/pcie-altera.c
>>>>>> @@ -800,7 +800,7 @@ static int altera_pcie_probe(struct platform_device *pdev)
>>>>>>        }
>>>>>>
>>>>>>        ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows,
>>>>>> -                                           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 375d815f7301..ff0a81a632a1 100644
>>>>>> --- a/drivers/pci/controller/pcie-iproc-platform.c
>>>>>> +++ b/drivers/pci/controller/pcie-iproc-platform.c
>>>>>> @@ -95,7 +95,8 @@ 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, NULL);
>>>>>> +     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;
>>>>>> diff --git a/drivers/pci/controller/pcie-mediatek.c b/drivers/pci/controller/pcie-mediatek.c
>>>>>> index d9206a3cd56b..cb982891b22b 100644
>>>>>> --- a/drivers/pci/controller/pcie-mediatek.c
>>>>>> +++ b/drivers/pci/controller/pcie-mediatek.c
>>>>>> @@ -1034,7 +1034,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 4eab8624ce4d..257ba49c177c 100644
>>>>>> --- a/drivers/pci/controller/pcie-mobiveil.c
>>>>>> +++ b/drivers/pci/controller/pcie-mobiveil.c
>>>>>> @@ -875,7 +875,8 @@ static int mobiveil_pcie_probe(struct platform_device *pdev)
>>>>>>        }
>>>>>>
>>>>>>        /* parse the host bridge base addresses from the device tree file */
>>>>>> -     ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows, NULL);
>>>>>> +     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;
>>>>>> 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 f375e55ea02e..ee83f8494ee9 100644
>>>>>> --- a/drivers/pci/controller/pcie-rockchip-host.c
>>>>>> +++ b/drivers/pci/controller/pcie-rockchip-host.c
>>>>>> @@ -1004,7 +1004,8 @@ 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, &bus_res);
>>>>>> +     err = pci_parse_request_of_pci_ranges(dev, &bridge->windows,
>>>>>> +                                           &bridge->dma_ranges, &bus_res);
>>>>>>        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 e135a4b60489..9bd1427f2fd6 100644
>>>>>> --- a/drivers/pci/controller/pcie-xilinx-nwl.c
>>>>>> +++ b/drivers/pci/controller/pcie-xilinx-nwl.c
>>>>>> @@ -843,7 +843,8 @@ static int nwl_pcie_probe(struct platform_device *pdev)
>>>>>>                return err;
>>>>>>        }
>>>>>>
>>>>>> -     err = pci_parse_request_of_pci_ranges(dev, &bridge->windows, NULL);
>>>>>> +     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;
>>>>>> diff --git a/drivers/pci/controller/pcie-xilinx.c b/drivers/pci/controller/pcie-xilinx.c
>>>>>> index 257702288787..98e55297815b 100644
>>>>>> --- a/drivers/pci/controller/pcie-xilinx.c
>>>>>> +++ b/drivers/pci/controller/pcie-xilinx.c
>>>>>> @@ -645,7 +645,8 @@ static int xilinx_pcie_probe(struct platform_device *pdev)
>>>>>>                return err;
>>>>>>        }
>>>>>>
>>>>>> -     err = pci_parse_request_of_pci_ranges(dev, &bridge->windows, NULL);
>>>>>> +     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;
>>>>>> diff --git a/drivers/pci/of.c b/drivers/pci/of.c
>>>>>> index f3da49a31db4..0b1e4623dfcf 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,10 @@ int pci_parse_request_of_pci_ranges(struct device *dev,
>>>>>>        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,
>>>>>> -                                                 &iobase);
>>>>>> +                                                 ib_resources, &iobase);
>>>>>>        if (err)
>>>>>>                return err;
>>>>>>
>>>>>> diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h
>>>>>> index 3f6947ee3324..6692c4fe4290 100644
>>>>>> --- a/drivers/pci/pci.h
>>>>>> +++ b/drivers/pci/pci.h
>>>>>> @@ -633,11 +633,15 @@ static inline void pci_release_bus_of_node(struct pci_bus *bus) { }
>>>>>>   #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 f9088c89a534..5cb94916eaa1 100644
>>>>>> --- a/include/linux/pci.h
>>>>>> +++ b/include/linux/pci.h
>>>>>> @@ -2278,6 +2278,7 @@ 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) */
>>>>>> @@ -2286,9 +2287,11 @@ 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 resource **bus_range)
>>>>>> +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	[flat|nested] 49+ messages in thread

* Re: [PATCH v3 19/25] PCI: of: Add inbound resource parsing to helpers
  2019-10-30 12:49             ` Robin Murphy
@ 2019-10-30 14:56               ` Lorenzo Pieralisi
  2019-10-30 22:18                 ` Rob Herring
  0 siblings, 1 reply; 49+ messages in thread
From: Lorenzo Pieralisi @ 2019-10-30 14:56 UTC (permalink / raw)
  To: Robin Murphy, Rob Herring
  Cc: Srinath Mannam, Bjorn Helgaas, Andrew Murray, linux-pci,
	Linux ARM, BCM Kernel Feedback, Christoph Hellwig,
	Gustavo Pimentel, Heiko Stuebner, Hou Zhiqiang, Jingoo Han,
	Karthikeyan Mitran, Ley Foon Tan, Linus Walleij, linux-mediatek,
	linux-renesas-soc, linux-rockchip, Matthias Brugger,
	Michal Simek, Ray Jui, rfi, Ryder Lee, Scott Branden, Shawn Lin,
	Simon Horman, Thomas Petazzoni, Toan Le, Tom Joseph, Will Deacon

On Wed, Oct 30, 2019 at 12:49:59PM +0000, Robin Murphy wrote:
> On 30/10/2019 11:48, Lorenzo Pieralisi wrote:
> > [+Cc Robin]
> > 
> > On Wed, Oct 30, 2019 at 12:14:54PM +0530, Srinath Mannam wrote:
> > > Hi Lorenzo,
> > > 
> > > Thanks for the details.
> > > Based on Robin's comment in the old patch, I thought dma_ranges list
> > > will be in sorted order.
> > > https://lore.kernel.org/lkml/741a4210-251c-9c00-d4a7-bc7ebf8cd57b@arm.com/
> > > 
> > > Now, another patch is required to sort the list before reserving in
> > > iova_reserve_pci_windows() function.
> > > 
> > > Regards,
> > > Srinath.
> > 
> > Don't top-post please.
> > 
> > https://en.wikipedia.org/wiki/Posting_style#Top-posting
> > 
> > Yes, the dma_ranges list must be sorted somehow I reckon
> > iova_reserve_pci_windows() is where it should be done (since that's
> > where the requirement is) or it can be done in
> > devm_of_pci_get_host_bridge_resources().
> > 
> > Thoughts ?
> 
> Right, strictly it's only iova_reserve_pci_windows() that needs the list
> sorted, it just worked out that maintaining the list in sorted order by
> construction took a fair bit less code than explicitly sorting it. In terms
> of preserving that behaviour in a slightly more generalised fashion I
> suppose we could add something like:
> 
> void pci_add_resource_offset_sorted(struct list_head *resources,
> 				struct resource *res,
> 				resource_size_t offset)
> {
> 	struct resource_entry *entry;
> 
> 	resource_list_for_each_entry(entry, resources)
> 		if (entry->res.start > res.start)
> 			break;
> 	
> 	pci_add_resource_offset(&entry->node, res, offset);
> }
> 
> but if you'd rather add a specific resource_list_sort() or even just
> open-code it in iommu-dma, I don't have any real preference. The "least code
> necessary" approach definitely made sense when individual drivers were
> expected to build their own lists, but once it gets generalised then having
> a sensible and robust API becomes a more important consideration.

I think that open coding it in iommu-dma is fine, @RobH would you be
able to add this to the series please ? I think it should be added to
prevent any regressions, we can't rely on dma-ranges entries order in DT
files.

Thanks !
Lorenzo


> Robin.
> 
> > 
> > Lorenzo
> > 
> > > On Tue, Oct 29, 2019 at 11:04 PM Lorenzo Pieralisi
> > > <lorenzo.pieralisi@arm.com> wrote:
> > > > 
> > > > On Tue, Oct 29, 2019 at 09:26:51PM +0530, Srinath Mannam wrote:
> > > > > Hi Lorenzo,
> > > > > 
> > > > > All changes are looks good to me.
> > > > > I have one doubt regarding, resources added in the
> > > > > "bridge->dma_ranges" list are expected to be in sorted order which are
> > > > > used in "iova_reserve_pci_windows". Please correct me if I missed any
> > > > > patch specific to this.
> > > > 
> > > > No I don't think so, it is just that we need to decide which piece of
> > > > code should sort that list, whether in this patchset or by patching the
> > > > kernel in iova_reserve_pci_windows().
> > > > 
> > > > I tend to think the sorting should be done in iova_reserve_pci_windows()
> > > > because that's where the requirement is.
> > > > 
> > > > Lorenzo
> > > > 
> > > > > Regards,
> > > > > Srinath.
> > > > > 
> > > > > On Tue, Oct 29, 2019 at 4:37 PM Lorenzo Pieralisi
> > > > > <lorenzo.pieralisi@arm.com> wrote:
> > > > > > 
> > > > > > On Mon, Oct 28, 2019 at 11:32:50AM -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
> > > > > > > Tested-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com> # for AArdvark
> > > > > > > Reviewed-by: Andrew Murray <andrew.murray@arm.com>
> > > > > > > Acked-by: Gustavo Pimentel <gustavo.pimentel@synopsys.com>
> > > > > > > Signed-off-by: Rob Herring <robh@kernel.org>
> > > > > > > ---
> > > > > > > v2:
> > > > > > >   - Fix crash in INIT_LIST_HEAD when ib_resources is NULL
> > > > > > > ---
> > > > > > >   .../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          |  3 +-
> > > > > > >   drivers/pci/controller/pci-versatile.c        |  3 +-
> > > > > > >   drivers/pci/controller/pci-xgene.c            |  3 +-
> > > > > > >   drivers/pci/controller/pcie-altera.c          |  2 +-
> > > > > > >   drivers/pci/controller/pcie-cadence-host.c    |  2 +-
> > > > > > >   drivers/pci/controller/pcie-iproc-platform.c  |  3 +-
> > > > > > >   drivers/pci/controller/pcie-mediatek.c        |  2 +-
> > > > > > >   drivers/pci/controller/pcie-mobiveil.c        |  3 +-
> > > > > > >   drivers/pci/controller/pcie-rcar.c            |  3 +-
> > > > > > >   drivers/pci/controller/pcie-rockchip-host.c   |  3 +-
> > > > > > >   drivers/pci/controller/pcie-xilinx-nwl.c      |  3 +-
> > > > > > >   drivers/pci/controller/pcie-xilinx.c          |  3 +-
> > > > > > >   drivers/pci/of.c                              | 45 ++++++++++++++++++-
> > > > > > >   drivers/pci/pci.h                             |  8 +++-
> > > > > > >   include/linux/pci.h                           |  9 ++--
> > > > > > >   19 files changed, 82 insertions(+), 23 deletions(-)
> > > > > > 
> > > > > > Hi Bjorn,
> > > > > > 
> > > > > > please let me know if you are OK with this patch, the series is
> > > > > > ready to go upstream IMO.
> > > > > > 
> > > > > > Thanks,
> > > > > > Lorenzo
> > > > > > 
> > > > > > > diff --git a/drivers/pci/controller/dwc/pcie-designware-host.c b/drivers/pci/controller/dwc/pcie-designware-host.c
> > > > > > > index aeec8b65eb97..f7b1d80c4a0a 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)
> > > > > > >        if (!bridge)
> > > > > > >                return -ENOMEM;
> > > > > > > 
> > > > > > > -     ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows, NULL);
> > > > > > > +     ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows,
> > > > > > > +                                           &bridge->dma_ranges, NULL);
> > > > > > >        if (ret)
> > > > > > >                return ret;
> > > > > > > 
> > > > > > > diff --git a/drivers/pci/controller/pci-aardvark.c b/drivers/pci/controller/pci-aardvark.c
> > > > > > > index 9cbeba507f0c..b34eaa2cd762 100644
> > > > > > > --- a/drivers/pci/controller/pci-aardvark.c
> > > > > > > +++ b/drivers/pci/controller/pci-aardvark.c
> > > > > > > @@ -939,7 +939,7 @@ static int advk_pcie_probe(struct platform_device *pdev)
> > > > > > >        }
> > > > > > > 
> > > > > > >        ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows,
> > > > > > > -                                           &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 75603348b88a..66288b94e92d 100644
> > > > > > > --- a/drivers/pci/controller/pci-ftpci100.c
> > > > > > > +++ b/drivers/pci/controller/pci-ftpci100.c
> > > > > > > @@ -477,7 +477,8 @@ 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, NULL);
> > > > > > > +     ret = pci_parse_request_of_pci_ranges(dev, &host->windows,
> > > > > > > +                                           &host->dma_ranges, NULL);
> > > > > > >        if (ret)
> > > > > > >                return ret;
> > > > > > > 
> > > > > > > diff --git a/drivers/pci/controller/pci-host-common.c b/drivers/pci/controller/pci-host-common.c
> > > > > > > index c8cb9c5188a4..250a3fc80ec6 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 96677520f6c1..2209c7671115 100644
> > > > > > > --- a/drivers/pci/controller/pci-v3-semi.c
> > > > > > > +++ b/drivers/pci/controller/pci-v3-semi.c
> > > > > > > @@ -776,7 +776,8 @@ 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, NULL);
> > > > > > > +     ret = pci_parse_request_of_pci_ranges(dev, &host->windows,
> > > > > > > +                                           &host->dma_ranges, NULL);
> > > > > > >        if (ret)
> > > > > > >                return ret;
> > > > > > > 
> > > > > > > diff --git a/drivers/pci/controller/pci-versatile.c b/drivers/pci/controller/pci-versatile.c
> > > > > > > index eae1b859990b..b911359b6d81 100644
> > > > > > > --- a/drivers/pci/controller/pci-versatile.c
> > > > > > > +++ b/drivers/pci/controller/pci-versatile.c
> > > > > > > @@ -92,7 +92,8 @@ 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);
> > > > > > > +     ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows,
> > > > > > > +                                           NULL, NULL);
> > > > > > >        if (ret)
> > > > > > >                return ret;
> > > > > > > 
> > > > > > > diff --git a/drivers/pci/controller/pci-xgene.c b/drivers/pci/controller/pci-xgene.c
> > > > > > > index 7d0f0395a479..9408269d943d 100644
> > > > > > > --- a/drivers/pci/controller/pci-xgene.c
> > > > > > > +++ b/drivers/pci/controller/pci-xgene.c
> > > > > > > @@ -627,7 +627,8 @@ static int xgene_pcie_probe(struct platform_device *pdev)
> > > > > > >        if (ret)
> > > > > > >                return ret;
> > > > > > > 
> > > > > > > -     ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows, NULL);
> > > > > > > +     ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows,
> > > > > > > +                                           &bridge->dma_ranges, NULL);
> > > > > > >        if (ret)
> > > > > > >                return ret;
> > > > > > > 
> > > > > > > diff --git a/drivers/pci/controller/pcie-altera.c b/drivers/pci/controller/pcie-altera.c
> > > > > > > index ba025efeae28..b447c3e4abad 100644
> > > > > > > --- a/drivers/pci/controller/pcie-altera.c
> > > > > > > +++ b/drivers/pci/controller/pcie-altera.c
> > > > > > > @@ -800,7 +800,7 @@ static int altera_pcie_probe(struct platform_device *pdev)
> > > > > > >        }
> > > > > > > 
> > > > > > >        ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows,
> > > > > > > -                                           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 375d815f7301..ff0a81a632a1 100644
> > > > > > > --- a/drivers/pci/controller/pcie-iproc-platform.c
> > > > > > > +++ b/drivers/pci/controller/pcie-iproc-platform.c
> > > > > > > @@ -95,7 +95,8 @@ 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, NULL);
> > > > > > > +     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;
> > > > > > > diff --git a/drivers/pci/controller/pcie-mediatek.c b/drivers/pci/controller/pcie-mediatek.c
> > > > > > > index d9206a3cd56b..cb982891b22b 100644
> > > > > > > --- a/drivers/pci/controller/pcie-mediatek.c
> > > > > > > +++ b/drivers/pci/controller/pcie-mediatek.c
> > > > > > > @@ -1034,7 +1034,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 4eab8624ce4d..257ba49c177c 100644
> > > > > > > --- a/drivers/pci/controller/pcie-mobiveil.c
> > > > > > > +++ b/drivers/pci/controller/pcie-mobiveil.c
> > > > > > > @@ -875,7 +875,8 @@ static int mobiveil_pcie_probe(struct platform_device *pdev)
> > > > > > >        }
> > > > > > > 
> > > > > > >        /* parse the host bridge base addresses from the device tree file */
> > > > > > > -     ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows, NULL);
> > > > > > > +     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;
> > > > > > > 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 f375e55ea02e..ee83f8494ee9 100644
> > > > > > > --- a/drivers/pci/controller/pcie-rockchip-host.c
> > > > > > > +++ b/drivers/pci/controller/pcie-rockchip-host.c
> > > > > > > @@ -1004,7 +1004,8 @@ 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, &bus_res);
> > > > > > > +     err = pci_parse_request_of_pci_ranges(dev, &bridge->windows,
> > > > > > > +                                           &bridge->dma_ranges, &bus_res);
> > > > > > >        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 e135a4b60489..9bd1427f2fd6 100644
> > > > > > > --- a/drivers/pci/controller/pcie-xilinx-nwl.c
> > > > > > > +++ b/drivers/pci/controller/pcie-xilinx-nwl.c
> > > > > > > @@ -843,7 +843,8 @@ static int nwl_pcie_probe(struct platform_device *pdev)
> > > > > > >                return err;
> > > > > > >        }
> > > > > > > 
> > > > > > > -     err = pci_parse_request_of_pci_ranges(dev, &bridge->windows, NULL);
> > > > > > > +     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;
> > > > > > > diff --git a/drivers/pci/controller/pcie-xilinx.c b/drivers/pci/controller/pcie-xilinx.c
> > > > > > > index 257702288787..98e55297815b 100644
> > > > > > > --- a/drivers/pci/controller/pcie-xilinx.c
> > > > > > > +++ b/drivers/pci/controller/pcie-xilinx.c
> > > > > > > @@ -645,7 +645,8 @@ static int xilinx_pcie_probe(struct platform_device *pdev)
> > > > > > >                return err;
> > > > > > >        }
> > > > > > > 
> > > > > > > -     err = pci_parse_request_of_pci_ranges(dev, &bridge->windows, NULL);
> > > > > > > +     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;
> > > > > > > diff --git a/drivers/pci/of.c b/drivers/pci/of.c
> > > > > > > index f3da49a31db4..0b1e4623dfcf 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,10 @@ int pci_parse_request_of_pci_ranges(struct device *dev,
> > > > > > >        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,
> > > > > > > -                                                 &iobase);
> > > > > > > +                                                 ib_resources, &iobase);
> > > > > > >        if (err)
> > > > > > >                return err;
> > > > > > > 
> > > > > > > diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h
> > > > > > > index 3f6947ee3324..6692c4fe4290 100644
> > > > > > > --- a/drivers/pci/pci.h
> > > > > > > +++ b/drivers/pci/pci.h
> > > > > > > @@ -633,11 +633,15 @@ static inline void pci_release_bus_of_node(struct pci_bus *bus) { }
> > > > > > >   #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 f9088c89a534..5cb94916eaa1 100644
> > > > > > > --- a/include/linux/pci.h
> > > > > > > +++ b/include/linux/pci.h
> > > > > > > @@ -2278,6 +2278,7 @@ 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) */
> > > > > > > @@ -2286,9 +2287,11 @@ 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 resource **bus_range)
> > > > > > > +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	[flat|nested] 49+ messages in thread

* Re: [PATCH v3 19/25] PCI: of: Add inbound resource parsing to helpers
  2019-10-30 14:56               ` Lorenzo Pieralisi
@ 2019-10-30 22:18                 ` Rob Herring
  2019-10-31 10:09                   ` Lorenzo Pieralisi
  0 siblings, 1 reply; 49+ messages in thread
From: Rob Herring @ 2019-10-30 22:18 UTC (permalink / raw)
  To: Lorenzo Pieralisi
  Cc: Robin Murphy, Srinath Mannam, Bjorn Helgaas, Andrew Murray, PCI,
	Linux ARM, BCM Kernel Feedback, Christoph Hellwig,
	Gustavo Pimentel, Heiko Stuebner, Hou Zhiqiang, Jingoo Han,
	Karthikeyan Mitran, Ley Foon Tan, Linus Walleij,
	moderated list:ARM/Mediatek SoC support,
	open list:MEDIA DRIVERS FOR RENESAS - FCP,
	open list:ARM/Rockchip SoC...,
	Matthias Brugger, Michal Simek, Ray Jui, rfi, Ryder Lee,
	Scott Branden, Shawn Lin, Simon Horman, Thomas Petazzoni,
	Toan Le, Tom Joseph, Will Deacon

On Wed, Oct 30, 2019 at 9:56 AM Lorenzo Pieralisi
<lorenzo.pieralisi@arm.com> wrote:
>
> On Wed, Oct 30, 2019 at 12:49:59PM +0000, Robin Murphy wrote:
> > On 30/10/2019 11:48, Lorenzo Pieralisi wrote:
> > > [+Cc Robin]
> > >
> > > On Wed, Oct 30, 2019 at 12:14:54PM +0530, Srinath Mannam wrote:
> > > > Hi Lorenzo,
> > > >
> > > > Thanks for the details.
> > > > Based on Robin's comment in the old patch, I thought dma_ranges list
> > > > will be in sorted order.
> > > > https://lore.kernel.org/lkml/741a4210-251c-9c00-d4a7-bc7ebf8cd57b@arm.com/
> > > >
> > > > Now, another patch is required to sort the list before reserving in
> > > > iova_reserve_pci_windows() function.
> > > >
> > > > Regards,
> > > > Srinath.
> > >
> > > Don't top-post please.
> > >
> > > https://en.wikipedia.org/wiki/Posting_style#Top-posting
> > >
> > > Yes, the dma_ranges list must be sorted somehow I reckon
> > > iova_reserve_pci_windows() is where it should be done (since that's
> > > where the requirement is) or it can be done in
> > > devm_of_pci_get_host_bridge_resources().
> > >
> > > Thoughts ?
> >
> > Right, strictly it's only iova_reserve_pci_windows() that needs the list
> > sorted, it just worked out that maintaining the list in sorted order by
> > construction took a fair bit less code than explicitly sorting it. In terms
> > of preserving that behaviour in a slightly more generalised fashion I
> > suppose we could add something like:
> >
> > void pci_add_resource_offset_sorted(struct list_head *resources,
> >                               struct resource *res,
> >                               resource_size_t offset)
> > {
> >       struct resource_entry *entry;
> >
> >       resource_list_for_each_entry(entry, resources)
> >               if (entry->res.start > res.start)
> >                       break;
> >
> >       pci_add_resource_offset(&entry->node, res, offset);
> > }
> >
> > but if you'd rather add a specific resource_list_sort() or even just
> > open-code it in iommu-dma, I don't have any real preference. The "least code
> > necessary" approach definitely made sense when individual drivers were
> > expected to build their own lists, but once it gets generalised then having
> > a sensible and robust API becomes a more important consideration.
>
> I think that open coding it in iommu-dma is fine, @RobH would you be
> able to add this to the series please ? I think it should be added to
> prevent any regressions, we can't rely on dma-ranges entries order in DT
> files.

I don't think it's good to be modifying the list as a side effect of
calling iova_reserve_pci_windows() and making a copy of it wouldn't be
great either. So I'm just going to keep it sorted in
devm_of_pci_get_host_bridge_resources().

Rob

^ permalink raw reply	[flat|nested] 49+ messages in thread

* Re: [PATCH v3 19/25] PCI: of: Add inbound resource parsing to helpers
  2019-10-30 22:18                 ` Rob Herring
@ 2019-10-31 10:09                   ` Lorenzo Pieralisi
  0 siblings, 0 replies; 49+ messages in thread
From: Lorenzo Pieralisi @ 2019-10-31 10:09 UTC (permalink / raw)
  To: Rob Herring
  Cc: Robin Murphy, Srinath Mannam, Bjorn Helgaas, Andrew Murray, PCI,
	Linux ARM, BCM Kernel Feedback, Christoph Hellwig,
	Gustavo Pimentel, Heiko Stuebner, Hou Zhiqiang, Jingoo Han,
	Karthikeyan Mitran, Ley Foon Tan, Linus Walleij,
	moderated list:ARM/Mediatek SoC support,
	open list:MEDIA DRIVERS FOR RENESAS - FCP,
	open list:ARM/Rockchip SoC...,
	Matthias Brugger, Michal Simek, Ray Jui, rfi, Ryder Lee,
	Scott Branden, Shawn Lin, Simon Horman, Thomas Petazzoni,
	Toan Le, Tom Joseph, Will Deacon

On Wed, Oct 30, 2019 at 05:18:25PM -0500, Rob Herring wrote:
> On Wed, Oct 30, 2019 at 9:56 AM Lorenzo Pieralisi
> <lorenzo.pieralisi@arm.com> wrote:
> >
> > On Wed, Oct 30, 2019 at 12:49:59PM +0000, Robin Murphy wrote:
> > > On 30/10/2019 11:48, Lorenzo Pieralisi wrote:
> > > > [+Cc Robin]
> > > >
> > > > On Wed, Oct 30, 2019 at 12:14:54PM +0530, Srinath Mannam wrote:
> > > > > Hi Lorenzo,
> > > > >
> > > > > Thanks for the details.
> > > > > Based on Robin's comment in the old patch, I thought dma_ranges list
> > > > > will be in sorted order.
> > > > > https://lore.kernel.org/lkml/741a4210-251c-9c00-d4a7-bc7ebf8cd57b@arm.com/
> > > > >
> > > > > Now, another patch is required to sort the list before reserving in
> > > > > iova_reserve_pci_windows() function.
> > > > >
> > > > > Regards,
> > > > > Srinath.
> > > >
> > > > Don't top-post please.
> > > >
> > > > https://en.wikipedia.org/wiki/Posting_style#Top-posting
> > > >
> > > > Yes, the dma_ranges list must be sorted somehow I reckon
> > > > iova_reserve_pci_windows() is where it should be done (since that's
> > > > where the requirement is) or it can be done in
> > > > devm_of_pci_get_host_bridge_resources().
> > > >
> > > > Thoughts ?
> > >
> > > Right, strictly it's only iova_reserve_pci_windows() that needs the list
> > > sorted, it just worked out that maintaining the list in sorted order by
> > > construction took a fair bit less code than explicitly sorting it. In terms
> > > of preserving that behaviour in a slightly more generalised fashion I
> > > suppose we could add something like:
> > >
> > > void pci_add_resource_offset_sorted(struct list_head *resources,
> > >                               struct resource *res,
> > >                               resource_size_t offset)
> > > {
> > >       struct resource_entry *entry;
> > >
> > >       resource_list_for_each_entry(entry, resources)
> > >               if (entry->res.start > res.start)
> > >                       break;
> > >
> > >       pci_add_resource_offset(&entry->node, res, offset);
> > > }
> > >
> > > but if you'd rather add a specific resource_list_sort() or even just
> > > open-code it in iommu-dma, I don't have any real preference. The "least code
> > > necessary" approach definitely made sense when individual drivers were
> > > expected to build their own lists, but once it gets generalised then having
> > > a sensible and robust API becomes a more important consideration.
> >
> > I think that open coding it in iommu-dma is fine, @RobH would you be
> > able to add this to the series please ? I think it should be added to
> > prevent any regressions, we can't rely on dma-ranges entries order in DT
> > files.
> 
> I don't think it's good to be modifying the list as a side effect of
> calling iova_reserve_pci_windows() and making a copy of it wouldn't be
> great either. So I'm just going to keep it sorted in
> devm_of_pci_get_host_bridge_resources().

Yes I thought about that - that's the most reasonable approach I think.

Thanks,
Lorenzo

^ permalink raw reply	[flat|nested] 49+ messages in thread

* Re: [PATCH v3 00/25] PCI host resource consolidation
  2019-10-28 16:32 [PATCH v3 00/25] PCI host resource consolidation Rob Herring
                   ` (24 preceding siblings ...)
  2019-10-28 16:32 ` [PATCH v3 25/25] PCI: Make devm_of_pci_get_host_bridge_resources() static Rob Herring
@ 2019-10-31 10:57 ` Lorenzo Pieralisi
  25 siblings, 0 replies; 49+ messages in thread
From: Lorenzo Pieralisi @ 2019-10-31 10:57 UTC (permalink / raw)
  To: Rob Herring
  Cc: Andrew Murray, Bjorn Helgaas, linux-pci, linux-arm-kernel,
	bcm-kernel-feedback-list, Christoph Hellwig, Gustavo Pimentel,
	Heiko Stuebner, Hou Zhiqiang, Jingoo Han, Karthikeyan Mitran,
	Ley Foon Tan, Linus Walleij, linux-mediatek, linux-renesas-soc,
	linux-rockchip, Matthias Brugger, Michal Simek, Ray Jui, rfi,
	Ryder Lee, Scott Branden, Shawn Lin, Simon Horman,
	Srinath Mannam, Thomas Petazzoni, Toan Le, Tom Joseph,
	Will Deacon

On Mon, Oct 28, 2019 at 11:32:31AM -0500, Rob Herring wrote:
> This started with just dma-ranges parsing consolidation, but has expanded
> to converting all host drivers to use pci_parse_request_of_pci_ranges()
> rather than devm_of_pci_get_host_bridge_resources(). This series moves
> the DT 'dma-ranges' parsing into common helpers utilizing a resource list.
> There's no (intended) functional change in this series though I'm also
> working on a separate series now in dt/next to improve the handling of
> 'dma-ranges' and dma masks.
> 
> The last patch may need to wait if there's any new users of
> devm_of_pci_get_host_bridge_resources.

I have applied it, along with the rest of the series, with v4 for:

PCI: of: Add inbound resource parsing to helpers

branch pci/mmio-dma-ranges, please let me know if there is something
I have missed.

Thanks,
Lorenzo

> Only versatile has been tested (on QEMU). The rest is compiled only. A git
> branch is here[1].
> 
> v3:
> - Fix >80 char lines
> - Rename resource_list_get_entry_of_type to resource_list_first_type
> 
> Rob
> 
> [1] git://git.kernel.org/pub/scm/linux/kernel/git/robh/linux.git pci-ranges-cleanup-v3
> 
> 
> Rob Herring (25):
>   resource: Add a resource_list_first_type helper
>   PCI: Export pci_parse_request_of_pci_ranges()
>   PCI: aardvark: Use pci_parse_request_of_pci_ranges()
>   PCI: altera: Use pci_parse_request_of_pci_ranges()
>   PCI: dwc: Use pci_parse_request_of_pci_ranges()
>   PCI: faraday: Use pci_parse_request_of_pci_ranges()
>   PCI: iproc: Use pci_parse_request_of_pci_ranges()
>   PCI: mediatek: Use pci_parse_request_of_pci_ranges()
>   PCI: mobiveil: Use pci_parse_request_of_pci_ranges()
>   PCI: rockchip: Use pci_parse_request_of_pci_ranges()
>   PCI: rockchip: Drop storing driver private outbound resource data
>   PCI: v3-semi: Use pci_parse_request_of_pci_ranges()
>   PCI: xgene: Use pci_parse_request_of_pci_ranges()
>   PCI: xilinx: Use pci_parse_request_of_pci_ranges()
>   PCI: xilinx-nwl: Use pci_parse_request_of_pci_ranges()
>   PCI: versatile: Use pci_parse_request_of_pci_ranges()
>   PCI: versatile: Remove usage of PHYS_OFFSET
>   PCI: versatile: Enable COMPILE_TEST
>   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
>   PCI: Make devm_of_pci_get_host_bridge_resources() static
> 
>  drivers/pci/controller/Kconfig                |  2 +-
>  .../pci/controller/dwc/pcie-designware-host.c | 29 ++----
>  drivers/pci/controller/pci-aardvark.c         | 60 +------------
>  drivers/pci/controller/pci-ftpci100.c         | 79 +++++-----------
>  drivers/pci/controller/pci-host-common.c      |  2 +-
>  drivers/pci/controller/pci-v3-semi.c          | 74 +++++----------
>  drivers/pci/controller/pci-versatile.c        | 71 ++++-----------
>  drivers/pci/controller/pci-xgene.c            | 73 +++++----------
>  drivers/pci/controller/pcie-altera.c          | 41 +--------
>  drivers/pci/controller/pcie-cadence-host.c    |  2 +-
>  drivers/pci/controller/pcie-iproc-platform.c  |  9 +-
>  drivers/pci/controller/pcie-iproc.c           | 82 ++++-------------
>  drivers/pci/controller/pcie-mediatek.c        | 43 +++------
>  drivers/pci/controller/pcie-mobiveil.c        | 27 ++----
>  drivers/pci/controller/pcie-rcar.c            | 48 ++++------
>  drivers/pci/controller/pcie-rockchip-host.c   | 89 +++++++------------
>  drivers/pci/controller/pcie-rockchip.h        |  5 --
>  drivers/pci/controller/pcie-xilinx-nwl.c      | 21 ++---
>  drivers/pci/controller/pcie-xilinx.c          | 18 +---
>  drivers/pci/of.c                              | 51 +++++++++--
>  drivers/pci/pci.h                             | 13 ---
>  include/linux/pci.h                           |  9 +-
>  include/linux/resource_ext.h                  | 12 +++
>  23 files changed, 261 insertions(+), 599 deletions(-)
> 
> --
> 2.20.1

^ permalink raw reply	[flat|nested] 49+ messages in thread

* Re: [PATCH v3 06/25] PCI: faraday: Use pci_parse_request_of_pci_ranges()
  2019-10-28 16:32 ` [PATCH v3 06/25] PCI: faraday: " Rob Herring
@ 2019-11-03 19:12   ` Linus Walleij
  0 siblings, 0 replies; 49+ messages in thread
From: Linus Walleij @ 2019-11-03 19:12 UTC (permalink / raw)
  To: Rob Herring
  Cc: Andrew Murray, Bjorn Helgaas, Lorenzo Pieralisi, linux-pci,
	Linux ARM, bcm-kernel-feedback-list, Christoph Hellwig,
	Gustavo Pimentel, Heiko Stuebner, Hou Zhiqiang, Jingoo Han,
	Karthikeyan Mitran, Ley Foon Tan,
	moderated list:ARM/Mediatek SoC support, Linux-Renesas,
	open list:ARM/Rockchip SoC...,
	Matthias Brugger, Michal Simek, Ray Jui, rfi, Ryder Lee,
	Scott Branden, Shawn Lin, Simon Horman, Srinath Mannam,
	Thomas Petazzoni, Toan Le, Tom Joseph, Will Deacon

On Mon, Oct 28, 2019 at 5:33 PM Rob Herring <robh@kernel.org> wrote:

> Convert the Faraday host bridge to use the common
> pci_parse_request_of_pci_ranges().
>
> There's no need to assign the resources to a temporary list first. Just
> use bridge->windows directly and remove all the temporary list handling.
>
> Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
> Cc: Bjorn Helgaas <bhelgaas@google.com>
> Reviewed-by: Andrew Murray <andrew.murray@arm.com>
> Signed-off-by: Rob Herring <robh@kernel.org>
> ---
> v2:
>  - Remove temporary resource list

Acked-by: Linus Walleij <linus.walleij@linaro.org>

Yours,
Linus Walleij

^ permalink raw reply	[flat|nested] 49+ messages in thread

* Re: [PATCH v3 10/25] PCI: rockchip: Use pci_parse_request_of_pci_ranges()
  2019-10-28 16:32 ` [PATCH v3 10/25] PCI: rockchip: " Rob Herring
@ 2019-12-05 17:56   ` Enric Balletbo Serra
  2019-12-06 13:52     ` Lorenzo Pieralisi
  2019-12-06 14:09     ` Lorenzo Pieralisi
  0 siblings, 2 replies; 49+ messages in thread
From: Enric Balletbo Serra @ 2019-12-05 17:56 UTC (permalink / raw)
  To: Rob Herring
  Cc: Andrew Murray, Bjorn Helgaas, Lorenzo Pieralisi, Heiko Stuebner,
	Karthikeyan Mitran, linux-pci, Shawn Lin, Thomas Petazzoni,
	Toan Le, Will Deacon, Ryder Lee, Michal Simek, Christoph Hellwig,
	open list:ARM/Rockchip SoC...,
	bcm-kernel-feedback-list, Linus Walleij, Ray Jui, Hou Zhiqiang,
	Simon Horman, moderated list:ARM/Mediatek SoC support,
	Matthias Brugger, Linux ARM, Scott Branden, Jingoo Han, rfi,
	linux-renesas-soc, Tom Joseph, Srinath Mannam, Gustavo Pimentel,
	Ley Foon Tan

Hi Rob,

Missatge de Rob Herring <robh@kernel.org> del dia dl., 28 d’oct. 2019
a les 17:38:
>
> Convert the Rockchip host bridge to use the common
> pci_parse_request_of_pci_ranges().
>
> There's no need to assign the resources to a temporary list first. Just
> use bridge->windows directly and remove all the temporary list handling.
>
> Cc: Shawn Lin <shawn.lin@rock-chips.com>
> Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
> Cc: Andrew Murray <andrew.murray@arm.com>
> Cc: Bjorn Helgaas <bhelgaas@google.com>
> Cc: Heiko Stuebner <heiko@sntech.de>
> Cc: linux-rockchip@lists.infradead.org
> Signed-off-by: Rob Herring <robh@kernel.org>
> ---

I just tested mainline on my Samsung Chromebook Plus, and since
yesterday I'm getting a "synchronous external abort" [1]. After a
bisection, I found that this patch triggers the issue (this patch was
merged yesterday)

I didn't look in detail yet, but if you have any idea of what could be
the problem, that would be great.

Thanks,
 Enric

[1] https://hastebin.com/adasegihiw.rb

>  drivers/pci/controller/pcie-rockchip-host.c | 36 ++++-----------------
>  1 file changed, 7 insertions(+), 29 deletions(-)
>
> diff --git a/drivers/pci/controller/pcie-rockchip-host.c b/drivers/pci/controller/pcie-rockchip-host.c
> index ef8e677ce9d1..8d2e6f2e141e 100644
> --- a/drivers/pci/controller/pcie-rockchip-host.c
> +++ b/drivers/pci/controller/pcie-rockchip-host.c
> @@ -950,14 +950,10 @@ static int rockchip_pcie_probe(struct platform_device *pdev)
>         struct device *dev = &pdev->dev;
>         struct pci_bus *bus, *child;
>         struct pci_host_bridge *bridge;
> +       struct resource *bus_res;
>         struct resource_entry *win;
> -       resource_size_t io_base;
> -       struct resource *mem;
> -       struct resource *io;
>         int err;
>
> -       LIST_HEAD(res);
> -
>         if (!dev->of_node)
>                 return -ENODEV;
>
> @@ -995,29 +991,20 @@ static int rockchip_pcie_probe(struct platform_device *pdev)
>         if (err < 0)
>                 goto err_deinit_port;
>
> -       err = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff,
> -                                                   &res, &io_base);
> +       err = pci_parse_request_of_pci_ranges(dev, &bridge->windows, &bus_res);
>         if (err)
>                 goto err_remove_irq_domain;
>
> -       err = devm_request_pci_bus_resources(dev, &res);
> -       if (err)
> -               goto err_free_res;
> +       rockchip->root_bus_nr = bus_res->start;
>
>         /* Get the I/O and memory ranges from DT */
> -       resource_list_for_each_entry(win, &res) {
> +       resource_list_for_each_entry(win, &bridge->windows) {
>                 switch (resource_type(win->res)) {
>                 case IORESOURCE_IO:
>                         io = win->res;
>                         io->name = "I/O";
>                         rockchip->io_size = resource_size(io);
>                         rockchip->io_bus_addr = io->start - win->offset;
> -                       err = pci_remap_iospace(io, io_base);
> -                       if (err) {
> -                               dev_warn(dev, "error %d: failed to map resource %pR\n",
> -                                        err, io);
> -                               continue;
> -                       }
>                         rockchip->io = io;
>                         break;
>                 case IORESOURCE_MEM:
> @@ -1026,9 +1013,6 @@ static int rockchip_pcie_probe(struct platform_device *pdev)
>                         rockchip->mem_size = resource_size(mem);
>                         rockchip->mem_bus_addr = mem->start - win->offset;
>                         break;
> -               case IORESOURCE_BUS:
> -                       rockchip->root_bus_nr = win->res->start;
> -                       break;
>                 default:
>                         continue;
>                 }
> @@ -1036,15 +1020,14 @@ static int rockchip_pcie_probe(struct platform_device *pdev)
>
>         err = rockchip_pcie_cfg_atu(rockchip);
>         if (err)
> -               goto err_unmap_iospace;
> +               goto err_remove_irq_domain;
>
>         rockchip->msg_region = devm_ioremap(dev, rockchip->msg_bus_addr, SZ_1M);
>         if (!rockchip->msg_region) {
>                 err = -ENOMEM;
> -               goto err_unmap_iospace;
> +               goto err_remove_irq_domain;
>         }
>
> -       list_splice_init(&res, &bridge->windows);
>         bridge->dev.parent = dev;
>         bridge->sysdata = rockchip;
>         bridge->busnr = 0;
> @@ -1054,7 +1037,7 @@ static int rockchip_pcie_probe(struct platform_device *pdev)
>
>         err = pci_scan_root_bus_bridge(bridge);
>         if (err < 0)
> -               goto err_unmap_iospace;
> +               goto err_remove_irq_domain;
>
>         bus = bridge->bus;
>
> @@ -1068,10 +1051,6 @@ static int rockchip_pcie_probe(struct platform_device *pdev)
>         pci_bus_add_devices(bus);
>         return 0;
>
> -err_unmap_iospace:
> -       pci_unmap_iospace(rockchip->io);
> -err_free_res:
> -       pci_free_resource_list(&res);
>  err_remove_irq_domain:
>         irq_domain_remove(rockchip->irq_domain);
>  err_deinit_port:
> @@ -1097,7 +1076,6 @@ static int rockchip_pcie_remove(struct platform_device *pdev)
>
>         pci_stop_root_bus(rockchip->root_bus);
>         pci_remove_root_bus(rockchip->root_bus);
> -       pci_unmap_iospace(rockchip->io);
>         irq_domain_remove(rockchip->irq_domain);
>
>         rockchip_pcie_deinit_phys(rockchip);
> --
> 2.20.1
>
>
> _______________________________________________
> Linux-mediatek mailing list
> Linux-mediatek@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-mediatek

^ permalink raw reply	[flat|nested] 49+ messages in thread

* Re: [PATCH v3 10/25] PCI: rockchip: Use pci_parse_request_of_pci_ranges()
  2019-12-05 17:56   ` Enric Balletbo Serra
@ 2019-12-06 13:52     ` Lorenzo Pieralisi
  2019-12-06 14:09     ` Lorenzo Pieralisi
  1 sibling, 0 replies; 49+ messages in thread
From: Lorenzo Pieralisi @ 2019-12-06 13:52 UTC (permalink / raw)
  To: Enric Balletbo Serra
  Cc: Rob Herring, Andrew Murray, Bjorn Helgaas, Heiko Stuebner,
	Karthikeyan Mitran, linux-pci, Shawn Lin, Thomas Petazzoni,
	Toan Le, Will Deacon, Ryder Lee, Michal Simek, Christoph Hellwig,
	open list:ARM/Rockchip SoC...,
	bcm-kernel-feedback-list, Linus Walleij, Ray Jui, Hou Zhiqiang,
	Simon Horman, moderated list:ARM/Mediatek SoC support,
	Matthias Brugger, Linux ARM, Scott Branden, Jingoo Han, rfi,
	linux-renesas-soc, Tom Joseph, Srinath Mannam, Gustavo Pimentel,
	Ley Foon Tan

On Thu, Dec 05, 2019 at 06:56:01PM +0100, Enric Balletbo Serra wrote:
> Hi Rob,
> 
> Missatge de Rob Herring <robh@kernel.org> del dia dl., 28 d’oct. 2019
> a les 17:38:
> >
> > Convert the Rockchip host bridge to use the common
> > pci_parse_request_of_pci_ranges().
> >
> > There's no need to assign the resources to a temporary list first. Just
> > use bridge->windows directly and remove all the temporary list handling.
> >
> > Cc: Shawn Lin <shawn.lin@rock-chips.com>
> > Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
> > Cc: Andrew Murray <andrew.murray@arm.com>
> > Cc: Bjorn Helgaas <bhelgaas@google.com>
> > Cc: Heiko Stuebner <heiko@sntech.de>
> > Cc: linux-rockchip@lists.infradead.org
> > Signed-off-by: Rob Herring <robh@kernel.org>
> > ---
> 
> I just tested mainline on my Samsung Chromebook Plus, and since
> yesterday I'm getting a "synchronous external abort" [1]. After a
> bisection, I found that this patch triggers the issue (this patch was
> merged yesterday)
> 
> I didn't look in detail yet, but if you have any idea of what could be
> the problem, that would be great.
> 
> Thanks,
>  Enric
> 
> [1] https://hastebin.com/adasegihiw.rb

Could you please post the kernel log again ?

Lorenzo

> >  drivers/pci/controller/pcie-rockchip-host.c | 36 ++++-----------------
> >  1 file changed, 7 insertions(+), 29 deletions(-)
> >
> > diff --git a/drivers/pci/controller/pcie-rockchip-host.c b/drivers/pci/controller/pcie-rockchip-host.c
> > index ef8e677ce9d1..8d2e6f2e141e 100644
> > --- a/drivers/pci/controller/pcie-rockchip-host.c
> > +++ b/drivers/pci/controller/pcie-rockchip-host.c
> > @@ -950,14 +950,10 @@ static int rockchip_pcie_probe(struct platform_device *pdev)
> >         struct device *dev = &pdev->dev;
> >         struct pci_bus *bus, *child;
> >         struct pci_host_bridge *bridge;
> > +       struct resource *bus_res;
> >         struct resource_entry *win;
> > -       resource_size_t io_base;
> > -       struct resource *mem;
> > -       struct resource *io;
> >         int err;
> >
> > -       LIST_HEAD(res);
> > -
> >         if (!dev->of_node)
> >                 return -ENODEV;
> >
> > @@ -995,29 +991,20 @@ static int rockchip_pcie_probe(struct platform_device *pdev)
> >         if (err < 0)
> >                 goto err_deinit_port;
> >
> > -       err = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff,
> > -                                                   &res, &io_base);
> > +       err = pci_parse_request_of_pci_ranges(dev, &bridge->windows, &bus_res);
> >         if (err)
> >                 goto err_remove_irq_domain;
> >
> > -       err = devm_request_pci_bus_resources(dev, &res);
> > -       if (err)
> > -               goto err_free_res;
> > +       rockchip->root_bus_nr = bus_res->start;
> >
> >         /* Get the I/O and memory ranges from DT */
> > -       resource_list_for_each_entry(win, &res) {
> > +       resource_list_for_each_entry(win, &bridge->windows) {
> >                 switch (resource_type(win->res)) {
> >                 case IORESOURCE_IO:
> >                         io = win->res;
> >                         io->name = "I/O";
> >                         rockchip->io_size = resource_size(io);
> >                         rockchip->io_bus_addr = io->start - win->offset;
> > -                       err = pci_remap_iospace(io, io_base);
> > -                       if (err) {
> > -                               dev_warn(dev, "error %d: failed to map resource %pR\n",
> > -                                        err, io);
> > -                               continue;
> > -                       }
> >                         rockchip->io = io;
> >                         break;
> >                 case IORESOURCE_MEM:
> > @@ -1026,9 +1013,6 @@ static int rockchip_pcie_probe(struct platform_device *pdev)
> >                         rockchip->mem_size = resource_size(mem);
> >                         rockchip->mem_bus_addr = mem->start - win->offset;
> >                         break;
> > -               case IORESOURCE_BUS:
> > -                       rockchip->root_bus_nr = win->res->start;
> > -                       break;
> >                 default:
> >                         continue;
> >                 }
> > @@ -1036,15 +1020,14 @@ static int rockchip_pcie_probe(struct platform_device *pdev)
> >
> >         err = rockchip_pcie_cfg_atu(rockchip);
> >         if (err)
> > -               goto err_unmap_iospace;
> > +               goto err_remove_irq_domain;
> >
> >         rockchip->msg_region = devm_ioremap(dev, rockchip->msg_bus_addr, SZ_1M);
> >         if (!rockchip->msg_region) {
> >                 err = -ENOMEM;
> > -               goto err_unmap_iospace;
> > +               goto err_remove_irq_domain;
> >         }
> >
> > -       list_splice_init(&res, &bridge->windows);
> >         bridge->dev.parent = dev;
> >         bridge->sysdata = rockchip;
> >         bridge->busnr = 0;
> > @@ -1054,7 +1037,7 @@ static int rockchip_pcie_probe(struct platform_device *pdev)
> >
> >         err = pci_scan_root_bus_bridge(bridge);
> >         if (err < 0)
> > -               goto err_unmap_iospace;
> > +               goto err_remove_irq_domain;
> >
> >         bus = bridge->bus;
> >
> > @@ -1068,10 +1051,6 @@ static int rockchip_pcie_probe(struct platform_device *pdev)
> >         pci_bus_add_devices(bus);
> >         return 0;
> >
> > -err_unmap_iospace:
> > -       pci_unmap_iospace(rockchip->io);
> > -err_free_res:
> > -       pci_free_resource_list(&res);
> >  err_remove_irq_domain:
> >         irq_domain_remove(rockchip->irq_domain);
> >  err_deinit_port:
> > @@ -1097,7 +1076,6 @@ static int rockchip_pcie_remove(struct platform_device *pdev)
> >
> >         pci_stop_root_bus(rockchip->root_bus);
> >         pci_remove_root_bus(rockchip->root_bus);
> > -       pci_unmap_iospace(rockchip->io);
> >         irq_domain_remove(rockchip->irq_domain);
> >
> >         rockchip_pcie_deinit_phys(rockchip);
> > --
> > 2.20.1
> >
> >
> > _______________________________________________
> > Linux-mediatek mailing list
> > Linux-mediatek@lists.infradead.org
> > http://lists.infradead.org/mailman/listinfo/linux-mediatek

^ permalink raw reply	[flat|nested] 49+ messages in thread

* Re: [PATCH v3 10/25] PCI: rockchip: Use pci_parse_request_of_pci_ranges()
  2019-12-05 17:56   ` Enric Balletbo Serra
  2019-12-06 13:52     ` Lorenzo Pieralisi
@ 2019-12-06 14:09     ` Lorenzo Pieralisi
  2019-12-06 14:59       ` Enric Balletbo Serra
  1 sibling, 1 reply; 49+ messages in thread
From: Lorenzo Pieralisi @ 2019-12-06 14:09 UTC (permalink / raw)
  To: Enric Balletbo Serra
  Cc: Rob Herring, Andrew Murray, Bjorn Helgaas, Heiko Stuebner,
	Karthikeyan Mitran, linux-pci, Shawn Lin, Thomas Petazzoni,
	Toan Le, Will Deacon, Ryder Lee, Michal Simek, Christoph Hellwig,
	open list:ARM/Rockchip SoC...,
	bcm-kernel-feedback-list, Linus Walleij, Ray Jui, Hou Zhiqiang,
	Simon Horman, moderated list:ARM/Mediatek SoC support,
	Matthias Brugger, Linux ARM, Scott Branden, Jingoo Han, rfi,
	linux-renesas-soc, Tom Joseph, Srinath Mannam, Gustavo Pimentel,
	Ley Foon Tan

On Thu, Dec 05, 2019 at 06:56:01PM +0100, Enric Balletbo Serra wrote:
> Hi Rob,
> 
> Missatge de Rob Herring <robh@kernel.org> del dia dl., 28 d’oct. 2019
> a les 17:38:
> >
> > Convert the Rockchip host bridge to use the common
> > pci_parse_request_of_pci_ranges().
> >
> > There's no need to assign the resources to a temporary list first. Just
> > use bridge->windows directly and remove all the temporary list handling.
> >
> > Cc: Shawn Lin <shawn.lin@rock-chips.com>
> > Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
> > Cc: Andrew Murray <andrew.murray@arm.com>
> > Cc: Bjorn Helgaas <bhelgaas@google.com>
> > Cc: Heiko Stuebner <heiko@sntech.de>
> > Cc: linux-rockchip@lists.infradead.org
> > Signed-off-by: Rob Herring <robh@kernel.org>
> > ---
> 
> I just tested mainline on my Samsung Chromebook Plus, and since
> yesterday I'm getting a "synchronous external abort" [1]. After a
> bisection, I found that this patch triggers the issue (this patch was
> merged yesterday)

This patch standalone triggers a compilation error - so it does
trigger a bisection but not the one you are enquiring about.

Can you try to bisect it again and report back please ?

Thanks,
Lorenzo

> I didn't look in detail yet, but if you have any idea of what could be
> the problem, that would be great.
> 
> Thanks,
>  Enric
> 
> [1] https://hastebin.com/adasegihiw.rb
> 
> >  drivers/pci/controller/pcie-rockchip-host.c | 36 ++++-----------------
> >  1 file changed, 7 insertions(+), 29 deletions(-)
> >
> > diff --git a/drivers/pci/controller/pcie-rockchip-host.c b/drivers/pci/controller/pcie-rockchip-host.c
> > index ef8e677ce9d1..8d2e6f2e141e 100644
> > --- a/drivers/pci/controller/pcie-rockchip-host.c
> > +++ b/drivers/pci/controller/pcie-rockchip-host.c
> > @@ -950,14 +950,10 @@ static int rockchip_pcie_probe(struct platform_device *pdev)
> >         struct device *dev = &pdev->dev;
> >         struct pci_bus *bus, *child;
> >         struct pci_host_bridge *bridge;
> > +       struct resource *bus_res;
> >         struct resource_entry *win;
> > -       resource_size_t io_base;
> > -       struct resource *mem;
> > -       struct resource *io;
> >         int err;
> >
> > -       LIST_HEAD(res);
> > -
> >         if (!dev->of_node)
> >                 return -ENODEV;
> >
> > @@ -995,29 +991,20 @@ static int rockchip_pcie_probe(struct platform_device *pdev)
> >         if (err < 0)
> >                 goto err_deinit_port;
> >
> > -       err = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff,
> > -                                                   &res, &io_base);
> > +       err = pci_parse_request_of_pci_ranges(dev, &bridge->windows, &bus_res);
> >         if (err)
> >                 goto err_remove_irq_domain;
> >
> > -       err = devm_request_pci_bus_resources(dev, &res);
> > -       if (err)
> > -               goto err_free_res;
> > +       rockchip->root_bus_nr = bus_res->start;
> >
> >         /* Get the I/O and memory ranges from DT */
> > -       resource_list_for_each_entry(win, &res) {
> > +       resource_list_for_each_entry(win, &bridge->windows) {
> >                 switch (resource_type(win->res)) {
> >                 case IORESOURCE_IO:
> >                         io = win->res;
> >                         io->name = "I/O";
> >                         rockchip->io_size = resource_size(io);
> >                         rockchip->io_bus_addr = io->start - win->offset;
> > -                       err = pci_remap_iospace(io, io_base);
> > -                       if (err) {
> > -                               dev_warn(dev, "error %d: failed to map resource %pR\n",
> > -                                        err, io);
> > -                               continue;
> > -                       }
> >                         rockchip->io = io;
> >                         break;
> >                 case IORESOURCE_MEM:
> > @@ -1026,9 +1013,6 @@ static int rockchip_pcie_probe(struct platform_device *pdev)
> >                         rockchip->mem_size = resource_size(mem);
> >                         rockchip->mem_bus_addr = mem->start - win->offset;
> >                         break;
> > -               case IORESOURCE_BUS:
> > -                       rockchip->root_bus_nr = win->res->start;
> > -                       break;
> >                 default:
> >                         continue;
> >                 }
> > @@ -1036,15 +1020,14 @@ static int rockchip_pcie_probe(struct platform_device *pdev)
> >
> >         err = rockchip_pcie_cfg_atu(rockchip);
> >         if (err)
> > -               goto err_unmap_iospace;
> > +               goto err_remove_irq_domain;
> >
> >         rockchip->msg_region = devm_ioremap(dev, rockchip->msg_bus_addr, SZ_1M);
> >         if (!rockchip->msg_region) {
> >                 err = -ENOMEM;
> > -               goto err_unmap_iospace;
> > +               goto err_remove_irq_domain;
> >         }
> >
> > -       list_splice_init(&res, &bridge->windows);
> >         bridge->dev.parent = dev;
> >         bridge->sysdata = rockchip;
> >         bridge->busnr = 0;
> > @@ -1054,7 +1037,7 @@ static int rockchip_pcie_probe(struct platform_device *pdev)
> >
> >         err = pci_scan_root_bus_bridge(bridge);
> >         if (err < 0)
> > -               goto err_unmap_iospace;
> > +               goto err_remove_irq_domain;
> >
> >         bus = bridge->bus;
> >
> > @@ -1068,10 +1051,6 @@ static int rockchip_pcie_probe(struct platform_device *pdev)
> >         pci_bus_add_devices(bus);
> >         return 0;
> >
> > -err_unmap_iospace:
> > -       pci_unmap_iospace(rockchip->io);
> > -err_free_res:
> > -       pci_free_resource_list(&res);
> >  err_remove_irq_domain:
> >         irq_domain_remove(rockchip->irq_domain);
> >  err_deinit_port:
> > @@ -1097,7 +1076,6 @@ static int rockchip_pcie_remove(struct platform_device *pdev)
> >
> >         pci_stop_root_bus(rockchip->root_bus);
> >         pci_remove_root_bus(rockchip->root_bus);
> > -       pci_unmap_iospace(rockchip->io);
> >         irq_domain_remove(rockchip->irq_domain);
> >
> >         rockchip_pcie_deinit_phys(rockchip);
> > --
> > 2.20.1
> >
> >
> > _______________________________________________
> > Linux-mediatek mailing list
> > Linux-mediatek@lists.infradead.org
> > http://lists.infradead.org/mailman/listinfo/linux-mediatek

^ permalink raw reply	[flat|nested] 49+ messages in thread

* Re: [PATCH v3 10/25] PCI: rockchip: Use pci_parse_request_of_pci_ranges()
  2019-12-06 14:09     ` Lorenzo Pieralisi
@ 2019-12-06 14:59       ` Enric Balletbo Serra
  0 siblings, 0 replies; 49+ messages in thread
From: Enric Balletbo Serra @ 2019-12-06 14:59 UTC (permalink / raw)
  To: Lorenzo Pieralisi
  Cc: Rob Herring, Andrew Murray, Bjorn Helgaas, Heiko Stuebner,
	Karthikeyan Mitran, linux-pci, Shawn Lin, Thomas Petazzoni,
	Toan Le, Will Deacon, Ryder Lee, Michal Simek, Christoph Hellwig,
	open list:ARM/Rockchip SoC...,
	bcm-kernel-feedback-list, Linus Walleij, Ray Jui, Hou Zhiqiang,
	Simon Horman, moderated list:ARM/Mediatek SoC support,
	Matthias Brugger, Linux ARM, Scott Branden, Jingoo Han, rfi,
	linux-renesas-soc, Tom Joseph, Srinath Mannam, Gustavo Pimentel,
	Ley Foon Tan

Hi Lorenzo,

Missatge de Lorenzo Pieralisi <lorenzo.pieralisi@arm.com> del dia dv.,
6 de des. 2019 a les 15:09:
>
> On Thu, Dec 05, 2019 at 06:56:01PM +0100, Enric Balletbo Serra wrote:
> > Hi Rob,
> >
> > Missatge de Rob Herring <robh@kernel.org> del dia dl., 28 d’oct. 2019
> > a les 17:38:
> > >
> > > Convert the Rockchip host bridge to use the common
> > > pci_parse_request_of_pci_ranges().
> > >
> > > There's no need to assign the resources to a temporary list first. Just
> > > use bridge->windows directly and remove all the temporary list handling.
> > >
> > > Cc: Shawn Lin <shawn.lin@rock-chips.com>
> > > Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
> > > Cc: Andrew Murray <andrew.murray@arm.com>
> > > Cc: Bjorn Helgaas <bhelgaas@google.com>
> > > Cc: Heiko Stuebner <heiko@sntech.de>
> > > Cc: linux-rockchip@lists.infradead.org
> > > Signed-off-by: Rob Herring <robh@kernel.org>
> > > ---
> >
> > I just tested mainline on my Samsung Chromebook Plus, and since
> > yesterday I'm getting a "synchronous external abort" [1]. After a
> > bisection, I found that this patch triggers the issue (this patch was
> > merged yesterday)
>
> This patch standalone triggers a compilation error - so it does
> trigger a bisection but not the one you are enquiring about.
>

Right, I didn't run a "normal" bisection and is really annoying have
commits that break the build. I manually bisected
and fixed the build myself. Maybe I did something wrong but ...

> Can you try to bisect it again and report back please ?
>

Before those patches I don't see the error:

62240a88004b0205beb0c1faca1c875c392b53f0 PCI: rockchip: Drop storing
driver private outbound resource data
5c1306a0fde67e5a39bef79932a0cb5cec5fd629 PCI: rockchip: Use
pci_parse_request_of_pci_ranges()

After those patches I see:

[   15.362128] mwifiex_pcie 0000:01:00.0: enabling device (0000 -> 0002)
[   15.369655] mwifiex_pcie: PCI memory map Virt0: 00000000a573ad00
PCI memory map Virt2: 00000000783126c4
[   15.381466] Internal error: synchronous external abort: 96000210
[#1] PREEMPT SMP
[   15.389965] Modules linked in: mwifiex_pcie(+) mwifiex uvcvideo
cfg80211 atmel_mxt_ts videobuf2_vmalloc videobuf2_memops
videobuf2_v4l2 rockchipdrm videobuf2_common v$
deodev cdc_ether usbnet analogix_dp panfrost r8152 rfkill dw_mipi_dsi
dw_hdmi cros_ec_sensors industrialio_triggered_buffer crct10dif_ce
snd_soc_rk3399_gru_sound cec mc $
ctrl_regulator kfifo_buf snd_soc_da7219 gpu_sched snd_soc_max98357a
i2c_hid snd_soc_rt5514 snd_soc_rockchip_i2s cros_ec_sensors_core
sbs_battery pcie_rockchip_host snd_s$
c_rt5514_spi cros_usbpd_charger rockchip_saradc pwm_cros_ec
cros_ec_chardev cros_usbpd_logger phy_rockchip_pcie pwm_bl
snd_soc_rl6231 rockchip_thermal snd_soc_rockchip_p$
m ip_tables x_tables ipv6 nf_defrag_ipv6
[   15.461095] CPU: 2 PID: 269 Comm: systemd-udevd Not tainted 5.4.0+ #327
[   15.461097] Hardware name: Google Kevin (DT)
[   15.461101] pstate: 60000005 (nZCv daif -PAN -UAO)
[   15.461116] pc : mwifiex_register_dev+0x264/0x3f8 [mwifiex_pcie]
[   15.461121] lr : mwifiex_register_dev+0x150/0x3f8 [mwifiex_pcie]
[   15.461123] sp : ffff800012073860
[   15.461128] x29: ffff800012073860 x28: ffff8000100a2e28
[   15.509043] x27: ffff8000118b6210 x26: ffff800008f57458
[   15.515055] x25: ffff0000ecfda000 x24: 0000000000000001
[   15.521069] x23: ffff0000e9905080 x22: ffff800008f5d000
[   15.527082] x21: ffff0000eecea078 x20: ffff0000e9905080
[   15.533096] x19: ffff0000eecea000 x18: 0000000000000001
[   15.539108] x17: 0000000000000000 x16: 0000000000000000
[   15.545118] x15: ffffffffffffffff x14: ffff8000118998c8
[   15.551128] x13: ffff000000000000 x12: 0000000000000008
[   15.557138] x11: 0101010101010101 x10: ffff7f7fffff7fff
[   15.563148] x9 : 0000000000000000 x8 : ffff0000e3c24240
[   15.569159] x7 : 0000000000000000 x6 : ffff0000e3c24148
[   15.575169] x5 : ffff0000e3c24148 x4 : ffff0000e7975ec8
[   15.581178] x3 : 0000000000000001 x2 : 0000000000002b42
[   15.587188] x1 : ffff800012c00008 x0 : ffff0000e9905080
[   15.593200] Call trace:
[   15.595970]  mwifiex_register_dev+0x264/0x3f8 [mwifiex_pcie]
[   15.602398]  mwifiex_add_card+0x2f8/0x430 [mwifiex]
[   15.607920]  mwifiex_pcie_probe+0x98/0x148 [mwifiex_pcie]
[   15.614033]  local_pci_probe+0x3c/0xa0
[   15.618275]  pci_device_probe+0x110/0x1a8
[   15.622812]  really_probe+0xd4/0x308
[   15.626856]  driver_probe_device+0x54/0xe8
[   15.631491]  device_driver_attach+0x6c/0x78
[   15.636224]  __driver_attach+0x54/0xd0
[   15.640465]  bus_for_each_dev+0x70/0xc0
[   15.644804]  driver_attach+0x20/0x28
[   15.648847]  bus_add_driver+0x178/0x1d8
[   15.653186]  driver_register+0x60/0x110
[   15.657525]  __pci_register_driver+0x40/0x48
[   15.662359]  mwifiex_pcie_init+0x24/0x1000 [mwifiex_pcie]
[   15.668469]  do_one_initcall+0x74/0x1a8
[   15.672810]  do_init_module+0x50/0x208
[   15.677050]  load_module+0x1a78/0x1d18
[   15.681290]  __do_sys_finit_module+0xd0/0xe8
[   15.686120]  __arm64_sys_finit_module+0x1c/0x28
[   15.691247]  el0_svc_common.constprop.2+0x88/0x150
[   15.696668]  el0_svc_handler+0x20/0x80
[   15.700909]  el0_sync_handler+0x118/0x188
[   15.705444]  el0_sync+0x140/0x180
[   15.716955] Code: a8c67bfd d65f03c0 f942ac01 91002021 (b9400021)
[   15.731548] ---[ end trace 1488ca6d6b162849 ]---

Thanks,
 Enric

> Thanks,
> Lorenzo
>
> > I didn't look in detail yet, but if you have any idea of what could be
> > the problem, that would be great.
> >
> > Thanks,
> >  Enric
> >
> > [1] https://hastebin.com/adasegihiw.rb
> >
> > >  drivers/pci/controller/pcie-rockchip-host.c | 36 ++++-----------------
> > >  1 file changed, 7 insertions(+), 29 deletions(-)
> > >
> > > diff --git a/drivers/pci/controller/pcie-rockchip-host.c b/drivers/pci/controller/pcie-rockchip-host.c
> > > index ef8e677ce9d1..8d2e6f2e141e 100644
> > > --- a/drivers/pci/controller/pcie-rockchip-host.c
> > > +++ b/drivers/pci/controller/pcie-rockchip-host.c
> > > @@ -950,14 +950,10 @@ static int rockchip_pcie_probe(struct platform_device *pdev)
> > >         struct device *dev = &pdev->dev;
> > >         struct pci_bus *bus, *child;
> > >         struct pci_host_bridge *bridge;
> > > +       struct resource *bus_res;
> > >         struct resource_entry *win;
> > > -       resource_size_t io_base;
> > > -       struct resource *mem;
> > > -       struct resource *io;
> > >         int err;
> > >
> > > -       LIST_HEAD(res);
> > > -
> > >         if (!dev->of_node)
> > >                 return -ENODEV;
> > >
> > > @@ -995,29 +991,20 @@ static int rockchip_pcie_probe(struct platform_device *pdev)
> > >         if (err < 0)
> > >                 goto err_deinit_port;
> > >
> > > -       err = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff,
> > > -                                                   &res, &io_base);
> > > +       err = pci_parse_request_of_pci_ranges(dev, &bridge->windows, &bus_res);
> > >         if (err)
> > >                 goto err_remove_irq_domain;
> > >
> > > -       err = devm_request_pci_bus_resources(dev, &res);
> > > -       if (err)
> > > -               goto err_free_res;
> > > +       rockchip->root_bus_nr = bus_res->start;
> > >
> > >         /* Get the I/O and memory ranges from DT */
> > > -       resource_list_for_each_entry(win, &res) {
> > > +       resource_list_for_each_entry(win, &bridge->windows) {
> > >                 switch (resource_type(win->res)) {
> > >                 case IORESOURCE_IO:
> > >                         io = win->res;
> > >                         io->name = "I/O";
> > >                         rockchip->io_size = resource_size(io);
> > >                         rockchip->io_bus_addr = io->start - win->offset;
> > > -                       err = pci_remap_iospace(io, io_base);
> > > -                       if (err) {
> > > -                               dev_warn(dev, "error %d: failed to map resource %pR\n",
> > > -                                        err, io);
> > > -                               continue;
> > > -                       }
> > >                         rockchip->io = io;
> > >                         break;
> > >                 case IORESOURCE_MEM:
> > > @@ -1026,9 +1013,6 @@ static int rockchip_pcie_probe(struct platform_device *pdev)
> > >                         rockchip->mem_size = resource_size(mem);
> > >                         rockchip->mem_bus_addr = mem->start - win->offset;
> > >                         break;
> > > -               case IORESOURCE_BUS:
> > > -                       rockchip->root_bus_nr = win->res->start;
> > > -                       break;
> > >                 default:
> > >                         continue;
> > >                 }
> > > @@ -1036,15 +1020,14 @@ static int rockchip_pcie_probe(struct platform_device *pdev)
> > >
> > >         err = rockchip_pcie_cfg_atu(rockchip);
> > >         if (err)
> > > -               goto err_unmap_iospace;
> > > +               goto err_remove_irq_domain;
> > >
> > >         rockchip->msg_region = devm_ioremap(dev, rockchip->msg_bus_addr, SZ_1M);
> > >         if (!rockchip->msg_region) {
> > >                 err = -ENOMEM;
> > > -               goto err_unmap_iospace;
> > > +               goto err_remove_irq_domain;
> > >         }
> > >
> > > -       list_splice_init(&res, &bridge->windows);
> > >         bridge->dev.parent = dev;
> > >         bridge->sysdata = rockchip;
> > >         bridge->busnr = 0;
> > > @@ -1054,7 +1037,7 @@ static int rockchip_pcie_probe(struct platform_device *pdev)
> > >
> > >         err = pci_scan_root_bus_bridge(bridge);
> > >         if (err < 0)
> > > -               goto err_unmap_iospace;
> > > +               goto err_remove_irq_domain;
> > >
> > >         bus = bridge->bus;
> > >
> > > @@ -1068,10 +1051,6 @@ static int rockchip_pcie_probe(struct platform_device *pdev)
> > >         pci_bus_add_devices(bus);
> > >         return 0;
> > >
> > > -err_unmap_iospace:
> > > -       pci_unmap_iospace(rockchip->io);
> > > -err_free_res:
> > > -       pci_free_resource_list(&res);
> > >  err_remove_irq_domain:
> > >         irq_domain_remove(rockchip->irq_domain);
> > >  err_deinit_port:
> > > @@ -1097,7 +1076,6 @@ static int rockchip_pcie_remove(struct platform_device *pdev)
> > >
> > >         pci_stop_root_bus(rockchip->root_bus);
> > >         pci_remove_root_bus(rockchip->root_bus);
> > > -       pci_unmap_iospace(rockchip->io);
> > >         irq_domain_remove(rockchip->irq_domain);
> > >
> > >         rockchip_pcie_deinit_phys(rockchip);
> > > --
> > > 2.20.1
> > >
> > >
> > > _______________________________________________
> > > Linux-mediatek mailing list
> > > Linux-mediatek@lists.infradead.org
> > > http://lists.infradead.org/mailman/listinfo/linux-mediatek

^ permalink raw reply	[flat|nested] 49+ messages in thread

* Re: [PATCH v3 11/25] PCI: rockchip: Drop storing driver private outbound resource data
  2019-10-28 16:32 ` [PATCH v3 11/25] PCI: rockchip: Drop storing driver private outbound resource data Rob Herring
@ 2019-12-06 15:36   ` Lorenzo Pieralisi
  2019-12-10 17:33     ` Enric Balletbo Serra
  0 siblings, 1 reply; 49+ messages in thread
From: Lorenzo Pieralisi @ 2019-12-06 15:36 UTC (permalink / raw)
  To: Rob Herring
  Cc: Andrew Murray, Bjorn Helgaas, linux-pci, linux-arm-kernel,
	bcm-kernel-feedback-list, Christoph Hellwig, Gustavo Pimentel,
	Heiko Stuebner, Hou Zhiqiang, Jingoo Han, Karthikeyan Mitran,
	Ley Foon Tan, Linus Walleij, linux-mediatek, linux-renesas-soc,
	linux-rockchip, Matthias Brugger, Michal Simek, Ray Jui, rfi,
	Ryder Lee, Scott Branden, Shawn Lin, Simon Horman,
	Srinath Mannam, Thomas Petazzoni, Toan Le, Tom Joseph,
	Will Deacon, eballetbo

[+Eric]

On Mon, Oct 28, 2019 at 11:32:42AM -0500, Rob Herring wrote:
> The Rockchip host bridge driver doesn't need to store outboard resources
> in its private struct as they are already stored in struct
> pci_host_bridge.
> 
> Cc: Shawn Lin <shawn.lin@rock-chips.com>
> Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
> Cc: Andrew Murray <andrew.murray@arm.com>
> Cc: Bjorn Helgaas <bhelgaas@google.com>
> Cc: Heiko Stuebner <heiko@sntech.de>
> Cc: linux-rockchip@lists.infradead.org
> Signed-off-by: Rob Herring <robh@kernel.org>
> ---
>  drivers/pci/controller/pcie-rockchip-host.c | 54 +++++++++------------
>  drivers/pci/controller/pcie-rockchip.h      |  5 --
>  2 files changed, 23 insertions(+), 36 deletions(-)
> 
> diff --git a/drivers/pci/controller/pcie-rockchip-host.c b/drivers/pci/controller/pcie-rockchip-host.c
> index 8d2e6f2e141e..f375e55ea02e 100644
> --- a/drivers/pci/controller/pcie-rockchip-host.c
> +++ b/drivers/pci/controller/pcie-rockchip-host.c
> @@ -806,19 +806,28 @@ static int rockchip_pcie_prog_ib_atu(struct rockchip_pcie *rockchip,
>  static int rockchip_pcie_cfg_atu(struct rockchip_pcie *rockchip)
>  {
>  	struct device *dev = rockchip->dev;
> +	struct pci_host_bridge *bridge = pci_host_bridge_from_priv(rockchip);
> +	struct resource_entry *entry;
> +	u64 pci_addr, size;
>  	int offset;
>  	int err;
>  	int reg_no;
>  
>  	rockchip_pcie_cfg_configuration_accesses(rockchip,
>  						 AXI_WRAPPER_TYPE0_CFG);
> +	entry = resource_list_first_type(&bridge->windows, IORESOURCE_MEM);
> +	if (!entry)
> +		return -ENODEV;
> +
> +	size = resource_size(entry->res);
> +	pci_addr = entry->res->start - entry->offset;
> +	rockchip->msg_bus_addr = pci_addr;
>  
> -	for (reg_no = 0; reg_no < (rockchip->mem_size >> 20); reg_no++) {
> +	for (reg_no = 0; reg_no < (size >> 20); reg_no++) {
>  		err = rockchip_pcie_prog_ob_atu(rockchip, reg_no + 1,
>  						AXI_WRAPPER_MEM_WRITE,
>  						20 - 1,
> -						rockchip->mem_bus_addr +
> -						(reg_no << 20),
> +						pci_addr + (reg_no << 20),
>  						0);
>  		if (err) {
>  			dev_err(dev, "program RC mem outbound ATU failed\n");
> @@ -832,14 +841,20 @@ static int rockchip_pcie_cfg_atu(struct rockchip_pcie *rockchip)
>  		return err;
>  	}
>  
> -	offset = rockchip->mem_size >> 20;
> -	for (reg_no = 0; reg_no < (rockchip->io_size >> 20); reg_no++) {
> +	entry = resource_list_first_type(&bridge->windows, IORESOURCE_IO);
> +	if (!entry)
> +		return -ENODEV;
> +
> +	size = resource_size(entry->res);
> +	pci_addr = entry->res->start - entry->offset;
> +
> +	offset = size >> 20;

Just trying to find what triggers:

https://lore.kernel.org/linux-pci/CAFqH_52BiQJzNEzd_0pB3K+JmzVOVikYQo0xfiC0J-DwiXdtqw@mail.gmail.com/T/#u

I think this offset calculation changed the behaviour:

Before:

> -	offset = rockchip->mem_size >> 20;

Now:

> +	offset = size >> 20;

size must be the IORESOURCE_MEM resource size instead we are using the
IORESOURCE_IO size so IIUC the ATU window setup may be compromised.

Lorenzo

> +	for (reg_no = 0; reg_no < (size >> 20); reg_no++) {
>  		err = rockchip_pcie_prog_ob_atu(rockchip,
>  						reg_no + 1 + offset,
>  						AXI_WRAPPER_IO_WRITE,
>  						20 - 1,
> -						rockchip->io_bus_addr +
> -						(reg_no << 20),
> +						pci_addr + (reg_no << 20),
>  						0);
>  		if (err) {
>  			dev_err(dev, "program RC io outbound ATU failed\n");
> @@ -852,8 +867,7 @@ static int rockchip_pcie_cfg_atu(struct rockchip_pcie *rockchip)
>  				  AXI_WRAPPER_NOR_MSG,
>  				  20 - 1, 0, 0);
>  
> -	rockchip->msg_bus_addr = rockchip->mem_bus_addr +
> -					((reg_no + offset) << 20);
> +	rockchip->msg_bus_addr += ((reg_no + offset) << 20);
>  	return err;
>  }
>  
> @@ -951,7 +965,6 @@ static int rockchip_pcie_probe(struct platform_device *pdev)
>  	struct pci_bus *bus, *child;
>  	struct pci_host_bridge *bridge;
>  	struct resource *bus_res;
> -	struct resource_entry *win;
>  	int err;
>  
>  	if (!dev->of_node)
> @@ -997,27 +1010,6 @@ static int rockchip_pcie_probe(struct platform_device *pdev)
>  
>  	rockchip->root_bus_nr = bus_res->start;
>  
> -	/* Get the I/O and memory ranges from DT */
> -	resource_list_for_each_entry(win, &bridge->windows) {
> -		switch (resource_type(win->res)) {
> -		case IORESOURCE_IO:
> -			io = win->res;
> -			io->name = "I/O";
> -			rockchip->io_size = resource_size(io);
> -			rockchip->io_bus_addr = io->start - win->offset;
> -			rockchip->io = io;
> -			break;
> -		case IORESOURCE_MEM:
> -			mem = win->res;
> -			mem->name = "MEM";
> -			rockchip->mem_size = resource_size(mem);
> -			rockchip->mem_bus_addr = mem->start - win->offset;
> -			break;
> -		default:
> -			continue;
> -		}
> -	}
> -
>  	err = rockchip_pcie_cfg_atu(rockchip);
>  	if (err)
>  		goto err_remove_irq_domain;
> diff --git a/drivers/pci/controller/pcie-rockchip.h b/drivers/pci/controller/pcie-rockchip.h
> index 8e87a059ce73..bef42a803b56 100644
> --- a/drivers/pci/controller/pcie-rockchip.h
> +++ b/drivers/pci/controller/pcie-rockchip.h
> @@ -304,13 +304,8 @@ struct rockchip_pcie {
>  	struct	irq_domain *irq_domain;
>  	int     offset;
>  	struct pci_bus *root_bus;
> -	struct resource *io;
> -	phys_addr_t io_bus_addr;
> -	u32     io_size;
>  	void    __iomem *msg_region;
> -	u32     mem_size;
>  	phys_addr_t msg_bus_addr;
> -	phys_addr_t mem_bus_addr;
>  	bool is_rc;
>  	struct resource *mem_res;
>  };
> -- 
> 2.20.1
> 

^ permalink raw reply	[flat|nested] 49+ messages in thread

* Re: [PATCH v3 11/25] PCI: rockchip: Drop storing driver private outbound resource data
  2019-12-06 15:36   ` Lorenzo Pieralisi
@ 2019-12-10 17:33     ` Enric Balletbo Serra
  2019-12-11  9:39       ` Enric Balletbo Serra
  0 siblings, 1 reply; 49+ messages in thread
From: Enric Balletbo Serra @ 2019-12-10 17:33 UTC (permalink / raw)
  To: Lorenzo Pieralisi
  Cc: Rob Herring, Andrew Murray, Bjorn Helgaas, linux-pci, Linux ARM,
	bcm-kernel-feedback-list, Christoph Hellwig, Gustavo Pimentel,
	Heiko Stuebner, Hou Zhiqiang, Jingoo Han, Karthikeyan Mitran,
	Ley Foon Tan, Linus Walleij,
	moderated list:ARM/Mediatek SoC support, linux-renesas-soc,
	open list:ARM/Rockchip SoC...,
	Matthias Brugger, Michal Simek, Ray Jui, rfi, Ryder Lee,
	Scott Branden, Shawn Lin, Simon Horman, Srinath Mannam,
	Thomas Petazzoni, Toan Le, Tom Joseph, Will Deacon

Hi Lorenzo,

Many thanks to look at this.

Missatge de Lorenzo Pieralisi <lorenzo.pieralisi@arm.com> del dia dv.,
6 de des. 2019 a les 16:36:
>
> [+Eric]
>
> On Mon, Oct 28, 2019 at 11:32:42AM -0500, Rob Herring wrote:
> > The Rockchip host bridge driver doesn't need to store outboard resources
> > in its private struct as they are already stored in struct
> > pci_host_bridge.
> >
> > Cc: Shawn Lin <shawn.lin@rock-chips.com>
> > Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
> > Cc: Andrew Murray <andrew.murray@arm.com>
> > Cc: Bjorn Helgaas <bhelgaas@google.com>
> > Cc: Heiko Stuebner <heiko@sntech.de>
> > Cc: linux-rockchip@lists.infradead.org
> > Signed-off-by: Rob Herring <robh@kernel.org>
> > ---
> >  drivers/pci/controller/pcie-rockchip-host.c | 54 +++++++++------------
> >  drivers/pci/controller/pcie-rockchip.h      |  5 --
> >  2 files changed, 23 insertions(+), 36 deletions(-)
> >
> > diff --git a/drivers/pci/controller/pcie-rockchip-host.c b/drivers/pci/controller/pcie-rockchip-host.c
> > index 8d2e6f2e141e..f375e55ea02e 100644
> > --- a/drivers/pci/controller/pcie-rockchip-host.c
> > +++ b/drivers/pci/controller/pcie-rockchip-host.c
> > @@ -806,19 +806,28 @@ static int rockchip_pcie_prog_ib_atu(struct rockchip_pcie *rockchip,
> >  static int rockchip_pcie_cfg_atu(struct rockchip_pcie *rockchip)
> >  {
> >       struct device *dev = rockchip->dev;
> > +     struct pci_host_bridge *bridge = pci_host_bridge_from_priv(rockchip);
> > +     struct resource_entry *entry;
> > +     u64 pci_addr, size;
> >       int offset;
> >       int err;
> >       int reg_no;
> >
> >       rockchip_pcie_cfg_configuration_accesses(rockchip,
> >                                                AXI_WRAPPER_TYPE0_CFG);
> > +     entry = resource_list_first_type(&bridge->windows, IORESOURCE_MEM);
> > +     if (!entry)
> > +             return -ENODEV;
> > +
> > +     size = resource_size(entry->res);
> > +     pci_addr = entry->res->start - entry->offset;
> > +     rockchip->msg_bus_addr = pci_addr;
> >
> > -     for (reg_no = 0; reg_no < (rockchip->mem_size >> 20); reg_no++) {
> > +     for (reg_no = 0; reg_no < (size >> 20); reg_no++) {
> >               err = rockchip_pcie_prog_ob_atu(rockchip, reg_no + 1,
> >                                               AXI_WRAPPER_MEM_WRITE,
> >                                               20 - 1,
> > -                                             rockchip->mem_bus_addr +
> > -                                             (reg_no << 20),
> > +                                             pci_addr + (reg_no << 20),
> >                                               0);
> >               if (err) {
> >                       dev_err(dev, "program RC mem outbound ATU failed\n");
> > @@ -832,14 +841,20 @@ static int rockchip_pcie_cfg_atu(struct rockchip_pcie *rockchip)
> >               return err;
> >       }
> >
> > -     offset = rockchip->mem_size >> 20;
> > -     for (reg_no = 0; reg_no < (rockchip->io_size >> 20); reg_no++) {
> > +     entry = resource_list_first_type(&bridge->windows, IORESOURCE_IO);
> > +     if (!entry)
> > +             return -ENODEV;
> > +
> > +     size = resource_size(entry->res);
> > +     pci_addr = entry->res->start - entry->offset;
> > +
> > +     offset = size >> 20;
>
> Just trying to find what triggers:
>
> https://lore.kernel.org/linux-pci/CAFqH_52BiQJzNEzd_0pB3K+JmzVOVikYQo0xfiC0J-DwiXdtqw@mail.gmail.com/T/#u
>
> I think this offset calculation changed the behaviour:
>
> Before:
>
> > -     offset = rockchip->mem_size >> 20;
>
> Now:
>
> > +     offset = size >> 20;
>
> size must be the IORESOURCE_MEM resource size instead we are using the
> IORESOURCE_IO size so IIUC the ATU window setup may be compromised.
>

Are you suggesting that something like this [1] fixes the issue?

Indeed,I don't see the warning with this applied and wifi which is
connected via pcie is working. But I don't get why the offset should
be from the MEM resource instead of the IO resource.

[1] https://pastebin.com/FBj95gNR

Thanks,
 Enric

> Lorenzo
>
> > +     for (reg_no = 0; reg_no < (size >> 20); reg_no++) {
> >               err = rockchip_pcie_prog_ob_atu(rockchip,
> >                                               reg_no + 1 + offset,
> >                                               AXI_WRAPPER_IO_WRITE,
> >                                               20 - 1,
> > -                                             rockchip->io_bus_addr +
> > -                                             (reg_no << 20),
> > +                                             pci_addr + (reg_no << 20),
> >                                               0);
> >               if (err) {
> >                       dev_err(dev, "program RC io outbound ATU failed\n");
> > @@ -852,8 +867,7 @@ static int rockchip_pcie_cfg_atu(struct rockchip_pcie *rockchip)
> >                                 AXI_WRAPPER_NOR_MSG,
> >                                 20 - 1, 0, 0);
> >
> > -     rockchip->msg_bus_addr = rockchip->mem_bus_addr +
> > -                                     ((reg_no + offset) << 20);
> > +     rockchip->msg_bus_addr += ((reg_no + offset) << 20);
> >       return err;
> >  }
> >
> > @@ -951,7 +965,6 @@ static int rockchip_pcie_probe(struct platform_device *pdev)
> >       struct pci_bus *bus, *child;
> >       struct pci_host_bridge *bridge;
> >       struct resource *bus_res;
> > -     struct resource_entry *win;
> >       int err;
> >
> >       if (!dev->of_node)
> > @@ -997,27 +1010,6 @@ static int rockchip_pcie_probe(struct platform_device *pdev)
> >
> >       rockchip->root_bus_nr = bus_res->start;
> >
> > -     /* Get the I/O and memory ranges from DT */
> > -     resource_list_for_each_entry(win, &bridge->windows) {
> > -             switch (resource_type(win->res)) {
> > -             case IORESOURCE_IO:
> > -                     io = win->res;
> > -                     io->name = "I/O";
> > -                     rockchip->io_size = resource_size(io);
> > -                     rockchip->io_bus_addr = io->start - win->offset;
> > -                     rockchip->io = io;
> > -                     break;
> > -             case IORESOURCE_MEM:
> > -                     mem = win->res;
> > -                     mem->name = "MEM";
> > -                     rockchip->mem_size = resource_size(mem);
> > -                     rockchip->mem_bus_addr = mem->start - win->offset;
> > -                     break;
> > -             default:
> > -                     continue;
> > -             }
> > -     }
> > -
> >       err = rockchip_pcie_cfg_atu(rockchip);
> >       if (err)
> >               goto err_remove_irq_domain;
> > diff --git a/drivers/pci/controller/pcie-rockchip.h b/drivers/pci/controller/pcie-rockchip.h
> > index 8e87a059ce73..bef42a803b56 100644
> > --- a/drivers/pci/controller/pcie-rockchip.h
> > +++ b/drivers/pci/controller/pcie-rockchip.h
> > @@ -304,13 +304,8 @@ struct rockchip_pcie {
> >       struct  irq_domain *irq_domain;
> >       int     offset;
> >       struct pci_bus *root_bus;
> > -     struct resource *io;
> > -     phys_addr_t io_bus_addr;
> > -     u32     io_size;
> >       void    __iomem *msg_region;
> > -     u32     mem_size;
> >       phys_addr_t msg_bus_addr;
> > -     phys_addr_t mem_bus_addr;
> >       bool is_rc;
> >       struct resource *mem_res;
> >  };
> > --
> > 2.20.1
> >

^ permalink raw reply	[flat|nested] 49+ messages in thread

* Re: [PATCH v3 11/25] PCI: rockchip: Drop storing driver private outbound resource data
  2019-12-10 17:33     ` Enric Balletbo Serra
@ 2019-12-11  9:39       ` Enric Balletbo Serra
  0 siblings, 0 replies; 49+ messages in thread
From: Enric Balletbo Serra @ 2019-12-11  9:39 UTC (permalink / raw)
  To: Lorenzo Pieralisi
  Cc: Rob Herring, Andrew Murray, Bjorn Helgaas, linux-pci, Linux ARM,
	bcm-kernel-feedback-list, Christoph Hellwig, Gustavo Pimentel,
	Heiko Stuebner, Hou Zhiqiang, Jingoo Han, Karthikeyan Mitran,
	Ley Foon Tan, Linus Walleij,
	moderated list:ARM/Mediatek SoC support, linux-renesas-soc,
	open list:ARM/Rockchip SoC...,
	Matthias Brugger, Michal Simek, Ray Jui, rfi, Ryder Lee,
	Scott Branden, Shawn Lin, Simon Horman, Srinath Mannam,
	Thomas Petazzoni, Toan Le, Tom Joseph, Will Deacon

Hi,

Missatge de Enric Balletbo Serra <eballetbo@gmail.com> del dia dt., 10
de des. 2019 a les 18:33:
>
> Hi Lorenzo,
>
> Many thanks to look at this.
>
> Missatge de Lorenzo Pieralisi <lorenzo.pieralisi@arm.com> del dia dv.,
> 6 de des. 2019 a les 16:36:
> >
> > [+Eric]
> >
> > On Mon, Oct 28, 2019 at 11:32:42AM -0500, Rob Herring wrote:
> > > The Rockchip host bridge driver doesn't need to store outboard resources
> > > in its private struct as they are already stored in struct
> > > pci_host_bridge.
> > >
> > > Cc: Shawn Lin <shawn.lin@rock-chips.com>
> > > Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
> > > Cc: Andrew Murray <andrew.murray@arm.com>
> > > Cc: Bjorn Helgaas <bhelgaas@google.com>
> > > Cc: Heiko Stuebner <heiko@sntech.de>
> > > Cc: linux-rockchip@lists.infradead.org
> > > Signed-off-by: Rob Herring <robh@kernel.org>
> > > ---
> > >  drivers/pci/controller/pcie-rockchip-host.c | 54 +++++++++------------
> > >  drivers/pci/controller/pcie-rockchip.h      |  5 --
> > >  2 files changed, 23 insertions(+), 36 deletions(-)
> > >
> > > diff --git a/drivers/pci/controller/pcie-rockchip-host.c b/drivers/pci/controller/pcie-rockchip-host.c
> > > index 8d2e6f2e141e..f375e55ea02e 100644
> > > --- a/drivers/pci/controller/pcie-rockchip-host.c
> > > +++ b/drivers/pci/controller/pcie-rockchip-host.c
> > > @@ -806,19 +806,28 @@ static int rockchip_pcie_prog_ib_atu(struct rockchip_pcie *rockchip,
> > >  static int rockchip_pcie_cfg_atu(struct rockchip_pcie *rockchip)
> > >  {
> > >       struct device *dev = rockchip->dev;
> > > +     struct pci_host_bridge *bridge = pci_host_bridge_from_priv(rockchip);
> > > +     struct resource_entry *entry;
> > > +     u64 pci_addr, size;
> > >       int offset;
> > >       int err;
> > >       int reg_no;
> > >
> > >       rockchip_pcie_cfg_configuration_accesses(rockchip,
> > >                                                AXI_WRAPPER_TYPE0_CFG);
> > > +     entry = resource_list_first_type(&bridge->windows, IORESOURCE_MEM);
> > > +     if (!entry)
> > > +             return -ENODEV;
> > > +
> > > +     size = resource_size(entry->res);
> > > +     pci_addr = entry->res->start - entry->offset;
> > > +     rockchip->msg_bus_addr = pci_addr;
> > >
> > > -     for (reg_no = 0; reg_no < (rockchip->mem_size >> 20); reg_no++) {
> > > +     for (reg_no = 0; reg_no < (size >> 20); reg_no++) {
> > >               err = rockchip_pcie_prog_ob_atu(rockchip, reg_no + 1,
> > >                                               AXI_WRAPPER_MEM_WRITE,
> > >                                               20 - 1,
> > > -                                             rockchip->mem_bus_addr +
> > > -                                             (reg_no << 20),
> > > +                                             pci_addr + (reg_no << 20),
> > >                                               0);
> > >               if (err) {
> > >                       dev_err(dev, "program RC mem outbound ATU failed\n");
> > > @@ -832,14 +841,20 @@ static int rockchip_pcie_cfg_atu(struct rockchip_pcie *rockchip)
> > >               return err;
> > >       }
> > >
> > > -     offset = rockchip->mem_size >> 20;
> > > -     for (reg_no = 0; reg_no < (rockchip->io_size >> 20); reg_no++) {
> > > +     entry = resource_list_first_type(&bridge->windows, IORESOURCE_IO);
> > > +     if (!entry)
> > > +             return -ENODEV;
> > > +
> > > +     size = resource_size(entry->res);
> > > +     pci_addr = entry->res->start - entry->offset;
> > > +
> > > +     offset = size >> 20;
> >
> > Just trying to find what triggers:
> >
> > https://lore.kernel.org/linux-pci/CAFqH_52BiQJzNEzd_0pB3K+JmzVOVikYQo0xfiC0J-DwiXdtqw@mail.gmail.com/T/#u
> >
> > I think this offset calculation changed the behaviour:
> >
> > Before:
> >
> > > -     offset = rockchip->mem_size >> 20;
> >
> > Now:
> >
> > > +     offset = size >> 20;
> >
> > size must be the IORESOURCE_MEM resource size instead we are using the
> > IORESOURCE_IO size so IIUC the ATU window setup may be compromised.
> >
>
> Are you suggesting that something like this [1] fixes the issue?
>
> Indeed,I don't see the warning with this applied and wifi which is
> connected via pcie is working. But I don't get why the offset should
> be from the MEM resource instead of the IO resource.
>
> [1] https://pastebin.com/FBj95gNR
>

I think I understood, so I send a fix [2] for this

[2] https://lkml.org/lkml/2019/12/11/199

Thanks,
 Enric

> Thanks,
>  Enric
>
> > Lorenzo
> >
> > > +     for (reg_no = 0; reg_no < (size >> 20); reg_no++) {
> > >               err = rockchip_pcie_prog_ob_atu(rockchip,
> > >                                               reg_no + 1 + offset,
> > >                                               AXI_WRAPPER_IO_WRITE,
> > >                                               20 - 1,
> > > -                                             rockchip->io_bus_addr +
> > > -                                             (reg_no << 20),
> > > +                                             pci_addr + (reg_no << 20),
> > >                                               0);
> > >               if (err) {
> > >                       dev_err(dev, "program RC io outbound ATU failed\n");
> > > @@ -852,8 +867,7 @@ static int rockchip_pcie_cfg_atu(struct rockchip_pcie *rockchip)
> > >                                 AXI_WRAPPER_NOR_MSG,
> > >                                 20 - 1, 0, 0);
> > >
> > > -     rockchip->msg_bus_addr = rockchip->mem_bus_addr +
> > > -                                     ((reg_no + offset) << 20);
> > > +     rockchip->msg_bus_addr += ((reg_no + offset) << 20);
> > >       return err;
> > >  }
> > >
> > > @@ -951,7 +965,6 @@ static int rockchip_pcie_probe(struct platform_device *pdev)
> > >       struct pci_bus *bus, *child;
> > >       struct pci_host_bridge *bridge;
> > >       struct resource *bus_res;
> > > -     struct resource_entry *win;
> > >       int err;
> > >
> > >       if (!dev->of_node)
> > > @@ -997,27 +1010,6 @@ static int rockchip_pcie_probe(struct platform_device *pdev)
> > >
> > >       rockchip->root_bus_nr = bus_res->start;
> > >
> > > -     /* Get the I/O and memory ranges from DT */
> > > -     resource_list_for_each_entry(win, &bridge->windows) {
> > > -             switch (resource_type(win->res)) {
> > > -             case IORESOURCE_IO:
> > > -                     io = win->res;
> > > -                     io->name = "I/O";
> > > -                     rockchip->io_size = resource_size(io);
> > > -                     rockchip->io_bus_addr = io->start - win->offset;
> > > -                     rockchip->io = io;
> > > -                     break;
> > > -             case IORESOURCE_MEM:
> > > -                     mem = win->res;
> > > -                     mem->name = "MEM";
> > > -                     rockchip->mem_size = resource_size(mem);
> > > -                     rockchip->mem_bus_addr = mem->start - win->offset;
> > > -                     break;
> > > -             default:
> > > -                     continue;
> > > -             }
> > > -     }
> > > -
> > >       err = rockchip_pcie_cfg_atu(rockchip);
> > >       if (err)
> > >               goto err_remove_irq_domain;
> > > diff --git a/drivers/pci/controller/pcie-rockchip.h b/drivers/pci/controller/pcie-rockchip.h
> > > index 8e87a059ce73..bef42a803b56 100644
> > > --- a/drivers/pci/controller/pcie-rockchip.h
> > > +++ b/drivers/pci/controller/pcie-rockchip.h
> > > @@ -304,13 +304,8 @@ struct rockchip_pcie {
> > >       struct  irq_domain *irq_domain;
> > >       int     offset;
> > >       struct pci_bus *root_bus;
> > > -     struct resource *io;
> > > -     phys_addr_t io_bus_addr;
> > > -     u32     io_size;
> > >       void    __iomem *msg_region;
> > > -     u32     mem_size;
> > >       phys_addr_t msg_bus_addr;
> > > -     phys_addr_t mem_bus_addr;
> > >       bool is_rc;
> > >       struct resource *mem_res;
> > >  };
> > > --
> > > 2.20.1
> > >

^ permalink raw reply	[flat|nested] 49+ messages in thread

end of thread, other threads:[~2019-12-11  9:39 UTC | newest]

Thread overview: 49+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-10-28 16:32 [PATCH v3 00/25] PCI host resource consolidation Rob Herring
2019-10-28 16:32 ` [PATCH v3 01/25] resource: Add a resource_list_first_type helper Rob Herring
2019-10-28 16:32 ` [PATCH v3 02/25] PCI: Export pci_parse_request_of_pci_ranges() Rob Herring
2019-10-28 16:32 ` [PATCH v3 03/25] PCI: aardvark: Use pci_parse_request_of_pci_ranges() Rob Herring
2019-10-28 16:32 ` [PATCH v3 04/25] PCI: altera: " Rob Herring
2019-10-28 16:32 ` [PATCH v3 05/25] PCI: dwc: " Rob Herring
2019-10-28 16:32 ` [PATCH v3 06/25] PCI: faraday: " Rob Herring
2019-11-03 19:12   ` Linus Walleij
2019-10-28 16:32 ` [PATCH v3 07/25] PCI: iproc: " Rob Herring
2019-10-29 15:58   ` Srinath Mannam
2019-10-29 17:09     ` Florian Fainelli
2019-10-28 16:32 ` [PATCH v3 08/25] PCI: mediatek: " Rob Herring
2019-10-28 16:32 ` [PATCH v3 09/25] PCI: mobiveil: " Rob Herring
2019-10-29  9:00   ` Z.q. Hou
2019-10-28 16:32 ` [PATCH v3 10/25] PCI: rockchip: " Rob Herring
2019-12-05 17:56   ` Enric Balletbo Serra
2019-12-06 13:52     ` Lorenzo Pieralisi
2019-12-06 14:09     ` Lorenzo Pieralisi
2019-12-06 14:59       ` Enric Balletbo Serra
2019-10-28 16:32 ` [PATCH v3 11/25] PCI: rockchip: Drop storing driver private outbound resource data Rob Herring
2019-12-06 15:36   ` Lorenzo Pieralisi
2019-12-10 17:33     ` Enric Balletbo Serra
2019-12-11  9:39       ` Enric Balletbo Serra
2019-10-28 16:32 ` [PATCH v3 12/25] PCI: v3-semi: Use pci_parse_request_of_pci_ranges() Rob Herring
2019-10-28 16:32 ` [PATCH v3 13/25] PCI: xgene: " Rob Herring
2019-10-28 16:32 ` [PATCH v3 14/25] PCI: xilinx: " Rob Herring
2019-10-28 16:32 ` [PATCH v3 15/25] PCI: xilinx-nwl: " Rob Herring
2019-10-28 16:32 ` [PATCH v3 16/25] PCI: versatile: " Rob Herring
2019-10-28 16:32 ` [PATCH v3 17/25] PCI: versatile: Remove usage of PHYS_OFFSET Rob Herring
2019-10-28 16:32 ` [PATCH v3 18/25] PCI: versatile: Enable COMPILE_TEST Rob Herring
2019-10-28 16:32 ` [PATCH v3 19/25] PCI: of: Add inbound resource parsing to helpers Rob Herring
2019-10-29 11:07   ` Lorenzo Pieralisi
2019-10-29 15:56     ` Srinath Mannam
2019-10-29 17:34       ` Lorenzo Pieralisi
2019-10-30  6:44         ` Srinath Mannam
2019-10-30 11:48           ` Lorenzo Pieralisi
2019-10-30 12:49             ` Robin Murphy
2019-10-30 14:56               ` Lorenzo Pieralisi
2019-10-30 22:18                 ` Rob Herring
2019-10-31 10:09                   ` Lorenzo Pieralisi
2019-10-29 22:12     ` Bjorn Helgaas
2019-10-28 16:32 ` [PATCH v3 20/25] PCI: ftpci100: Use inbound resources for setup Rob Herring
2019-10-28 16:32 ` [PATCH v3 21/25] PCI: v3-semi: " Rob Herring
2019-10-28 16:32 ` [PATCH v3 22/25] PCI: xgene: " Rob Herring
2019-10-28 16:32 ` [PATCH v3 23/25] PCI: iproc: " Rob Herring
2019-10-29 15:59   ` Srinath Mannam
2019-10-28 16:32 ` [PATCH v3 24/25] PCI: rcar: " Rob Herring
2019-10-28 16:32 ` [PATCH v3 25/25] PCI: Make devm_of_pci_get_host_bridge_resources() static Rob Herring
2019-10-31 10:57 ` [PATCH v3 00/25] PCI host resource consolidation Lorenzo Pieralisi

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).