From d639dcf3444a436f9e262f2f2de7bdf9b93d7f5a Mon Sep 17 00:00:00 2001 From: jintao xu Date: Mon, 21 Jun 2021 14:43:18 +0800 Subject: [PATCH] video_composer: add in the uvm type to check whether has vframe. [1/1] PD#SWPL-52333 Problem: hdmitx audio setting function is called on TV platform and cause crash Solution: if hdmitx driver is not enabled, export function just return Verify: pb Signed-off-by: jintao xu Change-Id: Ic87135d8621a2a37e74c2ac8ddc6d7096e3d75d1 --- .../video_composer/video_composer.c | 428 ++++++++++++------ include/linux/amlogic/meson_uvm_core.h | 1 + 2 files changed, 297 insertions(+), 132 deletions(-) diff --git a/drivers/amlogic/media/video_processor/video_composer/video_composer.c b/drivers/amlogic/media/video_processor/video_composer/video_composer.c index f4eb66facb09..f5ac7a6da2cf 100644 --- a/drivers/amlogic/media/video_processor/video_composer/video_composer.c +++ b/drivers/amlogic/media/video_processor/video_composer/video_composer.c @@ -326,6 +326,12 @@ static struct file_private_data *vc_get_file_private(struct composer_dev *dev, uhmod = uvm_get_hook_mod((struct dma_buf *)(file_vf->private_data), VF_PROCESS_V4LVIDEO); + if (!uhmod) { + vc_print(dev->index, PRINT_ERROR, + "dma file file_private_data is NULL\n"); + return NULL; + } + if (IS_ERR_VALUE(uhmod) || !uhmod->arg) { vc_print(dev->index, PRINT_ERROR, "dma file file_private_data is NULL\n"); @@ -644,6 +650,131 @@ static struct output_axis output_axis_adjust( return axis; } +static int config_ge2d_data(struct composer_dev *dev, + struct vframe_s *src_vf, + unsigned long addr, + struct frame_info_t *info, + struct src_data_para *data) +{ + struct vframe_s *vf = NULL; + + if (src_vf) { + if (src_vf->canvas0_config[0].phy_addr == 0) { + if ((src_vf->flag & VFRAME_FLAG_DOUBLE_FRAM) && + src_vf->vf_ext) { + vf = src_vf->vf_ext; + } else { + vc_print(dev->index, PRINT_PATTERN, + "vf no yuv data, composer fail\n"); + return -1; + } + } else { + vf = src_vf; + } + data->canvas0Addr = vf->canvas0Addr; + data->canvas1Addr = vf->canvas1Addr; + data->canvas0_config[0] = vf->canvas0_config[0]; + data->canvas0_config[1] = vf->canvas0_config[1]; + data->canvas0_config[2] = vf->canvas0_config[2]; + data->canvas1_config[0] = vf->canvas1_config[0]; + data->canvas1_config[1] = vf->canvas1_config[1]; + data->canvas1_config[2] = vf->canvas1_config[2]; + data->bitdepth = vf->bitdepth; + data->source_type = vf->source_type; + data->type = vf->type; + data->plane_num = vf->plane_num; + data->width = vf->width; + data->height = vf->height; + if (vf->flag & VFRAME_FLAG_VIDEO_LINEAR) + data->is_vframe = false; + else + data->is_vframe = true; + } else { + data->canvas0Addr = -1; + data->canvas1Addr = -1; + data->canvas0_config[0].phy_addr = addr; + if (info->buffer_w > info->reserved[0]) { + vc_print(dev->index, PRINT_PATTERN, + "buffer_w(%d) > deal_w(%d)\n", + info->buffer_w, info->reserved[0]); + data->canvas0_config[0].width = info->buffer_w; + } else { + vc_print(dev->index, PRINT_PATTERN, + "buffer_w:%d, deal_w: %d\n", + info->buffer_w, info->reserved[0]); + data->canvas0_config[0].width = info->reserved[0]; + } + if (info->buffer_h > info->reserved[1]) { + vc_print(dev->index, PRINT_PATTERN, + "buffer_h(%d) > deal_h(%d)\n", + info->buffer_h, info->reserved[1]); + data->canvas0_config[0].height = info->buffer_h; + } else { + vc_print(dev->index, PRINT_PATTERN, + "buffer_h: %d, deal_h: %d\n", + info->buffer_h, info->reserved[1]); + data->canvas0_config[0].height = info->reserved[1]; + } + data->canvas0_config[0].block_mode = CANVAS_BLKMODE_LINEAR; + data->canvas0_config[0].endian = 0; + data->canvas0_config[1].phy_addr = + (u32)(addr + (data->canvas0_config[0].width) + * (data->canvas0_config[0].height)); + data->canvas0_config[1].width = + data->canvas0_config[0].width; + data->canvas0_config[1].height = + data->canvas0_config[0].height / 2; + data->canvas0_config[1].block_mode = + CANVAS_BLKMODE_LINEAR; + data->canvas0_config[1].endian = 0; + data->bitdepth = BITDEPTH_Y8 + | BITDEPTH_U8 + | BITDEPTH_V8; + data->source_type = 0; + data->type = VIDTYPE_PROGRESSIVE + | VIDTYPE_VIU_FIELD + | VIDTYPE_VIU_NV21; + data->plane_num = 2; + data->width = info->buffer_w; + data->height = info->buffer_h; + data->is_vframe = false; + } + return 0; +} + +static struct vframe_s *get_vf_from_file(struct composer_dev *dev, + struct file *file_vf) +{ + struct vframe_s *vf = NULL; + bool is_dec_vf = false; + struct file_private_data *file_private_data = NULL; + + is_dec_vf = is_valid_mod_type(file_vf->private_data, VF_SRC_DECODER); + + if (is_dec_vf) { + vf = + dmabuf_get_vframe((struct dma_buf *)(file_vf->private_data)); + if (vf->vf_ext && (vf->flag & VFRAME_FLAG_CONTAIN_POST_FRAME)) + vf = vf->vf_ext; + dmabuf_put_vframe((struct dma_buf *)(file_vf->private_data)); + vc_print(dev->index, PRINT_OTHER, "vf is from decoder\n"); + } else { + file_private_data = vc_get_file_private(dev, file_vf); + if (!file_private_data) { + vc_print(dev->index, PRINT_ERROR, + "invalid fd: no uvm, no v4lvideo!!\n"); + } else { + vf = &file_private_data->vf; + if (vf->vf_ext && + (vf->flag & VFRAME_FLAG_CONTAIN_POST_FRAME)) + vf = vf->vf_ext; + vc_print(dev->index, PRINT_OTHER, + "vf is from v4lvideo\n"); + } + } + return vf; +} + static void vframe_composer(struct composer_dev *dev) { struct received_frames_t *received_frames = NULL; @@ -655,7 +786,6 @@ static void vframe_composer(struct composer_dev *dev) struct frame_info_t *vframe_info[MXA_LAYER_COUNT]; int i, j, tmp; u32 zd1, zd2; - struct file_private_data *file_private_data; struct config_para_ex_s ge2d_config; struct timeval begin_time; struct timeval end_time; @@ -667,10 +797,12 @@ static void vframe_composer(struct composer_dev *dev) u32 cur_transform = 0; struct src_data_para src_data; u32 drop_count = 0; + unsigned long addr = 0; struct output_axis dst_axis; int min_left = 0, min_top = 0; int max_right = 0, max_bottom = 0; struct componser_info_t *componser_info; + bool is_dec_vf = false, is_v4l_vf = false; do_gettimeofday(&begin_time); @@ -751,80 +883,54 @@ static void vframe_composer(struct composer_dev *dev) min_left = vframe_info[0]->dst_x; min_top = vframe_info[0]->dst_y; for (i = 0; i < count; i++) { + file_vf = received_frames->file_vf[vf_dev[i]]; + is_dec_vf = + is_valid_mod_type(file_vf->private_data, VF_SRC_DECODER); + is_v4l_vf = + is_valid_mod_type(file_vf->private_data, VF_PROCESS_V4LVIDEO) || + is_v4lvideo_buf_file(file_vf); if (vframe_info[vf_dev[i]]->type == 1) { - src_data.canvas0Addr = -1; - src_data.canvas1Addr = -1; - src_data.canvas0_config[0].phy_addr = (u32)( - received_frames->phy_addr[vf_dev[i]]); - src_data.canvas0_config[0].width = - (vframe_info[vf_dev[i]]->buffer_w - + 0x1f) & ~0x1f; - src_data.canvas0_config[0].height = - vframe_info[vf_dev[i]]->buffer_h; - src_data.canvas0_config[0].block_mode = - CANVAS_BLKMODE_LINEAR; - src_data.canvas0_config[0].endian = 0; - src_data.canvas0_config[1].phy_addr = - (u32)(received_frames->phy_addr[vf_dev[i]] - + (src_data.canvas0_config[0].width) - * (src_data.canvas0_config[0].height)); - - src_data.canvas0_config[1].width = - (vframe_info[vf_dev[i]]->buffer_w - + 0x1f) & ~0x1f; - src_data.canvas0_config[1].height = - (vframe_info[vf_dev[i]]->buffer_h) / 2; - src_data.canvas0_config[1].block_mode = - CANVAS_BLKMODE_LINEAR; - src_data.canvas0_config[1].endian = 0; - - src_data.bitdepth = BITDEPTH_Y8 - | BITDEPTH_U8 - | BITDEPTH_V8; - src_data.source_type = 0; - src_data.type = VIDTYPE_PROGRESSIVE - | VIDTYPE_VIU_FIELD - | VIDTYPE_VIU_NV21; - src_data.plane_num = 2; - src_data.width = vframe_info[vf_dev[i]]->buffer_w; - src_data.height = vframe_info[vf_dev[i]]->buffer_h; - src_data.is_vframe = false; - } else { - file_vf = received_frames->file_vf[vf_dev[i]]; - if (is_valid_mod_type(file_vf->private_data, - VF_SRC_DECODER)) { - scr_vf = dmabuf_get_vframe((struct dma_buf *) - (file_vf->private_data)); + if (is_dec_vf || is_v4l_vf) { + vc_print(dev->index, PRINT_OTHER, + "%s dma buffer is vf\n", __func__); + scr_vf = get_vf_from_file(dev, file_vf); + if (!scr_vf) { + vc_print(dev->index, + PRINT_ERROR, "get vf NULL\n"); + continue; + } + if (scr_vf->type & VIDTYPE_V4L_EOS) { + vc_print(dev->index, + PRINT_ERROR, "eos vf\n"); + continue; + } } else { - file_private_data = - vc_get_file_private(dev, file_vf); - scr_vf = &file_private_data->vf; + addr = received_frames->phy_addr[vf_dev[i]]; + vc_print(dev->index, PRINT_OTHER, + "%s dma buffer not vf\n", + __func__); + } + } else if (vframe_info[vf_dev[i]]->type == 0) { + if (is_dec_vf || is_v4l_vf) { + vc_print(dev->index, PRINT_OTHER, + "%s type 0 is vf\n", __func__); + scr_vf = get_vf_from_file(dev, file_vf); + } + if (!scr_vf) { + vc_print(dev->index, + PRINT_ERROR, "get vf NULL\n"); + continue; } if (scr_vf->type & VIDTYPE_V4L_EOS) { vc_print(dev->index, PRINT_ERROR, "eos vf\n"); continue; } - - src_data.canvas0Addr = scr_vf->canvas0Addr; - src_data.canvas1Addr = scr_vf->canvas1Addr; - src_data.canvas0_config[0] = scr_vf->canvas0_config[0]; - src_data.canvas0_config[1] = scr_vf->canvas0_config[1]; - src_data.canvas0_config[2] = scr_vf->canvas0_config[2]; - src_data.canvas1_config[0] = scr_vf->canvas1_config[0]; - src_data.canvas1_config[1] = scr_vf->canvas1_config[1]; - src_data.canvas1_config[2] = scr_vf->canvas1_config[2]; - src_data.bitdepth = scr_vf->bitdepth; - src_data.source_type = scr_vf->source_type; - src_data.type = scr_vf->type; - src_data.plane_num = scr_vf->plane_num; - src_data.width = scr_vf->width; - src_data.height = scr_vf->height; - if (scr_vf->flag & VFRAME_FLAG_VIDEO_LINEAR) - src_data.is_vframe = false; - else - src_data.is_vframe = true; } + ret = config_ge2d_data(dev, scr_vf, addr, + vframe_info[vf_dev[i]], &src_data); + if (ret < 0) + continue; cur_transform = vframe_info[vf_dev[i]]->transform; dev->ge2d_para.position_left = vframe_info[vf_dev[i]]->dst_x; @@ -966,7 +1072,7 @@ static void vframe_composer(struct composer_dev *dev) dst_vf->canvas0_config[1].phy_addr = dst_buf->phy_addr + dst_vf->width * dst_vf->height; dst_vf->canvas0_config[1].width = dst_vf->width; - dst_vf->canvas0_config[1].height = dst_vf->height; + dst_vf->canvas0_config[1].height = dst_vf->height >> 1; dst_vf->canvas0_config[1].block_mode = 0; dst_vf->plane_num = 2; } @@ -1058,7 +1164,6 @@ static void video_composer_task(struct composer_dev *dev) struct vframe_s *vf = NULL; struct file *file_vf = NULL; struct frame_info_t *frame_info = NULL; - struct file_private_data *file_private_data; struct received_frames_t *received_frames = NULL; struct frames_info_t *frames_info = NULL; int count; @@ -1069,6 +1174,7 @@ static void video_composer_task(struct composer_dev *dev) struct vframe_s *vf_ext = NULL; u32 pic_w; u32 pic_h; + bool is_dec_vf = false, is_v4l_vf = false; if (!kfifo_peek(&dev->receive_q, &received_frames)) { vc_print(dev->index, PRINT_ERROR, "task: peek failed\n"); @@ -1088,8 +1194,8 @@ static void video_composer_task(struct composer_dev *dev) if (transform) received_frames->frames_info.frame_info[0].transform = transform; - if (((dev->index == 0) && force_composer) || - ((dev->index == 1) && force_composer_pip)) + if ((dev->index == 0 && force_composer) || + (dev->index == 1 && force_composer_pip)) need_composer = true; if (received_frames->frames_info.frame_info[0].transform) { need_composer = true; @@ -1109,32 +1215,51 @@ static void video_composer_task(struct composer_dev *dev) dev->index, kfifo_len(&dev->receive_q)); file_vf = received_frames->file_vf[0]; + is_dec_vf = + is_valid_mod_type(file_vf->private_data, VF_SRC_DECODER); + is_v4l_vf = + is_valid_mod_type(file_vf->private_data, VF_PROCESS_V4LVIDEO) || + is_v4lvideo_buf_file(file_vf); if (frame_info->type == 0) { - if (is_valid_mod_type(file_vf->private_data, - VF_SRC_DECODER)) { - vf = dmabuf_get_vframe((struct dma_buf *) - (file_vf->private_data)); - } else { - file_private_data = - vc_get_file_private(dev, file_vf); - vf = &file_private_data->vf; + if (is_dec_vf || is_v4l_vf) + vf = get_vf_from_file(dev, file_vf); + vc_print(dev->index, PRINT_OTHER, + "%s type 0 is vf\n", __func__); + if (!vf) { + vc_print(dev->index, PRINT_ERROR, + "%s get vf is NULL\n", __func__); + return; } - video_wait_decode_fence(dev, vf); } else if (frame_info->type == 1) { - if (!kfifo_get(&dev->dma_free_q, &vf)) { - vc_print(dev->index, PRINT_ERROR, - "task: get dma_free_q failed\n"); - return; + if (is_dec_vf || is_v4l_vf) { + vf = get_vf_from_file(dev, file_vf); + vc_print(dev->index, PRINT_OTHER, + "%s dma is vf\n", __func__); + if (!vf) { + vc_print(dev->index, PRINT_ERROR, + "%s get vf is NULL\n", + __func__); + return; + } + video_wait_decode_fence(dev, vf); + } else { + vc_print(dev->index, PRINT_OTHER, + "%s dma buffer not vf\n", __func__); + if (!kfifo_get(&dev->dma_free_q, &vf)) { + vc_print(dev->index, PRINT_ERROR, + "task: get dma_free_q failed\n"); + return; + } + memset(vf, 0, sizeof(struct vframe_s)); } - memset(vf, 0, sizeof(struct vframe_s)); } if (!kfifo_get(&dev->receive_q, &received_frames)) { vc_print(dev->index, PRINT_ERROR, "task: get failed\n"); return; } - if (vf == NULL) { + if (!vf) { vc_print(dev->index, PRINT_ERROR, "vf is NULL\n"); return; @@ -1145,7 +1270,8 @@ static void video_composer_task(struct composer_dev *dev) vf->axis[3] = frame_info->dst_h + frame_info->dst_y - 1; vf->crop[0] = frame_info->crop_y; vf->crop[1] = frame_info->crop_x; - if (frame_info->type == 0) { + + if (is_dec_vf || is_v4l_vf) { if ((vf->type & VIDTYPE_COMPRESS) != 0) { pic_w = vf->compWidth; pic_h = vf->compHeight; @@ -1169,13 +1295,15 @@ static void video_composer_task(struct composer_dev *dev) vc_print(dev->index, PRINT_AXIS, "crop info is error!\n"); } - } else if (frame_info->type == 1) { - vf->crop[2] = frame_info->buffer_h - - frame_info->crop_h - - frame_info->crop_y; - vf->crop[3] = frame_info->buffer_w - - frame_info->crop_w - - frame_info->crop_x; + } else { + if (frame_info->type == 1) { + vf->crop[2] = frame_info->buffer_h + - frame_info->crop_h + - frame_info->crop_y; + vf->crop[3] = frame_info->buffer_w + - frame_info->crop_w + - frame_info->crop_x; + } } vf->zorder = frames_info->disp_zorder; vf->file_vf = file_vf; @@ -1185,21 +1313,49 @@ static void video_composer_task(struct composer_dev *dev) vf->pts_us64 = time_us64; vf->disp_pts = 0; - if (frame_info->type == 1) { + if (frame_info->type == 1 && !(is_dec_vf || is_v4l_vf)) { vf->flag |= VFRAME_FLAG_VIDEO_COMPOSER_DMA; vf->flag |= VFRAME_FLAG_VIDEO_LINEAR; vf->canvas0Addr = -1; vf->canvas0_config[0].phy_addr = phy_addr; - vf->canvas0_config[0].width = (frame_info->buffer_w - + 0x1f) & ~0x1f; - vf->canvas0_config[0].height = frame_info->buffer_h; + if (frame_info->buffer_w > frame_info->reserved[0]) { + vf->canvas0_config[0].width = + frame_info->buffer_w; + vc_print(dev->index, PRINT_PATTERN, + "buffer_w(%d) > deal_w(%d)\n", + frame_info->buffer_w, + frame_info->reserved[0]); + } else { + vf->canvas0_config[0].width = + frame_info->reserved[0]; + vc_print(dev->index, PRINT_PATTERN, + "buffer_w: %d, deal_w: %d\n", + frame_info->buffer_w, + frame_info->reserved[0]); + } + if (frame_info->buffer_h > frame_info->reserved[1]) { + vf->canvas0_config[0].height = + frame_info->buffer_h; + vc_print(dev->index, PRINT_PATTERN, + "buffer_h(%d) > deal_h(%d)\n", + frame_info->buffer_h, + frame_info->reserved[1]); + } else { + vf->canvas0_config[0].height = + frame_info->reserved[1]; + vc_print(dev->index, PRINT_PATTERN, + "buffer_h: %d, deal_h: %d\n", + frame_info->buffer_h, + frame_info->reserved[1]); + } vf->canvas1Addr = -1; vf->canvas0_config[1].phy_addr = phy_addr + vf->canvas0_config[0].width * vf->canvas0_config[0].height; - vf->canvas0_config[1].width = (frame_info->buffer_w - + 0x1f) & ~0x1f; - vf->canvas0_config[1].height = frame_info->buffer_h; + vf->canvas0_config[1].width = + vf->canvas0_config[0].width; + vf->canvas0_config[1].height = + vf->canvas0_config[0].height; vf->width = frame_info->buffer_w; vf->height = frame_info->buffer_h; vf->plane_num = 2; @@ -1228,7 +1384,8 @@ static void video_composer_task(struct composer_dev *dev) frame_info->crop_h, frame_info->crop_w); vc_print(dev->index, PRINT_AXIS, "frame buffer Width X Height: %d X %d\n", - frame_info->buffer_w, frame_info->buffer_h); + vf->canvas0_config[0].width, + vf->canvas0_config[0].height); vc_print(dev->index, PRINT_AXIS, "===============================\n"); @@ -1246,12 +1403,13 @@ static void video_composer_task(struct composer_dev *dev) vf_ext->zorder = vf->zorder; vf_ext->flag |= VFRAME_FLAG_VIDEO_COMPOSER | VFRAME_FLAG_VIDEO_COMPOSER_BYPASS; - } else + } else { vc_print(dev->index, PRINT_ERROR, "vf_ext is null\n"); + } } - if (dev->last_file == file_vf && frame_info->type == 0) { + if (dev->last_file == file_vf && (is_dec_vf || is_v4l_vf)) { vf->repeat_count[dev->index]++; vc_print(dev->index, PRINT_FENCE, "repeat =%d, omx_index=%d\n", @@ -1482,9 +1640,9 @@ static void set_frames_info(struct composer_dev *dev, u32 fence_fd; int i = 0; int j = 0; + int type = -1; struct file *file_vf = NULL; struct vframe_s *vf = NULL; - struct file_private_data *file_private_data; struct timeval time1; struct timeval time2; u64 time_us64; @@ -1492,6 +1650,7 @@ static void set_frames_info(struct composer_dev *dev, int axis[4]; int ready_len = 0; bool current_is_sideband = false; + bool is_dec_vf = false, is_v4l_vf = false; s32 sideband_type = -1; if (!dev->composer_enabled) { @@ -1632,29 +1791,42 @@ static void set_frames_info(struct composer_dev *dev, } total_get_count++; dev->received_frames[i].file_vf[j] = file_vf; - if (frames_info->frame_info[j].type == 0) { - if (is_valid_mod_type(file_vf->private_data, - VF_SRC_DECODER)) { - vf = dmabuf_get_vframe((struct dma_buf *) - (file_vf->private_data)); - } else { - file_private_data = - vc_get_file_private(dev, file_vf); - if (!file_private_data) { + type = frames_info->frame_info[j].type; + is_dec_vf = + is_valid_mod_type(file_vf->private_data, VF_SRC_DECODER); + is_v4l_vf = + is_valid_mod_type(file_vf->private_data, VF_PROCESS_V4LVIDEO) || + is_v4lvideo_buf_file(file_vf); + if (type == 0 || type == 1) { + vc_print(dev->index, PRINT_FENCE, + "received_cnt=%lld,i=%d,z=%d,DMA_fd=%d\n", + dev->received_count + 1, + i, + frames_info->frame_info[j].zorder, + frames_info->frame_info[j].fd); + if (!(is_dec_vf || is_v4l_vf)) { + if (type == 0) { vc_print(dev->index, PRINT_ERROR, - "invalid fd: no uvm, no v4lvideo!!\n"); + "%s type is %d but not vf\n", + __func__, type); return; } - vf = &file_private_data->vf; + dev->received_frames[i].phy_addr[j] = + get_dma_phy_addr(frames_info->frame_info[j].fd, + dev->index); + vc_print(dev->index, PRINT_OTHER, + "%s dma buffer not vf\n", __func__); + continue; } + vf = get_vf_from_file(dev, file_vf); + vc_print(dev->index, PRINT_OTHER, + "%s type is %d and get vf\n", + __func__, type); - if (vf && dev->index == 0) { - drop_cnt = vf->omx_index - dev->received_count; - receive_count = dev->received_count; - } else if (vf && dev->index == 1) { - drop_cnt_pip = vf->omx_index - - dev->received_count; - receive_count_pip = dev->received_count; + if (!vf) { + vc_print(dev->index, PRINT_ERROR, + "received NULL vf!!\n"); + return; } vc_print(dev->index, PRINT_FENCE | PRINT_PATTERN, "received_cnt=%lld,i=%d,z=%d,omx_index=%d, fence_fd=%d, fc_no=%d, index_disp=%d,pts=%lld\n", @@ -1666,17 +1838,9 @@ static void set_frames_info(struct composer_dev *dev, dev->cur_streamline_val, vf->index_disp, vf->pts_us64); +#ifdef CONFIG_AMLOGIC_DEBUG_ATRACE ATRACE_COUNTER("video_composer", vf->index_disp); - } else if (frames_info->frame_info[j].type == 1) { - vc_print(dev->index, PRINT_FENCE, - "received_cnt=%lld,i=%d,z=%d,DMA_fd=%d\n", - dev->received_count + 1, - i, - frames_info->frame_info[j].zorder, - frames_info->frame_info[j].fd); - dev->received_frames[i].phy_addr[j] = - get_dma_phy_addr(frames_info->frame_info[j].fd, - dev->index); +#endif } else { vc_print(dev->index, PRINT_ERROR, "unsupport type=%d\n", diff --git a/include/linux/amlogic/meson_uvm_core.h b/include/linux/amlogic/meson_uvm_core.h index 030e425ee8ce..5b973d8f387c 100644 --- a/include/linux/amlogic/meson_uvm_core.h +++ b/include/linux/amlogic/meson_uvm_core.h @@ -134,6 +134,7 @@ enum uvm_hook_mod_type { VF_PROCESS_V4LVIDEO, VF_PROCESS_DI, VF_PROCESS_VIDEOCOMPOSER, + VF_PROCESS_DECODER }; /** -- 2.20.1