Lines Matching +full:ipc +full:- +full:3
1 // SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause)
15 #include "../ipc4-priv.h"
18 #include "hda-ipc.h"
19 #include "../sof-audio.h"
46 * set DONE bit - tell DSP we have received the reply msg from DSP, and processed it, in mtl_ipc_dsp_done()
57 /* Check if an IPC IRQ occurred */
63 if (sdev->dspless_mode_selected) in mtl_dsp_check_ipc_irq()
96 struct sof_intel_hda_dev *hdev = sdev->pdata->hw_pdata; in mtl_ipc_send_msg()
97 struct sof_ipc4_msg *msg_data = msg->msg_data; in mtl_ipc_send_msg()
100 hdev->delayed_ipc_tx_msg = msg; in mtl_ipc_send_msg()
104 hdev->delayed_ipc_tx_msg = NULL; in mtl_ipc_send_msg()
107 if (msg_data->data_size) in mtl_ipc_send_msg()
108 sof_mailbox_write(sdev, sdev->host_box.offset, msg_data->data_ptr, in mtl_ipc_send_msg()
109 msg_data->data_size); in mtl_ipc_send_msg()
112 msg_data->extension); in mtl_ipc_send_msg()
114 msg_data->primary | MTL_DSP_REG_HFIPCXIDR_BUSY); in mtl_ipc_send_msg()
123 struct sof_intel_hda_dev *hda = sdev->pdata->hw_pdata; in mtl_enable_ipc_interrupts()
124 const struct sof_intel_dsp_desc *chip = hda->desc; in mtl_enable_ipc_interrupts()
126 if (sdev->dspless_mode_selected) in mtl_enable_ipc_interrupts()
129 /* enable IPC DONE and BUSY interrupts */ in mtl_enable_ipc_interrupts()
130 snd_sof_dsp_update_bits(sdev, HDA_DSP_BAR, chip->ipc_ctl, in mtl_enable_ipc_interrupts()
137 struct sof_intel_hda_dev *hda = sdev->pdata->hw_pdata; in mtl_disable_ipc_interrupts()
138 const struct sof_intel_dsp_desc *chip = hda->desc; in mtl_disable_ipc_interrupts()
140 if (sdev->dspless_mode_selected) in mtl_disable_ipc_interrupts()
143 /* disable IPC DONE and BUSY interrupts */ in mtl_disable_ipc_interrupts()
144 snd_sof_dsp_update_bits(sdev, HDA_DSP_BAR, chip->ipc_ctl, in mtl_disable_ipc_interrupts()
155 if (sdev->dspless_mode_selected) in mtl_enable_sdw_irq()
172 dev_err(sdev->dev, "failed to set SoundWire IPC interrupt %s\n", in mtl_enable_sdw_irq()
185 if (sdev->dspless_mode_selected) in mtl_enable_interrupts()
191 /* Enable/Disable Host IPC and SOUNDWIRE */ in mtl_enable_interrupts()
205 dev_err(sdev->dev, "failed to %s Host IPC and/or SOUNDWIRE\n", in mtl_enable_interrupts()
210 /* Enable/Disable Host IPC interrupt*/ in mtl_enable_interrupts()
224 dev_err(sdev->dev, "failed to set Host IPC interrupt %s\n", in mtl_enable_interrupts()
235 struct sof_intel_hda_dev *hdev = sdev->pdata->hw_pdata; in mtl_dsp_pre_fw_run()
255 dev_err(sdev->dev, "failed to enable DSP subsystem\n"); in mtl_dsp_pre_fw_run()
259 /* Power up gated-DSP-0 domain in order to access the DSP shim register block. */ in mtl_dsp_pre_fw_run()
272 dev_err(sdev->dev, "failed to power up gated DSP domain\n"); in mtl_dsp_pre_fw_run()
274 /* if SoundWire is used, make sure it is not power-gated */ in mtl_dsp_pre_fw_run()
275 if (hdev->info.handle && hdev->info.link_mask > 0) in mtl_dsp_pre_fw_run()
286 if (sdev->first_boot) { in mtl_dsp_post_fw_run()
287 struct sof_intel_hda_dev *hdev = sdev->pdata->hw_pdata; in mtl_dsp_post_fw_run()
291 dev_err(sdev->dev, "could not startup SoundWire links\n"); in mtl_dsp_post_fw_run()
297 hdev->imrboot_supported = true; in mtl_dsp_post_fw_run()
317 dev_err(sdev->dev, "ROM status: %#x, ROM error: %#x\n", fwsts, fwlec); in mtl_dsp_dump()
318 dev_err(sdev->dev, "ROM debug status: %#x, ROM debug error: %#x\n", romdbgsts, in mtl_dsp_dump()
320 romdbgsts = snd_sof_dsp_read(sdev, HDA_DSP_BAR, MTL_DSP_REG_HFFLGPXQWY + 0x8 * 3); in mtl_dsp_dump()
321 dev_printk(level, sdev->dev, "ROM feature bit%s enabled\n", in mtl_dsp_dump()
365 dev_err(sdev->dev, "%s: timeout on MTL_DSP2CXCTL_PRIMARY_CORE read\n", in mtl_dsp_core_power_up()
371 sdev->enabled_cores_mask = BIT(SOF_DSP_PRIMARY_CORE); in mtl_dsp_core_power_up()
372 sdev->dsp_core_ref_count[SOF_DSP_PRIMARY_CORE] = 1; in mtl_dsp_core_power_up()
398 dev_err(sdev->dev, "failed to power down primary core\n"); in mtl_dsp_core_power_down()
402 sdev->enabled_cores_mask = 0; in mtl_dsp_core_power_down()
403 sdev->dsp_core_ref_count[SOF_DSP_PRIMARY_CORE] = 0; in mtl_dsp_core_power_down()
416 dev_err(sdev->dev, "mtl dsp power down error, %d\n", ret); in mtl_power_down_dsp()
437 struct sof_intel_hda_dev *hda = sdev->pdata->hw_pdata; in mtl_dsp_cl_init()
438 const struct sof_intel_dsp_desc *chip = hda->desc; in mtl_dsp_cl_init()
445 ipc_hdr = chip->ipc_req_mask | HDA_DSP_ROM_IPC_CONTROL; in mtl_dsp_cl_init()
447 ipc_hdr |= HDA_DSP_ROM_IPC_PURGE_FW | ((stream_tag - 1) << 9); in mtl_dsp_cl_init()
449 snd_sof_dsp_write(sdev, HDA_DSP_BAR, chip->ipc_req, ipc_hdr); in mtl_dsp_cl_init()
454 if (hda->boot_iteration == HDA_FW_BOOT_ATTEMPTS) in mtl_dsp_cl_init()
455 dev_err(sdev->dev, "dsp core 0/1 power up failed\n"); in mtl_dsp_cl_init()
459 dev_dbg(sdev->dev, "Primary core power up successful\n"); in mtl_dsp_cl_init()
461 /* step 3: wait for IPC DONE bit from ROM */ in mtl_dsp_cl_init()
462 ret = snd_sof_dsp_read_poll_timeout(sdev, HDA_DSP_BAR, chip->ipc_ack, status, in mtl_dsp_cl_init()
463 ((status & chip->ipc_ack_mask) == chip->ipc_ack_mask), in mtl_dsp_cl_init()
466 if (hda->boot_iteration == HDA_FW_BOOT_ATTEMPTS) in mtl_dsp_cl_init()
467 dev_err(sdev->dev, "timeout waiting for purge IPC done\n"); in mtl_dsp_cl_init()
471 /* set DONE bit to clear the reply IPC message */ in mtl_dsp_cl_init()
472 snd_sof_dsp_update_bits_forced(sdev, HDA_DSP_BAR, chip->ipc_ack, chip->ipc_ack_mask, in mtl_dsp_cl_init()
473 chip->ipc_ack_mask); in mtl_dsp_cl_init()
478 if (hda->boot_iteration == HDA_FW_BOOT_ATTEMPTS) in mtl_dsp_cl_init()
479 dev_err(sdev->dev, "%s: failed to enable interrupts\n", __func__); in mtl_dsp_cl_init()
485 if (chip->rom_status_reg == MTL_DSP_ROM_STS) { in mtl_dsp_cl_init()
497 * - Cold/Full boot: wait for ROM init to proceed to download the firmware in mtl_dsp_cl_init()
498 * - IMR boot: wait for ROM firmware entered (firmware booted up from IMR) in mtl_dsp_cl_init()
506 chip->rom_status_reg, status, in mtl_dsp_cl_init()
509 chip->rom_init_timeout * in mtl_dsp_cl_init()
515 if (hda->boot_iteration == HDA_FW_BOOT_ATTEMPTS) in mtl_dsp_cl_init()
516 dev_err(sdev->dev, in mtl_dsp_cl_init()
518 __func__, chip->rom_status_reg); in mtl_dsp_cl_init()
524 if (hda->boot_iteration == HDA_FW_BOOT_ATTEMPTS) in mtl_dsp_cl_init()
528 hda->boot_iteration, HDA_FW_BOOT_ATTEMPTS); in mtl_dsp_cl_init()
567 * ACE fw sends a new fw ipc message to host to in mtl_ipc_irq_thread()
568 * notify the status of the last host ipc message in mtl_ipc_irq_thread()
572 if (likely(sdev->fw_state == SOF_FW_BOOT_COMPLETE)) { in mtl_ipc_irq_thread()
573 struct sof_ipc4_msg *data = sdev->ipc->msg.reply_data; in mtl_ipc_irq_thread()
575 data->primary = primary; in mtl_ipc_irq_thread()
576 data->extension = extension; in mtl_ipc_irq_thread()
578 spin_lock_irq(&sdev->ipc_lock); in mtl_ipc_irq_thread()
582 snd_sof_ipc_reply(sdev, data->primary); in mtl_ipc_irq_thread()
584 spin_unlock_irq(&sdev->ipc_lock); in mtl_ipc_irq_thread()
586 dev_dbg_ratelimited(sdev->dev, in mtl_ipc_irq_thread()
587 "IPC reply before FW_READY: %#x|%#x\n", in mtl_ipc_irq_thread()
595 sdev->ipc->msg.rx_data = ¬ification_data; in mtl_ipc_irq_thread()
597 sdev->ipc->msg.rx_data = NULL; in mtl_ipc_irq_thread()
607 dev_dbg_ratelimited(sdev->dev, "nothing to do in IPC IRQ thread\n"); in mtl_ipc_irq_thread()
611 struct sof_intel_hda_dev *hdev = sdev->pdata->hw_pdata; in mtl_ipc_irq_thread()
613 if (hdev->delayed_ipc_tx_msg) in mtl_ipc_irq_thread()
614 mtl_ipc_send_msg(sdev, hdev->delayed_ipc_tx_msg); in mtl_ipc_irq_thread()
642 dev_err(sdev->dev, in mtl_ipc_dump()
643 "Host IPC initiator: %#x|%#x|%#x, target: %#x|%#x|%#x, ctl: %#x\n", in mtl_ipc_dump()
658 struct hdac_stream *hstream = substream->runtime->private_data; in mtl_dsp_get_stream_hda_link_position()
661 llp_l = snd_sof_dsp_read(sdev, HDA_DSP_HDA_BAR, MTL_PPLCLLPL(hstream->index)); in mtl_dsp_get_stream_hda_link_position()
662 llp_u = snd_sof_dsp_read(sdev, HDA_DSP_HDA_BAR, MTL_PPLCLLPU(hstream->index)); in mtl_dsp_get_stream_hda_link_position()
668 const struct sof_ipc_pm_ops *pm_ops = sdev->ipc->ops->pm; in mtl_dsp_core_get()
673 if (pm_ops->set_core_state) in mtl_dsp_core_get()
674 return pm_ops->set_core_state(sdev, core, true); in mtl_dsp_core_get()
681 const struct sof_ipc_pm_ops *pm_ops = sdev->ipc->ops->pm; in mtl_dsp_core_put()
684 if (pm_ops->set_core_state) { in mtl_dsp_core_put()
685 ret = pm_ops->set_core_state(sdev, core, false); in mtl_dsp_core_put()
713 /* ipc */ in sof_mtl_ops_init()
737 sdev->private = devm_kzalloc(sdev->dev, sizeof(struct sof_ipc4_fw_data), GFP_KERNEL); in sof_mtl_ops_init()
738 if (!sdev->private) in sof_mtl_ops_init()
739 return -ENOMEM; in sof_mtl_ops_init()
741 ipc4_data = sdev->private; in sof_mtl_ops_init()
742 ipc4_data->manifest_fw_hdr_offset = SOF_MAN4_FW_HDR_OFFSET; in sof_mtl_ops_init()
744 ipc4_data->mtrace_type = SOF_IPC4_MTRACE_INTEL_CAVS_2; in sof_mtl_ops_init()
747 ipc4_data->load_library = hda_dsp_ipc4_load_library; in sof_mtl_ops_init()
759 .cores_num = 3,