diff options
Diffstat (limited to 'lib/psci')
-rw-r--r-- | lib/psci/psci_main.c | 2 | ||||
-rw-r--r-- | lib/psci/psci_stat.c | 7 |
2 files changed, 8 insertions, 1 deletions
diff --git a/lib/psci/psci_main.c b/lib/psci/psci_main.c index d25d1775..607d0cd5 100644 --- a/lib/psci/psci_main.c +++ b/lib/psci/psci_main.c @@ -414,10 +414,12 @@ u_register_t psci_smc_handler(uint32_t smc_fid, case PSCI_SYSTEM_OFF: psci_system_off(); /* We should never return from psci_system_off() */ + break; case PSCI_SYSTEM_RESET: psci_system_reset(); /* We should never return from psci_system_reset() */ + break; case PSCI_FEATURES: return psci_features(x1); diff --git a/lib/psci/psci_stat.c b/lib/psci/psci_stat.c index 3e79c5d7..e925d34e 100644 --- a/lib/psci/psci_stat.c +++ b/lib/psci/psci_stat.c @@ -24,7 +24,8 @@ typedef struct psci_stat { * Following is used to keep track of the last cpu * that goes to power down in non cpu power domains. */ -static int last_cpu_in_non_cpu_pd[PSCI_NUM_NON_CPU_PWR_DOMAINS] = {-1}; +static int last_cpu_in_non_cpu_pd[PSCI_NUM_NON_CPU_PWR_DOMAINS] = { + [0 ... PSCI_NUM_NON_CPU_PWR_DOMAINS-1] = -1}; /* * Following are used to store PSCI STAT values for @@ -129,6 +130,10 @@ void psci_stats_update_pwr_up(unsigned int end_pwrlvl, * prior to this CPU powering on. */ parent_idx = psci_cpu_pd_nodes[cpu_idx].parent_node; + /* Return early if this is the first power up. */ + if (last_cpu_in_non_cpu_pd[parent_idx] == -1) + return; + for (lvl = PSCI_CPU_PWR_LVL + 1; lvl <= end_pwrlvl; lvl++) { local_state = state_info->pwr_domain_state[lvl]; if (is_local_state_run(local_state)) { |