void skl_dsp_set_astate_cfg(struct skl_sst *ctx, u32 cnt, void *data) { struct skl_ipc_large_config_msg msg = {0}; msg.large_param_id = SKL_ASTATE_PARAM_ID; msg.param_data_size = (cnt * sizeof(struct skl_astate_param) + sizeof(cnt)); skl_ipc_set_large_config(&ctx->ipc, &msg, data); }
/* Algo parameter set helper function */ int skl_set_module_params(struct skl_sst *ctx, u32 *params, int size, u32 param_id, struct skl_module_cfg *mcfg) { struct skl_ipc_large_config_msg msg; msg.module_id = mcfg->id.module_id; msg.instance_id = mcfg->id.pvt_id; msg.param_data_size = size; msg.large_param_id = param_id; return skl_ipc_set_large_config(&ctx->ipc, &msg, params); }
/* disable notfication for underruns/overruns from firmware module */ void skl_dsp_enable_notification(struct skl_sst *ctx, bool enable) { struct notification_mask mask; struct skl_ipc_large_config_msg msg = {0}; mask.notify = NOTIFICATION_MASK; mask.enable = enable; msg.large_param_id = NOTIFICATION_PARAM_ID; msg.param_data_size = sizeof(mask); skl_ipc_set_large_config(&ctx->ipc, &msg, (u32 *)&mask); }
int skl_dsp_set_dma_control(struct skl_sst *ctx, u32 *caps, u32 caps_size, u32 node_id) { struct skl_dma_control *dma_ctrl; struct skl_ipc_large_config_msg msg = {0}; int err = 0; /* * if blob size zero, then return */ if (caps_size == 0) return 0; msg.large_param_id = DMA_CONTROL_ID; msg.param_data_size = sizeof(struct skl_dma_control) + caps_size; dma_ctrl = kzalloc(msg.param_data_size, GFP_KERNEL); if (dma_ctrl == NULL) return -ENOMEM; dma_ctrl->node_id = node_id; /* * NHLT blob may contain additional configs along with i2s blob. * firmware expects only the i2s blob size as the config_length. * So fix to i2s blob size. * size in dwords. */ dma_ctrl->config_length = DMA_I2S_BLOB_SIZE; memcpy(dma_ctrl->config_data, caps, caps_size); err = skl_ipc_set_large_config(&ctx->ipc, &msg, (u32 *)dma_ctrl); kfree(dma_ctrl); return err; }
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; }