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

Commit ba78735a authored by Maheshwar Ajja's avatar Maheshwar Ajja
Browse files

msm: vidc: send dmabuf pointer instead of fd



Send dmabuf pointer in reserved fields instead of fd
to CVP driver for internal CVP usage buffers as fd is
not available for these buffers.

Change-Id: Ic25a445253b4ae05748d47b7caf0b88e909aad7e
Signed-off-by: default avatarMaheshwar Ajja <majja@codeaurora.org>
parent 03172d2c
Loading
Loading
Loading
Loading
+37 −33
Original line number Diff line number Diff line
@@ -7,6 +7,9 @@
#include "msm_cvp_external.h"
#include "msm_vidc_common.h"

#define LOWER32(a) ((u32)((u64)a))
#define UPPER32(a) ((u32)((u64)a >> 32))

static void print_cvp_buffer(u32 tag, const char *str,
		struct msm_vidc_inst *inst, struct msm_cvp_buf *cbuf)
{
@@ -22,6 +25,22 @@ static void print_cvp_buffer(u32 tag, const char *str,
		cbuf->offset, cbuf->dbuf, cbuf->kvaddr);
}

static int fill_cvp_buffer(struct msm_cvp_buffer_type *dst,
		struct msm_cvp_buf *src)
{
	if (!dst || !src) {
		dprintk(VIDC_ERR, "%s: invalid params\n", __func__);
		return -EINVAL;
	}

	dst->buffer_addr = -1;
	dst->reserved1 = LOWER32(src->dbuf);
	dst->reserved2 = UPPER32(src->dbuf);
	dst->size = src->size;

	return 0;
}

static int msm_cvp_get_version_info(struct msm_vidc_inst *inst)
{
	int rc;
@@ -189,7 +208,6 @@ static int msm_cvp_allocate_buffer(struct msm_vidc_inst *inst,
	int ion_flags = 0;
	unsigned long heap_mask = 0;
	struct dma_buf *dbuf;
	int fd;

	if (!inst || !inst->cvp || !buffer) {
		dprintk(VIDC_ERR, "%s: invalid params\n", __func__);
@@ -212,14 +230,7 @@ static int msm_cvp_allocate_buffer(struct msm_vidc_inst *inst,
		goto error;
	}
	buffer->dbuf = dbuf;

	fd = dma_buf_fd(dbuf, O_CLOEXEC);
	if (fd < 0) {
		dprintk(VIDC_ERR, "%s: failed to get fd\n", __func__);
		rc = -ENOMEM;
		goto error;
	}
	buffer->fd = fd;
	buffer->fd = -1;

	if (kernel_map) {
		buffer->kvaddr = dma_buf_vmap(dbuf);
@@ -539,10 +550,8 @@ static void msm_cvp_deinit_internal_buffers(struct msm_vidc_inst *inst)
			HFI_CMD_SESSION_CVP_RELEASE_PERSIST_BUFFERS;
		persist2_packet.session_id = cvp->session_id;
		persist2_packet.cvp_op = CVP_DME;
		persist2_packet.persist2_buffer.buffer_addr =
			cvp->persist2_buffer.fd;
		persist2_packet.persist2_buffer.size =
			cvp->persist2_buffer.size;
		fill_cvp_buffer(&persist2_packet.persist2_buffer,
				&cvp->persist2_buffer);

		arg = kzalloc(sizeof(struct cvp_kmd_arg), GFP_KERNEL);
		if (arg) {
@@ -610,8 +619,8 @@ static int msm_cvp_init_internal_buffers(struct msm_vidc_inst *inst)
	persist2_packet.packet_type = HFI_CMD_SESSION_CVP_SET_PERSIST_BUFFERS;
	persist2_packet.session_id = cvp->session_id;
	persist2_packet.cvp_op = CVP_DME;
	persist2_packet.persist2_buffer.buffer_addr = cvp->persist2_buffer.fd;
	persist2_packet.persist2_buffer.size = cvp->persist2_buffer.size;
	fill_cvp_buffer(&persist2_packet.persist2_buffer,
			&cvp->persist2_buffer);

	memset(arg, 0, sizeof(struct cvp_kmd_arg));
	arg->type = CVP_KMD_HFI_PERSIST_CMD;
@@ -831,6 +840,7 @@ static int msm_cvp_frame_process(struct msm_vidc_inst *inst,
	cvp->fullres_buffer.fd = vb->planes[0].m.fd;
	cvp->fullres_buffer.size = vb->planes[0].length;
	cvp->fullres_buffer.offset = vb->planes[0].data_offset;
	cvp->fullres_buffer.dbuf = mbuf->smem[0].dma_buf;

	/* frame skip logic */
	fps = max(inst->clk_data.operating_rate,
@@ -875,25 +885,19 @@ static int msm_cvp_frame_process(struct msm_vidc_inst *inst,
	frame->descmatch_threshold = 52;
	frame->ncc_robustness_threshold = 0;

	frame->fullres_srcbuffer.buffer_addr = cvp->fullres_buffer.fd;
	frame->fullres_srcbuffer.size = cvp->fullres_buffer.size;
	frame->videospatialtemporal_statsbuffer.buffer_addr =
			cvp->output_buffer.fd;
	frame->videospatialtemporal_statsbuffer.size =
			cvp->output_buffer.size;

	frame->src_buffer.buffer_addr = cvp->fullres_buffer.fd;
	frame->src_buffer.size = cvp->fullres_buffer.size;
	fill_cvp_buffer(&frame->fullres_srcbuffer,
				&cvp->fullres_buffer);
	fill_cvp_buffer(&frame->videospatialtemporal_statsbuffer,
				&cvp->output_buffer);
	fill_cvp_buffer(&frame->src_buffer, &cvp->fullres_buffer);
	if (cvp->downscale) {
		frame->src_buffer.buffer_addr = cvp->src_buffer.fd;
		frame->src_buffer.size = cvp->src_buffer.size;
		frame->ref_buffer.buffer_addr = cvp->ref_buffer.fd;
		frame->ref_buffer.size = cvp->ref_buffer.size;
	}
	frame->srcframe_contextbuffer.buffer_addr = cvp->context_buffer.fd;
	frame->srcframe_contextbuffer.size = cvp->context_buffer.size;
	frame->refframe_contextbuffer.buffer_addr = cvp->refcontext_buffer.fd;
	frame->refframe_contextbuffer.size = cvp->refcontext_buffer.size;
		fill_cvp_buffer(&frame->src_buffer, &cvp->src_buffer);
		fill_cvp_buffer(&frame->ref_buffer, &cvp->ref_buffer);
	}
	fill_cvp_buffer(&frame->srcframe_contextbuffer,
				&cvp->context_buffer);
	fill_cvp_buffer(&frame->refframe_contextbuffer,
				&cvp->refcontext_buffer);

	print_cvp_buffer(VIDC_LOW, "input frame", inst, &cvp->fullres_buffer);
	rc = msm_cvp_private(cvp->priv, CVP_KMD_SEND_CMD_PKT, arg);