* [PATCH v3 0/3] PCI: designware: change dw_pcie_cfg_write() and dw_pcie_cfg_read()
@ 2015-09-11 9:38 Gabriele Paoloni
2015-09-11 9:38 ` [PATCH v3 1/3] PCIe: SPEAr13xx: fix dw_pcie_cfg_read/write() usage Gabriele Paoloni
` (3 more replies)
0 siblings, 4 replies; 13+ messages in thread
From: Gabriele Paoloni @ 2015-09-11 9:38 UTC (permalink / raw)
To: bhelgaas, jingoohan1, pratyush.anand
Cc: linux-pci, gabriele.paoloni, wangzhou1, yuanzhichang, zhudacai,
zhangjukuo, qiuzhenfa, liguozhu
From: gabriele paoloni <gabriele.paoloni@huawei.com>
This patchset:
1) fixes a bug in spear13xx when calling dw_pcie_cfg_read and
dw_pcie_cfg_write usign the patch from Pratyush in
https://lkml.org/lkml/2015/9/7/5
2) reworks dw_pcie_cfg_read/dw_pcie_cfg_write in pcie-designware.c in
order to make it easier for callers to pass input parameters;
3) adds sanity checks in dw_pcie_cfg_read/dw_pcie_cfg_write to make
sure the PCI header offset does not conflict with the size of
the read/written field.
Change from v2:
Replaced patch 1/3 with Pratyush one in
https://lkml.org/lkml/2015/9/7/5
gabriele paoloni (3):
PCIe: SPEAr13xx: fix dw_pcie_cfg_read/write() usage
PCI: designware: change dw_pcie_cfg_write() and dw_pcie_cfg_read()
PCI: designware: add sanity checks on the header offset in
dw_pcie_cfg_read and dw_pcie_cfg_write
drivers/pci/host/pci-exynos.c | 5 ++--
drivers/pci/host/pci-keystone-dw.c | 4 ++--
drivers/pci/host/pcie-designware.c | 47 +++++++++++++++++++++++---------------
drivers/pci/host/pcie-spear13xx.c | 18 +++++++--------
4 files changed, 41 insertions(+), 33 deletions(-)
--
1.9.1
^ permalink raw reply [flat|nested] 13+ messages in thread* [PATCH v3 1/3] PCIe: SPEAr13xx: fix dw_pcie_cfg_read/write() usage 2015-09-11 9:38 [PATCH v3 0/3] PCI: designware: change dw_pcie_cfg_write() and dw_pcie_cfg_read() Gabriele Paoloni @ 2015-09-11 9:38 ` Gabriele Paoloni 2015-09-11 9:38 ` [PATCH v3 2/3] PCI: designware: change dw_pcie_cfg_write() and dw_pcie_cfg_read() Gabriele Paoloni ` (2 subsequent siblings) 3 siblings, 0 replies; 13+ messages in thread From: Gabriele Paoloni @ 2015-09-11 9:38 UTC (permalink / raw) To: bhelgaas, jingoohan1, pratyush.anand Cc: linux-pci, gabriele.paoloni, wangzhou1, yuanzhichang, zhudacai, zhangjukuo, qiuzhenfa, liguozhu, Pratyush Anand From: gabriele paoloni <gabriele.paoloni@huawei.com> w_pcie_cfg_read/write() expects 1st argument 'addr' as a 32 bit word aligned address, 2nd argument 'where' as the offset within that word(0, 1, 2 or 3) and 3rd argument 'size' is the number of bytes need to be read at the offset(could be 1, 2 ,4). SPEAr13xx is using dw_pcie_cfg_read() and dw_pcie_cfg_write() incorrectly. Without this fix, SPEAr13xx host will never work with few buggy gen1 card which connects with only gen1 host and also with any endpoint which would generate a read request of more than 128 bytes. Cc: stable@vger.kernel.org # v3.17+ Signed-off-by: Pratyush Anand <panand@redhat.com> Reported-by: Bjorn Helgaas <bhelgaas@google.com> --- drivers/pci/host/pcie-spear13xx.c | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/drivers/pci/host/pcie-spear13xx.c b/drivers/pci/host/pcie-spear13xx.c index 98d2683..0754ea3 100644 --- a/drivers/pci/host/pcie-spear13xx.c +++ b/drivers/pci/host/pcie-spear13xx.c @@ -163,34 +163,36 @@ static int spear13xx_pcie_establish_link(struct pcie_port *pp) * default value in capability register is 512 bytes. So force * it to 128 here. */ - dw_pcie_cfg_read(pp->dbi_base, exp_cap_off + PCI_EXP_DEVCTL, 4, &val); + dw_pcie_cfg_read(pp->dbi_base + exp_cap_off + PCI_EXP_DEVCTL, + 0, 2, &val); val &= ~PCI_EXP_DEVCTL_READRQ; - dw_pcie_cfg_write(pp->dbi_base, exp_cap_off + PCI_EXP_DEVCTL, 4, val); + dw_pcie_cfg_write(pp->dbi_base + exp_cap_off + PCI_EXP_DEVCTL, + 0, 2, val); - dw_pcie_cfg_write(pp->dbi_base, PCI_VENDOR_ID, 2, 0x104A); - dw_pcie_cfg_write(pp->dbi_base, PCI_DEVICE_ID, 2, 0xCD80); + dw_pcie_cfg_write(pp->dbi_base + PCI_VENDOR_ID, 0, 2, 0x104A); + dw_pcie_cfg_write(pp->dbi_base + PCI_VENDOR_ID, 2, 2, 0xCD80); /* * if is_gen1 is set then handle it, so that some buggy card * also works */ if (spear13xx_pcie->is_gen1) { - dw_pcie_cfg_read(pp->dbi_base, exp_cap_off + PCI_EXP_LNKCAP, 4, - &val); + dw_pcie_cfg_read(pp->dbi_base + exp_cap_off + PCI_EXP_LNKCAP, + 0, 4, &val); if ((val & PCI_EXP_LNKCAP_SLS) != PCI_EXP_LNKCAP_SLS_2_5GB) { val &= ~((u32)PCI_EXP_LNKCAP_SLS); val |= PCI_EXP_LNKCAP_SLS_2_5GB; - dw_pcie_cfg_write(pp->dbi_base, exp_cap_off + - PCI_EXP_LNKCAP, 4, val); + dw_pcie_cfg_write(pp->dbi_base + exp_cap_off + + PCI_EXP_LNKCAP, 0, 4, val); } - dw_pcie_cfg_read(pp->dbi_base, exp_cap_off + PCI_EXP_LNKCTL2, 4, - &val); + dw_pcie_cfg_read(pp->dbi_base + exp_cap_off + PCI_EXP_LNKCTL2, + 0, 2, &val); if ((val & PCI_EXP_LNKCAP_SLS) != PCI_EXP_LNKCAP_SLS_2_5GB) { val &= ~((u32)PCI_EXP_LNKCAP_SLS); val |= PCI_EXP_LNKCAP_SLS_2_5GB; - dw_pcie_cfg_write(pp->dbi_base, exp_cap_off + - PCI_EXP_LNKCTL2, 4, val); + dw_pcie_cfg_write(pp->dbi_base + exp_cap_off + + PCI_EXP_LNKCTL2, 0, 2, val); } } -- 1.9.1 ^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v3 2/3] PCI: designware: change dw_pcie_cfg_write() and dw_pcie_cfg_read() 2015-09-11 9:38 [PATCH v3 0/3] PCI: designware: change dw_pcie_cfg_write() and dw_pcie_cfg_read() Gabriele Paoloni 2015-09-11 9:38 ` [PATCH v3 1/3] PCIe: SPEAr13xx: fix dw_pcie_cfg_read/write() usage Gabriele Paoloni @ 2015-09-11 9:38 ` Gabriele Paoloni 2015-09-18 20:46 ` Bjorn Helgaas 2015-09-18 20:53 ` Bjorn Helgaas 2015-09-11 9:38 ` [PATCH v3 3/3] PCI: designware: add sanity checks on the header offset in dw_pcie_cfg_read and dw_pcie_cfg_write Gabriele Paoloni 2015-09-15 9:28 ` [PATCH v3 0/3] PCI: designware: change dw_pcie_cfg_write() and dw_pcie_cfg_read() Gabriele Paoloni 3 siblings, 2 replies; 13+ messages in thread From: Gabriele Paoloni @ 2015-09-11 9:38 UTC (permalink / raw) To: bhelgaas, jingoohan1, pratyush.anand Cc: linux-pci, gabriele.paoloni, wangzhou1, yuanzhichang, zhudacai, zhangjukuo, qiuzhenfa, liguozhu From: gabriele paoloni <gabriele.paoloni@huawei.com> This patch changes the implementation of dw_pcie_cfg_read() and dw_pcie_cfg_write() to improve the function usage from the callers perspective. Currently the callers are obliged to pass the 32bit aligned address of the register that contains the field of the PCI header that they want to read/write; also they have to pass the offset of the field in that register. This is quite tricky to use as the callers are obliged to sum the PCI header base address to the field offset masked to retrieve the 32b aligned register address. With the new API the callers have to pass the base address of the PCI header and the offset corresponding to the field they intend to read/write. Signed-off-by: Gabriele Paoloni <gabriele.paoloni@huawei.com> --- drivers/pci/host/pci-exynos.c | 5 ++--- drivers/pci/host/pci-keystone-dw.c | 4 ++-- drivers/pci/host/pcie-designware.c | 28 ++++++++++++++-------------- drivers/pci/host/pcie-spear13xx.c | 26 ++++++++++++-------------- 4 files changed, 30 insertions(+), 33 deletions(-) diff --git a/drivers/pci/host/pci-exynos.c b/drivers/pci/host/pci-exynos.c index f9f468d..8b0e04b 100644 --- a/drivers/pci/host/pci-exynos.c +++ b/drivers/pci/host/pci-exynos.c @@ -454,7 +454,7 @@ static int exynos_pcie_rd_own_conf(struct pcie_port *pp, int where, int size, int ret; exynos_pcie_sideband_dbi_r_mode(pp, true); - ret = dw_pcie_cfg_read(pp->dbi_base + (where & ~0x3), where, size, val); + ret = dw_pcie_cfg_read(pp->dbi_base, where, size, val); exynos_pcie_sideband_dbi_r_mode(pp, false); return ret; } @@ -465,8 +465,7 @@ static int exynos_pcie_wr_own_conf(struct pcie_port *pp, int where, int size, int ret; exynos_pcie_sideband_dbi_w_mode(pp, true); - ret = dw_pcie_cfg_write(pp->dbi_base + (where & ~0x3), - where, size, val); + ret = dw_pcie_cfg_write(pp->dbi_base, where, size, val); exynos_pcie_sideband_dbi_w_mode(pp, false); return ret; } diff --git a/drivers/pci/host/pci-keystone-dw.c b/drivers/pci/host/pci-keystone-dw.c index e71da99..6648f9be 100644 --- a/drivers/pci/host/pci-keystone-dw.c +++ b/drivers/pci/host/pci-keystone-dw.c @@ -398,7 +398,7 @@ int ks_dw_pcie_rd_other_conf(struct pcie_port *pp, struct pci_bus *bus, addr = ks_pcie_cfg_setup(ks_pcie, bus_num, devfn); - return dw_pcie_cfg_read(addr + (where & ~0x3), where, size, val); + return dw_pcie_cfg_read(addr, where, size, val); } int ks_dw_pcie_wr_other_conf(struct pcie_port *pp, struct pci_bus *bus, @@ -410,7 +410,7 @@ int ks_dw_pcie_wr_other_conf(struct pcie_port *pp, struct pci_bus *bus, addr = ks_pcie_cfg_setup(ks_pcie, bus_num, devfn); - return dw_pcie_cfg_write(addr + (where & ~0x3), where, size, val); + return dw_pcie_cfg_write(addr, where, size, val); } /** diff --git a/drivers/pci/host/pcie-designware.c b/drivers/pci/host/pcie-designware.c index 52aa6e3..cb23e31 100644 --- a/drivers/pci/host/pcie-designware.c +++ b/drivers/pci/host/pcie-designware.c @@ -82,12 +82,14 @@ static inline struct pcie_port *sys_to_pcie(struct pci_sys_data *sys) int dw_pcie_cfg_read(void __iomem *addr, int where, int size, u32 *val) { + addr += (where & ~0x3); *val = readl(addr); + where &= 3; if (size == 1) - *val = (*val >> (8 * (where & 3))) & 0xff; + *val = (*val >> (8 * where)) & 0xff; else if (size == 2) - *val = (*val >> (8 * (where & 3))) & 0xffff; + *val = (*val >> (8 * where)) & 0xffff; else if (size != 4) return PCIBIOS_BAD_REGISTER_NUMBER; @@ -96,12 +98,14 @@ int dw_pcie_cfg_read(void __iomem *addr, int where, int size, u32 *val) int dw_pcie_cfg_write(void __iomem *addr, int where, int size, u32 val) { + addr += where; + if (size == 4) writel(val, addr); else if (size == 2) - writew(val, addr + (where & 2)); + writew(val, addr); else if (size == 1) - writeb(val, addr + (where & 3)); + writeb(val, addr); else return PCIBIOS_BAD_REGISTER_NUMBER; @@ -132,8 +136,7 @@ static int dw_pcie_rd_own_conf(struct pcie_port *pp, int where, int size, if (pp->ops->rd_own_conf) ret = pp->ops->rd_own_conf(pp, where, size, val); else - ret = dw_pcie_cfg_read(pp->dbi_base + (where & ~0x3), where, - size, val); + ret = dw_pcie_cfg_read(pp->dbi_base, where, size, val); return ret; } @@ -146,8 +149,7 @@ static int dw_pcie_wr_own_conf(struct pcie_port *pp, int where, int size, if (pp->ops->wr_own_conf) ret = pp->ops->wr_own_conf(pp, where, size, val); else - ret = dw_pcie_cfg_write(pp->dbi_base + (where & ~0x3), where, - size, val); + ret = dw_pcie_cfg_write(pp->dbi_base, where, size, val); return ret; } @@ -539,13 +541,12 @@ static int dw_pcie_rd_other_conf(struct pcie_port *pp, struct pci_bus *bus, u32 devfn, int where, int size, u32 *val) { int ret, type; - u32 address, busdev, cfg_size; + u32 busdev, cfg_size; u64 cpu_addr; void __iomem *va_cfg_base; busdev = PCIE_ATU_BUS(bus->number) | PCIE_ATU_DEV(PCI_SLOT(devfn)) | PCIE_ATU_FUNC(PCI_FUNC(devfn)); - address = where & ~0x3; if (bus->parent->number == pp->root_bus_nr) { type = PCIE_ATU_TYPE_CFG0; @@ -562,7 +563,7 @@ static int dw_pcie_rd_other_conf(struct pcie_port *pp, struct pci_bus *bus, dw_pcie_prog_outbound_atu(pp, PCIE_ATU_REGION_INDEX0, type, cpu_addr, busdev, cfg_size); - ret = dw_pcie_cfg_read(va_cfg_base + address, where, size, val); + ret = dw_pcie_cfg_read(va_cfg_base, where, size, val); dw_pcie_prog_outbound_atu(pp, PCIE_ATU_REGION_INDEX0, PCIE_ATU_TYPE_IO, pp->io_mod_base, pp->io_bus_addr, pp->io_size); @@ -574,13 +575,12 @@ static int dw_pcie_wr_other_conf(struct pcie_port *pp, struct pci_bus *bus, u32 devfn, int where, int size, u32 val) { int ret, type; - u32 address, busdev, cfg_size; + u32 busdev, cfg_size; u64 cpu_addr; void __iomem *va_cfg_base; busdev = PCIE_ATU_BUS(bus->number) | PCIE_ATU_DEV(PCI_SLOT(devfn)) | PCIE_ATU_FUNC(PCI_FUNC(devfn)); - address = where & ~0x3; if (bus->parent->number == pp->root_bus_nr) { type = PCIE_ATU_TYPE_CFG0; @@ -597,7 +597,7 @@ static int dw_pcie_wr_other_conf(struct pcie_port *pp, struct pci_bus *bus, dw_pcie_prog_outbound_atu(pp, PCIE_ATU_REGION_INDEX0, type, cpu_addr, busdev, cfg_size); - ret = dw_pcie_cfg_write(va_cfg_base + address, where, size, val); + ret = dw_pcie_cfg_write(va_cfg_base, where, size, val); dw_pcie_prog_outbound_atu(pp, PCIE_ATU_REGION_INDEX0, PCIE_ATU_TYPE_IO, pp->io_mod_base, pp->io_bus_addr, pp->io_size); diff --git a/drivers/pci/host/pcie-spear13xx.c b/drivers/pci/host/pcie-spear13xx.c index 0754ea3..cd30d8a 100644 --- a/drivers/pci/host/pcie-spear13xx.c +++ b/drivers/pci/host/pcie-spear13xx.c @@ -163,36 +163,34 @@ static int spear13xx_pcie_establish_link(struct pcie_port *pp) * default value in capability register is 512 bytes. So force * it to 128 here. */ - dw_pcie_cfg_read(pp->dbi_base + exp_cap_off + PCI_EXP_DEVCTL, - 0, 2, &val); + dw_pcie_cfg_read(pp->dbi_base, exp_cap_off + PCI_EXP_DEVCTL, 2, &val); val &= ~PCI_EXP_DEVCTL_READRQ; - dw_pcie_cfg_write(pp->dbi_base + exp_cap_off + PCI_EXP_DEVCTL, - 0, 2, val); + dw_pcie_cfg_write(pp->dbi_base, exp_cap_off + PCI_EXP_DEVCTL, 2, val); - dw_pcie_cfg_write(pp->dbi_base + PCI_VENDOR_ID, 0, 2, 0x104A); - dw_pcie_cfg_write(pp->dbi_base + PCI_VENDOR_ID, 2, 2, 0xCD80); + dw_pcie_cfg_write(pp->dbi_base, PCI_VENDOR_ID, 2, 0x104A); + dw_pcie_cfg_write(pp->dbi_base, PCI_DEVICE_ID, 2, 0xCD80); /* * if is_gen1 is set then handle it, so that some buggy card * also works */ if (spear13xx_pcie->is_gen1) { - dw_pcie_cfg_read(pp->dbi_base + exp_cap_off + PCI_EXP_LNKCAP, - 0, 4, &val); + dw_pcie_cfg_read(pp->dbi_base, exp_cap_off + PCI_EXP_LNKCAP, + 4, &val); if ((val & PCI_EXP_LNKCAP_SLS) != PCI_EXP_LNKCAP_SLS_2_5GB) { val &= ~((u32)PCI_EXP_LNKCAP_SLS); val |= PCI_EXP_LNKCAP_SLS_2_5GB; - dw_pcie_cfg_write(pp->dbi_base + exp_cap_off + - PCI_EXP_LNKCAP, 0, 4, val); + dw_pcie_cfg_write(pp->dbi_base, exp_cap_off + + PCI_EXP_LNKCAP, 4, val); } - dw_pcie_cfg_read(pp->dbi_base + exp_cap_off + PCI_EXP_LNKCTL2, - 0, 2, &val); + dw_pcie_cfg_read(pp->dbi_base, exp_cap_off + PCI_EXP_LNKCTL2, + 2, &val); if ((val & PCI_EXP_LNKCAP_SLS) != PCI_EXP_LNKCAP_SLS_2_5GB) { val &= ~((u32)PCI_EXP_LNKCAP_SLS); val |= PCI_EXP_LNKCAP_SLS_2_5GB; - dw_pcie_cfg_write(pp->dbi_base + exp_cap_off + - PCI_EXP_LNKCTL2, 0, 2, val); + dw_pcie_cfg_write(pp->dbi_base, exp_cap_off + + PCI_EXP_LNKCTL2, 2, val); } } -- 1.9.1 ^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [PATCH v3 2/3] PCI: designware: change dw_pcie_cfg_write() and dw_pcie_cfg_read() 2015-09-11 9:38 ` [PATCH v3 2/3] PCI: designware: change dw_pcie_cfg_write() and dw_pcie_cfg_read() Gabriele Paoloni @ 2015-09-18 20:46 ` Bjorn Helgaas 2015-09-19 3:03 ` Pratyush Anand 2015-09-18 20:53 ` Bjorn Helgaas 1 sibling, 1 reply; 13+ messages in thread From: Bjorn Helgaas @ 2015-09-18 20:46 UTC (permalink / raw) To: Gabriele Paoloni Cc: jingoohan1, pratyush.anand, linux-pci, wangzhou1, yuanzhichang, zhudacai, zhangjukuo, qiuzhenfa, liguozhu On Fri, Sep 11, 2015 at 05:38:26PM +0800, Gabriele Paoloni wrote: > From: gabriele paoloni <gabriele.paoloni@huawei.com> > > This patch changes the implementation of dw_pcie_cfg_read() and > dw_pcie_cfg_write() to improve the function usage from the callers > perspective. > Currently the callers are obliged to pass the 32bit aligned address > of the register that contains the field of the PCI header that they > want to read/write; also they have to pass the offset of the field > in that register. This is quite tricky to use as the callers are > obliged to sum the PCI header base address to the field offset > masked to retrieve the 32b aligned register address. > > With the new API the callers have to pass the base address of the > PCI header and the offset corresponding to the field they intend to > read/write. > > Signed-off-by: Gabriele Paoloni <gabriele.paoloni@huawei.com> > int dw_pcie_cfg_read(void __iomem *addr, int where, int size, u32 *val) > { > + addr += (where & ~0x3); > *val = readl(addr); > + where &= 3; > > if (size == 1) > - *val = (*val >> (8 * (where & 3))) & 0xff; > + *val = (*val >> (8 * where)) & 0xff; > else if (size == 2) > - *val = (*val >> (8 * (where & 3))) & 0xffff; > + *val = (*val >> (8 * where)) & 0xffff; > else if (size != 4) > return PCIBIOS_BAD_REGISTER_NUMBER; > > @@ -96,12 +98,14 @@ int dw_pcie_cfg_read(void __iomem *addr, int where, int size, u32 *val) > > int dw_pcie_cfg_write(void __iomem *addr, int where, int size, u32 val) > { > + addr += where; > + > if (size == 4) > writel(val, addr); > else if (size == 2) > - writew(val, addr + (where & 2)); > + writew(val, addr); > else if (size == 1) > - writeb(val, addr + (where & 3)); > + writeb(val, addr); > else > return PCIBIOS_BAD_REGISTER_NUMBER; I just noticed the asymmetry between dw_pcie_cfg_read() and dw_pcie_cfg_write(): in dw_pcie_cfg_read() we always do 32-bit reads and mask out the parts we won't want, but in dw_pcie_cfg_write() we do 8-, 16-, or 32-byte writes. That was there even before your patch, but I wonder why. Either both should work the same way, or there should be a comment explaining why they are different. Jingoo, Pratyush? ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v3 2/3] PCI: designware: change dw_pcie_cfg_write() and dw_pcie_cfg_read() 2015-09-18 20:46 ` Bjorn Helgaas @ 2015-09-19 3:03 ` Pratyush Anand 2015-09-23 16:20 ` Gabriele Paoloni 0 siblings, 1 reply; 13+ messages in thread From: Pratyush Anand @ 2015-09-19 3:03 UTC (permalink / raw) To: Bjorn Helgaas Cc: Gabriele Paoloni, Jingoo Han, linux-pci@vger.kernel.org, Zhou Wang, Zhichang Yuan, zhudacai, Zhang Jukuo, qiuzhenfa, Liguozhu On Sat, Sep 19, 2015 at 2:16 AM, Bjorn Helgaas <bhelgaas@google.com> wrote: > On Fri, Sep 11, 2015 at 05:38:26PM +0800, Gabriele Paoloni wrote: >> From: gabriele paoloni <gabriele.paoloni@huawei.com> >> >> This patch changes the implementation of dw_pcie_cfg_read() and >> dw_pcie_cfg_write() to improve the function usage from the callers >> perspective. >> Currently the callers are obliged to pass the 32bit aligned address >> of the register that contains the field of the PCI header that they >> want to read/write; also they have to pass the offset of the field >> in that register. This is quite tricky to use as the callers are >> obliged to sum the PCI header base address to the field offset >> masked to retrieve the 32b aligned register address. >> >> With the new API the callers have to pass the base address of the >> PCI header and the offset corresponding to the field they intend to >> read/write. >> >> Signed-off-by: Gabriele Paoloni <gabriele.paoloni@huawei.com> > > >> int dw_pcie_cfg_read(void __iomem *addr, int where, int size, u32 *val) >> { >> + addr += (where & ~0x3); >> *val = readl(addr); >> + where &= 3; >> >> if (size == 1) >> - *val = (*val >> (8 * (where & 3))) & 0xff; >> + *val = (*val >> (8 * where)) & 0xff; >> else if (size == 2) >> - *val = (*val >> (8 * (where & 3))) & 0xffff; >> + *val = (*val >> (8 * where)) & 0xffff; >> else if (size != 4) >> return PCIBIOS_BAD_REGISTER_NUMBER; >> >> @@ -96,12 +98,14 @@ int dw_pcie_cfg_read(void __iomem *addr, int where, int size, u32 *val) >> >> int dw_pcie_cfg_write(void __iomem *addr, int where, int size, u32 val) >> { >> + addr += where; >> + >> if (size == 4) >> writel(val, addr); >> else if (size == 2) >> - writew(val, addr + (where & 2)); >> + writew(val, addr); >> else if (size == 1) >> - writeb(val, addr + (where & 3)); >> + writeb(val, addr); >> else >> return PCIBIOS_BAD_REGISTER_NUMBER; > > I just noticed the asymmetry between dw_pcie_cfg_read() and > dw_pcie_cfg_write(): in dw_pcie_cfg_read() we always do 32-bit reads and > mask out the parts we won't want, but in dw_pcie_cfg_write() we do 8-, 16-, > or 32-byte writes. > > That was there even before your patch, but I wonder why. Either both > should work the same way, or there should be a comment explaining why they > are different. > > Jingoo, Pratyush? As I said earlier, I just vaguely remember that there was some issue with a SOC in reading non word aligned addresses. (1) I do not have any reference for it and (2) even if some where there could be such issue they can always have platform specific accessor . So I support your idea and both read and write can be made symmetric. ^ permalink raw reply [flat|nested] 13+ messages in thread
* RE: [PATCH v3 2/3] PCI: designware: change dw_pcie_cfg_write() and dw_pcie_cfg_read() 2015-09-19 3:03 ` Pratyush Anand @ 2015-09-23 16:20 ` Gabriele Paoloni 2015-09-23 16:24 ` Bjorn Helgaas 0 siblings, 1 reply; 13+ messages in thread From: Gabriele Paoloni @ 2015-09-23 16:20 UTC (permalink / raw) To: Pratyush Anand, Bjorn Helgaas Cc: Jingoo Han, linux-pci@vger.kernel.org, Wangzhou (B), Yuanzhichang, Zhudacai, zhangjukuo, qiuzhenfa, Liguozhu (Kenneth) SGkgZ3V5cyBzb3JyeSBmb3IgdGhlIGxhdGUgcmVwbHkgSSBoYXZlIGJlZW4gT09PIGZvciB0aGUg bGFzdCA1IGRheXMNCg0KPiAtLS0tLU9yaWdpbmFsIE1lc3NhZ2UtLS0tLQ0KPiBGcm9tOiBQcmF0 eXVzaCBBbmFuZCBbbWFpbHRvOnByYXR5dXNoLmFuYW5kQGdtYWlsLmNvbV0NCj4gU2VudDogU2F0 dXJkYXksIFNlcHRlbWJlciAxOSwgMjAxNSA0OjA0IEFNDQo+IFRvOiBCam9ybiBIZWxnYWFzDQo+ IENjOiBHYWJyaWVsZSBQYW9sb25pOyBKaW5nb28gSGFuOyBsaW51eC1wY2lAdmdlci5rZXJuZWwu b3JnOyBXYW5nemhvdQ0KPiAoQik7IFl1YW56aGljaGFuZzsgWmh1ZGFjYWk7IHpoYW5nanVrdW87 IHFpdXpoZW5mYTsgTGlndW96aHUgKEtlbm5ldGgpDQo+IFN1YmplY3Q6IFJlOiBbUEFUQ0ggdjMg Mi8zXSBQQ0k6IGRlc2lnbndhcmU6IGNoYW5nZSBkd19wY2llX2NmZ193cml0ZSgpDQo+IGFuZCBk d19wY2llX2NmZ19yZWFkKCkNCj4gDQo+IE9uIFNhdCwgU2VwIDE5LCAyMDE1IGF0IDI6MTYgQU0s IEJqb3JuIEhlbGdhYXMgPGJoZWxnYWFzQGdvb2dsZS5jb20+DQo+IHdyb3RlOg0KPiA+IE9uIEZy aSwgU2VwIDExLCAyMDE1IGF0IDA1OjM4OjI2UE0gKzA4MDAsIEdhYnJpZWxlIFBhb2xvbmkgd3Jv dGU6DQo+ID4+IEZyb206IGdhYnJpZWxlIHBhb2xvbmkgPGdhYnJpZWxlLnBhb2xvbmlAaHVhd2Vp LmNvbT4NCj4gPj4NCj4gPj4gVGhpcyBwYXRjaCBjaGFuZ2VzIHRoZSBpbXBsZW1lbnRhdGlvbiBv ZiBkd19wY2llX2NmZ19yZWFkKCkgYW5kDQo+ID4+IGR3X3BjaWVfY2ZnX3dyaXRlKCkgdG8gaW1w cm92ZSB0aGUgZnVuY3Rpb24gdXNhZ2UgZnJvbSB0aGUgY2FsbGVycw0KPiA+PiBwZXJzcGVjdGl2 ZS4NCj4gPj4gQ3VycmVudGx5IHRoZSBjYWxsZXJzIGFyZSBvYmxpZ2VkIHRvIHBhc3MgdGhlIDMy Yml0IGFsaWduZWQgYWRkcmVzcw0KPiA+PiBvZiB0aGUgcmVnaXN0ZXIgdGhhdCBjb250YWlucyB0 aGUgZmllbGQgb2YgdGhlIFBDSSBoZWFkZXIgdGhhdCB0aGV5DQo+ID4+IHdhbnQgdG8gcmVhZC93 cml0ZTsgYWxzbyB0aGV5IGhhdmUgdG8gcGFzcyB0aGUgb2Zmc2V0IG9mIHRoZSBmaWVsZA0KPiA+ PiBpbiB0aGF0IHJlZ2lzdGVyLiBUaGlzIGlzIHF1aXRlIHRyaWNreSB0byB1c2UgYXMgdGhlIGNh bGxlcnMgYXJlDQo+ID4+IG9ibGlnZWQgdG8gc3VtIHRoZSBQQ0kgaGVhZGVyIGJhc2UgYWRkcmVz cyB0byB0aGUgZmllbGQgb2Zmc2V0DQo+ID4+IG1hc2tlZCB0byByZXRyaWV2ZSB0aGUgMzJiIGFs aWduZWQgcmVnaXN0ZXIgYWRkcmVzcy4NCj4gPj4NCj4gPj4gV2l0aCB0aGUgbmV3IEFQSSB0aGUg Y2FsbGVycyBoYXZlIHRvIHBhc3MgdGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUNCj4gPj4gUENJIGhl YWRlciBhbmQgdGhlIG9mZnNldCBjb3JyZXNwb25kaW5nIHRvIHRoZSBmaWVsZCB0aGV5IGludGVu ZCB0bw0KPiA+PiByZWFkL3dyaXRlLg0KPiA+Pg0KPiA+PiBTaWduZWQtb2ZmLWJ5OiBHYWJyaWVs ZSBQYW9sb25pIDxnYWJyaWVsZS5wYW9sb25pQGh1YXdlaS5jb20+DQo+ID4NCj4gPg0KPiA+PiAg aW50IGR3X3BjaWVfY2ZnX3JlYWQodm9pZCBfX2lvbWVtICphZGRyLCBpbnQgd2hlcmUsIGludCBz aXplLCB1MzINCj4gKnZhbCkNCj4gPj4gIHsNCj4gPj4gKyAgICAgYWRkciArPSAod2hlcmUgJiB+ MHgzKTsNCj4gPj4gICAgICAgKnZhbCA9IHJlYWRsKGFkZHIpOw0KPiA+PiArICAgICB3aGVyZSAm PSAzOw0KPiA+Pg0KPiA+PiAgICAgICBpZiAoc2l6ZSA9PSAxKQ0KPiA+PiAtICAgICAgICAgICAg ICp2YWwgPSAoKnZhbCA+PiAoOCAqICh3aGVyZSAmIDMpKSkgJiAweGZmOw0KPiA+PiArICAgICAg ICAgICAgICp2YWwgPSAoKnZhbCA+PiAoOCAqIHdoZXJlKSkgJiAweGZmOw0KPiA+PiAgICAgICBl bHNlIGlmIChzaXplID09IDIpDQo+ID4+IC0gICAgICAgICAgICAgKnZhbCA9ICgqdmFsID4+ICg4 ICogKHdoZXJlICYgMykpKSAmIDB4ZmZmZjsNCj4gPj4gKyAgICAgICAgICAgICAqdmFsID0gKCp2 YWwgPj4gKDggKiB3aGVyZSkpICYgMHhmZmZmOw0KPiA+PiAgICAgICBlbHNlIGlmIChzaXplICE9 IDQpDQo+ID4+ICAgICAgICAgICAgICAgcmV0dXJuIFBDSUJJT1NfQkFEX1JFR0lTVEVSX05VTUJF UjsNCj4gPj4NCj4gPj4gQEAgLTk2LDEyICs5OCwxNCBAQCBpbnQgZHdfcGNpZV9jZmdfcmVhZCh2 b2lkIF9faW9tZW0gKmFkZHIsIGludA0KPiB3aGVyZSwgaW50IHNpemUsIHUzMiAqdmFsKQ0KPiA+ Pg0KPiA+PiAgaW50IGR3X3BjaWVfY2ZnX3dyaXRlKHZvaWQgX19pb21lbSAqYWRkciwgaW50IHdo ZXJlLCBpbnQgc2l6ZSwgdTMyDQo+IHZhbCkNCj4gPj4gIHsNCj4gPj4gKyAgICAgYWRkciArPSB3 aGVyZTsNCj4gPj4gKw0KPiA+PiAgICAgICBpZiAoc2l6ZSA9PSA0KQ0KPiA+PiAgICAgICAgICAg ICAgIHdyaXRlbCh2YWwsIGFkZHIpOw0KPiA+PiAgICAgICBlbHNlIGlmIChzaXplID09IDIpDQo+ ID4+IC0gICAgICAgICAgICAgd3JpdGV3KHZhbCwgYWRkciArICh3aGVyZSAmIDIpKTsNCj4gPj4g KyAgICAgICAgICAgICB3cml0ZXcodmFsLCBhZGRyKTsNCj4gPj4gICAgICAgZWxzZSBpZiAoc2l6 ZSA9PSAxKQ0KPiA+PiAtICAgICAgICAgICAgIHdyaXRlYih2YWwsIGFkZHIgKyAod2hlcmUgJiAz KSk7DQo+ID4+ICsgICAgICAgICAgICAgd3JpdGViKHZhbCwgYWRkcik7DQo+ID4+ICAgICAgIGVs c2UNCj4gPj4gICAgICAgICAgICAgICByZXR1cm4gUENJQklPU19CQURfUkVHSVNURVJfTlVNQkVS Ow0KPiA+DQo+ID4gSSBqdXN0IG5vdGljZWQgdGhlIGFzeW1tZXRyeSBiZXR3ZWVuIGR3X3BjaWVf Y2ZnX3JlYWQoKSBhbmQNCj4gPiBkd19wY2llX2NmZ193cml0ZSgpOiBpbiBkd19wY2llX2NmZ19y ZWFkKCkgd2UgYWx3YXlzIGRvIDMyLWJpdCByZWFkcw0KPiBhbmQNCj4gPiBtYXNrIG91dCB0aGUg cGFydHMgd2Ugd29uJ3Qgd2FudCwgYnV0IGluIGR3X3BjaWVfY2ZnX3dyaXRlKCkgd2UgZG8gOC0s DQo+IDE2LSwNCj4gPiBvciAzMi1ieXRlIHdyaXRlcy4NCj4gPg0KPiA+IFRoYXQgd2FzIHRoZXJl IGV2ZW4gYmVmb3JlIHlvdXIgcGF0Y2gsIGJ1dCBJIHdvbmRlciB3aHkuICBFaXRoZXIgYm90aA0K PiA+IHNob3VsZCB3b3JrIHRoZSBzYW1lIHdheSwgb3IgdGhlcmUgc2hvdWxkIGJlIGEgY29tbWVu dCBleHBsYWluaW5nIHdoeQ0KPiB0aGV5DQo+ID4gYXJlIGRpZmZlcmVudC4NCj4gPg0KPiA+IEpp bmdvbywgUHJhdHl1c2g/DQo+IA0KPiBBcyBJIHNhaWQgZWFybGllciwgSSBqdXN0IHZhZ3VlbHkg cmVtZW1iZXIgdGhhdCB0aGVyZSB3YXMgc29tZSBpc3N1ZQ0KPiB3aXRoIGEgU09DIGluIHJlYWRp bmcgbm9uIHdvcmQgYWxpZ25lZCBhZGRyZXNzZXMuDQo+ICgxKSBJIGRvIG5vdCBoYXZlIGFueSBy ZWZlcmVuY2UgZm9yIGl0IGFuZCAoMikgZXZlbiBpZiBzb21lIHdoZXJlDQo+IHRoZXJlIGNvdWxk IGJlIHN1Y2ggaXNzdWUgdGhleSBjYW4gYWx3YXlzIGhhdmUgcGxhdGZvcm0gc3BlY2lmaWMNCj4g YWNjZXNzb3IgLiBTbyBJIHN1cHBvcnQgeW91ciBpZGVhIGFuZCBib3RoIHJlYWQgYW5kIHdyaXRl IGNhbiBiZSBtYWRlDQo+IHN5bW1ldHJpYy4NCg0KSSBhZ3JlZSB3aXRoIHRoZSBpZGVhIGJ1dCwg d2hhdCBpZiBkb2luZyBzbyB3ZSBicmVhayBvdGhlciBkcml2ZXJzPw0KSXMgdGhlIGNvcnJlY3Qg ZmxvdyB0byBicmVhayB0aGVtIGZpcnN0IGFuZCBsZXQgdGhlIHNpbmdsZSBtYWludGFpbmVycyBm aXggdGhlbSB0aGVuLi4uPw0KDQo= ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v3 2/3] PCI: designware: change dw_pcie_cfg_write() and dw_pcie_cfg_read() 2015-09-23 16:20 ` Gabriele Paoloni @ 2015-09-23 16:24 ` Bjorn Helgaas 2015-09-23 16:26 ` Gabriele Paoloni 0 siblings, 1 reply; 13+ messages in thread From: Bjorn Helgaas @ 2015-09-23 16:24 UTC (permalink / raw) To: Gabriele Paoloni Cc: Pratyush Anand, Jingoo Han, linux-pci@vger.kernel.org, Wangzhou (B), Yuanzhichang, Zhudacai, zhangjukuo, qiuzhenfa, Liguozhu (Kenneth) On Wed, Sep 23, 2015 at 11:20 AM, Gabriele Paoloni <gabriele.paoloni@huawei.com> wrote: > Hi guys sorry for the late reply I have been OOO for the last 5 days > >> -----Original Message----- >> From: Pratyush Anand [mailto:pratyush.anand@gmail.com] >> Sent: Saturday, September 19, 2015 4:04 AM >> To: Bjorn Helgaas >> Cc: Gabriele Paoloni; Jingoo Han; linux-pci@vger.kernel.org; Wangzhou >> (B); Yuanzhichang; Zhudacai; zhangjukuo; qiuzhenfa; Liguozhu (Kenneth) >> Subject: Re: [PATCH v3 2/3] PCI: designware: change dw_pcie_cfg_write() >> and dw_pcie_cfg_read() >> >> On Sat, Sep 19, 2015 at 2:16 AM, Bjorn Helgaas <bhelgaas@google.com> >> wrote: >> > On Fri, Sep 11, 2015 at 05:38:26PM +0800, Gabriele Paoloni wrote: >> >> From: gabriele paoloni <gabriele.paoloni@huawei.com> >> >> >> >> This patch changes the implementation of dw_pcie_cfg_read() and >> >> dw_pcie_cfg_write() to improve the function usage from the callers >> >> perspective. >> >> Currently the callers are obliged to pass the 32bit aligned address >> >> of the register that contains the field of the PCI header that they >> >> want to read/write; also they have to pass the offset of the field >> >> in that register. This is quite tricky to use as the callers are >> >> obliged to sum the PCI header base address to the field offset >> >> masked to retrieve the 32b aligned register address. >> >> >> >> With the new API the callers have to pass the base address of the >> >> PCI header and the offset corresponding to the field they intend to >> >> read/write. >> >> >> >> Signed-off-by: Gabriele Paoloni <gabriele.paoloni@huawei.com> >> > >> > >> >> int dw_pcie_cfg_read(void __iomem *addr, int where, int size, u32 >> *val) >> >> { >> >> + addr += (where & ~0x3); >> >> *val = readl(addr); >> >> + where &= 3; >> >> >> >> if (size == 1) >> >> - *val = (*val >> (8 * (where & 3))) & 0xff; >> >> + *val = (*val >> (8 * where)) & 0xff; >> >> else if (size == 2) >> >> - *val = (*val >> (8 * (where & 3))) & 0xffff; >> >> + *val = (*val >> (8 * where)) & 0xffff; >> >> else if (size != 4) >> >> return PCIBIOS_BAD_REGISTER_NUMBER; >> >> >> >> @@ -96,12 +98,14 @@ int dw_pcie_cfg_read(void __iomem *addr, int >> where, int size, u32 *val) >> >> >> >> int dw_pcie_cfg_write(void __iomem *addr, int where, int size, u32 >> val) >> >> { >> >> + addr += where; >> >> + >> >> if (size == 4) >> >> writel(val, addr); >> >> else if (size == 2) >> >> - writew(val, addr + (where & 2)); >> >> + writew(val, addr); >> >> else if (size == 1) >> >> - writeb(val, addr + (where & 3)); >> >> + writeb(val, addr); >> >> else >> >> return PCIBIOS_BAD_REGISTER_NUMBER; >> > >> > I just noticed the asymmetry between dw_pcie_cfg_read() and >> > dw_pcie_cfg_write(): in dw_pcie_cfg_read() we always do 32-bit reads >> and >> > mask out the parts we won't want, but in dw_pcie_cfg_write() we do 8-, >> 16-, >> > or 32-byte writes. >> > >> > That was there even before your patch, but I wonder why. Either both >> > should work the same way, or there should be a comment explaining why >> they >> > are different. >> > >> > Jingoo, Pratyush? >> >> As I said earlier, I just vaguely remember that there was some issue >> with a SOC in reading non word aligned addresses. >> (1) I do not have any reference for it and (2) even if some where >> there could be such issue they can always have platform specific >> accessor . So I support your idea and both read and write can be made >> symmetric. > > I agree with the idea but, what if doing so we break other drivers? > Is the correct flow to break them first and let the single maintainers fix them then...? Since we don't know which (if any) systems would break, I think the best we can do is see if anybody has objections, then put it in and see if anything breaks. Bjorn ^ permalink raw reply [flat|nested] 13+ messages in thread
* RE: [PATCH v3 2/3] PCI: designware: change dw_pcie_cfg_write() and dw_pcie_cfg_read() 2015-09-23 16:24 ` Bjorn Helgaas @ 2015-09-23 16:26 ` Gabriele Paoloni 0 siblings, 0 replies; 13+ messages in thread From: Gabriele Paoloni @ 2015-09-23 16:26 UTC (permalink / raw) To: Bjorn Helgaas Cc: Pratyush Anand, Jingoo Han, linux-pci@vger.kernel.org, Wangzhou (B), Yuanzhichang, Zhudacai, zhangjukuo, qiuzhenfa, Liguozhu (Kenneth) DQoNCj4gLS0tLS1PcmlnaW5hbCBNZXNzYWdlLS0tLS0NCj4gRnJvbTogQmpvcm4gSGVsZ2FhcyBb bWFpbHRvOmJoZWxnYWFzQGdvb2dsZS5jb21dDQo+IFNlbnQ6IFdlZG5lc2RheSwgU2VwdGVtYmVy IDIzLCAyMDE1IDU6MjQgUE0NCj4gVG86IEdhYnJpZWxlIFBhb2xvbmkNCj4gQ2M6IFByYXR5dXNo IEFuYW5kOyBKaW5nb28gSGFuOyBsaW51eC1wY2lAdmdlci5rZXJuZWwub3JnOyBXYW5nemhvdSAo Qik7DQo+IFl1YW56aGljaGFuZzsgWmh1ZGFjYWk7IHpoYW5nanVrdW87IHFpdXpoZW5mYTsgTGln dW96aHUgKEtlbm5ldGgpDQo+IFN1YmplY3Q6IFJlOiBbUEFUQ0ggdjMgMi8zXSBQQ0k6IGRlc2ln bndhcmU6IGNoYW5nZSBkd19wY2llX2NmZ193cml0ZSgpDQo+IGFuZCBkd19wY2llX2NmZ19yZWFk KCkNCj4gDQo+IE9uIFdlZCwgU2VwIDIzLCAyMDE1IGF0IDExOjIwIEFNLCBHYWJyaWVsZSBQYW9s b25pDQo+IDxnYWJyaWVsZS5wYW9sb25pQGh1YXdlaS5jb20+IHdyb3RlOg0KPiA+IEhpIGd1eXMg c29ycnkgZm9yIHRoZSBsYXRlIHJlcGx5IEkgaGF2ZSBiZWVuIE9PTyBmb3IgdGhlIGxhc3QgNSBk YXlzDQo+ID4NCj4gPj4gLS0tLS1PcmlnaW5hbCBNZXNzYWdlLS0tLS0NCj4gPj4gRnJvbTogUHJh dHl1c2ggQW5hbmQgW21haWx0bzpwcmF0eXVzaC5hbmFuZEBnbWFpbC5jb21dDQo+ID4+IFNlbnQ6 IFNhdHVyZGF5LCBTZXB0ZW1iZXIgMTksIDIwMTUgNDowNCBBTQ0KPiA+PiBUbzogQmpvcm4gSGVs Z2Fhcw0KPiA+PiBDYzogR2FicmllbGUgUGFvbG9uaTsgSmluZ29vIEhhbjsgbGludXgtcGNpQHZn ZXIua2VybmVsLm9yZzsNCj4gV2FuZ3pob3UNCj4gPj4gKEIpOyBZdWFuemhpY2hhbmc7IFpodWRh Y2FpOyB6aGFuZ2p1a3VvOyBxaXV6aGVuZmE7IExpZ3Vvemh1DQo+IChLZW5uZXRoKQ0KPiA+PiBT dWJqZWN0OiBSZTogW1BBVENIIHYzIDIvM10gUENJOiBkZXNpZ253YXJlOiBjaGFuZ2UNCj4gZHdf cGNpZV9jZmdfd3JpdGUoKQ0KPiA+PiBhbmQgZHdfcGNpZV9jZmdfcmVhZCgpDQo+ID4+DQo+ID4+ IE9uIFNhdCwgU2VwIDE5LCAyMDE1IGF0IDI6MTYgQU0sIEJqb3JuIEhlbGdhYXMgPGJoZWxnYWFz QGdvb2dsZS5jb20+DQo+ID4+IHdyb3RlOg0KPiA+PiA+IE9uIEZyaSwgU2VwIDExLCAyMDE1IGF0 IDA1OjM4OjI2UE0gKzA4MDAsIEdhYnJpZWxlIFBhb2xvbmkgd3JvdGU6DQo+ID4+ID4+IEZyb206 IGdhYnJpZWxlIHBhb2xvbmkgPGdhYnJpZWxlLnBhb2xvbmlAaHVhd2VpLmNvbT4NCj4gPj4gPj4N Cj4gPj4gPj4gVGhpcyBwYXRjaCBjaGFuZ2VzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBkd19wY2ll X2NmZ19yZWFkKCkgYW5kDQo+ID4+ID4+IGR3X3BjaWVfY2ZnX3dyaXRlKCkgdG8gaW1wcm92ZSB0 aGUgZnVuY3Rpb24gdXNhZ2UgZnJvbSB0aGUNCj4gY2FsbGVycw0KPiA+PiA+PiBwZXJzcGVjdGl2 ZS4NCj4gPj4gPj4gQ3VycmVudGx5IHRoZSBjYWxsZXJzIGFyZSBvYmxpZ2VkIHRvIHBhc3MgdGhl IDMyYml0IGFsaWduZWQNCj4gYWRkcmVzcw0KPiA+PiA+PiBvZiB0aGUgcmVnaXN0ZXIgdGhhdCBj b250YWlucyB0aGUgZmllbGQgb2YgdGhlIFBDSSBoZWFkZXIgdGhhdA0KPiB0aGV5DQo+ID4+ID4+ IHdhbnQgdG8gcmVhZC93cml0ZTsgYWxzbyB0aGV5IGhhdmUgdG8gcGFzcyB0aGUgb2Zmc2V0IG9m IHRoZQ0KPiBmaWVsZA0KPiA+PiA+PiBpbiB0aGF0IHJlZ2lzdGVyLiBUaGlzIGlzIHF1aXRlIHRy aWNreSB0byB1c2UgYXMgdGhlIGNhbGxlcnMgYXJlDQo+ID4+ID4+IG9ibGlnZWQgdG8gc3VtIHRo ZSBQQ0kgaGVhZGVyIGJhc2UgYWRkcmVzcyB0byB0aGUgZmllbGQgb2Zmc2V0DQo+ID4+ID4+IG1h c2tlZCB0byByZXRyaWV2ZSB0aGUgMzJiIGFsaWduZWQgcmVnaXN0ZXIgYWRkcmVzcy4NCj4gPj4g Pj4NCj4gPj4gPj4gV2l0aCB0aGUgbmV3IEFQSSB0aGUgY2FsbGVycyBoYXZlIHRvIHBhc3MgdGhl IGJhc2UgYWRkcmVzcyBvZiB0aGUNCj4gPj4gPj4gUENJIGhlYWRlciBhbmQgdGhlIG9mZnNldCBj b3JyZXNwb25kaW5nIHRvIHRoZSBmaWVsZCB0aGV5IGludGVuZA0KPiB0bw0KPiA+PiA+PiByZWFk L3dyaXRlLg0KPiA+PiA+Pg0KPiA+PiA+PiBTaWduZWQtb2ZmLWJ5OiBHYWJyaWVsZSBQYW9sb25p IDxnYWJyaWVsZS5wYW9sb25pQGh1YXdlaS5jb20+DQo+ID4+ID4NCj4gPj4gPg0KPiA+PiA+PiAg aW50IGR3X3BjaWVfY2ZnX3JlYWQodm9pZCBfX2lvbWVtICphZGRyLCBpbnQgd2hlcmUsIGludCBz aXplLA0KPiB1MzINCj4gPj4gKnZhbCkNCj4gPj4gPj4gIHsNCj4gPj4gPj4gKyAgICAgYWRkciAr PSAod2hlcmUgJiB+MHgzKTsNCj4gPj4gPj4gICAgICAgKnZhbCA9IHJlYWRsKGFkZHIpOw0KPiA+ PiA+PiArICAgICB3aGVyZSAmPSAzOw0KPiA+PiA+Pg0KPiA+PiA+PiAgICAgICBpZiAoc2l6ZSA9 PSAxKQ0KPiA+PiA+PiAtICAgICAgICAgICAgICp2YWwgPSAoKnZhbCA+PiAoOCAqICh3aGVyZSAm IDMpKSkgJiAweGZmOw0KPiA+PiA+PiArICAgICAgICAgICAgICp2YWwgPSAoKnZhbCA+PiAoOCAq IHdoZXJlKSkgJiAweGZmOw0KPiA+PiA+PiAgICAgICBlbHNlIGlmIChzaXplID09IDIpDQo+ID4+ ID4+IC0gICAgICAgICAgICAgKnZhbCA9ICgqdmFsID4+ICg4ICogKHdoZXJlICYgMykpKSAmIDB4 ZmZmZjsNCj4gPj4gPj4gKyAgICAgICAgICAgICAqdmFsID0gKCp2YWwgPj4gKDggKiB3aGVyZSkp ICYgMHhmZmZmOw0KPiA+PiA+PiAgICAgICBlbHNlIGlmIChzaXplICE9IDQpDQo+ID4+ID4+ICAg ICAgICAgICAgICAgcmV0dXJuIFBDSUJJT1NfQkFEX1JFR0lTVEVSX05VTUJFUjsNCj4gPj4gPj4N Cj4gPj4gPj4gQEAgLTk2LDEyICs5OCwxNCBAQCBpbnQgZHdfcGNpZV9jZmdfcmVhZCh2b2lkIF9f aW9tZW0gKmFkZHIsIGludA0KPiA+PiB3aGVyZSwgaW50IHNpemUsIHUzMiAqdmFsKQ0KPiA+PiA+ Pg0KPiA+PiA+PiAgaW50IGR3X3BjaWVfY2ZnX3dyaXRlKHZvaWQgX19pb21lbSAqYWRkciwgaW50 IHdoZXJlLCBpbnQgc2l6ZSwNCj4gdTMyDQo+ID4+IHZhbCkNCj4gPj4gPj4gIHsNCj4gPj4gPj4g KyAgICAgYWRkciArPSB3aGVyZTsNCj4gPj4gPj4gKw0KPiA+PiA+PiAgICAgICBpZiAoc2l6ZSA9 PSA0KQ0KPiA+PiA+PiAgICAgICAgICAgICAgIHdyaXRlbCh2YWwsIGFkZHIpOw0KPiA+PiA+PiAg ICAgICBlbHNlIGlmIChzaXplID09IDIpDQo+ID4+ID4+IC0gICAgICAgICAgICAgd3JpdGV3KHZh bCwgYWRkciArICh3aGVyZSAmIDIpKTsNCj4gPj4gPj4gKyAgICAgICAgICAgICB3cml0ZXcodmFs LCBhZGRyKTsNCj4gPj4gPj4gICAgICAgZWxzZSBpZiAoc2l6ZSA9PSAxKQ0KPiA+PiA+PiAtICAg ICAgICAgICAgIHdyaXRlYih2YWwsIGFkZHIgKyAod2hlcmUgJiAzKSk7DQo+ID4+ID4+ICsgICAg ICAgICAgICAgd3JpdGViKHZhbCwgYWRkcik7DQo+ID4+ID4+ICAgICAgIGVsc2UNCj4gPj4gPj4g ICAgICAgICAgICAgICByZXR1cm4gUENJQklPU19CQURfUkVHSVNURVJfTlVNQkVSOw0KPiA+PiA+ DQo+ID4+ID4gSSBqdXN0IG5vdGljZWQgdGhlIGFzeW1tZXRyeSBiZXR3ZWVuIGR3X3BjaWVfY2Zn X3JlYWQoKSBhbmQNCj4gPj4gPiBkd19wY2llX2NmZ193cml0ZSgpOiBpbiBkd19wY2llX2NmZ19y ZWFkKCkgd2UgYWx3YXlzIGRvIDMyLWJpdA0KPiByZWFkcw0KPiA+PiBhbmQNCj4gPj4gPiBtYXNr IG91dCB0aGUgcGFydHMgd2Ugd29uJ3Qgd2FudCwgYnV0IGluIGR3X3BjaWVfY2ZnX3dyaXRlKCkg d2UgZG8NCj4gOC0sDQo+ID4+IDE2LSwNCj4gPj4gPiBvciAzMi1ieXRlIHdyaXRlcy4NCj4gPj4g Pg0KPiA+PiA+IFRoYXQgd2FzIHRoZXJlIGV2ZW4gYmVmb3JlIHlvdXIgcGF0Y2gsIGJ1dCBJIHdv bmRlciB3aHkuICBFaXRoZXINCj4gYm90aA0KPiA+PiA+IHNob3VsZCB3b3JrIHRoZSBzYW1lIHdh eSwgb3IgdGhlcmUgc2hvdWxkIGJlIGEgY29tbWVudCBleHBsYWluaW5nDQo+IHdoeQ0KPiA+PiB0 aGV5DQo+ID4+ID4gYXJlIGRpZmZlcmVudC4NCj4gPj4gPg0KPiA+PiA+IEppbmdvbywgUHJhdHl1 c2g/DQo+ID4+DQo+ID4+IEFzIEkgc2FpZCBlYXJsaWVyLCBJIGp1c3QgdmFndWVseSByZW1lbWJl ciB0aGF0IHRoZXJlIHdhcyBzb21lIGlzc3VlDQo+ID4+IHdpdGggYSBTT0MgaW4gcmVhZGluZyBu b24gd29yZCBhbGlnbmVkIGFkZHJlc3Nlcy4NCj4gPj4gKDEpIEkgZG8gbm90IGhhdmUgYW55IHJl ZmVyZW5jZSBmb3IgaXQgYW5kICgyKSBldmVuIGlmIHNvbWUgd2hlcmUNCj4gPj4gdGhlcmUgY291 bGQgYmUgc3VjaCBpc3N1ZSB0aGV5IGNhbiBhbHdheXMgaGF2ZSBwbGF0Zm9ybSBzcGVjaWZpYw0K PiA+PiBhY2Nlc3NvciAuIFNvIEkgc3VwcG9ydCB5b3VyIGlkZWEgYW5kIGJvdGggcmVhZCBhbmQg d3JpdGUgY2FuIGJlDQo+IG1hZGUNCj4gPj4gc3ltbWV0cmljLg0KPiA+DQo+ID4gSSBhZ3JlZSB3 aXRoIHRoZSBpZGVhIGJ1dCwgd2hhdCBpZiBkb2luZyBzbyB3ZSBicmVhayBvdGhlciBkcml2ZXJz Pw0KPiA+IElzIHRoZSBjb3JyZWN0IGZsb3cgdG8gYnJlYWsgdGhlbSBmaXJzdCBhbmQgbGV0IHRo ZSBzaW5nbGUNCj4gbWFpbnRhaW5lcnMgZml4IHRoZW0gdGhlbi4uLj8NCj4gDQo+IFNpbmNlIHdl IGRvbid0IGtub3cgd2hpY2ggKGlmIGFueSkgc3lzdGVtcyB3b3VsZCBicmVhaywgSSB0aGluayB0 aGUNCj4gYmVzdCB3ZSBjYW4gZG8gaXMgc2VlIGlmIGFueWJvZHkgaGFzIG9iamVjdGlvbnMsIHRo ZW4gcHV0IGl0IGluIGFuZA0KPiBzZWUgaWYgYW55dGhpbmcgYnJlYWtzLg0KDQpSaWdodCwgSSds bCBwdXQgaXQgaW4gdjQNCg0KTWFueSBUaGFua3MNCg0KR2FiDQoNCj4gDQo+IEJqb3JuDQo= ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v3 2/3] PCI: designware: change dw_pcie_cfg_write() and dw_pcie_cfg_read() 2015-09-11 9:38 ` [PATCH v3 2/3] PCI: designware: change dw_pcie_cfg_write() and dw_pcie_cfg_read() Gabriele Paoloni 2015-09-18 20:46 ` Bjorn Helgaas @ 2015-09-18 20:53 ` Bjorn Helgaas 2015-09-19 3:11 ` Pratyush Anand 1 sibling, 1 reply; 13+ messages in thread From: Bjorn Helgaas @ 2015-09-18 20:53 UTC (permalink / raw) To: Gabriele Paoloni Cc: jingoohan1, pratyush.anand, linux-pci, wangzhou1, yuanzhichang, zhudacai, zhangjukuo, qiuzhenfa, liguozhu On Fri, Sep 11, 2015 at 05:38:26PM +0800, Gabriele Paoloni wrote: > From: gabriele paoloni <gabriele.paoloni@huawei.com> > > This patch changes the implementation of dw_pcie_cfg_read() and > dw_pcie_cfg_write() to improve the function usage from the callers > perspective. > Currently the callers are obliged to pass the 32bit aligned address > of the register that contains the field of the PCI header that they > want to read/write; also they have to pass the offset of the field > in that register. This is quite tricky to use as the callers are > obliged to sum the PCI header base address to the field offset > masked to retrieve the 32b aligned register address. > > With the new API the callers have to pass the base address of the > PCI header and the offset corresponding to the field they intend to > read/write. > > Signed-off-by: Gabriele Paoloni <gabriele.paoloni@huawei.com> > --- > drivers/pci/host/pci-exynos.c | 5 ++--- > drivers/pci/host/pci-keystone-dw.c | 4 ++-- > drivers/pci/host/pcie-designware.c | 28 ++++++++++++++-------------- > drivers/pci/host/pcie-spear13xx.c | 26 ++++++++++++-------------- > 4 files changed, 30 insertions(+), 33 deletions(-) > > diff --git a/drivers/pci/host/pci-exynos.c b/drivers/pci/host/pci-exynos.c > index f9f468d..8b0e04b 100644 > --- a/drivers/pci/host/pci-exynos.c > +++ b/drivers/pci/host/pci-exynos.c > @@ -454,7 +454,7 @@ static int exynos_pcie_rd_own_conf(struct pcie_port *pp, int where, int size, > int ret; > > exynos_pcie_sideband_dbi_r_mode(pp, true); > - ret = dw_pcie_cfg_read(pp->dbi_base + (where & ~0x3), where, size, val); > + ret = dw_pcie_cfg_read(pp->dbi_base, where, size, val); > exynos_pcie_sideband_dbi_r_mode(pp, false); > return ret; > } Is there really any value in keeping "addr" and "where" separate? dw_pcie_cfg_write() clearly doesn't care; it just adds them together. I don't think dw_pcie_cfg_read() needs to care either: it could round the address down to a 32-bit boundary and use the difference to compute the mask and shift. So I'm proposing something like this: int dw_pcie_cfg_read(void __iomem *addr, int size, u32 *val) int dw_pcie_cfg_write(void __iomem *addr, int size, u32 val) > int dw_pcie_cfg_read(void __iomem *addr, int where, int size, u32 *val) > { > + addr += (where & ~0x3); > *val = readl(addr); > + where &= 3; > > if (size == 1) > - *val = (*val >> (8 * (where & 3))) & 0xff; > + *val = (*val >> (8 * where)) & 0xff; > else if (size == 2) > - *val = (*val >> (8 * (where & 3))) & 0xffff; > + *val = (*val >> (8 * where)) & 0xffff; > else if (size != 4) > return PCIBIOS_BAD_REGISTER_NUMBER; > > @@ -96,12 +98,14 @@ int dw_pcie_cfg_read(void __iomem *addr, int where, int size, u32 *val) > > int dw_pcie_cfg_write(void __iomem *addr, int where, int size, u32 val) > { > + addr += where; > + > if (size == 4) > writel(val, addr); > else if (size == 2) > - writew(val, addr + (where & 2)); > + writew(val, addr); > else if (size == 1) > - writeb(val, addr + (where & 3)); > + writeb(val, addr); > else > return PCIBIOS_BAD_REGISTER_NUMBER; ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v3 2/3] PCI: designware: change dw_pcie_cfg_write() and dw_pcie_cfg_read() 2015-09-18 20:53 ` Bjorn Helgaas @ 2015-09-19 3:11 ` Pratyush Anand 2015-09-23 16:26 ` Gabriele Paoloni 0 siblings, 1 reply; 13+ messages in thread From: Pratyush Anand @ 2015-09-19 3:11 UTC (permalink / raw) To: Bjorn Helgaas Cc: Gabriele Paoloni, Jingoo Han, linux-pci@vger.kernel.org, Zhou Wang, Zhichang Yuan, zhudacai, Zhang Jukuo, qiuzhenfa, Liguozhu On Sat, Sep 19, 2015 at 2:23 AM, Bjorn Helgaas <bhelgaas@google.com> wrote: > > Is there really any value in keeping "addr" and "where" separate? Now we do not care of buggy SOCs which could have issues with non word aligned address read. If there is any such SOC, then they can have their own accessor. So, I do not see any value of keeping "where". > dw_pcie_cfg_write() clearly doesn't care; it just adds them together. I > don't think dw_pcie_cfg_read() needs to care either: it could round the > address down to a 32-bit boundary and use the difference to compute the > mask and shift. > > So I'm proposing something like this: > > int dw_pcie_cfg_read(void __iomem *addr, int size, u32 *val) > int dw_pcie_cfg_write(void __iomem *addr, int size, u32 val) Agreed. ~Pratyush ^ permalink raw reply [flat|nested] 13+ messages in thread
* RE: [PATCH v3 2/3] PCI: designware: change dw_pcie_cfg_write() and dw_pcie_cfg_read() 2015-09-19 3:11 ` Pratyush Anand @ 2015-09-23 16:26 ` Gabriele Paoloni 0 siblings, 0 replies; 13+ messages in thread From: Gabriele Paoloni @ 2015-09-23 16:26 UTC (permalink / raw) To: Pratyush Anand, Bjorn Helgaas Cc: Jingoo Han, linux-pci@vger.kernel.org, Wangzhou (B), Yuanzhichang, Zhudacai, zhangjukuo, qiuzhenfa, Liguozhu (Kenneth) DQoNCj4gLS0tLS1PcmlnaW5hbCBNZXNzYWdlLS0tLS0NCj4gRnJvbTogbGludXgtcGNpLW93bmVy QHZnZXIua2VybmVsLm9yZyBbbWFpbHRvOmxpbnV4LXBjaS0NCj4gb3duZXJAdmdlci5rZXJuZWwu b3JnXSBPbiBCZWhhbGYgT2YgUHJhdHl1c2ggQW5hbmQNCj4gU2VudDogU2F0dXJkYXksIFNlcHRl bWJlciAxOSwgMjAxNSA0OjExIEFNDQo+IFRvOiBCam9ybiBIZWxnYWFzDQo+IENjOiBHYWJyaWVs ZSBQYW9sb25pOyBKaW5nb28gSGFuOyBsaW51eC1wY2lAdmdlci5rZXJuZWwub3JnOyBXYW5nemhv dQ0KPiAoQik7IFl1YW56aGljaGFuZzsgWmh1ZGFjYWk7IHpoYW5nanVrdW87IHFpdXpoZW5mYTsg TGlndW96aHUgKEtlbm5ldGgpDQo+IFN1YmplY3Q6IFJlOiBbUEFUQ0ggdjMgMi8zXSBQQ0k6IGRl c2lnbndhcmU6IGNoYW5nZSBkd19wY2llX2NmZ193cml0ZSgpDQo+IGFuZCBkd19wY2llX2NmZ19y ZWFkKCkNCj4gDQo+IE9uIFNhdCwgU2VwIDE5LCAyMDE1IGF0IDI6MjMgQU0sIEJqb3JuIEhlbGdh YXMgPGJoZWxnYWFzQGdvb2dsZS5jb20+DQo+IHdyb3RlOg0KPiA+DQo+ID4gSXMgdGhlcmUgcmVh bGx5IGFueSB2YWx1ZSBpbiBrZWVwaW5nICJhZGRyIiBhbmQgIndoZXJlIiBzZXBhcmF0ZT8NCj4g DQo+IE5vdyB3ZSBkbyBub3QgY2FyZSBvZiBidWdneSBTT0NzIHdoaWNoIGNvdWxkIGhhdmUgaXNz dWVzIHdpdGggbm9uIHdvcmQNCj4gYWxpZ25lZCBhZGRyZXNzIHJlYWQuIElmIHRoZXJlIGlzIGFu eSBzdWNoIFNPQywgdGhlbiB0aGV5IGNhbiBoYXZlDQo+IHRoZWlyIG93biBhY2Nlc3Nvci4NCj4g U28sIEkgZG8gbm90IHNlZSBhbnkgdmFsdWUgb2Yga2VlcGluZyAid2hlcmUiLg0KPiANCj4gPiBk d19wY2llX2NmZ193cml0ZSgpIGNsZWFybHkgZG9lc24ndCBjYXJlOyBpdCBqdXN0IGFkZHMgdGhl bSB0b2dldGhlci4NCj4gSQ0KPiA+IGRvbid0IHRoaW5rIGR3X3BjaWVfY2ZnX3JlYWQoKSBuZWVk cyB0byBjYXJlIGVpdGhlcjogaXQgY291bGQgcm91bmQNCj4gdGhlDQo+ID4gYWRkcmVzcyBkb3du IHRvIGEgMzItYml0IGJvdW5kYXJ5IGFuZCB1c2UgdGhlIGRpZmZlcmVuY2UgdG8gY29tcHV0ZQ0K PiB0aGUNCj4gPiBtYXNrIGFuZCBzaGlmdC4NCj4gPg0KPiA+IFNvIEknbSBwcm9wb3Npbmcgc29t ZXRoaW5nIGxpa2UgdGhpczoNCj4gPg0KPiA+ICAgaW50IGR3X3BjaWVfY2ZnX3JlYWQodm9pZCBf X2lvbWVtICphZGRyLCBpbnQgc2l6ZSwgdTMyICp2YWwpDQo+ID4gICBpbnQgZHdfcGNpZV9jZmdf d3JpdGUodm9pZCBfX2lvbWVtICphZGRyLCBpbnQgc2l6ZSwgdTMyIHZhbCkNCg0KT2sgQWdyZWVk DQoNCldpbGwgZG8gaW4gdjQNCg0KR2FiDQoNCj4gDQo+IEFncmVlZC4NCj4gDQo+IH5QcmF0eXVz aA0KPiAtLQ0KPiBUbyB1bnN1YnNjcmliZSBmcm9tIHRoaXMgbGlzdDogc2VuZCB0aGUgbGluZSAi dW5zdWJzY3JpYmUgbGludXgtcGNpIiBpbg0KPiB0aGUgYm9keSBvZiBhIG1lc3NhZ2UgdG8gbWFq b3Jkb21vQHZnZXIua2VybmVsLm9yZw0KPiBNb3JlIG1ham9yZG9tbyBpbmZvIGF0ICBodHRwOi8v dmdlci5rZXJuZWwub3JnL21ham9yZG9tby1pbmZvLmh0bWwNCg== ^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH v3 3/3] PCI: designware: add sanity checks on the header offset in dw_pcie_cfg_read and dw_pcie_cfg_write 2015-09-11 9:38 [PATCH v3 0/3] PCI: designware: change dw_pcie_cfg_write() and dw_pcie_cfg_read() Gabriele Paoloni 2015-09-11 9:38 ` [PATCH v3 1/3] PCIe: SPEAr13xx: fix dw_pcie_cfg_read/write() usage Gabriele Paoloni 2015-09-11 9:38 ` [PATCH v3 2/3] PCI: designware: change dw_pcie_cfg_write() and dw_pcie_cfg_read() Gabriele Paoloni @ 2015-09-11 9:38 ` Gabriele Paoloni 2015-09-15 9:28 ` [PATCH v3 0/3] PCI: designware: change dw_pcie_cfg_write() and dw_pcie_cfg_read() Gabriele Paoloni 3 siblings, 0 replies; 13+ messages in thread From: Gabriele Paoloni @ 2015-09-11 9:38 UTC (permalink / raw) To: bhelgaas, jingoohan1, pratyush.anand Cc: linux-pci, gabriele.paoloni, wangzhou1, yuanzhichang, zhudacai, zhangjukuo, qiuzhenfa, liguozhu From: gabriele paoloni <gabriele.paoloni@huawei.com> This patch adds sanity checks on "where" input parameter in dw_pcie_cfg_read and dw_pcie_cfg_write. These checks make sure that offset passed in by the caller is not in conflict with the size of the PCI header field that is being read/written Signed-off-by: Gabriele Paoloni <gabriele.paoloni@huawei.com> --- drivers/pci/host/pcie-designware.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/drivers/pci/host/pcie-designware.c b/drivers/pci/host/pcie-designware.c index cb23e31..6812f69 100644 --- a/drivers/pci/host/pcie-designware.c +++ b/drivers/pci/host/pcie-designware.c @@ -88,9 +88,14 @@ int dw_pcie_cfg_read(void __iomem *addr, int where, int size, u32 *val) if (size == 1) *val = (*val >> (8 * where)) & 0xff; - else if (size == 2) + else if (size == 2) { + if (where & 1) + return PCIBIOS_BAD_REGISTER_NUMBER; *val = (*val >> (8 * where)) & 0xffff; - else if (size != 4) + } else if (size == 4) { + if (where & 3) + return PCIBIOS_BAD_REGISTER_NUMBER; + } else return PCIBIOS_BAD_REGISTER_NUMBER; return PCIBIOS_SUCCESSFUL; @@ -100,11 +105,15 @@ int dw_pcie_cfg_write(void __iomem *addr, int where, int size, u32 val) { addr += where; - if (size == 4) + if (size == 4) { + if ((uintptr_t)addr & 3) + return PCIBIOS_BAD_REGISTER_NUMBER; writel(val, addr); - else if (size == 2) + } else if (size == 2) { + if ((uintptr_t)addr & 1) + return PCIBIOS_BAD_REGISTER_NUMBER; writew(val, addr); - else if (size == 1) + } else if (size == 1) writeb(val, addr); else return PCIBIOS_BAD_REGISTER_NUMBER; -- 1.9.1 ^ permalink raw reply related [flat|nested] 13+ messages in thread
* RE: [PATCH v3 0/3] PCI: designware: change dw_pcie_cfg_write() and dw_pcie_cfg_read() 2015-09-11 9:38 [PATCH v3 0/3] PCI: designware: change dw_pcie_cfg_write() and dw_pcie_cfg_read() Gabriele Paoloni ` (2 preceding siblings ...) 2015-09-11 9:38 ` [PATCH v3 3/3] PCI: designware: add sanity checks on the header offset in dw_pcie_cfg_read and dw_pcie_cfg_write Gabriele Paoloni @ 2015-09-15 9:28 ` Gabriele Paoloni 3 siblings, 0 replies; 13+ messages in thread From: Gabriele Paoloni @ 2015-09-15 9:28 UTC (permalink / raw) To: Gabriele Paoloni, bhelgaas@google.com, jingoohan1@gmail.com, pratyush.anand@gmail.com Cc: linux-pci@vger.kernel.org, Wangzhou (B), Yuanzhichang, Zhudacai, zhangjukuo, qiuzhenfa, Liguozhu (Kenneth) SGkgUHJhdHl1c2guLi5kbyB5b3UgdGhpbmsgdGhlIHBhdGNoc2V0IGlzIGdvb2QgdG8gYmUgYWNr ZWQtYnk/DQoNClRoYW5rcw0KDQpHYWINCg0KPiAtLS0tLU9yaWdpbmFsIE1lc3NhZ2UtLS0tLQ0K PiBGcm9tOiBHYWJyaWVsZSBQYW9sb25pDQo+IFNlbnQ6IEZyaWRheSwgU2VwdGVtYmVyIDExLCAy MDE1IDEwOjM4IEFNDQo+IFRvOiBiaGVsZ2Fhc0Bnb29nbGUuY29tOyBqaW5nb29oYW4xQGdtYWls LmNvbTsgcHJhdHl1c2guYW5hbmRAZ21haWwuY29tDQo+IENjOiBsaW51eC1wY2lAdmdlci5rZXJu ZWwub3JnOyBHYWJyaWVsZSBQYW9sb25pOyBXYW5nemhvdSAoQik7DQo+IFl1YW56aGljaGFuZzsg Wmh1ZGFjYWk7IHpoYW5nanVrdW87IHFpdXpoZW5mYTsgTGlndW96aHUgKEtlbm5ldGgpDQo+IFN1 YmplY3Q6IFtQQVRDSCB2MyAwLzNdIFBDSTogZGVzaWdud2FyZTogY2hhbmdlIGR3X3BjaWVfY2Zn X3dyaXRlKCkgYW5kDQo+IGR3X3BjaWVfY2ZnX3JlYWQoKQ0KPiANCj4gRnJvbTogZ2FicmllbGUg cGFvbG9uaSA8Z2FicmllbGUucGFvbG9uaUBodWF3ZWkuY29tPg0KPiANCj4gVGhpcyBwYXRjaHNl dDoNCj4gMSkgZml4ZXMgYSBidWcgaW4gc3BlYXIxM3h4IHdoZW4gY2FsbGluZyBkd19wY2llX2Nm Z19yZWFkIGFuZA0KPiAgICBkd19wY2llX2NmZ193cml0ZSB1c2lnbiB0aGUgcGF0Y2ggZnJvbSBQ cmF0eXVzaCBpbg0KPiAgICBodHRwczovL2xrbWwub3JnL2xrbWwvMjAxNS85LzcvNQ0KPiAyKSBy ZXdvcmtzIGR3X3BjaWVfY2ZnX3JlYWQvZHdfcGNpZV9jZmdfd3JpdGUgaW4gcGNpZS1kZXNpZ253 YXJlLmMgaW4NCj4gICAgb3JkZXIgdG8gbWFrZSBpdCBlYXNpZXIgZm9yIGNhbGxlcnMgdG8gcGFz cyBpbnB1dCBwYXJhbWV0ZXJzOw0KPiAzKSBhZGRzIHNhbml0eSBjaGVja3MgaW4gZHdfcGNpZV9j ZmdfcmVhZC9kd19wY2llX2NmZ193cml0ZSB0byBtYWtlDQo+ICAgIHN1cmUgdGhlIFBDSSBoZWFk ZXIgb2Zmc2V0IGRvZXMgbm90IGNvbmZsaWN0IHdpdGggdGhlIHNpemUgb2YNCj4gICAgdGhlIHJl YWQvd3JpdHRlbiBmaWVsZC4NCj4gDQo+IENoYW5nZSBmcm9tIHYyOg0KPiAgICBSZXBsYWNlZCBw YXRjaCAxLzMgd2l0aCBQcmF0eXVzaCBvbmUgaW4NCj4gICAgaHR0cHM6Ly9sa21sLm9yZy9sa21s LzIwMTUvOS83LzUNCj4gDQo+IGdhYnJpZWxlIHBhb2xvbmkgKDMpOg0KPiAgIFBDSWU6IFNQRUFy MTN4eDogZml4IGR3X3BjaWVfY2ZnX3JlYWQvd3JpdGUoKSB1c2FnZQ0KPiAgIFBDSTogZGVzaWdu d2FyZTogY2hhbmdlIGR3X3BjaWVfY2ZnX3dyaXRlKCkgYW5kICBkd19wY2llX2NmZ19yZWFkKCkN Cj4gICBQQ0k6IGRlc2lnbndhcmU6IGFkZCBzYW5pdHkgY2hlY2tzIG9uIHRoZSBoZWFkZXIgb2Zm c2V0IGluDQo+ICAgICBkd19wY2llX2NmZ19yZWFkIGFuZCBkd19wY2llX2NmZ193cml0ZQ0KPiAN Cj4gIGRyaXZlcnMvcGNpL2hvc3QvcGNpLWV4eW5vcy5jICAgICAgfCAgNSArKy0tDQo+ICBkcml2 ZXJzL3BjaS9ob3N0L3BjaS1rZXlzdG9uZS1kdy5jIHwgIDQgKystLQ0KPiAgZHJpdmVycy9wY2kv aG9zdC9wY2llLWRlc2lnbndhcmUuYyB8IDQ3ICsrKysrKysrKysrKysrKysrKysrKysrLS0tLS0t LQ0KPiAtLS0tLS0tLQ0KPiAgZHJpdmVycy9wY2kvaG9zdC9wY2llLXNwZWFyMTN4eC5jICB8IDE4 ICsrKysrKystLS0tLS0tLQ0KPiAgNCBmaWxlcyBjaGFuZ2VkLCA0MSBpbnNlcnRpb25zKCspLCAz MyBkZWxldGlvbnMoLSkNCj4gDQo+IC0tDQo+IDEuOS4xDQoNCg== ^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2015-09-23 16:27 UTC | newest] Thread overview: 13+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2015-09-11 9:38 [PATCH v3 0/3] PCI: designware: change dw_pcie_cfg_write() and dw_pcie_cfg_read() Gabriele Paoloni 2015-09-11 9:38 ` [PATCH v3 1/3] PCIe: SPEAr13xx: fix dw_pcie_cfg_read/write() usage Gabriele Paoloni 2015-09-11 9:38 ` [PATCH v3 2/3] PCI: designware: change dw_pcie_cfg_write() and dw_pcie_cfg_read() Gabriele Paoloni 2015-09-18 20:46 ` Bjorn Helgaas 2015-09-19 3:03 ` Pratyush Anand 2015-09-23 16:20 ` Gabriele Paoloni 2015-09-23 16:24 ` Bjorn Helgaas 2015-09-23 16:26 ` Gabriele Paoloni 2015-09-18 20:53 ` Bjorn Helgaas 2015-09-19 3:11 ` Pratyush Anand 2015-09-23 16:26 ` Gabriele Paoloni 2015-09-11 9:38 ` [PATCH v3 3/3] PCI: designware: add sanity checks on the header offset in dw_pcie_cfg_read and dw_pcie_cfg_write Gabriele Paoloni 2015-09-15 9:28 ` [PATCH v3 0/3] PCI: designware: change dw_pcie_cfg_write() and dw_pcie_cfg_read() Gabriele Paoloni
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).