• Serge Semin's avatar
    PCI: dwc: Simplify in/outbound iATU setup methods · 5a163f59
    Serge Semin authored
    Previously __dw_pcie_prog_outbound_atu() duplicated a lot of code between
    the iatu_unroll_enabled version and the PCIE_ATU_VIEWPORT version:
    
      __dw_pcie_prog_outbound_atu
        if (iatu_unroll_enabled)
          dw_pcie_prog_outbound_atu_unroll
            dw_pcie_writel_ob_unroll(PCIE_ATU_UNR_LOWER_BASE, ...)
            dw_pcie_writel_ob_unroll(PCIE_ATU_UNR_UPPER_BASE, ...)
            ...
          return
        dw_pcie_writel_dbi(PCIE_ATU_VIEWPORT, ...)
        dw_pcie_writel_dbi(PCIE_ATU_LOWER_BASE, ...)
        dw_pcie_writel_dbi(PCIE_ATU_UPPER_BASE, ...)
        ...
    
    Unify those by pushing the unroll address computation and viewport
    selection down into dw_pcie_writel_atu() so we can use the same
    dw_pcie_writel_atu_ob() accessor for both paths:
    
      __dw_pcie_prog_outbound_atu
        dw_pcie_writel_atu_ob(PCIE_ATU_LOWER_BASE, ...)
          dw_pcie_writel_atu
            dw_pcie_select_atu                      # new
              if (iatu_unroll_enabled)
                return pci->atu_base + PCIE_ATU_UNROLL_BASE(...)
              dw_pcie_writel_dbi(PCIE_ATU_VIEWPORT, ...)
              return pci->atu_base
            dw_pcie_write(base + reg)
          dw_pcie_writel_atu_ob(PCIE_ATU_UPPER_BASE, ...)
          ...
    
    In the non-unroll case, this does involve more MMIO writes to
    PCIE_ATU_VIEWPORT, but it's mainly in initialization paths and the code
    simplification is significant.
    
    [bhelgaas: commit log, simplify dw_pcie_select_atu()]
    Link: https://lore.kernel.org/r/20220624143947.8991-12-Sergey.Semin@baikalelectronics.ruSigned-off-by: default avatarSerge Semin <Sergey.Semin@baikalelectronics.ru>
    Signed-off-by: default avatarBjorn Helgaas <bhelgaas@google.com>
    5a163f59
pcie-designware.c 17.4 KB