diff --git a/drivers/media/platform/msm/cvp/msm_cvp_common.c b/drivers/media/platform/msm/cvp/msm_cvp_common.c index 3be1ce61b931..40301fc4cb17 100644 --- a/drivers/media/platform/msm/cvp/msm_cvp_common.c +++ b/drivers/media/platform/msm/cvp/msm_cvp_common.c @@ -659,7 +659,9 @@ static void handle_sys_error(enum hal_command_response cmd, void *data) cur_state = core->state; core->state = CVP_CORE_UNINIT; - dprintk(CVP_WARN, "SYS_ERROR received for core %pK\n", core); + dprintk(CVP_WARN, "SYS_ERROR from core %pK ssr_sess_cnt %lld\n", + core, core->ssr_sess_cnt); + core->ssr_sess_cnt = 0; msm_cvp_noc_error_info(core); call_hfi_op(hdev, flush_debug_queue, hdev->hfi_device_data); list_for_each_entry(inst, &core->instances, list) { @@ -1367,7 +1369,7 @@ int msm_cvp_trigger_ssr(struct msm_cvp_core *core, void msm_cvp_ssr_handler(struct work_struct *work) { - int rc; + int rc, max_retries = CVP_MAX_SSR_RETRIES; struct msm_cvp_core *core; struct cvp_hfi_device *hdev; @@ -1427,7 +1429,8 @@ send_again: mutex_unlock(&core->lock); usleep_range(500, 1000); dprintk(CVP_WARN, "Retry ssr\n"); - goto send_again; + if (max_retries-- > 0) + goto send_again; } dprintk(CVP_ERR, "%s: trigger_ssr failed\n", __func__); diff --git a/drivers/media/platform/msm/cvp/msm_cvp_core.c b/drivers/media/platform/msm/cvp/msm_cvp_core.c index 32fd484ac2ae..5347eade1782 100644 --- a/drivers/media/platform/msm/cvp/msm_cvp_core.c +++ b/drivers/media/platform/msm/cvp/msm_cvp_core.c @@ -211,6 +211,7 @@ void *msm_cvp_open(int core_id, int session_type) mutex_lock(&core->lock); list_add_tail(&inst->list, &core->instances); + core->ssr_sess_cnt++; mutex_unlock(&core->lock); __init_fence_queue(inst); diff --git a/drivers/media/platform/msm/cvp/msm_cvp_internal.h b/drivers/media/platform/msm/cvp/msm_cvp_internal.h index 4f7c0f4ec2c1..533e16cfce56 100644 --- a/drivers/media/platform/msm/cvp/msm_cvp_internal.h +++ b/drivers/media/platform/msm/cvp/msm_cvp_internal.h @@ -50,6 +50,8 @@ /* Adjust this value to admit non-realtime session */ #define CVP_RT_PRIO_THRESHOLD 0 +#define CVP_MAX_SSR_RETRIES 5 + struct msm_cvp_inst; enum cvp_core_state { @@ -284,6 +286,7 @@ struct msm_cvp_core { bool smmu_fault_handled; u32 last_fault_addr; bool trigger_ssr; + u64 ssr_sess_cnt; unsigned long curr_freq; struct cvp_cycle_info dyn_clk; atomic64_t kernel_trans_id; diff --git a/drivers/media/platform/msm/cvp/msm_cvp_platform.c b/drivers/media/platform/msm/cvp/msm_cvp_platform.c index 9c79785e3a0d..206f102e32ef 100644 --- a/drivers/media/platform/msm/cvp/msm_cvp_platform.c +++ b/drivers/media/platform/msm/cvp/msm_cvp_platform.c @@ -149,7 +149,11 @@ static struct msm_cvp_common_data sm8350_common_data[] = { { .key = "qcom,debug-timeout", .value = 0, - } + }, + { + .key = "qcom,domain-attr-non-fatal-faults", + .value = 1, + }, }; diff --git a/drivers/media/platform/msm/cvp/msm_cvp_res_parse.c b/drivers/media/platform/msm/cvp/msm_cvp_res_parse.c index 21ae692273ad..5c96c9fe53c9 100644 --- a/drivers/media/platform/msm/cvp/msm_cvp_res_parse.c +++ b/drivers/media/platform/msm/cvp/msm_cvp_res_parse.c @@ -925,8 +925,9 @@ int msm_cvp_smmu_fault_handler(struct iommu_domain *domain, if (core->smmu_fault_handled) { if (core->resources.non_fatal_pagefaults) { - WARN_ONCE(1, "%s: non-fatal pagefault address: %lx\n", - __func__, iova); + pr_err_ratelimited( + "msm_cvp: non-fatal pagefault address %lx\n", + iova); *pfaddr = (*pfaddr == 0) ? iova : (*pfaddr); return 0; }