Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Revert "PCI: designware: Program ATU with untranslated address"

Revert f4c55c5a3f7f ("PCI: designware: Program ATU with untranslated
address").

Note that dra7xx_pcie_host_init() now modifies pp->io_base, but we still
need the original value for dw_pcie_setup() in the path below, so this adds
a new io_base_tmp member. It will be removed later when dw_pcie_setup() is
removed.

dra7xx_add_pcie_port
dw_pcie_host_init
pp->io_base = range.cpu_addr
pp->io_base_tmp = range.cpu_addr # <-- added
pp->ops->host_init
dra7xx_pcie_host_init # ops->host_init
pp->io_base &= DRA7XX_CPU_TO_BUS_ADDR # <-- modified
pci_common_init_dev(..., &dw_pci)
pcibios_init_hw
hw->setup
dw_pcie_setup # hw_pci.setup
pci_ioremap_io(..., pp->io_base_tmp) # <-- original addr required

[bhelgaas: changelog]
Tested-by: James Morse <james.morse@arm.com>
Tested-by: Gabriel Fernandez <gabriel.fernandez@st.com>
Tested-by: Minghuan Lian <Minghuan.Lian@freescale.com>
Signed-off-by: Zhou Wang <wangzhou1@hisilicon.com>
Signed-off-by: Gabriele Paoloni <gabriele.paoloni@huawei.com>
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Acked-by: Pratyush Anand <pratyush.anand@gmail.com>

authored by

Zhou Wang and committed by
Bjorn Helgaas
9cdce1cd 883cc17c

+16 -38
+4 -4
drivers/pci/host/pci-dra7xx.c
··· 153 153 { 154 154 dw_pcie_setup_rc(pp); 155 155 156 - pp->io_mod_base &= DRA7XX_CPU_TO_BUS_ADDR; 157 - pp->mem_mod_base &= DRA7XX_CPU_TO_BUS_ADDR; 158 - pp->cfg0_mod_base &= DRA7XX_CPU_TO_BUS_ADDR; 159 - pp->cfg1_mod_base &= DRA7XX_CPU_TO_BUS_ADDR; 156 + pp->io_base &= DRA7XX_CPU_TO_BUS_ADDR; 157 + pp->mem_base &= DRA7XX_CPU_TO_BUS_ADDR; 158 + pp->cfg0_base &= DRA7XX_CPU_TO_BUS_ADDR; 159 + pp->cfg1_base &= DRA7XX_CPU_TO_BUS_ADDR; 160 160 161 161 dra7xx_pcie_establish_link(pp); 162 162 if (IS_ENABLED(CONFIG_PCI_MSI))
+11 -30
drivers/pci/host/pcie-designware.c
··· 417 417 struct of_pci_range range; 418 418 struct of_pci_range_parser parser; 419 419 struct resource *cfg_res; 420 - u32 val, ns; 421 - const __be32 *addrp; 422 - int i, index, ret; 423 - 424 - ns = of_n_size_cells(np); 420 + u32 val; 421 + int i, ret; 425 422 426 423 cfg_res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "config"); 427 424 if (cfg_res) { ··· 426 429 pp->cfg1_size = resource_size(cfg_res)/2; 427 430 pp->cfg0_base = cfg_res->start; 428 431 pp->cfg1_base = cfg_res->start + pp->cfg0_size; 429 - 430 - /* Find the untranslated configuration space address */ 431 - index = of_property_match_string(np, "reg-names", "config"); 432 - addrp = of_get_address(np, index, NULL, NULL); 433 - pp->cfg0_mod_base = of_read_number(addrp, ns); 434 - pp->cfg1_mod_base = pp->cfg0_mod_base + pp->cfg0_size; 435 432 } else if (!pp->va_cfg0_base) { 436 433 dev_err(pp->dev, "missing *config* reg space\n"); 437 434 } ··· 452 461 pp->io_size = resource_size(&pp->io); 453 462 pp->io_bus_addr = range.pci_addr; 454 463 pp->io_base = range.cpu_addr; 455 - 456 - /* Find the untranslated IO space address */ 457 - pp->io_mod_base = range.cpu_addr; 464 + pp->io_base_tmp = range.cpu_addr; 458 465 } 459 466 if (restype == IORESOURCE_MEM) { 460 467 of_pci_range_to_resource(&range, np, &pp->mem); 461 468 pp->mem.name = "MEM"; 462 469 pp->mem_size = resource_size(&pp->mem); 463 470 pp->mem_bus_addr = range.pci_addr; 464 - 465 - /* Find the untranslated MEM space address */ 466 - pp->mem_mod_base = range.cpu_addr; 467 471 } 468 472 if (restype == 0) { 469 473 of_pci_range_to_resource(&range, np, &pp->cfg); ··· 466 480 pp->cfg1_size = resource_size(&pp->cfg)/2; 467 481 pp->cfg0_base = pp->cfg.start; 468 482 pp->cfg1_base = pp->cfg.start + pp->cfg0_size; 469 - 470 - /* Find the untranslated configuration space address */ 471 - pp->cfg0_mod_base = range.cpu_addr; 472 - pp->cfg1_mod_base = pp->cfg0_mod_base + 473 - pp->cfg0_size; 474 483 } 475 484 } 476 485 ··· 536 555 537 556 if (!pp->ops->rd_other_conf) 538 557 dw_pcie_prog_outbound_atu(pp, PCIE_ATU_REGION_INDEX1, 539 - PCIE_ATU_TYPE_MEM, pp->mem_mod_base, 558 + PCIE_ATU_TYPE_MEM, pp->mem_base, 540 559 pp->mem_bus_addr, pp->mem_size); 541 560 542 561 dw_pcie_wr_own_conf(pp, PCI_BASE_ADDRESS_0, 4, 0); ··· 573 592 574 593 if (bus->parent->number == pp->root_bus_nr) { 575 594 type = PCIE_ATU_TYPE_CFG0; 576 - cpu_addr = pp->cfg0_mod_base; 595 + cpu_addr = pp->cfg0_base; 577 596 cfg_size = pp->cfg0_size; 578 597 va_cfg_base = pp->va_cfg0_base; 579 598 } else { 580 599 type = PCIE_ATU_TYPE_CFG1; 581 - cpu_addr = pp->cfg1_mod_base; 600 + cpu_addr = pp->cfg1_base; 582 601 cfg_size = pp->cfg1_size; 583 602 va_cfg_base = pp->va_cfg1_base; 584 603 } ··· 588 607 busdev, cfg_size); 589 608 ret = dw_pcie_cfg_read(va_cfg_base + where, size, val); 590 609 dw_pcie_prog_outbound_atu(pp, PCIE_ATU_REGION_INDEX0, 591 - PCIE_ATU_TYPE_IO, pp->io_mod_base, 610 + PCIE_ATU_TYPE_IO, pp->io_base, 592 611 pp->io_bus_addr, pp->io_size); 593 612 594 613 return ret; ··· 607 626 608 627 if (bus->parent->number == pp->root_bus_nr) { 609 628 type = PCIE_ATU_TYPE_CFG0; 610 - cpu_addr = pp->cfg0_mod_base; 629 + cpu_addr = pp->cfg0_base; 611 630 cfg_size = pp->cfg0_size; 612 631 va_cfg_base = pp->va_cfg0_base; 613 632 } else { 614 633 type = PCIE_ATU_TYPE_CFG1; 615 - cpu_addr = pp->cfg1_mod_base; 634 + cpu_addr = pp->cfg1_base; 616 635 cfg_size = pp->cfg1_size; 617 636 va_cfg_base = pp->va_cfg1_base; 618 637 } ··· 622 641 busdev, cfg_size); 623 642 ret = dw_pcie_cfg_write(va_cfg_base + where, size, val); 624 643 dw_pcie_prog_outbound_atu(pp, PCIE_ATU_REGION_INDEX0, 625 - PCIE_ATU_TYPE_IO, pp->io_mod_base, 644 + PCIE_ATU_TYPE_IO, pp->io_base, 626 645 pp->io_bus_addr, pp->io_size); 627 646 628 647 return ret; ··· 710 729 711 730 if (global_io_offset < SZ_1M && pp->io_size > 0) { 712 731 sys->io_offset = global_io_offset - pp->io_bus_addr; 713 - pci_ioremap_io(global_io_offset, pp->io_base); 732 + pci_ioremap_io(global_io_offset, pp->io_base_tmp); 714 733 global_io_offset += SZ_64K; 715 734 pci_add_resource_offset(&sys->resources, &pp->io, 716 735 sys->io_offset);
+1 -4
drivers/pci/host/pcie-designware.h
··· 27 27 u8 root_bus_nr; 28 28 void __iomem *dbi_base; 29 29 u64 cfg0_base; 30 - u64 cfg0_mod_base; 31 30 void __iomem *va_cfg0_base; 32 31 u32 cfg0_size; 33 32 u64 cfg1_base; 34 - u64 cfg1_mod_base; 35 33 void __iomem *va_cfg1_base; 36 34 u32 cfg1_size; 37 35 u64 io_base; 38 - u64 io_mod_base; 36 + u64 io_base_tmp; 39 37 phys_addr_t io_bus_addr; 40 38 u32 io_size; 41 39 u64 mem_base; 42 - u64 mem_mod_base; 43 40 phys_addr_t mem_bus_addr; 44 41 u32 mem_size; 45 42 struct resource cfg;