aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/pci/host/pcie-designware.c135
1 files changed, 55 insertions, 80 deletions
diff --git a/drivers/pci/host/pcie-designware.c b/drivers/pci/host/pcie-designware.c
index 77b0c257f215..c10e9ac9bbbc 100644
--- a/drivers/pci/host/pcie-designware.c
+++ b/drivers/pci/host/pcie-designware.c
@@ -99,22 +99,20 @@ int cfg_write(void __iomem *addr, int where, int size, u32 val)
99 return PCIBIOS_SUCCESSFUL; 99 return PCIBIOS_SUCCESSFUL;
100} 100}
101 101
102static inline void dw_pcie_readl_rc(struct pcie_port *pp, 102static inline void dw_pcie_readl_rc(struct pcie_port *pp, u32 reg, u32 *val)
103 void __iomem *dbi_addr, u32 *val)
104{ 103{
105 if (pp->ops->readl_rc) 104 if (pp->ops->readl_rc)
106 pp->ops->readl_rc(pp, dbi_addr, val); 105 pp->ops->readl_rc(pp, pp->dbi_base + reg, val);
107 else 106 else
108 *val = readl(dbi_addr); 107 *val = readl(pp->dbi_base + reg);
109} 108}
110 109
111static inline void dw_pcie_writel_rc(struct pcie_port *pp, 110static inline void dw_pcie_writel_rc(struct pcie_port *pp, u32 val, u32 reg)
112 u32 val, void __iomem *dbi_addr)
113{ 111{
114 if (pp->ops->writel_rc) 112 if (pp->ops->writel_rc)
115 pp->ops->writel_rc(pp, val, dbi_addr); 113 pp->ops->writel_rc(pp, val, pp->dbi_base + reg);
116 else 114 else
117 writel(val, dbi_addr); 115 writel(val, pp->dbi_base + reg);
118} 116}
119 117
120int dw_pcie_rd_own_conf(struct pcie_port *pp, int where, int size, 118int dw_pcie_rd_own_conf(struct pcie_port *pp, int where, int size,
@@ -251,86 +249,64 @@ int __init dw_pcie_host_init(struct pcie_port *pp)
251 249
252static void dw_pcie_prog_viewport_cfg0(struct pcie_port *pp, u32 busdev) 250static void dw_pcie_prog_viewport_cfg0(struct pcie_port *pp, u32 busdev)
253{ 251{
254 u32 val;
255 void __iomem *dbi_base = pp->dbi_base;
256
257 /* Program viewport 0 : OUTBOUND : CFG0 */ 252 /* Program viewport 0 : OUTBOUND : CFG0 */
258 val = PCIE_ATU_REGION_OUTBOUND | PCIE_ATU_REGION_INDEX0; 253 dw_pcie_writel_rc(pp, PCIE_ATU_REGION_OUTBOUND | PCIE_ATU_REGION_INDEX0,
259 dw_pcie_writel_rc(pp, val, dbi_base + PCIE_ATU_VIEWPORT); 254 PCIE_ATU_VIEWPORT);
260 dw_pcie_writel_rc(pp, pp->cfg0_base, dbi_base + PCIE_ATU_LOWER_BASE); 255 dw_pcie_writel_rc(pp, pp->cfg0_base, PCIE_ATU_LOWER_BASE);
261 dw_pcie_writel_rc(pp, (pp->cfg0_base >> 32), 256 dw_pcie_writel_rc(pp, (pp->cfg0_base >> 32), PCIE_ATU_UPPER_BASE);
262 dbi_base + PCIE_ATU_UPPER_BASE);
263 dw_pcie_writel_rc(pp, pp->cfg0_base + pp->config.cfg0_size - 1, 257 dw_pcie_writel_rc(pp, pp->cfg0_base + pp->config.cfg0_size - 1,
264 dbi_base + PCIE_ATU_LIMIT); 258 PCIE_ATU_LIMIT);
265 dw_pcie_writel_rc(pp, busdev, dbi_base + PCIE_ATU_LOWER_TARGET); 259 dw_pcie_writel_rc(pp, busdev, PCIE_ATU_LOWER_TARGET);
266 dw_pcie_writel_rc(pp, 0, dbi_base + PCIE_ATU_UPPER_TARGET); 260 dw_pcie_writel_rc(pp, 0, PCIE_ATU_UPPER_TARGET);
267 dw_pcie_writel_rc(pp, PCIE_ATU_TYPE_CFG0, dbi_base + PCIE_ATU_CR1); 261 dw_pcie_writel_rc(pp, PCIE_ATU_TYPE_CFG0, PCIE_ATU_CR1);
268 val = PCIE_ATU_ENABLE; 262 dw_pcie_writel_rc(pp, PCIE_ATU_ENABLE, PCIE_ATU_CR2);
269 dw_pcie_writel_rc(pp, val, dbi_base + PCIE_ATU_CR2);
270} 263}
271 264
272static void dw_pcie_prog_viewport_cfg1(struct pcie_port *pp, u32 busdev) 265static void dw_pcie_prog_viewport_cfg1(struct pcie_port *pp, u32 busdev)
273{ 266{
274 u32 val;
275 void __iomem *dbi_base = pp->dbi_base;
276
277 /* Program viewport 1 : OUTBOUND : CFG1 */ 267 /* Program viewport 1 : OUTBOUND : CFG1 */
278 val = PCIE_ATU_REGION_OUTBOUND | PCIE_ATU_REGION_INDEX1; 268 dw_pcie_writel_rc(pp, PCIE_ATU_REGION_OUTBOUND | PCIE_ATU_REGION_INDEX1,
279 dw_pcie_writel_rc(pp, val, dbi_base + PCIE_ATU_VIEWPORT); 269 PCIE_ATU_VIEWPORT);
280 dw_pcie_writel_rc(pp, PCIE_ATU_TYPE_CFG1, dbi_base + PCIE_ATU_CR1); 270 dw_pcie_writel_rc(pp, PCIE_ATU_TYPE_CFG1, PCIE_ATU_CR1);
281 val = PCIE_ATU_ENABLE; 271 dw_pcie_writel_rc(pp, PCIE_ATU_ENABLE, PCIE_ATU_CR2);
282 dw_pcie_writel_rc(pp, val, dbi_base + PCIE_ATU_CR2); 272 dw_pcie_writel_rc(pp, pp->cfg1_base, PCIE_ATU_LOWER_BASE);
283 dw_pcie_writel_rc(pp, pp->cfg1_base, dbi_base + PCIE_ATU_LOWER_BASE); 273 dw_pcie_writel_rc(pp, (pp->cfg1_base >> 32), PCIE_ATU_UPPER_BASE);
284 dw_pcie_writel_rc(pp, (pp->cfg1_base >> 32),
285 dbi_base + PCIE_ATU_UPPER_BASE);
286 dw_pcie_writel_rc(pp, pp->cfg1_base + pp->config.cfg1_size - 1, 274 dw_pcie_writel_rc(pp, pp->cfg1_base + pp->config.cfg1_size - 1,
287 dbi_base + PCIE_ATU_LIMIT); 275 PCIE_ATU_LIMIT);
288 dw_pcie_writel_rc(pp, busdev, dbi_base + PCIE_ATU_LOWER_TARGET); 276 dw_pcie_writel_rc(pp, busdev, PCIE_ATU_LOWER_TARGET);
289 dw_pcie_writel_rc(pp, 0, dbi_base + PCIE_ATU_UPPER_TARGET); 277 dw_pcie_writel_rc(pp, 0, PCIE_ATU_UPPER_TARGET);
290} 278}
291 279
292static void dw_pcie_prog_viewport_mem_outbound(struct pcie_port *pp) 280static void dw_pcie_prog_viewport_mem_outbound(struct pcie_port *pp)
293{ 281{
294 u32 val;
295 void __iomem *dbi_base = pp->dbi_base;
296
297 /* Program viewport 0 : OUTBOUND : MEM */ 282 /* Program viewport 0 : OUTBOUND : MEM */
298 val = PCIE_ATU_REGION_OUTBOUND | PCIE_ATU_REGION_INDEX0; 283 dw_pcie_writel_rc(pp, PCIE_ATU_REGION_OUTBOUND | PCIE_ATU_REGION_INDEX0,
299 dw_pcie_writel_rc(pp, val, dbi_base + PCIE_ATU_VIEWPORT); 284 PCIE_ATU_VIEWPORT);
300 dw_pcie_writel_rc(pp, PCIE_ATU_TYPE_MEM, dbi_base + PCIE_ATU_CR1); 285 dw_pcie_writel_rc(pp, PCIE_ATU_TYPE_MEM, PCIE_ATU_CR1);
301 val = PCIE_ATU_ENABLE; 286 dw_pcie_writel_rc(pp, PCIE_ATU_ENABLE, PCIE_ATU_CR2);
302 dw_pcie_writel_rc(pp, val, dbi_base + PCIE_ATU_CR2); 287 dw_pcie_writel_rc(pp, pp->mem_base, PCIE_ATU_LOWER_BASE);
303 dw_pcie_writel_rc(pp, pp->mem_base, dbi_base + PCIE_ATU_LOWER_BASE); 288 dw_pcie_writel_rc(pp, (pp->mem_base >> 32), PCIE_ATU_UPPER_BASE);
304 dw_pcie_writel_rc(pp, (pp->mem_base >> 32),
305 dbi_base + PCIE_ATU_UPPER_BASE);
306 dw_pcie_writel_rc(pp, pp->mem_base + pp->config.mem_size - 1, 289 dw_pcie_writel_rc(pp, pp->mem_base + pp->config.mem_size - 1,
307 dbi_base + PCIE_ATU_LIMIT); 290 PCIE_ATU_LIMIT);
308 dw_pcie_writel_rc(pp, pp->config.mem_bus_addr, 291 dw_pcie_writel_rc(pp, pp->config.mem_bus_addr, PCIE_ATU_LOWER_TARGET);
309 dbi_base + PCIE_ATU_LOWER_TARGET);
310 dw_pcie_writel_rc(pp, upper_32_bits(pp->config.mem_bus_addr), 292 dw_pcie_writel_rc(pp, upper_32_bits(pp->config.mem_bus_addr),
311 dbi_base + PCIE_ATU_UPPER_TARGET); 293 PCIE_ATU_UPPER_TARGET);
312} 294}
313 295
314static void dw_pcie_prog_viewport_io_outbound(struct pcie_port *pp) 296static void dw_pcie_prog_viewport_io_outbound(struct pcie_port *pp)
315{ 297{
316 u32 val;
317 void __iomem *dbi_base = pp->dbi_base;
318
319 /* Program viewport 1 : OUTBOUND : IO */ 298 /* Program viewport 1 : OUTBOUND : IO */
320 val = PCIE_ATU_REGION_OUTBOUND | PCIE_ATU_REGION_INDEX1; 299 dw_pcie_writel_rc(pp, PCIE_ATU_REGION_OUTBOUND | PCIE_ATU_REGION_INDEX1,
321 dw_pcie_writel_rc(pp, val, dbi_base + PCIE_ATU_VIEWPORT); 300 PCIE_ATU_VIEWPORT);
322 dw_pcie_writel_rc(pp, PCIE_ATU_TYPE_IO, dbi_base + PCIE_ATU_CR1); 301 dw_pcie_writel_rc(pp, PCIE_ATU_TYPE_IO, PCIE_ATU_CR1);
323 val = PCIE_ATU_ENABLE; 302 dw_pcie_writel_rc(pp, PCIE_ATU_ENABLE, PCIE_ATU_CR2);
324 dw_pcie_writel_rc(pp, val, dbi_base + PCIE_ATU_CR2); 303 dw_pcie_writel_rc(pp, pp->io_base, PCIE_ATU_LOWER_BASE);
325 dw_pcie_writel_rc(pp, pp->io_base, dbi_base + PCIE_ATU_LOWER_BASE); 304 dw_pcie_writel_rc(pp, (pp->io_base >> 32), PCIE_ATU_UPPER_BASE);
326 dw_pcie_writel_rc(pp, (pp->io_base >> 32),
327 dbi_base + PCIE_ATU_UPPER_BASE);
328 dw_pcie_writel_rc(pp, pp->io_base + pp->config.io_size - 1, 305 dw_pcie_writel_rc(pp, pp->io_base + pp->config.io_size - 1,
329 dbi_base + PCIE_ATU_LIMIT); 306 PCIE_ATU_LIMIT);
330 dw_pcie_writel_rc(pp, pp->config.io_bus_addr, 307 dw_pcie_writel_rc(pp, pp->config.io_bus_addr, PCIE_ATU_LOWER_TARGET);
331 dbi_base + PCIE_ATU_LOWER_TARGET);
332 dw_pcie_writel_rc(pp, upper_32_bits(pp->config.io_bus_addr), 308 dw_pcie_writel_rc(pp, upper_32_bits(pp->config.io_bus_addr),
333 dbi_base + PCIE_ATU_UPPER_TARGET); 309 PCIE_ATU_UPPER_TARGET);
334} 310}
335 311
336static int dw_pcie_rd_other_conf(struct pcie_port *pp, struct pci_bus *bus, 312static int dw_pcie_rd_other_conf(struct pcie_port *pp, struct pci_bus *bus,
@@ -518,13 +494,12 @@ static struct hw_pci dw_pci = {
518void dw_pcie_setup_rc(struct pcie_port *pp) 494void dw_pcie_setup_rc(struct pcie_port *pp)
519{ 495{
520 struct pcie_port_info *config = &pp->config; 496 struct pcie_port_info *config = &pp->config;
521 void __iomem *dbi_base = pp->dbi_base;
522 u32 val; 497 u32 val;
523 u32 membase; 498 u32 membase;
524 u32 memlimit; 499 u32 memlimit;
525 500
526 /* set the number of lines as 4 */ 501 /* set the number of lines as 4 */
527 dw_pcie_readl_rc(pp, dbi_base + PCIE_PORT_LINK_CONTROL, &val); 502 dw_pcie_readl_rc(pp, PCIE_PORT_LINK_CONTROL, &val);
528 val &= ~PORT_LINK_MODE_MASK; 503 val &= ~PORT_LINK_MODE_MASK;
529 switch (pp->lanes) { 504 switch (pp->lanes) {
530 case 1: 505 case 1:
@@ -537,10 +512,10 @@ void dw_pcie_setup_rc(struct pcie_port *pp)
537 val |= PORT_LINK_MODE_4_LANES; 512 val |= PORT_LINK_MODE_4_LANES;
538 break; 513 break;
539 } 514 }
540 dw_pcie_writel_rc(pp, val, dbi_base + PCIE_PORT_LINK_CONTROL); 515 dw_pcie_writel_rc(pp, val, PCIE_PORT_LINK_CONTROL);
541 516
542 /* set link width speed control register */ 517 /* set link width speed control register */
543 dw_pcie_readl_rc(pp, dbi_base + PCIE_LINK_WIDTH_SPEED_CONTROL, &val); 518 dw_pcie_readl_rc(pp, PCIE_LINK_WIDTH_SPEED_CONTROL, &val);
544 val &= ~PORT_LOGIC_LINK_WIDTH_MASK; 519 val &= ~PORT_LOGIC_LINK_WIDTH_MASK;
545 switch (pp->lanes) { 520 switch (pp->lanes) {
546 case 1: 521 case 1:
@@ -553,36 +528,36 @@ void dw_pcie_setup_rc(struct pcie_port *pp)
553 val |= PORT_LOGIC_LINK_WIDTH_4_LANES; 528 val |= PORT_LOGIC_LINK_WIDTH_4_LANES;
554 break; 529 break;
555 } 530 }
556 dw_pcie_writel_rc(pp, val, dbi_base + PCIE_LINK_WIDTH_SPEED_CONTROL); 531 dw_pcie_writel_rc(pp, val, PCIE_LINK_WIDTH_SPEED_CONTROL);
557 532
558 /* setup RC BARs */ 533 /* setup RC BARs */
559 dw_pcie_writel_rc(pp, 0x00000004, dbi_base + PCI_BASE_ADDRESS_0); 534 dw_pcie_writel_rc(pp, 0x00000004, PCI_BASE_ADDRESS_0);
560 dw_pcie_writel_rc(pp, 0x00000004, dbi_base + PCI_BASE_ADDRESS_1); 535 dw_pcie_writel_rc(pp, 0x00000004, PCI_BASE_ADDRESS_1);
561 536
562 /* setup interrupt pins */ 537 /* setup interrupt pins */
563 dw_pcie_readl_rc(pp, dbi_base + PCI_INTERRUPT_LINE, &val); 538 dw_pcie_readl_rc(pp, PCI_INTERRUPT_LINE, &val);
564 val &= 0xffff00ff; 539 val &= 0xffff00ff;
565 val |= 0x00000100; 540 val |= 0x00000100;
566 dw_pcie_writel_rc(pp, val, dbi_base + PCI_INTERRUPT_LINE); 541 dw_pcie_writel_rc(pp, val, PCI_INTERRUPT_LINE);
567 542
568 /* setup bus numbers */ 543 /* setup bus numbers */
569 dw_pcie_readl_rc(pp, dbi_base + PCI_PRIMARY_BUS, &val); 544 dw_pcie_readl_rc(pp, PCI_PRIMARY_BUS, &val);
570 val &= 0xff000000; 545 val &= 0xff000000;
571 val |= 0x00010100; 546 val |= 0x00010100;
572 dw_pcie_writel_rc(pp, val, dbi_base + PCI_PRIMARY_BUS); 547 dw_pcie_writel_rc(pp, val, PCI_PRIMARY_BUS);
573 548
574 /* setup memory base, memory limit */ 549 /* setup memory base, memory limit */
575 membase = ((u32)pp->mem_base & 0xfff00000) >> 16; 550 membase = ((u32)pp->mem_base & 0xfff00000) >> 16;
576 memlimit = (config->mem_size + (u32)pp->mem_base) & 0xfff00000; 551 memlimit = (config->mem_size + (u32)pp->mem_base) & 0xfff00000;
577 val = memlimit | membase; 552 val = memlimit | membase;
578 dw_pcie_writel_rc(pp, val, dbi_base + PCI_MEMORY_BASE); 553 dw_pcie_writel_rc(pp, val, PCI_MEMORY_BASE);
579 554
580 /* setup command register */ 555 /* setup command register */
581 dw_pcie_readl_rc(pp, dbi_base + PCI_COMMAND, &val); 556 dw_pcie_readl_rc(pp, PCI_COMMAND, &val);
582 val &= 0xffff0000; 557 val &= 0xffff0000;
583 val |= PCI_COMMAND_IO | PCI_COMMAND_MEMORY | 558 val |= PCI_COMMAND_IO | PCI_COMMAND_MEMORY |
584 PCI_COMMAND_MASTER | PCI_COMMAND_SERR; 559 PCI_COMMAND_MASTER | PCI_COMMAND_SERR;
585 dw_pcie_writel_rc(pp, val, dbi_base + PCI_COMMAND); 560 dw_pcie_writel_rc(pp, val, PCI_COMMAND);
586} 561}
587 562
588MODULE_AUTHOR("Jingoo Han <jg1.han@samsung.com>"); 563MODULE_AUTHOR("Jingoo Han <jg1.han@samsung.com>");