|
@@ -317,6 +317,46 @@ static void skl_setup_cpr_gateway_cfg(struct skl_sst *ctx,
|
|
|
skl_copy_copier_caps(mconfig, cpr_mconfig);
|
|
|
}
|
|
|
|
|
|
+#define DMA_CONTROL_ID 5
|
|
|
+
|
|
|
+int skl_dsp_set_dma_control(struct skl_sst *ctx, struct skl_module_cfg *mconfig)
|
|
|
+{
|
|
|
+ struct skl_dma_control *dma_ctrl;
|
|
|
+ struct skl_i2s_config_blob config_blob;
|
|
|
+ struct skl_ipc_large_config_msg msg = {0};
|
|
|
+ int err = 0;
|
|
|
+
|
|
|
+
|
|
|
+ /*
|
|
|
+ * if blob size is same as capablity size, then no dma control
|
|
|
+ * present so return
|
|
|
+ */
|
|
|
+ if (mconfig->formats_config.caps_size == sizeof(config_blob))
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ msg.large_param_id = DMA_CONTROL_ID;
|
|
|
+ msg.param_data_size = sizeof(struct skl_dma_control) +
|
|
|
+ mconfig->formats_config.caps_size;
|
|
|
+
|
|
|
+ dma_ctrl = kzalloc(msg.param_data_size, GFP_KERNEL);
|
|
|
+ if (dma_ctrl == NULL)
|
|
|
+ return -ENOMEM;
|
|
|
+
|
|
|
+ dma_ctrl->node_id = skl_get_node_id(ctx, mconfig);
|
|
|
+
|
|
|
+ /* size in dwords */
|
|
|
+ dma_ctrl->config_length = sizeof(config_blob) / 4;
|
|
|
+
|
|
|
+ memcpy(dma_ctrl->config_data, mconfig->formats_config.caps,
|
|
|
+ mconfig->formats_config.caps_size);
|
|
|
+
|
|
|
+ err = skl_ipc_set_large_config(&ctx->ipc, &msg, (u32 *)dma_ctrl);
|
|
|
+
|
|
|
+ kfree(dma_ctrl);
|
|
|
+
|
|
|
+ return err;
|
|
|
+}
|
|
|
+
|
|
|
static void skl_setup_out_format(struct skl_sst *ctx,
|
|
|
struct skl_module_cfg *mconfig,
|
|
|
struct skl_audio_data_format *out_fmt)
|