PSCI: Use cpuidle context helpers in psci_cpu_suspend_enter()

The PSCI CPU suspend code isn't aware of the PMR vs DAIF game,
resulting in a system that locks up if entering CPU suspend
with GICv3 pNMI enabled.

To save the day, teach the suspend code about our new cpuidle
context helpers, which will do everything that's required just
like the usual WFI cpuidle code.

This fixes my Altra system, which would otherwise lock-up at
boot time when booted with irqchip.gicv3_pseudo_nmi=1.

Tested-by: Valentin Schneider <valentin.schneider@arm.com>
Reviewed-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Signed-off-by: Marc Zyngier <maz@kernel.org>
Reviewed-by: Sudeep Holla <sudeep.holla@arm.com>
Link: https://lore.kernel.org/r/20210615111227.2454465-4-maz@kernel.org
Signed-off-by: Will Deacon <will@kernel.org>
This commit is contained in:
Marc Zyngier 2021-06-15 12:12:26 +01:00 committed by Will Deacon
parent d4dc102772
commit c9223b6162

View File

@ -335,10 +335,15 @@ int psci_cpu_suspend_enter(u32 state)
{
int ret;
if (!psci_power_state_loses_context(state))
if (!psci_power_state_loses_context(state)) {
struct arm_cpuidle_irq_context context;
arm_cpuidle_save_irq_context(&context);
ret = psci_ops.cpu_suspend(state, 0);
else
arm_cpuidle_restore_irq_context(&context);
} else {
ret = cpu_suspend(state, psci_suspend_finisher);
}
return ret;
}