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);