Lines Matching refs:sdev

28 static void mtl_ipc_host_done(struct snd_sof_dev *sdev)  in mtl_ipc_host_done()  argument
34 snd_sof_dsp_update_bits_forced(sdev, HDA_DSP_BAR, MTL_DSP_REG_HFIPCXTDR, in mtl_ipc_host_done()
39 snd_sof_dsp_update_bits_forced(sdev, HDA_DSP_BAR, MTL_DSP_REG_HFIPCXTDA, in mtl_ipc_host_done()
43 static void mtl_ipc_dsp_done(struct snd_sof_dev *sdev) in mtl_ipc_dsp_done() argument
49 snd_sof_dsp_update_bits_forced(sdev, HDA_DSP_BAR, MTL_DSP_REG_HFIPCXIDA, in mtl_ipc_dsp_done()
53 snd_sof_dsp_update_bits(sdev, HDA_DSP_BAR, MTL_DSP_REG_HFIPCXCTL, in mtl_ipc_dsp_done()
58 static bool mtl_dsp_check_ipc_irq(struct snd_sof_dev *sdev) in mtl_dsp_check_ipc_irq() argument
64 hfintipptr = snd_sof_dsp_read(sdev, HDA_DSP_BAR, MTL_HFINTIPPTR) & MTL_HFINTIPPTR_PTR_MASK; in mtl_dsp_check_ipc_irq()
65 irq_status = snd_sof_dsp_read(sdev, HDA_DSP_BAR, hfintipptr + MTL_DSP_IRQSTS); in mtl_dsp_check_ipc_irq()
67 trace_sof_intel_hda_irq_ipc_check(sdev, irq_status); in mtl_dsp_check_ipc_irq()
76 static bool mtl_dsp_check_sdw_irq(struct snd_sof_dev *sdev) in mtl_dsp_check_sdw_irq() argument
82 hfintipptr = snd_sof_dsp_read(sdev, HDA_DSP_BAR, MTL_HFINTIPPTR) & MTL_HFINTIPPTR_PTR_MASK; in mtl_dsp_check_sdw_irq()
83 irq_status = snd_sof_dsp_read(sdev, HDA_DSP_BAR, hfintipptr + MTL_DSP_IRQSTS); in mtl_dsp_check_sdw_irq()
91 static int mtl_ipc_send_msg(struct snd_sof_dev *sdev, struct snd_sof_ipc_msg *msg) in mtl_ipc_send_msg() argument
97 sof_mailbox_write(sdev, sdev->host_box.offset, msg_data->data_ptr, in mtl_ipc_send_msg()
100 snd_sof_dsp_write(sdev, HDA_DSP_BAR, MTL_DSP_REG_HFIPCXIDDY, in mtl_ipc_send_msg()
102 snd_sof_dsp_write(sdev, HDA_DSP_BAR, MTL_DSP_REG_HFIPCXIDR, in mtl_ipc_send_msg()
108 static void mtl_enable_ipc_interrupts(struct snd_sof_dev *sdev) in mtl_enable_ipc_interrupts() argument
110 struct sof_intel_hda_dev *hda = sdev->pdata->hw_pdata; in mtl_enable_ipc_interrupts()
114 snd_sof_dsp_update_bits(sdev, HDA_DSP_BAR, chip->ipc_ctl, in mtl_enable_ipc_interrupts()
119 static void mtl_disable_ipc_interrupts(struct snd_sof_dev *sdev) in mtl_disable_ipc_interrupts() argument
121 struct sof_intel_hda_dev *hda = sdev->pdata->hw_pdata; in mtl_disable_ipc_interrupts()
125 snd_sof_dsp_update_bits(sdev, HDA_DSP_BAR, chip->ipc_ctl, in mtl_disable_ipc_interrupts()
129 static int mtl_enable_interrupts(struct snd_sof_dev *sdev) in mtl_enable_interrupts() argument
138 hfintipptr = snd_sof_dsp_read(sdev, HDA_DSP_BAR, MTL_HFINTIPPTR) & MTL_HFINTIPPTR_PTR_MASK; in mtl_enable_interrupts()
141 snd_sof_dsp_update_bits(sdev, HDA_DSP_BAR, hfintipptr, in mtl_enable_interrupts()
147 ret = snd_sof_dsp_read_poll_timeout(sdev, HDA_DSP_BAR, hfintipptr, irqinten, in mtl_enable_interrupts()
151 dev_err(sdev->dev, "failed to enable Host IPC and/or SOUNDWIRE\n"); in mtl_enable_interrupts()
156 snd_sof_dsp_update_bits(sdev, HDA_DSP_BAR, MTL_DSP_REG_HfHIPCIE, in mtl_enable_interrupts()
161 ret = snd_sof_dsp_read_poll_timeout(sdev, HDA_DSP_BAR, MTL_DSP_REG_HfHIPCIE, hipcie, in mtl_enable_interrupts()
165 dev_err(sdev->dev, "failed to set Host IPC interrupt enable\n"); in mtl_enable_interrupts()
169 snd_sof_dsp_update_bits(sdev, HDA_DSP_BAR, MTL_DSP_REG_HfSNDWIE, in mtl_enable_interrupts()
172 ret = snd_sof_dsp_read_poll_timeout(sdev, HDA_DSP_BAR, MTL_DSP_REG_HfSNDWIE, hipcie, in mtl_enable_interrupts()
176 dev_err(sdev->dev, "failed to set SoundWire IPC interrupt enable\n"); in mtl_enable_interrupts()
181 static int mtl_disable_interrupts(struct snd_sof_dev *sdev) in mtl_disable_interrupts() argument
191 hfintipptr = snd_sof_dsp_read(sdev, HDA_DSP_BAR, MTL_HFINTIPPTR) & MTL_HFINTIPPTR_PTR_MASK; in mtl_disable_interrupts()
194 snd_sof_dsp_update_bits(sdev, HDA_DSP_BAR, hfintipptr, in mtl_disable_interrupts()
199 ret = snd_sof_dsp_read_poll_timeout(sdev, HDA_DSP_BAR, hfintipptr, irqinten, in mtl_disable_interrupts()
204 dev_err(sdev->dev, "failed to disable Host IPC and SoundWire\n"); in mtl_disable_interrupts()
207 snd_sof_dsp_update_bits(sdev, HDA_DSP_BAR, MTL_DSP_REG_HfHIPCIE, in mtl_disable_interrupts()
212 ret1 = snd_sof_dsp_read_poll_timeout(sdev, HDA_DSP_BAR, MTL_DSP_REG_HfHIPCIE, hipcie, in mtl_disable_interrupts()
217 dev_err(sdev->dev, "failed to set Host IPC interrupt disable\n"); in mtl_disable_interrupts()
223 snd_sof_dsp_update_bits(sdev, HDA_DSP_BAR, MTL_DSP_REG_HfSNDWIE, in mtl_disable_interrupts()
226 ret1 = snd_sof_dsp_read_poll_timeout(sdev, HDA_DSP_BAR, MTL_DSP_REG_HfSNDWIE, hipcie, in mtl_disable_interrupts()
231 dev_err(sdev->dev, "failed to set SoundWire IPC interrupt disable\n"); in mtl_disable_interrupts()
240 static int mtl_dsp_pre_fw_run(struct snd_sof_dev *sdev) in mtl_dsp_pre_fw_run() argument
249 snd_sof_dsp_update_bits(sdev, HDA_DSP_BAR, MTL_HFDSSCS, in mtl_dsp_pre_fw_run()
257 ret = snd_sof_dsp_read_poll_timeout(sdev, HDA_DSP_BAR, MTL_HFDSSCS, dsphfdsscs, in mtl_dsp_pre_fw_run()
261 dev_err(sdev->dev, "failed to enable DSP subsystem\n"); in mtl_dsp_pre_fw_run()
266 snd_sof_dsp_update_bits(sdev, HDA_DSP_BAR, MTL_HFPWRCTL, in mtl_dsp_pre_fw_run()
273 ret = snd_sof_dsp_read_poll_timeout(sdev, HDA_DSP_BAR, MTL_HFPWRSTS, dsphfpwrsts, in mtl_dsp_pre_fw_run()
278 dev_err(sdev->dev, "failed to power up gated DSP domain\n"); in mtl_dsp_pre_fw_run()
281 snd_sof_dsp_update_bits(sdev, HDA_DSP_HDA_BAR, MTL_HFPWRCTL, in mtl_dsp_pre_fw_run()
286 static int mtl_dsp_post_fw_run(struct snd_sof_dev *sdev) in mtl_dsp_post_fw_run() argument
290 if (sdev->first_boot) { in mtl_dsp_post_fw_run()
291 struct sof_intel_hda_dev *hdev = sdev->pdata->hw_pdata; in mtl_dsp_post_fw_run()
293 ret = hda_sdw_startup(sdev); in mtl_dsp_post_fw_run()
295 dev_err(sdev->dev, "could not startup SoundWire links\n"); in mtl_dsp_post_fw_run()
304 hda_sdw_int_enable(sdev, true); in mtl_dsp_post_fw_run()
308 static void mtl_dsp_dump(struct snd_sof_dev *sdev, u32 flags) in mtl_dsp_dump() argument
316 fwsts = snd_sof_dsp_read(sdev, HDA_DSP_BAR, MTL_DSP_ROM_STS); in mtl_dsp_dump()
317 fwlec = snd_sof_dsp_read(sdev, HDA_DSP_BAR, MTL_DSP_ROM_ERROR); in mtl_dsp_dump()
318 romdbgsts = snd_sof_dsp_read(sdev, HDA_DSP_BAR, MTL_DSP_REG_HFFLGPXQWY); in mtl_dsp_dump()
319 romdbgerr = snd_sof_dsp_read(sdev, HDA_DSP_BAR, MTL_DSP_REG_HFFLGPXQWY_ERROR); in mtl_dsp_dump()
321 dev_err(sdev->dev, "ROM status: %#x, ROM error: %#x\n", fwsts, fwlec); in mtl_dsp_dump()
322 dev_err(sdev->dev, "ROM debug status: %#x, ROM debug error: %#x\n", romdbgsts, in mtl_dsp_dump()
324 romdbgsts = snd_sof_dsp_read(sdev, HDA_DSP_BAR, MTL_DSP_REG_HFFLGPXQWY + 0x8 * 3); in mtl_dsp_dump()
325 dev_printk(level, sdev->dev, "ROM feature bit%s enabled\n", in mtl_dsp_dump()
329 static bool mtl_dsp_primary_core_is_enabled(struct snd_sof_dev *sdev) in mtl_dsp_primary_core_is_enabled() argument
333 val = snd_sof_dsp_read(sdev, HDA_DSP_BAR, MTL_DSP2CXCTL_PRIMARY_CORE); in mtl_dsp_primary_core_is_enabled()
340 static int mtl_dsp_core_power_up(struct snd_sof_dev *sdev, int core) in mtl_dsp_core_power_up() argument
347 if (core != SOF_DSP_PRIMARY_CORE || mtl_dsp_primary_core_is_enabled(sdev)) in mtl_dsp_core_power_up()
351 snd_sof_dsp_update_bits(sdev, HDA_DSP_BAR, MTL_DSP2CXCTL_PRIMARY_CORE, in mtl_dsp_core_power_up()
356 snd_sof_dsp_update_bits(sdev, HDA_DSP_BAR, MTL_DSP2CXCTL_PRIMARY_CORE, in mtl_dsp_core_power_up()
365 ret = snd_sof_dsp_read_poll_timeout(sdev, HDA_DSP_BAR, MTL_DSP2CXCTL_PRIMARY_CORE, dspcxctl, in mtl_dsp_core_power_up()
369 dev_err(sdev->dev, "%s: timeout on MTL_DSP2CXCTL_PRIMARY_CORE read\n", in mtl_dsp_core_power_up()
375 static int mtl_dsp_core_power_down(struct snd_sof_dev *sdev, int core) in mtl_dsp_core_power_down() argument
381 if (core != SOF_DSP_PRIMARY_CORE || !mtl_dsp_primary_core_is_enabled(sdev)) in mtl_dsp_core_power_down()
385 snd_sof_dsp_update_bits(sdev, HDA_DSP_BAR, MTL_DSP2CXCTL_PRIMARY_CORE, in mtl_dsp_core_power_down()
391 ret = snd_sof_dsp_read_poll_timeout(sdev, HDA_DSP_BAR, MTL_DSP2CXCTL_PRIMARY_CORE, dspcxctl, in mtl_dsp_core_power_down()
396 dev_err(sdev->dev, "failed to power down primary core\n"); in mtl_dsp_core_power_down()
401 static int mtl_power_down_dsp(struct snd_sof_dev *sdev) in mtl_power_down_dsp() argument
407 ret = mtl_dsp_core_power_down(sdev, SOF_DSP_PRIMARY_CORE); in mtl_power_down_dsp()
409 dev_err(sdev->dev, "mtl dsp power down error, %d\n", ret); in mtl_power_down_dsp()
414 snd_sof_dsp_update_bits(sdev, HDA_DSP_BAR, MTL_HFDSSCS, in mtl_power_down_dsp()
422 dsphfdsscs = snd_sof_dsp_read(sdev, HDA_DSP_BAR, MTL_HFDSSCS); in mtl_power_down_dsp()
423 return snd_sof_dsp_read_poll_timeout(sdev, HDA_DSP_BAR, MTL_HFDSSCS, dsphfdsscs, in mtl_power_down_dsp()
428 static int mtl_dsp_cl_init(struct snd_sof_dev *sdev, int stream_tag, bool imr_boot) in mtl_dsp_cl_init() argument
430 struct sof_intel_hda_dev *hda = sdev->pdata->hw_pdata; in mtl_dsp_cl_init()
441 snd_sof_dsp_write(sdev, HDA_DSP_BAR, chip->ipc_req, ipc_hdr); in mtl_dsp_cl_init()
444 ret = mtl_dsp_core_power_up(sdev, SOF_DSP_PRIMARY_CORE); in mtl_dsp_cl_init()
447 dev_err(sdev->dev, "dsp core 0/1 power up failed\n"); in mtl_dsp_cl_init()
451 dev_dbg(sdev->dev, "Primary core power up successful\n"); in mtl_dsp_cl_init()
454 ret = snd_sof_dsp_read_poll_timeout(sdev, HDA_DSP_BAR, chip->ipc_ack, status, in mtl_dsp_cl_init()
459 dev_err(sdev->dev, "timeout waiting for purge IPC done\n"); in mtl_dsp_cl_init()
464 snd_sof_dsp_update_bits_forced(sdev, HDA_DSP_BAR, chip->ipc_ack, chip->ipc_ack_mask, in mtl_dsp_cl_init()
468 ret = mtl_enable_interrupts(sdev); in mtl_dsp_cl_init()
471 dev_err(sdev->dev, "%s: failed to enable interrupts\n", __func__); in mtl_dsp_cl_init()
475 mtl_enable_ipc_interrupts(sdev); in mtl_dsp_cl_init()
486 snd_sof_dsp_dbg_dump(sdev, "MTL DSP init fail", 0); in mtl_dsp_cl_init()
487 mtl_dsp_core_power_down(sdev, SOF_DSP_PRIMARY_CORE); in mtl_dsp_cl_init()
494 struct snd_sof_dev *sdev = context; in mtl_ipc_irq_thread() local
499 hipcida = snd_sof_dsp_read(sdev, HDA_DSP_BAR, MTL_DSP_REG_HFIPCXIDA); in mtl_ipc_irq_thread()
504 snd_sof_dsp_update_bits(sdev, HDA_DSP_BAR, MTL_DSP_REG_HFIPCXCTL, in mtl_ipc_irq_thread()
507 mtl_ipc_dsp_done(sdev); in mtl_ipc_irq_thread()
512 hipctdr = snd_sof_dsp_read(sdev, HDA_DSP_BAR, MTL_DSP_REG_HFIPCXTDR); in mtl_ipc_irq_thread()
515 u32 extension = snd_sof_dsp_read(sdev, HDA_DSP_BAR, MTL_DSP_REG_HFIPCXTDDY); in mtl_ipc_irq_thread()
524 if (likely(sdev->fw_state == SOF_FW_BOOT_COMPLETE)) { in mtl_ipc_irq_thread()
525 struct sof_ipc4_msg *data = sdev->ipc->msg.reply_data; in mtl_ipc_irq_thread()
530 spin_lock_irq(&sdev->ipc_lock); in mtl_ipc_irq_thread()
532 snd_sof_ipc_get_reply(sdev); in mtl_ipc_irq_thread()
533 snd_sof_ipc_reply(sdev, data->primary); in mtl_ipc_irq_thread()
535 spin_unlock_irq(&sdev->ipc_lock); in mtl_ipc_irq_thread()
537 dev_dbg_ratelimited(sdev->dev, in mtl_ipc_irq_thread()
546 sdev->ipc->msg.rx_data = &notification_data; in mtl_ipc_irq_thread()
547 snd_sof_ipc_msgs_rx(sdev); in mtl_ipc_irq_thread()
548 sdev->ipc->msg.rx_data = NULL; in mtl_ipc_irq_thread()
551 mtl_ipc_host_done(sdev); in mtl_ipc_irq_thread()
558 dev_dbg_ratelimited(sdev->dev, "nothing to do in IPC IRQ thread\n"); in mtl_ipc_irq_thread()
564 static int mtl_dsp_ipc_get_mailbox_offset(struct snd_sof_dev *sdev) in mtl_dsp_ipc_get_mailbox_offset() argument
569 static int mtl_dsp_ipc_get_window_offset(struct snd_sof_dev *sdev, u32 id) in mtl_dsp_ipc_get_window_offset() argument
574 static void mtl_ipc_dump(struct snd_sof_dev *sdev) in mtl_ipc_dump() argument
578 hipcidr = snd_sof_dsp_read(sdev, HDA_DSP_BAR, MTL_DSP_REG_HFIPCXIDR); in mtl_ipc_dump()
579 hipcidd = snd_sof_dsp_read(sdev, HDA_DSP_BAR, MTL_DSP_REG_HFIPCXIDDY); in mtl_ipc_dump()
580 hipcida = snd_sof_dsp_read(sdev, HDA_DSP_BAR, MTL_DSP_REG_HFIPCXIDA); in mtl_ipc_dump()
581 hipctdr = snd_sof_dsp_read(sdev, HDA_DSP_BAR, MTL_DSP_REG_HFIPCXTDR); in mtl_ipc_dump()
582 hipctdd = snd_sof_dsp_read(sdev, HDA_DSP_BAR, MTL_DSP_REG_HFIPCXTDDY); in mtl_ipc_dump()
583 hipctda = snd_sof_dsp_read(sdev, HDA_DSP_BAR, MTL_DSP_REG_HFIPCXTDA); in mtl_ipc_dump()
584 hipcctl = snd_sof_dsp_read(sdev, HDA_DSP_BAR, MTL_DSP_REG_HFIPCXCTL); in mtl_ipc_dump()
586 dev_err(sdev->dev, in mtl_ipc_dump()
591 static int mtl_dsp_disable_interrupts(struct snd_sof_dev *sdev) in mtl_dsp_disable_interrupts() argument
593 mtl_disable_ipc_interrupts(sdev); in mtl_dsp_disable_interrupts()
594 return mtl_disable_interrupts(sdev); in mtl_dsp_disable_interrupts()
601 int sof_mtl_ops_init(struct snd_sof_dev *sdev) in sof_mtl_ops_init() argument
635 sdev->private = devm_kzalloc(sdev->dev, sizeof(struct sof_ipc4_fw_data), GFP_KERNEL); in sof_mtl_ops_init()
636 if (!sdev->private) in sof_mtl_ops_init()
639 ipc4_data = sdev->private; in sof_mtl_ops_init()
645 hda_set_dai_drv_ops(sdev, &sof_mtl_ops); in sof_mtl_ops_init()