From: Liviu Dudau <Liviu.Dudau@arm.com> To: Rob Herring <robherring2@gmail.com> Cc: Bjorn Helgaas <bhelgaas@google.com>, Arnd Bergmann <arnd@arndb.de>, Rob Herring <robh+dt@kernel.org>, Jason Gunthorpe <jgunthorpe@obsidianresearch.com>, Benjamin Herrenschmidt <benh@kernel.crashing.org>, Catalin Marinas <Catalin.Marinas@arm.com>, Will Deacon <Will.Deacon@arm.com>, Russell King <linux@arm.linux.org.uk>, linux-pci <linux-pci@vger.kernel.org>, Linus Walleij <linus.walleij@linaro.org>, Tanmay Inamdar <tinamdar@apm.com>, Grant Likely <grant.likely@secretlab.ca>, Sinan Kaya <okaya@codeaurora.org>, Jingoo Han <jg1.han@samsung.com>, Kukjin Kim <kgene.kim@samsung.com>, Suravee Suthikulanit <suravee.suthikulpanit@amd.com>, linux-arch <linux-arch@vger.kernel.org>, LKML <linux-kernel@vger.kernel.org>, Device Tree ML <devicetree@vger.kernel.org>, LAKML <linux-arm-kernel@lists.infradead.org>, "grant.likely@linaro.org" <grant.likely@linaro.org> Subject: Re: [PATCH v11 04/10] PCI: OF: Fix the conversion of IO ranges into IO resources. Date: Mon, 22 Sep 2014 16:32:07 +0100 [thread overview] Message-ID: <20140922153207.GA1994@e106497-lin.cambridge.arm.com> (raw) In-Reply-To: <541DBA57.2000903@gmail.com> On Sat, Sep 20, 2014 at 06:33:11PM +0100, Rob Herring wrote: > On 09/17/2014 08:30 PM, Liviu Dudau wrote: > > The ranges property for a host bridge controller in DT describes > > the mapping between the PCI bus address and the CPU physical address. > > The resources framework however expects that the IO resources start > > at a pseudo "port" address 0 (zero) and have a maximum size of IO_SPACE_LIMIT. > > The conversion from pci ranges to resources failed to take that into account. > > > > In the process move the function into drivers/of/address.c as it now > > depends on pci_address_to_pio() code and make it return an error code. > > Also fix all the drivers that depend on the old behaviour by fetching > > the CPU physical address based on the port number. > > > > Cc: Grant Likely <grant.likely@linaro.org> > > Cc: Rob Herring <robh+dt@kernel.org> > > Cc: Arnd Bergmann <arnd@arndb.de> > > Cc: Linus Walleij <linus.walleij@linaro.org> > > Cc: Thierry Reding <thierry.reding@gmail.com> > > Cc: Simon Horman <horms@verge.net.au> > > Cc: Catalin Marinas <catalin.marinas@arm.com> > > Signed-off-by: Liviu Dudau <Liviu.Dudau@arm.com> > > A few minor things below. > > > --- > > arch/arm/mach-integrator/pci_v3.c | 23 ++++++++++---------- > > drivers/of/address.c | 46 +++++++++++++++++++++++++++++++++++++++ > > drivers/pci/host/pci-tegra.c | 10 ++++++--- > > drivers/pci/host/pcie-rcar.c | 21 +++++++++++++----- > > include/linux/of_address.h | 13 ++--------- > > 5 files changed, 82 insertions(+), 31 deletions(-) > > > > diff --git a/arch/arm/mach-integrator/pci_v3.c b/arch/arm/mach-integrator/pci_v3.c > > index 05e1f73..3321e1b 100644 > > --- a/arch/arm/mach-integrator/pci_v3.c > > +++ b/arch/arm/mach-integrator/pci_v3.c > > @@ -660,6 +660,7 @@ static void __init pci_v3_preinit(void) > > { > > unsigned long flags; > > unsigned int temp; > > + phys_addr_t io_address = pci_pio_to_address(io_mem.start); > > > > pcibios_min_mem = 0x00100000; > > > > @@ -701,7 +702,7 @@ static void __init pci_v3_preinit(void) > > /* > > * Setup window 2 - PCI IO > > */ > > - v3_writel(V3_LB_BASE2, v3_addr_to_lb_base2(io_mem.start) | > > + v3_writel(V3_LB_BASE2, v3_addr_to_lb_base2(io_address) | > > V3_LB_BASE_ENABLE); > > v3_writew(V3_LB_MAP2, v3_addr_to_lb_map2(0)); > > > > @@ -742,6 +743,7 @@ static void __init pci_v3_preinit(void) > > static void __init pci_v3_postinit(void) > > { > > unsigned int pci_cmd; > > + phys_addr_t io_address = pci_pio_to_address(io_mem.start); > > > > pci_cmd = PCI_COMMAND_MEMORY | > > PCI_COMMAND_MASTER | PCI_COMMAND_INVALIDATE; > > @@ -758,7 +760,7 @@ static void __init pci_v3_postinit(void) > > "interrupt: %d\n", ret); > > #endif > > > > - register_isa_ports(non_mem.start, io_mem.start, 0); > > + register_isa_ports(non_mem.start, io_address, 0); > > } > > > > /* > > @@ -867,33 +869,32 @@ static int __init pci_v3_probe(struct platform_device *pdev) > > > > for_each_of_pci_range(&parser, &range) { > > if (!range.flags) { > > - of_pci_range_to_resource(&range, np, &conf_mem); > > + ret = of_pci_range_to_resource(&range, np, &conf_mem); > > conf_mem.name = "PCIv3 config"; > > } > > if (range.flags & IORESOURCE_IO) { > > - of_pci_range_to_resource(&range, np, &io_mem); > > + ret = of_pci_range_to_resource(&range, np, &io_mem); > > io_mem.name = "PCIv3 I/O"; > > } > > if ((range.flags & IORESOURCE_MEM) && > > !(range.flags & IORESOURCE_PREFETCH)) { > > non_mem_pci = range.pci_addr; > > non_mem_pci_sz = range.size; > > - of_pci_range_to_resource(&range, np, &non_mem); > > + ret = of_pci_range_to_resource(&range, np, &non_mem); > > non_mem.name = "PCIv3 non-prefetched mem"; > > } > > if ((range.flags & IORESOURCE_MEM) && > > (range.flags & IORESOURCE_PREFETCH)) { > > pre_mem_pci = range.pci_addr; > > pre_mem_pci_sz = range.size; > > - of_pci_range_to_resource(&range, np, &pre_mem); > > + ret = of_pci_range_to_resource(&range, np, &pre_mem); > > pre_mem.name = "PCIv3 prefetched mem"; > > } > > - } > > > > - if (!conf_mem.start || !io_mem.start || > > - !non_mem.start || !pre_mem.start) { > > - dev_err(&pdev->dev, "missing ranges in device node\n"); > > - return -EINVAL; > > + if (ret < 0) { > > + dev_err(&pdev->dev, "missing ranges in device node\n"); > > + return -EINVAL; > > You should return ret rather than potentially changing the return value. I was trying to keep the existing behaviour, which was to return -EINVAL if the parsing has failed. But I can return ret and propagate the original error code. > > > + } > > } > > > > pci_v3.map_irq = of_irq_parse_and_map_pci; > > diff --git a/drivers/of/address.c b/drivers/of/address.c > > index 2373a92..ff10b64 100644 > > --- a/drivers/of/address.c > > +++ b/drivers/of/address.c > > @@ -947,3 +947,49 @@ bool of_dma_is_coherent(struct device_node *np) > > return false; > > } > > EXPORT_SYMBOL_GPL(of_dma_is_coherent); > > + > > +/* > > + * of_pci_range_to_resource - Create a resource from an of_pci_range > > + * @range: the PCI range that describes the resource > > + * @np: device node where the range belongs to > > + * @res: pointer to a valid resource that will be updated to > > + * reflect the values contained in the range. > > + * > > + * Returns EINVAL if the range cannot be converted to resource. > > + * > > + * Note that if the range is an IO range, the resource will be converted > > + * using pci_address_to_pio() which can fail if it is called too early or > > + * if the range cannot be matched to any host bridge IO space (our case here). > > + * To guard against that we try to register the IO range first. > > + * If that fails we know that pci_address_to_pio() will do too. > > + */ > > +int of_pci_range_to_resource(struct of_pci_range *range, > > + struct device_node *np, struct resource *res) > > +{ > > + int err; > > + res->flags = range->flags; > > + res->parent = res->child = res->sibling = NULL; > > + res->name = np->full_name; > > + > > + if (res->flags & IORESOURCE_IO) { > > + unsigned long port = -1; > > Assigning a signed value to unsigned... Ooops, sorry about that. Removed the initialisation now. > > Does port need to be 64-bit on 64-bit hosts? I'm following existing APIs. Basically my function is a variant of __of_address_to_resource() > > > + err = pci_register_io_range(range->cpu_addr, range->size); > > + if (err) > > + goto invalid_range; > > + port = pci_address_to_pio(range->cpu_addr); > > + if (port == (unsigned long)-1) { > > + err = -EINVAL; > > + goto invalid_range; > > + } > > + res->start = port; > > + } else { > > + res->start = range->cpu_addr; > > + } > > + res->end = res->start + range->size - 1; > > + return 0; > > + > > +invalid_range: > > + res->start = (resource_size_t)OF_BAD_ADDR; > > + res->end = (resource_size_t)OF_BAD_ADDR; > > + return err; > > +} > > diff --git a/drivers/pci/host/pci-tegra.c b/drivers/pci/host/pci-tegra.c > > index 0fb0fdb..946935d 100644 > > --- a/drivers/pci/host/pci-tegra.c > > +++ b/drivers/pci/host/pci-tegra.c > > @@ -626,13 +626,14 @@ DECLARE_PCI_FIXUP_FINAL(PCI_ANY_ID, PCI_ANY_ID, tegra_pcie_relax_enable); > > static int tegra_pcie_setup(int nr, struct pci_sys_data *sys) > > { > > struct tegra_pcie *pcie = sys_to_pcie(sys); > > + phys_addr_t io_start = pci_pio_to_address(pcie->io.start); > > > > pci_add_resource_offset(&sys->resources, &pcie->mem, sys->mem_offset); > > pci_add_resource_offset(&sys->resources, &pcie->prefetch, > > sys->mem_offset); > > pci_add_resource(&sys->resources, &pcie->busn); > > > > - pci_ioremap_io(nr * SZ_64K, pcie->io.start); > > + pci_ioremap_io(nr * SZ_64K, io_start); > > > > return 1; > > } > > @@ -737,6 +738,7 @@ static irqreturn_t tegra_pcie_isr(int irq, void *arg) > > static void tegra_pcie_setup_translations(struct tegra_pcie *pcie) > > { > > u32 fpci_bar, size, axi_address; > > + phys_addr_t io_start = pci_pio_to_address(pcie->io.start); > > > > /* Bar 0: type 1 extended configuration space */ > > fpci_bar = 0xfe100000; > > @@ -749,7 +751,7 @@ static void tegra_pcie_setup_translations(struct tegra_pcie *pcie) > > /* Bar 1: downstream IO bar */ > > fpci_bar = 0xfdfc0000; > > size = resource_size(&pcie->io); > > - axi_address = pcie->io.start; > > + axi_address = io_start; > > afi_writel(pcie, axi_address, AFI_AXI_BAR1_START); > > afi_writel(pcie, size >> 12, AFI_AXI_BAR1_SZ); > > afi_writel(pcie, fpci_bar, AFI_FPCI_BAR1); > > @@ -1520,7 +1522,9 @@ static int tegra_pcie_parse_dt(struct tegra_pcie *pcie) > > } > > > > for_each_of_pci_range(&parser, &range) { > > - of_pci_range_to_resource(&range, np, &res); > > + err = of_pci_range_to_resource(&range, np, &res); > > + if (err < 0) > > + return err; > > > > switch (res.flags & IORESOURCE_TYPE_BITS) { > > case IORESOURCE_IO: > > diff --git a/drivers/pci/host/pcie-rcar.c b/drivers/pci/host/pcie-rcar.c > > index 4884ee5..61158e0 100644 > > --- a/drivers/pci/host/pcie-rcar.c > > +++ b/drivers/pci/host/pcie-rcar.c > > @@ -323,6 +323,7 @@ static void rcar_pcie_setup_window(int win, struct rcar_pcie *pcie) > > > > /* Setup PCIe address space mappings for each resource */ > > resource_size_t size; > > + resource_size_t res_start; > > u32 mask; > > > > rcar_pci_write_reg(pcie, 0x00000000, PCIEPTCTLR(win)); > > @@ -335,8 +336,13 @@ static void rcar_pcie_setup_window(int win, struct rcar_pcie *pcie) > > mask = (roundup_pow_of_two(size) / SZ_128) - 1; > > rcar_pci_write_reg(pcie, mask << 7, PCIEPAMR(win)); > > > > - rcar_pci_write_reg(pcie, upper_32_bits(res->start), PCIEPARH(win)); > > - rcar_pci_write_reg(pcie, lower_32_bits(res->start), PCIEPARL(win)); > > + if (res->flags & IORESOURCE_IO) > > + res_start = pci_pio_to_address(res->start); > > + else > > + res_start = res->start; > > + > > + rcar_pci_write_reg(pcie, upper_32_bits(res_start), PCIEPARH(win)); > > + rcar_pci_write_reg(pcie, lower_32_bits(res_start), PCIEPARL(win)); > > > > /* First resource is for IO */ > > mask = PAR_ENABLE; > > @@ -363,9 +369,10 @@ static int rcar_pcie_setup(int nr, struct pci_sys_data *sys) > > > > rcar_pcie_setup_window(i, pcie); > > > > - if (res->flags & IORESOURCE_IO) > > - pci_ioremap_io(nr * SZ_64K, res->start); > > - else > > + if (res->flags & IORESOURCE_IO) { > > + phys_addr_t io_start = pci_pio_to_address(res->start); > > + pci_ioremap_io(nr * SZ_64K, io_start); > > + } else > > pci_add_resource(&sys->resources, res); > > } > > pci_add_resource(&sys->resources, &pcie->busn); > > @@ -935,8 +942,10 @@ static int rcar_pcie_probe(struct platform_device *pdev) > > } > > > > for_each_of_pci_range(&parser, &range) { > > - of_pci_range_to_resource(&range, pdev->dev.of_node, > > + err = of_pci_range_to_resource(&range, pdev->dev.of_node, > > &pcie->res[win++]); > > + if (err < 0) > > + return err; > > > > if (win > RCAR_PCI_MAX_RESOURCES) > > break; > > diff --git a/include/linux/of_address.h b/include/linux/of_address.h > > index f8cc7da..c9d70deb 100644 > > --- a/include/linux/of_address.h > > +++ b/include/linux/of_address.h > > @@ -23,17 +23,8 @@ struct of_pci_range { > > #define for_each_of_pci_range(parser, range) \ > > for (; of_pci_range_parser_one(parser, range);) > > > > -static inline void of_pci_range_to_resource(struct of_pci_range *range, > > - struct device_node *np, > > - struct resource *res) > > -{ > > - res->flags = range->flags; > > - res->start = range->cpu_addr; > > - res->end = range->cpu_addr + range->size - 1; > > - res->parent = res->child = res->sibling = NULL; > > - res->name = np->full_name; > > -} > > - > > +extern int of_pci_range_to_resource(struct of_pci_range *range, > > + struct device_node *np, struct resource *res); > > We probably need an empty version of this now for !OF_ADDRESS. Good catch! Will update my patch. Thanks for finding time to review the series! Best regards, Liviu > > Rob > -- ==================== | I would like to | | fix the world, | | but they're not | | giving me the | \ source code! / --------------- ¯\_(ツ)_/¯
WARNING: multiple messages have this Message-ID (diff)
From: Liviu Dudau <Liviu.Dudau@arm.com> To: Rob Herring <robherring2@gmail.com> Cc: Bjorn Helgaas <bhelgaas@google.com>, Arnd Bergmann <arnd@arndb.de>, Rob Herring <robh+dt@kernel.org>, Jason Gunthorpe <jgunthorpe@obsidianresearch.com>, Benjamin Herrenschmidt <benh@kernel.crashing.org>, Catalin Marinas <Catalin.Marinas@arm.com>, Will Deacon <Will.Deacon@arm.com>, Russell King <linux@arm.linux.org.uk>, linux-pci <linux-pci@vger.kernel.org>, Linus Walleij <linus.walleij@linaro.org>, Tanmay Inamdar <tinamdar@apm.com>, Grant Likely <grant.likely@secretlab.ca>, Sinan Kaya <okaya@codeaurora.org>, Jingoo Han <jg1.han@samsung.com>, Kukjin Kim <kgene.kim@samsung.com>, Suravee Suthikulanit <suravee.suthikulpanit@amd.com>, linux-arch <linux-arch@vger.kernel.org>, LKML <linux-kernel@vger.kernel.org>, Device Tree ML <devicetree@vger.kernel.org>, LAKML <linux-arm-kernel@lists.infradead.org>, "grant.likely@linaro.org" <grant.likely@linaro.org>, Thierry Reding <thierry.reding@gmail.com>, Simon Horman <horms@verge.net.au> Subject: Re: [PATCH v11 04/10] PCI: OF: Fix the conversion of IO ranges into IO resources. Date: Mon, 22 Sep 2014 16:32:07 +0100 [thread overview] Message-ID: <20140922153207.GA1994@e106497-lin.cambridge.arm.com> (raw) Message-ID: <20140922153207.astQkTgNt5pvyT10YT2t27GX82svEbB9CdGyuLcC5aQ@z> (raw) In-Reply-To: <541DBA57.2000903@gmail.com> On Sat, Sep 20, 2014 at 06:33:11PM +0100, Rob Herring wrote: > On 09/17/2014 08:30 PM, Liviu Dudau wrote: > > The ranges property for a host bridge controller in DT describes > > the mapping between the PCI bus address and the CPU physical address. > > The resources framework however expects that the IO resources start > > at a pseudo "port" address 0 (zero) and have a maximum size of IO_SPACE_LIMIT. > > The conversion from pci ranges to resources failed to take that into account. > > > > In the process move the function into drivers/of/address.c as it now > > depends on pci_address_to_pio() code and make it return an error code. > > Also fix all the drivers that depend on the old behaviour by fetching > > the CPU physical address based on the port number. > > > > Cc: Grant Likely <grant.likely@linaro.org> > > Cc: Rob Herring <robh+dt@kernel.org> > > Cc: Arnd Bergmann <arnd@arndb.de> > > Cc: Linus Walleij <linus.walleij@linaro.org> > > Cc: Thierry Reding <thierry.reding@gmail.com> > > Cc: Simon Horman <horms@verge.net.au> > > Cc: Catalin Marinas <catalin.marinas@arm.com> > > Signed-off-by: Liviu Dudau <Liviu.Dudau@arm.com> > > A few minor things below. > > > --- > > arch/arm/mach-integrator/pci_v3.c | 23 ++++++++++---------- > > drivers/of/address.c | 46 +++++++++++++++++++++++++++++++++++++++ > > drivers/pci/host/pci-tegra.c | 10 ++++++--- > > drivers/pci/host/pcie-rcar.c | 21 +++++++++++++----- > > include/linux/of_address.h | 13 ++--------- > > 5 files changed, 82 insertions(+), 31 deletions(-) > > > > diff --git a/arch/arm/mach-integrator/pci_v3.c b/arch/arm/mach-integrator/pci_v3.c > > index 05e1f73..3321e1b 100644 > > --- a/arch/arm/mach-integrator/pci_v3.c > > +++ b/arch/arm/mach-integrator/pci_v3.c > > @@ -660,6 +660,7 @@ static void __init pci_v3_preinit(void) > > { > > unsigned long flags; > > unsigned int temp; > > + phys_addr_t io_address = pci_pio_to_address(io_mem.start); > > > > pcibios_min_mem = 0x00100000; > > > > @@ -701,7 +702,7 @@ static void __init pci_v3_preinit(void) > > /* > > * Setup window 2 - PCI IO > > */ > > - v3_writel(V3_LB_BASE2, v3_addr_to_lb_base2(io_mem.start) | > > + v3_writel(V3_LB_BASE2, v3_addr_to_lb_base2(io_address) | > > V3_LB_BASE_ENABLE); > > v3_writew(V3_LB_MAP2, v3_addr_to_lb_map2(0)); > > > > @@ -742,6 +743,7 @@ static void __init pci_v3_preinit(void) > > static void __init pci_v3_postinit(void) > > { > > unsigned int pci_cmd; > > + phys_addr_t io_address = pci_pio_to_address(io_mem.start); > > > > pci_cmd = PCI_COMMAND_MEMORY | > > PCI_COMMAND_MASTER | PCI_COMMAND_INVALIDATE; > > @@ -758,7 +760,7 @@ static void __init pci_v3_postinit(void) > > "interrupt: %d\n", ret); > > #endif > > > > - register_isa_ports(non_mem.start, io_mem.start, 0); > > + register_isa_ports(non_mem.start, io_address, 0); > > } > > > > /* > > @@ -867,33 +869,32 @@ static int __init pci_v3_probe(struct platform_device *pdev) > > > > for_each_of_pci_range(&parser, &range) { > > if (!range.flags) { > > - of_pci_range_to_resource(&range, np, &conf_mem); > > + ret = of_pci_range_to_resource(&range, np, &conf_mem); > > conf_mem.name = "PCIv3 config"; > > } > > if (range.flags & IORESOURCE_IO) { > > - of_pci_range_to_resource(&range, np, &io_mem); > > + ret = of_pci_range_to_resource(&range, np, &io_mem); > > io_mem.name = "PCIv3 I/O"; > > } > > if ((range.flags & IORESOURCE_MEM) && > > !(range.flags & IORESOURCE_PREFETCH)) { > > non_mem_pci = range.pci_addr; > > non_mem_pci_sz = range.size; > > - of_pci_range_to_resource(&range, np, &non_mem); > > + ret = of_pci_range_to_resource(&range, np, &non_mem); > > non_mem.name = "PCIv3 non-prefetched mem"; > > } > > if ((range.flags & IORESOURCE_MEM) && > > (range.flags & IORESOURCE_PREFETCH)) { > > pre_mem_pci = range.pci_addr; > > pre_mem_pci_sz = range.size; > > - of_pci_range_to_resource(&range, np, &pre_mem); > > + ret = of_pci_range_to_resource(&range, np, &pre_mem); > > pre_mem.name = "PCIv3 prefetched mem"; > > } > > - } > > > > - if (!conf_mem.start || !io_mem.start || > > - !non_mem.start || !pre_mem.start) { > > - dev_err(&pdev->dev, "missing ranges in device node\n"); > > - return -EINVAL; > > + if (ret < 0) { > > + dev_err(&pdev->dev, "missing ranges in device node\n"); > > + return -EINVAL; > > You should return ret rather than potentially changing the return value. I was trying to keep the existing behaviour, which was to return -EINVAL if the parsing has failed. But I can return ret and propagate the original error code. > > > + } > > } > > > > pci_v3.map_irq = of_irq_parse_and_map_pci; > > diff --git a/drivers/of/address.c b/drivers/of/address.c > > index 2373a92..ff10b64 100644 > > --- a/drivers/of/address.c > > +++ b/drivers/of/address.c > > @@ -947,3 +947,49 @@ bool of_dma_is_coherent(struct device_node *np) > > return false; > > } > > EXPORT_SYMBOL_GPL(of_dma_is_coherent); > > + > > +/* > > + * of_pci_range_to_resource - Create a resource from an of_pci_range > > + * @range: the PCI range that describes the resource > > + * @np: device node where the range belongs to > > + * @res: pointer to a valid resource that will be updated to > > + * reflect the values contained in the range. > > + * > > + * Returns EINVAL if the range cannot be converted to resource. > > + * > > + * Note that if the range is an IO range, the resource will be converted > > + * using pci_address_to_pio() which can fail if it is called too early or > > + * if the range cannot be matched to any host bridge IO space (our case here). > > + * To guard against that we try to register the IO range first. > > + * If that fails we know that pci_address_to_pio() will do too. > > + */ > > +int of_pci_range_to_resource(struct of_pci_range *range, > > + struct device_node *np, struct resource *res) > > +{ > > + int err; > > + res->flags = range->flags; > > + res->parent = res->child = res->sibling = NULL; > > + res->name = np->full_name; > > + > > + if (res->flags & IORESOURCE_IO) { > > + unsigned long port = -1; > > Assigning a signed value to unsigned... Ooops, sorry about that. Removed the initialisation now. > > Does port need to be 64-bit on 64-bit hosts? I'm following existing APIs. Basically my function is a variant of __of_address_to_resource() > > > + err = pci_register_io_range(range->cpu_addr, range->size); > > + if (err) > > + goto invalid_range; > > + port = pci_address_to_pio(range->cpu_addr); > > + if (port == (unsigned long)-1) { > > + err = -EINVAL; > > + goto invalid_range; > > + } > > + res->start = port; > > + } else { > > + res->start = range->cpu_addr; > > + } > > + res->end = res->start + range->size - 1; > > + return 0; > > + > > +invalid_range: > > + res->start = (resource_size_t)OF_BAD_ADDR; > > + res->end = (resource_size_t)OF_BAD_ADDR; > > + return err; > > +} > > diff --git a/drivers/pci/host/pci-tegra.c b/drivers/pci/host/pci-tegra.c > > index 0fb0fdb..946935d 100644 > > --- a/drivers/pci/host/pci-tegra.c > > +++ b/drivers/pci/host/pci-tegra.c > > @@ -626,13 +626,14 @@ DECLARE_PCI_FIXUP_FINAL(PCI_ANY_ID, PCI_ANY_ID, tegra_pcie_relax_enable); > > static int tegra_pcie_setup(int nr, struct pci_sys_data *sys) > > { > > struct tegra_pcie *pcie = sys_to_pcie(sys); > > + phys_addr_t io_start = pci_pio_to_address(pcie->io.start); > > > > pci_add_resource_offset(&sys->resources, &pcie->mem, sys->mem_offset); > > pci_add_resource_offset(&sys->resources, &pcie->prefetch, > > sys->mem_offset); > > pci_add_resource(&sys->resources, &pcie->busn); > > > > - pci_ioremap_io(nr * SZ_64K, pcie->io.start); > > + pci_ioremap_io(nr * SZ_64K, io_start); > > > > return 1; > > } > > @@ -737,6 +738,7 @@ static irqreturn_t tegra_pcie_isr(int irq, void *arg) > > static void tegra_pcie_setup_translations(struct tegra_pcie *pcie) > > { > > u32 fpci_bar, size, axi_address; > > + phys_addr_t io_start = pci_pio_to_address(pcie->io.start); > > > > /* Bar 0: type 1 extended configuration space */ > > fpci_bar = 0xfe100000; > > @@ -749,7 +751,7 @@ static void tegra_pcie_setup_translations(struct tegra_pcie *pcie) > > /* Bar 1: downstream IO bar */ > > fpci_bar = 0xfdfc0000; > > size = resource_size(&pcie->io); > > - axi_address = pcie->io.start; > > + axi_address = io_start; > > afi_writel(pcie, axi_address, AFI_AXI_BAR1_START); > > afi_writel(pcie, size >> 12, AFI_AXI_BAR1_SZ); > > afi_writel(pcie, fpci_bar, AFI_FPCI_BAR1); > > @@ -1520,7 +1522,9 @@ static int tegra_pcie_parse_dt(struct tegra_pcie *pcie) > > } > > > > for_each_of_pci_range(&parser, &range) { > > - of_pci_range_to_resource(&range, np, &res); > > + err = of_pci_range_to_resource(&range, np, &res); > > + if (err < 0) > > + return err; > > > > switch (res.flags & IORESOURCE_TYPE_BITS) { > > case IORESOURCE_IO: > > diff --git a/drivers/pci/host/pcie-rcar.c b/drivers/pci/host/pcie-rcar.c > > index 4884ee5..61158e0 100644 > > --- a/drivers/pci/host/pcie-rcar.c > > +++ b/drivers/pci/host/pcie-rcar.c > > @@ -323,6 +323,7 @@ static void rcar_pcie_setup_window(int win, struct rcar_pcie *pcie) > > > > /* Setup PCIe address space mappings for each resource */ > > resource_size_t size; > > + resource_size_t res_start; > > u32 mask; > > > > rcar_pci_write_reg(pcie, 0x00000000, PCIEPTCTLR(win)); > > @@ -335,8 +336,13 @@ static void rcar_pcie_setup_window(int win, struct rcar_pcie *pcie) > > mask = (roundup_pow_of_two(size) / SZ_128) - 1; > > rcar_pci_write_reg(pcie, mask << 7, PCIEPAMR(win)); > > > > - rcar_pci_write_reg(pcie, upper_32_bits(res->start), PCIEPARH(win)); > > - rcar_pci_write_reg(pcie, lower_32_bits(res->start), PCIEPARL(win)); > > + if (res->flags & IORESOURCE_IO) > > + res_start = pci_pio_to_address(res->start); > > + else > > + res_start = res->start; > > + > > + rcar_pci_write_reg(pcie, upper_32_bits(res_start), PCIEPARH(win)); > > + rcar_pci_write_reg(pcie, lower_32_bits(res_start), PCIEPARL(win)); > > > > /* First resource is for IO */ > > mask = PAR_ENABLE; > > @@ -363,9 +369,10 @@ static int rcar_pcie_setup(int nr, struct pci_sys_data *sys) > > > > rcar_pcie_setup_window(i, pcie); > > > > - if (res->flags & IORESOURCE_IO) > > - pci_ioremap_io(nr * SZ_64K, res->start); > > - else > > + if (res->flags & IORESOURCE_IO) { > > + phys_addr_t io_start = pci_pio_to_address(res->start); > > + pci_ioremap_io(nr * SZ_64K, io_start); > > + } else > > pci_add_resource(&sys->resources, res); > > } > > pci_add_resource(&sys->resources, &pcie->busn); > > @@ -935,8 +942,10 @@ static int rcar_pcie_probe(struct platform_device *pdev) > > } > > > > for_each_of_pci_range(&parser, &range) { > > - of_pci_range_to_resource(&range, pdev->dev.of_node, > > + err = of_pci_range_to_resource(&range, pdev->dev.of_node, > > &pcie->res[win++]); > > + if (err < 0) > > + return err; > > > > if (win > RCAR_PCI_MAX_RESOURCES) > > break; > > diff --git a/include/linux/of_address.h b/include/linux/of_address.h > > index f8cc7da..c9d70deb 100644 > > --- a/include/linux/of_address.h > > +++ b/include/linux/of_address.h > > @@ -23,17 +23,8 @@ struct of_pci_range { > > #define for_each_of_pci_range(parser, range) \ > > for (; of_pci_range_parser_one(parser, range);) > > > > -static inline void of_pci_range_to_resource(struct of_pci_range *range, > > - struct device_node *np, > > - struct resource *res) > > -{ > > - res->flags = range->flags; > > - res->start = range->cpu_addr; > > - res->end = range->cpu_addr + range->size - 1; > > - res->parent = res->child = res->sibling = NULL; > > - res->name = np->full_name; > > -} > > - > > +extern int of_pci_range_to_resource(struct of_pci_range *range, > > + struct device_node *np, struct resource *res); > > We probably need an empty version of this now for !OF_ADDRESS. Good catch! Will update my patch. Thanks for finding time to review the series! Best regards, Liviu > > Rob > -- ==================== | I would like to | | fix the world, | | but they're not | | giving me the | \ source code! / --------------- ¯\_(ツ)_/¯
next prev parent reply other threads:[~2014-09-22 15:32 UTC|newest] Thread overview: 75+ messages / expand[flat|nested] mbox.gz Atom feed top 2014-09-18 1:30 [PATCH v11 00/10] Support for creating generic PCI host bridges from DT Liviu Dudau 2014-09-18 1:30 ` Liviu Dudau 2014-09-18 1:30 ` [PATCH v11 01/10] Fix ioport_map() for !CONFIG_GENERIC_IOMAP cases Liviu Dudau 2014-09-18 1:30 ` Liviu Dudau 2014-09-18 1:30 ` [PATCH v11 02/10] PCI: Introduce helper functions to deal with PCI I/O ranges Liviu Dudau 2014-09-18 1:30 ` Liviu Dudau [not found] ` <1411003825-21521-3-git-send-email-Liviu.Dudau-5wv7dgnIgG8@public.gmane.org> 2014-09-19 20:48 ` Bjorn Helgaas 2014-09-19 20:48 ` Bjorn Helgaas 2014-09-18 1:30 ` [PATCH v11 03/10] ARM: Define PCI_IOBASE as the base of virtual PCI IO space Liviu Dudau [not found] ` <1411003825-21521-4-git-send-email-Liviu.Dudau-5wv7dgnIgG8@public.gmane.org> 2014-09-20 2:14 ` Arnd Bergmann 2014-09-20 2:14 ` Arnd Bergmann 2014-09-18 1:30 ` [PATCH v11 04/10] PCI: OF: Fix the conversion of IO ranges into IO resources Liviu Dudau 2014-09-18 1:30 ` Liviu Dudau 2014-09-19 20:56 ` Bjorn Helgaas 2014-09-19 20:56 ` Bjorn Helgaas 2014-09-20 17:33 ` Rob Herring 2014-09-22 15:32 ` Liviu Dudau [this message] 2014-09-22 15:32 ` Liviu Dudau 2014-09-22 17:18 ` Rob Herring 2014-09-22 17:18 ` Rob Herring 2014-09-18 1:30 ` [PATCH v11 05/10] PCI: Create pci_host_bridge before its associated bus in pci_create_root_bus Liviu Dudau 2014-09-18 1:30 ` Liviu Dudau 2014-09-18 1:30 ` [PATCH v11 06/10] PCI: Introduce generic domain handling for PCI busses Liviu Dudau 2014-09-18 1:30 ` Liviu Dudau 2014-09-18 1:30 ` [PATCH v11 07/10] OF: Introduce helper function for getting PCI domain_nr Liviu Dudau 2014-09-18 1:30 ` Liviu Dudau 2014-09-19 21:03 ` Bjorn Helgaas 2014-09-19 21:03 ` Bjorn Helgaas 2014-09-22 11:05 ` Liviu Dudau 2014-09-22 11:05 ` Liviu Dudau 2014-09-22 15:25 ` Bjorn Helgaas 2014-09-22 15:25 ` Bjorn Helgaas 2014-09-22 15:33 ` Liviu Dudau 2014-09-22 15:33 ` Liviu Dudau 2014-09-20 2:24 ` Arnd Bergmann 2014-09-20 2:24 ` Arnd Bergmann 2014-09-22 15:20 ` Liviu Dudau 2014-09-22 15:20 ` Liviu Dudau 2014-09-20 17:52 ` Rob Herring 2014-09-18 1:30 ` [PATCH v11 08/10] OF: PCI: Add support for parsing PCI host bridge resources from DT Liviu Dudau 2014-09-18 1:30 ` Liviu Dudau 2014-09-19 21:06 ` Bjorn Helgaas 2014-09-19 21:06 ` Bjorn Helgaas 2014-09-20 0:28 ` Rob Herring 2014-09-22 17:55 ` Liviu Dudau 2014-09-22 17:55 ` Liviu Dudau 2014-09-22 22:11 ` Rob Herring 2014-09-22 9:32 ` Robert Richter 2014-09-22 9:32 ` Robert Richter 2014-09-22 11:43 ` Liviu Dudau 2014-09-22 11:43 ` Liviu Dudau [not found] ` <20140922114317.GN1994-2JSQmVVBSi7ZROr8t4l/smS4ubULX0JqMm0uRHvK7Nw@public.gmane.org> 2014-09-22 12:15 ` Robert Richter 2014-09-22 12:15 ` Robert Richter 2014-09-23 7:56 ` Arnd Bergmann 2014-09-23 7:56 ` Arnd Bergmann 2014-09-23 10:49 ` Liviu Dudau 2014-09-23 10:49 ` Liviu Dudau 2014-09-23 13:30 ` Rob Herring 2014-09-23 13:30 ` Rob Herring 2014-09-23 13:58 ` Liviu Dudau 2014-09-23 13:58 ` Liviu Dudau 2014-09-18 1:30 ` [PATCH v11 09/10] PCI: Assign unassigned bus resources in pci_scan_root_bus() Liviu Dudau 2014-09-18 1:30 ` Liviu Dudau 2014-09-18 1:30 ` [PATCH v11 10/10] PCI: Introduce pci_remap_iospace() for remapping PCI I/O bus resources into CPU space Liviu Dudau 2014-09-18 1:30 ` Liviu Dudau 2014-09-19 21:54 ` Bjorn Helgaas 2014-09-19 21:54 ` Bjorn Helgaas 2014-09-20 2:20 ` Arnd Bergmann 2014-09-20 2:20 ` Arnd Bergmann 2014-09-22 15:29 ` Robert Richter 2014-09-20 0:34 ` Rob Herring 2014-09-20 0:34 ` Rob Herring 2014-09-19 21:59 ` [PATCH v11 00/10] Support for creating generic PCI host bridges from DT Bjorn Helgaas 2014-09-19 21:59 ` Bjorn Helgaas 2014-09-22 11:35 ` Liviu Dudau
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=20140922153207.GA1994@e106497-lin.cambridge.arm.com \ --to=liviu.dudau@arm.com \ --cc=Catalin.Marinas@arm.com \ --cc=Will.Deacon@arm.com \ --cc=arnd@arndb.de \ --cc=benh@kernel.crashing.org \ --cc=bhelgaas@google.com \ --cc=devicetree@vger.kernel.org \ --cc=grant.likely@linaro.org \ --cc=grant.likely@secretlab.ca \ --cc=jg1.han@samsung.com \ --cc=jgunthorpe@obsidianresearch.com \ --cc=kgene.kim@samsung.com \ --cc=linus.walleij@linaro.org \ --cc=linux-arch@vger.kernel.org \ --cc=linux-arm-kernel@lists.infradead.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-pci@vger.kernel.org \ --cc=linux@arm.linux.org.uk \ --cc=okaya@codeaurora.org \ --cc=robh+dt@kernel.org \ --cc=robherring2@gmail.com \ --cc=suravee.suthikulpanit@amd.com \ --cc=tinamdar@apm.com \ /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: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
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).