diff options
author | Harshal Ahire <hahire@codeaurora.org> | 2020-07-07 15:45:49 +0530 |
---|---|---|
committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2020-08-13 05:24:42 -0700 |
commit | 00083bdb4f38ef287aaa9bd72af0f3fa6caffb70 (patch) | |
tree | 42e832ad427be6636210957699f52d44afcd7ffe /asoc | |
parent | 7321b52a42f324b76023ce334cb75735b964a1ec (diff) | |
download | msm-extra-00083bdb4f38ef287aaa9bd72af0f3fa6caffb70.tar.gz |
dsp: Add support for GET_PARAMS
Add support to query module parameters from ADSP.
Change-Id: Ie63dd95cf27277f9c836becc98952d48971a3ec3
Signed-off-by: Harshal Ahire <hahire@codeaurora.org>
Diffstat (limited to 'asoc')
-rw-r--r-- | asoc/msm-lsm-client.c | 177 |
1 files changed, 177 insertions, 0 deletions
diff --git a/asoc/msm-lsm-client.c b/asoc/msm-lsm-client.c index 8a179fde..77b25de1 100644 --- a/asoc/msm-lsm-client.c +++ b/asoc/msm-lsm-client.c @@ -1700,6 +1700,17 @@ struct lsm_params_info_v2_32 { u16 stage_idx; }; +struct lsm_params_get_info_32 { + u32 module_id; + u16 instance_id; + u16 reserved; + u32 param_id; + u32 param_size; + uint32_t param_type; + __u16 stage_idx; + u8 payload[0]; +} __packed; + struct snd_lsm_module_params_32 { compat_uptr_t params; u32 num_params; @@ -1717,6 +1728,8 @@ enum { _IOW('U', 0x0F, struct snd_lsm_event_status_v3_32), SNDRV_LSM_SET_MODULE_PARAMS_V2_32 = _IOW('U', 0x13, struct snd_lsm_module_params_32), + SNDRV_LSM_GET_MODULE_PARAMS_32 = + _IOWR('U', 0x14, struct lsm_params_get_info_32), }; static int msm_lsm_ioctl_compat(struct snd_pcm_substream *substream, @@ -2096,6 +2109,95 @@ static int msm_lsm_ioctl_compat(struct snd_pcm_substream *substream, kfree(params32); break; } + case SNDRV_LSM_GET_MODULE_PARAMS_32: { + struct lsm_params_get_info_32 p_info_32, *param_info_rsp = NULL; + struct lsm_params_get_info *p_info = NULL; + + memset(&p_info_32, 0 , sizeof(p_info_32)); + if (!prtd->lsm_client->use_topology) { + dev_err(rtd->dev, + "%s: %s: not supported if not using topology\n", + __func__, "GET_MODULE_PARAMS_32"); + err = -EINVAL; + goto done; + } + + if (copy_from_user(&p_info_32, arg, sizeof(p_info_32))) { + dev_err(rtd->dev, + "%s: %s: copy_from_user failed, size = %zd\n", + __func__, "GET_MODULE_PARAMS_32", + sizeof(p_info_32)); + err = -EFAULT; + goto done; + } + size = sizeof(p_info_32); + p_info = kzalloc(size, GFP_KERNEL); + + if (!p_info) { + err = -ENOMEM; + goto done; + } + + p_info->module_id = p_info_32.module_id; + p_info->param_id = p_info_32.param_id; + p_info->param_size = p_info_32.param_size; + p_info->param_type = p_info_32.param_type; + p_info->instance_id = p_info_32.instance_id; + p_info->stage_idx = p_info_32.stage_idx; + + prtd->lsm_client->get_param_payload = kzalloc(p_info_32.param_size, + GFP_KERNEL); + if (!prtd->lsm_client->get_param_payload) { + err = -ENOMEM; + kfree(p_info); + goto done; + } + prtd->lsm_client->param_size = p_info_32.param_size; + + err = q6lsm_get_one_param(prtd->lsm_client, p_info, + LSM_GET_CUSTOM_PARAMS); + if (err) { + dev_err(rtd->dev, + "%s: Failed to get custom param, err=%d\n", + __func__, err); + kfree(p_info); + kfree(prtd->lsm_client->get_param_payload); + goto done; + } + + size = sizeof(p_info_32) + p_info_32.param_size; + param_info_rsp = kzalloc(size, GFP_KERNEL); + + if (!param_info_rsp) { + err = -ENOMEM; + kfree(p_info); + kfree(prtd->lsm_client->get_param_payload); + goto done; + } + + if (!access_ok(VERIFY_WRITE, arg, size)) { + dev_err(rtd->dev, + "%s: Failed to verify write, size = %d\n", + __func__, size); + err = -EFAULT; + goto free; + } + + memcpy(param_info_rsp, &p_info_32, sizeof(p_info_32)); + memcpy(param_info_rsp->payload, prtd->lsm_client->get_param_payload, + p_info_32.param_size); + + if (copy_to_user(arg, param_info_rsp, size)) { + dev_err(rtd->dev, "%s: Failed to copy payload to user, size = %d\n", + __func__, size); + err = -EFAULT; + } +free: + kfree(p_info); + kfree(param_info_rsp); + kfree(prtd->lsm_client->get_param_payload); + break; + } case SNDRV_LSM_REG_SND_MODEL_V2: case SNDRV_LSM_SET_PARAMS: case SNDRV_LSM_SET_MODULE_PARAMS: @@ -2303,6 +2405,81 @@ static int msm_lsm_ioctl(struct snd_pcm_substream *substream, break; } + case SNDRV_LSM_GET_MODULE_PARAMS: { + struct lsm_params_get_info temp_p_info, *p_info = NULL; + + memset(&temp_p_info, 0, sizeof(temp_p_info)); + if (!prtd->lsm_client->use_topology) { + dev_err(rtd->dev, + "%s: %s: not supported if not using topology\n", + __func__, "GET_MODULE_PARAMS_32"); + err = -EINVAL; + goto done; + } + + if (copy_from_user(&temp_p_info, arg, sizeof(temp_p_info))) { + dev_err(rtd->dev, + "%s: %s: copy_from_user failed, size = %zd\n", + __func__, "GET_MODULE_PARAMS_32", + sizeof(temp_p_info)); + err = -EFAULT; + goto done; + } + size = sizeof(temp_p_info) + temp_p_info.param_size; + p_info = kzalloc(size, GFP_KERNEL); + + if (!p_info) { + err = -ENOMEM; + goto done; + } + + p_info->module_id = temp_p_info.module_id; + p_info->param_id = temp_p_info.param_id; + p_info->param_size = temp_p_info.param_size; + p_info->param_type = temp_p_info.param_type; + p_info->instance_id = temp_p_info.instance_id; + p_info->stage_idx = temp_p_info.stage_idx; + + prtd->lsm_client->get_param_payload = kzalloc(temp_p_info.param_size, + GFP_KERNEL); + if (!prtd->lsm_client->get_param_payload) { + err = -ENOMEM; + kfree(p_info); + goto done; + } + + prtd->lsm_client->param_size = p_info->param_size; + err = q6lsm_get_one_param(prtd->lsm_client, p_info, + LSM_GET_CUSTOM_PARAMS); + if (err) { + dev_err(rtd->dev, + "%s: Failed to get custom param, err=%d\n", + __func__, err); + goto free; + } + + if (!access_ok(VERIFY_WRITE, arg, size)) { + dev_err(rtd->dev, + "%s: Failed to verify write, size = %d\n", + __func__, size); + err = -EFAULT; + goto free; + } + + memcpy(p_info->payload, prtd->lsm_client->get_param_payload, + temp_p_info.param_size); + + if (copy_to_user(arg, p_info, sizeof(struct lsm_params_get_info) + + p_info->param_size)) { + dev_err(rtd->dev, "%s: Failed to copy payload to user, size = %d\n", + __func__, size); + err = -EFAULT; + } +free: + kfree(p_info); + kfree(prtd->lsm_client->get_param_payload); + break; + } case SNDRV_LSM_EVENT_STATUS: case SNDRV_LSM_GENERIC_DET_EVENT: { struct snd_lsm_event_status *user = NULL; |