From 170fb93dec97568eec426148019b1670c0b17e7d Mon Sep 17 00:00:00 2001 From: Yatharth Kochar Date: Mon, 9 May 2016 18:26:35 +0100 Subject: Add optional PSCI STAT residency & count functions This patch adds following optional PSCI STAT functions: - PSCI_STAT_RESIDENCY: This call returns the amount of time spent in power_state in microseconds, by the node represented by the `target_cpu` and the highest level of `power_state`. - PSCI_STAT_COUNT: This call returns the number of times a `power_state` has been used by the node represented by the `target_cpu` and the highest power level of `power_state`. These APIs provides residency statistics for power states that has been used by the platform. They are implemented according to v1.0 of the PSCI specification. By default this optional feature is disabled in the PSCI implementation. To enable it, set the boolean flag `ENABLE_PSCI_STAT` to 1. This also sets `ENABLE_PMF` to 1. Change-Id: Ie62e9d37d6d416ccb1813acd7f616d1ddd3e8aff --- services/std_svc/psci/psci_off.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) (limited to 'services/std_svc/psci/psci_off.c') diff --git a/services/std_svc/psci/psci_off.c b/services/std_svc/psci/psci_off.c index 686666d5..36dab497 100644 --- a/services/std_svc/psci/psci_off.c +++ b/services/std_svc/psci/psci_off.c @@ -100,6 +100,11 @@ int psci_do_cpu_off(unsigned int end_pwrlvl) */ psci_do_state_coordination(end_pwrlvl, &state_info); +#if ENABLE_PSCI_STAT + /* Update the last cpu for each level till end_pwrlvl */ + psci_stats_update_pwr_down(end_pwrlvl, &state_info); +#endif + /* * Arch. management. Perform the necessary steps to flush all * cpu caches. @@ -112,6 +117,16 @@ int psci_do_cpu_off(unsigned int end_pwrlvl) */ psci_plat_pm_ops->pwr_domain_off(&state_info); +#if ENABLE_PSCI_STAT + /* + * Capture time-stamp while entering low power state. + * No cache maintenance needed because caches are off + * and writes are direct to main memory. + */ + PMF_CAPTURE_TIMESTAMP(psci_svc, PSCI_STAT_ID_ENTER_LOW_PWR, + PMF_NO_CACHE_MAINT); +#endif + exit: /* * Release the locks corresponding to each power level in the -- cgit