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

Commit ef7fc5db authored by George Shen's avatar George Shen
Browse files

msm: cvp: Make CVP SMMU fault non-fatal error



CVP SSR can recover CVP SMMU in most cases.

Change-Id: I98480841d31e83fc78c872d11a8fb7c6c80c354a
Signed-off-by: default avatarGeorge Shen <sqiao@codeaurora.org>
parent 2251e53c
Loading
Loading
Loading
Loading
+6 −3
Original line number Diff line number Diff line
@@ -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,6 +1429,7 @@ void msm_cvp_ssr_handler(struct work_struct *work)
				mutex_unlock(&core->lock);
				usleep_range(500, 1000);
				dprintk(CVP_WARN, "Retry ssr\n");
				if (max_retries-- > 0)
					goto send_again;
			}
			dprintk(CVP_ERR, "%s: trigger_ssr failed\n",
+1 −0
Original line number Diff line number Diff line
@@ -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);
+3 −0
Original line number Diff line number Diff line
@@ -49,6 +49,8 @@

#define CVP_RT_PRIO_THRESHOLD 1

#define CVP_MAX_SSR_RETRIES 5

struct msm_cvp_inst;

enum cvp_core_state {
@@ -283,6 +285,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;
+5 −1
Original line number Diff line number Diff line
@@ -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,
	},
};


+3 −2
Original line number Diff line number Diff line
@@ -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;
		}