PCI: dwc: designware: Add new *ops* for CPU addr fixup
authorKishon Vijay Abraham I <kishon@ti.com>
Mon, 13 Mar 2017 13:43:22 +0000 (19:13 +0530)
committerBjorn Helgaas <bhelgaas@google.com>
Tue, 4 Apr 2017 13:30:10 +0000 (08:30 -0500)
Some platforms (like dra7xx) require only the least 28 bits of the
corresponding 32 bit CPU address to be programmed in the address
translation unit. This modified address is stored in io_base/mem_base/
cfg0_base/cfg1_base in dra7xx_pcie_host_init(). While this is okay for
host mode where the address range is fixed, device mode requires different
addresses to be programmed based on the host buffer address.  Add a new
ops to get the least 28 bits of the corresponding 32 bit CPU address and
invoke it before programming the address translation unit.

Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Acked-by: Joao Pinto <jpinto@synopsys.com>
drivers/pci/dwc/pcie-designware.c
drivers/pci/dwc/pcie-designware.h

index 7e1fb7d6643cfe4c01e294220e4f8284f1b356e2..3eaf3ccdc118e0183c3ec0c6205bd121662ade9e 100644 (file)
@@ -97,6 +97,9 @@ void dw_pcie_prog_outbound_atu(struct dw_pcie *pci, int index, int type,
 {
        u32 retries, val;
 
+       if (pci->ops->cpu_addr_fixup)
+               cpu_addr = pci->ops->cpu_addr_fixup(cpu_addr);
+
        if (pci->iatu_unroll_enabled) {
                dw_pcie_writel_unroll(pci, index, PCIE_ATU_UNR_LOWER_BASE,
                                      lower_32_bits(cpu_addr));
index cd3b8713fe5044a7d3e4366f201972759ce3fcab..8f3dcb2b099b03a26ae872f3a650e2bc1ecf1058 100644 (file)
@@ -143,6 +143,7 @@ struct pcie_port {
 };
 
 struct dw_pcie_ops {
+       u64     (*cpu_addr_fixup)(u64 cpu_addr);
        u32     (*readl_dbi)(struct dw_pcie *pcie, u32 reg);
        void    (*writel_dbi)(struct dw_pcie *pcie, u32 reg, u32 val);
        int     (*link_up)(struct dw_pcie *pcie);