diff options
-rw-r--r-- | plat/arm/board/fvp/fvp_topology.c | 3 | ||||
-rw-r--r-- | services/std_svc/psci/psci_afflvl_on.c | 30 |
2 files changed, 17 insertions, 16 deletions
diff --git a/plat/arm/board/fvp/fvp_topology.c b/plat/arm/board/fvp/fvp_topology.c index 168864a..c90e82f 100644 --- a/plat/arm/board/fvp/fvp_topology.c +++ b/plat/arm/board/fvp/fvp_topology.c @@ -183,7 +183,7 @@ unsigned int plat_get_aff_state(unsigned int aff_lvl, * the FVP flavour its running on. We construct all the mpidrs we can handle * and rely on the PWRC.PSYSR to flag absent cpus when their status is queried. ******************************************************************************/ -int plat_arm_topology_setup(void) +void plat_arm_topology_setup(void) { unsigned char aff0, aff1, aff_state, aff0_offset = 0; unsigned long mpidr; @@ -229,5 +229,4 @@ int plat_arm_topology_setup(void) fvp_aff1_topology_map[aff1 - 1].sibling = AFFINST_INVAL; topology_setup_done = 1; - return 0; } diff --git a/services/std_svc/psci/psci_afflvl_on.c b/services/std_svc/psci/psci_afflvl_on.c index 0ee03cb..0dbd0e0 100644 --- a/services/std_svc/psci/psci_afflvl_on.c +++ b/services/std_svc/psci/psci_afflvl_on.c @@ -257,6 +257,16 @@ int psci_afflvl_on(unsigned long target_cpu, if (psci_spd_pm && psci_spd_pm->svc_on) psci_spd_pm->svc_on(target_cpu); + /* + * This function updates the state of each affinity instance + * corresponding to the mpidr in the range of affinity levels + * specified. + */ + psci_do_afflvl_state_mgmt(start_afflvl, + end_afflvl, + target_cpu_nodes, + PSCI_STATE_ON_PENDING); + /* Perform generic, architecture and platform specific handling. */ rc = psci_call_on_handlers(target_cpu_nodes, start_afflvl, @@ -265,23 +275,15 @@ int psci_afflvl_on(unsigned long target_cpu, assert(rc == PSCI_E_SUCCESS || rc == PSCI_E_INTERN_FAIL); - /* - * This function updates the state of each affinity instance - * corresponding to the mpidr in the range of affinity levels - * specified. - */ - if (rc == PSCI_E_SUCCESS) { + if (rc == PSCI_E_SUCCESS) + /* Store the re-entry information for the non-secure world. */ + cm_init_context(target_cpu, ep); + else + /* Restore the state on error. */ psci_do_afflvl_state_mgmt(start_afflvl, end_afflvl, target_cpu_nodes, - PSCI_STATE_ON_PENDING); - - /* - * Store the re-entry information for the non-secure world. - */ - cm_init_context(target_cpu, ep); - } - + PSCI_STATE_OFF); exit: /* * This loop releases the lock corresponding to each affinity level |