|
@@ -190,6 +190,58 @@ static int q6lsm_callback(struct apr_client_data *data, void *priv)
|
|
|
client->priv);
|
|
|
spin_unlock_irqrestore(&lsm_session_lock, flags);
|
|
|
return 0;
|
|
|
+ } else if (data->opcode == LSM_SESSION_CMDRSP_GET_PARAMS_V3 ||
|
|
|
+ data->opcode == LSM_SESSION_CMDRSP_GET_PARAMS_V2) {
|
|
|
+
|
|
|
+ uint32_t payload_min_size_expected = 0;
|
|
|
+ uint32_t param_size = 0, ret = 0;
|
|
|
+ /*
|
|
|
+ * sizeof(uint32_t) is added to accomodate the status field
|
|
|
+ * in adsp response payload
|
|
|
+ */
|
|
|
+
|
|
|
+ if (data->opcode == LSM_SESSION_CMDRSP_GET_PARAMS_V3)
|
|
|
+ payload_min_size_expected = sizeof(uint32_t) +
|
|
|
+ sizeof(struct param_hdr_v3);
|
|
|
+ else
|
|
|
+ payload_min_size_expected = sizeof(uint32_t) +
|
|
|
+ sizeof(struct param_hdr_v2);
|
|
|
+
|
|
|
+ if (data->payload_size < payload_min_size_expected) {
|
|
|
+ pr_err("%s: invalid payload size %d expected size %d\n",
|
|
|
+ __func__, data->payload_size,
|
|
|
+ payload_min_size_expected);
|
|
|
+ ret = -EINVAL;
|
|
|
+ goto done;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (data->opcode == LSM_SESSION_CMDRSP_GET_PARAMS_V3)
|
|
|
+ param_size = payload[4];
|
|
|
+ else
|
|
|
+ param_size = payload[3];
|
|
|
+
|
|
|
+ if (data->payload_size != payload_min_size_expected + param_size) {
|
|
|
+ pr_err("%s: cmdrsp_get_params error payload size %d expected size %d\n",
|
|
|
+ __func__, data->payload_size,
|
|
|
+ payload_min_size_expected + param_size);
|
|
|
+ ret = -EINVAL;
|
|
|
+ goto done;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (client->param_size != param_size) {
|
|
|
+ pr_err("%s: response payload size %d mismatched with user requested %d\n",
|
|
|
+ __func__, param_size, client->param_size);
|
|
|
+ ret = -EINVAL;
|
|
|
+ goto done;
|
|
|
+ }
|
|
|
+
|
|
|
+ memcpy((u8 *)client->get_param_payload,
|
|
|
+ (u8 *)payload + payload_min_size_expected, param_size);
|
|
|
+done:
|
|
|
+ spin_unlock_irqrestore(&lsm_session_lock, flags);
|
|
|
+ atomic_set(&client->cmd_state, CMD_STATE_CLEARED);
|
|
|
+ wake_up(&client->cmd_wait);
|
|
|
+ return ret;
|
|
|
} else if (data->opcode == APR_BASIC_RSP_RESULT) {
|
|
|
token = data->token;
|
|
|
switch (payload[0]) {
|
|
@@ -208,6 +260,8 @@ static int q6lsm_callback(struct apr_client_data *data, void *priv)
|
|
|
case LSM_CMD_ADD_TOPOLOGIES:
|
|
|
case LSM_SESSION_CMD_SET_PARAMS_V2:
|
|
|
case LSM_SESSION_CMD_SET_PARAMS_V3:
|
|
|
+ case LSM_SESSION_CMD_GET_PARAMS_V2:
|
|
|
+ case LSM_SESSION_CMD_GET_PARAMS_V3:
|
|
|
if (token != client->session &&
|
|
|
payload[0] !=
|
|
|
LSM_SESSION_CMD_DEREGISTER_SOUND_MODEL) {
|
|
@@ -623,6 +677,48 @@ done:
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
+static int q6lsm_get_params_v2(struct lsm_client *client,
|
|
|
+ struct mem_mapping_hdr *mem_hdr,
|
|
|
+ struct param_hdr_v2 *param_hdr)
|
|
|
+{
|
|
|
+ struct lsm_session_cmd_get_params_v2 lsm_get_param;
|
|
|
+ uint16_t pkt_size = sizeof(lsm_get_param);
|
|
|
+
|
|
|
+ memset(&lsm_get_param, 0, pkt_size);
|
|
|
+ q6lsm_add_hdr(client, &lsm_get_param.apr_hdr, pkt_size, true);
|
|
|
+ lsm_get_param.apr_hdr.opcode = LSM_SESSION_CMD_GET_PARAMS_V2;
|
|
|
+
|
|
|
+ if (mem_hdr != NULL)
|
|
|
+ lsm_get_param.mem_hdr = *mem_hdr;
|
|
|
+
|
|
|
+ memcpy(&lsm_get_param.param_info, param_hdr,
|
|
|
+ sizeof(struct param_hdr_v2));
|
|
|
+
|
|
|
+ return q6lsm_apr_send_pkt(client, client->apr, &lsm_get_param, true,
|
|
|
+ NULL);
|
|
|
+}
|
|
|
+
|
|
|
+static int q6lsm_get_params_v3(struct lsm_client *client,
|
|
|
+ struct mem_mapping_hdr *mem_hdr,
|
|
|
+ struct param_hdr_v3 *param_hdr)
|
|
|
+{
|
|
|
+ struct lsm_session_cmd_get_params_v3 lsm_get_param;
|
|
|
+ uint16_t pkt_size = sizeof(lsm_get_param);
|
|
|
+
|
|
|
+ memset(&lsm_get_param, 0, pkt_size);
|
|
|
+ q6lsm_add_hdr(client, &lsm_get_param.apr_hdr, pkt_size, true);
|
|
|
+ lsm_get_param.apr_hdr.opcode = LSM_SESSION_CMD_GET_PARAMS_V3;
|
|
|
+
|
|
|
+ if (mem_hdr != NULL)
|
|
|
+ lsm_get_param.mem_hdr = *mem_hdr;
|
|
|
+
|
|
|
+ memcpy(&lsm_get_param.param_info, param_hdr,
|
|
|
+ sizeof(struct param_hdr_v3));
|
|
|
+
|
|
|
+ return q6lsm_apr_send_pkt(client, client->apr, &lsm_get_param, true,
|
|
|
+ NULL);
|
|
|
+}
|
|
|
+
|
|
|
static int q6lsm_set_params(struct lsm_client *client,
|
|
|
struct mem_mapping_hdr *mem_hdr,
|
|
|
uint8_t *param_data, uint32_t param_size,
|
|
@@ -665,6 +761,27 @@ done:
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
+static int q6lsm_get_params(struct lsm_client *client,
|
|
|
+ struct mem_mapping_hdr *mem_hdr,
|
|
|
+ struct param_hdr_v3 *param_info)
|
|
|
+
|
|
|
+{
|
|
|
+ struct param_hdr_v2 param_info_v2;
|
|
|
+ int ret = 0;
|
|
|
+ bool iid_supported = q6common_is_instance_id_supported();
|
|
|
+ memset(¶m_info_v2, 0, sizeof(struct param_hdr_v2));
|
|
|
+
|
|
|
+ if (iid_supported)
|
|
|
+ ret = q6lsm_get_params_v3(client, mem_hdr, param_info);
|
|
|
+ else {
|
|
|
+ param_info_v2.module_id = param_info->module_id;
|
|
|
+ param_info_v2.param_id = param_info->param_id;
|
|
|
+ param_info_v2.param_size = param_info->param_size;
|
|
|
+ ret = q6lsm_get_params_v2(client, mem_hdr, ¶m_info_v2);
|
|
|
+ }
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
static int q6lsm_send_custom_topologies(struct lsm_client *client)
|
|
|
{
|
|
|
int rc;
|
|
@@ -2403,6 +2520,36 @@ int q6lsm_set_one_param(struct lsm_client *client,
|
|
|
}
|
|
|
EXPORT_SYMBOL(q6lsm_set_one_param);
|
|
|
|
|
|
+int q6lsm_get_one_param(struct lsm_client *client,
|
|
|
+ struct lsm_params_get_info *p_info,
|
|
|
+ uint32_t param_type)
|
|
|
+{
|
|
|
+ struct param_hdr_v3 param_info;
|
|
|
+ int rc = 0;
|
|
|
+
|
|
|
+ memset(¶m_info, 0, sizeof(param_info));
|
|
|
+
|
|
|
+ switch (param_type) {
|
|
|
+ case LSM_GET_CUSTOM_PARAMS: {
|
|
|
+ param_info.module_id = p_info->module_id;
|
|
|
+ param_info.instance_id = p_info->instance_id;
|
|
|
+ param_info.param_id = p_info->param_id;
|
|
|
+ param_info.param_size = p_info->param_size + sizeof(param_info);
|
|
|
+ rc = q6lsm_get_params(client, NULL, ¶m_info);
|
|
|
+ if (rc) {
|
|
|
+ pr_err("%s: LSM_GET_CUSTOM_PARAMS failed, rc %d\n",
|
|
|
+ __func__, rc);
|
|
|
+ }
|
|
|
+ break;
|
|
|
+
|
|
|
+ }
|
|
|
+ default:
|
|
|
+ pr_err("%s: wrong param_type 0x%x\n",
|
|
|
+ __func__, p_info->param_type);
|
|
|
+ }
|
|
|
+ return rc;
|
|
|
+}
|
|
|
+EXPORT_SYMBOL(q6lsm_get_one_param);
|
|
|
|
|
|
/**
|
|
|
* q6lsm_start -
|