diff options
author | danh-arm <dan.handley@arm.com> | 2016-09-19 11:55:56 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-09-19 11:55:56 +0100 |
commit | 7a1b2794307bf18cdea975b8897f8cd7e0579fc9 (patch) | |
tree | ca6d2abfb9315c407c7dddb303c43a673ad447ee /lib/psci | |
parent | 368d4ebfc1682bfeea1057f7f37c23ca531e9e91 (diff) | |
parent | 3cc17aae72287b993bcb2b626d7715ff9ed77790 (diff) | |
download | arm-trusted-firmware-7a1b2794307bf18cdea975b8897f8cd7e0579fc9.tar.gz |
Merge pull request #702 from jeenu-arm/psci-node-hw-state
Support for PSCI NODE_HW_STATE
Diffstat (limited to 'lib/psci')
-rw-r--r-- | lib/psci/psci_main.c | 31 | ||||
-rw-r--r-- | lib/psci/psci_private.h | 1 | ||||
-rw-r--r-- | lib/psci/psci_setup.c | 2 |
3 files changed, 34 insertions, 0 deletions
diff --git a/lib/psci/psci_main.c b/lib/psci/psci_main.c index 3ad3dd40e..23bd106ca 100644 --- a/lib/psci/psci_main.c +++ b/lib/psci/psci_main.c @@ -295,6 +295,31 @@ long psci_migrate_info_up_cpu(void) return resident_cpu_mpidr; } +int psci_node_hw_state(u_register_t target_cpu, + unsigned int power_level) +{ + int rc; + + /* Validate target_cpu */ + rc = psci_validate_mpidr(target_cpu); + if (rc != PSCI_E_SUCCESS) + return PSCI_E_INVALID_PARAMS; + + /* Validate power_level against PLAT_MAX_PWR_LVL */ + if (power_level > PLAT_MAX_PWR_LVL) + return PSCI_E_INVALID_PARAMS; + + /* + * Dispatch this call to platform to query power controller, and pass on + * to the caller what it returns + */ + assert(psci_plat_pm_ops->get_node_hw_state); + rc = psci_plat_pm_ops->get_node_hw_state(target_cpu, power_level); + assert((rc >= HW_ON && rc <= HW_STANDBY) || rc == PSCI_E_NOT_SUPPORTED + || rc == PSCI_E_INVALID_PARAMS); + return rc; +} + int psci_features(unsigned int psci_fid) { unsigned int local_caps = psci_caps; @@ -378,6 +403,9 @@ u_register_t psci_smc_handler(uint32_t smc_fid, case PSCI_MIG_INFO_UP_CPU_AARCH32: return psci_migrate_info_up_cpu(); + case PSCI_NODE_HW_STATE_AARCH32: + return psci_node_hw_state(x1, x2); + case PSCI_SYSTEM_SUSPEND_AARCH32: return psci_system_suspend(x1, x2); @@ -422,6 +450,9 @@ u_register_t psci_smc_handler(uint32_t smc_fid, case PSCI_MIG_INFO_UP_CPU_AARCH64: return psci_migrate_info_up_cpu(); + case PSCI_NODE_HW_STATE_AARCH64: + return psci_node_hw_state(x1, x2); + case PSCI_SYSTEM_SUSPEND_AARCH64: return psci_system_suspend(x1, x2); diff --git a/lib/psci/psci_private.h b/lib/psci/psci_private.h index b795c8e03..781b3b526 100644 --- a/lib/psci/psci_private.h +++ b/lib/psci/psci_private.h @@ -68,6 +68,7 @@ define_psci_cap(PSCI_AFFINITY_INFO_AARCH64) | \ define_psci_cap(PSCI_MIG_AARCH64) | \ define_psci_cap(PSCI_MIG_INFO_UP_CPU_AARCH64) | \ + define_psci_cap(PSCI_NODE_HW_STATE_AARCH64) | \ define_psci_cap(PSCI_SYSTEM_SUSPEND_AARCH64) | \ define_psci_cap(PSCI_STAT_RESIDENCY_AARCH64) | \ define_psci_cap(PSCI_STAT_COUNT_AARCH64)) diff --git a/lib/psci/psci_setup.c b/lib/psci/psci_setup.c index aa2ed5102..263ab68f9 100644 --- a/lib/psci/psci_setup.c +++ b/lib/psci/psci_setup.c @@ -263,6 +263,8 @@ int psci_setup(uintptr_t mailbox_ep) psci_caps |= define_psci_cap(PSCI_SYSTEM_OFF); if (psci_plat_pm_ops->system_reset) psci_caps |= define_psci_cap(PSCI_SYSTEM_RESET); + if (psci_plat_pm_ops->get_node_hw_state) + psci_caps |= define_psci_cap(PSCI_NODE_HW_STATE_AARCH64); #if ENABLE_PSCI_STAT psci_caps |= define_psci_cap(PSCI_STAT_RESIDENCY_AARCH64); |