/******************************************************************************* * This function is passed an array of pointers to affinity level nodes in the * topology tree for an mpidr. It releases the lock for each affinity level top * down in the range specified. ******************************************************************************/ void psci_release_afflvl_locks(int start_afflvl, int end_afflvl, aff_map_node_t *mpidr_nodes[]) { int level; for (level = end_afflvl; level >= start_afflvl; level--) { if (mpidr_nodes[level] == NULL) continue; psci_lock_release(mpidr_nodes[level]); } }
/******************************************************************************* * This function is passed a cpu_index and the highest level in the topology * tree that the operation should be applied to. It releases the locks in order * of decreasing power domain level in the range specified. ******************************************************************************/ void psci_release_pwr_domain_locks(unsigned int end_pwrlvl, unsigned int cpu_idx) { unsigned int parent_idx, parent_nodes[PLAT_MAX_PWR_LVL] = {0}; int level; /* Get the parent nodes */ psci_get_parent_pwr_domain_nodes(cpu_idx, end_pwrlvl, parent_nodes); /* Unlock top down. No unlocking required for level 0. */ for (level = end_pwrlvl; level >= PSCI_CPU_PWR_LVL + 1; level--) { parent_idx = parent_nodes[level - 1]; psci_lock_release(&psci_non_cpu_pd_nodes[parent_idx]); } }