mirror of
https://github.com/brain-hackers/u-boot-brain
synced 2024-09-27 23:20:26 +09:00
pci_ep: layerscape: Add the SRIOV VFs of PF support
Add the INBOUND configuration for VFs of PF. Signed-off-by: Xiaowei Bao <xiaowei.bao@nxp.com> Signed-off-by: Hou Zhiqiang <Zhiqiang.Hou@nxp.com> Reviewed-by: Priyanka Jain <priyanka.jain@nxp.com>
This commit is contained in:
parent
78c56b29fc
commit
83bf32e680
@ -95,7 +95,7 @@ int ls_pcie_link_up(struct ls_pcie *pcie)
|
||||
}
|
||||
|
||||
void ls_pcie_atu_outbound_set(struct ls_pcie *pcie, int idx, int type,
|
||||
u64 phys, u64 bus_addr, pci_size_t size)
|
||||
u64 phys, u64 bus_addr, u64 size)
|
||||
{
|
||||
dbi_writel(pcie, PCIE_ATU_REGION_OUTBOUND | idx, PCIE_ATU_VIEWPORT);
|
||||
dbi_writel(pcie, (u32)phys, PCIE_ATU_LOWER_BASE);
|
||||
@ -108,14 +108,16 @@ void ls_pcie_atu_outbound_set(struct ls_pcie *pcie, int idx, int type,
|
||||
}
|
||||
|
||||
/* Use bar match mode and MEM type as default */
|
||||
void ls_pcie_atu_inbound_set(struct ls_pcie *pcie, u32 pf, int type,
|
||||
int idx, int bar, u64 phys)
|
||||
void ls_pcie_atu_inbound_set(struct ls_pcie *pcie, u32 pf, u32 vf_flag,
|
||||
int type, int idx, int bar, u64 phys)
|
||||
{
|
||||
dbi_writel(pcie, PCIE_ATU_REGION_INBOUND | idx, PCIE_ATU_VIEWPORT);
|
||||
dbi_writel(pcie, (u32)phys, PCIE_ATU_LOWER_TARGET);
|
||||
dbi_writel(pcie, phys >> 32, PCIE_ATU_UPPER_TARGET);
|
||||
dbi_writel(pcie, type | PCIE_ATU_FUNC_NUM(pf), PCIE_ATU_CR1);
|
||||
dbi_writel(pcie, PCIE_ATU_ENABLE | PCIE_ATU_BAR_MODE_ENABLE |
|
||||
(vf_flag ? PCIE_ATU_FUNC_NUM_MATCH_EN : 0) |
|
||||
(vf_flag ? PCIE_ATU_VFBAR_MATCH_MODE_EN : 0) |
|
||||
PCIE_ATU_BAR_NUM(bar), PCIE_ATU_CR2);
|
||||
}
|
||||
|
||||
|
@ -20,7 +20,7 @@
|
||||
#endif
|
||||
|
||||
#ifndef CONFIG_SYS_PCI_MEMORY_SIZE
|
||||
#define CONFIG_SYS_PCI_MEMORY_SIZE (2 * 1024 * 1024 * 1024UL) /* 2G */
|
||||
#define CONFIG_SYS_PCI_MEMORY_SIZE SZ_4G
|
||||
#endif
|
||||
|
||||
#ifndef CONFIG_SYS_PCI_EP_MEMORY_BASE
|
||||
@ -40,6 +40,7 @@
|
||||
#define PCIE_ATU_REGION_INDEX2 (0x2 << 0)
|
||||
#define PCIE_ATU_REGION_INDEX3 (0x3 << 0)
|
||||
#define PCIE_ATU_REGION_NUM 6
|
||||
#define PCIE_ATU_REGION_NUM_SRIOV 24
|
||||
#define PCIE_ATU_CR1 0x904
|
||||
#define PCIE_ATU_TYPE_MEM (0x0 << 0)
|
||||
#define PCIE_ATU_TYPE_IO (0x2 << 0)
|
||||
@ -49,6 +50,8 @@
|
||||
#define PCIE_ATU_CR2 0x908
|
||||
#define PCIE_ATU_ENABLE (0x1 << 31)
|
||||
#define PCIE_ATU_BAR_MODE_ENABLE (0x1 << 30)
|
||||
#define PCIE_ATU_FUNC_NUM_MATCH_EN BIT(19)
|
||||
#define PCIE_ATU_VFBAR_MATCH_MODE_EN BIT(26)
|
||||
#define PCIE_ATU_BAR_NUM(bar) ((bar) << 8)
|
||||
#define PCIE_ATU_LOWER_BASE 0x90C
|
||||
#define PCIE_ATU_UPPER_BASE 0x910
|
||||
@ -88,7 +91,7 @@
|
||||
#define FSL_PCIE_EP_MIN_APERTURE 4096 /* 4 Kbytes */
|
||||
#define PCIE_PF_NUM 2
|
||||
#define PCIE_VF_NUM 64
|
||||
#define BAR_NUM 4
|
||||
#define BAR_NUM 8
|
||||
|
||||
#define PCIE_BAR0_SIZE SZ_4K
|
||||
#define PCIE_BAR1_SIZE SZ_8K
|
||||
@ -179,9 +182,9 @@ void dbi_writel(struct ls_pcie *pcie, unsigned int value, unsigned int offset);
|
||||
unsigned int ctrl_readl(struct ls_pcie *pcie, unsigned int offset);
|
||||
void ctrl_writel(struct ls_pcie *pcie, unsigned int value, unsigned int offset);
|
||||
void ls_pcie_atu_outbound_set(struct ls_pcie *pcie, int idx, int type,
|
||||
u64 phys, u64 bus_addr, pci_size_t size);
|
||||
void ls_pcie_atu_inbound_set(struct ls_pcie *pcie, u32 pf, int type,
|
||||
int idx, int bar, u64 phys);
|
||||
u64 phys, u64 bus_addr, u64 size);
|
||||
void ls_pcie_atu_inbound_set(struct ls_pcie *pcie, u32 pf, u32 vf_flag,
|
||||
int type, int idx, int bar, u64 phys);
|
||||
void ls_pcie_dump_atu(struct ls_pcie *pcie);
|
||||
int ls_pcie_link_up(struct ls_pcie *pcie);
|
||||
void ls_pcie_dbi_ro_wr_en(struct ls_pcie *pcie);
|
||||
|
@ -46,7 +46,7 @@ static int ls_ep_set_bar(struct udevice *dev, uint fn, struct pci_bar *ep_bar)
|
||||
else
|
||||
type = PCIE_ATU_TYPE_IO;
|
||||
|
||||
ls_pcie_atu_inbound_set(pcie, fn, type, idx, bar, bar_phys);
|
||||
ls_pcie_atu_inbound_set(pcie, fn, 0, type, idx, bar, bar_phys);
|
||||
|
||||
dbi_writel(pcie, lower_32_bits(size - 1), reg + PCIE_NO_SRIOV_BAR_BASE);
|
||||
dbi_writel(pcie, flags, reg);
|
||||
@ -67,27 +67,51 @@ static struct pci_ep_ops ls_pcie_ep_ops = {
|
||||
static void ls_pcie_ep_setup_atu(struct ls_pcie_ep *pcie_ep, u32 pf)
|
||||
{
|
||||
struct ls_pcie *pcie = pcie_ep->pcie;
|
||||
u32 vf_flag = 0;
|
||||
u64 phys = 0;
|
||||
|
||||
phys = CONFIG_SYS_PCI_EP_MEMORY_BASE + pf * SZ_64M;
|
||||
|
||||
phys = ALIGN(phys, PCIE_BAR0_SIZE);
|
||||
/* ATU 0 : INBOUND : map BAR0 */
|
||||
ls_pcie_atu_inbound_set(pcie, pf, PCIE_ATU_TYPE_MEM,
|
||||
ls_pcie_atu_inbound_set(pcie, pf, vf_flag, PCIE_ATU_TYPE_MEM,
|
||||
0 + pf * BAR_NUM, 0, phys);
|
||||
/* ATU 1 : INBOUND : map BAR1 */
|
||||
phys = ALIGN(phys + PCIE_BAR0_SIZE, PCIE_BAR1_SIZE);
|
||||
ls_pcie_atu_inbound_set(pcie, pf, PCIE_ATU_TYPE_MEM,
|
||||
ls_pcie_atu_inbound_set(pcie, pf, vf_flag, PCIE_ATU_TYPE_MEM,
|
||||
1 + pf * BAR_NUM, 1, phys);
|
||||
/* ATU 2 : INBOUND : map BAR2 */
|
||||
phys = ALIGN(phys + PCIE_BAR1_SIZE, PCIE_BAR2_SIZE);
|
||||
ls_pcie_atu_inbound_set(pcie, pf, PCIE_ATU_TYPE_MEM,
|
||||
ls_pcie_atu_inbound_set(pcie, pf, vf_flag, PCIE_ATU_TYPE_MEM,
|
||||
2 + pf * BAR_NUM, 2, phys);
|
||||
/* ATU 3 : INBOUND : map BAR2 */
|
||||
phys = ALIGN(phys + PCIE_BAR2_SIZE, PCIE_BAR4_SIZE);
|
||||
ls_pcie_atu_inbound_set(pcie, pf, PCIE_ATU_TYPE_MEM,
|
||||
ls_pcie_atu_inbound_set(pcie, pf, vf_flag, PCIE_ATU_TYPE_MEM,
|
||||
3 + pf * BAR_NUM, 4, phys);
|
||||
|
||||
if (pcie_ep->sriov_flag) {
|
||||
vf_flag = 1;
|
||||
/* ATU 4 : INBOUND : map BAR0 */
|
||||
phys = ALIGN(phys + PCIE_BAR4_SIZE, PCIE_BAR0_SIZE);
|
||||
ls_pcie_atu_inbound_set(pcie, pf, vf_flag, PCIE_ATU_TYPE_MEM,
|
||||
4 + pf * BAR_NUM, 0, phys);
|
||||
/* ATU 5 : INBOUND : map BAR1 */
|
||||
phys = ALIGN(phys + PCIE_BAR0_SIZE * PCIE_VF_NUM,
|
||||
PCIE_BAR1_SIZE);
|
||||
ls_pcie_atu_inbound_set(pcie, pf, vf_flag, PCIE_ATU_TYPE_MEM,
|
||||
5 + pf * BAR_NUM, 1, phys);
|
||||
/* ATU 6 : INBOUND : map BAR2 */
|
||||
phys = ALIGN(phys + PCIE_BAR1_SIZE * PCIE_VF_NUM,
|
||||
PCIE_BAR2_SIZE);
|
||||
ls_pcie_atu_inbound_set(pcie, pf, vf_flag, PCIE_ATU_TYPE_MEM,
|
||||
6 + pf * BAR_NUM, 2, phys);
|
||||
/* ATU 7 : INBOUND : map BAR4 */
|
||||
phys = ALIGN(phys + PCIE_BAR2_SIZE * PCIE_VF_NUM,
|
||||
PCIE_BAR4_SIZE);
|
||||
ls_pcie_atu_inbound_set(pcie, pf, vf_flag, PCIE_ATU_TYPE_MEM,
|
||||
7 + pf * BAR_NUM, 4, phys);
|
||||
}
|
||||
|
||||
/* ATU: OUTBOUND : map MEM */
|
||||
ls_pcie_atu_outbound_set(pcie, pf, PCIE_ATU_TYPE_MEM,
|
||||
(u64)pcie_ep->addr_res.start +
|
||||
|
Loading…
Reference in New Issue
Block a user