From: John Jacques <john.jacq...@intel.com> Signed-off-by: John Jacques <john.jacq...@intel.com> --- arch/arm64/boot/dts/intel/axm5616-victoria.dts | 5 ++++ drivers/pci/host/pcie-axxia.c | 36 +++++++++++++++++--------- 2 files changed, 29 insertions(+), 12 deletions(-)
diff --git a/arch/arm64/boot/dts/intel/axm5616-victoria.dts b/arch/arm64/boot/dts/intel/axm5616-victoria.dts index d37b693..0498184 100644 --- a/arch/arm64/boot/dts/intel/axm5616-victoria.dts +++ b/arch/arm64/boot/dts/intel/axm5616-victoria.dts @@ -120,3 +120,8 @@ }; }; }; + +&pci0 { + + status = "okay"; +}; diff --git a/drivers/pci/host/pcie-axxia.c b/drivers/pci/host/pcie-axxia.c index 28d4ccc..f309195 100644 --- a/drivers/pci/host/pcie-axxia.c +++ b/drivers/pci/host/pcie-axxia.c @@ -109,12 +109,10 @@ static inline uint32_t axxia_mmio_read_32(uintptr_t addr) int axxia_is_x9(void) { - unsigned int pfuse; - static void __iomem *base; + if (of_find_compatible_node(NULL, NULL, "lsi,axm5616")) + return 1; - base = ioremap(AXXIA_SYSCON_BASE, 0x1024); - pfuse = axxia_mmio_read_32((uintptr_t)(base + 0x34)); - return (0xb == (pfuse & 0x1f)); + return 0; } struct axxia_pcie { @@ -205,13 +203,17 @@ static int axxia_pcie_wr_own_conf(struct pcie_port *pp, int where, static void axxia_pcie_prog_viewport_cfg0(struct pcie_port *pp, u32 busdev) { + u32 upper_base; + /* Program viewport 0 : OUTBOUND : CFG0 */ axxia_pcie_writel_rc(pp, PCIE_ATU_REGION_OUTBOUND | PCIE_ATU_REGION_INDEX0, PCIE_ATU_VIEWPORT); axxia_pcie_writel_rc(pp, pp->cfg0_base, PCIE_ATU_LOWER_BASE); -if (!axxia_is_x9()) - axxia_pcie_writel_rc(pp, (pp->cfg0_base >> 32), PCIE_ATU_UPPER_BASE); + /* set upper base bits [1:0] for X9, bits[7:0] for XLF */ + upper_base = (pp->cfg0_base >> 32); + upper_base &= (axxia_is_x9()) ? 0x3 : 0xff; + axxia_pcie_writel_rc(pp, upper_base, PCIE_ATU_UPPER_BASE); axxia_pcie_writel_rc(pp, pp->cfg0_base + pp->cfg0_size - 1, PCIE_ATU_LIMIT); axxia_pcie_writel_rc(pp, busdev, PCIE_ATU_LOWER_TARGET); @@ -223,14 +225,18 @@ if (!axxia_is_x9()) static void axxia_pcie_prog_viewport_cfg1(struct pcie_port *pp, u32 busdev) { + u32 upper_base; + /* Program viewport 1 : OUTBOUND : CFG1 */ axxia_pcie_writel_rc(pp, PCIE_ATU_REGION_OUTBOUND | PCIE_ATU_REGION_INDEX1, PCIE_ATU_VIEWPORT); axxia_pcie_writel_rc(pp, PCIE_ATU_TYPE_CFG1, PCIE_ATU_CR1); axxia_pcie_writel_rc(pp, pp->cfg1_base, PCIE_ATU_LOWER_BASE); -if (!axxia_is_x9()) - axxia_pcie_writel_rc(pp, (pp->cfg1_base >> 32), PCIE_ATU_UPPER_BASE); + upper_base = (pp->cfg1_base >> 32); + upper_base &= (axxia_is_x9()) ? 0x3 : 0xff; + axxia_pcie_writel_rc(pp, upper_base, PCIE_ATU_UPPER_BASE); + axxia_pcie_writel_rc(pp, pp->cfg1_base + pp->cfg1_size - 1, PCIE_ATU_LIMIT); axxia_pcie_writel_rc(pp, busdev, PCIE_ATU_LOWER_TARGET); @@ -240,14 +246,17 @@ if (!axxia_is_x9()) static void axxia_pcie_prog_viewport_mem_outbound(struct pcie_port *pp) { + u32 upper_base; + /* Program viewport 0 : OUTBOUND : MEM */ axxia_pcie_writel_rc(pp, PCIE_ATU_REGION_OUTBOUND | PCIE_ATU_REGION_INDEX2, PCIE_ATU_VIEWPORT); axxia_pcie_writel_rc(pp, PCIE_ATU_TYPE_MEM, PCIE_ATU_CR1); axxia_pcie_writel_rc(pp, pp->mem_mod_base, PCIE_ATU_LOWER_BASE); -if (!axxia_is_x9()) - axxia_pcie_writel_rc(pp, (pp->mem_mod_base >> 32), PCIE_ATU_UPPER_BASE); + upper_base = (pp->mem_mod_base >> 32); + upper_base &= (axxia_is_x9()) ? 0x3 : 0xff; + axxia_pcie_writel_rc(pp, upper_base, PCIE_ATU_UPPER_BASE); axxia_pcie_writel_rc(pp, pp->mem_mod_base + pp->mem_size - 1, PCIE_ATU_LIMIT); axxia_pcie_writel_rc(pp, pp->mem_bus_addr, PCIE_ATU_LOWER_TARGET); @@ -490,7 +499,7 @@ int axxia_pcie_link_up(struct pcie_port *pp) axxia_cc_gpreg_readl(pp, PEI_SII_PWR_MGMT_REG, &smlh_state); smlh_state = (smlh_state & PEI_SMLH_LINK_STATE) >> 4; - if (smlh_state != 0x11) { + if ((smlh_state != 0x11) && (smlh_state != 0x23)) { pr_info("smlh_state = 0x%x\n", smlh_state); pr_err("PCIe LINK IS NOT UP\n"); return 0; @@ -555,11 +564,14 @@ void axxia_pcie_setup_rc(struct pcie_port *pp) val |= PCI_COMMAND_IO | PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER | PCI_COMMAND_SERR; axxia_pcie_writel_rc(pp, val, PCI_COMMAND); + axxia_pcie_writel_rc(pp, 0x1037201, 0x8a8); /* LTSSM enable */ axxia_cc_gpreg_readl(pp, PEI_GENERAL_CORE_CTL_REG, &val); + msleep(100); val |= 0x1; axxia_cc_gpreg_writel(pp, 0x1, PEI_GENERAL_CORE_CTL_REG); + msleep(100); } static int axxia_pcie_establish_link(struct pcie_port *pp) -- 1.9.1 -- _______________________________________________ linux-yocto mailing list linux-yocto@yoctoproject.org https://lists.yoctoproject.org/listinfo/linux-yocto