PCI: designware-ep: Allow pci_epc_set_bar() update inbound map address
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>
This commit is contained in:
parent
a914fc529f
commit
4284c88fff
@ -162,7 +162,11 @@ static int dw_pcie_ep_inbound_atu(struct dw_pcie_ep *ep, u8 func_no,
|
|||||||
u32 free_win;
|
u32 free_win;
|
||||||
struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
|
struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
|
||||||
|
|
||||||
|
if (!ep->bar_to_atu[bar])
|
||||||
free_win = find_first_zero_bit(ep->ib_window_map, pci->num_ib_windows);
|
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) {
|
if (free_win >= pci->num_ib_windows) {
|
||||||
dev_err(pci->dev, "No free inbound window\n");
|
dev_err(pci->dev, "No free inbound window\n");
|
||||||
return -EINVAL;
|
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);
|
dw_pcie_disable_atu(pci, atu_index, DW_PCIE_REGION_INBOUND);
|
||||||
clear_bit(atu_index, ep->ib_window_map);
|
clear_bit(atu_index, ep->ib_window_map);
|
||||||
ep->epf_bar[bar] = NULL;
|
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,
|
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)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
if (ep->epf_bar[bar])
|
||||||
|
return 0;
|
||||||
|
|
||||||
dw_pcie_dbi_ro_wr_en(pci);
|
dw_pcie_dbi_ro_wr_en(pci);
|
||||||
|
|
||||||
dw_pcie_writel_dbi2(pci, reg, lower_32_bits(size - 1));
|
dw_pcie_writel_dbi2(pci, reg, lower_32_bits(size - 1));
|
||||||
|
Loading…
Reference in New Issue
Block a user