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