summaryrefslogtreecommitdiff
path: root/plat/imx/imx8mq/ddr/lpddr4_retention.c
diff options
context:
space:
mode:
Diffstat (limited to 'plat/imx/imx8mq/ddr/lpddr4_retention.c')
-rw-r--r--plat/imx/imx8mq/ddr/lpddr4_retention.c247
1 files changed, 0 insertions, 247 deletions
diff --git a/plat/imx/imx8mq/ddr/lpddr4_retention.c b/plat/imx/imx8mq/ddr/lpddr4_retention.c
deleted file mode 100644
index f98c079a..00000000
--- a/plat/imx/imx8mq/ddr/lpddr4_retention.c
+++ /dev/null
@@ -1,247 +0,0 @@
-/*
- * Copyright (c) 2013-2017, ARM Limited and Contributors. All rights reserved.
- * Copyright 2017-2018 NXP
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-#include <arch.h>
-#include <arch_helpers.h>
-#include <debug.h>
-#include <stdbool.h>
-#include <ddrc.h>
-#include <mmio.h>
-#include <platform_def.h>
-#include <spinlock.h>
-#include <soc.h>
-
-#include "lpddr4_dvfs.h"
-
-#define SRC_IPS_BASE_ADDR 0x30390000
-#define SRC_DDRC_RCR_ADDR (SRC_IPS_BASE_ADDR + 0x1000)
-
-#define GPC_PU_PWRHSK (IMX_GPC_BASE + 0x01FC) //added by baoxye
-#define CCM_SRC_CTRL_OFFSET (IMX_CCM_BASE + 0x800)
-#define CCM_CCGR_OFFSET (IMX_CCM_BASE + 0x4000)
-#define CCM_SRC_CTRL(n) (CCM_SRC_CTRL_OFFSET + 0x10 * n)
-#define CCM_CCGR(n) (CCM_CCGR_OFFSET + 0x10 * n)
-
-static bool trained_csr_saved = false;
-
-void ddrc_enter_retention(void)
-{
- unsigned int tmp, tmp_t, i;
-
- /* only need be save once */
- if (!trained_csr_saved) {
- lpddr4_phy_save_trained_csr();
- trained_csr_saved = true;
- }
-
- INFO("enter lpddr4_retention\n");
- /* wait DBGCAM to be empty */
- do{
- tmp = mmio_read_32(DDRC_DBGCAM(0));
- } while (tmp != 0x36000000);
-
- /* Blocks AXI ports from taking anymore transactions */
- mmio_write_32(DDRC_PCTRL_0(0), 0x00000000);
-
- /* Waits unit all AXI ports are idle */
- do {
- tmp = mmio_read_32(DDRC_PSTAT(0));
- } while (tmp & 0x10001);
-
- /* enters self refresh */
- mmio_write_32(DDRC_PWRCTL(0), 0x000000aa);
-
- tmp=0;
- while (tmp!=0x223) {
- tmp = 0x33f & (mmio_read_32((DDRC_STAT(0))));
- }
-
- mmio_write_32(DDRC_DFIMISC(0), 0x00000000);
-
- /* set SWCTL.sw_done to disable quasi-dynamic register programming outside reset. */
- mmio_write_32(DDRC_SWCTL(0), 0x00000000);
-
- mmio_write_32(DDRC_DFIMISC(0), 0x00001f00);
- mmio_write_32(DDRC_DFIMISC(0), 0x00001f20);
-
- /* wait DFISTAT.dfi_init_complete to 0 */
- tmp_t = 0;
- while (tmp_t==1) {
- tmp = mmio_read_32(DDRC_DFISTAT(0));
- tmp_t = tmp & 0x01;
- }
-
- mmio_write_32(DDRC_DFIMISC(0), 0x00001f00);
-
- /* wait DFISTAT.dfi_init_complete to 1 */
- tmp_t = 0;
- while (tmp_t==0) {
- tmp = mmio_read_32(DDRC_DFISTAT(0));
- tmp_t = tmp & 0x01;
- }
-
- /* set SWCTL.sw_done to enable quasi-dynamic register programming outside reset. */
- mmio_write_32(DDRC_SWCTL(0), 0x00000001);
-
- /* should check PhyInLP3 pub reg */
- dwc_ddrphy_apb_wr(0xd0000,0x0);
- tmp = dwc_ddrphy_apb_rd(0x90028);
- tmp = tmp & 0x1;
- if (tmp)
- INFO("C: PhyInLP3 = 1\n");
- else
- INFO("FAILED\n");
-
- dwc_ddrphy_apb_wr(0xd0000,0x1);
-
- for (i=0; i<20; i++);
-
- /* pwrdnreqn_async adbm/adbs of ddr */
- mmio_clrbits_32(GPC_PU_PWRHSK, (1 << 1));
- do {
- tmp = mmio_read_32(GPC_PU_PWRHSK);
- INFO("C: wait pwrdnackn_async clr\n");
- } while (tmp & (0x1<<18));/* wait untill pwrdnackn_async=0 */
- mmio_setbits_32(GPC_PU_PWRHSK, (1 << 1));
-
- /* remove PowerOk */
- mmio_write_32(SRC_DDRC_RCR_ADDR, 0x8F000008);
-
- for (i=0; i<20; i++);
-
- mmio_write_32(CCM_CCGR(5),0);
- mmio_write_32(CCM_SRC_CTRL(15),2);
-
- for (i=0; i<20; i++);
-
- /* enable the phy iso */
- mmio_setbits_32(0x303a0d40, 0x1);
- mmio_setbits_32(0x303a0104, (1 << 5));
-}
-
-void ddrc_exit_retention(void)
-{
- volatile unsigned int tmp, tmp_t, i;
- INFO("exit lpddr4_retention\n");
-
- for (i=0; i<50; i++);
-
- for (i=0; i<50; i++);
-
- /* assert all reset */
- /* assert [0]src_system_rst_b! */
- mmio_write_32(SRC_DDRC_RCR_ADDR + 0x04, 0x8F000001);
- mmio_write_32(SRC_DDRC_RCR_ADDR, 0x8F00000F);
- /* release [0]src_system_rst_b! */
- mmio_write_32(SRC_DDRC_RCR_ADDR + 0x04, 0x8F000000);
-
- mmio_write_32(CCM_CCGR(5),2);
- mmio_write_32(CCM_SRC_CTRL(15),2);
- INFO("C: enable all DRAM clocks \n");
-
- /* change the clock source of dram_apb_clk_root */
- mmio_write_32(0x3038a088, (0x7<<24)|(0x7<<16));
- mmio_write_32(0x3038a084, (0x4<<24)|(0x3<<16));
-
- /* disable iso */
- /* mmio_write_32(0x303A00EC,0x0000ffff); //PGC_CPU_MAPPING */
- /* reg32setbit(0x303A00F8,5);//PU_PGC_SW_PUP_REQ */
- mmio_setbits_32(0x303a00f8, (1 << 5));
-
- /* release [0]ddr1_preset_n, [3]ddr1_phy_pwrokin_n */
- mmio_write_32(SRC_DDRC_RCR_ADDR, 0x8F000006);
-
- lpddr4_cfg_umctl2();
- /* Skips the DRAM init routine and starts up in selfrefresh mode */
- /* Program INIT0.skip_dram_init = 2'b11 */
- mmio_write_32(DDRC_INIT0(0), 0xc0000000 | (mmio_read_32(DDRC_INIT0(0))));
- /* Keeps the controller in self-refresh mode */
- mmio_write_32(DDRC_PWRCTL(0), 0x000000aa);
- mmio_write_32(SRC_DDRC_RCR_ADDR, 0x8F000000); /* release all reset */
- mmio_write_32(DDRC_DBG1(0), 0x00000000);
-
- /* before write Dynamic reg, sw_done should be 0 */
- mmio_write_32(DDRC_SWCTL(0), 0x00000000);
- mmio_write_32(DDRC_DDR_SS_GPR0, 0x01);//LPDDR4 mode
- mmio_write_32(DDRC_DFIMISC(0), 0x00000000);
-
- lpddr4_phy_cfg();
-
- dwc_ddrphy_apb_wr(0xd0000,0x0);
- do {
- tmp_t = dwc_ddrphy_apb_rd(0x20097);
- INFO("C: Waiting for CalBusy = 0\n");
- } while(tmp_t != 0);
- dwc_ddrphy_apb_wr(0xd0000,0x1);
-
- /* before write Dynamic reg, sw_done should be 0 */
- mmio_write_32(DDRC_SWCTL(0), 0x00000000);
- mmio_write_32(DDRC_DFIMISC(0), 0x00000020);
-
- /* wait DFISTAT.dfi_init_complete to 1 */
- tmp_t = 0;
- while(tmp_t==0){
- tmp = mmio_read_32(DDRC_DFISTAT(0));
- tmp_t = tmp & 0x01;
- INFO("wait DFISTAT.dfi_init_complete to 1\n");
- }
-
- /* clear DFIMISC.dfi_init_start */
- mmio_write_32(DDRC_DFIMISC(0), 0x00000000);
- /* set DFIMISC.dfi_init_complete_en */
- mmio_write_32(DDRC_DFIMISC(0), 0x00000001);
- /* set SWCTL.sw_done to enable quasi-dynamic register programming outside reset. */
- mmio_write_32(DDRC_SWCTL(0), 0x00000001);
-
- /* wait SWSTAT.sw_done_ack to 1 */
- tmp_t = 0;
- while (tmp_t!=0x1) {
- tmp = mmio_read_32(DDRC_SWSTAT(0));
- tmp_t = tmp & 0x1;
- INFO("1wait SWSTAT.sw_done_ack to 1\n");
- }
-
- mmio_write_32(DDRC_PWRCTL(0), 0x000000aa);
- mmio_write_32(DDRC_SWCTL(0), 0x00000000);
- mmio_write_32(DDRC_DFIMISC(0), 0x00000001);
- mmio_write_32(DDRC_SWCTL(0), 0x00000001);
-
- /* wait SWSTAT.sw_done_ack to 1 */
- tmp_t = 0;
- while (tmp_t!=0x1) {
- tmp = mmio_read_32(DDRC_SWSTAT(0));
- tmp_t = tmp & 0x1;
- INFO("2wait SWSTAT.sw_done_ack to 1\n");
- }
-
- /* mmio_write_32(DDRC_PWRCTL(0), 0x0000008a); */
- mmio_write_32(DDRC_PWRCTL(0), 0x00000088);
-
- /* wait STAT to normal state */
- tmp_t = 0;
- while(tmp_t!=0x1){
- tmp = mmio_read_32(DDRC_STAT(0));
- tmp_t = tmp & 0x7;
- INFO("wait STAT to normal state\n");
- }
-
- mmio_write_32(DDRC_DERATEEN(0), 0x00000302);
-
- mmio_write_32(DDRC_PCTRL_0(0), 0x00000001);
- /* dis_auto-refresh is set to 0 */
- mmio_write_32(DDRC_RFSHCTL3(0), 0x00000000);
-
- /* should check PhyInLP3 pub reg */
- dwc_ddrphy_apb_wr(0xd0000, 0x0);
- dwc_ddrphy_apb_rd(0x90028);
- tmp = tmp & 0x1;
- if(!tmp)
- INFO("C: PhyInLP3 = 0\n");
- else
- INFO("FAILED\n");
- dwc_ddrphy_apb_wr(0xd0000, 0x1);
-}