return 0;
 }
 
-static int dw_pcie_ep_outbound_atu(struct dw_pcie_ep *ep, u8 func_no,
-                                  phys_addr_t phys_addr,
-                                  u64 pci_addr, size_t size)
+static int dw_pcie_ep_outbound_atu(struct dw_pcie_ep *ep,
+                                  struct dw_pcie_ob_atu_cfg *atu)
 {
        struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
        u32 free_win;
                return -EINVAL;
        }
 
-       ret = dw_pcie_prog_ep_outbound_atu(pci, func_no, free_win, PCIE_ATU_TYPE_MEM,
-                                          phys_addr, pci_addr, size);
+       atu->index = free_win;
+       ret = dw_pcie_prog_outbound_atu(pci, atu);
        if (ret)
                return ret;
 
        set_bit(free_win, ep->ob_window_map);
-       ep->outbound_addr[free_win] = phys_addr;
+       ep->outbound_addr[free_win] = atu->cpu_addr;
 
        return 0;
 }
        int ret;
        struct dw_pcie_ep *ep = epc_get_drvdata(epc);
        struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
-
-       ret = dw_pcie_ep_outbound_atu(ep, func_no, addr, pci_addr, size);
+       struct dw_pcie_ob_atu_cfg atu = { 0 };
+
+       atu.func_no = func_no;
+       atu.type = PCIE_ATU_TYPE_MEM;
+       atu.cpu_addr = addr;
+       atu.pci_addr = pci_addr;
+       atu.size = size;
+       ret = dw_pcie_ep_outbound_atu(ep, &atu);
        if (ret) {
                dev_err(pci->dev, "Failed to enable address\n");
                return ret;
 
 {
        struct dw_pcie_rp *pp = bus->sysdata;
        struct dw_pcie *pci = to_dw_pcie_from_pp(pp);
+       struct dw_pcie_ob_atu_cfg atu = { 0 };
        int type, ret;
        u32 busdev;
 
        else
                type = PCIE_ATU_TYPE_CFG1;
 
-       ret = dw_pcie_prog_outbound_atu(pci, 0, type, pp->cfg0_base, busdev,
-                                       pp->cfg0_size);
+       atu.type = type;
+       atu.cpu_addr = pp->cfg0_base;
+       atu.pci_addr = busdev;
+       atu.size = pp->cfg0_size;
+
+       ret = dw_pcie_prog_outbound_atu(pci, &atu);
        if (ret)
                return NULL;
 
 {
        struct dw_pcie_rp *pp = bus->sysdata;
        struct dw_pcie *pci = to_dw_pcie_from_pp(pp);
+       struct dw_pcie_ob_atu_cfg atu = { 0 };
        int ret;
 
        ret = pci_generic_config_read(bus, devfn, where, size, val);
                return ret;
 
        if (pp->cfg0_io_shared) {
-               ret = dw_pcie_prog_outbound_atu(pci, 0, PCIE_ATU_TYPE_IO,
-                                               pp->io_base, pp->io_bus_addr,
-                                               pp->io_size);
+               atu.type = PCIE_ATU_TYPE_IO;
+               atu.cpu_addr = pp->io_base;
+               atu.pci_addr = pp->io_bus_addr;
+               atu.size = pp->io_size;
+
+               ret = dw_pcie_prog_outbound_atu(pci, &atu);
                if (ret)
                        return PCIBIOS_SET_FAILED;
        }
 {
        struct dw_pcie_rp *pp = bus->sysdata;
        struct dw_pcie *pci = to_dw_pcie_from_pp(pp);
+       struct dw_pcie_ob_atu_cfg atu = { 0 };
        int ret;
 
        ret = pci_generic_config_write(bus, devfn, where, size, val);
                return ret;
 
        if (pp->cfg0_io_shared) {
-               ret = dw_pcie_prog_outbound_atu(pci, 0, PCIE_ATU_TYPE_IO,
-                                               pp->io_base, pp->io_bus_addr,
-                                               pp->io_size);
+               atu.type = PCIE_ATU_TYPE_IO;
+               atu.cpu_addr = pp->io_base;
+               atu.pci_addr = pp->io_bus_addr;
+               atu.size = pp->io_size;
+
+               ret = dw_pcie_prog_outbound_atu(pci, &atu);
                if (ret)
                        return PCIBIOS_SET_FAILED;
        }
 static int dw_pcie_iatu_setup(struct dw_pcie_rp *pp)
 {
        struct dw_pcie *pci = to_dw_pcie_from_pp(pp);
+       struct dw_pcie_ob_atu_cfg atu = { 0 };
        struct resource_entry *entry;
        int i, ret;
 
                if (pci->num_ob_windows <= ++i)
                        break;
 
-               ret = dw_pcie_prog_outbound_atu(pci, i, PCIE_ATU_TYPE_MEM,
-                                               entry->res->start,
-                                               entry->res->start - entry->offset,
-                                               resource_size(entry->res));
+               atu.index = i;
+               atu.type = PCIE_ATU_TYPE_MEM;
+               atu.cpu_addr = entry->res->start;
+               atu.pci_addr = entry->res->start - entry->offset;
+               atu.size = resource_size(entry->res);
+
+               ret = dw_pcie_prog_outbound_atu(pci, &atu);
                if (ret) {
                        dev_err(pci->dev, "Failed to set MEM range %pr\n",
                                entry->res);
 
        if (pp->io_size) {
                if (pci->num_ob_windows > ++i) {
-                       ret = dw_pcie_prog_outbound_atu(pci, i, PCIE_ATU_TYPE_IO,
-                                                       pp->io_base,
-                                                       pp->io_bus_addr,
-                                                       pp->io_size);
+                       atu.index = i;
+                       atu.type = PCIE_ATU_TYPE_IO;
+                       atu.cpu_addr = pp->io_base;
+                       atu.pci_addr = pp->io_bus_addr;
+                       atu.size = pp->io_size;
+
+                       ret = dw_pcie_prog_outbound_atu(pci, &atu);
                        if (ret) {
                                dev_err(pci->dev, "Failed to set IO range %pr\n",
                                        entry->res);
 
        return val | PCIE_ATU_TD;
 }
 
-static int __dw_pcie_prog_outbound_atu(struct dw_pcie *pci, u8 func_no,
-                                      int index, int type, u64 cpu_addr,
-                                      u64 pci_addr, u64 size)
+int dw_pcie_prog_outbound_atu(struct dw_pcie *pci,
+                             const struct dw_pcie_ob_atu_cfg *atu)
 {
+       u64 cpu_addr = atu->cpu_addr;
        u32 retries, val;
        u64 limit_addr;
 
        if (pci->ops && pci->ops->cpu_addr_fixup)
                cpu_addr = pci->ops->cpu_addr_fixup(pci, cpu_addr);
 
-       limit_addr = cpu_addr + size - 1;
+       limit_addr = cpu_addr + atu->size - 1;
 
        if ((limit_addr & ~pci->region_limit) != (cpu_addr & ~pci->region_limit) ||
            !IS_ALIGNED(cpu_addr, pci->region_align) ||
-           !IS_ALIGNED(pci_addr, pci->region_align) || !size) {
+           !IS_ALIGNED(atu->pci_addr, pci->region_align) || !atu->size) {
                return -EINVAL;
        }
 
-       dw_pcie_writel_atu_ob(pci, index, PCIE_ATU_LOWER_BASE,
+       dw_pcie_writel_atu_ob(pci, atu->index, PCIE_ATU_LOWER_BASE,
                              lower_32_bits(cpu_addr));
-       dw_pcie_writel_atu_ob(pci, index, PCIE_ATU_UPPER_BASE,
+       dw_pcie_writel_atu_ob(pci, atu->index, PCIE_ATU_UPPER_BASE,
                              upper_32_bits(cpu_addr));
 
-       dw_pcie_writel_atu_ob(pci, index, PCIE_ATU_LIMIT,
+       dw_pcie_writel_atu_ob(pci, atu->index, PCIE_ATU_LIMIT,
                              lower_32_bits(limit_addr));
        if (dw_pcie_ver_is_ge(pci, 460A))
-               dw_pcie_writel_atu_ob(pci, index, PCIE_ATU_UPPER_LIMIT,
+               dw_pcie_writel_atu_ob(pci, atu->index, PCIE_ATU_UPPER_LIMIT,
                                      upper_32_bits(limit_addr));
 
-       dw_pcie_writel_atu_ob(pci, index, PCIE_ATU_LOWER_TARGET,
-                             lower_32_bits(pci_addr));
-       dw_pcie_writel_atu_ob(pci, index, PCIE_ATU_UPPER_TARGET,
-                             upper_32_bits(pci_addr));
+       dw_pcie_writel_atu_ob(pci, atu->index, PCIE_ATU_LOWER_TARGET,
+                             lower_32_bits(atu->pci_addr));
+       dw_pcie_writel_atu_ob(pci, atu->index, PCIE_ATU_UPPER_TARGET,
+                             upper_32_bits(atu->pci_addr));
 
-       val = type | PCIE_ATU_FUNC_NUM(func_no);
+       val = atu->type | PCIE_ATU_FUNC_NUM(atu->func_no);
        if (upper_32_bits(limit_addr) > upper_32_bits(cpu_addr) &&
            dw_pcie_ver_is_ge(pci, 460A))
                val |= PCIE_ATU_INCREASE_REGION_SIZE;
        if (dw_pcie_ver_is(pci, 490A))
                val = dw_pcie_enable_ecrc(val);
-       dw_pcie_writel_atu_ob(pci, index, PCIE_ATU_REGION_CTRL1, val);
+       dw_pcie_writel_atu_ob(pci, atu->index, PCIE_ATU_REGION_CTRL1, val);
 
-       dw_pcie_writel_atu_ob(pci, index, PCIE_ATU_REGION_CTRL2, PCIE_ATU_ENABLE);
+       dw_pcie_writel_atu_ob(pci, atu->index, PCIE_ATU_REGION_CTRL2, PCIE_ATU_ENABLE);
 
        /*
         * Make sure ATU enable takes effect before any subsequent config
         * and I/O accesses.
         */
        for (retries = 0; retries < LINK_WAIT_MAX_IATU_RETRIES; retries++) {
-               val = dw_pcie_readl_atu_ob(pci, index, PCIE_ATU_REGION_CTRL2);
+               val = dw_pcie_readl_atu_ob(pci, atu->index, PCIE_ATU_REGION_CTRL2);
                if (val & PCIE_ATU_ENABLE)
                        return 0;
 
        return -ETIMEDOUT;
 }
 
-int dw_pcie_prog_outbound_atu(struct dw_pcie *pci, int index, int type,
-                             u64 cpu_addr, u64 pci_addr, u64 size)
-{
-       return __dw_pcie_prog_outbound_atu(pci, 0, index, type,
-                                          cpu_addr, pci_addr, size);
-}
-
-int dw_pcie_prog_ep_outbound_atu(struct dw_pcie *pci, u8 func_no, int index,
-                                int type, u64 cpu_addr, u64 pci_addr,
-                                u64 size)
-{
-       return __dw_pcie_prog_outbound_atu(pci, func_no, index, type,
-                                          cpu_addr, pci_addr, size);
-}
-
 static inline u32 dw_pcie_readl_atu_ib(struct dw_pcie *pci, u32 index, u32 reg)
 {
        return dw_pcie_readl_atu(pci, PCIE_ATU_REGION_DIR_IB, index, reg);
 
        DW_PCIE_LTSSM_UNKNOWN = 0xFFFFFFFF,
 };
 
+struct dw_pcie_ob_atu_cfg {
+       int index;
+       int type;
+       u8 func_no;
+       u64 cpu_addr;
+       u64 pci_addr;
+       u64 size;
+};
+
 struct dw_pcie_host_ops {
        int (*init)(struct dw_pcie_rp *pp);
        void (*deinit)(struct dw_pcie_rp *pp);
 int dw_pcie_link_up(struct dw_pcie *pci);
 void dw_pcie_upconfig_setup(struct dw_pcie *pci);
 int dw_pcie_wait_for_link(struct dw_pcie *pci);
-int dw_pcie_prog_outbound_atu(struct dw_pcie *pci, int index, int type,
-                             u64 cpu_addr, u64 pci_addr, u64 size);
-int dw_pcie_prog_ep_outbound_atu(struct dw_pcie *pci, u8 func_no, int index,
-                                int type, u64 cpu_addr, u64 pci_addr, u64 size);
+int dw_pcie_prog_outbound_atu(struct dw_pcie *pci,
+                             const struct dw_pcie_ob_atu_cfg *atu);
 int dw_pcie_prog_inbound_atu(struct dw_pcie *pci, int index, int type,
                             u64 cpu_addr, u64 pci_addr, u64 size);
 int dw_pcie_prog_ep_inbound_atu(struct dw_pcie *pci, u8 func_no, int index,