aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/pci/host/pcie-designware.c55
-rw-r--r--drivers/pci/host/pcie-designware.h4
2 files changed, 45 insertions, 14 deletions
diff --git a/drivers/pci/host/pcie-designware.c b/drivers/pci/host/pcie-designware.c
index 0b7b4558bcfd..8aab1d696cb0 100644
--- a/drivers/pci/host/pcie-designware.c
+++ b/drivers/pci/host/pcie-designware.c
@@ -401,8 +401,15 @@ int __init dw_pcie_host_init(struct pcie_port *pp)
401 struct of_pci_range range; 401 struct of_pci_range range;
402 struct of_pci_range_parser parser; 402 struct of_pci_range_parser parser;
403 struct resource *cfg_res; 403 struct resource *cfg_res;
404 u32 val; 404 u32 val, na, ns;
405 int i; 405 const __be32 *addrp;
406 int i, index;
407
408 /* Find the address cell size and the number of cells in order to get
409 * the untranslated address.
410 */
411 of_property_read_u32(np, "#address-cells", &na);
412 ns = of_n_size_cells(np);
406 413
407 cfg_res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "config"); 414 cfg_res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "config");
408 if (cfg_res) { 415 if (cfg_res) {
@@ -410,6 +417,12 @@ int __init dw_pcie_host_init(struct pcie_port *pp)
410 pp->config.cfg1_size = resource_size(cfg_res)/2; 417 pp->config.cfg1_size = resource_size(cfg_res)/2;
411 pp->cfg0_base = cfg_res->start; 418 pp->cfg0_base = cfg_res->start;
412 pp->cfg1_base = cfg_res->start + pp->config.cfg0_size; 419 pp->cfg1_base = cfg_res->start + pp->config.cfg0_size;
420
421 /* Find the untranslated configuration space address */
422 index = of_property_match_string(np, "reg-names", "config");
423 addrp = of_get_address(np, index, false, false);
424 pp->cfg0_mod_base = of_read_number(addrp, ns);
425 pp->cfg1_mod_base = pp->cfg0_mod_base + pp->config.cfg0_size;
413 } else { 426 } else {
414 dev_err(pp->dev, "missing *config* reg space\n"); 427 dev_err(pp->dev, "missing *config* reg space\n");
415 } 428 }
@@ -435,12 +448,20 @@ int __init dw_pcie_host_init(struct pcie_port *pp)
435 pp->config.io_size = resource_size(&pp->io); 448 pp->config.io_size = resource_size(&pp->io);
436 pp->config.io_bus_addr = range.pci_addr; 449 pp->config.io_bus_addr = range.pci_addr;
437 pp->io_base = range.cpu_addr; 450 pp->io_base = range.cpu_addr;
451
452 /* Find the untranslated IO space address */
453 pp->io_mod_base = of_read_number(parser.range -
454 parser.np + na, ns);
438 } 455 }
439 if (restype == IORESOURCE_MEM) { 456 if (restype == IORESOURCE_MEM) {
440 of_pci_range_to_resource(&range, np, &pp->mem); 457 of_pci_range_to_resource(&range, np, &pp->mem);
441 pp->mem.name = "MEM"; 458 pp->mem.name = "MEM";
442 pp->config.mem_size = resource_size(&pp->mem); 459 pp->config.mem_size = resource_size(&pp->mem);
443 pp->config.mem_bus_addr = range.pci_addr; 460 pp->config.mem_bus_addr = range.pci_addr;
461
462 /* Find the untranslated MEM space address */
463 pp->mem_mod_base = of_read_number(parser.range -
464 parser.np + na, ns);
444 } 465 }
445 if (restype == 0) { 466 if (restype == 0) {
446 of_pci_range_to_resource(&range, np, &pp->cfg); 467 of_pci_range_to_resource(&range, np, &pp->cfg);
@@ -448,6 +469,12 @@ int __init dw_pcie_host_init(struct pcie_port *pp)
448 pp->config.cfg1_size = resource_size(&pp->cfg)/2; 469 pp->config.cfg1_size = resource_size(&pp->cfg)/2;
449 pp->cfg0_base = pp->cfg.start; 470 pp->cfg0_base = pp->cfg.start;
450 pp->cfg1_base = pp->cfg.start + pp->config.cfg0_size; 471 pp->cfg1_base = pp->cfg.start + pp->config.cfg0_size;
472
473 /* Find the untranslated configuration space address */
474 pp->cfg0_mod_base = of_read_number(parser.range -
475 parser.np + na, ns);
476 pp->cfg1_mod_base = pp->cfg0_mod_base +
477 pp->config.cfg0_size;
451 } 478 }
452 } 479 }
453 480
@@ -522,9 +549,9 @@ static void dw_pcie_prog_viewport_cfg0(struct pcie_port *pp, u32 busdev)
522 /* Program viewport 0 : OUTBOUND : CFG0 */ 549 /* Program viewport 0 : OUTBOUND : CFG0 */
523 dw_pcie_writel_rc(pp, PCIE_ATU_REGION_OUTBOUND | PCIE_ATU_REGION_INDEX0, 550 dw_pcie_writel_rc(pp, PCIE_ATU_REGION_OUTBOUND | PCIE_ATU_REGION_INDEX0,
524 PCIE_ATU_VIEWPORT); 551 PCIE_ATU_VIEWPORT);
525 dw_pcie_writel_rc(pp, pp->cfg0_base, PCIE_ATU_LOWER_BASE); 552 dw_pcie_writel_rc(pp, pp->cfg0_mod_base, PCIE_ATU_LOWER_BASE);
526 dw_pcie_writel_rc(pp, (pp->cfg0_base >> 32), PCIE_ATU_UPPER_BASE); 553 dw_pcie_writel_rc(pp, (pp->cfg0_mod_base >> 32), PCIE_ATU_UPPER_BASE);
527 dw_pcie_writel_rc(pp, pp->cfg0_base + pp->config.cfg0_size - 1, 554 dw_pcie_writel_rc(pp, pp->cfg0_mod_base + pp->config.cfg0_size - 1,
528 PCIE_ATU_LIMIT); 555 PCIE_ATU_LIMIT);
529 dw_pcie_writel_rc(pp, busdev, PCIE_ATU_LOWER_TARGET); 556 dw_pcie_writel_rc(pp, busdev, PCIE_ATU_LOWER_TARGET);
530 dw_pcie_writel_rc(pp, 0, PCIE_ATU_UPPER_TARGET); 557 dw_pcie_writel_rc(pp, 0, PCIE_ATU_UPPER_TARGET);
@@ -538,9 +565,9 @@ static void dw_pcie_prog_viewport_cfg1(struct pcie_port *pp, u32 busdev)
538 dw_pcie_writel_rc(pp, PCIE_ATU_REGION_OUTBOUND | PCIE_ATU_REGION_INDEX1, 565 dw_pcie_writel_rc(pp, PCIE_ATU_REGION_OUTBOUND | PCIE_ATU_REGION_INDEX1,
539 PCIE_ATU_VIEWPORT); 566 PCIE_ATU_VIEWPORT);
540 dw_pcie_writel_rc(pp, PCIE_ATU_TYPE_CFG1, PCIE_ATU_CR1); 567 dw_pcie_writel_rc(pp, PCIE_ATU_TYPE_CFG1, PCIE_ATU_CR1);
541 dw_pcie_writel_rc(pp, pp->cfg1_base, PCIE_ATU_LOWER_BASE); 568 dw_pcie_writel_rc(pp, pp->cfg1_mod_base, PCIE_ATU_LOWER_BASE);
542 dw_pcie_writel_rc(pp, (pp->cfg1_base >> 32), PCIE_ATU_UPPER_BASE); 569 dw_pcie_writel_rc(pp, (pp->cfg1_mod_base >> 32), PCIE_ATU_UPPER_BASE);
543 dw_pcie_writel_rc(pp, pp->cfg1_base + pp->config.cfg1_size - 1, 570 dw_pcie_writel_rc(pp, pp->cfg1_mod_base + pp->config.cfg1_size - 1,
544 PCIE_ATU_LIMIT); 571 PCIE_ATU_LIMIT);
545 dw_pcie_writel_rc(pp, busdev, PCIE_ATU_LOWER_TARGET); 572 dw_pcie_writel_rc(pp, busdev, PCIE_ATU_LOWER_TARGET);
546 dw_pcie_writel_rc(pp, 0, PCIE_ATU_UPPER_TARGET); 573 dw_pcie_writel_rc(pp, 0, PCIE_ATU_UPPER_TARGET);
@@ -553,9 +580,9 @@ static void dw_pcie_prog_viewport_mem_outbound(struct pcie_port *pp)
553 dw_pcie_writel_rc(pp, PCIE_ATU_REGION_OUTBOUND | PCIE_ATU_REGION_INDEX0, 580 dw_pcie_writel_rc(pp, PCIE_ATU_REGION_OUTBOUND | PCIE_ATU_REGION_INDEX0,
554 PCIE_ATU_VIEWPORT); 581 PCIE_ATU_VIEWPORT);
555 dw_pcie_writel_rc(pp, PCIE_ATU_TYPE_MEM, PCIE_ATU_CR1); 582 dw_pcie_writel_rc(pp, PCIE_ATU_TYPE_MEM, PCIE_ATU_CR1);
556 dw_pcie_writel_rc(pp, pp->mem_base, PCIE_ATU_LOWER_BASE); 583 dw_pcie_writel_rc(pp, pp->mem_mod_base, PCIE_ATU_LOWER_BASE);
557 dw_pcie_writel_rc(pp, (pp->mem_base >> 32), PCIE_ATU_UPPER_BASE); 584 dw_pcie_writel_rc(pp, (pp->mem_mod_base >> 32), PCIE_ATU_UPPER_BASE);
558 dw_pcie_writel_rc(pp, pp->mem_base + pp->config.mem_size - 1, 585 dw_pcie_writel_rc(pp, pp->mem_mod_base + pp->config.mem_size - 1,
559 PCIE_ATU_LIMIT); 586 PCIE_ATU_LIMIT);
560 dw_pcie_writel_rc(pp, pp->config.mem_bus_addr, PCIE_ATU_LOWER_TARGET); 587 dw_pcie_writel_rc(pp, pp->config.mem_bus_addr, PCIE_ATU_LOWER_TARGET);
561 dw_pcie_writel_rc(pp, upper_32_bits(pp->config.mem_bus_addr), 588 dw_pcie_writel_rc(pp, upper_32_bits(pp->config.mem_bus_addr),
@@ -569,9 +596,9 @@ static void dw_pcie_prog_viewport_io_outbound(struct pcie_port *pp)
569 dw_pcie_writel_rc(pp, PCIE_ATU_REGION_OUTBOUND | PCIE_ATU_REGION_INDEX1, 596 dw_pcie_writel_rc(pp, PCIE_ATU_REGION_OUTBOUND | PCIE_ATU_REGION_INDEX1,
570 PCIE_ATU_VIEWPORT); 597 PCIE_ATU_VIEWPORT);
571 dw_pcie_writel_rc(pp, PCIE_ATU_TYPE_IO, PCIE_ATU_CR1); 598 dw_pcie_writel_rc(pp, PCIE_ATU_TYPE_IO, PCIE_ATU_CR1);
572 dw_pcie_writel_rc(pp, pp->io_base, PCIE_ATU_LOWER_BASE); 599 dw_pcie_writel_rc(pp, pp->io_mod_base, PCIE_ATU_LOWER_BASE);
573 dw_pcie_writel_rc(pp, (pp->io_base >> 32), PCIE_ATU_UPPER_BASE); 600 dw_pcie_writel_rc(pp, (pp->io_mod_base >> 32), PCIE_ATU_UPPER_BASE);
574 dw_pcie_writel_rc(pp, pp->io_base + pp->config.io_size - 1, 601 dw_pcie_writel_rc(pp, pp->io_mod_base + pp->config.io_size - 1,
575 PCIE_ATU_LIMIT); 602 PCIE_ATU_LIMIT);
576 dw_pcie_writel_rc(pp, pp->config.io_bus_addr, PCIE_ATU_LOWER_TARGET); 603 dw_pcie_writel_rc(pp, pp->config.io_bus_addr, PCIE_ATU_LOWER_TARGET);
577 dw_pcie_writel_rc(pp, upper_32_bits(pp->config.io_bus_addr), 604 dw_pcie_writel_rc(pp, upper_32_bits(pp->config.io_bus_addr),
diff --git a/drivers/pci/host/pcie-designware.h b/drivers/pci/host/pcie-designware.h
index 77f592faa7bf..add652717a60 100644
--- a/drivers/pci/host/pcie-designware.h
+++ b/drivers/pci/host/pcie-designware.h
@@ -36,11 +36,15 @@ struct pcie_port {
36 u8 root_bus_nr; 36 u8 root_bus_nr;
37 void __iomem *dbi_base; 37 void __iomem *dbi_base;
38 u64 cfg0_base; 38 u64 cfg0_base;
39 u64 cfg0_mod_base;
39 void __iomem *va_cfg0_base; 40 void __iomem *va_cfg0_base;
40 u64 cfg1_base; 41 u64 cfg1_base;
42 u64 cfg1_mod_base;
41 void __iomem *va_cfg1_base; 43 void __iomem *va_cfg1_base;
42 u64 io_base; 44 u64 io_base;
45 u64 io_mod_base;
43 u64 mem_base; 46 u64 mem_base;
47 u64 mem_mod_base;
44 struct resource cfg; 48 struct resource cfg;
45 struct resource io; 49 struct resource io;
46 struct resource mem; 50 struct resource mem;