xref: /rk3399_ARM-atf/plat/arm/common/arm_pm.c (revision b4315306ada18bac1c74f34db717d22fd5ff3003)
1*b4315306SDan Handley /*
2*b4315306SDan Handley  * Copyright (c) 2015, ARM Limited and Contributors. All rights reserved.
3*b4315306SDan Handley  *
4*b4315306SDan Handley  * Redistribution and use in source and binary forms, with or without
5*b4315306SDan Handley  * modification, are permitted provided that the following conditions are met:
6*b4315306SDan Handley  *
7*b4315306SDan Handley  * Redistributions of source code must retain the above copyright notice, this
8*b4315306SDan Handley  * list of conditions and the following disclaimer.
9*b4315306SDan Handley  *
10*b4315306SDan Handley  * Redistributions in binary form must reproduce the above copyright notice,
11*b4315306SDan Handley  * this list of conditions and the following disclaimer in the documentation
12*b4315306SDan Handley  * and/or other materials provided with the distribution.
13*b4315306SDan Handley  *
14*b4315306SDan Handley  * Neither the name of ARM nor the names of its contributors may be used
15*b4315306SDan Handley  * to endorse or promote products derived from this software without specific
16*b4315306SDan Handley  * prior written permission.
17*b4315306SDan Handley  *
18*b4315306SDan Handley  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19*b4315306SDan Handley  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20*b4315306SDan Handley  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21*b4315306SDan Handley  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
22*b4315306SDan Handley  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23*b4315306SDan Handley  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24*b4315306SDan Handley  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25*b4315306SDan Handley  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26*b4315306SDan Handley  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27*b4315306SDan Handley  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28*b4315306SDan Handley  * POSSIBILITY OF SUCH DAMAGE.
29*b4315306SDan Handley  */
30*b4315306SDan Handley 
31*b4315306SDan Handley #include <arch_helpers.h>
32*b4315306SDan Handley #include <assert.h>
33*b4315306SDan Handley #include <errno.h>
34*b4315306SDan Handley #include <psci.h>
35*b4315306SDan Handley 
36*b4315306SDan Handley 
37*b4315306SDan Handley /*******************************************************************************
38*b4315306SDan Handley  * ARM standard platform utility function which is used to determine if any
39*b4315306SDan Handley  * platform actions should be performed for the specified affinity instance
40*b4315306SDan Handley  * given its state. Nothing needs to be done if the 'state' is not off or if
41*b4315306SDan Handley  * this is not the highest affinity level which will enter the 'state'.
42*b4315306SDan Handley  ******************************************************************************/
43*b4315306SDan Handley int32_t arm_do_affinst_actions(unsigned int afflvl, unsigned int state)
44*b4315306SDan Handley {
45*b4315306SDan Handley 	unsigned int max_phys_off_afflvl;
46*b4315306SDan Handley 
47*b4315306SDan Handley 	assert(afflvl <= MPIDR_AFFLVL1);
48*b4315306SDan Handley 
49*b4315306SDan Handley 	if (state != PSCI_STATE_OFF)
50*b4315306SDan Handley 		return -EAGAIN;
51*b4315306SDan Handley 
52*b4315306SDan Handley 	/*
53*b4315306SDan Handley 	 * Find the highest affinity level which will be suspended and postpone
54*b4315306SDan Handley 	 * all the platform specific actions until that level is hit.
55*b4315306SDan Handley 	 */
56*b4315306SDan Handley 	max_phys_off_afflvl = psci_get_max_phys_off_afflvl();
57*b4315306SDan Handley 	assert(max_phys_off_afflvl != PSCI_INVALID_DATA);
58*b4315306SDan Handley 	if (afflvl != max_phys_off_afflvl)
59*b4315306SDan Handley 		return -EAGAIN;
60*b4315306SDan Handley 
61*b4315306SDan Handley 	return 0;
62*b4315306SDan Handley }
63*b4315306SDan Handley 
64*b4315306SDan Handley /*******************************************************************************
65*b4315306SDan Handley  * ARM standard platform handler called to check the validity of the power state
66*b4315306SDan Handley  * parameter.
67*b4315306SDan Handley  ******************************************************************************/
68*b4315306SDan Handley int arm_validate_power_state(unsigned int power_state)
69*b4315306SDan Handley {
70*b4315306SDan Handley 	/* Sanity check the requested state */
71*b4315306SDan Handley 	if (psci_get_pstate_type(power_state) == PSTATE_TYPE_STANDBY) {
72*b4315306SDan Handley 		/*
73*b4315306SDan Handley 		 * It's possible to enter standby only on affinity level 0
74*b4315306SDan Handley 		 * (i.e. a CPU on ARM standard platforms).
75*b4315306SDan Handley 		 * Ignore any other affinity level.
76*b4315306SDan Handley 		 */
77*b4315306SDan Handley 		if (psci_get_pstate_afflvl(power_state) != MPIDR_AFFLVL0)
78*b4315306SDan Handley 			return PSCI_E_INVALID_PARAMS;
79*b4315306SDan Handley 	}
80*b4315306SDan Handley 
81*b4315306SDan Handley 	/*
82*b4315306SDan Handley 	 * We expect the 'state id' to be zero.
83*b4315306SDan Handley 	 */
84*b4315306SDan Handley 	if (psci_get_pstate_id(power_state))
85*b4315306SDan Handley 		return PSCI_E_INVALID_PARAMS;
86*b4315306SDan Handley 
87*b4315306SDan Handley 	return PSCI_E_SUCCESS;
88*b4315306SDan Handley }
89