All of lore.kernel.org
 help / color / mirror / Atom feed
From: Rob Herring <robherring2@gmail.com>
To: Thierry Reding <thierry.reding@avionic-design.de>
Cc: linux-tegra@vger.kernel.org,
	Russell King <linux@arm.linux.org.uk>,
	linux-pci@vger.kernel.org, devicetree-discuss@lists.ozlabs.org,
	Rob Herring <rob.herring@calxeda.com>,
	Colin Cross <ccross@android.com>,
	Bjorn Helgaas <bhelgaas@google.com>,
	linux-arm-kernel@lists.infradead.org,
	Arnd Bergmann <arnd@arndb.de>
Subject: Re: [PATCH v3 09/10] of: Add of_pci_parse_ranges()
Date: Tue, 31 Jul 2012 15:07:31 -0500	[thread overview]
Message-ID: <50183B03.2090809@gmail.com> (raw)
In-Reply-To: <1343332512-28762-10-git-send-email-thierry.reding@avionic-design.de>

On 07/26/2012 02:55 PM, Thierry Reding wrote:
> This new function parses the ranges property of PCI device nodes into
> an array of struct resource elements. It is useful in multiple-port PCI
> host controller drivers to collect information about the ranges that it
> needs to forward to the respective ports.

It seems to me that some of the DT PCI code in arch/powerpc/kernel/pci*
like pci_process_bridge_OF_ranges() should apply for ARM as well.

Each arch defining their own pci controller structs complicates this,
but I would think at least the DT parsing can be common.

> Signed-off-by: Thierry Reding <thierry.reding@avionic-design.de>
> ---
> Changes in v3:
> - new patch
> 
>  drivers/of/of_pci.c    | 84 +++++++++++++++++++++++++++++++++++++++++++++++++-
>  include/linux/of_pci.h |  2 ++
>  2 files changed, 85 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/of/of_pci.c b/drivers/of/of_pci.c
> index 13e37e2..bcff301 100644
> --- a/drivers/of/of_pci.c
> +++ b/drivers/of/of_pci.c
> @@ -1,7 +1,8 @@
>  #include <linux/kernel.h>
>  #include <linux/export.h>
> -#include <linux/of.h>
> +#include <linux/of_address.h>
>  #include <linux/of_pci.h>
> +#include <linux/slab.h>
>  #include <asm/prom.h>
>  
>  static inline int __of_pci_pci_compare(struct device_node *node,
> @@ -40,3 +41,84 @@ struct device_node *of_pci_find_child_device(struct device_node *parent,
>  	return NULL;
>  }
>  EXPORT_SYMBOL_GPL(of_pci_find_child_device);
> +
> +struct resource *of_pci_parse_ranges(struct device_node *node,
> +				     unsigned int *countp)
> +{
> +	unsigned int count, i = 0;
> +	struct resource *ranges;

I think res or pci_res would be clearer than ranges that this is a
struct resource.

> +	const __be32 *values;
> +	int len, pna, np;
> +
> +	values = of_get_property(node, "ranges", &len);
> +	if (!values)
> +		return NULL;
> +
> +	pna = of_n_addr_cells(node);
> +	np = pna + 5;
> +
> +	count = len / (np * sizeof(*values));
> +
> +	ranges = kzalloc(sizeof(*ranges) * count, GFP_KERNEL);
> +	if (!ranges)
> +		return NULL;
> +
> +	pr_debug("PCI ranges:\n");
> +
> +	while ((len -= np * sizeof(*values)) >= 0) {
> +		u64 addr = of_translate_address(node, values + 3);
> +		u64 size = of_read_number(values + 3 + pna, 2);
> +		u32 type = be32_to_cpup(values);
> +		const char *suffix = "";
> +		struct resource range;

Same here.

Rob

> +
> +		memset(&range, 0, sizeof(range));
> +		range.start = addr;
> +		range.end = addr + size - 1;
> +
> +		switch ((type >> 24) & 0x3) {
> +		case 0:
> +			range.flags = IORESOURCE_MEM | IORESOURCE_PCI_CS;
> +			pr_debug("  CS  %#x-%#x\n", range.start, range.end);
> +			break;
> +
> +		case 1:
> +			range.flags = IORESOURCE_IO;
> +			pr_debug("  IO  %#x-%#x\n", range.start, range.end);
> +			break;
> +
> +		case 2:
> +			range.flags = IORESOURCE_MEM;
> +
> +			if (type & 0x40000000) {
> +				range.flags |= IORESOURCE_PREFETCH;
> +				suffix = "prefetch";
> +			}
> +
> +			pr_debug("  MEM %#x-%#x %s\n", range.start, range.end,
> +				 suffix);
> +			break;
> +
> +		case 3:
> +			range.flags = IORESOURCE_MEM | IORESOURCE_MEM_64;
> +
> +			if (type & 0x40000000) {
> +				range.flags |= IORESOURCE_PREFETCH;
> +				suffix = "prefetch";
> +			}
> +
> +			pr_debug("  MEM %#x-%#x 64-bit %s\n", range.start,
> +				 range.end, suffix);
> +			break;
> +		}
> +
> +		memcpy(&ranges[i++], &range, sizeof(range));
> +		values += np;
> +	}
> +
> +	if (countp)
> +		*countp = count;
> +
> +	return ranges;
> +}
> +EXPORT_SYMBOL_GPL(of_pci_parse_ranges);
> diff --git a/include/linux/of_pci.h b/include/linux/of_pci.h
> index bb115de..c0db6ea 100644
> --- a/include/linux/of_pci.h
> +++ b/include/linux/of_pci.h
> @@ -10,5 +10,7 @@ int of_irq_map_pci(const struct pci_dev *pdev, struct of_irq *out_irq);
>  struct device_node;
>  struct device_node *of_pci_find_child_device(struct device_node *parent,
>  					     unsigned int devfn);
> +struct resource *of_pci_parse_ranges(struct device_node *node,
> +				     unsigned int *countp);
>  
>  #endif
> 



WARNING: multiple messages have this Message-ID (diff)
From: robherring2@gmail.com (Rob Herring)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v3 09/10] of: Add of_pci_parse_ranges()
Date: Tue, 31 Jul 2012 15:07:31 -0500	[thread overview]
Message-ID: <50183B03.2090809@gmail.com> (raw)
In-Reply-To: <1343332512-28762-10-git-send-email-thierry.reding@avionic-design.de>

On 07/26/2012 02:55 PM, Thierry Reding wrote:
> This new function parses the ranges property of PCI device nodes into
> an array of struct resource elements. It is useful in multiple-port PCI
> host controller drivers to collect information about the ranges that it
> needs to forward to the respective ports.

It seems to me that some of the DT PCI code in arch/powerpc/kernel/pci*
like pci_process_bridge_OF_ranges() should apply for ARM as well.

Each arch defining their own pci controller structs complicates this,
but I would think at least the DT parsing can be common.

> Signed-off-by: Thierry Reding <thierry.reding@avionic-design.de>
> ---
> Changes in v3:
> - new patch
> 
>  drivers/of/of_pci.c    | 84 +++++++++++++++++++++++++++++++++++++++++++++++++-
>  include/linux/of_pci.h |  2 ++
>  2 files changed, 85 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/of/of_pci.c b/drivers/of/of_pci.c
> index 13e37e2..bcff301 100644
> --- a/drivers/of/of_pci.c
> +++ b/drivers/of/of_pci.c
> @@ -1,7 +1,8 @@
>  #include <linux/kernel.h>
>  #include <linux/export.h>
> -#include <linux/of.h>
> +#include <linux/of_address.h>
>  #include <linux/of_pci.h>
> +#include <linux/slab.h>
>  #include <asm/prom.h>
>  
>  static inline int __of_pci_pci_compare(struct device_node *node,
> @@ -40,3 +41,84 @@ struct device_node *of_pci_find_child_device(struct device_node *parent,
>  	return NULL;
>  }
>  EXPORT_SYMBOL_GPL(of_pci_find_child_device);
> +
> +struct resource *of_pci_parse_ranges(struct device_node *node,
> +				     unsigned int *countp)
> +{
> +	unsigned int count, i = 0;
> +	struct resource *ranges;

I think res or pci_res would be clearer than ranges that this is a
struct resource.

> +	const __be32 *values;
> +	int len, pna, np;
> +
> +	values = of_get_property(node, "ranges", &len);
> +	if (!values)
> +		return NULL;
> +
> +	pna = of_n_addr_cells(node);
> +	np = pna + 5;
> +
> +	count = len / (np * sizeof(*values));
> +
> +	ranges = kzalloc(sizeof(*ranges) * count, GFP_KERNEL);
> +	if (!ranges)
> +		return NULL;
> +
> +	pr_debug("PCI ranges:\n");
> +
> +	while ((len -= np * sizeof(*values)) >= 0) {
> +		u64 addr = of_translate_address(node, values + 3);
> +		u64 size = of_read_number(values + 3 + pna, 2);
> +		u32 type = be32_to_cpup(values);
> +		const char *suffix = "";
> +		struct resource range;

Same here.

Rob

> +
> +		memset(&range, 0, sizeof(range));
> +		range.start = addr;
> +		range.end = addr + size - 1;
> +
> +		switch ((type >> 24) & 0x3) {
> +		case 0:
> +			range.flags = IORESOURCE_MEM | IORESOURCE_PCI_CS;
> +			pr_debug("  CS  %#x-%#x\n", range.start, range.end);
> +			break;
> +
> +		case 1:
> +			range.flags = IORESOURCE_IO;
> +			pr_debug("  IO  %#x-%#x\n", range.start, range.end);
> +			break;
> +
> +		case 2:
> +			range.flags = IORESOURCE_MEM;
> +
> +			if (type & 0x40000000) {
> +				range.flags |= IORESOURCE_PREFETCH;
> +				suffix = "prefetch";
> +			}
> +
> +			pr_debug("  MEM %#x-%#x %s\n", range.start, range.end,
> +				 suffix);
> +			break;
> +
> +		case 3:
> +			range.flags = IORESOURCE_MEM | IORESOURCE_MEM_64;
> +
> +			if (type & 0x40000000) {
> +				range.flags |= IORESOURCE_PREFETCH;
> +				suffix = "prefetch";
> +			}
> +
> +			pr_debug("  MEM %#x-%#x 64-bit %s\n", range.start,
> +				 range.end, suffix);
> +			break;
> +		}
> +
> +		memcpy(&ranges[i++], &range, sizeof(range));
> +		values += np;
> +	}
> +
> +	if (countp)
> +		*countp = count;
> +
> +	return ranges;
> +}
> +EXPORT_SYMBOL_GPL(of_pci_parse_ranges);
> diff --git a/include/linux/of_pci.h b/include/linux/of_pci.h
> index bb115de..c0db6ea 100644
> --- a/include/linux/of_pci.h
> +++ b/include/linux/of_pci.h
> @@ -10,5 +10,7 @@ int of_irq_map_pci(const struct pci_dev *pdev, struct of_irq *out_irq);
>  struct device_node;
>  struct device_node *of_pci_find_child_device(struct device_node *parent,
>  					     unsigned int devfn);
> +struct resource *of_pci_parse_ranges(struct device_node *node,
> +				     unsigned int *countp);
>  
>  #endif
> 

  reply	other threads:[~2012-07-31 20:07 UTC|newest]

Thread overview: 209+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-07-26 19:55 [PATCH v3 00/10] ARM: tegra: Add PCIe device tree support Thierry Reding
2012-07-26 19:55 ` Thierry Reding
2012-07-26 19:55 ` [PATCH v3 01/10] PCI: Keep pci_fixup_irqs() around after init Thierry Reding
2012-07-26 19:55   ` Thierry Reding
2012-08-14  5:06   ` Bjorn Helgaas
2012-08-14  5:06     ` Bjorn Helgaas
2012-08-14  5:37     ` Thierry Reding
2012-08-14  5:37       ` Thierry Reding
2012-08-14  5:37       ` Thierry Reding
2012-08-15 17:06   ` Bjorn Helgaas
2012-08-15 17:06     ` Bjorn Helgaas
2012-08-15 17:06     ` Bjorn Helgaas
2012-08-15 19:28     ` Thierry Reding
2012-08-15 19:28       ` Thierry Reding
2012-08-15 19:42       ` Bjorn Helgaas
2012-08-15 19:42         ` Bjorn Helgaas
2012-08-15 20:01         ` Thierry Reding
2012-08-15 20:01           ` Thierry Reding
2012-08-15 20:01           ` Thierry Reding
2012-09-07 16:19         ` Stephen Warren
2012-09-07 16:19           ` Stephen Warren
2012-09-07 16:19           ` Stephen Warren
2012-09-07 17:00           ` Thierry Reding
2012-09-07 17:00             ` Thierry Reding
2012-09-07 17:00             ` Thierry Reding
2012-09-07 17:22             ` Bjorn Helgaas
2012-09-07 17:22               ` Bjorn Helgaas
2012-09-14 18:55               ` Thierry Reding
2012-09-14 18:55                 ` Thierry Reding
2012-09-14 18:55                 ` Thierry Reding
2012-09-14 19:45                 ` Bjorn Helgaas
2012-09-14 19:45                   ` Bjorn Helgaas
2012-09-14 19:45                   ` Bjorn Helgaas
2012-07-26 19:55 ` [PATCH v3 02/10] ARM: pci: Keep pci_common_init() " Thierry Reding
2012-07-26 19:55   ` Thierry Reding
2012-07-26 19:55 ` [PATCH v3 03/10] ARM: pci: Allow passing per-controller private data Thierry Reding
2012-07-26 19:55   ` Thierry Reding
2012-07-26 19:55   ` Thierry Reding
2012-07-26 19:55 ` [PATCH v3 04/10] ARM: tegra: Move tegra_pcie_xclk_clamp() to PMC Thierry Reding
2012-07-26 19:55   ` Thierry Reding
2012-07-26 19:55   ` Thierry Reding
2012-07-26 19:55 ` [PATCH v3 05/10] resource: add PCI configuration space support Thierry Reding
2012-07-26 19:55   ` Thierry Reding
2012-08-14  5:00   ` Bjorn Helgaas
2012-08-14  5:00     ` Bjorn Helgaas
2012-08-14  5:00     ` Bjorn Helgaas
2012-08-14  5:55     ` Thierry Reding
2012-08-14  5:55       ` Thierry Reding
2012-08-14  5:55       ` Thierry Reding
2012-08-14 17:38       ` Bjorn Helgaas
2012-08-14 17:38         ` Bjorn Helgaas
2012-08-14 18:01         ` Thierry Reding
2012-08-14 18:01           ` Thierry Reding
2012-08-14 18:01           ` Thierry Reding
2012-08-14 21:44           ` Bjorn Helgaas
2012-08-14 21:44             ` Bjorn Helgaas
2012-08-15  6:49             ` Thierry Reding
2012-08-15  6:49               ` Thierry Reding
2012-08-15  6:49               ` Thierry Reding
2012-08-16 15:18               ` Stephen Warren
2012-08-16 15:18                 ` Stephen Warren
2012-08-16 15:18                 ` Stephen Warren
2012-08-16 18:27                 ` Thierry Reding
2012-08-16 18:27                   ` Thierry Reding
2012-08-16 18:27                   ` Thierry Reding
2012-07-26 19:55 ` [PATCH v3 06/10] ARM: tegra: Rewrite PCIe support as a driver Thierry Reding
2012-07-26 19:55   ` Thierry Reding
2012-07-26 19:55 ` [PATCH v3 07/10] ARM: tegra: pcie: Add MSI support Thierry Reding
2012-07-26 19:55   ` Thierry Reding
2012-07-26 19:55   ` Thierry Reding
2012-07-26 19:55 ` [PATCH v3 08/10] of/address: Handle #address-cells > 2 specially Thierry Reding
2012-07-26 19:55   ` Thierry Reding
2012-07-31 20:18   ` Rob Herring
2012-07-31 20:18     ` Rob Herring
2012-07-31 20:18     ` Rob Herring
2012-08-15 20:06     ` Thierry Reding
2012-08-15 20:06       ` Thierry Reding
2012-09-07 16:24       ` Stephen Warren
2012-09-07 16:24         ` Stephen Warren
2012-09-07 16:24         ` Stephen Warren
2012-09-07 16:32         ` Rob Herring
2012-09-07 16:32           ` Rob Herring
2012-09-07 16:32           ` Rob Herring
2012-07-26 19:55 ` [PATCH v3 09/10] of: Add of_pci_parse_ranges() Thierry Reding
2012-07-26 19:55   ` Thierry Reding
2012-07-26 19:55   ` Thierry Reding
2012-07-31 20:07   ` Rob Herring [this message]
2012-07-31 20:07     ` Rob Herring
2012-08-01  6:54     ` Thierry Reding
2012-08-01  6:54       ` Thierry Reding
2012-08-01  6:54       ` Thierry Reding
2012-08-01 16:07       ` Stephen Warren
2012-08-01 16:07         ` Stephen Warren
2012-08-01 16:07         ` Stephen Warren
2012-07-26 19:55 ` [PATCH v3 10/10] ARM: tegra: pcie: Add device tree support Thierry Reding
2012-07-26 19:55   ` Thierry Reding
2012-08-14 20:12   ` Thierry Reding
2012-08-14 20:12     ` Thierry Reding
2012-08-14 20:12     ` Thierry Reding
2012-08-14 23:50     ` Bjorn Helgaas
2012-08-14 23:50       ` Bjorn Helgaas
2012-08-15  6:37       ` Thierry Reding
2012-08-15  6:37         ` Thierry Reding
2012-08-15 12:18         ` Bjorn Helgaas
2012-08-15 12:18           ` Bjorn Helgaas
2012-08-15 12:30           ` Thierry Reding
2012-08-15 12:30             ` Thierry Reding
2012-08-15 12:30             ` Thierry Reding
2012-08-15 14:36             ` Bjorn Helgaas
2012-08-15 14:36               ` Bjorn Helgaas
2012-08-15 14:36               ` Bjorn Helgaas
2012-08-15 14:57               ` Thierry Reding
2012-08-15 14:57                 ` Thierry Reding
2012-08-15 14:57                 ` Thierry Reding
2012-08-15 20:25                 ` Arnd Bergmann
2012-08-15 20:25                   ` Arnd Bergmann
2012-08-15 20:25                   ` Arnd Bergmann
2012-08-15 20:48                   ` Bjorn Helgaas
2012-08-15 20:48                     ` Bjorn Helgaas
2012-08-15 20:48                     ` Bjorn Helgaas
2012-08-16  4:55                   ` Thierry Reding
2012-08-16  4:55                     ` Thierry Reding
2012-08-16  4:55                     ` Thierry Reding
2012-08-16  7:03                     ` Arnd Bergmann
2012-08-16  7:03                       ` Arnd Bergmann
2012-08-16  7:03                       ` Arnd Bergmann
2012-08-16  7:47                       ` Thierry Reding
2012-08-16  7:47                         ` Thierry Reding
2012-08-16  7:47                         ` Thierry Reding
2012-08-16 12:15           ` Thierry Reding
2012-08-16 12:15             ` Thierry Reding
2012-08-16 12:15             ` Thierry Reding
2012-07-31 16:18 ` [PATCH v3 00/10] ARM: tegra: Add PCIe " Stephen Warren
2012-07-31 16:18   ` Stephen Warren
2012-07-31 16:18   ` Stephen Warren
2012-08-01  6:35   ` Thierry Reding
2012-08-01  6:35     ` Thierry Reding
2012-08-01  6:35     ` Thierry Reding
2012-08-01 17:02     ` Stephen Warren
2012-08-01 17:02       ` Stephen Warren
2012-08-01 17:02       ` Stephen Warren
2012-08-02  6:15       ` Thierry Reding
2012-08-02  6:15         ` Thierry Reding
2012-08-02  6:15         ` Thierry Reding
2012-08-06 19:42 ` Stephen Warren
2012-08-06 19:42   ` Stephen Warren
2012-08-07 18:20   ` Thierry Reding
2012-08-07 18:20     ` Thierry Reding
2012-08-13 17:40   ` Thierry Reding
2012-08-13 17:40     ` Thierry Reding
2012-08-13 18:47     ` Stephen Warren
2012-08-13 18:47       ` Stephen Warren
2012-08-13 18:47       ` Stephen Warren
2012-08-13 20:33       ` Thierry Reding
2012-08-13 20:33         ` Thierry Reding
2012-08-13 20:33         ` Thierry Reding
2012-08-13 21:38         ` Rob Herring
2012-08-13 21:38           ` Rob Herring
2012-08-14  6:14           ` Thierry Reding
2012-08-14  6:14             ` Thierry Reding
2012-08-13 23:18       ` Bjorn Helgaas
2012-08-13 23:18         ` Bjorn Helgaas
2012-08-13 23:18         ` Bjorn Helgaas
2012-08-14  6:29         ` Thierry Reding
2012-08-14  6:29           ` Thierry Reding
2012-08-14  6:29           ` Thierry Reding
2012-08-14 19:39         ` Stephen Warren
2012-08-14 19:39           ` Stephen Warren
2012-08-14 19:58           ` Thierry Reding
2012-08-14 19:58             ` Thierry Reding
2012-08-14 19:58             ` Thierry Reding
2012-08-14 21:55             ` Bjorn Helgaas
2012-08-14 21:55               ` Bjorn Helgaas
2012-08-14 21:55               ` Bjorn Helgaas
2012-08-14 22:58               ` Stephen Warren
2012-08-14 22:58                 ` Stephen Warren
2012-08-14 22:58                 ` Stephen Warren
2012-08-14 23:51                 ` Stephen Warren
2012-08-14 23:51                   ` Stephen Warren
2012-08-14 23:51                   ` Stephen Warren
2012-08-15 19:04                   ` Stephen Warren
2012-08-15 19:04                     ` Stephen Warren
2012-08-15 19:04                     ` Stephen Warren
2012-08-15 20:09                     ` Thierry Reding
2012-08-15 20:09                       ` Thierry Reding
2012-08-15 20:11                       ` Stephen Warren
2012-08-15 20:11                         ` Stephen Warren
2012-08-15 20:11                         ` Stephen Warren
2012-08-15 20:19                         ` Thierry Reding
2012-08-15 20:19                           ` Thierry Reding
2012-08-15 20:19                           ` Thierry Reding
2012-09-07 23:34                   ` Stephen Warren
2012-09-07 23:34                     ` Stephen Warren
2012-09-08  0:04                     ` Russell King - ARM Linux
2012-09-08  0:04                       ` Russell King - ARM Linux
2012-09-08  0:04                       ` Russell King - ARM Linux
2012-09-08  5:53                       ` Stephen Warren
2012-09-08  5:53                         ` Stephen Warren
2012-09-08  5:53                         ` Stephen Warren
2012-09-08 17:51                       ` Bjorn Helgaas
2012-09-08 17:51                         ` Bjorn Helgaas
2012-09-08 17:51                         ` Bjorn Helgaas
2012-09-18  6:33                         ` Thierry Reding
2012-09-18  6:33                           ` Thierry Reding
2012-09-18 15:56                           ` Bjorn Helgaas
2012-09-18 15:56                             ` Bjorn Helgaas
2012-08-15  0:08                 ` Bjorn Helgaas
2012-08-15  0:08                   ` Bjorn Helgaas
2012-08-15  0:08                   ` Bjorn Helgaas

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=50183B03.2090809@gmail.com \
    --to=robherring2@gmail.com \
    --cc=arnd@arndb.de \
    --cc=bhelgaas@google.com \
    --cc=ccross@android.com \
    --cc=devicetree-discuss@lists.ozlabs.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-pci@vger.kernel.org \
    --cc=linux-tegra@vger.kernel.org \
    --cc=linux@arm.linux.org.uk \
    --cc=rob.herring@calxeda.com \
    --cc=thierry.reding@avionic-design.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.