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

Commit 0eeb90fc authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "msm: vidc: cleanup vidc function to register o/p buf"

parents 67f7b691 716fb93e
Loading
Loading
Loading
Loading
+70 −48
Original line number Original line Diff line number Diff line
@@ -293,15 +293,66 @@ err_invalid_input:
	return temp;
	return temp;
}
}


static inline void populate_buf_info(struct buffer_info *binfo,
			struct v4l2_buffer *b, u32 i)
{
	binfo->type = b->type;
	binfo->fd[i] = b->m.planes[i].reserved[0];
	binfo->buff_off[i] = b->m.planes[i].reserved[1];
	binfo->size[i] = b->m.planes[i].length;
	binfo->uvaddr[i] = b->m.planes[i].m.userptr;
	binfo->device_addr[i] = 0;
	binfo->handle[i] = NULL;
}


int map_and_register_buf(struct msm_vidc_inst *inst, struct v4l2_buffer *b)
static struct msm_smem *map_buffer(struct msm_vidc_inst *inst,
		struct v4l2_plane *p, enum hal_buffer buffer_type)
{
{
	struct msm_smem *handle = NULL;
	struct msm_smem *handle = NULL;
	struct buffer_info *binfo;
	handle = msm_smem_user_to_kernel(inst->mem_client,
	struct buffer_info *temp;
				p->reserved[0],
				p->reserved[1],
				buffer_type);
	if (!handle) {
		dprintk(VIDC_ERR,
			"%s: Failed to get device buffer address\n", __func__);
		return NULL;
	}
	if (msm_smem_cache_operations(inst->mem_client, handle,
			SMEM_CACHE_CLEAN))
		dprintk(VIDC_WARN,
			"CACHE Clean failed: %d, %d, %d\n",
				p->reserved[0],
				p->reserved[1],
				p->length);
	return handle;
}

static inline enum hal_buffer get_hal_buffer_type(
		struct msm_vidc_inst *inst, struct v4l2_buffer *b)
{
	if (inst->session_type == MSM_VIDC_DECODER) {
		if (b->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE)
			return HAL_BUFFER_INPUT;
		else /* V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE */
			return HAL_BUFFER_OUTPUT;
	} else {
		/* FIXME in the future.  See comment in msm_comm_get_\
		 * domain_partition. Same problem here. */
		if (b->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE)
			return HAL_BUFFER_OUTPUT;
		else /* V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE */
			return HAL_BUFFER_INPUT;
	}
	return -EINVAL;
}

int map_and_register_buf(struct msm_vidc_inst *inst, struct v4l2_buffer *b)
{
	struct buffer_info *binfo = NULL;
	struct buffer_info *temp = NULL;
	int plane = 0;
	int plane = 0;
	int i, rc = 0;
	int i, rc = 0;
	enum hal_buffer buffer_type;


	if (!b || !inst) {
	if (!b || !inst) {
		dprintk(VIDC_ERR, "%s: invalid input\n", __func__);
		dprintk(VIDC_ERR, "%s: invalid input\n", __func__);
@@ -340,74 +391,45 @@ int map_and_register_buf(struct msm_vidc_inst *inst, struct v4l2_buffer *b)
			dprintk(VIDC_DBG,
			dprintk(VIDC_DBG,
				"This memory region has already been prepared\n");
				"This memory region has already been prepared\n");
			rc = -EINVAL;
			rc = -EINVAL;
			kfree(binfo);
			goto exit;
			goto exit;
		}
		}
		if (inst->session_type == MSM_VIDC_DECODER) {
			if (b->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE)
				buffer_type = HAL_BUFFER_INPUT;
			else /* V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE */
				buffer_type = HAL_BUFFER_OUTPUT;
		} else {
			/* FIXME in the future.  See comment in msm_comm_get_\
			 * domain_partition. Same problem here. */
			if (b->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE)
				buffer_type = HAL_BUFFER_OUTPUT;
			else /* V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE */
				buffer_type = HAL_BUFFER_INPUT;
		}


		temp = get_same_fd_buffer(&inst->registered_bufs,
		temp = get_same_fd_buffer(&inst->registered_bufs,
				b->m.planes[i].reserved[0], &plane);
				b->m.planes[i].reserved[0], &plane);


		if (temp) {
		if (temp) {
			binfo->type = b->type;
			populate_buf_info(binfo, b, i);
			binfo->fd[i] = b->m.planes[i].reserved[0];
			binfo->buff_off[i] = b->m.planes[i].reserved[1];
			binfo->size[i] = b->m.planes[i].length;
			binfo->uvaddr[i] = b->m.planes[i].m.userptr;
			binfo->device_addr[i] =
			binfo->device_addr[i] =
			temp->handle[plane]->device_addr + binfo->buff_off[i];
			temp->handle[plane]->device_addr + binfo->buff_off[i];
			binfo->handle[i] = NULL;
			b->m.planes[i].m.userptr = binfo->device_addr[i];
		} else {
		} else {
			handle = msm_smem_user_to_kernel(inst->mem_client,
			populate_buf_info(binfo, b, i);
					b->m.planes[i].reserved[0],
			binfo->handle[i] =
					b->m.planes[i].reserved[1],
				map_buffer(inst, &b->m.planes[i],
					buffer_type);
					get_hal_buffer_type(inst, b));
			if (!handle) {
			if (!binfo->handle[i]) {
				dprintk(VIDC_ERR,
				rc = -EINVAL;
					"Failed to get device buffer address\n");
				kfree(binfo);
				goto exit;
				goto exit;
			}
			}
			binfo->type = b->type;
			binfo->fd[i] = b->m.planes[i].reserved[0];
			binfo->buff_off[i] = b->m.planes[i].reserved[1];
			binfo->size[i] = b->m.planes[i].length;
			binfo->uvaddr[i] = b->m.planes[i].m.userptr;
			binfo->device_addr[i] =
			binfo->device_addr[i] =
				handle->device_addr + binfo->buff_off[i];
				binfo->handle[i]->device_addr +
			binfo->handle[i] = handle;
				binfo->buff_off[i];
			b->m.planes[i].m.userptr =
				binfo->device_addr[i];
			dprintk(VIDC_DBG, "Registering buffer: %d, %d, %d\n",
			dprintk(VIDC_DBG, "Registering buffer: %d, %d, %d\n",
					b->m.planes[i].reserved[0],
					b->m.planes[i].reserved[0],
					b->m.planes[i].reserved[1],
					b->m.planes[i].reserved[1],
					b->m.planes[i].length);
					b->m.planes[i].length);
			rc = msm_smem_cache_operations(inst->mem_client,
				binfo->handle[i], SMEM_CACHE_CLEAN);
			if (rc)
				dprintk(VIDC_WARN,
					"CACHE Clean failed: %d, %d, %d\n",
					b->m.planes[i].reserved[0],
					b->m.planes[i].reserved[1],
					b->m.planes[i].length);
		}
		}
		b->m.planes[i].m.userptr = binfo->device_addr[i];
	}
	}
	binfo->num_planes = b->length;
	binfo->num_planes = b->length;
	list_add_tail(&binfo->list, &inst->registered_bufs);
	list_add_tail(&binfo->list, &inst->registered_bufs);
	return 0;
exit:
exit:
	kfree(binfo);
	return rc;
	return rc;
}
}

int msm_vidc_prepare_buf(void *instance, struct v4l2_buffer *b)
int msm_vidc_prepare_buf(void *instance, struct v4l2_buffer *b)
{
{
	struct msm_vidc_inst *inst = instance;
	struct msm_vidc_inst *inst = instance;