1 /* 2 * Copyright 2018-2022 NXP 3 * 4 * SPDX-License-Identifier: BSD-3-Clause 5 */ 6 7 #include <stdbool.h> 8 #include <lib/mmio.h> 9 10 #include <dram.h> 11 #include <platform_def.h> 12 13 #define SRC_DDR1_RCR (IMX_SRC_BASE + 0x1000) 14 #define SRC_DDR2_RCR (IMX_SRC_BASE + 0x1004) 15 16 #define PU_PGC_UP_TRG 0xf8 17 #define PU_PGC_DN_TRG 0x104 18 #define GPC_PU_PWRHSK (IMX_GPC_BASE + 0x01FC) 19 #define CCM_SRC_CTRL_OFFSET (IMX_CCM_BASE + 0x800) 20 #define CCM_CCGR_OFFSET (IMX_CCM_BASE + 0x4000) 21 #define CCM_SRC_CTRL(n) (CCM_SRC_CTRL_OFFSET + 0x10 * (n)) 22 #define CCM_CCGR(n) (CCM_CCGR_OFFSET + 0x10 * (n)) 23 24 #define DRAM_PLL_CTRL (IMX_ANAMIX_BASE + 0x50) 25 26 #define DBGCAM_EMPTY 0x36000000 27 28 void dram_enter_retention(void) 29 { 30 /* Wait DBGCAM to be empty */ 31 while (mmio_read_32(DDRC_DBGCAM(0)) != DBGCAM_EMPTY) { 32 ; 33 } 34 35 /* Block AXI ports from taking anymore transactions */ 36 mmio_write_32(DDRC_PCTRL_0(0), 0x0); 37 /* Wait until all AXI ports are idle */ 38 while (mmio_read_32(DDRC_PSTAT(0)) & 0x10001) { 39 ; 40 } 41 42 /* Enter self refresh */ 43 mmio_write_32(DDRC_PWRCTL(0), 0xaa); 44 45 /* LPDDR4 & DDR4/DDR3L need to check different status */ 46 if (dram_info.dram_type == DDRC_LPDDR4) { 47 while (0x223 != (mmio_read_32(DDRC_STAT(0)) & 0x33f)) { 48 ; 49 } 50 } else { 51 while (0x23 != (mmio_read_32(DDRC_STAT(0)) & 0x3f)) { 52 ; 53 } 54 } 55 56 mmio_write_32(DDRC_DFIMISC(0), 0x0); 57 mmio_write_32(DDRC_SWCTL(0), 0x0); 58 mmio_write_32(DDRC_DFIMISC(0), 0x1f00); 59 mmio_write_32(DDRC_DFIMISC(0), 0x1f20); 60 61 while (mmio_read_32(DDRC_DFISTAT(0)) & 0x1) { 62 ; 63 } 64 65 mmio_write_32(DDRC_DFIMISC(0), 0x1f00); 66 /* wait DFISTAT.dfi_init_complete to 1 */ 67 while (!(mmio_read_32(DDRC_DFISTAT(0)) & 0x1)) { 68 ; 69 } 70 71 mmio_write_32(DDRC_SWCTL(0), 0x1); 72 73 /* should check PhyInLP3 pub reg */ 74 dwc_ddrphy_apb_wr(0xd0000, 0x0); 75 if (!(dwc_ddrphy_apb_rd(0x90028) & 0x1)) { 76 INFO("PhyInLP3 = 1\n"); 77 } 78 dwc_ddrphy_apb_wr(0xd0000, 0x1); 79 80 #if defined(PLAT_imx8mq) 81 /* pwrdnreqn_async adbm/adbs of ddr */ 82 mmio_clrbits_32(GPC_PU_PWRHSK, BIT(1)); 83 while (mmio_read_32(GPC_PU_PWRHSK) & BIT(18)) { 84 ; 85 } 86 mmio_setbits_32(GPC_PU_PWRHSK, BIT(1)); 87 #else 88 /* pwrdnreqn_async adbm/adbs of ddr */ 89 mmio_clrbits_32(GPC_PU_PWRHSK, BIT(2)); 90 while (mmio_read_32(GPC_PU_PWRHSK) & BIT(20)) { 91 ; 92 } 93 mmio_setbits_32(GPC_PU_PWRHSK, BIT(2)); 94 #endif 95 /* remove PowerOk */ 96 mmio_write_32(SRC_DDR1_RCR, 0x8F000008); 97 98 mmio_write_32(CCM_CCGR(5), 0); 99 mmio_write_32(CCM_SRC_CTRL(15), 2); 100 101 /* enable the phy iso */ 102 mmio_setbits_32(IMX_GPC_BASE + 0xd40, 1); 103 mmio_setbits_32(IMX_GPC_BASE + PU_PGC_DN_TRG, BIT(5)); 104 105 VERBOSE("dram enter retention\n"); 106 } 107 108 void dram_exit_retention(void) 109 { 110 VERBOSE("dram exit retention\n"); 111 /* assert all reset */ 112 #if defined(PLAT_imx8mq) 113 mmio_write_32(SRC_DDR2_RCR, 0x8F000003); 114 mmio_write_32(SRC_DDR1_RCR, 0x8F00000F); 115 mmio_write_32(SRC_DDR2_RCR, 0x8F000000); 116 #else 117 mmio_write_32(SRC_DDR1_RCR, 0x8F00001F); 118 mmio_write_32(SRC_DDR1_RCR, 0x8F00000F); 119 #endif 120 mmio_write_32(CCM_CCGR(5), 2); 121 mmio_write_32(CCM_SRC_CTRL(15), 2); 122 123 /* disable iso */ 124 mmio_setbits_32(IMX_GPC_BASE + PU_PGC_UP_TRG, BIT(5)); 125 mmio_write_32(SRC_DDR1_RCR, 0x8F000006); 126 127 /* wait dram pll locked */ 128 while (!(mmio_read_32(DRAM_PLL_CTRL) & BIT(31))) { 129 ; 130 } 131 132 /* ddrc re-init */ 133 dram_umctl2_init(dram_info.timing_info); 134 135 /* 136 * Skips the DRAM init routine and starts up in selfrefresh mode 137 * Program INIT0.skip_dram_init = 2'b11 138 */ 139 mmio_setbits_32(DDRC_INIT0(0), 0xc0000000); 140 /* Keeps the controller in self-refresh mode */ 141 mmio_write_32(DDRC_PWRCTL(0), 0xaa); 142 mmio_write_32(DDRC_DBG1(0), 0x0); 143 mmio_write_32(SRC_DDR1_RCR, 0x8F000004); 144 mmio_write_32(SRC_DDR1_RCR, 0x8F000000); 145 146 /* before write Dynamic reg, sw_done should be 0 */ 147 mmio_write_32(DDRC_SWCTL(0), 0x0); 148 149 #if !PLAT_imx8mn 150 if (dram_info.dram_type == DDRC_LPDDR4) { 151 mmio_write_32(DDRC_DDR_SS_GPR0, 0x01); /*LPDDR4 mode */ 152 } 153 #endif /* !PLAT_imx8mn */ 154 155 mmio_write_32(DDRC_DFIMISC(0), 0x0); 156 157 /* dram phy re-init */ 158 dram_phy_init(dram_info.timing_info); 159 160 /* DWC_DDRPHYA_APBONLY0_MicroContMuxSel */ 161 dwc_ddrphy_apb_wr(0xd0000, 0x0); 162 while (dwc_ddrphy_apb_rd(0x20097)) { 163 ; 164 } 165 dwc_ddrphy_apb_wr(0xd0000, 0x1); 166 167 /* before write Dynamic reg, sw_done should be 0 */ 168 mmio_write_32(DDRC_SWCTL(0), 0x0); 169 mmio_write_32(DDRC_DFIMISC(0), 0x20); 170 /* wait DFISTAT.dfi_init_complete to 1 */ 171 while (!(mmio_read_32(DDRC_DFISTAT(0)) & 0x1)) { 172 ; 173 } 174 175 /* clear DFIMISC.dfi_init_start */ 176 mmio_write_32(DDRC_DFIMISC(0), 0x0); 177 /* set DFIMISC.dfi_init_complete_en */ 178 mmio_write_32(DDRC_DFIMISC(0), 0x1); 179 180 /* set SWCTL.sw_done to enable quasi-dynamic register programming */ 181 mmio_write_32(DDRC_SWCTL(0), 0x1); 182 /* wait SWSTAT.sw_done_ack to 1 */ 183 while (!(mmio_read_32(DDRC_SWSTAT(0)) & 0x1)) { 184 ; 185 } 186 187 mmio_write_32(DDRC_PWRCTL(0), 0x88); 188 /* wait STAT to normal state */ 189 while (0x1 != (mmio_read_32(DDRC_STAT(0)) & 0x7)) { 190 ; 191 } 192 193 mmio_write_32(DDRC_PCTRL_0(0), 0x1); 194 /* dis_auto-refresh is set to 0 */ 195 mmio_write_32(DDRC_RFSHCTL3(0), 0x0); 196 197 /* should check PhyInLP3 pub reg */ 198 dwc_ddrphy_apb_wr(0xd0000, 0x0); 199 if (!(dwc_ddrphy_apb_rd(0x90028) & 0x1)) { 200 VERBOSE("PHYInLP3 = 0\n"); 201 } 202 dwc_ddrphy_apb_wr(0xd0000, 0x1); 203 } 204