19c336f61SJacky Bai /* 2093888caSJacky Bai * Copyright 2018-2023 NXP 39c336f61SJacky Bai * 49c336f61SJacky Bai * SPDX-License-Identifier: BSD-3-Clause 59c336f61SJacky Bai */ 69c336f61SJacky Bai 79c336f61SJacky Bai #include <drivers/delay_timer.h> 89c336f61SJacky Bai #include <lib/mmio.h> 99c336f61SJacky Bai 109c336f61SJacky Bai #include <dram.h> 119c336f61SJacky Bai 120e39488fSJacky Bai void ddr4_mr_write(uint32_t mr, uint32_t data, uint32_t mr_type, 130e39488fSJacky Bai uint32_t rank, uint32_t dram_type) 149c336f61SJacky Bai { 159c336f61SJacky Bai uint32_t val, mr_mirror, data_mirror; 169c336f61SJacky Bai 179c336f61SJacky Bai /* 189c336f61SJacky Bai * 1. Poll MRSTAT.mr_wr_busy until it is 0 to make sure 199c336f61SJacky Bai * that there is no outstanding MR transAction. 209c336f61SJacky Bai */ 21*e00fe11dSJacky Bai 22*e00fe11dSJacky Bai /* 23*e00fe11dSJacky Bai * ERR050712: 24*e00fe11dSJacky Bai * When performing a software driven MR access, the following sequence 25*e00fe11dSJacky Bai * must be done automatically before performing other APB register accesses. 26*e00fe11dSJacky Bai * 1. Set MRCTRL0.mr_wr=1 27*e00fe11dSJacky Bai * 2. Check for MRSTAT.mr_wr_busy=0. If not, go to step (2) 28*e00fe11dSJacky Bai * 3. Check for MRSTAT.mr_wr_busy=0 again (for the second time). If not, go to step (2) 29*e00fe11dSJacky Bai */ 30*e00fe11dSJacky Bai mmio_setbits_32(DDRC_MRCTRL0(0), BIT(31)); 31*e00fe11dSJacky Bai 32*e00fe11dSJacky Bai do { 339c336f61SJacky Bai while (mmio_read_32(DDRC_MRSTAT(0)) & 0x1) { 349c336f61SJacky Bai ; 359c336f61SJacky Bai } 369c336f61SJacky Bai 37*e00fe11dSJacky Bai } while (mmio_read_32(DDRC_MRSTAT(0)) & 0x1); 38*e00fe11dSJacky Bai 399c336f61SJacky Bai /* 409c336f61SJacky Bai * 2. Write the MRCTRL0.mr_type, MRCTRL0.mr_addr, MRCTRL0.mr_rank 419c336f61SJacky Bai * and (for MRWs) MRCTRL1.mr_data to define the MR transaction. 429c336f61SJacky Bai */ 439c336f61SJacky Bai val = mmio_read_32(DDRC_DIMMCTL(0)); 449c336f61SJacky Bai if ((val & 0x2) && (rank == 0x2)) { 459c336f61SJacky Bai mr_mirror = (mr & 0x4) | ((mr & 0x1) << 1) | ((mr & 0x2) >> 1); /* BA0, BA1 swap */ 460e39488fSJacky Bai if (dram_type == DDRC_DDR4) { 479c336f61SJacky Bai data_mirror = (data & 0x1607) | ((data & 0x8) << 1) | ((data & 0x10) >> 1) | 489c336f61SJacky Bai ((data & 0x20) << 1) | ((data & 0x40) >> 1) | ((data & 0x80) << 1) | 499c336f61SJacky Bai ((data & 0x100) >> 1) | ((data & 0x800) << 2) | ((data & 0x2000) >> 2) ; 509c336f61SJacky Bai } else { 510e39488fSJacky Bai data_mirror = (data & 0xfe07) | ((data & 0x8) << 1) | ((data & 0x10) >> 1) | 520e39488fSJacky Bai ((data & 0x20) << 1) | ((data & 0x40) >> 1) | ((data & 0x80) << 1) | 530e39488fSJacky Bai ((data & 0x100) >> 1); 540e39488fSJacky Bai } 550e39488fSJacky Bai } else { 569c336f61SJacky Bai mr_mirror = mr; 579c336f61SJacky Bai data_mirror = data; 589c336f61SJacky Bai } 599c336f61SJacky Bai 609c336f61SJacky Bai mmio_write_32(DDRC_MRCTRL0(0), mr_type | (mr_mirror << 12) | (rank << 4)); 619c336f61SJacky Bai mmio_write_32(DDRC_MRCTRL1(0), data_mirror); 629c336f61SJacky Bai 639c336f61SJacky Bai /* 649c336f61SJacky Bai * 3. In a separate APB transaction, write the MRCTRL0.mr_wr to 1. 659c336f61SJacky Bai * This bit is self-clearing, and triggers the MR transaction. 669c336f61SJacky Bai * The uMCTL2 then asserts the MRSTAT.mr_wr_busy while it performs 679c336f61SJacky Bai * the MR transaction to SDRAM, and no further accesses can be 689c336f61SJacky Bai * initiated until it is deasserted. 699c336f61SJacky Bai */ 709c336f61SJacky Bai mmio_setbits_32(DDRC_MRCTRL0(0), BIT(31)); 719c336f61SJacky Bai 729c336f61SJacky Bai while (mmio_read_32(DDRC_MRSTAT(0))) { 739c336f61SJacky Bai ; 749c336f61SJacky Bai } 759c336f61SJacky Bai } 769c336f61SJacky Bai 779c336f61SJacky Bai void dram_cfg_all_mr(struct dram_info *info, uint32_t pstate) 789c336f61SJacky Bai { 799c336f61SJacky Bai uint32_t num_rank = info->num_rank; 800e39488fSJacky Bai uint32_t dram_type = info->dram_type; 819c336f61SJacky Bai /* 829c336f61SJacky Bai * 15. Perform MRS commands as required to re-program 839c336f61SJacky Bai * timing registers in the SDRAM for the new frequency 849c336f61SJacky Bai * (in particular, CL, CWL and WR may need to be changed). 859c336f61SJacky Bai */ 869c336f61SJacky Bai 879c336f61SJacky Bai for (int i = 1; i <= num_rank; i++) { 889c336f61SJacky Bai for (int j = 0; j < 6; j++) { 890e39488fSJacky Bai ddr4_mr_write(j, info->mr_table[pstate][j], 0, i, dram_type); 909c336f61SJacky Bai } 910e39488fSJacky Bai ddr4_mr_write(6, info->mr_table[pstate][7], 0, i, dram_type); 929c336f61SJacky Bai } 939c336f61SJacky Bai } 949c336f61SJacky Bai 959c336f61SJacky Bai void sw_pstate(uint32_t pstate, uint32_t drate) 969c336f61SJacky Bai { 979c336f61SJacky Bai uint32_t val; 989c336f61SJacky Bai 999c336f61SJacky Bai mmio_write_32(DDRC_SWCTL(0), 0x0); 1009c336f61SJacky Bai 1019c336f61SJacky Bai /* 1029c336f61SJacky Bai * Update any registers which may be required to 1039c336f61SJacky Bai * change for the new frequency. 1049c336f61SJacky Bai */ 1059c336f61SJacky Bai mmio_write_32(DDRC_MSTR2(0), pstate); 1069c336f61SJacky Bai mmio_setbits_32(DDRC_MSTR(0), (0x1 << 29)); 1079c336f61SJacky Bai 1089c336f61SJacky Bai /* 1099c336f61SJacky Bai * Toggle RFSHCTL3.refresh_update_level to allow the 1109c336f61SJacky Bai * new refresh-related register values to propagate 1119c336f61SJacky Bai * to the refresh logic. 1129c336f61SJacky Bai */ 1139c336f61SJacky Bai val = mmio_read_32(DDRC_RFSHCTL3(0)); 1149c336f61SJacky Bai if (val & 0x2) { 1159c336f61SJacky Bai mmio_write_32(DDRC_RFSHCTL3(0), val & 0xFFFFFFFD); 1169c336f61SJacky Bai } else { 1179c336f61SJacky Bai mmio_write_32(DDRC_RFSHCTL3(0), val | 0x2); 1189c336f61SJacky Bai } 1199c336f61SJacky Bai 1209c336f61SJacky Bai /* 1219c336f61SJacky Bai * 19. If required, trigger the initialization in the PHY. 1229c336f61SJacky Bai * If using the gen2 multiPHY, PLL initialization should 1239c336f61SJacky Bai * be triggered at this point. See the PHY databook for 1249c336f61SJacky Bai * details about the frequency change procedure. 1259c336f61SJacky Bai */ 1269c336f61SJacky Bai mmio_write_32(DDRC_DFIMISC(0), 0x00000000 | (pstate << 8)); 1279c336f61SJacky Bai mmio_write_32(DDRC_DFIMISC(0), 0x00000020 | (pstate << 8)); 1289c336f61SJacky Bai 1299c336f61SJacky Bai /* wait DFISTAT.dfi_init_complete to 0 */ 1309c336f61SJacky Bai while (mmio_read_32(DDRC_DFISTAT(0)) & 0x1) { 1319c336f61SJacky Bai ; 1329c336f61SJacky Bai } 1339c336f61SJacky Bai 1349c336f61SJacky Bai /* change the clock to the target frequency */ 1359c336f61SJacky Bai dram_clock_switch(drate, false); 1369c336f61SJacky Bai 1379c336f61SJacky Bai mmio_write_32(DDRC_DFIMISC(0), 0x00000000 | (pstate << 8)); 1389c336f61SJacky Bai 1399c336f61SJacky Bai /* wait DFISTAT.dfi_init_complete to 1 */ 1409c336f61SJacky Bai while (!(mmio_read_32(DDRC_DFISTAT(0)) & 0x1)) { 1419c336f61SJacky Bai ; 1429c336f61SJacky Bai } 1439c336f61SJacky Bai 1449c336f61SJacky Bai /* 1459c336f61SJacky Bai * When changing frequencies the controller may violate the JEDEC 1469c336f61SJacky Bai * requirement that no more than 16 refreshes should be issued within 1479c336f61SJacky Bai * 2*tREFI. These extra refreshes are not expected to cause a problem 1489c336f61SJacky Bai * in the SDRAM. This issue can be avoided by waiting for at least 2*tREFI 1499c336f61SJacky Bai * before exiting self-refresh in step 19. 1509c336f61SJacky Bai */ 1519c336f61SJacky Bai udelay(14); 1529c336f61SJacky Bai 1539c336f61SJacky Bai /* 14. Exit the self-refresh state by setting PWRCTL.selfref_sw = 0. */ 1549c336f61SJacky Bai mmio_clrbits_32(DDRC_PWRCTL(0), (1 << 5)); 1559c336f61SJacky Bai 1569c336f61SJacky Bai while ((mmio_read_32(DDRC_STAT(0)) & 0x3f) == 0x23) { 1579c336f61SJacky Bai ; 1589c336f61SJacky Bai } 1599c336f61SJacky Bai } 1609c336f61SJacky Bai 1619c336f61SJacky Bai void ddr4_swffc(struct dram_info *info, unsigned int pstate) 1629c336f61SJacky Bai { 1639c336f61SJacky Bai uint32_t drate = info->timing_info->fsp_table[pstate]; 1649c336f61SJacky Bai 1659c336f61SJacky Bai /* 1669c336f61SJacky Bai * 1. set SWCTL.sw_done to disable quasi-dynamic register 1679c336f61SJacky Bai * programming outside reset. 1689c336f61SJacky Bai */ 1699c336f61SJacky Bai mmio_write_32(DDRC_SWCTL(0), 0x0); 1709c336f61SJacky Bai 1719c336f61SJacky Bai /* 1729c336f61SJacky Bai * 2. Write 0 to PCTRL_n.port_en. This blocks AXI port(s) 1739c336f61SJacky Bai * from taking any transaction (blocks traffic on AXI ports). 1749c336f61SJacky Bai */ 1759c336f61SJacky Bai mmio_write_32(DDRC_PCTRL_0(0), 0x0); 1769c336f61SJacky Bai 1779c336f61SJacky Bai /* 1789c336f61SJacky Bai * 3. Poll PSTAT.rd_port_busy_n=0 and PSTAT.wr_port_busy_n=0. 1799c336f61SJacky Bai * Wait until all AXI ports are idle (the uMCTL2 core has to 1809c336f61SJacky Bai * be idle). 1819c336f61SJacky Bai */ 1829c336f61SJacky Bai while (mmio_read_32(DDRC_PSTAT(0)) & 0x10001) { 1839c336f61SJacky Bai ; 1849c336f61SJacky Bai } 1859c336f61SJacky Bai 1869c336f61SJacky Bai /* 1879c336f61SJacky Bai * 4. Write 0 to SBRCTL.scrub_en. Disable SBR, required only if 1889c336f61SJacky Bai * SBR instantiated. 1899c336f61SJacky Bai * 5. Poll SBRSTAT.scrub_busy=0. 1909c336f61SJacky Bai * 6. Set DERATEEN.derate_enable = 0, if DERATEEN.derate_eanble = 1 1919c336f61SJacky Bai * and the read latency (RL) value needs to change after the frequency 1929c336f61SJacky Bai * change (LPDDR2/3/4 only). 1939c336f61SJacky Bai * 7. Set DBG1.dis_hif=1 so that no new commands will be accepted by the uMCTL2. 1949c336f61SJacky Bai */ 1959c336f61SJacky Bai mmio_setbits_32(DDRC_DBG1(0), (0x1 << 1)); 1969c336f61SJacky Bai 1979c336f61SJacky Bai /* 1989c336f61SJacky Bai * 8. Poll DBGCAM.dbg_wr_q_empty and DBGCAM.dbg_rd_q_empty to ensure 1999c336f61SJacky Bai * that write and read data buffers are empty. 2009c336f61SJacky Bai */ 2019c336f61SJacky Bai while ((mmio_read_32(DDRC_DBGCAM(0)) & 0x06000000) != 0x06000000) { 2029c336f61SJacky Bai ; 2039c336f61SJacky Bai } 2049c336f61SJacky Bai 2059c336f61SJacky Bai /* 2069c336f61SJacky Bai * 9. For DDR4, update MR6 with the new tDLLK value via the Mode 2079c336f61SJacky Bai * Register Write signals 2089c336f61SJacky Bai * 10. Set DFILPCFG0.dfi_lp_en_sr = 0, if DFILPCFG0.dfi_lp_en_sr = 1, 2099c336f61SJacky Bai * and wait until DFISTAT.dfi_lp_ack 2109c336f61SJacky Bai * 11. If DFI PHY Master interface is active in uMCTL2, then disable it 2119c336f61SJacky Bai * 12. Wait until STAT.operating_mode[1:0]!=11 indicating that the 2129c336f61SJacky Bai * controller is not in self-refresh mode. 2139c336f61SJacky Bai */ 214093888caSJacky Bai if ((mmio_read_32(DDRC_STAT(0)) & 0x3) == 0x3) { 215093888caSJacky Bai VERBOSE("DRAM is in Self Refresh\n"); 2169c336f61SJacky Bai } 2179c336f61SJacky Bai 2189c336f61SJacky Bai /* 2199c336f61SJacky Bai * 13. Assert PWRCTL.selfref_sw for the DWC_ddr_umctl2 core to enter 2209c336f61SJacky Bai * the self-refresh mode. 2219c336f61SJacky Bai */ 2229c336f61SJacky Bai mmio_setbits_32(DDRC_PWRCTL(0), (1 << 5)); 2239c336f61SJacky Bai 2249c336f61SJacky Bai /* 2259c336f61SJacky Bai * 14. Wait until STAT.operating_mode[1:0]==11 indicating that the 2269c336f61SJacky Bai * controller core is in self-refresh mode. 2279c336f61SJacky Bai */ 2289c336f61SJacky Bai while ((mmio_read_32(DDRC_STAT(0)) & 0x3f) != 0x23) { 2299c336f61SJacky Bai ; 2309c336f61SJacky Bai } 2319c336f61SJacky Bai 2329c336f61SJacky Bai sw_pstate(pstate, drate); 2339c336f61SJacky Bai dram_cfg_all_mr(info, pstate); 2349c336f61SJacky Bai 2359c336f61SJacky Bai /* 23. Enable HIF commands by setting DBG1.dis_hif=0. */ 2369c336f61SJacky Bai mmio_clrbits_32(DDRC_DBG1(0), (0x1 << 1)); 2379c336f61SJacky Bai 2389c336f61SJacky Bai /* 2399c336f61SJacky Bai * 24. Reset DERATEEN.derate_enable = 1 if DERATEEN.derate_enable 2409c336f61SJacky Bai * has been set to 0 in step 6. 2419c336f61SJacky Bai * 25. If DFI PHY Master interface was active before step 11 then 2429c336f61SJacky Bai * enable it back by programming DFIPHYMSTR.phymstr_en = 1'b1. 2439c336f61SJacky Bai * 26. Write 1 to PCTRL_n.port_en. AXI port(s) are no longer blocked 2449c336f61SJacky Bai * from taking transactions (Re-enable traffic on AXI ports) 2459c336f61SJacky Bai */ 2469c336f61SJacky Bai mmio_write_32(DDRC_PCTRL_0(0), 0x1); 2479c336f61SJacky Bai 2489c336f61SJacky Bai /* 2499c336f61SJacky Bai * 27. Write 1 to SBRCTL.scrub_en. Enable SBR if desired, only 2509c336f61SJacky Bai * required if SBR instantiated. 2519c336f61SJacky Bai */ 2529c336f61SJacky Bai 2539c336f61SJacky Bai /* 2549c336f61SJacky Bai * set SWCTL.sw_done to enable quasi-dynamic register programming 2559c336f61SJacky Bai * outside reset. 2569c336f61SJacky Bai */ 2579c336f61SJacky Bai mmio_write_32(DDRC_SWCTL(0), 0x1); 2589c336f61SJacky Bai 2599c336f61SJacky Bai /* wait SWSTAT.sw_done_ack to 1 */ 2609c336f61SJacky Bai while (!(mmio_read_32(DDRC_SWSTAT(0)) & 0x1)) { 2619c336f61SJacky Bai ; 2629c336f61SJacky Bai } 2639c336f61SJacky Bai } 264