From 776b68ae59d10f956232aa208480cbd85f308c88 Mon Sep 17 00:00:00 2001 From: Achin Gupta Date: Fri, 25 Jul 2014 14:52:47 +0100 Subject: Add PSCI service specific per-CPU data This patch adds a structure defined by the PSCI service to the per-CPU data array. The structure is used to save the 'power_state' parameter specified during a 'cpu_suspend' call on the current CPU. This parameter was being saved in the cpu node in the PSCI topology tree earlier. The existing API to return the state id specified during a PSCI CPU_SUSPEND call i.e. psci_get_suspend_stateid(mpidr) has been renamed to psci_get_suspend_stateid_by_mpidr(mpidr). The new psci_get_suspend_stateid() API returns the state id of the current cpu. The psci_get_suspend_afflvl() API has been changed to return the target affinity level of the current CPU. This was specified using the 'mpidr' parameter in the old implementation. The behaviour of the get_power_on_target_afflvl() has been tweaked such that traversal of the PSCI topology tree to locate the affinity instance node for the current CPU is done only in the debug build as it is an expensive operation. Change-Id: Iaad49db75abda471f6a82d697ee6e0df554c4caf --- services/std_svc/psci/psci_setup.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'services/std_svc/psci/psci_setup.c') diff --git a/services/std_svc/psci/psci_setup.c b/services/std_svc/psci/psci_setup.c index 68f19a00..9e4955dc 100644 --- a/services/std_svc/psci/psci_setup.c +++ b/services/std_svc/psci/psci_setup.c @@ -189,9 +189,6 @@ static void psci_init_aff_map_node(unsigned long mpidr, if (state & PSCI_AFF_PRESENT) psci_set_state(&psci_aff_map[idx], PSCI_STATE_OFF); - /* Invalidate the suspend context for the node */ - psci_aff_map[idx].power_state = PSCI_INVALID_DATA; - /* * Associate a non-secure context with this affinity * instance through the context management library. @@ -199,6 +196,11 @@ static void psci_init_aff_map_node(unsigned long mpidr, linear_id = platform_get_core_pos(mpidr); assert(linear_id < PLATFORM_CORE_COUNT); + /* Invalidate the suspend context for the node */ + set_cpu_data_by_index(linear_id, + psci_svc_cpu_data.power_state, + PSCI_INVALID_DATA); + cm_set_context_by_mpidr(mpidr, (void *) &psci_ns_context[linear_id], NON_SECURE); -- cgit