summaryrefslogtreecommitdiff
path: root/services/std_svc/psci/psci_setup.c
diff options
context:
space:
mode:
authorSoby Mathew <soby.mathew@arm.com>2015-01-07 11:10:22 +0000
committerDan Handley <dan.handley@arm.com>2015-01-26 12:42:45 +0000
commit90e8258eec95bcad556426597489a34208232e39 (patch)
tree6dbd2e17c713c92cee5596be16d659cfd249c355 /services/std_svc/psci/psci_setup.c
parent8991eed7439cb565da505a2bf88e9ac87ad79c1c (diff)
Implement PSCI_FEATURES API
This patch implements the PSCI_FEATURES function which is a mandatory API in the PSCI 1.0 specification. A capability variable is constructed during initialization by examining the plat_pm_ops and spd_pm_ops exported by the platform and the Secure Payload Dispatcher. This is used by the PSCI FEATURES function to determine which PSCI APIs are supported by the platform. Change-Id: I147ffc1bd5d90b469bd3cc4bbe0a20e95c247df7
Diffstat (limited to 'services/std_svc/psci/psci_setup.c')
-rw-r--r--services/std_svc/psci/psci_setup.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/services/std_svc/psci/psci_setup.c b/services/std_svc/psci/psci_setup.c
index be504e81..02a87865 100644
--- a/services/std_svc/psci/psci_setup.c
+++ b/services/std_svc/psci/psci_setup.c
@@ -57,6 +57,12 @@ static cpu_context_t psci_ns_context[PLATFORM_CORE_COUNT];
******************************************************************************/
static aff_limits_node_t psci_aff_limits[MPIDR_MAX_AFFLVL + 1];
+/******************************************************************************
+ * Define the psci capability variable.
+ *****************************************************************************/
+uint32_t psci_caps;
+
+
/*******************************************************************************
* Routines for retrieving the node corresponding to an affinity level instance
* in the mpidr. The first one uses binary search to find the node corresponding
@@ -372,5 +378,19 @@ int32_t psci_setup(void)
platform_setup_pm(&psci_plat_pm_ops);
assert(psci_plat_pm_ops);
+ /* Initialize the psci capability */
+ psci_caps = PSCI_GENERIC_CAP;
+
+ if (psci_plat_pm_ops->affinst_off)
+ psci_caps |= define_psci_cap(PSCI_CPU_OFF);
+ if (psci_plat_pm_ops->affinst_on && psci_plat_pm_ops->affinst_on_finish)
+ psci_caps |= define_psci_cap(PSCI_CPU_ON_AARCH64);
+ if (psci_plat_pm_ops->affinst_suspend && psci_plat_pm_ops->affinst_suspend_finish)
+ psci_caps |= define_psci_cap(PSCI_CPU_SUSPEND_AARCH64);
+ if (psci_plat_pm_ops->system_off)
+ psci_caps |= define_psci_cap(PSCI_SYSTEM_OFF);
+ if (psci_plat_pm_ops->system_reset)
+ psci_caps |= define_psci_cap(PSCI_SYSTEM_RESET);
+
return 0;
}