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

Commit 8d87d2f2 authored by Ruofei Ma's avatar Ruofei Ma
Browse files

msm: cvp: FD support in fence path



Add FD support in fench path for Lahaina.

Change-Id: I0f69e286bb54758e255b91b8b6f5fc6e9fa831bc
Signed-off-by: default avatarRuofei Ma <ruofeim@codeaurora.org>
parent 59d3346d
Loading
Loading
Loading
Loading
+152 −38
Original line number Diff line number Diff line
@@ -456,7 +456,9 @@ void msm_cvp_unmap_buf_cpu(struct msm_cvp_inst *inst, u64 ktid)
		return;
	}

	ktid &= (FENCE_BIT - 1);
	dprintk(CVP_DBG, "%s: unmap frame %llu\n", __func__, ktid);

	found = false;
	mutex_lock(&inst->frames.lock);
	list_for_each_entry_safe(frame, dummy1, &inst->frames.list, list) {
@@ -886,10 +888,8 @@ static int cvp_fence_dme(struct msm_cvp_inst *inst, u32 *synx,
		dprintk(CVP_ERR, "%s: Failed in call_hfi_op %d, %x\n", __func__,
				pkt->size, pkt->packet_type);
		synx_state = SYNX_STATE_SIGNALED_ERROR;
	}

	if (synx_state == SYNX_STATE_SIGNALED_ERROR)
		goto exit;
	}

	timeout = msecs_to_jiffies(CVP_MAX_WAIT_TIME);
	rc = cvp_wait_process_message(inst, sq, &ktid, timeout, NULL);
@@ -915,6 +915,76 @@ static int cvp_fence_dme(struct msm_cvp_inst *inst, u32 *synx,
	return rc;
}

static int cvp_fence_proc(struct msm_cvp_inst *inst, u32 *synx,
			struct cvp_hfi_cmd_session_hdr *pkt)
{
	int i;
	int rc = 0;
	unsigned long timeout;
	int h_synx;
	u64 ktid;
	unsigned long timeout_ms = 1000;
	int synx_state = SYNX_STATE_SIGNALED_SUCCESS;
	struct cvp_hfi_device *hdev;
	struct cvp_session_queue *sq;
	struct synx_session ssid;
	u32 in, out;

	dprintk(CVP_DBG, "Enter %s\n", __func__);

	hdev = inst->core->device;
	sq = &inst->session_queue_fence;
	ssid = inst->synx_session_id;
	ktid = pkt->client_data.kdata;

	in = synx[0] >> 16;
	out = synx[0] & 0xFFFF;

	i = 1;
	while (i <= in) {
		h_synx = synx[i];
		if (h_synx) {
			rc = synx_wait(ssid, h_synx, timeout_ms);
			if (rc) {
				dprintk(CVP_ERR, "%s: synx_wait %d failed\n",
					__func__, i);
				synx_state = SYNX_STATE_SIGNALED_ERROR;
				goto exit;
			}
		}
		++i;
	}

	rc = call_hfi_op(hdev, session_send, (void *)inst->session,
			(struct cvp_kmd_hfi_packet *)pkt);
	if (rc) {
		dprintk(CVP_ERR, "%s: Failed in call_hfi_op %d, %x\n", __func__,
				pkt->size, pkt->packet_type);
		synx_state = SYNX_STATE_SIGNALED_ERROR;
		goto exit;
	}

	timeout = msecs_to_jiffies(CVP_MAX_WAIT_TIME);
	rc = cvp_wait_process_message(inst, sq, &ktid, timeout, NULL);

exit:
	i = in + 1;
	while (i <= in + out) {
		h_synx = synx[i];
		if (h_synx) {
			rc = synx_signal(ssid, h_synx, synx_state);
			if (rc) {
				dprintk(CVP_ERR, "%s: synx_signal %d failed\n",
				__func__, i);
				synx_state = SYNX_STATE_SIGNALED_ERROR;
			}
		}
		++i;
	}

	return rc;
}

static int cvp_alloc_fence_data(struct cvp_fence_command **f, u32 size)
{
	struct cvp_fence_command *fcmd;
@@ -946,6 +1016,7 @@ static int cvp_import_synx(struct msm_cvp_inst *inst, u32 type, u32 *fence,
{
	int rc = 0;
	int i;
	int start = 0, end = 0;
	struct cvp_fence_type *f;
	struct synx_import_params params;
	s32 h_synx;
@@ -956,7 +1027,35 @@ static int cvp_import_synx(struct msm_cvp_inst *inst, u32 type, u32 *fence,

	switch (type) {
	case HFI_CMD_SESSION_CVP_DME_FRAME:
		for (i = 0; i < HFI_DME_BUF_NUM; ++i) {
	{
		start = 0;
		end = HFI_DME_BUF_NUM;
		break;
	}
	case HFI_CMD_SESSION_CVP_FD_FRAME:
	{
		u32 in = fence[0];
		u32 out = fence[1];

		if (in > MAX_HFI_FENCE_SIZE || out > MAX_HFI_FENCE_SIZE
			|| in > MAX_HFI_FENCE_SIZE - out) {
			dprintk(CVP_ERR, "%s: failed!\n", __func__);
			rc = -EINVAL;
			return rc;
		}

		synx[0] = (in << 16) | out;
		start = 1;
		end = in + out + 1;
		break;
	}
	default:
		dprintk(CVP_ERR, "%s: unknown fence type\n", __func__);
		rc = -EINVAL;
		return rc;
	}

	for (i = start; i < end; ++i) {
		h_synx = f[i].h_synx;

		if (h_synx) {
@@ -973,10 +1072,6 @@ static int cvp_import_synx(struct msm_cvp_inst *inst, u32 type, u32 *fence,
			}
		}
	}
		break;
	default:
		break;
	}

	return rc;
}
@@ -987,12 +1082,35 @@ static int cvp_release_synx(struct msm_cvp_inst *inst, u32 type, u32 *synx)
	int i;
	s32 h_synx;
	struct synx_session ssid;
	int start = 0, end = 0;

	ssid = inst->synx_session_id;

	switch (type) {
	case HFI_CMD_SESSION_CVP_DME_FRAME:
		for (i = 0; i < HFI_DME_BUF_NUM; ++i) {
	{
		start = 0;
		end = HFI_DME_BUF_NUM;

		break;
	}
	case HFI_CMD_SESSION_CVP_FD_FRAME:
	{
		u32 in = synx[0] >> 16;
		u32 out = synx[0] & 0xFFFF;

		start = 1;
		end = in + out + 1;

		break;
	}
	default:
		dprintk(CVP_ERR, "%s: unknown fence type\n", __func__);
		rc = -EINVAL;
		return rc;
	}

	for (i = start; i < end; ++i) {
		h_synx = synx[i];
		if (h_synx) {
			rc = synx_release(ssid, h_synx);
@@ -1002,10 +1120,6 @@ static int cvp_release_synx(struct msm_cvp_inst *inst, u32 type, u32 *synx)
				__func__, i);
		}
	}
		break;
	default:
		break;
	}

	return rc;
}
@@ -1051,6 +1165,9 @@ static int cvp_fence_thread(void *data)
	case HFI_CMD_SESSION_CVP_DME_FRAME:
		rc = cvp_fence_dme(inst, synx, pkt);
		break;
	case HFI_CMD_SESSION_CVP_FD_FRAME:
		rc = cvp_fence_proc(inst, synx, pkt);
		break;
	default:
		dprintk(CVP_ERR, "%s: unknown hfi cmd type 0x%x\n",
			__func__, fence_data->type);
@@ -1654,9 +1771,10 @@ static int cvp_fence_thread_start(struct msm_cvp_inst *inst)
	spin_unlock(&q->lock);

	for (i = 0; i < inst->prop.fthread_nr; ++i) {
		if (!cvp_get_inst_validate(inst->core, inst))
		if (!cvp_get_inst_validate(inst->core, inst)) {
			rc = -ECONNRESET;
			goto exit;
		}

		snprintf(tname, sizeof(tname), "fthread_%d", tnum++);
		thread = kthread_run(cvp_fence_thread, inst, tname);
@@ -1725,9 +1843,7 @@ static int msm_cvp_session_start(struct msm_cvp_inst *inst,
	sq->state = QUEUE_ACTIVE;
	spin_unlock(&sq->lock);

	cvp_fence_thread_start(inst);

	return 0;
	return cvp_fence_thread_start(inst);
}

static int msm_cvp_session_stop(struct msm_cvp_inst *inst,
@@ -1752,9 +1868,7 @@ static int msm_cvp_session_stop(struct msm_cvp_inst *inst,

	wake_up_all(&inst->session_queue.wq);

	cvp_fence_thread_stop(inst);

	return 0;
	return cvp_fence_thread_stop(inst);
}

static int msm_cvp_session_ctrl(struct msm_cvp_inst *inst,