Lines Matching +full:powered +full:- +full:off
1 // SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause)
22 #include "../sof-audio.h"
25 #include "hda-ipc.h"
57 dev_err(sdev->dev, in hda_dsp_core_reset_enter()
68 dev_err(sdev->dev, in hda_dsp_core_reset_enter()
71 ret = -EIO; in hda_dsp_core_reset_enter()
98 dev_err(sdev->dev, in hda_dsp_core_reset_leave()
108 dev_err(sdev->dev, in hda_dsp_core_reset_leave()
111 ret = -EIO; in hda_dsp_core_reset_leave()
148 dev_dbg(sdev->dev, "DSP core(s) enabled? %d : core_mask %x\n", in hda_dsp_core_is_enabled()
164 dev_dbg(sdev->dev, "unstall/run core: core_mask = %x\n", core_mask); in hda_dsp_core_run()
173 dev_err(sdev->dev, "error: DSP start core failed: core_mask %x\n", in hda_dsp_core_run()
175 ret = -EIO; in hda_dsp_core_run()
187 struct sof_intel_hda_dev *hda = sdev->pdata->hw_pdata; in hda_dsp_core_power_up()
188 const struct sof_intel_dsp_desc *chip = hda->desc; in hda_dsp_core_power_up()
194 core_mask &= chip->host_managed_cores_mask; in hda_dsp_core_power_up()
212 dev_err(sdev->dev, in hda_dsp_core_power_up()
223 dev_err(sdev->dev, in hda_dsp_core_power_up()
226 ret = -EIO; in hda_dsp_core_power_up()
248 dev_err(sdev->dev, in hda_dsp_core_power_down()
257 struct sof_intel_hda_dev *hda = sdev->pdata->hw_pdata; in hda_dsp_enable_core()
258 const struct sof_intel_dsp_desc *chip = hda->desc; in hda_dsp_enable_core()
262 core_mask &= chip->host_managed_cores_mask; in hda_dsp_enable_core()
271 dev_err(sdev->dev, "error: dsp core power up failed: core_mask %x\n", in hda_dsp_enable_core()
282 struct sof_intel_hda_dev *hda = sdev->pdata->hw_pdata; in hda_dsp_core_reset_power_down()
283 const struct sof_intel_dsp_desc *chip = hda->desc; in hda_dsp_core_reset_power_down()
287 core_mask &= chip->host_managed_cores_mask; in hda_dsp_core_reset_power_down()
296 dev_err(sdev->dev, "error: dsp core reset failed: core_mask %x\n", in hda_dsp_core_reset_power_down()
304 dev_err(sdev->dev, "error: dsp core power down fail mask %x: %d\n", in hda_dsp_core_reset_power_down()
309 /* make sure we are in OFF state */ in hda_dsp_core_reset_power_down()
311 dev_err(sdev->dev, "error: dsp core disable fail mask %x: %d\n", in hda_dsp_core_reset_power_down()
313 ret = -EIO; in hda_dsp_core_reset_power_down()
321 struct sof_intel_hda_dev *hda = sdev->pdata->hw_pdata; in hda_dsp_ipc_int_enable()
322 const struct sof_intel_dsp_desc *chip = hda->desc; in hda_dsp_ipc_int_enable()
325 snd_sof_dsp_update_bits(sdev, HDA_DSP_BAR, chip->ipc_ctl, in hda_dsp_ipc_int_enable()
336 struct sof_intel_hda_dev *hda = sdev->pdata->hw_pdata; in hda_dsp_ipc_int_disable()
337 const struct sof_intel_dsp_desc *chip = hda->desc; in hda_dsp_ipc_int_disable()
344 snd_sof_dsp_update_bits(sdev, HDA_DSP_BAR, chip->ipc_ctl, in hda_dsp_ipc_int_disable()
354 if (!retry--) in hda_dsp_wait_d0i3c_done()
355 return -ETIMEDOUT; in hda_dsp_wait_d0i3c_done()
375 return sof_ipc_tx_message_no_pm(sdev->ipc, &pm_gate, sizeof(pm_gate), in hda_dsp_send_pm_gate_ipc()
384 /* Write to D0I3C after Command-In-Progress bit is cleared */ in hda_dsp_update_d0i3c_register()
387 dev_err(bus->dev, "CIP timeout before D0I3C update!\n"); in hda_dsp_update_d0i3c_register()
397 dev_err(bus->dev, "CIP timeout after D0I3C update!\n"); in hda_dsp_update_d0i3c_register()
416 * 1. D3 -> D0I0 in hda_dsp_set_D0_state()
417 * 2. D0I0 -> D0I3 in hda_dsp_set_D0_state()
418 * 3. D0I3 -> D0I0 in hda_dsp_set_D0_state()
420 switch (sdev->dsp_power_state.state) { in hda_dsp_set_D0_state()
425 /* Follow regular flow for D3 -> D0 transition */ in hda_dsp_set_D0_state()
428 dev_err(sdev->dev, "error: transition from %d to %d not allowed\n", in hda_dsp_set_D0_state()
429 sdev->dsp_power_state.state, target_state->state); in hda_dsp_set_D0_state()
430 return -EINVAL; in hda_dsp_set_D0_state()
434 if (target_state->substate == SOF_HDA_DSP_PM_D0I3) { in hda_dsp_set_D0_state()
443 if (!sdev->fw_trace_is_supported || in hda_dsp_set_D0_state()
445 sdev->system_suspend_target != SOF_SUSPEND_NONE) in hda_dsp_set_D0_state()
464 dev_err(sdev->dev, in hda_dsp_set_D0_state()
487 switch (sdev->dsp_power_state.state) { in hda_dsp_state_log()
489 switch (sdev->dsp_power_state.substate) { in hda_dsp_state_log()
491 dev_dbg(sdev->dev, "Current DSP power state: D0I0\n"); in hda_dsp_state_log()
494 dev_dbg(sdev->dev, "Current DSP power state: D0I3\n"); in hda_dsp_state_log()
497 dev_dbg(sdev->dev, "Unknown DSP D0 substate: %d\n", in hda_dsp_state_log()
498 sdev->dsp_power_state.substate); in hda_dsp_state_log()
503 dev_dbg(sdev->dev, "Current DSP power state: D1\n"); in hda_dsp_state_log()
506 dev_dbg(sdev->dev, "Current DSP power state: D2\n"); in hda_dsp_state_log()
509 dev_dbg(sdev->dev, "Current DSP power state: D3\n"); in hda_dsp_state_log()
512 dev_dbg(sdev->dev, "Unknown DSP power state: %d\n", in hda_dsp_state_log()
513 sdev->dsp_power_state.state); in hda_dsp_state_log()
537 if (target_state->substate == SOF_HDA_DSP_PM_D0I3 && in hda_dsp_set_power_state()
538 sdev->system_suspend_target == SOF_SUSPEND_S0IX) in hda_dsp_set_power_state()
545 if (target_state->state == sdev->dsp_power_state.state && in hda_dsp_set_power_state()
546 target_state->substate == sdev->dsp_power_state.substate) in hda_dsp_set_power_state()
550 switch (target_state->state) { in hda_dsp_set_power_state()
555 /* The only allowed transition is: D0I0 -> D3 */ in hda_dsp_set_power_state()
556 if (sdev->dsp_power_state.state == SOF_DSP_PM_D0 && in hda_dsp_set_power_state()
557 sdev->dsp_power_state.substate == SOF_HDA_DSP_PM_D0I0) in hda_dsp_set_power_state()
560 dev_err(sdev->dev, in hda_dsp_set_power_state()
562 sdev->dsp_power_state.state, target_state->state); in hda_dsp_set_power_state()
563 return -EINVAL; in hda_dsp_set_power_state()
565 dev_err(sdev->dev, "error: target state unsupported %d\n", in hda_dsp_set_power_state()
566 target_state->state); in hda_dsp_set_power_state()
567 return -EINVAL; in hda_dsp_set_power_state()
570 dev_err(sdev->dev, in hda_dsp_set_power_state()
572 target_state->state, target_state->substate); in hda_dsp_set_power_state()
576 sdev->dsp_power_state = *target_state; in hda_dsp_set_power_state()
582 * Audio DSP states may transform as below:-
585 * Runtime +---------------------+ Delayed D0i3 work timeout
586 * suspend | +--------------------+
587 * +------------+ D0I0(active) | |
588 * | | <---------------+ |
589 * | +--------> | New IPC | |
590 * | |Runtime +--^--+---------^--+--+ (via mailbox) | |
599 * +-v---+-----------+--v-------+ | | +------+----v----+
600 * | | | +-----------> |
602 * | | +--------------+ |
604 * +----------------------------+ +----------------+
606 * S0IX suspend: The DSP is in D0I3 if any D0I3-compatible streams
613 struct sof_intel_hda_dev *hda = sdev->pdata->hw_pdata; in hda_suspend()
614 const struct sof_intel_dsp_desc *chip = hda->desc; in hda_suspend()
625 * as well in order to try to re-load the firmware to do a 'cold' boot. in hda_suspend()
627 if (sdev->system_suspend_target > SOF_SUSPEND_S3 || in hda_suspend()
628 sdev->fw_state == SOF_FW_CRASHED || in hda_suspend()
629 sdev->fw_state == SOF_FW_BOOT_FAILED) in hda_suspend()
630 hda->skip_imr_boot = true; in hda_suspend()
632 ret = chip->disable_interrupts(sdev); in hda_suspend()
643 ret = chip->power_down_dsp(sdev); in hda_suspend()
645 dev_err(sdev->dev, "failed to power down DSP during suspend\n"); in hda_suspend()
650 for (j = 0; j < chip->cores_num; j++) in hda_suspend()
651 sdev->dsp_core_ref_count[j] = 0; in hda_suspend()
667 dev_err(sdev->dev, in hda_suspend()
672 /* display codec can powered off after link reset */ in hda_suspend()
686 /* display codec must be powered before link reset */ in hda_resume()
698 dev_err(sdev->dev, in hda_resume()
707 if (sdev->system_suspend_target == SOF_SUSPEND_NONE) in hda_resume()
711 /* turn off the links that were off before suspend */ in hda_resume()
712 list_for_each_entry(hlink, &bus->hlink_list, list) { in hda_resume()
713 if (!hlink->ref_count) in hda_resume()
718 if (!bus->cmd_dma_state) in hda_resume()
727 /* display codec can powered off after controller init */ in hda_resume()
735 struct sof_intel_hda_dev *hda = sdev->pdata->hw_pdata; in hda_dsp_resume()
736 struct pci_dev *pci = to_pci_dev(sdev->dev); in hda_dsp_resume()
748 if (sdev->dsp_power_state.state == SOF_DSP_PM_D0) { in hda_dsp_resume()
751 list_for_each_entry(hlink, &bus->hlink_list, list) { in hda_dsp_resume()
752 if (hlink->ref_count) { in hda_dsp_resume()
755 dev_err(sdev->dev, in hda_dsp_resume()
764 if (bus->cmd_dma_state) in hda_dsp_resume()
771 dev_err(sdev->dev, "error: setting dsp state %d substate %d\n", in hda_dsp_resume()
777 if (hda->l1_support_changed) in hda_dsp_resume()
784 disable_irq_wake(pci->irq); in hda_dsp_resume()
788 /* init hda controller. DSP cores will be powered up during fw boot */ in hda_dsp_resume()
803 /* init hda controller. DSP cores will be powered up during fw boot */ in hda_dsp_runtime_resume()
815 if (hbus->codec_powered) { in hda_dsp_runtime_idle()
816 dev_dbg(sdev->dev, "some codecs still powered (%08X), not idle\n", in hda_dsp_runtime_idle()
817 (unsigned int)hbus->codec_powered); in hda_dsp_runtime_idle()
818 return -EBUSY; in hda_dsp_runtime_idle()
826 struct sof_intel_hda_dev *hda = sdev->pdata->hw_pdata; in hda_dsp_runtime_suspend()
833 cancel_delayed_work_sync(&hda->d0i3_work); in hda_dsp_runtime_suspend()
835 /* stop hda controller and power dsp off */ in hda_dsp_runtime_suspend()
845 struct sof_intel_hda_dev *hda = sdev->pdata->hw_pdata; in hda_dsp_suspend()
847 struct pci_dev *pci = to_pci_dev(sdev->dev); in hda_dsp_suspend()
856 cancel_delayed_work_sync(&hda->d0i3_work); in hda_dsp_suspend()
862 dev_err(sdev->dev, "error: setting dsp state %d substate %d\n", in hda_dsp_suspend()
869 hda->l1_support_changed = in hda_dsp_suspend()
877 if (bus->cmd_dma_state) in hda_dsp_suspend()
880 /* no link can be powered in s0ix state */ in hda_dsp_suspend()
883 dev_err(sdev->dev, in hda_dsp_suspend()
891 enable_irq_wake(pci->irq); in hda_dsp_suspend()
896 /* stop hda controller and power dsp off */ in hda_dsp_suspend()
899 dev_err(bus->dev, "error: suspending dsp\n"); in hda_dsp_suspend()
908 sdev->system_suspend_target = SOF_SUSPEND_S3; in hda_dsp_shutdown()
909 return snd_sof_suspend(sdev->dev); in hda_dsp_shutdown()
919 dev_warn(sdev->dev, "%s: failure in hda_dsp_dais_suspend\n", __func__); in hda_dsp_set_hw_params_upon_resume()
929 struct hdac_bus *bus = &hdev->hbus.core; in hda_dsp_d0i3_work()
930 struct snd_sof_dev *sdev = dev_get_drvdata(bus->dev); in hda_dsp_d0i3_work()
937 /* DSP can enter D0I3 iff only D0I3-compatible streams are active */ in hda_dsp_d0i3_work()
945 dev_err_ratelimited(sdev->dev, in hda_dsp_d0i3_work()
952 const struct sof_ipc_pm_ops *pm_ops = sdev->ipc->ops->pm; in hda_dsp_core_get()
958 dev_err(sdev->dev, "failed to power up core %d with err: %d\n", in hda_dsp_core_get()
964 if (sdev->fw_state != SOF_FW_BOOT_COMPLETE || core == SOF_DSP_PRIMARY_CORE) in hda_dsp_core_get()
968 if (!pm_ops->set_core_state) in hda_dsp_core_get()
972 ret = pm_ops->set_core_state(sdev, core, true); in hda_dsp_core_get()
974 dev_err(sdev->dev, "failed to enable secondary core '%d' failed with %d\n", in hda_dsp_core_get()
985 dev_err(sdev->dev, "failed to power down core: %d with err: %d\n", core, ret1); in hda_dsp_core_get()