2014-06-26 09:58:52 +01:00
|
|
|
/*
|
2018-02-19 16:27:06 +00:00
|
|
|
* Copyright (c) 2014-2018, ARM Limited and Contributors. All rights reserved.
|
2014-06-26 09:58:52 +01:00
|
|
|
*
|
2017-05-03 09:38:09 +01:00
|
|
|
* SPDX-License-Identifier: BSD-3-Clause
|
2014-06-26 09:58:52 +01:00
|
|
|
*/
|
|
|
|
|
|
|
|
#include <asm_macros.S>
|
2014-07-31 11:19:11 +01:00
|
|
|
#include <assert_macros.S>
|
2014-06-26 09:58:52 +01:00
|
|
|
#include <platform_def.h>
|
2014-07-31 11:19:11 +01:00
|
|
|
#include <psci.h>
|
2014-06-26 09:58:52 +01:00
|
|
|
|
|
|
|
.globl psci_do_pwrdown_cache_maintenance
|
|
|
|
.globl psci_do_pwrup_cache_maintenance
|
2016-04-29 19:01:30 +01:00
|
|
|
.globl psci_power_down_wfi
|
|
|
|
#if !ERROR_DEPRECATED
|
|
|
|
.globl psci_entrypoint
|
|
|
|
#endif
|
2014-06-26 09:58:52 +01:00
|
|
|
|
|
|
|
/* -----------------------------------------------------------------------
|
2015-07-29 17:05:03 +01:00
|
|
|
* void psci_do_pwrdown_cache_maintenance(unsigned int power level);
|
2014-06-26 09:58:52 +01:00
|
|
|
*
|
2015-07-13 14:10:57 +01:00
|
|
|
* This function performs cache maintenance for the specified power
|
|
|
|
* level. The levels of cache affected are determined by the power
|
|
|
|
* level which is passed as the argument i.e. level 0 results
|
|
|
|
* in a flush of the L1 cache. Both the L1 and L2 caches are flushed
|
|
|
|
* for a higher power level.
|
2014-07-31 11:19:11 +01:00
|
|
|
*
|
|
|
|
* Additionally, this function also ensures that stack memory is correctly
|
|
|
|
* flushed out to avoid coherency issues due to a change in its memory
|
|
|
|
* attributes after the data cache is disabled.
|
2014-06-26 09:58:52 +01:00
|
|
|
* -----------------------------------------------------------------------
|
|
|
|
*/
|
|
|
|
func psci_do_pwrdown_cache_maintenance
|
|
|
|
stp x29, x30, [sp,#-16]!
|
|
|
|
stp x19, x20, [sp,#-16]!
|
|
|
|
|
|
|
|
/* ---------------------------------------------
|
2016-11-18 12:58:28 +00:00
|
|
|
* Invoke CPU-specific power down operations for
|
|
|
|
* the appropriate level
|
2014-06-26 09:58:52 +01:00
|
|
|
* ---------------------------------------------
|
|
|
|
*/
|
2016-11-18 12:58:28 +00:00
|
|
|
bl prepare_cpu_pwr_dwn
|
2014-06-26 09:58:52 +01:00
|
|
|
|
|
|
|
/* ---------------------------------------------
|
|
|
|
* Do stack maintenance by flushing the used
|
|
|
|
* stack to the main memory and invalidating the
|
|
|
|
* remainder.
|
|
|
|
* ---------------------------------------------
|
|
|
|
*/
|
2015-07-13 14:10:57 +01:00
|
|
|
bl plat_get_my_stack
|
2014-06-26 09:58:52 +01:00
|
|
|
|
|
|
|
/* ---------------------------------------------
|
|
|
|
* Calculate and store the size of the used
|
|
|
|
* stack memory in x1.
|
|
|
|
* ---------------------------------------------
|
|
|
|
*/
|
|
|
|
mov x19, x0
|
|
|
|
mov x1, sp
|
|
|
|
sub x1, x0, x1
|
|
|
|
mov x0, sp
|
|
|
|
bl flush_dcache_range
|
|
|
|
|
|
|
|
/* ---------------------------------------------
|
|
|
|
* Calculate and store the size of the unused
|
|
|
|
* stack memory in x1. Calculate and store the
|
|
|
|
* stack base address in x0.
|
|
|
|
* ---------------------------------------------
|
|
|
|
*/
|
|
|
|
sub x0, x19, #PLATFORM_STACK_SIZE
|
|
|
|
sub x1, sp, x0
|
|
|
|
bl inv_dcache_range
|
|
|
|
|
|
|
|
ldp x19, x20, [sp], #16
|
|
|
|
ldp x29, x30, [sp], #16
|
|
|
|
ret
|
2015-03-24 14:03:57 +00:00
|
|
|
endfunc psci_do_pwrdown_cache_maintenance
|
2014-06-26 09:58:52 +01:00
|
|
|
|
|
|
|
|
|
|
|
/* -----------------------------------------------------------------------
|
|
|
|
* void psci_do_pwrup_cache_maintenance(void);
|
|
|
|
*
|
|
|
|
* This function performs cache maintenance after this cpu is powered up.
|
|
|
|
* Currently, this involves managing the used stack memory before turning
|
|
|
|
* on the data cache.
|
|
|
|
* -----------------------------------------------------------------------
|
|
|
|
*/
|
|
|
|
func psci_do_pwrup_cache_maintenance
|
|
|
|
stp x29, x30, [sp,#-16]!
|
|
|
|
|
|
|
|
/* ---------------------------------------------
|
|
|
|
* Ensure any inflight stack writes have made it
|
|
|
|
* to main memory.
|
|
|
|
* ---------------------------------------------
|
|
|
|
*/
|
|
|
|
dmb st
|
|
|
|
|
|
|
|
/* ---------------------------------------------
|
|
|
|
* Calculate and store the size of the used
|
|
|
|
* stack memory in x1. Calculate and store the
|
|
|
|
* stack base address in x0.
|
|
|
|
* ---------------------------------------------
|
|
|
|
*/
|
2015-07-13 14:10:57 +01:00
|
|
|
bl plat_get_my_stack
|
2014-06-26 09:58:52 +01:00
|
|
|
mov x1, sp
|
|
|
|
sub x1, x0, x1
|
|
|
|
mov x0, sp
|
|
|
|
bl inv_dcache_range
|
|
|
|
|
|
|
|
/* ---------------------------------------------
|
|
|
|
* Enable the data cache.
|
|
|
|
* ---------------------------------------------
|
|
|
|
*/
|
|
|
|
mrs x0, sctlr_el3
|
|
|
|
orr x0, x0, #SCTLR_C_BIT
|
|
|
|
msr sctlr_el3, x0
|
|
|
|
isb
|
|
|
|
|
|
|
|
ldp x29, x30, [sp], #16
|
|
|
|
ret
|
2015-03-24 14:03:57 +00:00
|
|
|
endfunc psci_do_pwrup_cache_maintenance
|
2016-04-29 19:01:30 +01:00
|
|
|
|
|
|
|
/* -----------------------------------------------------------------------
|
|
|
|
* void psci_power_down_wfi(void);
|
|
|
|
* This function is called to indicate to the power controller that it
|
|
|
|
* is safe to power down this cpu. It should not exit the wfi and will
|
|
|
|
* be released from reset upon power up.
|
|
|
|
* -----------------------------------------------------------------------
|
|
|
|
*/
|
|
|
|
func psci_power_down_wfi
|
|
|
|
dsb sy // ensure write buffer empty
|
|
|
|
wfi
|
2016-11-30 15:21:11 +00:00
|
|
|
no_ret plat_panic_handler
|
2016-04-29 19:01:30 +01:00
|
|
|
endfunc psci_power_down_wfi
|
|
|
|
|
|
|
|
/* -----------------------------------------------------------------------
|
|
|
|
* void psci_entrypoint(void);
|
|
|
|
* The deprecated entry point for PSCI on warm boot for AArch64.
|
|
|
|
* -----------------------------------------------------------------------
|
|
|
|
*/
|
|
|
|
func_deprecated psci_entrypoint
|
|
|
|
b bl31_warm_entrypoint
|
|
|
|
endfunc_deprecated psci_entrypoint
|