1*9c336f61SJacky Bai /* 2*9c336f61SJacky Bai * Copyright 2018-2022 NXP 3*9c336f61SJacky Bai * 4*9c336f61SJacky Bai * SPDX-License-Identifier: BSD-3-Clause 5*9c336f61SJacky Bai */ 6*9c336f61SJacky Bai 7*9c336f61SJacky Bai #include <drivers/delay_timer.h> 8*9c336f61SJacky Bai #include <lib/mmio.h> 9*9c336f61SJacky Bai 10*9c336f61SJacky Bai #include <dram.h> 11*9c336f61SJacky Bai 12*9c336f61SJacky Bai void ddr4_mr_write(uint32_t mr, uint32_t data, uint32_t mr_type, uint32_t rank) 13*9c336f61SJacky Bai { 14*9c336f61SJacky Bai uint32_t val, mr_mirror, data_mirror; 15*9c336f61SJacky Bai 16*9c336f61SJacky Bai /* 17*9c336f61SJacky Bai * 1. Poll MRSTAT.mr_wr_busy until it is 0 to make sure 18*9c336f61SJacky Bai * that there is no outstanding MR transAction. 19*9c336f61SJacky Bai */ 20*9c336f61SJacky Bai while (mmio_read_32(DDRC_MRSTAT(0)) & 0x1) { 21*9c336f61SJacky Bai ; 22*9c336f61SJacky Bai } 23*9c336f61SJacky Bai 24*9c336f61SJacky Bai /* 25*9c336f61SJacky Bai * 2. Write the MRCTRL0.mr_type, MRCTRL0.mr_addr, MRCTRL0.mr_rank 26*9c336f61SJacky Bai * and (for MRWs) MRCTRL1.mr_data to define the MR transaction. 27*9c336f61SJacky Bai */ 28*9c336f61SJacky Bai val = mmio_read_32(DDRC_DIMMCTL(0)); 29*9c336f61SJacky Bai if ((val & 0x2) && (rank == 0x2)) { 30*9c336f61SJacky Bai mr_mirror = (mr & 0x4) | ((mr & 0x1) << 1) | ((mr & 0x2) >> 1); /* BA0, BA1 swap */ 31*9c336f61SJacky Bai data_mirror = (data & 0x1607) | ((data & 0x8) << 1) | ((data & 0x10) >> 1) | 32*9c336f61SJacky Bai ((data & 0x20) << 1) | ((data & 0x40) >> 1) | ((data & 0x80) << 1) | 33*9c336f61SJacky Bai ((data & 0x100) >> 1) | ((data & 0x800) << 2) | ((data & 0x2000) >> 2) ; 34*9c336f61SJacky Bai } else { 35*9c336f61SJacky Bai mr_mirror = mr; 36*9c336f61SJacky Bai data_mirror = data; 37*9c336f61SJacky Bai } 38*9c336f61SJacky Bai 39*9c336f61SJacky Bai mmio_write_32(DDRC_MRCTRL0(0), mr_type | (mr_mirror << 12) | (rank << 4)); 40*9c336f61SJacky Bai mmio_write_32(DDRC_MRCTRL1(0), data_mirror); 41*9c336f61SJacky Bai 42*9c336f61SJacky Bai /* 43*9c336f61SJacky Bai * 3. In a separate APB transaction, write the MRCTRL0.mr_wr to 1. 44*9c336f61SJacky Bai * This bit is self-clearing, and triggers the MR transaction. 45*9c336f61SJacky Bai * The uMCTL2 then asserts the MRSTAT.mr_wr_busy while it performs 46*9c336f61SJacky Bai * the MR transaction to SDRAM, and no further accesses can be 47*9c336f61SJacky Bai * initiated until it is deasserted. 48*9c336f61SJacky Bai */ 49*9c336f61SJacky Bai mmio_setbits_32(DDRC_MRCTRL0(0), BIT(31)); 50*9c336f61SJacky Bai 51*9c336f61SJacky Bai while (mmio_read_32(DDRC_MRSTAT(0))) { 52*9c336f61SJacky Bai ; 53*9c336f61SJacky Bai } 54*9c336f61SJacky Bai } 55*9c336f61SJacky Bai 56*9c336f61SJacky Bai void dram_cfg_all_mr(struct dram_info *info, uint32_t pstate) 57*9c336f61SJacky Bai { 58*9c336f61SJacky Bai uint32_t num_rank = info->num_rank; 59*9c336f61SJacky Bai /* 60*9c336f61SJacky Bai * 15. Perform MRS commands as required to re-program 61*9c336f61SJacky Bai * timing registers in the SDRAM for the new frequency 62*9c336f61SJacky Bai * (in particular, CL, CWL and WR may need to be changed). 63*9c336f61SJacky Bai */ 64*9c336f61SJacky Bai 65*9c336f61SJacky Bai for (int i = 1; i <= num_rank; i++) { 66*9c336f61SJacky Bai for (int j = 0; j < 6; j++) { 67*9c336f61SJacky Bai ddr4_mr_write(j, info->mr_table[pstate][j], 0, i); 68*9c336f61SJacky Bai } 69*9c336f61SJacky Bai ddr4_mr_write(6, info->mr_table[pstate][7], 0, i); 70*9c336f61SJacky Bai } 71*9c336f61SJacky Bai } 72*9c336f61SJacky Bai 73*9c336f61SJacky Bai void sw_pstate(uint32_t pstate, uint32_t drate) 74*9c336f61SJacky Bai { 75*9c336f61SJacky Bai uint32_t val; 76*9c336f61SJacky Bai 77*9c336f61SJacky Bai mmio_write_32(DDRC_SWCTL(0), 0x0); 78*9c336f61SJacky Bai 79*9c336f61SJacky Bai /* 80*9c336f61SJacky Bai * Update any registers which may be required to 81*9c336f61SJacky Bai * change for the new frequency. 82*9c336f61SJacky Bai */ 83*9c336f61SJacky Bai mmio_write_32(DDRC_MSTR2(0), pstate); 84*9c336f61SJacky Bai mmio_setbits_32(DDRC_MSTR(0), (0x1 << 29)); 85*9c336f61SJacky Bai 86*9c336f61SJacky Bai /* 87*9c336f61SJacky Bai * Toggle RFSHCTL3.refresh_update_level to allow the 88*9c336f61SJacky Bai * new refresh-related register values to propagate 89*9c336f61SJacky Bai * to the refresh logic. 90*9c336f61SJacky Bai */ 91*9c336f61SJacky Bai val = mmio_read_32(DDRC_RFSHCTL3(0)); 92*9c336f61SJacky Bai if (val & 0x2) { 93*9c336f61SJacky Bai mmio_write_32(DDRC_RFSHCTL3(0), val & 0xFFFFFFFD); 94*9c336f61SJacky Bai } else { 95*9c336f61SJacky Bai mmio_write_32(DDRC_RFSHCTL3(0), val | 0x2); 96*9c336f61SJacky Bai } 97*9c336f61SJacky Bai 98*9c336f61SJacky Bai /* 99*9c336f61SJacky Bai * 19. If required, trigger the initialization in the PHY. 100*9c336f61SJacky Bai * If using the gen2 multiPHY, PLL initialization should 101*9c336f61SJacky Bai * be triggered at this point. See the PHY databook for 102*9c336f61SJacky Bai * details about the frequency change procedure. 103*9c336f61SJacky Bai */ 104*9c336f61SJacky Bai mmio_write_32(DDRC_DFIMISC(0), 0x00000000 | (pstate << 8)); 105*9c336f61SJacky Bai mmio_write_32(DDRC_DFIMISC(0), 0x00000020 | (pstate << 8)); 106*9c336f61SJacky Bai 107*9c336f61SJacky Bai /* wait DFISTAT.dfi_init_complete to 0 */ 108*9c336f61SJacky Bai while (mmio_read_32(DDRC_DFISTAT(0)) & 0x1) { 109*9c336f61SJacky Bai ; 110*9c336f61SJacky Bai } 111*9c336f61SJacky Bai 112*9c336f61SJacky Bai /* change the clock to the target frequency */ 113*9c336f61SJacky Bai dram_clock_switch(drate, false); 114*9c336f61SJacky Bai 115*9c336f61SJacky Bai mmio_write_32(DDRC_DFIMISC(0), 0x00000000 | (pstate << 8)); 116*9c336f61SJacky Bai 117*9c336f61SJacky Bai /* wait DFISTAT.dfi_init_complete to 1 */ 118*9c336f61SJacky Bai while (!(mmio_read_32(DDRC_DFISTAT(0)) & 0x1)) { 119*9c336f61SJacky Bai ; 120*9c336f61SJacky Bai } 121*9c336f61SJacky Bai 122*9c336f61SJacky Bai /* 123*9c336f61SJacky Bai * When changing frequencies the controller may violate the JEDEC 124*9c336f61SJacky Bai * requirement that no more than 16 refreshes should be issued within 125*9c336f61SJacky Bai * 2*tREFI. These extra refreshes are not expected to cause a problem 126*9c336f61SJacky Bai * in the SDRAM. This issue can be avoided by waiting for at least 2*tREFI 127*9c336f61SJacky Bai * before exiting self-refresh in step 19. 128*9c336f61SJacky Bai */ 129*9c336f61SJacky Bai udelay(14); 130*9c336f61SJacky Bai 131*9c336f61SJacky Bai /* 14. Exit the self-refresh state by setting PWRCTL.selfref_sw = 0. */ 132*9c336f61SJacky Bai mmio_clrbits_32(DDRC_PWRCTL(0), (1 << 5)); 133*9c336f61SJacky Bai 134*9c336f61SJacky Bai while ((mmio_read_32(DDRC_STAT(0)) & 0x3f) == 0x23) { 135*9c336f61SJacky Bai ; 136*9c336f61SJacky Bai } 137*9c336f61SJacky Bai } 138*9c336f61SJacky Bai 139*9c336f61SJacky Bai void ddr4_swffc(struct dram_info *info, unsigned int pstate) 140*9c336f61SJacky Bai { 141*9c336f61SJacky Bai uint32_t drate = info->timing_info->fsp_table[pstate]; 142*9c336f61SJacky Bai 143*9c336f61SJacky Bai /* 144*9c336f61SJacky Bai * 1. set SWCTL.sw_done to disable quasi-dynamic register 145*9c336f61SJacky Bai * programming outside reset. 146*9c336f61SJacky Bai */ 147*9c336f61SJacky Bai mmio_write_32(DDRC_SWCTL(0), 0x0); 148*9c336f61SJacky Bai 149*9c336f61SJacky Bai /* 150*9c336f61SJacky Bai * 2. Write 0 to PCTRL_n.port_en. This blocks AXI port(s) 151*9c336f61SJacky Bai * from taking any transaction (blocks traffic on AXI ports). 152*9c336f61SJacky Bai */ 153*9c336f61SJacky Bai mmio_write_32(DDRC_PCTRL_0(0), 0x0); 154*9c336f61SJacky Bai 155*9c336f61SJacky Bai /* 156*9c336f61SJacky Bai * 3. Poll PSTAT.rd_port_busy_n=0 and PSTAT.wr_port_busy_n=0. 157*9c336f61SJacky Bai * Wait until all AXI ports are idle (the uMCTL2 core has to 158*9c336f61SJacky Bai * be idle). 159*9c336f61SJacky Bai */ 160*9c336f61SJacky Bai while (mmio_read_32(DDRC_PSTAT(0)) & 0x10001) { 161*9c336f61SJacky Bai ; 162*9c336f61SJacky Bai } 163*9c336f61SJacky Bai 164*9c336f61SJacky Bai /* 165*9c336f61SJacky Bai * 4. Write 0 to SBRCTL.scrub_en. Disable SBR, required only if 166*9c336f61SJacky Bai * SBR instantiated. 167*9c336f61SJacky Bai * 5. Poll SBRSTAT.scrub_busy=0. 168*9c336f61SJacky Bai * 6. Set DERATEEN.derate_enable = 0, if DERATEEN.derate_eanble = 1 169*9c336f61SJacky Bai * and the read latency (RL) value needs to change after the frequency 170*9c336f61SJacky Bai * change (LPDDR2/3/4 only). 171*9c336f61SJacky Bai * 7. Set DBG1.dis_hif=1 so that no new commands will be accepted by the uMCTL2. 172*9c336f61SJacky Bai */ 173*9c336f61SJacky Bai mmio_setbits_32(DDRC_DBG1(0), (0x1 << 1)); 174*9c336f61SJacky Bai 175*9c336f61SJacky Bai /* 176*9c336f61SJacky Bai * 8. Poll DBGCAM.dbg_wr_q_empty and DBGCAM.dbg_rd_q_empty to ensure 177*9c336f61SJacky Bai * that write and read data buffers are empty. 178*9c336f61SJacky Bai */ 179*9c336f61SJacky Bai while ((mmio_read_32(DDRC_DBGCAM(0)) & 0x06000000) != 0x06000000) { 180*9c336f61SJacky Bai ; 181*9c336f61SJacky Bai } 182*9c336f61SJacky Bai 183*9c336f61SJacky Bai /* 184*9c336f61SJacky Bai * 9. For DDR4, update MR6 with the new tDLLK value via the Mode 185*9c336f61SJacky Bai * Register Write signals 186*9c336f61SJacky Bai * 10. Set DFILPCFG0.dfi_lp_en_sr = 0, if DFILPCFG0.dfi_lp_en_sr = 1, 187*9c336f61SJacky Bai * and wait until DFISTAT.dfi_lp_ack 188*9c336f61SJacky Bai * 11. If DFI PHY Master interface is active in uMCTL2, then disable it 189*9c336f61SJacky Bai * 12. Wait until STAT.operating_mode[1:0]!=11 indicating that the 190*9c336f61SJacky Bai * controller is not in self-refresh mode. 191*9c336f61SJacky Bai */ 192*9c336f61SJacky Bai while ((mmio_read_32(DDRC_STAT(0)) & 0x3) == 0x3) { 193*9c336f61SJacky Bai ; 194*9c336f61SJacky Bai } 195*9c336f61SJacky Bai 196*9c336f61SJacky Bai /* 197*9c336f61SJacky Bai * 13. Assert PWRCTL.selfref_sw for the DWC_ddr_umctl2 core to enter 198*9c336f61SJacky Bai * the self-refresh mode. 199*9c336f61SJacky Bai */ 200*9c336f61SJacky Bai mmio_setbits_32(DDRC_PWRCTL(0), (1 << 5)); 201*9c336f61SJacky Bai 202*9c336f61SJacky Bai /* 203*9c336f61SJacky Bai * 14. Wait until STAT.operating_mode[1:0]==11 indicating that the 204*9c336f61SJacky Bai * controller core is in self-refresh mode. 205*9c336f61SJacky Bai */ 206*9c336f61SJacky Bai while ((mmio_read_32(DDRC_STAT(0)) & 0x3f) != 0x23) { 207*9c336f61SJacky Bai ; 208*9c336f61SJacky Bai } 209*9c336f61SJacky Bai 210*9c336f61SJacky Bai sw_pstate(pstate, drate); 211*9c336f61SJacky Bai dram_cfg_all_mr(info, pstate); 212*9c336f61SJacky Bai 213*9c336f61SJacky Bai /* 23. Enable HIF commands by setting DBG1.dis_hif=0. */ 214*9c336f61SJacky Bai mmio_clrbits_32(DDRC_DBG1(0), (0x1 << 1)); 215*9c336f61SJacky Bai 216*9c336f61SJacky Bai /* 217*9c336f61SJacky Bai * 24. Reset DERATEEN.derate_enable = 1 if DERATEEN.derate_enable 218*9c336f61SJacky Bai * has been set to 0 in step 6. 219*9c336f61SJacky Bai * 25. If DFI PHY Master interface was active before step 11 then 220*9c336f61SJacky Bai * enable it back by programming DFIPHYMSTR.phymstr_en = 1'b1. 221*9c336f61SJacky Bai * 26. Write 1 to PCTRL_n.port_en. AXI port(s) are no longer blocked 222*9c336f61SJacky Bai * from taking transactions (Re-enable traffic on AXI ports) 223*9c336f61SJacky Bai */ 224*9c336f61SJacky Bai mmio_write_32(DDRC_PCTRL_0(0), 0x1); 225*9c336f61SJacky Bai 226*9c336f61SJacky Bai /* 227*9c336f61SJacky Bai * 27. Write 1 to SBRCTL.scrub_en. Enable SBR if desired, only 228*9c336f61SJacky Bai * required if SBR instantiated. 229*9c336f61SJacky Bai */ 230*9c336f61SJacky Bai 231*9c336f61SJacky Bai /* 232*9c336f61SJacky Bai * set SWCTL.sw_done to enable quasi-dynamic register programming 233*9c336f61SJacky Bai * outside reset. 234*9c336f61SJacky Bai */ 235*9c336f61SJacky Bai mmio_write_32(DDRC_SWCTL(0), 0x1); 236*9c336f61SJacky Bai 237*9c336f61SJacky Bai /* wait SWSTAT.sw_done_ack to 1 */ 238*9c336f61SJacky Bai while (!(mmio_read_32(DDRC_SWSTAT(0)) & 0x1)) { 239*9c336f61SJacky Bai ; 240*9c336f61SJacky Bai } 241*9c336f61SJacky Bai } 242