Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 282e2eb4 authored by Maheshwar Ajja's avatar Maheshwar Ajja
Browse files

msm: vidc: fix cvp session close issue



Video driver tries to unregister the buffers which
are not unregistered by the userspace client in
deinitialization. Unregistering the buffers is not
required as the session will be closed anyway. So
simply try session close in msm_cvp_inst_deinit()
to avoid errors due to unregistering buffers.

Change-Id: Id9ae0683498dbbc1451055bf04a7fb7513248391
Signed-off-by: default avatarMaheshwar Ajja <majja@codeaurora.org>
parent f0a4ec7d
Loading
Loading
Loading
Loading
+8 −41
Original line number Diff line number Diff line
@@ -518,62 +518,29 @@ int msm_cvp_ctrl_init(struct msm_vidc_inst *inst,
int msm_cvp_inst_deinit(struct msm_vidc_inst *inst)
{
	int rc = 0;
	struct hfi_device *hdev;
	struct msm_vidc_cvp_buffer *cbuf;
	struct vidc_unregister_buffer vbuf;
	struct msm_vidc_cvp_buffer *cbuf, *temp;

	if (!inst || !inst->core) {
		dprintk(VIDC_ERR, "%s: invalid params\n", __func__);
		return -EINVAL;
	}
	hdev = inst->core->device;
	dprintk(VIDC_DBG, "%s: inst %pK (%#x)\n", __func__,
		inst, hash32_ptr(inst->session));

	do {
		mutex_lock(&inst->cvpbufs.lock);
		if (list_empty(&inst->cvpbufs.list)) {
			mutex_unlock(&inst->cvpbufs.lock);
			break;
		}
		cbuf = list_first_entry(&inst->cvpbufs.list,
			struct msm_vidc_cvp_buffer, list);
		mutex_unlock(&inst->cvpbufs.lock);
	rc = msm_comm_try_state(inst, MSM_VIDC_CLOSE_DONE);
	if (rc)
		dprintk(VIDC_ERR, "%s: close failed\n", __func__);

	mutex_lock(&inst->cvpbufs.lock);
	list_for_each_entry_safe(cbuf, temp, &inst->cvpbufs.list, list) {
		print_cvp_buffer(VIDC_ERR, "unregistered", inst, cbuf);
		memset(&vbuf, 0, sizeof(struct vidc_unregister_buffer));
		vbuf.index = cbuf->buf.index;
		vbuf.type = get_hal_buftype(__func__, cbuf->buf.type);
		vbuf.size = cbuf->buf.size;
		vbuf.device_addr = cbuf->smem.device_addr;
		vbuf.client_data = cbuf->smem.device_addr;
		vbuf.response_required = true;
		rc = call_hfi_op(hdev, session_unregister_buffer,
				(void *)inst->session, &vbuf);
		if (rc) {
			dprintk(VIDC_ERR, "%s: unregbuf failed\n", __func__);
		} else {
			rc = wait_for_completion_timeout(
				&inst->completions[
				SESSION_MSG_INDEX(
				HAL_SESSION_UNREGISTER_BUFFER_DONE)],
				msecs_to_jiffies(
				inst->core->resources.msm_vidc_hw_rsp_timeout));
			if (!rc)
				dprintk(VIDC_ERR,
					 "%s: wait timedout for unregbuf done\n",
					__func__);
		}
		rc = msm_smem_unmap_dma_buf(inst, &cbuf->smem);
		if (rc)
			dprintk(VIDC_ERR, "%s: unmap failed\n", __func__);

		mutex_lock(&inst->cvpbufs.lock);
		list_del(&cbuf->list);
		mutex_unlock(&inst->cvpbufs.lock);
		kfree(cbuf);
		cbuf = NULL;
	} while (1);
	}
	mutex_unlock(&inst->cvpbufs.lock);

	inst->clk_data.min_freq = 0;
	inst->clk_data.ddr_bw = 0;