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
ddr4_mr_write(uint32_t mr,uint32_t data,uint32_t mr_type,uint32_t rank,uint32_t dram_type)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
dram_cfg_all_mr(struct dram_info * info,uint32_t pstate)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
sw_pstate(uint32_t pstate,uint32_t drate)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
ddr4_swffc(struct dram_info * info,unsigned int pstate)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