[Sound-open-firmware] About sof and D0 D3 states, 'standby' and 'suspend to RAM'
Pierre-Louis Bossart
pierre-louis.bossart at linux.intel.com
Thu Apr 23 22:39:33 CEST 2020
Hi Josep,
> I have found[1] that sof driver works (for now?) only two power
> states: D0 (DSP ON) and D3 (DSP OFF).
> In a laptop with battery, not connected to AC, I have many
> "D0->D3->D0" state changes during system operation [3].When entering
> into to D0, all firmware is loaded again, DSP set up and so (obvious,
> as DSPs where off).
>
> My guess is that this transition happens in a power state transition
> lower than Suspend to RAM, i.e., Suspend-to-idle or Standby. [2]
>
> Should not be the transition to D3 state done in a kernel transition
> to S3 or higher only (Suspend to RAM, hibernate)?
Adding to Paul Olaru's answer: it's a feature not a bug ;-)
There are two types of suspend/resume operations, tied to transitions
between S (platform) and D (device) states.
a) system suspend/resume, where the platform goes to a different S
state. On system suspend, the platform goes e.g. to S3 to hibernate, and
that forces the device state to go to D3 - platform and device states
are not completely independent.
b) pm_runtime suspend/resume. Here the platform remains in S0 (active)
but since when the audio subsystem is not used, the pm_runtime framework
will trigger a transition to D3, typically after a timeout. Conversely
every time you want to play/record the ALSA/ASoC framework will do a
pm_runtime_get_sync() and force the DSP to be powered, initialized, etc.
Not all platforms have the same power management capabilities. On Intel
recent hardware, the DSP is power-gated so all state is lost. That's why
we have to re-download it on each D0 transition. If you look at older
hardware, we didn't have power gating, only clock gating so
re-downloading the firmware was not necessarily needed for pm_runtime,
and only needed on system resume.
If you look at sound/soc/sof/pm.c you will see we have two hooks for
each type of suspend/resume, and calls into the platform specific parts
for the implementation.
To be complete I should also add that there are additional states such
as S0ix and D0ix but that's likely not enabled on your HDaudio-based
platform. There's also G, P and C states if you really want to get into
the complicated stuff [1]
Hope this helps
-Pierre
[1]
https://en.wikipedia.org/wiki/Advanced_Configuration_and_Power_Interface#Power_states
More information about the Sound-open-firmware
mailing list