Lines Matching refs:ipc
3 * skl-sst-ipc.c - Intel skl IPC Support
13 #include "skl-sst-ipc.h"
296 static void skl_ipc_tx_msg(struct sst_generic_ipc *ipc, struct ipc_message *msg)
301 sst_dsp_outbox_write(ipc->dsp, msg->tx.data, msg->tx.size);
302 sst_dsp_shim_write_unlocked(ipc->dsp, SKL_ADSP_REG_HIPCIE,
304 sst_dsp_shim_write_unlocked(ipc->dsp, SKL_ADSP_REG_HIPCI,
325 static struct ipc_message *skl_ipc_reply_get_msg(struct sst_generic_ipc *ipc,
331 if (list_empty(&ipc->rx_list)) {
332 dev_err(ipc->dev, "ipc: rx list is empty but received 0x%x\n",
337 msg = list_first_entry(&ipc->rx_list, struct ipc_message, list);
345 int skl_ipc_process_notification(struct sst_generic_ipc *ipc,
348 struct skl_dev *skl = container_of(ipc, struct skl_dev, ipc);
354 dev_err(ipc->dev, "FW Underrun %x\n", header.primary);
358 dev_err(ipc->dev, "MCPS Budget Violation: %x\n",
368 dev_dbg(ipc->dev, "***** Phrase Detected **********\n");
376 skl->enable_miscbdcge(ipc->dev, false);
381 dev_err(ipc->dev, "ipc: Unhandled error msg=%x\n",
405 static int skl_ipc_set_reply_error_code(struct sst_generic_ipc *ipc, u32 reply)
415 dev_err(ipc->dev, "ipc FW reply: %d FW Error Code: %u\n",
417 ipc->dsp->fw_ops.get_fw_errcode(ipc->dsp));
422 dev_err(ipc->dev, "ipc FW reply: %s FW Error Code: %u\n",
424 ipc->dsp->fw_ops.get_fw_errcode(ipc->dsp));
426 dev_info(ipc->dev, "ipc FW reply: %s FW Error Code: %u\n",
428 ipc->dsp->fw_ops.get_fw_errcode(ipc->dsp));
433 void skl_ipc_process_reply(struct sst_generic_ipc *ipc,
439 struct skl_dev *skl = container_of(ipc, struct skl_dev, ipc);
442 spin_lock_irqsave(&ipc->dsp->spinlock, flags);
443 msg = skl_ipc_reply_get_msg(ipc, *ipc_header);
444 spin_unlock_irqrestore(&ipc->dsp->spinlock, flags);
446 dev_dbg(ipc->dev, "ipc: rx list is empty\n");
453 dev_dbg(ipc->dev, "ipc FW reply %x: success\n", header.primary);
455 sst_dsp_inbox_read(ipc->dsp, msg->rx.data, msg->rx.size);
469 msg->errno = skl_ipc_set_reply_error_code(ipc, reply);
484 spin_lock_irqsave(&ipc->dsp->spinlock, flags);
485 sst_ipc_tx_msg_reply_complete(ipc, msg);
486 spin_unlock_irqrestore(&ipc->dsp->spinlock, flags);
493 struct sst_generic_ipc *ipc = &skl->ipc;
536 skl_ipc_process_reply(ipc, header);
539 skl_ipc_process_notification(ipc, header);
553 schedule_work(&ipc->kwork);
601 struct sst_generic_ipc *ipc;
604 ipc = &skl->ipc;
605 ipc->dsp = skl->dsp;
606 ipc->dev = dev;
608 ipc->tx_data_max_size = SKL_ADSP_W1_SZ;
609 ipc->rx_data_max_size = SKL_ADSP_W0_UP_SZ;
611 err = sst_ipc_init(ipc);
615 ipc->ops.tx_msg = skl_ipc_tx_msg;
616 ipc->ops.tx_data_copy = skl_ipc_tx_data_copy;
617 ipc->ops.is_dsp_busy = skl_ipc_is_dsp_busy;
622 void skl_ipc_free(struct sst_generic_ipc *ipc)
625 sst_dsp_shim_update_bits(ipc->dsp, SKL_ADSP_REG_HIPCCTL,
629 sst_dsp_shim_update_bits(ipc->dsp, SKL_ADSP_REG_HIPCCTL,
632 sst_ipc_fini(ipc);
635 int skl_ipc_create_pipeline(struct sst_generic_ipc *ipc,
652 dev_dbg(ipc->dev, "In %s header=%d\n", __func__, header.primary);
653 ret = sst_ipc_tx_message_wait(ipc, request, NULL);
655 dev_err(ipc->dev, "ipc: create pipeline fail, err: %d\n", ret);
663 int skl_ipc_delete_pipeline(struct sst_generic_ipc *ipc, u8 instance_id)
675 dev_dbg(ipc->dev, "In %s header=%d\n", __func__, header.primary);
676 ret = sst_ipc_tx_message_wait(ipc, request, NULL);
678 dev_err(ipc->dev, "ipc: delete pipeline failed, err %d\n", ret);
686 int skl_ipc_set_pipeline_state(struct sst_generic_ipc *ipc,
700 dev_dbg(ipc->dev, "In %s header=%d\n", __func__, header.primary);
701 ret = sst_ipc_tx_message_wait(ipc, request, NULL);
703 dev_err(ipc->dev, "ipc: set pipeline state failed, err: %d\n", ret);
711 skl_ipc_save_pipeline(struct sst_generic_ipc *ipc, u8 instance_id, int dma_id)
725 dev_dbg(ipc->dev, "In %s header=%d\n", __func__, header.primary);
726 ret = sst_ipc_tx_message_wait(ipc, request, NULL);
728 dev_err(ipc->dev, "ipc: save pipeline failed, err: %d\n", ret);
736 int skl_ipc_restore_pipeline(struct sst_generic_ipc *ipc, u8 instance_id)
748 dev_dbg(ipc->dev, "In %s header=%d\n", __func__, header.primary);
749 ret = sst_ipc_tx_message_wait(ipc, request, NULL);
751 dev_err(ipc->dev, "ipc: restore pipeline failed, err: %d\n", ret);
759 int skl_ipc_set_dx(struct sst_generic_ipc *ipc, u8 instance_id,
776 dev_dbg(ipc->dev, "In %s primary =%x ext=%x\n", __func__,
778 ret = sst_ipc_tx_message_wait(ipc, request, NULL);
780 dev_err(ipc->dev, "ipc: set dx failed, err %d\n", ret);
788 int skl_ipc_init_instance(struct sst_generic_ipc *ipc,
816 dev_dbg(ipc->dev, "In %s primary =%x ext=%x\n", __func__,
818 ret = sst_ipc_tx_message_wait(ipc, request, NULL);
821 dev_err(ipc->dev, "ipc: init instance failed\n");
829 int skl_ipc_bind_unbind(struct sst_generic_ipc *ipc,
849 dev_dbg(ipc->dev, "In %s hdr=%x ext=%x\n", __func__, header.primary,
851 ret = sst_ipc_tx_message_wait(ipc, request, NULL);
853 dev_err(ipc->dev, "ipc: bind/unbind failed\n");
867 int skl_ipc_load_modules(struct sst_generic_ipc *ipc,
883 ret = sst_ipc_tx_message_nowait(ipc, request);
885 dev_err(ipc->dev, "ipc: load modules failed :%d\n", ret);
891 int skl_ipc_unload_modules(struct sst_generic_ipc *ipc, u8 module_cnt,
907 ret = sst_ipc_tx_message_wait(ipc, request, NULL);
909 dev_err(ipc->dev, "ipc: unload modules failed :%d\n", ret);
915 int skl_ipc_set_large_config(struct sst_generic_ipc *ipc,
942 dev_dbg(ipc->dev, "In %s primary=%#x ext=%#x\n", __func__,
944 dev_dbg(ipc->dev, "transmitting offset: %#x, size: %#x\n",
950 ret = sst_ipc_tx_message_wait(ipc, request, NULL);
952 dev_err(ipc->dev,
953 "ipc: set large config fail, err: %d\n", ret);
971 int skl_ipc_get_large_config(struct sst_generic_ipc *ipc,
1000 ret = sst_ipc_tx_message_wait(ipc, request, &reply);
1002 dev_err(ipc->dev, "ipc: get large config fail, err: %d\n", ret);
1017 int skl_sst_ipc_load_library(struct sst_generic_ipc *ipc,
1032 ret = sst_ipc_tx_message_wait(ipc, request, NULL);
1034 ret = sst_ipc_tx_message_nowait(ipc, request);
1037 dev_err(ipc->dev, "ipc: load lib failed\n");
1043 int skl_ipc_set_d0ix(struct sst_generic_ipc *ipc, struct skl_ipc_d0ix_msg *msg)
1059 dev_dbg(ipc->dev, "In %s primary=%x ext=%x\n", __func__,
1065 ret = sst_ipc_tx_message_nopm(ipc, request, NULL);
1067 dev_err(ipc->dev, "ipc: set d0ix failed, err %d\n", ret);