1*83d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+ 2a7787b78STang Yuantian /* 3a7787b78STang Yuantian * Copyright 2014 Freescale Semiconductor, Inc. 4a7787b78STang Yuantian */ 5a7787b78STang Yuantian 6a7787b78STang Yuantian #include <common.h> 7a7787b78STang Yuantian #include <asm/immap_85xx.h> 8a7787b78STang Yuantian #include "sleep.h" 9ae42eb03SZhao Qiang #ifdef CONFIG_U_QE 102459afb1SQianyu Gong #include <fsl_qe.h> 11ae42eb03SZhao Qiang #endif 12a7787b78STang Yuantian 13a7787b78STang Yuantian DECLARE_GLOBAL_DATA_PTR; 14a7787b78STang Yuantian board_mem_sleep_setup(void)15a7787b78STang Yuantianvoid __weak board_mem_sleep_setup(void) 16a7787b78STang Yuantian { 17a7787b78STang Yuantian } 18a7787b78STang Yuantian board_sleep_prepare(void)19a7787b78STang Yuantianvoid __weak board_sleep_prepare(void) 20a7787b78STang Yuantian { 21a7787b78STang Yuantian } 22a7787b78STang Yuantian is_warm_boot(void)23a7787b78STang Yuantianbool is_warm_boot(void) 24a7787b78STang Yuantian { 25a7787b78STang Yuantian struct ccsr_gur __iomem *gur = (void *)CONFIG_SYS_MPC85xx_GUTS_ADDR; 26a7787b78STang Yuantian 27a7787b78STang Yuantian if (in_be32(&gur->scrtsr[0]) & DCFG_CCSR_CRSTSR_WDRFR) 28a7787b78STang Yuantian return 1; 29a7787b78STang Yuantian 30a7787b78STang Yuantian return 0; 31a7787b78STang Yuantian } 32a7787b78STang Yuantian fsl_dp_disable_console(void)33a7787b78STang Yuantianvoid fsl_dp_disable_console(void) 34a7787b78STang Yuantian { 35a7787b78STang Yuantian gd->flags |= GD_FLG_SILENT | GD_FLG_DISABLE_CONSOLE; 36a7787b78STang Yuantian } 37a7787b78STang Yuantian 38a7787b78STang Yuantian /* 39a7787b78STang Yuantian * When wakeup from deep sleep, the first 128 bytes space 40a7787b78STang Yuantian * will be used to do DDR training which corrupts the data 41a7787b78STang Yuantian * in there. This function will restore them. 42a7787b78STang Yuantian */ dp_ddr_restore(void)43a7787b78STang Yuantianstatic void dp_ddr_restore(void) 44a7787b78STang Yuantian { 451a56fceaSTang Yuantian u64 *src, *dst; 46a7787b78STang Yuantian int i; 47a7787b78STang Yuantian struct ccsr_scfg __iomem *scfg = (void *)CONFIG_SYS_MPC85xx_SCFG; 48a7787b78STang Yuantian 49a7787b78STang Yuantian /* get the address of ddr date from SPARECR3 */ 501a56fceaSTang Yuantian src = (u64 *)(in_be32(&scfg->sparecr[2]) + DDR_BUFF_LEN - 8); 511a56fceaSTang Yuantian dst = (u64 *)(CONFIG_SYS_SDRAM_BASE + DDR_BUFF_LEN - 8); 52a7787b78STang Yuantian 53a7787b78STang Yuantian for (i = 0; i < DDR_BUFF_LEN / 8; i++) 541a56fceaSTang Yuantian *dst-- = *src--; 55a7787b78STang Yuantian 56a7787b78STang Yuantian flush_dcache(); 57a7787b78STang Yuantian } 58a7787b78STang Yuantian dp_resume_prepare(void)59a7787b78STang Yuantianstatic void dp_resume_prepare(void) 60a7787b78STang Yuantian { 61a7787b78STang Yuantian dp_ddr_restore(); 62a7787b78STang Yuantian 63a7787b78STang Yuantian board_sleep_prepare(); 64a7787b78STang Yuantian 65a7787b78STang Yuantian l2cache_init(); 66a7787b78STang Yuantian #if defined(CONFIG_RAMBOOT_PBL) 67a7787b78STang Yuantian disable_cpc_sram(); 68a7787b78STang Yuantian #endif 69a7787b78STang Yuantian enable_cpc(); 70ae42eb03SZhao Qiang 71ae42eb03SZhao Qiang #ifdef CONFIG_U_QE 72ae42eb03SZhao Qiang u_qe_resume(); 73ae42eb03SZhao Qiang #endif 74ae42eb03SZhao Qiang 75a7787b78STang Yuantian } 76a7787b78STang Yuantian fsl_dp_resume(void)77a7787b78STang Yuantianint fsl_dp_resume(void) 78a7787b78STang Yuantian { 79a7787b78STang Yuantian u32 start_addr; 80a7787b78STang Yuantian void (*kernel_resume)(void); 81a7787b78STang Yuantian struct ccsr_scfg __iomem *scfg = (void *)CONFIG_SYS_MPC85xx_SCFG; 82a7787b78STang Yuantian 83a7787b78STang Yuantian if (!is_warm_boot()) 84a7787b78STang Yuantian return 0; 85a7787b78STang Yuantian 86a7787b78STang Yuantian dp_resume_prepare(); 87a7787b78STang Yuantian 88a7787b78STang Yuantian /* Get the entry address and jump to kernel */ 89a7787b78STang Yuantian start_addr = in_be32(&scfg->sparecr[1]); 90a7787b78STang Yuantian debug("Entry address is 0x%08x\n", start_addr); 91a7787b78STang Yuantian kernel_resume = (void (*)(void))start_addr; 92a7787b78STang Yuantian kernel_resume(); 93a7787b78STang Yuantian 94a7787b78STang Yuantian return 0; 95a7787b78STang Yuantian } 96