Skip to content

Commit

Permalink
intel_adsp/ace: power: Lock interruption when power gate fails
Browse files Browse the repository at this point in the history
In case the core is not power gated, waiti will restore intlevel. In
this case we lock interruption after it.

In the bug scenario, the host starts streaming and via SOF APIs, keeps a
lock to prevent Zephyr from entering PM_STATE_RUNTIME_IDLE. During the
test case, host removes this block and core0 is allowed to enter IDLE
state.

When core0 enters power gated state, interrrupts are left enabled (so
the core can be woken up when something happens). This leaves a race
where suitably timed interrupt will actually block entry to power gated
state and k_cpu_idle() in power_gate_entry() will return. This is rare,
but happens often enough that the relatively short test plan run on SOF
pull-requests will trigger this case.

Fixes zephyrproject-rtos#69807

Signed-off-by: Flavio Ceolin <[email protected]>
Signed-off-by: Anas Nashif <[email protected]>
  • Loading branch information
Flavio Ceolin authored and dleach02 committed Mar 12, 2024
1 parent c15f029 commit 07426a8
Showing 1 changed file with 7 additions and 0 deletions.
7 changes: 7 additions & 0 deletions soc/intel/intel_adsp/ace/power.c
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,13 @@ void power_gate_entry(uint32_t core_id)
soc_cpus_active[core_id] = false;
sys_cache_data_flush_range(soc_cpus_active, sizeof(soc_cpus_active));
k_cpu_idle();

/* It is unlikely we get in here, but when this happens
* we need to lock interruptions again.
*
* @note Zephyr looks PS.INTLEVEL to check if interruptions are locked.
*/
(void)arch_irq_lock();
z_xt_ints_off(0xffffffff);
}

Expand Down

0 comments on commit 07426a8

Please sign in to comment.