1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18#include <linux/module.h>
19#include <sound/hdaudio_ext.h>
20#include <sound/hda_register.h>
21#include "../sof-audio.h"
22#include "../ops.h"
23#include "hda.h"
24#include "hda-ipc.h"
25
26static bool hda_enable_trace_D0I3_S0;
27#if IS_ENABLED(CONFIG_SND_SOC_SOF_DEBUG)
28module_param_named(enable_trace_D0I3_S0, hda_enable_trace_D0I3_S0, bool, 0444);
29MODULE_PARM_DESC(enable_trace_D0I3_S0,
30 "SOF HDA enable trace when the DSP is in D0I3 in S0");
31#endif
32
33
34
35
36
37int hda_dsp_core_reset_enter(struct snd_sof_dev *sdev, unsigned int core_mask)
38{
39 u32 adspcs;
40 u32 reset;
41 int ret;
42
43
44 reset = HDA_DSP_ADSPCS_CRST_MASK(core_mask);
45 snd_sof_dsp_update_bits_unlocked(sdev, HDA_DSP_BAR,
46 HDA_DSP_REG_ADSPCS,
47 reset, reset);
48
49
50 ret = snd_sof_dsp_read_poll_timeout(sdev, HDA_DSP_BAR,
51 HDA_DSP_REG_ADSPCS, adspcs,
52 ((adspcs & reset) == reset),
53 HDA_DSP_REG_POLL_INTERVAL_US,
54 HDA_DSP_RESET_TIMEOUT_US);
55 if (ret < 0) {
56 dev_err(sdev->dev,
57 "error: %s: timeout on HDA_DSP_REG_ADSPCS read\n",
58 __func__);
59 return ret;
60 }
61
62
63 adspcs = snd_sof_dsp_read(sdev, HDA_DSP_BAR,
64 HDA_DSP_REG_ADSPCS);
65 if ((adspcs & HDA_DSP_ADSPCS_CRST_MASK(core_mask)) !=
66 HDA_DSP_ADSPCS_CRST_MASK(core_mask)) {
67 dev_err(sdev->dev,
68 "error: reset enter failed: core_mask %x adspcs 0x%x\n",
69 core_mask, adspcs);
70 ret = -EIO;
71 }
72
73 return ret;
74}
75
76int hda_dsp_core_reset_leave(struct snd_sof_dev *sdev, unsigned int core_mask)
77{
78 unsigned int crst;
79 u32 adspcs;
80 int ret;
81
82
83 snd_sof_dsp_update_bits_unlocked(sdev, HDA_DSP_BAR,
84 HDA_DSP_REG_ADSPCS,
85 HDA_DSP_ADSPCS_CRST_MASK(core_mask),
86 0);
87
88
89 crst = HDA_DSP_ADSPCS_CRST_MASK(core_mask);
90 ret = snd_sof_dsp_read_poll_timeout(sdev, HDA_DSP_BAR,
91 HDA_DSP_REG_ADSPCS, adspcs,
92 !(adspcs & crst),
93 HDA_DSP_REG_POLL_INTERVAL_US,
94 HDA_DSP_RESET_TIMEOUT_US);
95
96 if (ret < 0) {
97 dev_err(sdev->dev,
98 "error: %s: timeout on HDA_DSP_REG_ADSPCS read\n",
99 __func__);
100 return ret;
101 }
102
103
104 adspcs = snd_sof_dsp_read(sdev, HDA_DSP_BAR,
105 HDA_DSP_REG_ADSPCS);
106 if ((adspcs & HDA_DSP_ADSPCS_CRST_MASK(core_mask)) != 0) {
107 dev_err(sdev->dev,
108 "error: reset leave failed: core_mask %x adspcs 0x%x\n",
109 core_mask, adspcs);
110 ret = -EIO;
111 }
112
113 return ret;
114}
115
116int hda_dsp_core_stall_reset(struct snd_sof_dev *sdev, unsigned int core_mask)
117{
118
119 snd_sof_dsp_update_bits_unlocked(sdev, HDA_DSP_BAR,
120 HDA_DSP_REG_ADSPCS,
121 HDA_DSP_ADSPCS_CSTALL_MASK(core_mask),
122 HDA_DSP_ADSPCS_CSTALL_MASK(core_mask));
123
124
125 return hda_dsp_core_reset_enter(sdev, core_mask);
126}
127
128int hda_dsp_core_run(struct snd_sof_dev *sdev, unsigned int core_mask)
129{
130 int ret;
131
132
133 ret = hda_dsp_core_reset_leave(sdev, core_mask);
134 if (ret < 0)
135 return ret;
136
137
138 dev_dbg(sdev->dev, "unstall/run core: core_mask = %x\n", core_mask);
139 snd_sof_dsp_update_bits_unlocked(sdev, HDA_DSP_BAR,
140 HDA_DSP_REG_ADSPCS,
141 HDA_DSP_ADSPCS_CSTALL_MASK(core_mask),
142 0);
143
144
145 if (!hda_dsp_core_is_enabled(sdev, core_mask)) {
146 hda_dsp_core_stall_reset(sdev, core_mask);
147 dev_err(sdev->dev, "error: DSP start core failed: core_mask %x\n",
148 core_mask);
149 ret = -EIO;
150 }
151
152 return ret;
153}
154
155
156
157
158
159int hda_dsp_core_power_up(struct snd_sof_dev *sdev, unsigned int core_mask)
160{
161 unsigned int cpa;
162 u32 adspcs;
163 int ret;
164
165
166 snd_sof_dsp_update_bits(sdev, HDA_DSP_BAR, HDA_DSP_REG_ADSPCS,
167 HDA_DSP_ADSPCS_SPA_MASK(core_mask),
168 HDA_DSP_ADSPCS_SPA_MASK(core_mask));
169
170
171 cpa = HDA_DSP_ADSPCS_CPA_MASK(core_mask);
172 ret = snd_sof_dsp_read_poll_timeout(sdev, HDA_DSP_BAR,
173 HDA_DSP_REG_ADSPCS, adspcs,
174 (adspcs & cpa) == cpa,
175 HDA_DSP_REG_POLL_INTERVAL_US,
176 HDA_DSP_RESET_TIMEOUT_US);
177 if (ret < 0) {
178 dev_err(sdev->dev,
179 "error: %s: timeout on HDA_DSP_REG_ADSPCS read\n",
180 __func__);
181 return ret;
182 }
183
184
185 adspcs = snd_sof_dsp_read(sdev, HDA_DSP_BAR,
186 HDA_DSP_REG_ADSPCS);
187 if ((adspcs & HDA_DSP_ADSPCS_CPA_MASK(core_mask)) !=
188 HDA_DSP_ADSPCS_CPA_MASK(core_mask)) {
189 dev_err(sdev->dev,
190 "error: power up core failed core_mask %xadspcs 0x%x\n",
191 core_mask, adspcs);
192 ret = -EIO;
193 }
194
195 return ret;
196}
197
198int hda_dsp_core_power_down(struct snd_sof_dev *sdev, unsigned int core_mask)
199{
200 u32 adspcs;
201 int ret;
202
203
204 snd_sof_dsp_update_bits_unlocked(sdev, HDA_DSP_BAR,
205 HDA_DSP_REG_ADSPCS,
206 HDA_DSP_ADSPCS_SPA_MASK(core_mask), 0);
207
208 ret = snd_sof_dsp_read_poll_timeout(sdev, HDA_DSP_BAR,
209 HDA_DSP_REG_ADSPCS, adspcs,
210 !(adspcs & HDA_DSP_ADSPCS_CPA_MASK(core_mask)),
211 HDA_DSP_REG_POLL_INTERVAL_US,
212 HDA_DSP_PD_TIMEOUT * USEC_PER_MSEC);
213 if (ret < 0)
214 dev_err(sdev->dev,
215 "error: %s: timeout on HDA_DSP_REG_ADSPCS read\n",
216 __func__);
217
218 return ret;
219}
220
221bool hda_dsp_core_is_enabled(struct snd_sof_dev *sdev,
222 unsigned int core_mask)
223{
224 int val;
225 bool is_enable;
226
227 val = snd_sof_dsp_read(sdev, HDA_DSP_BAR, HDA_DSP_REG_ADSPCS);
228
229#define MASK_IS_EQUAL(v, m, field) ({ \
230 u32 _m = field(m); \
231 ((v) & _m) == _m; \
232})
233
234 is_enable = MASK_IS_EQUAL(val, core_mask, HDA_DSP_ADSPCS_CPA_MASK) &&
235 MASK_IS_EQUAL(val, core_mask, HDA_DSP_ADSPCS_SPA_MASK) &&
236 !(val & HDA_DSP_ADSPCS_CRST_MASK(core_mask)) &&
237 !(val & HDA_DSP_ADSPCS_CSTALL_MASK(core_mask));
238
239#undef MASK_IS_EQUAL
240
241 dev_dbg(sdev->dev, "DSP core(s) enabled? %d : core_mask %x\n",
242 is_enable, core_mask);
243
244 return is_enable;
245}
246
247int hda_dsp_enable_core(struct snd_sof_dev *sdev, unsigned int core_mask)
248{
249 struct sof_intel_hda_dev *hda = sdev->pdata->hw_pdata;
250 const struct sof_intel_dsp_desc *chip = hda->desc;
251 int ret;
252
253
254 core_mask &= chip->host_managed_cores_mask;
255
256
257 if (!core_mask || hda_dsp_core_is_enabled(sdev, core_mask))
258 return 0;
259
260
261 ret = hda_dsp_core_power_up(sdev, core_mask);
262 if (ret < 0) {
263 dev_err(sdev->dev, "error: dsp core power up failed: core_mask %x\n",
264 core_mask);
265 return ret;
266 }
267
268 return hda_dsp_core_run(sdev, core_mask);
269}
270
271int hda_dsp_core_reset_power_down(struct snd_sof_dev *sdev,
272 unsigned int core_mask)
273{
274 struct sof_intel_hda_dev *hda = sdev->pdata->hw_pdata;
275 const struct sof_intel_dsp_desc *chip = hda->desc;
276 int ret;
277
278
279 core_mask &= chip->host_managed_cores_mask;
280
281
282 if (!core_mask)
283 return 0;
284
285
286 ret = hda_dsp_core_stall_reset(sdev, core_mask);
287 if (ret < 0) {
288 dev_err(sdev->dev, "error: dsp core reset failed: core_mask %x\n",
289 core_mask);
290 return ret;
291 }
292
293
294 ret = hda_dsp_core_power_down(sdev, core_mask);
295 if (ret < 0) {
296 dev_err(sdev->dev, "error: dsp core power down fail mask %x: %d\n",
297 core_mask, ret);
298 return ret;
299 }
300
301
302 if (hda_dsp_core_is_enabled(sdev, core_mask)) {
303 dev_err(sdev->dev, "error: dsp core disable fail mask %x: %d\n",
304 core_mask, ret);
305 ret = -EIO;
306 }
307
308 return ret;
309}
310
311void hda_dsp_ipc_int_enable(struct snd_sof_dev *sdev)
312{
313 struct sof_intel_hda_dev *hda = sdev->pdata->hw_pdata;
314 const struct sof_intel_dsp_desc *chip = hda->desc;
315
316
317 snd_sof_dsp_update_bits(sdev, HDA_DSP_BAR, chip->ipc_ctl,
318 HDA_DSP_REG_HIPCCTL_DONE | HDA_DSP_REG_HIPCCTL_BUSY,
319 HDA_DSP_REG_HIPCCTL_DONE | HDA_DSP_REG_HIPCCTL_BUSY);
320
321
322 snd_sof_dsp_update_bits(sdev, HDA_DSP_BAR, HDA_DSP_REG_ADSPIC,
323 HDA_DSP_ADSPIC_IPC, HDA_DSP_ADSPIC_IPC);
324}
325
326void hda_dsp_ipc_int_disable(struct snd_sof_dev *sdev)
327{
328 struct sof_intel_hda_dev *hda = sdev->pdata->hw_pdata;
329 const struct sof_intel_dsp_desc *chip = hda->desc;
330
331
332 snd_sof_dsp_update_bits(sdev, HDA_DSP_BAR, HDA_DSP_REG_ADSPIC,
333 HDA_DSP_ADSPIC_IPC, 0);
334
335
336 snd_sof_dsp_update_bits(sdev, HDA_DSP_BAR, chip->ipc_ctl,
337 HDA_DSP_REG_HIPCCTL_BUSY | HDA_DSP_REG_HIPCCTL_DONE, 0);
338}
339
340static int hda_dsp_wait_d0i3c_done(struct snd_sof_dev *sdev)
341{
342 struct hdac_bus *bus = sof_to_bus(sdev);
343 int retry = HDA_DSP_REG_POLL_RETRY_COUNT;
344
345 while (snd_hdac_chip_readb(bus, VS_D0I3C) & SOF_HDA_VS_D0I3C_CIP) {
346 if (!retry--)
347 return -ETIMEDOUT;
348 usleep_range(10, 15);
349 }
350
351 return 0;
352}
353
354static int hda_dsp_send_pm_gate_ipc(struct snd_sof_dev *sdev, u32 flags)
355{
356 struct sof_ipc_pm_gate pm_gate;
357 struct sof_ipc_reply reply;
358
359 memset(&pm_gate, 0, sizeof(pm_gate));
360
361
362 pm_gate.hdr.size = sizeof(pm_gate);
363 pm_gate.hdr.cmd = SOF_IPC_GLB_PM_MSG | SOF_IPC_PM_GATE;
364 pm_gate.flags = flags;
365
366
367 return sof_ipc_tx_message_no_pm(sdev->ipc, pm_gate.hdr.cmd,
368 &pm_gate, sizeof(pm_gate), &reply,
369 sizeof(reply));
370}
371
372static int hda_dsp_update_d0i3c_register(struct snd_sof_dev *sdev, u8 value)
373{
374 struct hdac_bus *bus = sof_to_bus(sdev);
375 int ret;
376
377
378 ret = hda_dsp_wait_d0i3c_done(sdev);
379 if (ret < 0) {
380 dev_err(bus->dev, "CIP timeout before D0I3C update!\n");
381 return ret;
382 }
383
384
385 snd_hdac_chip_updateb(bus, VS_D0I3C, SOF_HDA_VS_D0I3C_I3, value);
386
387
388 ret = hda_dsp_wait_d0i3c_done(sdev);
389 if (ret < 0) {
390 dev_err(bus->dev, "CIP timeout after D0I3C update!\n");
391 return ret;
392 }
393
394 dev_vdbg(bus->dev, "D0I3C updated, register = 0x%x\n",
395 snd_hdac_chip_readb(bus, VS_D0I3C));
396
397 return 0;
398}
399
400static int hda_dsp_set_D0_state(struct snd_sof_dev *sdev,
401 const struct sof_dsp_power_state *target_state)
402{
403 u32 flags = 0;
404 int ret;
405 u8 value = 0;
406
407
408
409
410
411
412
413
414 switch (sdev->dsp_power_state.state) {
415 case SOF_DSP_PM_D0:
416
417 break;
418 case SOF_DSP_PM_D3:
419
420 return 0;
421 default:
422 dev_err(sdev->dev, "error: transition from %d to %d not allowed\n",
423 sdev->dsp_power_state.state, target_state->state);
424 return -EINVAL;
425 }
426
427
428 if (target_state->substate == SOF_HDA_DSP_PM_D0I3) {
429 value = SOF_HDA_VS_D0I3C_I3;
430
431
432
433
434
435
436
437 if (!sdev->dtrace_is_supported ||
438 !hda_enable_trace_D0I3_S0 ||
439 sdev->system_suspend_target != SOF_SUSPEND_NONE)
440 flags = HDA_PM_NO_DMA_TRACE;
441 } else {
442
443 flags = HDA_PM_PPG;
444 }
445
446
447 ret = hda_dsp_update_d0i3c_register(sdev, value);
448 if (ret < 0)
449 return ret;
450
451
452
453
454
455
456 ret = hda_dsp_send_pm_gate_ipc(sdev, flags);
457 if (ret < 0) {
458 dev_err(sdev->dev,
459 "error: PM_GATE ipc error %d\n", ret);
460 goto revert;
461 }
462
463 return ret;
464
465revert:
466
467 value = value ? 0 : SOF_HDA_VS_D0I3C_I3;
468
469
470
471
472
473 hda_dsp_update_d0i3c_register(sdev, value);
474
475 return ret;
476}
477
478
479static void hda_dsp_state_log(struct snd_sof_dev *sdev)
480{
481 switch (sdev->dsp_power_state.state) {
482 case SOF_DSP_PM_D0:
483 switch (sdev->dsp_power_state.substate) {
484 case SOF_HDA_DSP_PM_D0I0:
485 dev_dbg(sdev->dev, "Current DSP power state: D0I0\n");
486 break;
487 case SOF_HDA_DSP_PM_D0I3:
488 dev_dbg(sdev->dev, "Current DSP power state: D0I3\n");
489 break;
490 default:
491 dev_dbg(sdev->dev, "Unknown DSP D0 substate: %d\n",
492 sdev->dsp_power_state.substate);
493 break;
494 }
495 break;
496 case SOF_DSP_PM_D1:
497 dev_dbg(sdev->dev, "Current DSP power state: D1\n");
498 break;
499 case SOF_DSP_PM_D2:
500 dev_dbg(sdev->dev, "Current DSP power state: D2\n");
501 break;
502 case SOF_DSP_PM_D3_HOT:
503 dev_dbg(sdev->dev, "Current DSP power state: D3_HOT\n");
504 break;
505 case SOF_DSP_PM_D3:
506 dev_dbg(sdev->dev, "Current DSP power state: D3\n");
507 break;
508 case SOF_DSP_PM_D3_COLD:
509 dev_dbg(sdev->dev, "Current DSP power state: D3_COLD\n");
510 break;
511 default:
512 dev_dbg(sdev->dev, "Unknown DSP power state: %d\n",
513 sdev->dsp_power_state.state);
514 break;
515 }
516}
517
518
519
520
521
522
523
524
525int hda_dsp_set_power_state(struct snd_sof_dev *sdev,
526 const struct sof_dsp_power_state *target_state)
527{
528 int ret = 0;
529
530
531
532
533
534
535
536
537 if (target_state->substate == SOF_HDA_DSP_PM_D0I3 &&
538 sdev->system_suspend_target == SOF_SUSPEND_S0IX)
539 goto set_state;
540
541
542
543
544
545 if (target_state->state == sdev->dsp_power_state.state &&
546 target_state->substate == sdev->dsp_power_state.substate)
547 return 0;
548
549set_state:
550 switch (target_state->state) {
551 case SOF_DSP_PM_D0:
552 ret = hda_dsp_set_D0_state(sdev, target_state);
553 break;
554 case SOF_DSP_PM_D3:
555
556 if (sdev->dsp_power_state.state == SOF_DSP_PM_D0 &&
557 sdev->dsp_power_state.substate == SOF_HDA_DSP_PM_D0I0)
558 break;
559
560 dev_err(sdev->dev,
561 "error: transition from %d to %d not allowed\n",
562 sdev->dsp_power_state.state, target_state->state);
563 return -EINVAL;
564 default:
565 dev_err(sdev->dev, "error: target state unsupported %d\n",
566 target_state->state);
567 return -EINVAL;
568 }
569 if (ret < 0) {
570 dev_err(sdev->dev,
571 "failed to set requested target DSP state %d substate %d\n",
572 target_state->state, target_state->substate);
573 return ret;
574 }
575
576 sdev->dsp_power_state = *target_state;
577 hda_dsp_state_log(sdev);
578 return ret;
579}
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611static int hda_suspend(struct snd_sof_dev *sdev, bool runtime_suspend)
612{
613 struct sof_intel_hda_dev *hda = sdev->pdata->hw_pdata;
614 const struct sof_intel_dsp_desc *chip = hda->desc;
615#if IS_ENABLED(CONFIG_SND_SOC_SOF_HDA)
616 struct hdac_bus *bus = sof_to_bus(sdev);
617#endif
618 int ret;
619
620 hda_sdw_int_enable(sdev, false);
621
622
623 hda_dsp_ipc_int_disable(sdev);
624
625#if IS_ENABLED(CONFIG_SND_SOC_SOF_HDA)
626 if (runtime_suspend)
627 hda_codec_jack_wake_enable(sdev, true);
628
629
630 snd_hdac_ext_bus_link_power_down_all(bus);
631#endif
632
633
634 ret = snd_sof_dsp_core_power_down(sdev, chip->host_managed_cores_mask);
635 if (ret < 0) {
636 dev_err(sdev->dev,
637 "error: failed to power down core during suspend\n");
638 return ret;
639 }
640
641
642 hda_dsp_ctrl_ppcap_enable(sdev, false);
643 hda_dsp_ctrl_ppcap_int_enable(sdev, false);
644
645
646 hda_dsp_ctrl_stop_chip(sdev);
647
648
649 snd_sof_pci_update_bits(sdev, PCI_PGCTL,
650 PCI_PGCTL_LSRMD_MASK, PCI_PGCTL_LSRMD_MASK);
651
652
653 ret = hda_dsp_ctrl_link_reset(sdev, true);
654 if (ret < 0) {
655 dev_err(sdev->dev,
656 "error: failed to reset controller during suspend\n");
657 return ret;
658 }
659
660
661 hda_codec_i915_display_power(sdev, false);
662
663 return 0;
664}
665
666static int hda_resume(struct snd_sof_dev *sdev, bool runtime_resume)
667{
668#if IS_ENABLED(CONFIG_SND_SOC_SOF_HDA)
669 struct hdac_bus *bus = sof_to_bus(sdev);
670 struct hdac_ext_link *hlink = NULL;
671#endif
672 int ret;
673
674
675 hda_codec_i915_display_power(sdev, true);
676
677
678
679
680
681 snd_sof_pci_update_bits(sdev, PCI_TCSEL, 0x07, 0);
682
683
684 ret = hda_dsp_ctrl_init_chip(sdev, true);
685 if (ret < 0) {
686 dev_err(sdev->dev,
687 "error: failed to start controller after resume\n");
688 goto cleanup;
689 }
690
691#if IS_ENABLED(CONFIG_SND_SOC_SOF_HDA)
692
693 if (runtime_resume) {
694 hda_codec_jack_wake_enable(sdev, false);
695 if (sdev->system_suspend_target == SOF_SUSPEND_NONE)
696 hda_codec_jack_check(sdev);
697 }
698
699
700 list_for_each_entry(hlink, &bus->hlink_list, list) {
701 if (!hlink->ref_count)
702 snd_hdac_ext_bus_link_power_down(hlink);
703 }
704
705
706 if (!bus->cmd_dma_state)
707 snd_hdac_bus_stop_cmd_io(bus);
708#endif
709
710
711 hda_dsp_ctrl_ppcap_enable(sdev, true);
712 hda_dsp_ctrl_ppcap_int_enable(sdev, true);
713
714cleanup:
715
716 hda_codec_i915_display_power(sdev, false);
717
718 return 0;
719}
720
721int hda_dsp_resume(struct snd_sof_dev *sdev)
722{
723 struct sof_intel_hda_dev *hda = sdev->pdata->hw_pdata;
724 struct pci_dev *pci = to_pci_dev(sdev->dev);
725 const struct sof_dsp_power_state target_state = {
726 .state = SOF_DSP_PM_D0,
727 .substate = SOF_HDA_DSP_PM_D0I0,
728 };
729#if IS_ENABLED(CONFIG_SND_SOC_SOF_HDA)
730 struct hdac_bus *bus = sof_to_bus(sdev);
731 struct hdac_ext_link *hlink = NULL;
732#endif
733 int ret;
734
735
736 if (sdev->dsp_power_state.state == SOF_DSP_PM_D0) {
737#if IS_ENABLED(CONFIG_SND_SOC_SOF_HDA)
738
739 list_for_each_entry(hlink, &bus->hlink_list, list) {
740 if (hlink->ref_count) {
741 ret = snd_hdac_ext_bus_link_power_up(hlink);
742 if (ret < 0) {
743 dev_dbg(sdev->dev,
744 "error %d in %s: failed to power up links",
745 ret, __func__);
746 return ret;
747 }
748 }
749 }
750
751
752 if (bus->cmd_dma_state)
753 snd_hdac_bus_init_cmd_io(bus);
754#endif
755
756
757 ret = snd_sof_dsp_set_power_state(sdev, &target_state);
758 if (ret < 0) {
759 dev_err(sdev->dev, "error: setting dsp state %d substate %d\n",
760 target_state.state, target_state.substate);
761 return ret;
762 }
763
764
765 if (hda->l1_support_changed)
766 snd_sof_dsp_update_bits(sdev, HDA_DSP_HDA_BAR,
767 HDA_VS_INTEL_EM2,
768 HDA_VS_INTEL_EM2_L1SEN, 0);
769
770
771 pci_restore_state(pci);
772 disable_irq_wake(pci->irq);
773 return 0;
774 }
775
776
777 ret = hda_resume(sdev, false);
778 if (ret < 0)
779 return ret;
780
781 return snd_sof_dsp_set_power_state(sdev, &target_state);
782}
783
784int hda_dsp_runtime_resume(struct snd_sof_dev *sdev)
785{
786 const struct sof_dsp_power_state target_state = {
787 .state = SOF_DSP_PM_D0,
788 };
789 int ret;
790
791
792 ret = hda_resume(sdev, true);
793 if (ret < 0)
794 return ret;
795
796 return snd_sof_dsp_set_power_state(sdev, &target_state);
797}
798
799int hda_dsp_runtime_idle(struct snd_sof_dev *sdev)
800{
801 struct hdac_bus *hbus = sof_to_bus(sdev);
802
803 if (hbus->codec_powered) {
804 dev_dbg(sdev->dev, "some codecs still powered (%08X), not idle\n",
805 (unsigned int)hbus->codec_powered);
806 return -EBUSY;
807 }
808
809 return 0;
810}
811
812int hda_dsp_runtime_suspend(struct snd_sof_dev *sdev)
813{
814 struct sof_intel_hda_dev *hda = sdev->pdata->hw_pdata;
815 const struct sof_dsp_power_state target_state = {
816 .state = SOF_DSP_PM_D3,
817 };
818 int ret;
819
820
821 cancel_delayed_work_sync(&hda->d0i3_work);
822
823
824 ret = hda_suspend(sdev, true);
825 if (ret < 0)
826 return ret;
827
828 return snd_sof_dsp_set_power_state(sdev, &target_state);
829}
830
831int hda_dsp_suspend(struct snd_sof_dev *sdev, u32 target_state)
832{
833 struct sof_intel_hda_dev *hda = sdev->pdata->hw_pdata;
834 struct hdac_bus *bus = sof_to_bus(sdev);
835 struct pci_dev *pci = to_pci_dev(sdev->dev);
836 const struct sof_dsp_power_state target_dsp_state = {
837 .state = target_state,
838 .substate = target_state == SOF_DSP_PM_D0 ?
839 SOF_HDA_DSP_PM_D0I3 : 0,
840 };
841 int ret;
842
843
844 cancel_delayed_work_sync(&hda->d0i3_work);
845
846 if (target_state == SOF_DSP_PM_D0) {
847
848 ret = snd_sof_dsp_set_power_state(sdev, &target_dsp_state);
849 if (ret < 0) {
850 dev_err(sdev->dev, "error: setting dsp state %d substate %d\n",
851 target_dsp_state.state,
852 target_dsp_state.substate);
853 return ret;
854 }
855
856
857 hda->l1_support_changed =
858 snd_sof_dsp_update_bits(sdev, HDA_DSP_HDA_BAR,
859 HDA_VS_INTEL_EM2,
860 HDA_VS_INTEL_EM2_L1SEN,
861 HDA_VS_INTEL_EM2_L1SEN);
862
863#if IS_ENABLED(CONFIG_SND_SOC_SOF_HDA)
864
865 if (bus->cmd_dma_state)
866 snd_hdac_bus_stop_cmd_io(bus);
867
868
869 ret = snd_hdac_ext_bus_link_power_down_all(bus);
870 if (ret < 0) {
871 dev_dbg(sdev->dev,
872 "error %d in %s: failed to power down links",
873 ret, __func__);
874 return ret;
875 }
876#endif
877
878
879 enable_irq_wake(pci->irq);
880 pci_save_state(pci);
881 return 0;
882 }
883
884
885 ret = hda_suspend(sdev, false);
886 if (ret < 0) {
887 dev_err(bus->dev, "error: suspending dsp\n");
888 return ret;
889 }
890
891 return snd_sof_dsp_set_power_state(sdev, &target_dsp_state);
892}
893
894int hda_dsp_shutdown(struct snd_sof_dev *sdev)
895{
896 sdev->system_suspend_target = SOF_SUSPEND_S3;
897 return snd_sof_suspend(sdev->dev);
898}
899
900int hda_dsp_set_hw_params_upon_resume(struct snd_sof_dev *sdev)
901{
902#if IS_ENABLED(CONFIG_SND_SOC_SOF_HDA)
903 struct hdac_bus *bus = sof_to_bus(sdev);
904 struct snd_soc_pcm_runtime *rtd;
905 struct hdac_ext_stream *stream;
906 struct hdac_ext_link *link;
907 struct hdac_stream *s;
908 const char *name;
909 int stream_tag;
910
911
912 list_for_each_entry(s, &bus->stream_list, list) {
913 stream = stream_to_hdac_ext_stream(s);
914
915
916
917
918
919
920
921 if (stream->link_substream) {
922 rtd = asoc_substream_to_rtd(stream->link_substream);
923 name = asoc_rtd_to_codec(rtd, 0)->component->name;
924 link = snd_hdac_ext_bus_get_link(bus, name);
925 if (!link)
926 return -EINVAL;
927
928 stream->link_prepared = 0;
929
930 if (hdac_stream(stream)->direction ==
931 SNDRV_PCM_STREAM_CAPTURE)
932 continue;
933
934 stream_tag = hdac_stream(stream)->stream_tag;
935 snd_hdac_ext_link_clear_stream_id(link, stream_tag);
936 }
937 }
938#endif
939 return 0;
940}
941
942void hda_dsp_d0i3_work(struct work_struct *work)
943{
944 struct sof_intel_hda_dev *hdev = container_of(work,
945 struct sof_intel_hda_dev,
946 d0i3_work.work);
947 struct hdac_bus *bus = &hdev->hbus.core;
948 struct snd_sof_dev *sdev = dev_get_drvdata(bus->dev);
949 struct sof_dsp_power_state target_state = {
950 .state = SOF_DSP_PM_D0,
951 .substate = SOF_HDA_DSP_PM_D0I3,
952 };
953 int ret;
954
955
956 if (!snd_sof_dsp_only_d0i3_compatible_stream_active(sdev))
957
958 return;
959
960
961 ret = snd_sof_dsp_set_power_state(sdev, &target_state);
962 if (ret < 0)
963 dev_err_ratelimited(sdev->dev,
964 "error: failed to set DSP state %d substate %d\n",
965 target_state.state, target_state.substate);
966}
967