Repository navigation
S0ix rework - #1631
S0ix rework#1631
Conversation
4055f3e to
32dd5f0
Compare
|
SOFCI TEST |
keyonjie
left a comment
There was a problem hiding this comment.
@ranj063 Thank you for working on this, it looks work to me, my biggest open is that should we put these D0I3 related stuff in SOF generic or better to put them into Intel cAVS platform only.
The idea of scheduling D0I3 delayed work on each IPC sent worth more discussions from stakeholders, concerns from me include how should we handle those received IPC(from FW) and the power state changes during the delayed timeout or concurrent read/write without protection.
32dd5f0 to
d58d4d6
Compare
commented
Dec 17, 2019
|
@keyonjie I have added the mutex now and consolidated the DSP power state transition to one place in hda_dsp_set_power_state(). There should be no other place where we should be handling the DSP state transition other than this. Let me know what you think of this and then we can take it to Pierre |
8b2c8d4 to
46152b8
Compare
commented
Dec 17, 2019
|
@plbossart I think this PR is ready for review now. Keyon and I agree upon everything except the placement of the d0i3_work. While I have it as part of the top-level SOF device, he'd like it to be in the hda device. We could use your advise on what you think. |
left a comment
There was a problem hiding this comment.
Sorry @ranj063 and @keyonjie you are not going to like my feedback. I realize there's a lot of work but I wonder if some of the directions are the right ones.
My main concern is that you chose design patterns that lead to mistakes, such as a 3-value state which you test with an if/else, or overloading state and transitions. if you test state != D3, then the else covers two cases. if you are IN S0, it's different from doing a suspend TO S0 (which really means S0ix which oddly is not even defined)
I am also not sold on the notion of removing the D0 substrates, this is a convenient change on paper that leads to quite a few confusions. If you want to store all the states in one variable, then maybe flags are required.
I really expected more discipline in hardening concepts, this needs a lot more work I am afraid.
commented
Dec 17, 2019
|
@plbossart Thanks for your feedback but I have a simple request from you. This series is not easy to review without understanding the entire flow. Some of the patches probably need squashing but I Ieft them separate to make it easier to read. The first few patches only prepare for whats coming later without actually meddling with the flow. So what looks like hard-coded values will be later on changed as and when the flow changes. I could add some comments to maybe be easier to follow. Please stay tuned for a better commented version. |
commented
Dec 18, 2019
well that's not a simple request if |
46152b8 to
cf54b20
Compare
commented
Dec 18, 2019
|
@plbossart @keyonjie I've update this PR now with the suggested flow changes, name changes and some comments to make it a bit easier to follow. Let me know what you think |
commented
Dec 18, 2019
@plbossart well unfortunately with this series there are too many fixes/additions/removals. So yes, a bit of overview of the overall flow is needed. I said this before as well, as far as the S0ix implementation goes, with the number of flags and helpers we have, its hard for anyone outside of the 3 of us to tell whats going on. Anyway, with the latest version of the patches, I've added some FIXME's in places where the changes are made in the subsequent patches. Let me know if this makes better sense |
cf54b20 to
eb8a873
Compare
commented
Dec 18, 2019
|
@keyonjie please take a look now. I've modified IPC tx to use mod_delayed_work instead of schedule_delayed_work to avoid multiple workqueue items. I've not added the kernel module parameter yet. I'll add it after discussing it with Pierre. |
9cc864c to
5849e10
Compare
left a comment
There was a problem hiding this comment.
The initial code rework could be done differently.
What you want first is to remove the D0i3-specific parts form snd_sof_suspend /snd_sod_resume
That would really unify the code first, and then you can start changing the functionality.
I am not happy that I let this initial code go through, it was a bad design to have this multi-stage decision making. Anyway, the past is the past, let's fix this.
commented
Jan 3, 2020
Sorry @keyonjie I don't see the need for S0ix, there was the opportunistic D0i3 support that could be tested... I can't figure out why we are so fixated on S0ix when there is a way to test without it... |
commented
Jan 6, 2020
|
@plbossart opportunistic D0i3 is one scenario, we have S0ix scenarios also. We have a test case list to verify this PR, in which S0ix WoV ones included. |
commented
Jan 6, 2020
We had two weeks to test this PR. Nothing happened apparently, so I am leaning on merging this PR to force the validation work to happen... |
commented
Jan 6, 2020
|
@plbossart ack |
commented
Jan 7, 2020
I am fine if you are aligned on that. |
ff67bc2 to
bf00b5e
Compare
commented
Jan 9, 2020
|
SOFCI TEST |
commented
Jan 9, 2020
Unify the suspend/resume routines for both the D0I3/D3 DSP targets in sof_suspend()/sof_resume(). Signed-off-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com>
Setting the prepared flag to false marks the streams for the hw_params to be reset upon resuming. In the case of the D0i3-compatible streams that ignored suspend to keep the pipeline active in the DSP during suspend, this should not be done. Signed-off-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com>
Add the system_suspend_target field to struct snd_sof_dev to track the intended system suspend power target. This will be used as one of the criteria for determining the final DSP power state. Signed-off-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com>
Add a new enum sof_dsp_power_states for all the possible the DSP device states. The SOF driver currently handles only the D0 and D3 states and support for other states will be added later as needed. Also, add a helper to determine the target DSP power state based on the system suspend target. The snd_sof_dsp_d0i3_on_suspend() function is renamed to snd_sof_stream_suspend_ignored() to be more indicative of what it does and it used to determine the target DSP state during system suspend. Signed-off-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com>
The DSP device substates such as D0I0/D0I3 are platform-specific. Therefore, the d0_substate field of struct snd_sof_dev is replaced with the dsp_power_state field which represents the current state of the DSP. This field holds both the device state and the platform-specific substate values. With the DSP device substates being platform-specific, the DSP power state transitions need to be performed in the platform-specific suspend/resume ops as well. In order to achieve this, the ops signature has to be modified to pass the target device state as an argument. The target substate will be determined by the platform-specific ops before performing the transition. For example, in the case of the system suspending to S0IX, the top-level SOF device suspend callback needs to only determine if the DSP will be entering D3 or remain in D0. The target substate in case the device needs to remain in D0 (D0I0 or D0I3) will be determined by the platform-specific suspend op. With the addition of the extended set of power states for the DSP, the set_power_state op for HDA platforms has to be extended to handle only the appropriate state transitions. So, the implementation for the Intel HDA platforms is also modified. Signed-off-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com>
Add a helper function to check if only D0i3-compatible streams are active. Signed-off-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com>
Amend the DSP state transition diagram in preparation for introducing the feature to support opportunistic DSP D0I3 state when the system is in S0. Signed-off-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com>
This patch implements support for DSP D0i3 when the system is in S0. The basic idea is to schedule a delayed work after every successful IPC TX that checks if there are only D0I3-compatible streams active and if so transition the DSP to D0I3. With the introduction of DSP D0I3 in S0, we need to ensure that the DSP is in D0I0 before sending any new IPCs. The exception for this would be the compact IPCs that are used to set the DSP in D0I3/D0I0 states. Signed-off-by: Keyon Jie <yang.jie@linux.intel.com> Signed-off-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com>
…debug Trace DMA is disabled by default when the DSP is in D0I3. Add a debug option to keep trace DMA enabled when the DSP is in D0I3 during S0. Signed-off-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com> Signed-off-by: Keyon Jie <yang.jie@linux.intel.com>
commented
Jan 10, 2020
|
SOFCI TEST |
|
Tested on several platforms:
|
commented
Jan 10, 2020
|
ok, let's merge, it's been reviewed to death already. |
This PR replaces #1524