Loading dsp/q6voice.c +82 −38 Original line number Diff line number Diff line Loading @@ -1291,6 +1291,7 @@ static int voice_unmap_cal_block(struct voice_data *v, int cal_index) if (cal_block->cal_data.paddr == 0 || cal_block->map_data.map_size <= 0) { pr_err("%s: No address to map!\n", __func__); cal_block->map_data.q6map_handle = 0; result = -EINVAL; goto unlock; } Loading @@ -1301,6 +1302,7 @@ static int voice_unmap_cal_block(struct voice_data *v, int cal_index) pr_err("%s: hyp_assign_phys failed result = %d addr = 0x%pK size = %d\n", __func__, result, cal_block->cal_data.paddr, cal_block->map_data.map_size); cal_block->map_data.q6map_handle = 0; result = -EINVAL; goto unlock; } Loading Loading @@ -1337,42 +1339,6 @@ static int voice_destroy_mvm_cvs_session(struct voice_data *v) if (!apr_mvm || !apr_cvs) { pr_err("%s: apr_mvm or apr_cvs is NULL\n", __func__); ret = -EINVAL; pr_debug("%s: use hyp assigned %d\n",__func__, hyp_assigned); if (hyp_assigned) { mutex_lock(&common.cal_data[CVP_VOCPROC_CAL]->lock); cal_block = cal_utils_get_only_cal_block( common.cal_data[CVP_VOCPROC_CAL]); if (cal_block == NULL) { pr_err("%s: Cal block NULL, CVP_VOCPROC_CAL!\n", __func__); mutex_unlock(&common.cal_data[CVP_VOCPROC_CAL]->lock); goto fail; } if (cal_block->cma_mem) { if (cal_block->cal_data.paddr == 0 || cal_block->map_data.map_size <= 0) { pr_err("%s: No address to map!\n", __func__); mutex_unlock(&common.cal_data[CVP_VOCPROC_CAL]->lock); goto fail; } result = hyp_assign_phys( cal_block->cal_data.paddr, cal_block->map_data.map_size, source_vm, 2, dest_vm, dest_perms, 1); if (result < 0) { pr_err("%s: hyp_assign_phys failed result = %d addr = 0x%pK size = %d\n", __func__, result, cal_block->cal_data.paddr, cal_block->map_data.map_size); mutex_unlock(&common.cal_data[CVP_VOCPROC_CAL]->lock); goto fail; } hyp_assigned = false; pr_debug("%s: hyp_assign_phys success\n", __func__); mutex_unlock(&common.cal_data[CVP_VOCPROC_CAL]->lock); } } goto fail; } mvm_handle = voice_get_mvm_handle(v); Loading Loading @@ -1547,6 +1513,41 @@ static int voice_destroy_mvm_cvs_session(struct voice_data *v) } return 0; fail: pr_debug("%s: use hyp assigned %d\n",__func__, hyp_assigned); if (hyp_assigned) { mutex_lock(&common.cal_data[CVP_VOCPROC_CAL]->lock); cal_block = cal_utils_get_only_cal_block( common.cal_data[CVP_VOCPROC_CAL]); if (cal_block == NULL) { pr_err("%s: Cal block NULL, CVP_VOCPROC_CAL!\n", __func__); mutex_unlock(&common.cal_data[CVP_VOCPROC_CAL]->lock); return -EINVAL; } if (cal_block->cma_mem) { if (cal_block->cal_data.paddr == 0 || cal_block->map_data.map_size <= 0) { pr_err("%s: No address to map!\n", __func__); mutex_unlock(&common.cal_data[CVP_VOCPROC_CAL]->lock); return -EINVAL; } result = hyp_assign_phys( cal_block->cal_data.paddr, cal_block->map_data.map_size, source_vm, 2, dest_vm, dest_perms, 1); if (result < 0) { pr_err("%s: hyp_assign_phys failed result = %d addr = 0x%pK size = %d\n", __func__, result, cal_block->cal_data.paddr, cal_block->map_data.map_size); mutex_unlock(&common.cal_data[CVP_VOCPROC_CAL]->lock); return -EINVAL; } hyp_assigned = false; pr_debug("%s: hyp_assign_phys success\n", __func__); mutex_unlock(&common.cal_data[CVP_VOCPROC_CAL]->lock); } } return ret; } Loading Loading @@ -7209,7 +7210,11 @@ EXPORT_SYMBOL(voc_standby_voice_call); int voc_disable_device(uint32_t session_id) { struct voice_data *v = voice_get_session(session_id); int ret = 0; int ret = 0, result = 0; struct cal_block_data *cal_block; int dest_perms[1] = {PERM_READ | PERM_WRITE | PERM_EXEC}; int source_vm[2] = {VMID_LPASS, VMID_ADSP_HEAP}; int dest_vm[1] = {VMID_HLOS}; if (v == NULL) { pr_err("%s: v is NULL\n", __func__); Loading @@ -7224,7 +7229,7 @@ int voc_disable_device(uint32_t session_id) if (ret < 0) { pr_err("%s: Pause Voice Call failed for session 0x%x, err %d!\n", __func__, v->session_id, ret); goto done; goto fail; } rtac_remove_voice(voice_get_cvs_handle(v)); voice_send_cvp_deregister_vol_cal_cmd(v); Loading @@ -7240,6 +7245,45 @@ int voc_disable_device(uint32_t session_id) __func__, v->voc_state); } fail: if (hyp_assigned) { mutex_lock(&common.cal_data[CVP_VOCPROC_CAL]->lock); cal_block = cal_utils_get_only_cal_block( common.cal_data[CVP_VOCPROC_CAL]); if (cal_block == NULL) { pr_err("%s: Cal block NULL, CVP_VOCPROC_CAL!\n", __func__); ret = -EINVAL; mutex_unlock(&common.cal_data[CVP_VOCPROC_CAL]->lock); goto done; } if (cal_block->cma_mem) { if (cal_block->cal_data.paddr == 0 || cal_block->map_data.map_size <= 0) { pr_err("%s: No address to map!\n", __func__); ret = -EINVAL; mutex_unlock(&common.cal_data[CVP_VOCPROC_CAL]->lock); goto done; } result = hyp_assign_phys( cal_block->cal_data.paddr, cal_block->map_data.map_size, source_vm, 2, dest_vm, dest_perms, 1); if (result < 0) { pr_err("%s: hyp_assign_phys failed result = %d addr = 0x%pK size = %d\n", __func__, result, cal_block->cal_data.paddr, cal_block->map_data.map_size); ret = -EINVAL; mutex_unlock(&common.cal_data[CVP_VOCPROC_CAL]->lock); goto done; } hyp_assigned = false; pr_debug("%s: hyp_assign_phys success\n", __func__); mutex_unlock(&common.cal_data[CVP_VOCPROC_CAL]->lock); } } done: mutex_unlock(&v->lock); Loading Loading
dsp/q6voice.c +82 −38 Original line number Diff line number Diff line Loading @@ -1291,6 +1291,7 @@ static int voice_unmap_cal_block(struct voice_data *v, int cal_index) if (cal_block->cal_data.paddr == 0 || cal_block->map_data.map_size <= 0) { pr_err("%s: No address to map!\n", __func__); cal_block->map_data.q6map_handle = 0; result = -EINVAL; goto unlock; } Loading @@ -1301,6 +1302,7 @@ static int voice_unmap_cal_block(struct voice_data *v, int cal_index) pr_err("%s: hyp_assign_phys failed result = %d addr = 0x%pK size = %d\n", __func__, result, cal_block->cal_data.paddr, cal_block->map_data.map_size); cal_block->map_data.q6map_handle = 0; result = -EINVAL; goto unlock; } Loading Loading @@ -1337,42 +1339,6 @@ static int voice_destroy_mvm_cvs_session(struct voice_data *v) if (!apr_mvm || !apr_cvs) { pr_err("%s: apr_mvm or apr_cvs is NULL\n", __func__); ret = -EINVAL; pr_debug("%s: use hyp assigned %d\n",__func__, hyp_assigned); if (hyp_assigned) { mutex_lock(&common.cal_data[CVP_VOCPROC_CAL]->lock); cal_block = cal_utils_get_only_cal_block( common.cal_data[CVP_VOCPROC_CAL]); if (cal_block == NULL) { pr_err("%s: Cal block NULL, CVP_VOCPROC_CAL!\n", __func__); mutex_unlock(&common.cal_data[CVP_VOCPROC_CAL]->lock); goto fail; } if (cal_block->cma_mem) { if (cal_block->cal_data.paddr == 0 || cal_block->map_data.map_size <= 0) { pr_err("%s: No address to map!\n", __func__); mutex_unlock(&common.cal_data[CVP_VOCPROC_CAL]->lock); goto fail; } result = hyp_assign_phys( cal_block->cal_data.paddr, cal_block->map_data.map_size, source_vm, 2, dest_vm, dest_perms, 1); if (result < 0) { pr_err("%s: hyp_assign_phys failed result = %d addr = 0x%pK size = %d\n", __func__, result, cal_block->cal_data.paddr, cal_block->map_data.map_size); mutex_unlock(&common.cal_data[CVP_VOCPROC_CAL]->lock); goto fail; } hyp_assigned = false; pr_debug("%s: hyp_assign_phys success\n", __func__); mutex_unlock(&common.cal_data[CVP_VOCPROC_CAL]->lock); } } goto fail; } mvm_handle = voice_get_mvm_handle(v); Loading Loading @@ -1547,6 +1513,41 @@ static int voice_destroy_mvm_cvs_session(struct voice_data *v) } return 0; fail: pr_debug("%s: use hyp assigned %d\n",__func__, hyp_assigned); if (hyp_assigned) { mutex_lock(&common.cal_data[CVP_VOCPROC_CAL]->lock); cal_block = cal_utils_get_only_cal_block( common.cal_data[CVP_VOCPROC_CAL]); if (cal_block == NULL) { pr_err("%s: Cal block NULL, CVP_VOCPROC_CAL!\n", __func__); mutex_unlock(&common.cal_data[CVP_VOCPROC_CAL]->lock); return -EINVAL; } if (cal_block->cma_mem) { if (cal_block->cal_data.paddr == 0 || cal_block->map_data.map_size <= 0) { pr_err("%s: No address to map!\n", __func__); mutex_unlock(&common.cal_data[CVP_VOCPROC_CAL]->lock); return -EINVAL; } result = hyp_assign_phys( cal_block->cal_data.paddr, cal_block->map_data.map_size, source_vm, 2, dest_vm, dest_perms, 1); if (result < 0) { pr_err("%s: hyp_assign_phys failed result = %d addr = 0x%pK size = %d\n", __func__, result, cal_block->cal_data.paddr, cal_block->map_data.map_size); mutex_unlock(&common.cal_data[CVP_VOCPROC_CAL]->lock); return -EINVAL; } hyp_assigned = false; pr_debug("%s: hyp_assign_phys success\n", __func__); mutex_unlock(&common.cal_data[CVP_VOCPROC_CAL]->lock); } } return ret; } Loading Loading @@ -7209,7 +7210,11 @@ EXPORT_SYMBOL(voc_standby_voice_call); int voc_disable_device(uint32_t session_id) { struct voice_data *v = voice_get_session(session_id); int ret = 0; int ret = 0, result = 0; struct cal_block_data *cal_block; int dest_perms[1] = {PERM_READ | PERM_WRITE | PERM_EXEC}; int source_vm[2] = {VMID_LPASS, VMID_ADSP_HEAP}; int dest_vm[1] = {VMID_HLOS}; if (v == NULL) { pr_err("%s: v is NULL\n", __func__); Loading @@ -7224,7 +7229,7 @@ int voc_disable_device(uint32_t session_id) if (ret < 0) { pr_err("%s: Pause Voice Call failed for session 0x%x, err %d!\n", __func__, v->session_id, ret); goto done; goto fail; } rtac_remove_voice(voice_get_cvs_handle(v)); voice_send_cvp_deregister_vol_cal_cmd(v); Loading @@ -7240,6 +7245,45 @@ int voc_disable_device(uint32_t session_id) __func__, v->voc_state); } fail: if (hyp_assigned) { mutex_lock(&common.cal_data[CVP_VOCPROC_CAL]->lock); cal_block = cal_utils_get_only_cal_block( common.cal_data[CVP_VOCPROC_CAL]); if (cal_block == NULL) { pr_err("%s: Cal block NULL, CVP_VOCPROC_CAL!\n", __func__); ret = -EINVAL; mutex_unlock(&common.cal_data[CVP_VOCPROC_CAL]->lock); goto done; } if (cal_block->cma_mem) { if (cal_block->cal_data.paddr == 0 || cal_block->map_data.map_size <= 0) { pr_err("%s: No address to map!\n", __func__); ret = -EINVAL; mutex_unlock(&common.cal_data[CVP_VOCPROC_CAL]->lock); goto done; } result = hyp_assign_phys( cal_block->cal_data.paddr, cal_block->map_data.map_size, source_vm, 2, dest_vm, dest_perms, 1); if (result < 0) { pr_err("%s: hyp_assign_phys failed result = %d addr = 0x%pK size = %d\n", __func__, result, cal_block->cal_data.paddr, cal_block->map_data.map_size); ret = -EINVAL; mutex_unlock(&common.cal_data[CVP_VOCPROC_CAL]->lock); goto done; } hyp_assigned = false; pr_debug("%s: hyp_assign_phys success\n", __func__); mutex_unlock(&common.cal_data[CVP_VOCPROC_CAL]->lock); } } done: mutex_unlock(&v->lock); Loading