blob: 3a7ef14f0cb919069f189ac1b5de13aa827890bc [file] [log] [blame]
// SPDX-License-Identifier: BSD-2-Clause
/*
* Copyright 2017 NXP
*
* Peng Fan <peng.fan@nxp.com>
*/
#include <arm32.h>
#include <console.h>
#include <drivers/imx_uart.h>
#include <io.h>
#include <kernel/cache_helpers.h>
#include <kernel/generic_boot.h>
#include <kernel/misc.h>
#include <kernel/panic.h>
#include <kernel/pm_stubs.h>
#include <kernel/thread.h>
#include <kernel/tlb_helpers.h>
#include <kernel/tz_ssvce_pl310.h>
#include <mm/core_memprot.h>
#include <mm/core_mmu.h>
#include <platform_config.h>
#include <sm/optee_smc.h>
#include <sm/pm.h>
#include <sm/psci.h>
#include <sm/sm.h>
#include <stdint.h>
#if CFG_TEE_CORE_NB_CORE > 4
#error "Max support 4 cores in one cluster now"
#endif
void sm_pm_cpu_suspend_save(struct sm_pm_ctx *ctx, uint32_t sp)
{
struct thread_core_local *p = thread_get_core_local();
p->sm_pm_ctx_phys = virt_to_phys((void *)ctx);
/* The content will be passed to sm_pm_cpu_do_resume as register sp */
ctx->sp = sp;
ctx->cpu_resume_addr =
virt_to_phys((void *)(vaddr_t)sm_pm_cpu_do_resume);
sm_pm_cpu_do_suspend(ctx->suspend_regs);
dcache_op_level1(DCACHE_OP_CLEAN_INV);
#ifdef CFG_PL310
arm_cl2_cleanbyway(core_mmu_get_va(PL310_BASE, MEM_AREA_IO_SEC));
#endif
}