All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] Store PCIe controllers address in struct of_pci_range
@ 2015-07-10  8:48 ` Gabriele Paoloni
  0 siblings, 0 replies; 11+ messages in thread
From: Gabriele Paoloni @ 2015-07-10  8:48 UTC (permalink / raw)
  To: gabriele.paoloni, arnd, lorenzo.pieralisi, wangzhou1, bhelgaas,
	robh+dt, james.morse, Liviu.Dudau
  Cc: linux-pci, linux-arm-kernel, devicetree, yuanzhichang, zhudacai,
	zhangjukuo, qiuzhenfa, liguozhu

From: gabriele paoloni <gabriele.paoloni@huawei.com>

This patch is needed port PCIe designware to new DT parsing API
As discussed in
http://lists.infradead.org/pipermail/linux-arm-kernel/2015-January/317743.html
in designware we have a problem as the PCI addresses in the PCIe controller
address space are required in order to perform correct HW operation.

In order to solve this problem commit
f4c55c5a3f7f68c06cc559ed7af8b2d017cbb0a7 "PCI: designware:
Program ATU with untranslated address" added code to read the PCIe
controller start address directly from the DT ranges.

In the new DT parsing API of_pci_get_host_bridge_resources() hides the
DT parser from the host controller drivers, so it is not possible
for drivers to parse values directly from the DT.

In http://www.spinics.net/lists/linux-pci/msg42540.html we already tried
to use the new DT parsing API but there is a bug (obviously) in setting
the <*>_mod_base addresses
Applying this patch we can easily set "<*>_mod_base = win->__res.start"

This patch adds a new field in "struct of_pci_range" to store the
pci controller start address; it fills the field in of_pci_range_parser_one();
in of_pci_get_host_bridge_resources() it retrieve the resource entry
after it is created and added to the resource list and uses
entry->__res.start to store the pci controller address

the patch is based on 4.2-rc1

Signed-off-by: Gabriele Paoloni <gabriele.paoloni@huawei.com>
---
 drivers/of/address.c               | 1 +
 drivers/of/of_pci.c                | 4 ++++
 drivers/pci/host/pcie-designware.c | 9 +++------
 include/linux/of_address.h         | 1 +
 4 files changed, 9 insertions(+), 6 deletions(-)

diff --git a/drivers/of/address.c b/drivers/of/address.c
index 8bfda6a..52f9321 100644
--- a/drivers/of/address.c
+++ b/drivers/of/address.c
@@ -265,6 +265,7 @@ struct of_pci_range *of_pci_range_parser_one(struct of_pci_range_parser *parser,
 	range->pci_addr = of_read_number(parser->range + 1, ns);
 	range->cpu_addr = of_translate_address(parser->node,
 				parser->range + na);
+	range->pci_ctrl_addr = of_read_number(parser->range + na, ns);
 	range->size = of_read_number(parser->range + parser->pna + na, ns);
 
 	parser->range += parser->np;
diff --git a/drivers/of/of_pci.c b/drivers/of/of_pci.c
index 5751dc5..2ccc749 100644
--- a/drivers/of/of_pci.c
+++ b/drivers/of/of_pci.c
@@ -198,6 +198,7 @@ int of_pci_get_host_bridge_resources(struct device_node *dev,
 
 	pr_debug("Parsing ranges property...\n");
 	for_each_of_pci_range(&parser, &range) {
+		struct resource_entry *entry;
 		/* Read next ranges element */
 		if ((range.flags & IORESOURCE_TYPE_BITS) == IORESOURCE_IO)
 			snprintf(range_type, 4, " IO");
@@ -240,6 +241,9 @@ int of_pci_get_host_bridge_resources(struct device_node *dev,
 		}
 
 		pci_add_resource_offset(resources, res,	res->start - range.pci_addr);
+		entry = list_last_entry(resources, struct resource_entry, node);
+		/*we are using __res for storing the PCI controller address*/
+		entry->__res.start = range.pci_ctrl_addr;
 	}
 
 	return 0;
diff --git a/drivers/pci/host/pcie-designware.c b/drivers/pci/host/pcie-designware.c
index 69486be..106dae6 100644
--- a/drivers/pci/host/pcie-designware.c
+++ b/drivers/pci/host/pcie-designware.c
@@ -416,8 +416,7 @@ int dw_pcie_host_init(struct pcie_port *pp)
 			pp->io_base = range.cpu_addr;
 
 			/* Find the untranslated IO space address */
-			pp->io_mod_base = of_read_number(parser.range -
-							 parser.np + na, ns);
+			pp->io_mod_base = range.pci_ctrl_addr;
 		}
 		if (restype == IORESOURCE_MEM) {
 			of_pci_range_to_resource(&range, np, &pp->mem);
@@ -426,8 +425,7 @@ int dw_pcie_host_init(struct pcie_port *pp)
 			pp->mem_bus_addr = range.pci_addr;
 
 			/* Find the untranslated MEM space address */
-			pp->mem_mod_base = of_read_number(parser.range -
-							  parser.np + na, ns);
+			pp->mem_mod_base = range.pci_ctrl_addr;
 		}
 		if (restype == 0) {
 			of_pci_range_to_resource(&range, np, &pp->cfg);
@@ -437,8 +435,7 @@ int dw_pcie_host_init(struct pcie_port *pp)
 			pp->cfg1_base = pp->cfg.start + pp->cfg0_size;
 
 			/* Find the untranslated configuration space address */
-			pp->cfg0_mod_base = of_read_number(parser.range -
-							   parser.np + na, ns);
+			pp->cfg0_mod_base = range.pci_ctrl_addr;
 			pp->cfg1_mod_base = pp->cfg0_mod_base +
 					    pp->cfg0_size;
 		}
diff --git a/include/linux/of_address.h b/include/linux/of_address.h
index d88e81b..55bb1ae 100644
--- a/include/linux/of_address.h
+++ b/include/linux/of_address.h
@@ -16,6 +16,7 @@ struct of_pci_range {
 	u32 pci_space;
 	u64 pci_addr;
 	u64 cpu_addr;
+	u64 pci_ctrl_addr;
 	u64 size;
 	u32 flags;
 };
-- 
1.9.1

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

* [PATCH] Store PCIe controllers address in struct of_pci_range
@ 2015-07-10  8:48 ` Gabriele Paoloni
  0 siblings, 0 replies; 11+ messages in thread
From: Gabriele Paoloni @ 2015-07-10  8:48 UTC (permalink / raw)
  To: gabriele.paoloni, arnd, lorenzo.pieralisi, wangzhou1, bhelgaas,
	robh+dt, james.morse, Liviu.Dudau
  Cc: linux-pci, linux-arm-kernel, devicetree, yuanzhichang, zhudacai,
	zhangjukuo, qiuzhenfa, liguozhu

From: gabriele paoloni <gabriele.paoloni@huawei.com>

This patch is needed port PCIe designware to new DT parsing API
As discussed in
http://lists.infradead.org/pipermail/linux-arm-kernel/2015-January/317743.html
in designware we have a problem as the PCI addresses in the PCIe controller
address space are required in order to perform correct HW operation.

In order to solve this problem commit
f4c55c5a3f7f68c06cc559ed7af8b2d017cbb0a7 "PCI: designware:
Program ATU with untranslated address" added code to read the PCIe
controller start address directly from the DT ranges.

In the new DT parsing API of_pci_get_host_bridge_resources() hides the
DT parser from the host controller drivers, so it is not possible
for drivers to parse values directly from the DT.

In http://www.spinics.net/lists/linux-pci/msg42540.html we already tried
to use the new DT parsing API but there is a bug (obviously) in setting
the <*>_mod_base addresses
Applying this patch we can easily set "<*>_mod_base = win->__res.start"

This patch adds a new field in "struct of_pci_range" to store the
pci controller start address; it fills the field in of_pci_range_parser_one();
in of_pci_get_host_bridge_resources() it retrieve the resource entry
after it is created and added to the resource list and uses
entry->__res.start to store the pci controller address

the patch is based on 4.2-rc1

Signed-off-by: Gabriele Paoloni <gabriele.paoloni@huawei.com>
---
 drivers/of/address.c               | 1 +
 drivers/of/of_pci.c                | 4 ++++
 drivers/pci/host/pcie-designware.c | 9 +++------
 include/linux/of_address.h         | 1 +
 4 files changed, 9 insertions(+), 6 deletions(-)

diff --git a/drivers/of/address.c b/drivers/of/address.c
index 8bfda6a..52f9321 100644
--- a/drivers/of/address.c
+++ b/drivers/of/address.c
@@ -265,6 +265,7 @@ struct of_pci_range *of_pci_range_parser_one(struct of_pci_range_parser *parser,
 	range->pci_addr = of_read_number(parser->range + 1, ns);
 	range->cpu_addr = of_translate_address(parser->node,
 				parser->range + na);
+	range->pci_ctrl_addr = of_read_number(parser->range + na, ns);
 	range->size = of_read_number(parser->range + parser->pna + na, ns);
 
 	parser->range += parser->np;
diff --git a/drivers/of/of_pci.c b/drivers/of/of_pci.c
index 5751dc5..2ccc749 100644
--- a/drivers/of/of_pci.c
+++ b/drivers/of/of_pci.c
@@ -198,6 +198,7 @@ int of_pci_get_host_bridge_resources(struct device_node *dev,
 
 	pr_debug("Parsing ranges property...\n");
 	for_each_of_pci_range(&parser, &range) {
+		struct resource_entry *entry;
 		/* Read next ranges element */
 		if ((range.flags & IORESOURCE_TYPE_BITS) == IORESOURCE_IO)
 			snprintf(range_type, 4, " IO");
@@ -240,6 +241,9 @@ int of_pci_get_host_bridge_resources(struct device_node *dev,
 		}
 
 		pci_add_resource_offset(resources, res,	res->start - range.pci_addr);
+		entry = list_last_entry(resources, struct resource_entry, node);
+		/*we are using __res for storing the PCI controller address*/
+		entry->__res.start = range.pci_ctrl_addr;
 	}
 
 	return 0;
diff --git a/drivers/pci/host/pcie-designware.c b/drivers/pci/host/pcie-designware.c
index 69486be..106dae6 100644
--- a/drivers/pci/host/pcie-designware.c
+++ b/drivers/pci/host/pcie-designware.c
@@ -416,8 +416,7 @@ int dw_pcie_host_init(struct pcie_port *pp)
 			pp->io_base = range.cpu_addr;
 
 			/* Find the untranslated IO space address */
-			pp->io_mod_base = of_read_number(parser.range -
-							 parser.np + na, ns);
+			pp->io_mod_base = range.pci_ctrl_addr;
 		}
 		if (restype == IORESOURCE_MEM) {
 			of_pci_range_to_resource(&range, np, &pp->mem);
@@ -426,8 +425,7 @@ int dw_pcie_host_init(struct pcie_port *pp)
 			pp->mem_bus_addr = range.pci_addr;
 
 			/* Find the untranslated MEM space address */
-			pp->mem_mod_base = of_read_number(parser.range -
-							  parser.np + na, ns);
+			pp->mem_mod_base = range.pci_ctrl_addr;
 		}
 		if (restype == 0) {
 			of_pci_range_to_resource(&range, np, &pp->cfg);
@@ -437,8 +435,7 @@ int dw_pcie_host_init(struct pcie_port *pp)
 			pp->cfg1_base = pp->cfg.start + pp->cfg0_size;
 
 			/* Find the untranslated configuration space address */
-			pp->cfg0_mod_base = of_read_number(parser.range -
-							   parser.np + na, ns);
+			pp->cfg0_mod_base = range.pci_ctrl_addr;
 			pp->cfg1_mod_base = pp->cfg0_mod_base +
 					    pp->cfg0_size;
 		}
diff --git a/include/linux/of_address.h b/include/linux/of_address.h
index d88e81b..55bb1ae 100644
--- a/include/linux/of_address.h
+++ b/include/linux/of_address.h
@@ -16,6 +16,7 @@ struct of_pci_range {
 	u32 pci_space;
 	u64 pci_addr;
 	u64 cpu_addr;
+	u64 pci_ctrl_addr;
 	u64 size;
 	u32 flags;
 };
-- 
1.9.1


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

* [PATCH] Store PCIe controllers address in struct of_pci_range
@ 2015-07-10  8:48 ` Gabriele Paoloni
  0 siblings, 0 replies; 11+ messages in thread
From: Gabriele Paoloni @ 2015-07-10  8:48 UTC (permalink / raw)
  To: linux-arm-kernel

From: gabriele paoloni <gabriele.paoloni@huawei.com>

This patch is needed port PCIe designware to new DT parsing API
As discussed in
http://lists.infradead.org/pipermail/linux-arm-kernel/2015-January/317743.html
in designware we have a problem as the PCI addresses in the PCIe controller
address space are required in order to perform correct HW operation.

In order to solve this problem commit
f4c55c5a3f7f68c06cc559ed7af8b2d017cbb0a7 "PCI: designware:
Program ATU with untranslated address" added code to read the PCIe
controller start address directly from the DT ranges.

In the new DT parsing API of_pci_get_host_bridge_resources() hides the
DT parser from the host controller drivers, so it is not possible
for drivers to parse values directly from the DT.

In http://www.spinics.net/lists/linux-pci/msg42540.html we already tried
to use the new DT parsing API but there is a bug (obviously) in setting
the <*>_mod_base addresses
Applying this patch we can easily set "<*>_mod_base = win->__res.start"

This patch adds a new field in "struct of_pci_range" to store the
pci controller start address; it fills the field in of_pci_range_parser_one();
in of_pci_get_host_bridge_resources() it retrieve the resource entry
after it is created and added to the resource list and uses
entry->__res.start to store the pci controller address

the patch is based on 4.2-rc1

Signed-off-by: Gabriele Paoloni <gabriele.paoloni@huawei.com>
---
 drivers/of/address.c               | 1 +
 drivers/of/of_pci.c                | 4 ++++
 drivers/pci/host/pcie-designware.c | 9 +++------
 include/linux/of_address.h         | 1 +
 4 files changed, 9 insertions(+), 6 deletions(-)

diff --git a/drivers/of/address.c b/drivers/of/address.c
index 8bfda6a..52f9321 100644
--- a/drivers/of/address.c
+++ b/drivers/of/address.c
@@ -265,6 +265,7 @@ struct of_pci_range *of_pci_range_parser_one(struct of_pci_range_parser *parser,
 	range->pci_addr = of_read_number(parser->range + 1, ns);
 	range->cpu_addr = of_translate_address(parser->node,
 				parser->range + na);
+	range->pci_ctrl_addr = of_read_number(parser->range + na, ns);
 	range->size = of_read_number(parser->range + parser->pna + na, ns);
 
 	parser->range += parser->np;
diff --git a/drivers/of/of_pci.c b/drivers/of/of_pci.c
index 5751dc5..2ccc749 100644
--- a/drivers/of/of_pci.c
+++ b/drivers/of/of_pci.c
@@ -198,6 +198,7 @@ int of_pci_get_host_bridge_resources(struct device_node *dev,
 
 	pr_debug("Parsing ranges property...\n");
 	for_each_of_pci_range(&parser, &range) {
+		struct resource_entry *entry;
 		/* Read next ranges element */
 		if ((range.flags & IORESOURCE_TYPE_BITS) == IORESOURCE_IO)
 			snprintf(range_type, 4, " IO");
@@ -240,6 +241,9 @@ int of_pci_get_host_bridge_resources(struct device_node *dev,
 		}
 
 		pci_add_resource_offset(resources, res,	res->start - range.pci_addr);
+		entry = list_last_entry(resources, struct resource_entry, node);
+		/*we are using __res for storing the PCI controller address*/
+		entry->__res.start = range.pci_ctrl_addr;
 	}
 
 	return 0;
diff --git a/drivers/pci/host/pcie-designware.c b/drivers/pci/host/pcie-designware.c
index 69486be..106dae6 100644
--- a/drivers/pci/host/pcie-designware.c
+++ b/drivers/pci/host/pcie-designware.c
@@ -416,8 +416,7 @@ int dw_pcie_host_init(struct pcie_port *pp)
 			pp->io_base = range.cpu_addr;
 
 			/* Find the untranslated IO space address */
-			pp->io_mod_base = of_read_number(parser.range -
-							 parser.np + na, ns);
+			pp->io_mod_base = range.pci_ctrl_addr;
 		}
 		if (restype == IORESOURCE_MEM) {
 			of_pci_range_to_resource(&range, np, &pp->mem);
@@ -426,8 +425,7 @@ int dw_pcie_host_init(struct pcie_port *pp)
 			pp->mem_bus_addr = range.pci_addr;
 
 			/* Find the untranslated MEM space address */
-			pp->mem_mod_base = of_read_number(parser.range -
-							  parser.np + na, ns);
+			pp->mem_mod_base = range.pci_ctrl_addr;
 		}
 		if (restype == 0) {
 			of_pci_range_to_resource(&range, np, &pp->cfg);
@@ -437,8 +435,7 @@ int dw_pcie_host_init(struct pcie_port *pp)
 			pp->cfg1_base = pp->cfg.start + pp->cfg0_size;
 
 			/* Find the untranslated configuration space address */
-			pp->cfg0_mod_base = of_read_number(parser.range -
-							   parser.np + na, ns);
+			pp->cfg0_mod_base = range.pci_ctrl_addr;
 			pp->cfg1_mod_base = pp->cfg0_mod_base +
 					    pp->cfg0_size;
 		}
diff --git a/include/linux/of_address.h b/include/linux/of_address.h
index d88e81b..55bb1ae 100644
--- a/include/linux/of_address.h
+++ b/include/linux/of_address.h
@@ -16,6 +16,7 @@ struct of_pci_range {
 	u32 pci_space;
 	u64 pci_addr;
 	u64 cpu_addr;
+	u64 pci_ctrl_addr;
 	u64 size;
 	u32 flags;
 };
-- 
1.9.1

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

* Re: [PATCH] Store PCIe controllers address in struct of_pci_range
  2015-07-10  8:48 ` Gabriele Paoloni
@ 2015-07-10 19:56   ` Rob Herring
  -1 siblings, 0 replies; 11+ messages in thread
From: Rob Herring @ 2015-07-10 19:56 UTC (permalink / raw)
  To: Gabriele Paoloni
  Cc: Arnd Bergmann, Lorenzo Pieralisi, wangzhou1, Bjorn Helgaas,
	Rob Herring, james.morse, Liviu Dudau, linux-pci,
	linux-arm-kernel, devicetree, yuanzhichang, zhudacai, zhangjukuo,
	qiuzhenfa, liguozhu

On Fri, Jul 10, 2015 at 3:48 AM, Gabriele Paoloni
<gabriele.paoloni@huawei.com> wrote:
> From: gabriele paoloni <gabriele.paoloni@huawei.com>
>
> This patch is needed port PCIe designware to new DT parsing API
> As discussed in
> http://lists.infradead.org/pipermail/linux-arm-kernel/2015-January/317743.html
> in designware we have a problem as the PCI addresses in the PCIe controller
> address space are required in order to perform correct HW operation.
>
> In order to solve this problem commit
> f4c55c5a3f7f68c06cc559ed7af8b2d017cbb0a7 "PCI: designware:

Please abbreviate hashs to 12 characters.

> Program ATU with untranslated address" added code to read the PCIe
> controller start address directly from the DT ranges.
>
> In the new DT parsing API of_pci_get_host_bridge_resources() hides the
> DT parser from the host controller drivers, so it is not possible
> for drivers to parse values directly from the DT.
>
> In http://www.spinics.net/lists/linux-pci/msg42540.html we already tried
> to use the new DT parsing API but there is a bug (obviously) in setting
> the <*>_mod_base addresses
> Applying this patch we can easily set "<*>_mod_base = win->__res.start"
>
> This patch adds a new field in "struct of_pci_range" to store the
> pci controller start address; it fills the field in of_pci_range_parser_one();
> in of_pci_get_host_bridge_resources() it retrieve the resource entry
> after it is created and added to the resource list and uses
> entry->__res.start to store the pci controller address
>
> the patch is based on 4.2-rc1
>
> Signed-off-by: Gabriele Paoloni <gabriele.paoloni@huawei.com>
> ---
>  drivers/of/address.c               | 1 +
>  drivers/of/of_pci.c                | 4 ++++
>  drivers/pci/host/pcie-designware.c | 9 +++------
>  include/linux/of_address.h         | 1 +
>  4 files changed, 9 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/of/address.c b/drivers/of/address.c
> index 8bfda6a..52f9321 100644
> --- a/drivers/of/address.c
> +++ b/drivers/of/address.c
> @@ -265,6 +265,7 @@ struct of_pci_range *of_pci_range_parser_one(struct of_pci_range_parser *parser,
>         range->pci_addr = of_read_number(parser->range + 1, ns);
>         range->cpu_addr = of_translate_address(parser->node,
>                                 parser->range + na);
> +       range->pci_ctrl_addr = of_read_number(parser->range + na, ns);

This is wrong as the correct size to read is not "ns", but the parent
bus #size-cells value.

I think "bus_addr" would be a better name. It is not the PCI
controller's address (i.e. what is in reg prop). No "pci" because it
has nothing to do with PCI bus addresses.

In general, this seems fragile as the dt address ranges/translation
may not align with the h/w ranges. For example, what if you have 2
levels of translations and you happen to need it translated with just
1 level of translation. That said, I don't really have a better
suggestion and I guess we can deal with that case if needed later.

>         range->size = of_read_number(parser->range + parser->pna + na, ns);
>
>         parser->range += parser->np;
> diff --git a/drivers/of/of_pci.c b/drivers/of/of_pci.c
> index 5751dc5..2ccc749 100644
> --- a/drivers/of/of_pci.c
> +++ b/drivers/of/of_pci.c
> @@ -198,6 +198,7 @@ int of_pci_get_host_bridge_resources(struct device_node *dev,
>
>         pr_debug("Parsing ranges property...\n");
>         for_each_of_pci_range(&parser, &range) {
> +               struct resource_entry *entry;
>                 /* Read next ranges element */
>                 if ((range.flags & IORESOURCE_TYPE_BITS) == IORESOURCE_IO)
>                         snprintf(range_type, 4, " IO");
> @@ -240,6 +241,9 @@ int of_pci_get_host_bridge_resources(struct device_node *dev,
>                 }
>
>                 pci_add_resource_offset(resources, res, res->start - range.pci_addr);
> +               entry = list_last_entry(resources, struct resource_entry, node);
> +               /*we are using __res for storing the PCI controller address*/
> +               entry->__res.start = range.pci_ctrl_addr;

You will use this in a follow-up patch? I'd like to see this just
split into core changes and DW changes. This looks like you are making
intermediate DW changes which will be removed in subsequent patches.

Rob

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

* [PATCH] Store PCIe controllers address in struct of_pci_range
@ 2015-07-10 19:56   ` Rob Herring
  0 siblings, 0 replies; 11+ messages in thread
From: Rob Herring @ 2015-07-10 19:56 UTC (permalink / raw)
  To: linux-arm-kernel

On Fri, Jul 10, 2015 at 3:48 AM, Gabriele Paoloni
<gabriele.paoloni@huawei.com> wrote:
> From: gabriele paoloni <gabriele.paoloni@huawei.com>
>
> This patch is needed port PCIe designware to new DT parsing API
> As discussed in
> http://lists.infradead.org/pipermail/linux-arm-kernel/2015-January/317743.html
> in designware we have a problem as the PCI addresses in the PCIe controller
> address space are required in order to perform correct HW operation.
>
> In order to solve this problem commit
> f4c55c5a3f7f68c06cc559ed7af8b2d017cbb0a7 "PCI: designware:

Please abbreviate hashs to 12 characters.

> Program ATU with untranslated address" added code to read the PCIe
> controller start address directly from the DT ranges.
>
> In the new DT parsing API of_pci_get_host_bridge_resources() hides the
> DT parser from the host controller drivers, so it is not possible
> for drivers to parse values directly from the DT.
>
> In http://www.spinics.net/lists/linux-pci/msg42540.html we already tried
> to use the new DT parsing API but there is a bug (obviously) in setting
> the <*>_mod_base addresses
> Applying this patch we can easily set "<*>_mod_base = win->__res.start"
>
> This patch adds a new field in "struct of_pci_range" to store the
> pci controller start address; it fills the field in of_pci_range_parser_one();
> in of_pci_get_host_bridge_resources() it retrieve the resource entry
> after it is created and added to the resource list and uses
> entry->__res.start to store the pci controller address
>
> the patch is based on 4.2-rc1
>
> Signed-off-by: Gabriele Paoloni <gabriele.paoloni@huawei.com>
> ---
>  drivers/of/address.c               | 1 +
>  drivers/of/of_pci.c                | 4 ++++
>  drivers/pci/host/pcie-designware.c | 9 +++------
>  include/linux/of_address.h         | 1 +
>  4 files changed, 9 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/of/address.c b/drivers/of/address.c
> index 8bfda6a..52f9321 100644
> --- a/drivers/of/address.c
> +++ b/drivers/of/address.c
> @@ -265,6 +265,7 @@ struct of_pci_range *of_pci_range_parser_one(struct of_pci_range_parser *parser,
>         range->pci_addr = of_read_number(parser->range + 1, ns);
>         range->cpu_addr = of_translate_address(parser->node,
>                                 parser->range + na);
> +       range->pci_ctrl_addr = of_read_number(parser->range + na, ns);

This is wrong as the correct size to read is not "ns", but the parent
bus #size-cells value.

I think "bus_addr" would be a better name. It is not the PCI
controller's address (i.e. what is in reg prop). No "pci" because it
has nothing to do with PCI bus addresses.

In general, this seems fragile as the dt address ranges/translation
may not align with the h/w ranges. For example, what if you have 2
levels of translations and you happen to need it translated with just
1 level of translation. That said, I don't really have a better
suggestion and I guess we can deal with that case if needed later.

>         range->size = of_read_number(parser->range + parser->pna + na, ns);
>
>         parser->range += parser->np;
> diff --git a/drivers/of/of_pci.c b/drivers/of/of_pci.c
> index 5751dc5..2ccc749 100644
> --- a/drivers/of/of_pci.c
> +++ b/drivers/of/of_pci.c
> @@ -198,6 +198,7 @@ int of_pci_get_host_bridge_resources(struct device_node *dev,
>
>         pr_debug("Parsing ranges property...\n");
>         for_each_of_pci_range(&parser, &range) {
> +               struct resource_entry *entry;
>                 /* Read next ranges element */
>                 if ((range.flags & IORESOURCE_TYPE_BITS) == IORESOURCE_IO)
>                         snprintf(range_type, 4, " IO");
> @@ -240,6 +241,9 @@ int of_pci_get_host_bridge_resources(struct device_node *dev,
>                 }
>
>                 pci_add_resource_offset(resources, res, res->start - range.pci_addr);
> +               entry = list_last_entry(resources, struct resource_entry, node);
> +               /*we are using __res for storing the PCI controller address*/
> +               entry->__res.start = range.pci_ctrl_addr;

You will use this in a follow-up patch? I'd like to see this just
split into core changes and DW changes. This looks like you are making
intermediate DW changes which will be removed in subsequent patches.

Rob

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

* RE: [PATCH] Store PCIe controllers address in struct of_pci_range
  2015-07-10 19:56   ` Rob Herring
  (?)
@ 2015-07-13 11:07     ` Gabriele Paoloni
  -1 siblings, 0 replies; 11+ messages in thread
From: Gabriele Paoloni @ 2015-07-13 11:07 UTC (permalink / raw)
  To: Rob Herring
  Cc: Arnd Bergmann, Lorenzo Pieralisi, Wangzhou (B),
	Bjorn Helgaas, Rob Herring, james.morse, Liviu Dudau, linux-pci,
	linux-arm-kernel, devicetree, Yuanzhichang, Zhudacai, zhangjukuo,
	qiuzhenfa, Liguozhu (Kenneth)

Hi Rob

Many Thanks for your review

> -----Original Message-----
> From: Rob Herring [mailto:robherring2@gmail.com]
> Sent: Friday, July 10, 2015 8:56 PM
> To: Gabriele Paoloni
> Cc: Arnd Bergmann; Lorenzo Pieralisi; Wangzhou (B); Bjorn Helgaas; Rob
> Herring; james.morse@arm.com; Liviu Dudau; linux-pci@vger.kernel.org;
> linux-arm-kernel@lists.infradead.org; devicetree@vger.kernel.org;
> Yuanzhichang; Zhudacai; zhangjukuo; qiuzhenfa; Liguozhu (Kenneth)
> Subject: Re: [PATCH] Store PCIe controllers address in struct
> of_pci_range
> 
> On Fri, Jul 10, 2015 at 3:48 AM, Gabriele Paoloni
> <gabriele.paoloni@huawei.com> wrote:
> > From: gabriele paoloni <gabriele.paoloni@huawei.com>
> >
> > This patch is needed port PCIe designware to new DT parsing API
> > As discussed in
> > http://lists.infradead.org/pipermail/linux-arm-kernel/2015-
> January/317743.html
> > in designware we have a problem as the PCI addresses in the PCIe
> controller
> > address space are required in order to perform correct HW operation.
> >
> > In order to solve this problem commit
> > f4c55c5a3f7f68c06cc559ed7af8b2d017cbb0a7 "PCI: designware:
> 
> Please abbreviate hashs to 12 characters.

Sure, will do.

> 
> > Program ATU with untranslated address" added code to read the PCIe
> > controller start address directly from the DT ranges.
> >
> > In the new DT parsing API of_pci_get_host_bridge_resources() hides
> the
> > DT parser from the host controller drivers, so it is not possible
> > for drivers to parse values directly from the DT.
> >
> > In http://www.spinics.net/lists/linux-pci/msg42540.html we already
> tried
> > to use the new DT parsing API but there is a bug (obviously) in
> setting
> > the <*>_mod_base addresses
> > Applying this patch we can easily set "<*>_mod_base = win-
> >__res.start"
> >
> > This patch adds a new field in "struct of_pci_range" to store the
> > pci controller start address; it fills the field in
> of_pci_range_parser_one();
> > in of_pci_get_host_bridge_resources() it retrieve the resource entry
> > after it is created and added to the resource list and uses
> > entry->__res.start to store the pci controller address
> >
> > the patch is based on 4.2-rc1
> >
> > Signed-off-by: Gabriele Paoloni <gabriele.paoloni@huawei.com>
> > ---
> >  drivers/of/address.c               | 1 +
> >  drivers/of/of_pci.c                | 4 ++++
> >  drivers/pci/host/pcie-designware.c | 9 +++------
> >  include/linux/of_address.h         | 1 +
> >  4 files changed, 9 insertions(+), 6 deletions(-)
> >
> > diff --git a/drivers/of/address.c b/drivers/of/address.c
> > index 8bfda6a..52f9321 100644
> > --- a/drivers/of/address.c
> > +++ b/drivers/of/address.c
> > @@ -265,6 +265,7 @@ struct of_pci_range
> *of_pci_range_parser_one(struct of_pci_range_parser *parser,
> >         range->pci_addr = of_read_number(parser->range + 1, ns);
> >         range->cpu_addr = of_translate_address(parser->node,
> >                                 parser->range + na);
> > +       range->pci_ctrl_addr = of_read_number(parser->range + na, ns) ;
> 
> This is wrong as the correct size to read is not "ns", but the parent
> bus #size-cells value.

Ok I will replace "ns" with "of_n_size_cells(parser->node)" 

> 
> I think "bus_addr" would be a better name. It is not the PCI
> controller's address (i.e. what is in reg prop). No "pci" because it
> has nothing to do with PCI bus addresses.

Ok I will change the name 

> 
> In general, this seems fragile as the dt address ranges/translation
> may not align with the h/w ranges. For example, what if you have 2
> levels of translations and you happen to need it translated with just
> 1 level of translation. That said, I don't really have a better
> suggestion and I guess we can deal with that case if needed later.

Ok so, we'll leave it like this for now

> 
> >         range->size = of_read_number(parser->range + parser->pna + na,
> ns);
> >
> >         parser->range += parser->np;
> > diff --git a/drivers/of/of_pci.c b/drivers/of/of_pci.c
> > index 5751dc5..2ccc749 100644
> > --- a/drivers/of/of_pci.c
> > +++ b/drivers/of/of_pci.c
> > @@ -198,6 +198,7 @@ int of_pci_get_host_bridge_resources(struct
> device_node *dev,
> >
> >         pr_debug("Parsing ranges property...\n");
> >         for_each_of_pci_range(&parser, &range) {
> > +               struct resource_entry *entry;
> >                 /* Read next ranges element */
> >                 if ((range.flags & IORESOURCE_TYPE_BITS) ==
> IORESOURCE_IO)
> >                         snprintf(range_type, 4, " IO");
> > @@ -240,6 +241,9 @@ int of_pci_get_host_bridge_resources(struct
> device_node *dev,
> >                 }
> >
> >                 pci_add_resource_offset(resources, res, res->start -
> range.pci_addr);
> > +               entry = list_last_entry(resources, struct
> resource_entry, node);
> > +               /*we are using __res for storing the PCI controller
> address*/
> > +               entry->__res.start = range.pci_ctrl_addr;
> 
> You will use this in a follow-up patch? I'd like to see this just
> split into core changes and DW changes. This looks like you are making
> intermediate DW changes which will be removed in subsequent patches.
> 
> Rob

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

* RE: [PATCH] Store PCIe controllers address in struct of_pci_range
@ 2015-07-13 11:07     ` Gabriele Paoloni
  0 siblings, 0 replies; 11+ messages in thread
From: Gabriele Paoloni @ 2015-07-13 11:07 UTC (permalink / raw)
  To: Rob Herring
  Cc: Arnd Bergmann, Lorenzo Pieralisi, Wangzhou (B),
	Bjorn Helgaas, Rob Herring, james.morse, Liviu Dudau, linux-pci,
	linux-arm-kernel, devicetree, Yuanzhichang, Zhudacai, zhangjukuo,
	qiuzhenfa, Liguozhu (Kenneth)

SGkgUm9iDQoNCk1hbnkgVGhhbmtzIGZvciB5b3VyIHJldmlldw0KDQo+IC0tLS0tT3JpZ2luYWwg
TWVzc2FnZS0tLS0tDQo+IEZyb206IFJvYiBIZXJyaW5nIFttYWlsdG86cm9iaGVycmluZzJAZ21h
aWwuY29tXQ0KPiBTZW50OiBGcmlkYXksIEp1bHkgMTAsIDIwMTUgODo1NiBQTQ0KPiBUbzogR2Fi
cmllbGUgUGFvbG9uaQ0KPiBDYzogQXJuZCBCZXJnbWFubjsgTG9yZW56byBQaWVyYWxpc2k7IFdh
bmd6aG91IChCKTsgQmpvcm4gSGVsZ2FhczsgUm9iDQo+IEhlcnJpbmc7IGphbWVzLm1vcnNlQGFy
bS5jb207IExpdml1IER1ZGF1OyBsaW51eC1wY2lAdmdlci5rZXJuZWwub3JnOw0KPiBsaW51eC1h
cm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmc7IGRldmljZXRyZWVAdmdlci5rZXJuZWwub3Jn
Ow0KPiBZdWFuemhpY2hhbmc7IFpodWRhY2FpOyB6aGFuZ2p1a3VvOyBxaXV6aGVuZmE7IExpZ3Vv
emh1IChLZW5uZXRoKQ0KPiBTdWJqZWN0OiBSZTogW1BBVENIXSBTdG9yZSBQQ0llIGNvbnRyb2xs
ZXJzIGFkZHJlc3MgaW4gc3RydWN0DQo+IG9mX3BjaV9yYW5nZQ0KPiANCj4gT24gRnJpLCBKdWwg
MTAsIDIwMTUgYXQgMzo0OCBBTSwgR2FicmllbGUgUGFvbG9uaQ0KPiA8Z2FicmllbGUucGFvbG9u
aUBodWF3ZWkuY29tPiB3cm90ZToNCj4gPiBGcm9tOiBnYWJyaWVsZSBwYW9sb25pIDxnYWJyaWVs
ZS5wYW9sb25pQGh1YXdlaS5jb20+DQo+ID4NCj4gPiBUaGlzIHBhdGNoIGlzIG5lZWRlZCBwb3J0
IFBDSWUgZGVzaWdud2FyZSB0byBuZXcgRFQgcGFyc2luZyBBUEkNCj4gPiBBcyBkaXNjdXNzZWQg
aW4NCj4gPiBodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9waXBlcm1haWwvbGludXgtYXJtLWtl
cm5lbC8yMDE1LQ0KPiBKYW51YXJ5LzMxNzc0My5odG1sDQo+ID4gaW4gZGVzaWdud2FyZSB3ZSBo
YXZlIGEgcHJvYmxlbSBhcyB0aGUgUENJIGFkZHJlc3NlcyBpbiB0aGUgUENJZQ0KPiBjb250cm9s
bGVyDQo+ID4gYWRkcmVzcyBzcGFjZSBhcmUgcmVxdWlyZWQgaW4gb3JkZXIgdG8gcGVyZm9ybSBj
b3JyZWN0IEhXIG9wZXJhdGlvbi4NCj4gPg0KPiA+IEluIG9yZGVyIHRvIHNvbHZlIHRoaXMgcHJv
YmxlbSBjb21taXQNCj4gPiBmNGM1NWM1YTNmN2Y2OGMwNmNjNTU5ZWQ3YWY4YjJkMDE3Y2JiMGE3
ICJQQ0k6IGRlc2lnbndhcmU6DQo+IA0KPiBQbGVhc2UgYWJicmV2aWF0ZSBoYXNocyB0byAxMiBj
aGFyYWN0ZXJzLg0KDQpTdXJlLCB3aWxsIGRvLg0KDQo+IA0KPiA+IFByb2dyYW0gQVRVIHdpdGgg
dW50cmFuc2xhdGVkIGFkZHJlc3MiIGFkZGVkIGNvZGUgdG8gcmVhZCB0aGUgUENJZQ0KPiA+IGNv
bnRyb2xsZXIgc3RhcnQgYWRkcmVzcyBkaXJlY3RseSBmcm9tIHRoZSBEVCByYW5nZXMuDQo+ID4N
Cj4gPiBJbiB0aGUgbmV3IERUIHBhcnNpbmcgQVBJIG9mX3BjaV9nZXRfaG9zdF9icmlkZ2VfcmVz
b3VyY2VzKCkgaGlkZXMNCj4gdGhlDQo+ID4gRFQgcGFyc2VyIGZyb20gdGhlIGhvc3QgY29udHJv
bGxlciBkcml2ZXJzLCBzbyBpdCBpcyBub3QgcG9zc2libGUNCj4gPiBmb3IgZHJpdmVycyB0byBw
YXJzZSB2YWx1ZXMgZGlyZWN0bHkgZnJvbSB0aGUgRFQuDQo+ID4NCj4gPiBJbiBodHRwOi8vd3d3
LnNwaW5pY3MubmV0L2xpc3RzL2xpbnV4LXBjaS9tc2c0MjU0MC5odG1sIHdlIGFscmVhZHkNCj4g
dHJpZWQNCj4gPiB0byB1c2UgdGhlIG5ldyBEVCBwYXJzaW5nIEFQSSBidXQgdGhlcmUgaXMgYSBi
dWcgKG9idmlvdXNseSkgaW4NCj4gc2V0dGluZw0KPiA+IHRoZSA8Kj5fbW9kX2Jhc2UgYWRkcmVz
c2VzDQo+ID4gQXBwbHlpbmcgdGhpcyBwYXRjaCB3ZSBjYW4gZWFzaWx5IHNldCAiPCo+X21vZF9i
YXNlID0gd2luLQ0KPiA+X19yZXMuc3RhcnQiDQo+ID4NCj4gPiBUaGlzIHBhdGNoIGFkZHMgYSBu
ZXcgZmllbGQgaW4gInN0cnVjdCBvZl9wY2lfcmFuZ2UiIHRvIHN0b3JlIHRoZQ0KPiA+IHBjaSBj
b250cm9sbGVyIHN0YXJ0IGFkZHJlc3M7IGl0IGZpbGxzIHRoZSBmaWVsZCBpbg0KPiBvZl9wY2lf
cmFuZ2VfcGFyc2VyX29uZSgpOw0KPiA+IGluIG9mX3BjaV9nZXRfaG9zdF9icmlkZ2VfcmVzb3Vy
Y2VzKCkgaXQgcmV0cmlldmUgdGhlIHJlc291cmNlIGVudHJ5DQo+ID4gYWZ0ZXIgaXQgaXMgY3Jl
YXRlZCBhbmQgYWRkZWQgdG8gdGhlIHJlc291cmNlIGxpc3QgYW5kIHVzZXMNCj4gPiBlbnRyeS0+
X19yZXMuc3RhcnQgdG8gc3RvcmUgdGhlIHBjaSBjb250cm9sbGVyIGFkZHJlc3MNCj4gPg0KPiA+
IHRoZSBwYXRjaCBpcyBiYXNlZCBvbiA0LjItcmMxDQo+ID4NCj4gPiBTaWduZWQtb2ZmLWJ5OiBH
YWJyaWVsZSBQYW9sb25pIDxnYWJyaWVsZS5wYW9sb25pQGh1YXdlaS5jb20+DQo+ID4gLS0tDQo+
ID4gIGRyaXZlcnMvb2YvYWRkcmVzcy5jICAgICAgICAgICAgICAgfCAxICsNCj4gPiAgZHJpdmVy
cy9vZi9vZl9wY2kuYyAgICAgICAgICAgICAgICB8IDQgKysrKw0KPiA+ICBkcml2ZXJzL3BjaS9o
b3N0L3BjaWUtZGVzaWdud2FyZS5jIHwgOSArKystLS0tLS0NCj4gPiAgaW5jbHVkZS9saW51eC9v
Zl9hZGRyZXNzLmggICAgICAgICB8IDEgKw0KPiA+ICA0IGZpbGVzIGNoYW5nZWQsIDkgaW5zZXJ0
aW9ucygrKSwgNiBkZWxldGlvbnMoLSkNCj4gPg0KPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL29m
L2FkZHJlc3MuYyBiL2RyaXZlcnMvb2YvYWRkcmVzcy5jDQo+ID4gaW5kZXggOGJmZGE2YS4uNTJm
OTMyMSAxMDA2NDQNCj4gPiAtLS0gYS9kcml2ZXJzL29mL2FkZHJlc3MuYw0KPiA+ICsrKyBiL2Ry
aXZlcnMvb2YvYWRkcmVzcy5jDQo+ID4gQEAgLTI2NSw2ICsyNjUsNyBAQCBzdHJ1Y3Qgb2ZfcGNp
X3JhbmdlDQo+ICpvZl9wY2lfcmFuZ2VfcGFyc2VyX29uZShzdHJ1Y3Qgb2ZfcGNpX3JhbmdlX3Bh
cnNlciAqcGFyc2VyLA0KPiA+ICAgICAgICAgcmFuZ2UtPnBjaV9hZGRyID0gb2ZfcmVhZF9udW1i
ZXIocGFyc2VyLT5yYW5nZSArIDEsIG5zKTsNCj4gPiAgICAgICAgIHJhbmdlLT5jcHVfYWRkciA9
IG9mX3RyYW5zbGF0ZV9hZGRyZXNzKHBhcnNlci0+bm9kZSwNCj4gPiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIHBhcnNlci0+cmFuZ2UgKyBuYSk7DQo+ID4gKyAgICAgICByYW5nZS0+
cGNpX2N0cmxfYWRkciA9IG9mX3JlYWRfbnVtYmVyKHBhcnNlci0+cmFuZ2UgKyBuYSwgbnMpIDsN
Cj4gDQo+IFRoaXMgaXMgd3JvbmcgYXMgdGhlIGNvcnJlY3Qgc2l6ZSB0byByZWFkIGlzIG5vdCAi
bnMiLCBidXQgdGhlIHBhcmVudA0KPiBidXMgI3NpemUtY2VsbHMgdmFsdWUuDQoNCk9rIEkgd2ls
bCByZXBsYWNlICJucyIgd2l0aCAib2Zfbl9zaXplX2NlbGxzKHBhcnNlci0+bm9kZSkiIA0KDQo+
IA0KPiBJIHRoaW5rICJidXNfYWRkciIgd291bGQgYmUgYSBiZXR0ZXIgbmFtZS4gSXQgaXMgbm90
IHRoZSBQQ0kNCj4gY29udHJvbGxlcidzIGFkZHJlc3MgKGkuZS4gd2hhdCBpcyBpbiByZWcgcHJv
cCkuIE5vICJwY2kiIGJlY2F1c2UgaXQNCj4gaGFzIG5vdGhpbmcgdG8gZG8gd2l0aCBQQ0kgYnVz
IGFkZHJlc3Nlcy4NCg0KT2sgSSB3aWxsIGNoYW5nZSB0aGUgbmFtZSANCg0KPiANCj4gSW4gZ2Vu
ZXJhbCwgdGhpcyBzZWVtcyBmcmFnaWxlIGFzIHRoZSBkdCBhZGRyZXNzIHJhbmdlcy90cmFuc2xh
dGlvbg0KPiBtYXkgbm90IGFsaWduIHdpdGggdGhlIGgvdyByYW5nZXMuIEZvciBleGFtcGxlLCB3
aGF0IGlmIHlvdSBoYXZlIDINCj4gbGV2ZWxzIG9mIHRyYW5zbGF0aW9ucyBhbmQgeW91IGhhcHBl
biB0byBuZWVkIGl0IHRyYW5zbGF0ZWQgd2l0aCBqdXN0DQo+IDEgbGV2ZWwgb2YgdHJhbnNsYXRp
b24uIFRoYXQgc2FpZCwgSSBkb24ndCByZWFsbHkgaGF2ZSBhIGJldHRlcg0KPiBzdWdnZXN0aW9u
IGFuZCBJIGd1ZXNzIHdlIGNhbiBkZWFsIHdpdGggdGhhdCBjYXNlIGlmIG5lZWRlZCBsYXRlci4N
Cg0KT2sgc28sIHdlJ2xsIGxlYXZlIGl0IGxpa2UgdGhpcyBmb3Igbm93DQoNCj4gDQo+ID4gICAg
ICAgICByYW5nZS0+c2l6ZSA9IG9mX3JlYWRfbnVtYmVyKHBhcnNlci0+cmFuZ2UgKyBwYXJzZXIt
PnBuYSArIG5hLA0KPiBucyk7DQo+ID4NCj4gPiAgICAgICAgIHBhcnNlci0+cmFuZ2UgKz0gcGFy
c2VyLT5ucDsNCj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9vZi9vZl9wY2kuYyBiL2RyaXZlcnMv
b2Yvb2ZfcGNpLmMNCj4gPiBpbmRleCA1NzUxZGM1Li4yY2NjNzQ5IDEwMDY0NA0KPiA+IC0tLSBh
L2RyaXZlcnMvb2Yvb2ZfcGNpLmMNCj4gPiArKysgYi9kcml2ZXJzL29mL29mX3BjaS5jDQo+ID4g
QEAgLTE5OCw2ICsxOTgsNyBAQCBpbnQgb2ZfcGNpX2dldF9ob3N0X2JyaWRnZV9yZXNvdXJjZXMo
c3RydWN0DQo+IGRldmljZV9ub2RlICpkZXYsDQo+ID4NCj4gPiAgICAgICAgIHByX2RlYnVnKCJQ
YXJzaW5nIHJhbmdlcyBwcm9wZXJ0eS4uLlxuIik7DQo+ID4gICAgICAgICBmb3JfZWFjaF9vZl9w
Y2lfcmFuZ2UoJnBhcnNlciwgJnJhbmdlKSB7DQo+ID4gKyAgICAgICAgICAgICAgIHN0cnVjdCBy
ZXNvdXJjZV9lbnRyeSAqZW50cnk7DQo+ID4gICAgICAgICAgICAgICAgIC8qIFJlYWQgbmV4dCBy
YW5nZXMgZWxlbWVudCAqLw0KPiA+ICAgICAgICAgICAgICAgICBpZiAoKHJhbmdlLmZsYWdzICYg
SU9SRVNPVVJDRV9UWVBFX0JJVFMpID09DQo+IElPUkVTT1VSQ0VfSU8pDQo+ID4gICAgICAgICAg
ICAgICAgICAgICAgICAgc25wcmludGYocmFuZ2VfdHlwZSwgNCwgIiBJTyIpOw0KPiA+IEBAIC0y
NDAsNiArMjQxLDkgQEAgaW50IG9mX3BjaV9nZXRfaG9zdF9icmlkZ2VfcmVzb3VyY2VzKHN0cnVj
dA0KPiBkZXZpY2Vfbm9kZSAqZGV2LA0KPiA+ICAgICAgICAgICAgICAgICB9DQo+ID4NCj4gPiAg
ICAgICAgICAgICAgICAgcGNpX2FkZF9yZXNvdXJjZV9vZmZzZXQocmVzb3VyY2VzLCByZXMsIHJl
cy0+c3RhcnQgLQ0KPiByYW5nZS5wY2lfYWRkcik7DQo+ID4gKyAgICAgICAgICAgICAgIGVudHJ5
ID0gbGlzdF9sYXN0X2VudHJ5KHJlc291cmNlcywgc3RydWN0DQo+IHJlc291cmNlX2VudHJ5LCBu
b2RlKTsNCj4gPiArICAgICAgICAgICAgICAgLyp3ZSBhcmUgdXNpbmcgX19yZXMgZm9yIHN0b3Jp
bmcgdGhlIFBDSSBjb250cm9sbGVyDQo+IGFkZHJlc3MqLw0KPiA+ICsgICAgICAgICAgICAgICBl
bnRyeS0+X19yZXMuc3RhcnQgPSByYW5nZS5wY2lfY3RybF9hZGRyOw0KPiANCj4gWW91IHdpbGwg
dXNlIHRoaXMgaW4gYSBmb2xsb3ctdXAgcGF0Y2g/IEknZCBsaWtlIHRvIHNlZSB0aGlzIGp1c3QN
Cj4gc3BsaXQgaW50byBjb3JlIGNoYW5nZXMgYW5kIERXIGNoYW5nZXMuIFRoaXMgbG9va3MgbGlr
ZSB5b3UgYXJlIG1ha2luZw0KPiBpbnRlcm1lZGlhdGUgRFcgY2hhbmdlcyB3aGljaCB3aWxsIGJl
IHJlbW92ZWQgaW4gc3Vic2VxdWVudCBwYXRjaGVzLg0KPiANCj4gUm9iDQo=

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

* [PATCH] Store PCIe controllers address in struct of_pci_range
@ 2015-07-13 11:07     ` Gabriele Paoloni
  0 siblings, 0 replies; 11+ messages in thread
From: Gabriele Paoloni @ 2015-07-13 11:07 UTC (permalink / raw)
  To: linux-arm-kernel

Hi Rob

Many Thanks for your review

> -----Original Message-----
> From: Rob Herring [mailto:robherring2 at gmail.com]
> Sent: Friday, July 10, 2015 8:56 PM
> To: Gabriele Paoloni
> Cc: Arnd Bergmann; Lorenzo Pieralisi; Wangzhou (B); Bjorn Helgaas; Rob
> Herring; james.morse at arm.com; Liviu Dudau; linux-pci at vger.kernel.org;
> linux-arm-kernel at lists.infradead.org; devicetree at vger.kernel.org;
> Yuanzhichang; Zhudacai; zhangjukuo; qiuzhenfa; Liguozhu (Kenneth)
> Subject: Re: [PATCH] Store PCIe controllers address in struct
> of_pci_range
> 
> On Fri, Jul 10, 2015 at 3:48 AM, Gabriele Paoloni
> <gabriele.paoloni@huawei.com> wrote:
> > From: gabriele paoloni <gabriele.paoloni@huawei.com>
> >
> > This patch is needed port PCIe designware to new DT parsing API
> > As discussed in
> > http://lists.infradead.org/pipermail/linux-arm-kernel/2015-
> January/317743.html
> > in designware we have a problem as the PCI addresses in the PCIe
> controller
> > address space are required in order to perform correct HW operation.
> >
> > In order to solve this problem commit
> > f4c55c5a3f7f68c06cc559ed7af8b2d017cbb0a7 "PCI: designware:
> 
> Please abbreviate hashs to 12 characters.

Sure, will do.

> 
> > Program ATU with untranslated address" added code to read the PCIe
> > controller start address directly from the DT ranges.
> >
> > In the new DT parsing API of_pci_get_host_bridge_resources() hides
> the
> > DT parser from the host controller drivers, so it is not possible
> > for drivers to parse values directly from the DT.
> >
> > In http://www.spinics.net/lists/linux-pci/msg42540.html we already
> tried
> > to use the new DT parsing API but there is a bug (obviously) in
> setting
> > the <*>_mod_base addresses
> > Applying this patch we can easily set "<*>_mod_base = win-
> >__res.start"
> >
> > This patch adds a new field in "struct of_pci_range" to store the
> > pci controller start address; it fills the field in
> of_pci_range_parser_one();
> > in of_pci_get_host_bridge_resources() it retrieve the resource entry
> > after it is created and added to the resource list and uses
> > entry->__res.start to store the pci controller address
> >
> > the patch is based on 4.2-rc1
> >
> > Signed-off-by: Gabriele Paoloni <gabriele.paoloni@huawei.com>
> > ---
> >  drivers/of/address.c               | 1 +
> >  drivers/of/of_pci.c                | 4 ++++
> >  drivers/pci/host/pcie-designware.c | 9 +++------
> >  include/linux/of_address.h         | 1 +
> >  4 files changed, 9 insertions(+), 6 deletions(-)
> >
> > diff --git a/drivers/of/address.c b/drivers/of/address.c
> > index 8bfda6a..52f9321 100644
> > --- a/drivers/of/address.c
> > +++ b/drivers/of/address.c
> > @@ -265,6 +265,7 @@ struct of_pci_range
> *of_pci_range_parser_one(struct of_pci_range_parser *parser,
> >         range->pci_addr = of_read_number(parser->range + 1, ns);
> >         range->cpu_addr = of_translate_address(parser->node,
> >                                 parser->range + na);
> > +       range->pci_ctrl_addr = of_read_number(parser->range + na, ns) ;
> 
> This is wrong as the correct size to read is not "ns", but the parent
> bus #size-cells value.

Ok I will replace "ns" with "of_n_size_cells(parser->node)" 

> 
> I think "bus_addr" would be a better name. It is not the PCI
> controller's address (i.e. what is in reg prop). No "pci" because it
> has nothing to do with PCI bus addresses.

Ok I will change the name 

> 
> In general, this seems fragile as the dt address ranges/translation
> may not align with the h/w ranges. For example, what if you have 2
> levels of translations and you happen to need it translated with just
> 1 level of translation. That said, I don't really have a better
> suggestion and I guess we can deal with that case if needed later.

Ok so, we'll leave it like this for now

> 
> >         range->size = of_read_number(parser->range + parser->pna + na,
> ns);
> >
> >         parser->range += parser->np;
> > diff --git a/drivers/of/of_pci.c b/drivers/of/of_pci.c
> > index 5751dc5..2ccc749 100644
> > --- a/drivers/of/of_pci.c
> > +++ b/drivers/of/of_pci.c
> > @@ -198,6 +198,7 @@ int of_pci_get_host_bridge_resources(struct
> device_node *dev,
> >
> >         pr_debug("Parsing ranges property...\n");
> >         for_each_of_pci_range(&parser, &range) {
> > +               struct resource_entry *entry;
> >                 /* Read next ranges element */
> >                 if ((range.flags & IORESOURCE_TYPE_BITS) ==
> IORESOURCE_IO)
> >                         snprintf(range_type, 4, " IO");
> > @@ -240,6 +241,9 @@ int of_pci_get_host_bridge_resources(struct
> device_node *dev,
> >                 }
> >
> >                 pci_add_resource_offset(resources, res, res->start -
> range.pci_addr);
> > +               entry = list_last_entry(resources, struct
> resource_entry, node);
> > +               /*we are using __res for storing the PCI controller
> address*/
> > +               entry->__res.start = range.pci_ctrl_addr;
> 
> You will use this in a follow-up patch? I'd like to see this just
> split into core changes and DW changes. This looks like you are making
> intermediate DW changes which will be removed in subsequent patches.
> 
> Rob

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

* RE: [PATCH] Store PCIe controllers address in struct of_pci_range
  2015-07-10 19:56   ` Rob Herring
  (?)
@ 2015-07-13 12:59     ` Gabriele Paoloni
  -1 siblings, 0 replies; 11+ messages in thread
From: Gabriele Paoloni @ 2015-07-13 12:59 UTC (permalink / raw)
  To: Gabriele Paoloni, Rob Herring
  Cc: Arnd Bergmann, Lorenzo Pieralisi, Wangzhou (B),
	Bjorn Helgaas, Rob Herring, james.morse-5wv7dgnIgG8, Liviu Dudau,
	linux-pci-u79uwXL29TY76Z2rM5mHXA,
	linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
	devicetree-u79uwXL29TY76Z2rM5mHXA, Yuanzhichang, Zhudacai,
	zhangjukuo, qiuzhenfa, Liguozhu (Kenneth)

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain; charset="utf-8", Size: 6515 bytes --]

Sorry I just realized I forgot to reply to the last item

Gab

> -----Original Message-----
> From: Gabriele Paoloni
> Sent: Monday, July 13, 2015 12:07 PM
> To: 'Rob Herring'
> Cc: Arnd Bergmann; Lorenzo Pieralisi; Wangzhou (B); Bjorn Helgaas; Rob
> Herring; james.morse@arm.com; Liviu Dudau; linux-pci@vger.kernel.org;
> linux-arm-kernel@lists.infradead.org; devicetree@vger.kernel.org;
> Yuanzhichang; Zhudacai; zhangjukuo; qiuzhenfa; Liguozhu (Kenneth)
> Subject: RE: [PATCH] Store PCIe controllers address in struct
> of_pci_range
> 
> Hi Rob
> 
> Many Thanks for your review
> 
> > -----Original Message-----
> > From: Rob Herring [mailto:robherring2@gmail.com]
> > Sent: Friday, July 10, 2015 8:56 PM
> > To: Gabriele Paoloni
> > Cc: Arnd Bergmann; Lorenzo Pieralisi; Wangzhou (B); Bjorn Helgaas;
> Rob
> > Herring; james.morse@arm.com; Liviu Dudau; linux-pci@vger.kernel.org;
> > linux-arm-kernel@lists.infradead.org; devicetree@vger.kernel.org;
> > Yuanzhichang; Zhudacai; zhangjukuo; qiuzhenfa; Liguozhu (Kenneth)
> > Subject: Re: [PATCH] Store PCIe controllers address in struct
> > of_pci_range
> >
> > On Fri, Jul 10, 2015 at 3:48 AM, Gabriele Paoloni
> > <gabriele.paoloni@huawei.com> wrote:
> > > From: gabriele paoloni <gabriele.paoloni@huawei.com>
> > >
> > > This patch is needed port PCIe designware to new DT parsing API
> > > As discussed in
> > > http://lists.infradead.org/pipermail/linux-arm-kernel/2015-
> > January/317743.html
> > > in designware we have a problem as the PCI addresses in the PCIe
> > controller
> > > address space are required in order to perform correct HW operation.
> > >
> > > In order to solve this problem commit
> > > f4c55c5a3f7f68c06cc559ed7af8b2d017cbb0a7 "PCI: designware:
> >
> > Please abbreviate hashs to 12 characters.
> 
> Sure, will do.
> 
> >
> > > Program ATU with untranslated address" added code to read the PCIe
> > > controller start address directly from the DT ranges.
> > >
> > > In the new DT parsing API of_pci_get_host_bridge_resources() hides
> > the
> > > DT parser from the host controller drivers, so it is not possible
> > > for drivers to parse values directly from the DT.
> > >
> > > In http://www.spinics.net/lists/linux-pci/msg42540.html we already
> > tried
> > > to use the new DT parsing API but there is a bug (obviously) in
> > setting
> > > the <*>_mod_base addresses
> > > Applying this patch we can easily set "<*>_mod_base = win-
> > >__res.start"
> > >
> > > This patch adds a new field in "struct of_pci_range" to store the
> > > pci controller start address; it fills the field in
> > of_pci_range_parser_one();
> > > in of_pci_get_host_bridge_resources() it retrieve the resource
> entry
> > > after it is created and added to the resource list and uses
> > > entry->__res.start to store the pci controller address
> > >
> > > the patch is based on 4.2-rc1
> > >
> > > Signed-off-by: Gabriele Paoloni <gabriele.paoloni@huawei.com>
> > > ---
> > >  drivers/of/address.c               | 1 +
> > >  drivers/of/of_pci.c                | 4 ++++
> > >  drivers/pci/host/pcie-designware.c | 9 +++------
> > >  include/linux/of_address.h         | 1 +
> > >  4 files changed, 9 insertions(+), 6 deletions(-)
> > >
> > > diff --git a/drivers/of/address.c b/drivers/of/address.c
> > > index 8bfda6a..52f9321 100644
> > > --- a/drivers/of/address.c
> > > +++ b/drivers/of/address.c
> > > @@ -265,6 +265,7 @@ struct of_pci_range
> > *of_pci_range_parser_one(struct of_pci_range_parser *parser,
> > >         range->pci_addr = of_read_number(parser->range + 1, ns);
> > >         range->cpu_addr = of_translate_address(parser->node,
> > >                                 parser->range + na);
> > > +       range->pci_ctrl_addr = of_read_number(parser->range + na,
> ns) ;
> >
> > This is wrong as the correct size to read is not "ns", but the parent
> > bus #size-cells value.
> 
> Ok I will replace "ns" with "of_n_size_cells(parser->node)"
> 
> >
> > I think "bus_addr" would be a better name. It is not the PCI
> > controller's address (i.e. what is in reg prop). No "pci" because it
> > has nothing to do with PCI bus addresses.
> 
> Ok I will change the name
> 
> >
> > In general, this seems fragile as the dt address ranges/translation
> > may not align with the h/w ranges. For example, what if you have 2
> > levels of translations and you happen to need it translated with just
> > 1 level of translation. That said, I don't really have a better
> > suggestion and I guess we can deal with that case if needed later.
> 
> Ok so, we'll leave it like this for now
> 
> >
> > >         range->size = of_read_number(parser->range + parser->pna +
> na,
> > ns);
> > >
> > >         parser->range += parser->np;
> > > diff --git a/drivers/of/of_pci.c b/drivers/of/of_pci.c
> > > index 5751dc5..2ccc749 100644
> > > --- a/drivers/of/of_pci.c
> > > +++ b/drivers/of/of_pci.c
> > > @@ -198,6 +198,7 @@ int of_pci_get_host_bridge_resources(struct
> > device_node *dev,
> > >
> > >         pr_debug("Parsing ranges property...\n");
> > >         for_each_of_pci_range(&parser, &range) {
> > > +               struct resource_entry *entry;
> > >                 /* Read next ranges element */
> > >                 if ((range.flags & IORESOURCE_TYPE_BITS) ==
> > IORESOURCE_IO)
> > >                         snprintf(range_type, 4, " IO");
> > > @@ -240,6 +241,9 @@ int of_pci_get_host_bridge_resources(struct
> > device_node *dev,
> > >                 }
> > >
> > >                 pci_add_resource_offset(resources, res, res->start
> -
> > range.pci_addr);
> > > +               entry = list_last_entry(resources, struct
> > resource_entry, node);
> > > +               /*we are using __res for storing the PCI controller
> > address*/
> > > +               entry->__res.start = range.pci_ctrl_addr;
> >
> > You will use this in a follow-up patch? I'd like to see this just
> > split into core changes and DW changes. This looks like you are
> making
> > intermediate DW changes which will be removed in subsequent patches.

Ok I will split it

The changes in "drivers/pci/host/pcie-designware.c" can be removed from this patch; we can modify directly 
"[PATCH v2 2/4] PCI: designware: Add ARM64 support" in v3 patchset

> >
> > Rob
N‹§²æìr¸›yúèšØb²X¬¶Ç§vØ^–)Þº{.nÇ+‰·zøœzÚÞz)í…æèw*\x1fjg¬±¨\x1e¶‰šŽŠÝ¢j.ïÛ°\½½MŽúgjÌæa×\x02››–' ™©Þ¢¸\f¢·¦j:+v‰¨ŠwèjØm¶Ÿÿ¾\a«‘êçzZ+ƒùšŽŠÝ¢j"ú!¶i

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

* RE: [PATCH] Store PCIe controllers address in struct of_pci_range
@ 2015-07-13 12:59     ` Gabriele Paoloni
  0 siblings, 0 replies; 11+ messages in thread
From: Gabriele Paoloni @ 2015-07-13 12:59 UTC (permalink / raw)
  To: Gabriele Paoloni, Rob Herring
  Cc: Arnd Bergmann, Lorenzo Pieralisi, Wangzhou (B),
	Bjorn Helgaas, Rob Herring, james.morse, Liviu Dudau, linux-pci,
	linux-arm-kernel, devicetree, Yuanzhichang, Zhudacai, zhangjukuo,
	qiuzhenfa, Liguozhu (Kenneth)

U29ycnkgSSBqdXN0IHJlYWxpemVkIEkgZm9yZ290IHRvIHJlcGx5IHRvIHRoZSBsYXN0IGl0ZW0N
Cg0KR2FiDQoNCj4gLS0tLS1PcmlnaW5hbCBNZXNzYWdlLS0tLS0NCj4gRnJvbTogR2FicmllbGUg
UGFvbG9uaQ0KPiBTZW50OiBNb25kYXksIEp1bHkgMTMsIDIwMTUgMTI6MDcgUE0NCj4gVG86ICdS
b2IgSGVycmluZycNCj4gQ2M6IEFybmQgQmVyZ21hbm47IExvcmVuem8gUGllcmFsaXNpOyBXYW5n
emhvdSAoQik7IEJqb3JuIEhlbGdhYXM7IFJvYg0KPiBIZXJyaW5nOyBqYW1lcy5tb3JzZUBhcm0u
Y29tOyBMaXZpdSBEdWRhdTsgbGludXgtcGNpQHZnZXIua2VybmVsLm9yZzsNCj4gbGludXgtYXJt
LWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnOyBkZXZpY2V0cmVlQHZnZXIua2VybmVsLm9yZzsN
Cj4gWXVhbnpoaWNoYW5nOyBaaHVkYWNhaTsgemhhbmdqdWt1bzsgcWl1emhlbmZhOyBMaWd1b3po
dSAoS2VubmV0aCkNCj4gU3ViamVjdDogUkU6IFtQQVRDSF0gU3RvcmUgUENJZSBjb250cm9sbGVy
cyBhZGRyZXNzIGluIHN0cnVjdA0KPiBvZl9wY2lfcmFuZ2UNCj4gDQo+IEhpIFJvYg0KPiANCj4g
TWFueSBUaGFua3MgZm9yIHlvdXIgcmV2aWV3DQo+IA0KPiA+IC0tLS0tT3JpZ2luYWwgTWVzc2Fn
ZS0tLS0tDQo+ID4gRnJvbTogUm9iIEhlcnJpbmcgW21haWx0bzpyb2JoZXJyaW5nMkBnbWFpbC5j
b21dDQo+ID4gU2VudDogRnJpZGF5LCBKdWx5IDEwLCAyMDE1IDg6NTYgUE0NCj4gPiBUbzogR2Fi
cmllbGUgUGFvbG9uaQ0KPiA+IENjOiBBcm5kIEJlcmdtYW5uOyBMb3JlbnpvIFBpZXJhbGlzaTsg
V2FuZ3pob3UgKEIpOyBCam9ybiBIZWxnYWFzOw0KPiBSb2INCj4gPiBIZXJyaW5nOyBqYW1lcy5t
b3JzZUBhcm0uY29tOyBMaXZpdSBEdWRhdTsgbGludXgtcGNpQHZnZXIua2VybmVsLm9yZzsNCj4g
PiBsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmc7IGRldmljZXRyZWVAdmdlci5r
ZXJuZWwub3JnOw0KPiA+IFl1YW56aGljaGFuZzsgWmh1ZGFjYWk7IHpoYW5nanVrdW87IHFpdXpo
ZW5mYTsgTGlndW96aHUgKEtlbm5ldGgpDQo+ID4gU3ViamVjdDogUmU6IFtQQVRDSF0gU3RvcmUg
UENJZSBjb250cm9sbGVycyBhZGRyZXNzIGluIHN0cnVjdA0KPiA+IG9mX3BjaV9yYW5nZQ0KPiA+
DQo+ID4gT24gRnJpLCBKdWwgMTAsIDIwMTUgYXQgMzo0OCBBTSwgR2FicmllbGUgUGFvbG9uaQ0K
PiA+IDxnYWJyaWVsZS5wYW9sb25pQGh1YXdlaS5jb20+IHdyb3RlOg0KPiA+ID4gRnJvbTogZ2Fi
cmllbGUgcGFvbG9uaSA8Z2FicmllbGUucGFvbG9uaUBodWF3ZWkuY29tPg0KPiA+ID4NCj4gPiA+
IFRoaXMgcGF0Y2ggaXMgbmVlZGVkIHBvcnQgUENJZSBkZXNpZ253YXJlIHRvIG5ldyBEVCBwYXJz
aW5nIEFQSQ0KPiA+ID4gQXMgZGlzY3Vzc2VkIGluDQo+ID4gPiBodHRwOi8vbGlzdHMuaW5mcmFk
ZWFkLm9yZy9waXBlcm1haWwvbGludXgtYXJtLWtlcm5lbC8yMDE1LQ0KPiA+IEphbnVhcnkvMzE3
NzQzLmh0bWwNCj4gPiA+IGluIGRlc2lnbndhcmUgd2UgaGF2ZSBhIHByb2JsZW0gYXMgdGhlIFBD
SSBhZGRyZXNzZXMgaW4gdGhlIFBDSWUNCj4gPiBjb250cm9sbGVyDQo+ID4gPiBhZGRyZXNzIHNw
YWNlIGFyZSByZXF1aXJlZCBpbiBvcmRlciB0byBwZXJmb3JtIGNvcnJlY3QgSFcgb3BlcmF0aW9u
Lg0KPiA+ID4NCj4gPiA+IEluIG9yZGVyIHRvIHNvbHZlIHRoaXMgcHJvYmxlbSBjb21taXQNCj4g
PiA+IGY0YzU1YzVhM2Y3ZjY4YzA2Y2M1NTllZDdhZjhiMmQwMTdjYmIwYTcgIlBDSTogZGVzaWdu
d2FyZToNCj4gPg0KPiA+IFBsZWFzZSBhYmJyZXZpYXRlIGhhc2hzIHRvIDEyIGNoYXJhY3RlcnMu
DQo+IA0KPiBTdXJlLCB3aWxsIGRvLg0KPiANCj4gPg0KPiA+ID4gUHJvZ3JhbSBBVFUgd2l0aCB1
bnRyYW5zbGF0ZWQgYWRkcmVzcyIgYWRkZWQgY29kZSB0byByZWFkIHRoZSBQQ0llDQo+ID4gPiBj
b250cm9sbGVyIHN0YXJ0IGFkZHJlc3MgZGlyZWN0bHkgZnJvbSB0aGUgRFQgcmFuZ2VzLg0KPiA+
ID4NCj4gPiA+IEluIHRoZSBuZXcgRFQgcGFyc2luZyBBUEkgb2ZfcGNpX2dldF9ob3N0X2JyaWRn
ZV9yZXNvdXJjZXMoKSBoaWRlcw0KPiA+IHRoZQ0KPiA+ID4gRFQgcGFyc2VyIGZyb20gdGhlIGhv
c3QgY29udHJvbGxlciBkcml2ZXJzLCBzbyBpdCBpcyBub3QgcG9zc2libGUNCj4gPiA+IGZvciBk
cml2ZXJzIHRvIHBhcnNlIHZhbHVlcyBkaXJlY3RseSBmcm9tIHRoZSBEVC4NCj4gPiA+DQo+ID4g
PiBJbiBodHRwOi8vd3d3LnNwaW5pY3MubmV0L2xpc3RzL2xpbnV4LXBjaS9tc2c0MjU0MC5odG1s
IHdlIGFscmVhZHkNCj4gPiB0cmllZA0KPiA+ID4gdG8gdXNlIHRoZSBuZXcgRFQgcGFyc2luZyBB
UEkgYnV0IHRoZXJlIGlzIGEgYnVnIChvYnZpb3VzbHkpIGluDQo+ID4gc2V0dGluZw0KPiA+ID4g
dGhlIDwqPl9tb2RfYmFzZSBhZGRyZXNzZXMNCj4gPiA+IEFwcGx5aW5nIHRoaXMgcGF0Y2ggd2Ug
Y2FuIGVhc2lseSBzZXQgIjwqPl9tb2RfYmFzZSA9IHdpbi0NCj4gPiA+X19yZXMuc3RhcnQiDQo+
ID4gPg0KPiA+ID4gVGhpcyBwYXRjaCBhZGRzIGEgbmV3IGZpZWxkIGluICJzdHJ1Y3Qgb2ZfcGNp
X3JhbmdlIiB0byBzdG9yZSB0aGUNCj4gPiA+IHBjaSBjb250cm9sbGVyIHN0YXJ0IGFkZHJlc3M7
IGl0IGZpbGxzIHRoZSBmaWVsZCBpbg0KPiA+IG9mX3BjaV9yYW5nZV9wYXJzZXJfb25lKCk7DQo+
ID4gPiBpbiBvZl9wY2lfZ2V0X2hvc3RfYnJpZGdlX3Jlc291cmNlcygpIGl0IHJldHJpZXZlIHRo
ZSByZXNvdXJjZQ0KPiBlbnRyeQ0KPiA+ID4gYWZ0ZXIgaXQgaXMgY3JlYXRlZCBhbmQgYWRkZWQg
dG8gdGhlIHJlc291cmNlIGxpc3QgYW5kIHVzZXMNCj4gPiA+IGVudHJ5LT5fX3Jlcy5zdGFydCB0
byBzdG9yZSB0aGUgcGNpIGNvbnRyb2xsZXIgYWRkcmVzcw0KPiA+ID4NCj4gPiA+IHRoZSBwYXRj
aCBpcyBiYXNlZCBvbiA0LjItcmMxDQo+ID4gPg0KPiA+ID4gU2lnbmVkLW9mZi1ieTogR2Ficmll
bGUgUGFvbG9uaSA8Z2FicmllbGUucGFvbG9uaUBodWF3ZWkuY29tPg0KPiA+ID4gLS0tDQo+ID4g
PiAgZHJpdmVycy9vZi9hZGRyZXNzLmMgICAgICAgICAgICAgICB8IDEgKw0KPiA+ID4gIGRyaXZl
cnMvb2Yvb2ZfcGNpLmMgICAgICAgICAgICAgICAgfCA0ICsrKysNCj4gPiA+ICBkcml2ZXJzL3Bj
aS9ob3N0L3BjaWUtZGVzaWdud2FyZS5jIHwgOSArKystLS0tLS0NCj4gPiA+ICBpbmNsdWRlL2xp
bnV4L29mX2FkZHJlc3MuaCAgICAgICAgIHwgMSArDQo+ID4gPiAgNCBmaWxlcyBjaGFuZ2VkLCA5
IGluc2VydGlvbnMoKyksIDYgZGVsZXRpb25zKC0pDQo+ID4gPg0KPiA+ID4gZGlmZiAtLWdpdCBh
L2RyaXZlcnMvb2YvYWRkcmVzcy5jIGIvZHJpdmVycy9vZi9hZGRyZXNzLmMNCj4gPiA+IGluZGV4
IDhiZmRhNmEuLjUyZjkzMjEgMTAwNjQ0DQo+ID4gPiAtLS0gYS9kcml2ZXJzL29mL2FkZHJlc3Mu
Yw0KPiA+ID4gKysrIGIvZHJpdmVycy9vZi9hZGRyZXNzLmMNCj4gPiA+IEBAIC0yNjUsNiArMjY1
LDcgQEAgc3RydWN0IG9mX3BjaV9yYW5nZQ0KPiA+ICpvZl9wY2lfcmFuZ2VfcGFyc2VyX29uZShz
dHJ1Y3Qgb2ZfcGNpX3JhbmdlX3BhcnNlciAqcGFyc2VyLA0KPiA+ID4gICAgICAgICByYW5nZS0+
cGNpX2FkZHIgPSBvZl9yZWFkX251bWJlcihwYXJzZXItPnJhbmdlICsgMSwgbnMpOw0KPiA+ID4g
ICAgICAgICByYW5nZS0+Y3B1X2FkZHIgPSBvZl90cmFuc2xhdGVfYWRkcmVzcyhwYXJzZXItPm5v
ZGUsDQo+ID4gPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci0+cmFuZ2Ug
KyBuYSk7DQo+ID4gPiArICAgICAgIHJhbmdlLT5wY2lfY3RybF9hZGRyID0gb2ZfcmVhZF9udW1i
ZXIocGFyc2VyLT5yYW5nZSArIG5hLA0KPiBucykgOw0KPiA+DQo+ID4gVGhpcyBpcyB3cm9uZyBh
cyB0aGUgY29ycmVjdCBzaXplIHRvIHJlYWQgaXMgbm90ICJucyIsIGJ1dCB0aGUgcGFyZW50DQo+
ID4gYnVzICNzaXplLWNlbGxzIHZhbHVlLg0KPiANCj4gT2sgSSB3aWxsIHJlcGxhY2UgIm5zIiB3
aXRoICJvZl9uX3NpemVfY2VsbHMocGFyc2VyLT5ub2RlKSINCj4gDQo+ID4NCj4gPiBJIHRoaW5r
ICJidXNfYWRkciIgd291bGQgYmUgYSBiZXR0ZXIgbmFtZS4gSXQgaXMgbm90IHRoZSBQQ0kNCj4g
PiBjb250cm9sbGVyJ3MgYWRkcmVzcyAoaS5lLiB3aGF0IGlzIGluIHJlZyBwcm9wKS4gTm8gInBj
aSIgYmVjYXVzZSBpdA0KPiA+IGhhcyBub3RoaW5nIHRvIGRvIHdpdGggUENJIGJ1cyBhZGRyZXNz
ZXMuDQo+IA0KPiBPayBJIHdpbGwgY2hhbmdlIHRoZSBuYW1lDQo+IA0KPiA+DQo+ID4gSW4gZ2Vu
ZXJhbCwgdGhpcyBzZWVtcyBmcmFnaWxlIGFzIHRoZSBkdCBhZGRyZXNzIHJhbmdlcy90cmFuc2xh
dGlvbg0KPiA+IG1heSBub3QgYWxpZ24gd2l0aCB0aGUgaC93IHJhbmdlcy4gRm9yIGV4YW1wbGUs
IHdoYXQgaWYgeW91IGhhdmUgMg0KPiA+IGxldmVscyBvZiB0cmFuc2xhdGlvbnMgYW5kIHlvdSBo
YXBwZW4gdG8gbmVlZCBpdCB0cmFuc2xhdGVkIHdpdGgganVzdA0KPiA+IDEgbGV2ZWwgb2YgdHJh
bnNsYXRpb24uIFRoYXQgc2FpZCwgSSBkb24ndCByZWFsbHkgaGF2ZSBhIGJldHRlcg0KPiA+IHN1
Z2dlc3Rpb24gYW5kIEkgZ3Vlc3Mgd2UgY2FuIGRlYWwgd2l0aCB0aGF0IGNhc2UgaWYgbmVlZGVk
IGxhdGVyLg0KPiANCj4gT2sgc28sIHdlJ2xsIGxlYXZlIGl0IGxpa2UgdGhpcyBmb3Igbm93DQo+
IA0KPiA+DQo+ID4gPiAgICAgICAgIHJhbmdlLT5zaXplID0gb2ZfcmVhZF9udW1iZXIocGFyc2Vy
LT5yYW5nZSArIHBhcnNlci0+cG5hICsNCj4gbmEsDQo+ID4gbnMpOw0KPiA+ID4NCj4gPiA+ICAg
ICAgICAgcGFyc2VyLT5yYW5nZSArPSBwYXJzZXItPm5wOw0KPiA+ID4gZGlmZiAtLWdpdCBhL2Ry
aXZlcnMvb2Yvb2ZfcGNpLmMgYi9kcml2ZXJzL29mL29mX3BjaS5jDQo+ID4gPiBpbmRleCA1NzUx
ZGM1Li4yY2NjNzQ5IDEwMDY0NA0KPiA+ID4gLS0tIGEvZHJpdmVycy9vZi9vZl9wY2kuYw0KPiA+
ID4gKysrIGIvZHJpdmVycy9vZi9vZl9wY2kuYw0KPiA+ID4gQEAgLTE5OCw2ICsxOTgsNyBAQCBp
bnQgb2ZfcGNpX2dldF9ob3N0X2JyaWRnZV9yZXNvdXJjZXMoc3RydWN0DQo+ID4gZGV2aWNlX25v
ZGUgKmRldiwNCj4gPiA+DQo+ID4gPiAgICAgICAgIHByX2RlYnVnKCJQYXJzaW5nIHJhbmdlcyBw
cm9wZXJ0eS4uLlxuIik7DQo+ID4gPiAgICAgICAgIGZvcl9lYWNoX29mX3BjaV9yYW5nZSgmcGFy
c2VyLCAmcmFuZ2UpIHsNCj4gPiA+ICsgICAgICAgICAgICAgICBzdHJ1Y3QgcmVzb3VyY2VfZW50
cnkgKmVudHJ5Ow0KPiA+ID4gICAgICAgICAgICAgICAgIC8qIFJlYWQgbmV4dCByYW5nZXMgZWxl
bWVudCAqLw0KPiA+ID4gICAgICAgICAgICAgICAgIGlmICgocmFuZ2UuZmxhZ3MgJiBJT1JFU09V
UkNFX1RZUEVfQklUUykgPT0NCj4gPiBJT1JFU09VUkNFX0lPKQ0KPiA+ID4gICAgICAgICAgICAg
ICAgICAgICAgICAgc25wcmludGYocmFuZ2VfdHlwZSwgNCwgIiBJTyIpOw0KPiA+ID4gQEAgLTI0
MCw2ICsyNDEsOSBAQCBpbnQgb2ZfcGNpX2dldF9ob3N0X2JyaWRnZV9yZXNvdXJjZXMoc3RydWN0
DQo+ID4gZGV2aWNlX25vZGUgKmRldiwNCj4gPiA+ICAgICAgICAgICAgICAgICB9DQo+ID4gPg0K
PiA+ID4gICAgICAgICAgICAgICAgIHBjaV9hZGRfcmVzb3VyY2Vfb2Zmc2V0KHJlc291cmNlcywg
cmVzLCByZXMtPnN0YXJ0DQo+IC0NCj4gPiByYW5nZS5wY2lfYWRkcik7DQo+ID4gPiArICAgICAg
ICAgICAgICAgZW50cnkgPSBsaXN0X2xhc3RfZW50cnkocmVzb3VyY2VzLCBzdHJ1Y3QNCj4gPiBy
ZXNvdXJjZV9lbnRyeSwgbm9kZSk7DQo+ID4gPiArICAgICAgICAgICAgICAgLyp3ZSBhcmUgdXNp
bmcgX19yZXMgZm9yIHN0b3JpbmcgdGhlIFBDSSBjb250cm9sbGVyDQo+ID4gYWRkcmVzcyovDQo+
ID4gPiArICAgICAgICAgICAgICAgZW50cnktPl9fcmVzLnN0YXJ0ID0gcmFuZ2UucGNpX2N0cmxf
YWRkcjsNCj4gPg0KPiA+IFlvdSB3aWxsIHVzZSB0aGlzIGluIGEgZm9sbG93LXVwIHBhdGNoPyBJ
J2QgbGlrZSB0byBzZWUgdGhpcyBqdXN0DQo+ID4gc3BsaXQgaW50byBjb3JlIGNoYW5nZXMgYW5k
IERXIGNoYW5nZXMuIFRoaXMgbG9va3MgbGlrZSB5b3UgYXJlDQo+IG1ha2luZw0KPiA+IGludGVy
bWVkaWF0ZSBEVyBjaGFuZ2VzIHdoaWNoIHdpbGwgYmUgcmVtb3ZlZCBpbiBzdWJzZXF1ZW50IHBh
dGNoZXMuDQoNCk9rIEkgd2lsbCBzcGxpdCBpdA0KDQpUaGUgY2hhbmdlcyBpbiAiZHJpdmVycy9w
Y2kvaG9zdC9wY2llLWRlc2lnbndhcmUuYyIgY2FuIGJlIHJlbW92ZWQgZnJvbSB0aGlzIHBhdGNo
OyB3ZSBjYW4gbW9kaWZ5IGRpcmVjdGx5IA0KIltQQVRDSCB2MiAyLzRdIFBDSTogZGVzaWdud2Fy
ZTogQWRkIEFSTTY0IHN1cHBvcnQiIGluIHYzIHBhdGNoc2V0DQoNCj4gPg0KPiA+IFJvYg0K

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

* [PATCH] Store PCIe controllers address in struct of_pci_range
@ 2015-07-13 12:59     ` Gabriele Paoloni
  0 siblings, 0 replies; 11+ messages in thread
From: Gabriele Paoloni @ 2015-07-13 12:59 UTC (permalink / raw)
  To: linux-arm-kernel

Sorry I just realized I forgot to reply to the last item

Gab

> -----Original Message-----
> From: Gabriele Paoloni
> Sent: Monday, July 13, 2015 12:07 PM
> To: 'Rob Herring'
> Cc: Arnd Bergmann; Lorenzo Pieralisi; Wangzhou (B); Bjorn Helgaas; Rob
> Herring; james.morse at arm.com; Liviu Dudau; linux-pci at vger.kernel.org;
> linux-arm-kernel at lists.infradead.org; devicetree at vger.kernel.org;
> Yuanzhichang; Zhudacai; zhangjukuo; qiuzhenfa; Liguozhu (Kenneth)
> Subject: RE: [PATCH] Store PCIe controllers address in struct
> of_pci_range
> 
> Hi Rob
> 
> Many Thanks for your review
> 
> > -----Original Message-----
> > From: Rob Herring [mailto:robherring2 at gmail.com]
> > Sent: Friday, July 10, 2015 8:56 PM
> > To: Gabriele Paoloni
> > Cc: Arnd Bergmann; Lorenzo Pieralisi; Wangzhou (B); Bjorn Helgaas;
> Rob
> > Herring; james.morse at arm.com; Liviu Dudau; linux-pci at vger.kernel.org;
> > linux-arm-kernel at lists.infradead.org; devicetree at vger.kernel.org;
> > Yuanzhichang; Zhudacai; zhangjukuo; qiuzhenfa; Liguozhu (Kenneth)
> > Subject: Re: [PATCH] Store PCIe controllers address in struct
> > of_pci_range
> >
> > On Fri, Jul 10, 2015 at 3:48 AM, Gabriele Paoloni
> > <gabriele.paoloni@huawei.com> wrote:
> > > From: gabriele paoloni <gabriele.paoloni@huawei.com>
> > >
> > > This patch is needed port PCIe designware to new DT parsing API
> > > As discussed in
> > > http://lists.infradead.org/pipermail/linux-arm-kernel/2015-
> > January/317743.html
> > > in designware we have a problem as the PCI addresses in the PCIe
> > controller
> > > address space are required in order to perform correct HW operation.
> > >
> > > In order to solve this problem commit
> > > f4c55c5a3f7f68c06cc559ed7af8b2d017cbb0a7 "PCI: designware:
> >
> > Please abbreviate hashs to 12 characters.
> 
> Sure, will do.
> 
> >
> > > Program ATU with untranslated address" added code to read the PCIe
> > > controller start address directly from the DT ranges.
> > >
> > > In the new DT parsing API of_pci_get_host_bridge_resources() hides
> > the
> > > DT parser from the host controller drivers, so it is not possible
> > > for drivers to parse values directly from the DT.
> > >
> > > In http://www.spinics.net/lists/linux-pci/msg42540.html we already
> > tried
> > > to use the new DT parsing API but there is a bug (obviously) in
> > setting
> > > the <*>_mod_base addresses
> > > Applying this patch we can easily set "<*>_mod_base = win-
> > >__res.start"
> > >
> > > This patch adds a new field in "struct of_pci_range" to store the
> > > pci controller start address; it fills the field in
> > of_pci_range_parser_one();
> > > in of_pci_get_host_bridge_resources() it retrieve the resource
> entry
> > > after it is created and added to the resource list and uses
> > > entry->__res.start to store the pci controller address
> > >
> > > the patch is based on 4.2-rc1
> > >
> > > Signed-off-by: Gabriele Paoloni <gabriele.paoloni@huawei.com>
> > > ---
> > >  drivers/of/address.c               | 1 +
> > >  drivers/of/of_pci.c                | 4 ++++
> > >  drivers/pci/host/pcie-designware.c | 9 +++------
> > >  include/linux/of_address.h         | 1 +
> > >  4 files changed, 9 insertions(+), 6 deletions(-)
> > >
> > > diff --git a/drivers/of/address.c b/drivers/of/address.c
> > > index 8bfda6a..52f9321 100644
> > > --- a/drivers/of/address.c
> > > +++ b/drivers/of/address.c
> > > @@ -265,6 +265,7 @@ struct of_pci_range
> > *of_pci_range_parser_one(struct of_pci_range_parser *parser,
> > >         range->pci_addr = of_read_number(parser->range + 1, ns);
> > >         range->cpu_addr = of_translate_address(parser->node,
> > >                                 parser->range + na);
> > > +       range->pci_ctrl_addr = of_read_number(parser->range + na,
> ns) ;
> >
> > This is wrong as the correct size to read is not "ns", but the parent
> > bus #size-cells value.
> 
> Ok I will replace "ns" with "of_n_size_cells(parser->node)"
> 
> >
> > I think "bus_addr" would be a better name. It is not the PCI
> > controller's address (i.e. what is in reg prop). No "pci" because it
> > has nothing to do with PCI bus addresses.
> 
> Ok I will change the name
> 
> >
> > In general, this seems fragile as the dt address ranges/translation
> > may not align with the h/w ranges. For example, what if you have 2
> > levels of translations and you happen to need it translated with just
> > 1 level of translation. That said, I don't really have a better
> > suggestion and I guess we can deal with that case if needed later.
> 
> Ok so, we'll leave it like this for now
> 
> >
> > >         range->size = of_read_number(parser->range + parser->pna +
> na,
> > ns);
> > >
> > >         parser->range += parser->np;
> > > diff --git a/drivers/of/of_pci.c b/drivers/of/of_pci.c
> > > index 5751dc5..2ccc749 100644
> > > --- a/drivers/of/of_pci.c
> > > +++ b/drivers/of/of_pci.c
> > > @@ -198,6 +198,7 @@ int of_pci_get_host_bridge_resources(struct
> > device_node *dev,
> > >
> > >         pr_debug("Parsing ranges property...\n");
> > >         for_each_of_pci_range(&parser, &range) {
> > > +               struct resource_entry *entry;
> > >                 /* Read next ranges element */
> > >                 if ((range.flags & IORESOURCE_TYPE_BITS) ==
> > IORESOURCE_IO)
> > >                         snprintf(range_type, 4, " IO");
> > > @@ -240,6 +241,9 @@ int of_pci_get_host_bridge_resources(struct
> > device_node *dev,
> > >                 }
> > >
> > >                 pci_add_resource_offset(resources, res, res->start
> -
> > range.pci_addr);
> > > +               entry = list_last_entry(resources, struct
> > resource_entry, node);
> > > +               /*we are using __res for storing the PCI controller
> > address*/
> > > +               entry->__res.start = range.pci_ctrl_addr;
> >
> > You will use this in a follow-up patch? I'd like to see this just
> > split into core changes and DW changes. This looks like you are
> making
> > intermediate DW changes which will be removed in subsequent patches.

Ok I will split it

The changes in "drivers/pci/host/pcie-designware.c" can be removed from this patch; we can modify directly 
"[PATCH v2 2/4] PCI: designware: Add ARM64 support" in v3 patchset

> >
> > Rob

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

end of thread, other threads:[~2015-07-13 12:59 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-07-10  8:48 [PATCH] Store PCIe controllers address in struct of_pci_range Gabriele Paoloni
2015-07-10  8:48 ` Gabriele Paoloni
2015-07-10  8:48 ` Gabriele Paoloni
2015-07-10 19:56 ` Rob Herring
2015-07-10 19:56   ` Rob Herring
2015-07-13 11:07   ` Gabriele Paoloni
2015-07-13 11:07     ` Gabriele Paoloni
2015-07-13 11:07     ` Gabriele Paoloni
2015-07-13 12:59   ` Gabriele Paoloni
2015-07-13 12:59     ` Gabriele Paoloni
2015-07-13 12:59     ` Gabriele Paoloni

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.