From 166414a886583e37bfcc3eca6118587330855bcd Mon Sep 17 00:00:00 2001 From: rongrong zhou Date: Sat, 23 Nov 2019 18:49:24 +0800 Subject: [PATCH] v4l2: v4l2 vf video support [1/3] PD#SWPL-16226 Problem: v4l2 can not display on vf video Solution: add v4l2 vf video support Verify: U212 Change-Id: If04fc991edaa57c202f1adcf6b1be6d453bb2af9 Signed-off-by: rongrong zhou --- drivers/amlogic/Makefile | 2 +- drivers/amlogic/media/common/vfm/vfm.c | 2 +- .../media/common/vfm/vframe_provider.c | 2 +- .../media/common/vfm/vframe_receiver.c | 14 +++++++++-- drivers/media/v4l2-core/v4l2-compat-ioctl32.c | 6 ++++- drivers/media/v4l2-core/videobuf2-v4l2.c | 1 + include/linux/amlogic/media/utils/amstream.h | 1 + include/linux/amlogic/media/vfm/vframe.h | 25 ++++++++++++++++--- 8 files changed, 43 insertions(+), 10 deletions(-) diff --git a/drivers/amlogic/Makefile b/drivers/amlogic/Makefile index 97f364da371c..8681382d9855 100644 --- a/drivers/amlogic/Makefile +++ b/drivers/amlogic/Makefile @@ -9,7 +9,7 @@ ifndef CONFIG_KASAN KBUILD_CFLAGS += -Wlarger-than=28792 -KBUILD_CFLAGS += -Wstack-usage=1856 -Wno-bool-operation -Wno-maybe-uninitialized +KBUILD_CFLAGS += -Wstack-usage=1956 -Wno-bool-operation -Wno-maybe-uninitialized else ifeq ($(call cc-ifversion, -lt, 0500, y), y) $(error -----GCC VERSION TOO SMALL FOR KASAN -----) diff --git a/drivers/amlogic/media/common/vfm/vfm.c b/drivers/amlogic/media/common/vfm/vfm.c index 7c0e73d19e28..e6793c70a682 100644 --- a/drivers/amlogic/media/common/vfm/vfm.c +++ b/drivers/amlogic/media/common/vfm/vfm.c @@ -49,7 +49,7 @@ static DEFINE_SPINLOCK(lock); #define CLS_NAME "vfm" #define VFM_NAME_LEN 100 #define VFM_MAP_SIZE 10 -#define VFM_MAP_COUNT 20 +#define VFM_MAP_COUNT 40 static struct device *vfm_dev; struct vfm_map_s { char id[VFM_NAME_LEN]; diff --git a/drivers/amlogic/media/common/vfm/vframe_provider.c b/drivers/amlogic/media/common/vfm/vframe_provider.c index af6d1bd24c70..ce855a0d4f96 100644 --- a/drivers/amlogic/media/common/vfm/vframe_provider.c +++ b/drivers/amlogic/media/common/vfm/vframe_provider.c @@ -30,7 +30,7 @@ #include "vfm.h" #include "vftrace.h" -#define MAX_PROVIDER_NUM 32 +#define MAX_PROVIDER_NUM 64 static struct vframe_provider_s *provider_table[MAX_PROVIDER_NUM]; static atomic_t provider_used = ATOMIC_INIT(0); diff --git a/drivers/amlogic/media/common/vfm/vframe_receiver.c b/drivers/amlogic/media/common/vfm/vframe_receiver.c index fb77c81917c4..bc6aa4bc4c07 100644 --- a/drivers/amlogic/media/common/vfm/vframe_receiver.c +++ b/drivers/amlogic/media/common/vfm/vframe_receiver.c @@ -28,8 +28,9 @@ /* Local headers */ #include "vfm.h" -#define MAX_RECEIVER_NUM 32 +#define MAX_RECEIVER_NUM 64 struct vframe_receiver_s *receiver_table[MAX_RECEIVER_NUM]; +static DEFINE_MUTEX(mutex); int receiver_list(char *buf) { @@ -160,11 +161,15 @@ int vf_reg_receiver(struct vframe_receiver_s *recv) if (!recv) return -1; + + mutex_lock(&mutex); for (i = 0; i < MAX_RECEIVER_NUM; i++) { r = receiver_table[i]; if (r) { - if (!strcmp(r->name, recv->name)) + if (!strcmp(r->name, recv->name)) { + mutex_unlock(&mutex); return -1; + } } } for (i = 0; i < MAX_RECEIVER_NUM; i++) { @@ -173,6 +178,8 @@ int vf_reg_receiver(struct vframe_receiver_s *recv) break; } } + mutex_unlock(&mutex); + return 0; } EXPORT_SYMBOL(vf_reg_receiver); @@ -184,6 +191,8 @@ void vf_unreg_receiver(struct vframe_receiver_s *recv) if (!recv) return; + + mutex_lock(&mutex); for (i = 0; i < MAX_RECEIVER_NUM; i++) { r = receiver_table[i]; if (r) { @@ -193,5 +202,6 @@ void vf_unreg_receiver(struct vframe_receiver_s *recv) } } } + mutex_unlock(&mutex); } EXPORT_SYMBOL(vf_unreg_receiver); diff --git a/drivers/media/v4l2-core/v4l2-compat-ioctl32.c b/drivers/media/v4l2-core/v4l2-compat-ioctl32.c index f1f697296ca0..a8764a5e206e 100644 --- a/drivers/media/v4l2-core/v4l2-compat-ioctl32.c +++ b/drivers/media/v4l2-core/v4l2-compat-ioctl32.c @@ -495,7 +495,11 @@ static int get_v4l2_buffer32(struct v4l2_buffer __user *kp, get_user(memory, &up->memory) || put_user(memory, &kp->memory) || get_user(length, &up->length) || - put_user(length, &kp->length)) + put_user(length, &kp->length) || + assign_in_user(&kp->sequence, &up->sequence) || + assign_in_user(&kp->reserved2, &up->reserved2) || + assign_in_user(&kp->reserved, &up->reserved)) + return -EFAULT; if (V4L2_TYPE_IS_OUTPUT(type)) diff --git a/drivers/media/v4l2-core/videobuf2-v4l2.c b/drivers/media/v4l2-core/videobuf2-v4l2.c index aed82f81f824..3927935d1602 100644 --- a/drivers/media/v4l2-core/videobuf2-v4l2.c +++ b/drivers/media/v4l2-core/videobuf2-v4l2.c @@ -436,6 +436,7 @@ static int __fill_vb2_buffer(struct vb2_buffer *vb, } else { /* Zero any output buffer flags as this is a capture buffer */ vbuf->flags &= ~V4L2_BUFFER_OUT_FLAGS; + vbuf->private = b->reserved2; } return 0; diff --git a/include/linux/amlogic/media/utils/amstream.h b/include/linux/amlogic/media/utils/amstream.h index 76f62bb1cf0e..ca366a84b633 100644 --- a/include/linux/amlogic/media/utils/amstream.h +++ b/include/linux/amlogic/media/utils/amstream.h @@ -278,6 +278,7 @@ enum FRAME_BASE_VIDEO_PATH { FRAME_BASE_PATH_V4L_VIDEO, FRAME_BASE_PATH_TUNNEL_MODE, FRAME_BASE_PATH_V4L_OSD, + FRAME_BASE_PATH_DI_V4LVIDEO, FRAME_BASE_PATH_MAX }; diff --git a/include/linux/amlogic/media/vfm/vframe.h b/include/linux/amlogic/media/vfm/vframe.h index 37b7de701f79..1531da18b93e 100644 --- a/include/linux/amlogic/media/vfm/vframe.h +++ b/include/linux/amlogic/media/vfm/vframe.h @@ -78,13 +78,20 @@ #define TB_DETECT_BFF 2 #define TB_DETECT_TBF 3 -#define VFRAME_FLAG_NO_DISCONTINUE 1 -#define VFRAME_FLAG_SWITCHING_FENSE 2 -#define VFRAME_FLAG_HIGH_BANDWIDTH 4 +#define VFRAME_FLAG_NO_DISCONTINUE 1 +#define VFRAME_FLAG_SWITCHING_FENSE 2 +#define VFRAME_FLAG_HIGH_BANDWIDTH 4 #define VFRAME_FLAG_ERROR_RECOVERY 8 #define VFRAME_FLAG_SYNCFRAME 0x10 -#define VFRAME_FLAG_GAME_MODE 0x20 +#define VFRAME_FLAG_GAME_MODE 0x20 +#define VFRAME_FLAG_VIDEO_COMPOSER 0x40 +#define VFRAME_FLAG_VIDEO_COMPOSER_BYPASS 0x80 +#define VFRAME_FLAG_COMPOSER_DONE 0x100 +#define VFRAME_FLAG_VIDEO_COMPOSER_DMA 0x200 +#define VFRAME_FLAG_VIDEO_LINEAR 0x400 #define VFRAME_FLAG_EMPTY_FRAME_V4L 0x800 +#define VFRAME_FLAG_FAKE_FRAME 0x1000 + enum pixel_aspect_ratio_e { PIXEL_ASPECT_RATIO_1_1, @@ -316,6 +323,14 @@ struct vframe_pic_mode_s { #define BITDEPTH_MASK (BITDEPTH_YMASK | BITDEPTH_UMASK | BITDEPTH_VMASK) #define BITDEPTH_SAVING_MODE 0x1 #define FULL_PACK_422_MODE 0x2 + +struct codec_mm_box_s { + void *mmu_box; + int mmu_idx; + void *bmmu_box; + int bmmu_idx; +}; + struct vframe_s { u32 index; u32 index_disp; @@ -439,6 +454,8 @@ struct vframe_s { *****************/ u32 di_pulldown; u32 di_gmv; + + struct codec_mm_box_s mm_box; } /*vframe_t */; #if 0