From c0aff0e0b43dc24cbce889c38e3e22e92b2d6bf2 Mon Sep 17 00:00:00 2001 From: Soby Mathew Date: Wed, 17 Dec 2014 14:47:57 +0000 Subject: PSCI: Add SYSTEM_SUSPEND API support This patch adds support for SYSTEM_SUSPEND API as mentioned in the PSCI 1.0 specification. This API, on being invoked on the last running core on a supported platform, will put the system into a low power mode with memory retention. The psci_afflvl_suspend() internal API has been reused as most of the actions to suspend a system are the same as invoking the PSCI CPU_SUSPEND API with the target affinity level as 'system'. This API needs the 'power state' parameter for the target low power state. This parameter is not passed by the caller of the SYSTEM_SUSPEND API. Hence, the platform needs to implement the get_sys_suspend_power_state() platform function to provide this information. Also, the platform also needs to add support for suspending the system to the existing 'plat_pm_ops' functions: affinst_suspend() and affinst_suspend_finish(). Change-Id: Ib6bf10809cb4e9b92f463755608889aedd83cef5 --- include/bl31/services/psci.h | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) (limited to 'include/bl31') diff --git a/include/bl31/services/psci.h b/include/bl31/services/psci.h index 80bc53b8..dd1891c6 100644 --- a/include/bl31/services/psci.h +++ b/include/bl31/services/psci.h @@ -62,6 +62,8 @@ #define PSCI_SYSTEM_OFF 0x84000008 #define PSCI_SYSTEM_RESET 0x84000009 #define PSCI_FEATURES 0x8400000A +#define PSCI_SYSTEM_SUSPEND_AARCH32 0x8400000E +#define PSCI_SYSTEM_SUSPEND_AARCH64 0xc400000E /* Macro to help build the psci capabilities bitfield */ #define define_psci_cap(x) (1 << (x & 0x1f)) @@ -69,7 +71,7 @@ /* * Number of PSCI calls (above) implemented */ -#define PSCI_NUM_CALLS 16 +#define PSCI_NUM_CALLS 18 /******************************************************************************* * PSCI Migrate and friends @@ -93,12 +95,16 @@ #define PSTATE_TYPE_STANDBY 0x0 #define PSTATE_TYPE_POWERDOWN 0x1 -#define psci_get_pstate_id(pstate) ((pstate >> PSTATE_ID_SHIFT) & \ +#define psci_get_pstate_id(pstate) (((pstate) >> PSTATE_ID_SHIFT) & \ PSTATE_ID_MASK) -#define psci_get_pstate_type(pstate) ((pstate >> PSTATE_TYPE_SHIFT) & \ +#define psci_get_pstate_type(pstate) (((pstate) >> PSTATE_TYPE_SHIFT) & \ PSTATE_TYPE_MASK) -#define psci_get_pstate_afflvl(pstate) ((pstate >> PSTATE_AFF_LVL_SHIFT) & \ +#define psci_get_pstate_afflvl(pstate) (((pstate) >> PSTATE_AFF_LVL_SHIFT) & \ PSTATE_AFF_LVL_MASK) +#define psci_make_powerstate(state_id, type, afflvl) \ + (((state_id) & PSTATE_ID_MASK) << PSTATE_ID_SHIFT) |\ + (((type) & PSTATE_TYPE_MASK) << PSTATE_TYPE_SHIFT) |\ + (((afflvl) & PSTATE_AFF_LVL_MASK) << PSTATE_AFF_LVL_SHIFT) /******************************************************************************* * PSCI CPU_FEATURES feature flag specific defines @@ -193,6 +199,7 @@ typedef struct plat_pm_ops { void (*system_reset)(void) __dead2; int (*validate_power_state)(unsigned int power_state); int (*validate_ns_entrypoint)(unsigned long ns_entrypoint); + unsigned int (*get_sys_suspend_power_state)(void); } plat_pm_ops_t; /******************************************************************************* -- cgit v1.2.3