[PATCH v6] PCI: Store PCIe bus address in struct of_pci_range
From: Gabriele Paoloni <hidden>
Date: 2015-08-04 10:12:05
Also in:
linux-devicetree, linux-pci
Possibly related (same subject, not in this thread)
- 2015-07-30 · Re: [PATCH v6] PCI: Store PCIe bus address in struct of_pci_range · Bjorn Helgaas <bhelgaas@google.com>
- 2015-07-30 · Re: [PATCH v6] PCI: Store PCIe bus address in struct of_pci_range · Rob Herring <hidden>
- 2015-07-30 · Re: [PATCH v6] PCI: Store PCIe bus address in struct of_pci_range · Liviu Dudau <Liviu.Dudau@arm.com>
- 2015-07-30 · RE: [PATCH v6] PCI: Store PCIe bus address in struct of_pci_range · Gabriele Paoloni <hidden>
- 2015-07-30 · Re: [PATCH v6] PCI: Store PCIe bus address in struct of_pci_range · Zhou Wang <wangzhou1@hisilicon.com>
-----Original Message----- From: Jingoo Han [mailto:jingoohan1 at gmail.com] Sent: Tuesday, August 04, 2015 5:20 AM To: Gabriele Paoloni Cc: Rob Herring; Kishon Vijay Abraham I; Bjorn Helgaas; arnd at arndb.de; lorenzo.pieralisi at arm.com; Wangzhou (B); robh+dt at kernel.org; james.morse at arm.com; Liviu.Dudau at arm.com; linux-pci at vger.kernel.org; linux-arm-kernel at lists.infradead.org; devicetree at vger.kernel.org; Yuanzhichang; Zhudacai; zhangjukuo; qiuzhenfa; Liguozhu (Kenneth); Pratyush Anand; Arnd Bergmann; jingoohan1 at gmail.com Subject: Re: [PATCH v6] PCI: Store PCIe bus address in struct of_pci_range On 2015. 8. 3., at PM 8:18, Gabriele Paoloni [off-list ref] wrote:quoted
Rob, Kishon what about the following solution?.... --- drivers/pci/host/pci-dra7xx.c | 12 ++++++++++++ drivers/pci/host/pcie-designware.c | 9 +++------Hi Paoloni, OK, it looks good. I want you to revert the following patch. commit "f4c55c5a3f7f (PCI: designware: Program ATU with untranslated address)" Would you remove all '*_mode_base's?
Hi Jingoo Han, If I reverted the commit, in order to get designware working, dra7 should mask directly the CPU addresses stored in pp->cfg0_base, pp->cfg1_base, pp->mem_base and pp->io_base. The masking would happen at this point: http://lxr.free-electrons.com/source/drivers/pci/host/pcie-designware.c#L493 Now: - I see that pp->cfg<0/1>_base are used in devm_ioremap before that point and nowhere else, so they should be ok. - pp->mem_base is used in dw_pcie_setup_rc(); dw_pcie_setup_rc() is called in dra7xx_pcie_host_init()...so here I should move the masking after dw_pcie_setup() retuned, but I think it should be ok - pp->io_base is used in pci_ioremap_io() in dw_pcie_setup(). Now currently in designware this is called by pci_bios_init_hw(); this is after the masking....so here we would have a the wrong value passed Said that if you look at "[PATCH v5 2/5] PCI: designware: Add ARM64 support", that is the patchset where this patch is needed, you can see that dw_pcie_setup() is removed and pp->io_base is used in pci_remap_iospace() before the masking would happen in dra7xx_pcie_host_init()...so for this patchset we should be good to revert the commit. I propose to add a new patch in the patchset "[PATCH v5 0/5] PCI: hisi: Add PCIe host support for HiSilicon SoC Hip05" as the one I just posted in this thread (this would not revert the commit but just moves the masking to dra7xx) I would revert the commit in "[PATCH v5 2/5] PCI: designware: Add ARM64 support" together with the rest of designware rework. So we would have always a working version of designware... Are you ok with this?
Best regards, Jingoo Hanquoted
2 files changed, 15 insertions(+), 6 deletions(-)diff --git a/drivers/pci/host/pci-dra7xx.c b/drivers/pci/host/pci-dra7xx.cquoted
index 80db09e..bb2635f 100644--- a/drivers/pci/host/pci-dra7xx.c +++ b/drivers/pci/host/pci-dra7xx.c@@ -61,6 +61,7 @@#define PCIECTRL_DRA7XX_CONF_PHY_CS 0x010C #define LINK_UP BIT(16) +#define CPU_TO_BUS_ADDR 0x0FFFFFFF struct dra7xx_pcie { void __iomem *base;@@ -138,6 +139,17 @@ static void dra7xx_pcie_enable_interrupts(structpcie_port *pp)quoted
static void dra7xx_pcie_host_init(struct pcie_port *pp) { + if (pp->io_mod_base) + pp->io_mod_base &= CPU_TO_BUS_ADDR; + + if (pp->mem_mod_base) + pp->mem_mod_base &= CPU_TO_BUS_ADDR; + + if (pp->cfg0_mod_base) { + pp->cfg0_mod_base &= CPU_TO_BUS_ADDR; + pp->cfg1_mod_base &= CPU_TO_BUS_ADDR; + } + dw_pcie_setup_rc(pp); dra7xx_pcie_establish_link(pp); if (IS_ENABLED(CONFIG_PCI_MSI))diff --git a/drivers/pci/host/pcie-designware.cb/drivers/pci/host/pcie-designware.cquoted
index 69486be..06c682b 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.cpu_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.cpu_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.cpu_addr; pp->cfg1_mod_base = pp->cfg0_mod_base + pp->cfg0_size; } --1.9.1quoted
-----Original Message----- From: linux-pci-owner at vger.kernel.org [mailto:linux-pci- owner at vger.kernel.org] On Behalf Of Rob Herring Sent: Friday, July 31, 2015 5:53 PM To: Kishon Vijay Abraham I Cc: Gabriele Paoloni; Bjorn Helgaas; arnd at arndb.de; lorenzo.pieralisi at arm.com; Wangzhou (B); robh+dt at kernel.org; james.morse at arm.com; Liviu.Dudau at arm.com; linux-pci at vger.kernel.org; linux-arm-kernel at lists.infradead.org; devicetree at vger.kernel.org; Yuanzhichang; Zhudacai; zhangjukuo; qiuzhenfa; Liguozhu (Kenneth); Jingoo Han; Pratyush Anand; Arnd Bergmann Subject: Re: [PATCH v6] PCI: Store PCIe bus address in struct of_pci_range On Fri, Jul 31, 2015 at 9:57 AM, Kishon Vijay Abraham I[off-list ref]quoted
quoted
wrote:quoted
+Arnd Hi,quoted
On Friday 31 July 2015 07:55 PM, Gabriele Paoloni wrote: [+cc Kishon]quoted
-----Original Message----- From: linux-pci-owner at vger.kernel.org [mailto:linux-pci- owner at vger.kernel.org] On Behalf Of Rob Herring Sent: Thursday, July 30, 2015 9:42 PM To: Gabriele Paoloni Cc: Bjorn Helgaas; arnd at arndb.de; lorenzo.pieralisi at arm.com;Wangzhouquoted
quoted
quoted
(B); robh+dt at kernel.org; james.morse at arm.com; Liviu.Dudau at arm.com; linux-pci at vger.kernel.org; linux-arm-kernel at lists.infradead.org; devicetree at vger.kernel.org; Yuanzhichang; Zhudacai; zhangjukuo; qiuzhenfa; Liguozhu (Kenneth); Jingoo Han; Pratyush Anand Subject: Re: [PATCH v6] PCI: Store PCIe bus address in struct of_pci_range On Thu, Jul 30, 2015 at 12:34 PM, Gabriele Paoloni [off-list ref] wrote:quoted
quoted
-----Original Message----- From: Bjorn Helgaas [mailto:bhelgaas at google.com] Sent: 30 July 2015 18:15 On Thu, Jul 30, 2015 at 04:50:55PM +0000, Gabriele Paoloniwrote:quoted
quoted
quoted
quoted
quoted
quoted
quoted
quoted
quoted
-----Original Message----- From: linux-pci-owner at vger.kernel.org [mailto:linux-pci- owner at vger.kernel.org] On Behalf Of Bjorn Helgaas Sent: Thursday, July 30, 2015 5:15 PM On Thu, Jul 30, 2015 at 01:52:13PM +0000, Gabriele Paoloniwrote:quoted
quoted
quoted
[...]quoted
quoted
quoted
quoted
quoted
I don?t think we should rely on [CPU] addresses...what ifthequoted
quoted
quoted
quoted
quoted
quoted
quoted
quoted
quoted
intermediatequoted
translation layer changes the lower significant bits of the"busquoted
quoted
quoted
quoted
address"quoted
to translate into a cpu address?Is it really a possiblity that the lower bits could bechanged?quoted
quoted
quoted
quoted
quoted
quoted
quoted
quoted
I've checked all the current deignware users DTs except "pci-layerscape"quoted
that I could not find: spear1310.dtsi spear1340.dtsi dra7.dtsi imx6qdl.dtsi imx6sx.dtsi keystone.dtsi exynos5440.dtsi None of them modifies the lower bits. To be more precise theonlyquoted
quoted
quoted
guyquoted
quoted
quoted
that provides another translation layer is "dra7.dtsi": axi0 http://lxr.free-electrons.com/source/arch/arm/boot/dts/dra7.dtsi#L207quoted
quoted
quoted
axi1 http://lxr.free-electrons.com/source/arch/arm/boot/dts/dra7.dtsi#L241quoted
quoted
quoted
For this case masking the top 4bits (bits28 to 31) should makethequoted
quoted
quoted
job. IMO, we should just fix this case. After further study, I don'tthinkquoted
quoted
quoted
this is a DW issue, but rather an SOC integration issue. I believe you can just fixup the address in the pp->ops-host_initquoted
hook.quoted
quoted
Yes I guess that I could just assign pp->(*)_mod_base to the CPUaddressquoted
quoted
in DW and mask it out in dra7xx_pcie_host_init()... Kishon, would you be ok with that?Initially I was using *base-mask* property from dt. Me and Arnd(cc'ed) hadquoted
this discussion [1] before we decided the current approach. It'llbequoted
quoted
good toquoted
check with Arnd too. [1] -> http://lists.infradead.org/pipermail/linux-arm-kernel/2014-May/253528.html The problem I have here is the use of ranges does not necessarilymeanquoted
quoted
fewer address bits are available. It can be used just forconveniencequoted
quoted
of not putting the full address into every node's reg property. And vice versa, there are probably plenty of cases where we have thefullquoted
quoted
address in the nodes, but really only some of the address bits are decoded at the IP block. Whether the address bits are present is rarely cared about or known by s/w folks until you hit a problemlikequoted
quoted
this. Given this is an isolated case ATM, I would fix it in an isolated way. It does not affect the binding and could be changed in the kernel later if this becomes a common need. Rob -- To unsubscribe from this list: send the line "unsubscribe linux-pci"inquoted
quoted
the body of a message to majordomo at vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html