From ba78735a86b379c33ecfc59aaae8d1b035f8f7a0 Mon Sep 17 00:00:00 2001 From: Maheshwar Ajja Date: Wed, 17 Jul 2019 12:40:43 -0700 Subject: [PATCH] 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: Maheshwar Ajja --- msm/vidc/msm_cvp_external.c | 68 ++++++++++++++++++++----------------- 1 file changed, 36 insertions(+), 32 deletions(-) diff --git a/msm/vidc/msm_cvp_external.c b/msm/vidc/msm_cvp_external.c index c65d28eef24e..41cc3a0aeb3b 100644 --- a/msm/vidc/msm_cvp_external.c +++ b/msm/vidc/msm_cvp_external.c @@ -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; + fill_cvp_buffer(&frame->src_buffer, &cvp->src_buffer); + fill_cvp_buffer(&frame->ref_buffer, &cvp->ref_buffer); } - 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->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);