plat: imx8m: Add dram pll lock check before retention exit

Add the dram pll lock check to make the pll is already
locked bofore dram exit from retention mode.

addtionally, the DDR4 reset flow need some change to
make sure DRAM exit retention safely.

Signed-off-by: Jacky Bai <ping.bai@nxp.com>
(cherry picked from commit 858e2141138d87fe6072f8ba0321b3963ae9630c)
diff --git a/plat/imx/common/imx8m/ddr4_retention.c b/plat/imx/common/imx8m/ddr4_retention.c
index ee2e6b6..9f90238 100644
--- a/plat/imx/common/imx8m/ddr4_retention.c
+++ b/plat/imx/common/imx8m/ddr4_retention.c
@@ -107,6 +107,8 @@
 	/* assert all reset */
 	mmio_write_32(SRC_DDRC_RCR_ADDR, 0x8F00003F);
 
+	mmio_write_32(SRC_DDRC_RCR_ADDR, 0x8F00000F); /* release [4]src_system_rst_b! */
+
 	mmio_write_32(CCM_CCGR(5), 2);
 	mmio_write_32(CCM_SRC_CTRL(15), 2);
 	printf("C: enable all DRAM clocks \n");
@@ -114,13 +116,16 @@
 	mmio_write_32(0x303A00EC, 0x0000ffff); /* PGC_CPU_MAPPING */
 	mmio_setbits_32(0x303A00F8, (1 << 5));
 
-	mmio_write_32(SRC_DDRC_RCR_ADDR, 0x8F00000F); /* release [4]src_system_rst_b! */
 	mmio_write_32(SRC_DDRC_RCR_ADDR, 0x8F000006); /* release [0]ddr1_preset_n, [3]ddr1_phy_pwrokin_n */
 	/* RESET: <core_ddrc_rstn> ASSERTED (ACTIVE LOW) */
 	/* RESET: <presetn> ASSERTED (ACTIVE LOW) */
 	/* RESET: <aresetn> for Port 0  ASSERTED (ACTIVE LOW) */
 	/* RESET: <presetn> DEASSERTED */
 
+	/* wait dram pll locked */
+	while(!(mmio_read_32(DRAM_PLL_CTRL) & (1 << 31)))
+		;
+
 	mmio_write_32(DDRC_DBG1(0), 0x00000001);
 	mmio_write_32(DDRC_PWRCTL(0), 0x00000001);
 	while (0 != (0x7 & mmio_read_32(DDRC_STAT(0))))
diff --git a/plat/imx/common/imx8m/lpddr4_retention.c b/plat/imx/common/imx8m/lpddr4_retention.c
index 205dbbf..8cc44c8 100644
--- a/plat/imx/common/imx8m/lpddr4_retention.c
+++ b/plat/imx/common/imx8m/lpddr4_retention.c
@@ -163,6 +163,10 @@
 
 	mmio_write_32(SRC_DDRC_RCR_ADDR, 0x8F000006); // release [0]ddr1_preset_n,  [3]ddr1_phy_pwrokin_n
 
+	/* wait dram pll locked */
+	while(!(mmio_read_32(DRAM_PLL_CTRL) & (1 << 31)))
+		;
+
 	/* ddrc re-init */
 	dram_umctl2_init();
 
diff --git a/plat/imx/imx8mm/include/platform_def.h b/plat/imx/imx8mm/include/platform_def.h
index dea9b61..3e26158 100644
--- a/plat/imx/imx8mm/include/platform_def.h
+++ b/plat/imx/imx8mm/include/platform_def.h
@@ -88,6 +88,8 @@
 #define IMX_DDR_IPS_BASE		0x3d000000
 #define IMX_ROM_BASE			0x0
 
+#define DRAM_PLL_CTRL			(IMX_ANAMIX_BASE + 0x50)
+
 #define OCRAM_S_BASE			0x00180000
 #define OCRAM_S_SIZE			0x8000
 #define OCRAM_S_LIMIT			(OCRAM_S_BASE + OCRAM_S_SIZE)
diff --git a/plat/imx/imx8mq/include/platform_def.h b/plat/imx/imx8mq/include/platform_def.h
index 822d95a..31ce296 100644
--- a/plat/imx/imx8mq/include/platform_def.h
+++ b/plat/imx/imx8mq/include/platform_def.h
@@ -75,6 +75,7 @@
 #define HW_DRAM_PLL_CFG0		(IMX_ANAMIX_BASE + 0x60)
 #define HW_DRAM_PLL_CFG1		(IMX_ANAMIX_BASE + 0x64)
 #define HW_DRAM_PLL_CFG2		(IMX_ANAMIX_BASE + 0x68)
+#define DRAM_PLL_CTRL			HW_DRAM_PLL_CFG0
 
 #define OCRAM_S_BASE			0x00180000
 #define OCRAM_S_SIZE			0x8000