summaryrefslogtreecommitdiff
path: root/include/bl31
diff options
context:
space:
mode:
authorAchin Gupta <achin.gupta@arm.com>2014-07-31 11:19:11 +0100
committerSoby Mathew <soby.mathew@arm.com>2014-08-19 14:29:23 +0100
commit0a46e2c3408ed719294de834177363d9adfeca06 (patch)
tree6052dce8441b1076ca9845017ee7e1b13ab96eea /include/bl31
parent84c9f1003c911432a4036d03c5394894cb5757d2 (diff)
Add APIs to preserve highest affinity level in OFF state
This patch adds APIs to find, save and retrieve the highest affinity level which will enter or exit from the physical OFF state during a PSCI power management operation. The level is stored in per-cpu data. It then reworks the PSCI implementation to perform cache maintenance only when the handler for the highest affinity level to enter/exit the OFF state is called. For example. during a CPU_SUSPEND operation, state management is done prior to calling the affinity level specific handlers. The highest affinity level which will be turned off is determined using the psci_find_max_phys_off_afflvl() API. This level is saved using the psci_set_max_phys_off_afflvl() API. In the code that does generic handling for each level, prior to performing cache maintenance it is first determined if the current affinity level matches the value returned by psci_get_max_phys_off_afflvl(). Cache maintenance is done if the values match. This change allows the last CPU in a cluster to perform cache maintenance independently. Earlier, cache maintenance was started in the level 0 handler and finished in the level 1 handler. This change in approach will facilitate implementation of tf-issues#98. Change-Id: I57233f0a27b3ddd6ddca6deb6a88b234525b0ae6
Diffstat (limited to 'include/bl31')
-rw-r--r--include/bl31/services/psci.h3
1 files changed, 3 insertions, 0 deletions
diff --git a/include/bl31/services/psci.h b/include/bl31/services/psci.h
index a89ba4e..88b2107 100644
--- a/include/bl31/services/psci.h
+++ b/include/bl31/services/psci.h
@@ -138,6 +138,8 @@
******************************************************************************/
typedef struct psci_cpu_data {
uint32_t power_state;
+ uint32_t max_phys_off_afflvl; /* Highest affinity level in physically
+ powered off state */
} psci_cpu_data_t;
/*******************************************************************************
@@ -203,6 +205,7 @@ void psci_register_spd_pm_hook(const spd_pm_ops_t *);
int psci_get_suspend_stateid_by_mpidr(unsigned long);
int psci_get_suspend_stateid(void);
int psci_get_suspend_afflvl(void);
+uint32_t psci_get_max_phys_off_afflvl(void);
uint64_t psci_smc_handler(uint32_t smc_fid,
uint64_t x1,