static void hikey_pwr_domain_suspend(const psci_power_state_t *target_state) { u_register_t mpidr = read_mpidr_el1(); unsigned int cpu = mpidr & MPIDR_CPU_MASK; unsigned int cluster = (mpidr & MPIDR_CLUSTER_MASK) >> MPIDR_AFFINITY_BITS; if (CORE_PWR_STATE(target_state) != PLAT_MAX_OFF_STATE) return; if (CORE_PWR_STATE(target_state) == PLAT_MAX_OFF_STATE) { /* Program the jump address for the target cpu */ hisi_pwrc_set_core_bx_addr(cpu, cluster, hikey_sec_entrypoint); gicv2_cpuif_disable(); if (SYSTEM_PWR_STATE(target_state) != PLAT_MAX_OFF_STATE) hisi_ipc_cpu_suspend(cpu, cluster); } /* Perform the common cluster specific operations */ if (CLUSTER_PWR_STATE(target_state) == PLAT_MAX_OFF_STATE) { hisi_ipc_spin_lock(HISI_IPC_SEM_CPUIDLE); cci_disable_snoop_dvm_reqs(MPIDR_AFFLVL1_VAL(mpidr)); hisi_ipc_spin_unlock(HISI_IPC_SEM_CPUIDLE); if (SYSTEM_PWR_STATE(target_state) == PLAT_MAX_OFF_STATE) { hisi_pwrc_set_cluster_wfi(1); hisi_pwrc_set_cluster_wfi(0); hisi_ipc_psci_system_off(); } else hisi_ipc_cluster_suspend(cpu, cluster); } }
void rcar_swdt_release(void) { uintptr_t itarget = SWDT_GICD_ITARGETSR + (ARM_IRQ_SEC_WDT & ~ITARGET_MASK); uint32_t i; /* Disable FIQ interrupt */ write_daifset(DAIF_FIQ_BIT); /* FIQ interrupts are not taken to EL3 */ write_scr_el3(read_scr_el3() & ~SCR_FIQ_BIT); swdt_disable(); gicv2_cpuif_disable(); for (i = 0; i < IGROUPR_NUM; i++) mmio_write_32(SWDT_GICD_IGROUPR + i * 4, 0U); for (i = 0; i < ISPRIORITY_NUM; i++) mmio_write_32(SWDT_GICD_ISPRIORITYR + i * 4, 0U); mmio_write_32(itarget, 0U); mmio_write_32(SWDT_GICD_CTLR, 0U); mmio_write_32(SWDT_GICC_CTLR, 0U); mmio_write_32(SWDT_GICC_PMR, 0U); }
void hikey960_pwr_domain_off(const psci_power_state_t *target_state) { unsigned long mpidr = read_mpidr_el1(); unsigned int core = mpidr & MPIDR_CPU_MASK; unsigned int cluster = (mpidr & MPIDR_CLUSTER_MASK) >> MPIDR_AFFINITY_BITS; clr_ex(); isb(); dsbsy(); gicv2_cpuif_disable(); hisi_clear_cpu_boot_flag(cluster, core); hisi_powerdn_core(cluster, core); /* check if any core is powered up */ if (hisi_test_cpu_down(cluster, core)) { cci_disable_snoop_dvm_reqs(MPIDR_AFFLVL1_VAL(read_mpidr_el1())); isb(); dsbsy(); hisi_powerdn_cluster(cluster, core); } }
static void hikey960_pwr_domain_suspend(const psci_power_state_t *target_state) { u_register_t mpidr = read_mpidr_el1(); unsigned int core = mpidr & MPIDR_CPU_MASK; unsigned int cluster = (mpidr & MPIDR_CLUSTER_MASK) >> MPIDR_AFFINITY_BITS; if (CORE_PWR_STATE(target_state) != PLAT_MAX_OFF_STATE) return; if (CORE_PWR_STATE(target_state) == PLAT_MAX_OFF_STATE) { clr_ex(); isb(); dsbsy(); gicv2_cpuif_disable(); hisi_cpuidle_lock(cluster, core); hisi_set_cpuidle_flag(cluster, core); hisi_cpuidle_unlock(cluster, core); mmio_write_32(CRG_REG_BASE + CRG_RVBAR(cluster, core), hikey960_sec_entrypoint >> 2); hisi_enter_core_idle(cluster, core); }
static void zynqmp_nopmu_pwr_domain_off(const psci_power_state_t *target_state) { uint32_t r; unsigned int cpu_id = plat_my_core_pos(); for (size_t i = 0; i <= PLAT_MAX_PWR_LVL; i++) VERBOSE("%s: target_state->pwr_domain_state[%lu]=%x\n", __func__, i, target_state->pwr_domain_state[i]); /* Prevent interrupts from spuriously waking up this cpu */ gicv2_cpuif_disable(); /* set power down request */ r = mmio_read_32(APU_PWRCTL); r |= (1 << cpu_id); mmio_write_32(APU_PWRCTL, r); }
void hikey_pwr_domain_off(const psci_power_state_t *target_state) { unsigned long mpidr; int cpu, cluster; mpidr = read_mpidr(); cluster = MPIDR_AFFLVL1_VAL(mpidr); cpu = MPIDR_AFFLVL0_VAL(mpidr); gicv2_cpuif_disable(); hisi_ipc_cpu_off(cpu, cluster); if (CLUSTER_PWR_STATE(target_state) == PLAT_MAX_OFF_STATE) { hisi_ipc_spin_lock(HISI_IPC_SEM_CPUIDLE); cci_disable_snoop_dvm_reqs(MPIDR_AFFLVL1_VAL(mpidr)); hisi_ipc_spin_unlock(HISI_IPC_SEM_CPUIDLE); hisi_ipc_cluster_off(cpu, cluster); } }
static void zynqmp_pwr_domain_off(const psci_power_state_t *target_state) { unsigned int cpu_id = plat_my_core_pos(); const struct pm_proc *proc = pm_get_proc(cpu_id); for (size_t i = 0; i <= PLAT_MAX_PWR_LVL; i++) VERBOSE("%s: target_state->pwr_domain_state[%lu]=%x\n", __func__, i, target_state->pwr_domain_state[i]); /* Prevent interrupts from spuriously waking up this cpu */ gicv2_cpuif_disable(); /* * Send request to PMU to power down the appropriate APU CPU * core. * According to PSCI specification, CPU_off function does not * have resume address and CPU core can only be woken up * invoking CPU_on function, during which resume address will * be set. */ pm_self_suspend(proc->node_id, MAX_LATENCY, 0, 0); }
static void sunxi_pwr_domain_off(const psci_power_state_t *target_state) { gicv2_cpuif_disable(); }
/****************************************************************************** * ARM common helper to disable the GICv2 CPU interface *****************************************************************************/ void plat_arm_gic_cpuif_disable(void) { gicv2_cpuif_disable(); }
/****************************************************************************** * RockChip common helper to disable the GICv2 CPU interface *****************************************************************************/ void plat_rockchip_gic_cpuif_disable(void) { gicv2_cpuif_disable(); }