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

Commit 9a8238f5 authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "msm: cvp: Fix bugs causing camera DME failure"

parents ec597208 af92ff84
Loading
Loading
Loading
Loading
+59 −56
Original line number Diff line number Diff line
@@ -518,7 +518,7 @@ static int msm_cvp_session_process_hfi(

static int msm_cvp_thread_fence_run(void *data)
{
	int i, pkt_idx, rc = 0;
	int i, rc = 0;
	unsigned long timeout_ms = 1000;
	int synx_obj;
	struct hfi_device *hdev;
@@ -527,9 +527,6 @@ static int msm_cvp_thread_fence_run(void *data)
	struct cvp_kmd_hfi_packet *in_pkt;
	struct msm_cvp_inst *inst;
	int *fence;
	struct msm_cvp_internal_buffer *cbuf = NULL;
	struct buf_desc *buf_ptr;
	unsigned int offset, buf_num;

	if (!data) {
		dprintk(CVP_ERR, "%s Wrong input data %pK\n", __func__, data);
@@ -549,57 +546,6 @@ static int msm_cvp_thread_fence_run(void *data)
	fence = (int *)(in_fence_pkt->fence_data);
	hdev = inst->core->device;

	pkt_idx = get_pkt_index((struct cvp_hal_session_cmd_pkt *)in_pkt);
	if (pkt_idx < 0) {
		dprintk(CVP_ERR, "%s incorrect packet %d, %x\n", __func__,
			in_pkt->pkt_data[0],
			in_pkt->pkt_data[1]);
		rc = pkt_idx;
		goto exit;
	}

	offset = cvp_hfi_defs[pkt_idx].buf_offset;
	buf_num = cvp_hfi_defs[pkt_idx].buf_num;

	if (offset != 0 && buf_num != 0) {
		buf_ptr = (struct buf_desc *)&in_pkt->pkt_data[offset];

		for (i = 0; i < buf_num; i++) {
			if (!buf_ptr[i].fd)
				continue;

			rc = msm_cvp_session_get_iova_addr(inst, &cbuf,
				buf_ptr[i].fd,
				buf_ptr[i].size,
				&buf_ptr[i].fd,
				&buf_ptr[i].size);

			if (rc == -ENOENT) {
				dprintk(CVP_DBG, "%s map buf fd %d size %d\n",
					__func__, buf_ptr[i].fd,
					buf_ptr[i].size);
				rc = msm_cvp_map_buf_cpu(inst, buf_ptr[i].fd,
						buf_ptr[i].size, &cbuf);
				if (rc || !cbuf) {
					dprintk(CVP_ERR,
					"%s: buf %d register failed. rc=%d\n",
					__func__, i, rc);
					do_exit(rc);
				}
				buf_ptr[i].fd = cbuf->smem.device_addr;
				buf_ptr[i].size = cbuf->buf.size;
			} else if (rc) {
				dprintk(CVP_ERR,
				"%s: buf %d register failed. rc=%d\n",
				__func__, i, rc);
				do_exit(rc);
			}
			msm_cvp_smem_cache_operations(cbuf->smem.dma_buf,
						SMEM_CACHE_CLEAN_INVALIDATE,
						0, buf_ptr[i].size);
		}
	}

	//wait on synx before signaling HFI
	switch (fence_thread_data->arg_type) {
	case CVP_KMD_HFI_DME_FRAME_FENCE_CMD:
@@ -691,8 +637,13 @@ static int msm_cvp_session_process_hfi_fence(
{
	static int thread_num;
	struct task_struct *thread;
	int rc = 0;
	int i, rc = 0;
	char thread_fence_name[32];
	int pkt_idx;
	struct cvp_kmd_hfi_packet *in_pkt;
	unsigned int offset, buf_num;
	struct msm_cvp_internal_buffer *cbuf = NULL;
	struct buf_desc *buf_ptr;

	dprintk(CVP_DBG, "%s: Enter inst = %d", __func__, inst);

@@ -701,6 +652,58 @@ static int msm_cvp_session_process_hfi_fence(
		return -EINVAL;
	}

	in_pkt = (struct cvp_kmd_hfi_packet *)&arg->data.hfi_pkt;
	pkt_idx = get_pkt_index((struct cvp_hal_session_cmd_pkt *)in_pkt);
	if (pkt_idx < 0) {
		dprintk(CVP_ERR, "%s incorrect packet %d, %x\n", __func__,
			in_pkt->pkt_data[0],
			in_pkt->pkt_data[1]);
		rc = pkt_idx;
		return rc;
	}

	offset = cvp_hfi_defs[pkt_idx].buf_offset;
	buf_num = cvp_hfi_defs[pkt_idx].buf_num;

	if (offset != 0 && buf_num != 0) {
		buf_ptr = (struct buf_desc *)&in_pkt->pkt_data[offset];

		for (i = 0; i < buf_num; i++) {
			if (!buf_ptr[i].fd)
				continue;

			rc = msm_cvp_session_get_iova_addr(inst, &cbuf,
				buf_ptr[i].fd,
				buf_ptr[i].size,
				&buf_ptr[i].fd,
				&buf_ptr[i].size);

			if (rc == -ENOENT) {
				dprintk(CVP_DBG, "%s map buf fd %d size %d\n",
					__func__, buf_ptr[i].fd,
					buf_ptr[i].size);
				rc = msm_cvp_map_buf_cpu(inst, buf_ptr[i].fd,
						buf_ptr[i].size, &cbuf);
				if (rc || !cbuf) {
					dprintk(CVP_ERR,
					"%s: buf %d register failed. rc=%d\n",
					__func__, i, rc);
					return rc;
				}
				buf_ptr[i].fd = cbuf->smem.device_addr;
				buf_ptr[i].size = cbuf->buf.size;
			} else if (rc) {
				dprintk(CVP_ERR,
				"%s: buf %d register failed. rc=%d\n",
				__func__, i, rc);
				return rc;
			}
			msm_cvp_smem_cache_operations(cbuf->smem.dma_buf,
						SMEM_CACHE_CLEAN_INVALIDATE,
						0, buf_ptr[i].size);
		}
	}

	thread_num = thread_num + 1;
	fence_thread_data.inst = inst;
	fence_thread_data.device_id = (unsigned int)inst->core->id;
+2 −2
Original line number Diff line number Diff line
@@ -68,8 +68,8 @@ static const struct file_operations cvp_fops = {
	.owner = THIS_MODULE,
	.open = cvp_open,
	.release = cvp_close,
	.unlocked_ioctl = msm_cvp_v4l2_private,
	.compat_ioctl = msm_cvp_v4l2_private,
	.unlocked_ioctl = cvp_unblocked_ioctl,
	.compat_ioctl = cvp_compat_ioctl,
	.poll = cvp_poll,
};

+53 −13
Original line number Diff line number Diff line
@@ -130,13 +130,32 @@ static int _copy_fence_pkt_to_user(struct cvp_kmd_arg *kp,
	return 0;
}

static void _set_deprecate_bitmask(struct cvp_kmd_arg *kp,
			struct msm_cvp_inst *inst)
{
	int bit_offset;

	dprintk(CVP_DBG, "%s: kp->type = %#x\n", __func__, kp->type);
	if (kp->type == CVP_KMD_HFI_DFS_FRAME_CMD ||
			kp->type == CVP_KMD_HFI_DME_FRAME_CMD ||
			kp->type == CVP_KMD_HFI_PERSIST_CMD) {
		bit_offset = kp->type - CVP_KMD_CMD_START;
		set_bit(bit_offset, &inst->deprecate_bitmask);
	}

	if (kp->type == CVP_KMD_HFI_DME_FRAME_FENCE_CMD) {
		bit_offset = CVP_KMD_HFI_DME_FRAME_CMD - CVP_KMD_CMD_START;
		set_bit(bit_offset, &inst->deprecate_bitmask);
	}
}

static int convert_from_user(struct cvp_kmd_arg *kp,
		unsigned long arg,
		struct msm_cvp_inst *inst)
{
	int rc = 0;
	int i, bit_offset;
	struct cvp_kmd_arg __user *up = compat_ptr(arg);
	int i;
	struct cvp_kmd_arg __user *up = (struct cvp_kmd_arg *)arg;
	struct cvp_hal_session_cmd_pkt pkt_hdr;

	if (!kp || !up) {
@@ -147,12 +166,7 @@ static int convert_from_user(struct cvp_kmd_arg *kp,
	if (get_user(kp->type, &up->type))
		return -EFAULT;

	if (kp->type == CVP_KMD_HFI_DFS_FRAME_CMD ||
			kp->type == CVP_KMD_HFI_DME_FRAME_CMD ||
			kp->type == CVP_KMD_HFI_PERSIST_CMD) {
		bit_offset = kp->type - CVP_KMD_CMD_START;
		set_bit(bit_offset, &inst->deprecate_bitmask);
	}
	_set_deprecate_bitmask(kp, inst);

	if (get_user(kp->buf_offset, &up->buf_offset) ||
		get_user(kp->buf_num, &up->buf_num))
@@ -290,7 +304,7 @@ static int convert_to_user(struct cvp_kmd_arg *kp, unsigned long arg)
{
	int rc = 0;
	int i, size = sizeof(struct hfi_msg_session_hdr) >> 2;
	struct cvp_kmd_arg __user *up = compat_ptr(arg);
	struct cvp_kmd_arg __user *up = (struct cvp_kmd_arg *)arg;
	struct cvp_hal_session_cmd_pkt pkt_hdr;

	if (!kp || !up) {
@@ -435,14 +449,13 @@ static int convert_to_user(struct cvp_kmd_arg *kp, unsigned long arg)
	return rc;
}

long msm_cvp_v4l2_private(struct file *filp,
static long cvp_ioctl(struct msm_cvp_inst *inst,
	unsigned int cmd, unsigned long arg)
{
	int rc;
	struct msm_cvp_inst *inst;
	struct cvp_kmd_arg karg;

	if (!filp || !filp->private_data) {
	if (!inst) {
		dprintk(CVP_ERR, "%s: invalid params\n", __func__);
		return -EINVAL;
	}
@@ -451,7 +464,6 @@ long msm_cvp_v4l2_private(struct file *filp,
	if (cmd != VIDIOC_CVP_CMD)
		return 0;

	inst = filp->private_data;
	memset(&karg, 0, sizeof(struct cvp_kmd_arg));

	if (convert_from_user(&karg, arg, inst)) {
@@ -475,3 +487,31 @@ long msm_cvp_v4l2_private(struct file *filp,

	return rc;
}

long cvp_unblocked_ioctl(struct file *filp,
		unsigned int cmd, unsigned long arg)
{
	struct msm_cvp_inst *inst;

	if (!filp || !filp->private_data) {
		dprintk(CVP_ERR, "%s: invalid params\n", __func__);
		return -EINVAL;
	}

	inst = filp->private_data;
	return cvp_ioctl(inst, cmd, arg);
}

long cvp_compat_ioctl(struct file *filp,
		unsigned int cmd, unsigned long arg)
{
	struct msm_cvp_inst *inst;

	if (!filp || !filp->private_data) {
		dprintk(CVP_ERR, "%s: invalid params\n", __func__);
		return -EINVAL;
	}

	inst = filp->private_data;
	return cvp_ioctl(inst, cmd, (unsigned long)compat_ptr(arg));
}
+4 −1
Original line number Diff line number Diff line
@@ -9,7 +9,10 @@
#include <media/msm_cvp_private.h>
#include "msm_cvp_debug.h"

long msm_cvp_v4l2_private(struct file *file,
long cvp_unblocked_ioctl(struct file *filp,
		unsigned int cmd, unsigned long arg);

long cvp_compat_ioctl(struct file *filp,
		unsigned int cmd, unsigned long arg);

#endif