Commit b2187ab9 authored by Achin Gupta's avatar Achin Gupta Committed by Dan Handley
Browse files

fvp: clear a pending cluster power off request

The last CPU in a cluster is responsible for issuing the cluster power
down request to the FVP power controller. If another CPU in this
cluster wakes up before the last CPU enters WFI then the cluster power
down request remains pending. If this request is not cancelled and the
newly woken up CPU enters a simple WFI later, the power controller
powers the cluster down. This leads to unpredictable behaviour.

This patch fixes this issue by ensuring that the first CPU to wake up
in a cluster writes its MPIDR to the power controller's PPONR. This
cancels any pending cluster power down request.

Change-Id: I7e787adfd6c9a0bd7308390e3309d46f35c01086
parent 75f7367b
...@@ -273,6 +273,20 @@ int fvp_affinst_on_finish(unsigned long mpidr, ...@@ -273,6 +273,20 @@ int fvp_affinst_on_finish(unsigned long mpidr,
case MPIDR_AFFLVL1: case MPIDR_AFFLVL1:
/* Enable coherency if this cluster was off */ /* Enable coherency if this cluster was off */
if (state == PSCI_STATE_OFF) { if (state == PSCI_STATE_OFF) {
/*
* This CPU might have woken up whilst the
* cluster was attempting to power down. In
* this case the FVP power controller will
* have a pending cluster power off request
* which needs to be cleared by writing to the
* PPONR register. This prevents the power
* controller from interpreting a subsequent
* entry of this cpu into a simple wfi as a
* power down request.
*/
fvp_pwrc_write_pponr(mpidr);
cci_setup = platform_get_cfgvar(CONFIG_HAS_CCI); cci_setup = platform_get_cfgvar(CONFIG_HAS_CCI);
if (cci_setup) { if (cci_setup) {
cci_enable_coherency(mpidr); cci_enable_coherency(mpidr);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment