From 917cd8adfa74ba4312b5738b8826b686c724321b Mon Sep 17 00:00:00 2001 From: George Shen Date: Tue, 26 May 2020 21:59:07 -0700 Subject: [PATCH] msm: cvp: stop session queue when session closed There is a chance CVP application closes a session without stopping it first. The change will ensure there is no resource leakage in above case. Change-Id: I2b93af11a47eda8de81f3d8c0f054e3319e48802 Signed-off-by: George Shen --- drivers/media/platform/msm/cvp/cvp_hfi.c | 10 +++++++- drivers/media/platform/msm/cvp/msm_cvp.c | 24 +++++++++++++++++++ drivers/media/platform/msm/cvp/msm_cvp.h | 1 + drivers/media/platform/msm/cvp/msm_cvp_core.c | 1 + 4 files changed, 35 insertions(+), 1 deletion(-) diff --git a/drivers/media/platform/msm/cvp/cvp_hfi.c b/drivers/media/platform/msm/cvp/cvp_hfi.c index 8f8b90a7fa6b..27a317084b5b 100644 --- a/drivers/media/platform/msm/cvp/cvp_hfi.c +++ b/drivers/media/platform/msm/cvp/cvp_hfi.c @@ -4174,7 +4174,7 @@ static void power_off_iris2(struct iris_hfi_device *device) static inline int __resume(struct iris_hfi_device *device) { int rc = 0; - u32 flags = 0; + u32 flags = 0, reg_gdsc, reg_cbcr; if (!device) { dprintk(CVP_ERR, "Invalid params: %pK\n", device); @@ -4193,6 +4193,14 @@ static inline int __resume(struct iris_hfi_device *device) goto err_iris_power_on; } + + + reg_gdsc = __read_register(device, CVP_CC_MVS1C_GDSCR); + reg_cbcr = __read_register(device, CVP_CC_MVS1C_CBCR); + if (!(reg_gdsc & 0x80000000) || (reg_cbcr & 0x80000000)) + dprintk(CVP_ERR, "CVP power on failed gdsc %x cbcr %x\n", + reg_gdsc, reg_cbcr); + /* Reboot the firmware */ rc = __tzbsp_set_cvp_state(TZ_SUBSYS_STATE_RESUME); if (rc) { diff --git a/drivers/media/platform/msm/cvp/msm_cvp.c b/drivers/media/platform/msm/cvp/msm_cvp.c index a5bcfa9be3f4..9e8f9a4a41e1 100644 --- a/drivers/media/platform/msm/cvp/msm_cvp.c +++ b/drivers/media/platform/msm/cvp/msm_cvp.c @@ -1019,6 +1019,30 @@ static int msm_cvp_session_stop(struct msm_cvp_inst *inst, return cvp_fence_thread_stop(inst); } +int msm_cvp_session_queue_stop(struct msm_cvp_inst *inst) +{ + struct cvp_session_queue *sq; + + sq = &inst->session_queue; + + spin_lock(&sq->lock); + + if (sq->state == QUEUE_STOP) { + spin_unlock(&sq->lock); + return 0; + } + + sq->state = QUEUE_STOP; + + dprintk(CVP_SESS, "Stop session queue: %pK session_id = %d\n", + inst, hash32_ptr(inst->session)); + spin_unlock(&sq->lock); + + wake_up_all(&inst->session_queue.wq); + + return cvp_fence_thread_stop(inst); +} + static int msm_cvp_session_ctrl(struct msm_cvp_inst *inst, struct cvp_kmd_arg *arg) { diff --git a/drivers/media/platform/msm/cvp/msm_cvp.h b/drivers/media/platform/msm/cvp/msm_cvp.h index 06dba1990e4c..5875b631c109 100644 --- a/drivers/media/platform/msm/cvp/msm_cvp.h +++ b/drivers/media/platform/msm/cvp/msm_cvp.h @@ -32,4 +32,5 @@ static inline bool is_buf_param_valid(u32 buf_num, u32 offset) int msm_cvp_handle_syscall(struct msm_cvp_inst *inst, struct cvp_kmd_arg *arg); int msm_cvp_session_init(struct msm_cvp_inst *inst); int msm_cvp_session_deinit(struct msm_cvp_inst *inst); +int msm_cvp_session_queue_stop(struct msm_cvp_inst *inst); #endif diff --git a/drivers/media/platform/msm/cvp/msm_cvp_core.c b/drivers/media/platform/msm/cvp/msm_cvp_core.c index d1816381f2bb..64723f0fd50e 100644 --- a/drivers/media/platform/msm/cvp/msm_cvp_core.c +++ b/drivers/media/platform/msm/cvp/msm_cvp_core.c @@ -287,6 +287,7 @@ static void msm_cvp_cleanup_instance(struct msm_cvp_inst *inst) sq = &inst->session_queue; max_retries = inst->core->resources.msm_cvp_hw_rsp_timeout >> 1; + msm_cvp_session_queue_stop(inst); wait: mutex_lock(&inst->frames.lock);