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 <majja@codeaurora.org>
This commit is contained in:
Maheshwar Ajja 2019-07-17 12:40:43 -07:00
parent 03172d2c37
commit ba78735a86

View File

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