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

Commit ef446970 authored by Haseeb Khan's avatar Haseeb Khan
Browse files

msm: cvp: Enhance CVP release persist buffer process for DSP sessions



Do not release CVP persist buffers until all outstanding DSP frames
are handled by firmware.

Change-Id: I80ed488962109d09c368097534c6d1c9d1bee9b6
Signed-off-by: default avatarHaseeb Khan <hkhan@codeaurora.org>
parent f5b0a62a
Loading
Loading
Loading
Loading
+26 −1
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0-only
/*
 * Copyright (c) 2018-2019, The Linux Foundation. All rights reserved.
 * Copyright (c) 2018-2020, The Linux Foundation. All rights reserved.
 */

#include <linux/dma-direction.h>
@@ -367,14 +367,39 @@ EXPORT_SYMBOL(msm_cvp_open);

static void msm_cvp_cleanup_instance(struct msm_cvp_inst *inst)
{
	bool empty;
	int max_retries;

	if (!inst) {
		dprintk(CVP_ERR, "%s: invalid params\n", __func__);
		return;
	}

	max_retries =  inst->core->resources.msm_cvp_hw_rsp_timeout >> 1;

wait:
	mutex_lock(&inst->cvpdspbufs.lock);
	empty = list_empty(&inst->cvpdspbufs.list);
	if (!empty && max_retries > 0) {
		mutex_unlock(&inst->cvpdspbufs.lock);
		usleep_range(1000, 2000);
		max_retries--;
		goto wait;
	}
	mutex_unlock(&inst->cvpdspbufs.lock);

	dprintk(CVP_DBG, "empty %d, retry %d\n", (int)empty,
	(inst->core->resources.msm_cvp_hw_rsp_timeout >> 1) - max_retries);
	if (!empty) {
		dprintk(CVP_WARN,
			"Failed to process frames before session close\n");
	}

	if (cvp_comm_release_persist_buffers(inst))
		dprintk(CVP_ERR,
			"Failed to release persist buffers\n");

	dprintk(CVP_DBG, "Done cvp cleanup instance\n");
}

int msm_cvp_destroy(struct msm_cvp_inst *inst)