dp: check if buf_mgr is changed when set frame. [1/3]

PD#SWPL-195524

Problem:
dp does not drop the last interlace frame

Solution:
check if buf_mgr is changed when set frame

Verify:
SC2/T6d

Change-Id: I7f87183af13654704ab66aac7111ad2a7382d698
Signed-off-by: zhenteng.tian <zhenteng.tian@amlogic.com>
diff --git a/drivers/media/video_processor/di_process/di_proc_buf_mgr.c b/drivers/media/video_processor/di_process/di_proc_buf_mgr.c
index 2953877..ee93f57 100644
--- a/drivers/media/video_processor/di_process/di_proc_buf_mgr.c
+++ b/drivers/media/video_processor/di_process/di_proc_buf_mgr.c
@@ -1068,9 +1068,8 @@
 	return 0;
 }
 
-static struct dp_buf_mgr_t *get_di_mgr_data(struct file *file)
+struct dp_buf_mgr_t *get_buf_mgr(struct file *file)
 {
-	struct uvm_hook_mod *uhmod;
 	struct uvm_di_mgr_t *uvm_di_mgr = NULL;
 
 	if (!file) {
@@ -1078,20 +1077,12 @@
 		return NULL;
 	}
 
-	uhmod = uvm_get_hook_mod((struct dma_buf *)(file->private_data), PROCESS_DI_MGR);
-	if (!uhmod) {
-		pr_err("%s fail uhmod is NULL\n", __func__);
+	uvm_di_mgr = get_uvm_di_mgr(file);
+	if (!uvm_di_mgr) {
+		pr_err("%s: get uvm_di_mgr failed.\n", __func__);
 		return NULL;
 	}
 
-	if (IS_ERR_VALUE(uhmod) || !uhmod->arg) {
-		pr_err("%s fail file_private_data is NULL\n", __func__);
-		return NULL;
-	}
-	uvm_di_mgr = uhmod->arg;
-	uvm_put_hook_mod((struct dma_buf *)(file->private_data),
-			 PROCESS_DI_MGR);
-
 	return uvm_di_mgr->buf_mgr;
 }
 
@@ -1112,7 +1103,7 @@
 	struct dp_buf_mgr_t *buf_mgr = NULL;
 	int need_dec_two = false;
 
-	buf_mgr = get_di_mgr_data(file);
+	buf_mgr = get_buf_mgr(file);
 	if (!buf_mgr) {
 		pr_err("%s get buf_mgr fail\n", __func__);
 		return -1;
@@ -1203,7 +1194,7 @@
 	*file_1 = NULL;
 	*file_2 = NULL;
 
-	buf_mgr = get_di_mgr_data(file);
+	buf_mgr = get_buf_mgr(file);
 	if (!buf_mgr) {
 		pr_err("%s get buf_mgr fail\n", __func__);
 		return -1;
@@ -1295,7 +1286,7 @@
 	struct vframe_s *vf = NULL;
 	struct vf_ref_t *vf_ref = NULL;
 
-	buf_mgr = get_di_mgr_data(file);
+	buf_mgr = get_buf_mgr(file);
 	if (!buf_mgr) {
 		pr_err("%s get buf_mgr fail\n", __func__);
 		return -1;
diff --git a/drivers/media/video_processor/di_process/di_proc_buf_mgr_internal.h b/drivers/media/video_processor/di_process/di_proc_buf_mgr_internal.h
index 1877f37..0b64b50 100644
--- a/drivers/media/video_processor/di_process/di_proc_buf_mgr_internal.h
+++ b/drivers/media/video_processor/di_process/di_proc_buf_mgr_internal.h
@@ -35,3 +35,4 @@
 void buf_mgr_file_lock(struct uvm_di_mgr_t *uvm_di_mgr);
 void buf_mgr_file_unlock(struct uvm_di_mgr_t *uvm_di_mgr);
 int update_di_process_state(struct file *file);
+struct dp_buf_mgr_t *get_buf_mgr(struct file *file);
diff --git a/drivers/media/video_processor/di_process/di_process.c b/drivers/media/video_processor/di_process/di_process.c
index bcba3d6..54cf9d4 100644
--- a/drivers/media/video_processor/di_process/di_process.c
+++ b/drivers/media/video_processor/di_process/di_process.c
@@ -1236,6 +1236,7 @@
 	dev->q_dummy_frame_done = false;
 	dev->last_frame_bypass = false;
 	dev->cur_is_i = false;
+	dev->last_buf_mgr = NULL;
 
 	receive_q_init(dev);
 	di_input_free_q_init(dev);
@@ -1431,6 +1432,8 @@
 	u32 max_width_new = 0, max_width_last = 0;
 	bool ip_switch = false, tvp_switch = false;
 	bool need_do_dummy = false;
+	struct dp_buf_mgr_t *cur_buf_mgr;
+	int ret = 0;
 
 	if (!dev || !frame_info) {
 		pr_err("%s: param is invalid.\n", __func__);
@@ -1466,6 +1469,19 @@
 		__func__, kfifo_len(&dev->receive_q), frame_info->in_fd, vf->frame_index,
 		 file_vf, file_count(file_vf));
 
+	cur_buf_mgr = get_buf_mgr(file_vf);
+	if (!dev->last_buf_mgr) {
+		dev->last_buf_mgr = cur_buf_mgr;
+		dp_print(dev->index, PRINT_OTHER,
+			"%s: new stream is on, first frame is set\n",
+			__func__);
+	} else if (cur_buf_mgr != dev->last_buf_mgr) {
+		dev->last_buf_mgr = cur_buf_mgr;
+		dp_print(dev->index, PRINT_OTHER,
+			"%s: stream changed, need notify processor\n",
+			__func__);
+		ret = 3;
+	}
 	if ((vf->type & VIDTYPE_COMPRESS) &&
 		di_rotate[dev->index] != frame_info->transform) {
 		switch (frame_info->transform) {
@@ -1495,7 +1511,7 @@
 		dev->last_file = file_vf;
 
 		dp_put_file(dev, file_vf);
-		return 0;
+		return ret;
 	}
 
 	/*vf need check tvp switch*/
@@ -1755,7 +1771,7 @@
 	dev->last_dmabuf = dmabuf;
 	dev->last_frame_bypass = false;
 
-	return 0;
+	return ret;
 }
 
 static int di_process_q_output(struct di_process_dev *dev, u32 fd)
@@ -1878,16 +1894,13 @@
 		ret = di_process_uninit(dev);
 		break;
 	case DI_PROCESS_IOCTL_SET_FRAME:
-		if (copy_from_user(&frame_info, argp,
-				   sizeof(frame_info)) == 0) {
-			ret = di_process_set_frame(dev, &frame_info);
-			if (ret != 0)
-				return ret;
-			ret = copy_to_user(argp, &frame_info,
-					   sizeof(struct frame_info_t));
-		} else {
-			ret = -EFAULT;
-		}
+		if (copy_from_user(&frame_info, argp, sizeof(frame_info)) != 0)
+			return -EFAULT;
+		ret = di_process_set_frame(dev, &frame_info);
+		if (ret != 0 && ret != 3)
+			return ret;
+		if (copy_to_user(argp, &frame_info, sizeof(struct frame_info_t)) != 0)
+			return -EFAULT;
 		break;
 	case DI_PROCESS_IOCTL_Q_OUTPUT:
 		if (copy_from_user(&fd, argp, sizeof(u32)) == 0)
diff --git a/drivers/media/video_processor/di_process/di_process.h b/drivers/media/video_processor/di_process/di_process.h
index e7eb5a3..14d164c 100644
--- a/drivers/media/video_processor/di_process/di_process.h
+++ b/drivers/media/video_processor/di_process/di_process.h
@@ -115,6 +115,7 @@
 	struct di_out_buf_t di_out_buf[DIPR_POOL_SIZE];
 	DECLARE_KFIFO(di_out_q, struct di_out_buf_t *, DIPR_POOL_SIZE);
 	struct file *last_file;
+	struct dp_buf_mgr_t *last_buf_mgr;
 	struct dma_buf *last_dmabuf;
 	struct dma_buf *out_dmabuf[DIPR_POOL_SIZE];
 	unsigned long long fence_creat_count;