msm: ep_pcie: init the MMIO before link training
Host side could access MMIO as soon as the PCIe link is up. Config
all MMIO registers which are related to the init of host side,
before the PCIe link training.
Change-Id: I0e6dd19b7945d2518d3af79f4ed6290f36c0d7e0
Signed-off-by: Yan He <yanhe@codeaurora.org>
Signed-off-by: Siddartha Mohanadoss <smohanad@codeaurora.org>
diff --git a/drivers/platform/msm/ep_pcie/ep_pcie_com.h b/drivers/platform/msm/ep_pcie/ep_pcie_com.h
index 00ca8dc4..33e0314 100644
--- a/drivers/platform/msm/ep_pcie/ep_pcie_com.h
+++ b/drivers/platform/msm/ep_pcie/ep_pcie_com.h
@@ -120,6 +120,12 @@
#define PCIE20_MHICFG 0x110
#define PCIE20_BHI_EXECENV 0x228
+#define PCIE20_MHIVER 0x108
+#define PCIE20_MHICTRL 0x138
+#define PCIE20_MHISTATUS 0x148
+#define PCIE20_BHI_VERSION_LOWER 0x200
+#define PCIE20_BHI_VERSION_UPPER 0x204
+#define PCIE20_BHI_INTVEC 0x220
#define PCIE20_AUX_CLK_FREQ_REG 0xB40
diff --git a/drivers/platform/msm/ep_pcie/ep_pcie_core.c b/drivers/platform/msm/ep_pcie/ep_pcie_core.c
index 055f026..db6f689 100644
--- a/drivers/platform/msm/ep_pcie/ep_pcie_core.c
+++ b/drivers/platform/msm/ep_pcie/ep_pcie_core.c
@@ -497,6 +497,22 @@
ep_pcie_write_mask(dev->dm_core + PCIE20_MISC_CONTROL_1, BIT(0), 0);
}
+static void ep_pcie_config_mmio(struct ep_pcie_dev_t *dev)
+{
+ EP_PCIE_DBG(dev,
+ "Initial version of MMIO is:0x%x\n",
+ readl_relaxed(dev->mmio + PCIE20_MHIVER));
+
+ ep_pcie_write_reg(dev->mmio, PCIE20_MHICFG, 0x02800880);
+ ep_pcie_write_reg(dev->mmio, PCIE20_BHI_EXECENV, 0x2);
+ ep_pcie_write_reg(dev->mmio, PCIE20_MHICTRL, 0x0);
+ ep_pcie_write_reg(dev->mmio, PCIE20_MHISTATUS, 0x0);
+ ep_pcie_write_reg(dev->mmio, PCIE20_MHIVER, 0x1000000);
+ ep_pcie_write_reg(dev->mmio, PCIE20_BHI_VERSION_LOWER, 0x2);
+ ep_pcie_write_reg(dev->mmio, PCIE20_BHI_VERSION_UPPER, 0x1);
+ ep_pcie_write_reg(dev->mmio, PCIE20_BHI_INTVEC, 0xffffffff);
+}
+
static void ep_pcie_core_init(struct ep_pcie_dev_t *dev, bool configured)
{
EP_PCIE_DBG(dev, "PCIe V%d\n", dev->rev);
@@ -667,9 +683,6 @@
/* Configure BARs */
ep_pcie_bar_init(dev);
-
- ep_pcie_write_reg(dev->mmio, PCIE20_MHICFG, 0x02800880);
- ep_pcie_write_reg(dev->mmio, PCIE20_BHI_EXECENV, 0x2);
}
/* Configure IRQ events */
@@ -690,6 +703,16 @@
dev->rev,
readl_relaxed(dev->parf + PCIE20_PARF_INT_ALL_MASK));
}
+
+ if (dev->active_config) {
+ ep_pcie_write_reg(dev->dm_core, PCIE20_AUX_CLK_FREQ_REG, 0x14);
+
+ EP_PCIE_DBG2(dev, "PCIe V%d: Enable L1.\n", dev->rev);
+ ep_pcie_write_mask(dev->parf + PCIE20_PARF_PM_CTRL, BIT(5), 0);
+ }
+
+ /* Configure MMIO */
+ ep_pcie_config_mmio(dev);
}
static void ep_pcie_config_inbound_iatu(struct ep_pcie_dev_t *dev)