aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKishon Vijay Abraham I <kishon@ti.com>2017-03-13 09:43:26 -0400
committerBjorn Helgaas <bhelgaas@google.com>2017-04-04 09:40:55 -0400
commita509d7d9af5ebf86ffbefa98e49761d813fb1d40 (patch)
tree7dc1c06d9aab039477a65b0d28464e2b88a9a6dd
parentb50b2db266d8a8c303e8d88590c6416dfe576c6c (diff)
PCI: dwc: all: Modify dbi accessors to access data of 4/2/1 bytes
Previously dbi accessors can be used to access data of size 4 bytes. But there might be situations (like accessing MSI_MESSAGE_CONTROL in order to set/get the number of required MSI interrupts in EP mode) where dbi accessors must be used to access data of size 2. This is in preparation for adding endpoint mode support to designware driver. Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com> Signed-off-by: Bjorn Helgaas <bhelgaas@google.com> Acked-by: Niklas Cassel <niklas.cassel@axis.com> Cc: Jingoo Han <jingoohan1@gmail.com> Cc: Joao Pinto <Joao.Pinto@synopsys.com>
-rw-r--r--drivers/pci/dwc/pci-exynos.c16
-rw-r--r--drivers/pci/dwc/pcie-designware.c34
-rw-r--r--drivers/pci/dwc/pcie-designware.h18
3 files changed, 42 insertions, 26 deletions
diff --git a/drivers/pci/dwc/pci-exynos.c b/drivers/pci/dwc/pci-exynos.c
index c2dafad48d50..546082ad5a3f 100644
--- a/drivers/pci/dwc/pci-exynos.c
+++ b/drivers/pci/dwc/pci-exynos.c
@@ -521,25 +521,25 @@ static void exynos_pcie_enable_interrupts(struct exynos_pcie *ep)
521 exynos_pcie_msi_init(ep); 521 exynos_pcie_msi_init(ep);
522} 522}
523 523
524static u32 exynos_pcie_readl_dbi(struct dw_pcie *pci, void __iomem *base, 524static u32 exynos_pcie_read_dbi(struct dw_pcie *pci, void __iomem *base,
525 u32 reg) 525 u32 reg, size_t size)
526{ 526{
527 struct exynos_pcie *ep = to_exynos_pcie(pci); 527 struct exynos_pcie *ep = to_exynos_pcie(pci);
528 u32 val; 528 u32 val;
529 529
530 exynos_pcie_sideband_dbi_r_mode(ep, true); 530 exynos_pcie_sideband_dbi_r_mode(ep, true);
531 val = readl(base + reg); 531 dw_pcie_read(base + reg, size, &val);
532 exynos_pcie_sideband_dbi_r_mode(ep, false); 532 exynos_pcie_sideband_dbi_r_mode(ep, false);
533 return val; 533 return val;
534} 534}
535 535
536static void exynos_pcie_writel_dbi(struct dw_pcie *pci, void __iomem *base, 536static void exynos_pcie_write_dbi(struct dw_pcie *pci, void __iomem *base,
537 u32 reg, u32 val) 537 u32 reg, size_t size, u32 val)
538{ 538{
539 struct exynos_pcie *ep = to_exynos_pcie(pci); 539 struct exynos_pcie *ep = to_exynos_pcie(pci);
540 540
541 exynos_pcie_sideband_dbi_w_mode(ep, true); 541 exynos_pcie_sideband_dbi_w_mode(ep, true);
542 writel(val, base + reg); 542 dw_pcie_write(base + reg, size, val);
543 exynos_pcie_sideband_dbi_w_mode(ep, false); 543 exynos_pcie_sideband_dbi_w_mode(ep, false);
544} 544}
545 545
@@ -646,8 +646,8 @@ static int __init exynos_add_pcie_port(struct exynos_pcie *ep,
646} 646}
647 647
648static const struct dw_pcie_ops dw_pcie_ops = { 648static const struct dw_pcie_ops dw_pcie_ops = {
649 .readl_dbi = exynos_pcie_readl_dbi, 649 .read_dbi = exynos_pcie_read_dbi,
650 .writel_dbi = exynos_pcie_writel_dbi, 650 .write_dbi = exynos_pcie_write_dbi,
651 .link_up = exynos_pcie_link_up, 651 .link_up = exynos_pcie_link_up,
652}; 652};
653 653
diff --git a/drivers/pci/dwc/pcie-designware.c b/drivers/pci/dwc/pcie-designware.c
index ea403e2240cf..734acac1926d 100644
--- a/drivers/pci/dwc/pcie-designware.c
+++ b/drivers/pci/dwc/pcie-designware.c
@@ -61,21 +61,35 @@ int dw_pcie_write(void __iomem *addr, int size, u32 val)
61 return PCIBIOS_SUCCESSFUL; 61 return PCIBIOS_SUCCESSFUL;
62} 62}
63 63
64u32 __dw_pcie_readl_dbi(struct dw_pcie *pci, void __iomem *base, u32 reg) 64u32 __dw_pcie_read_dbi(struct dw_pcie *pci, void __iomem *base, u32 reg,
65 size_t size)
65{ 66{
66 if (pci->ops->readl_dbi) 67 int ret;
67 return pci->ops->readl_dbi(pci, base, reg); 68 u32 val;
69
70 if (pci->ops->read_dbi)
71 return pci->ops->read_dbi(pci, base, reg, size);
68 72
69 return readl(base + reg); 73 ret = dw_pcie_read(base + reg, size, &val);
74 if (ret)
75 dev_err(pci->dev, "read DBI address failed\n");
76
77 return val;
70} 78}
71 79
72void __dw_pcie_writel_dbi(struct dw_pcie *pci, void __iomem *base, u32 reg, 80void __dw_pcie_write_dbi(struct dw_pcie *pci, void __iomem *base, u32 reg,
73 u32 val) 81 size_t size, u32 val)
74{ 82{
75 if (pci->ops->writel_dbi) 83 int ret;
76 pci->ops->writel_dbi(pci, base, reg, val); 84
77 else 85 if (pci->ops->write_dbi) {
78 writel(val, base + reg); 86 pci->ops->write_dbi(pci, base, reg, size, val);
87 return;
88 }
89
90 ret = dw_pcie_write(base + reg, size, val);
91 if (ret)
92 dev_err(pci->dev, "write DBI address failed\n");
79} 93}
80 94
81static u32 dw_pcie_readl_unroll(struct dw_pcie *pci, u32 index, u32 reg) 95static u32 dw_pcie_readl_unroll(struct dw_pcie *pci, u32 index, u32 reg)
diff --git a/drivers/pci/dwc/pcie-designware.h b/drivers/pci/dwc/pcie-designware.h
index 09b334a12892..bfaf2b850a88 100644
--- a/drivers/pci/dwc/pcie-designware.h
+++ b/drivers/pci/dwc/pcie-designware.h
@@ -144,9 +144,10 @@ struct pcie_port {
144 144
145struct dw_pcie_ops { 145struct dw_pcie_ops {
146 u64 (*cpu_addr_fixup)(u64 cpu_addr); 146 u64 (*cpu_addr_fixup)(u64 cpu_addr);
147 u32 (*readl_dbi)(struct dw_pcie *pcie, void __iomem *base, u32 reg); 147 u32 (*read_dbi)(struct dw_pcie *pcie, void __iomem *base, u32 reg,
148 void (*writel_dbi)(struct dw_pcie *pcie, void __iomem *base, u32 reg, 148 size_t size);
149 u32 val); 149 void (*write_dbi)(struct dw_pcie *pcie, void __iomem *base, u32 reg,
150 size_t size, u32 val);
150 int (*link_up)(struct dw_pcie *pcie); 151 int (*link_up)(struct dw_pcie *pcie);
151}; 152};
152 153
@@ -164,9 +165,10 @@ struct dw_pcie {
164int dw_pcie_read(void __iomem *addr, int size, u32 *val); 165int dw_pcie_read(void __iomem *addr, int size, u32 *val);
165int dw_pcie_write(void __iomem *addr, int size, u32 val); 166int dw_pcie_write(void __iomem *addr, int size, u32 val);
166 167
167u32 __dw_pcie_readl_dbi(struct dw_pcie *pci, void __iomem *base, u32 reg); 168u32 __dw_pcie_read_dbi(struct dw_pcie *pci, void __iomem *base, u32 reg,
168void __dw_pcie_writel_dbi(struct dw_pcie *pci, void __iomem *base, u32 reg, 169 size_t size);
169 u32 val); 170void __dw_pcie_write_dbi(struct dw_pcie *pci, void __iomem *base, u32 reg,
171 size_t size, u32 val);
170int dw_pcie_link_up(struct dw_pcie *pci); 172int dw_pcie_link_up(struct dw_pcie *pci);
171int dw_pcie_wait_for_link(struct dw_pcie *pci); 173int dw_pcie_wait_for_link(struct dw_pcie *pci);
172void dw_pcie_prog_outbound_atu(struct dw_pcie *pci, int index, 174void dw_pcie_prog_outbound_atu(struct dw_pcie *pci, int index,
@@ -176,12 +178,12 @@ void dw_pcie_setup(struct dw_pcie *pci);
176 178
177static inline void dw_pcie_writel_dbi(struct dw_pcie *pci, u32 reg, u32 val) 179static inline void dw_pcie_writel_dbi(struct dw_pcie *pci, u32 reg, u32 val)
178{ 180{
179 __dw_pcie_writel_dbi(pci, pci->dbi_base, reg, val); 181 __dw_pcie_write_dbi(pci, pci->dbi_base, reg, 0x4, val);
180} 182}
181 183
182static inline u32 dw_pcie_readl_dbi(struct dw_pcie *pci, u32 reg) 184static inline u32 dw_pcie_readl_dbi(struct dw_pcie *pci, u32 reg)
183{ 185{
184 return __dw_pcie_readl_dbi(pci, pci->dbi_base, reg); 186 return __dw_pcie_read_dbi(pci, pci->dbi_base, reg, 0x4);
185} 187}
186 188
187#ifdef CONFIG_PCIE_DW_HOST 189#ifdef CONFIG_PCIE_DW_HOST