]> git.baikalelectronics.ru Git - kernel.git/commitdiff
PCI: designware-ep: Allow pci_epc_set_bar() update inbound map address
authorFrank Li <Frank.Li@nxp.com>
Tue, 22 Feb 2022 16:23:52 +0000 (10:23 -0600)
committerJon Mason <jdmason@kudzu.us>
Tue, 9 Aug 2022 21:53:58 +0000 (17:53 -0400)
ntb_mw_set_trans() will set memory map window after endpoint function
driver bind. The inbound map address need be updated dynamically when
using NTB by PCIe Root Port and PCIe Endpoint connection.

Checking if iatu already assigned to the BAR, if yes, using assigned iatu
number to update inbound address map and skip set BAR's register.

Signed-off-by: Frank Li <Frank.Li@nxp.com>
Signed-off-by: Jon Mason <jdmason@kudzu.us>
drivers/pci/controller/dwc/pcie-designware-ep.c

index 0eda8236c125a00cb157e275e2b6249852a2da60..b4cb65d851cd89f9ac0f43494b1a49239bf7d90a 100644 (file)
@@ -162,7 +162,11 @@ static int dw_pcie_ep_inbound_atu(struct dw_pcie_ep *ep, u8 func_no,
        u32 free_win;
        struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
 
-       free_win = find_first_zero_bit(ep->ib_window_map, pci->num_ib_windows);
+       if (!ep->bar_to_atu[bar])
+               free_win = find_first_zero_bit(ep->ib_window_map, pci->num_ib_windows);
+       else
+               free_win = ep->bar_to_atu[bar];
+
        if (free_win >= pci->num_ib_windows) {
                dev_err(pci->dev, "No free inbound window\n");
                return -EINVAL;
@@ -216,6 +220,7 @@ static void dw_pcie_ep_clear_bar(struct pci_epc *epc, u8 func_no, u8 vfunc_no,
        dw_pcie_disable_atu(pci, atu_index, DW_PCIE_REGION_INBOUND);
        clear_bit(atu_index, ep->ib_window_map);
        ep->epf_bar[bar] = NULL;
+       ep->bar_to_atu[bar] = 0;
 }
 
 static int dw_pcie_ep_set_bar(struct pci_epc *epc, u8 func_no, u8 vfunc_no,
@@ -245,6 +250,9 @@ static int dw_pcie_ep_set_bar(struct pci_epc *epc, u8 func_no, u8 vfunc_no,
        if (ret)
                return ret;
 
+       if (ep->epf_bar[bar])
+               return 0;
+
        dw_pcie_dbi_ro_wr_en(pci);
 
        dw_pcie_writel_dbi2(pci, reg, lower_32_bits(size - 1));