h265: CF1 optimize suffix sei or dv meta process flow [1/1]

PD#SWPL-184803

Problem:
1.optimize suffix sei or dv meta process flow
2.Move vdec interrupt handling to CPU1 for processing.

Solution:
1.optimize suffix sei or dv meta process flow
2.T3X move vdec interrupt handling to CPU1 for processing.

Verify:
T3X

Change-Id: I45a31458d0ece21ba32ae8aec93538b1cf0b8694
Signed-off-by: xing.xu <xing.xu@amlogic.com>
diff --git a/drivers/frame_provider/decoder/h265/vh265.c b/drivers/frame_provider/decoder/h265/vh265.c
index 0a036a9..3f3e4db 100644
--- a/drivers/frame_provider/decoder/h265/vh265.c
+++ b/drivers/frame_provider/decoder/h265/vh265.c
@@ -2021,6 +2021,7 @@
 	struct completion complete;
 	u32 data_size_bak;
 	u32 data_offset_bak;
+	bool check_suffix_data;
 } /*hevc_stru_t */;
 
 struct hevc_RPS_s {
@@ -11539,10 +11540,13 @@
 				 && (frmbase_multi_slice == 1)) {
 				hevc->consume_byte = READ_VREG(HEVC_SHIFT_BYTE_COUNT) - 8;
 				hevc->dec_result = DEC_RESULT_UNFINISH;
+				if (efficiency_mode)
+					hevc->check_suffix_data = true;
 			} else {
 				hevc->data_size = 0;
 				hevc->data_offset = 0;
 				hevc->dec_result = DEC_RESULT_DONE;
+				hevc->check_suffix_data = false;
 			}
 
 			if ((!input_stream_based(vdec) &&
@@ -11653,7 +11657,12 @@
 				}
 			}
 			ATRACE_COUNTER(hevc->trace.decode_time_name, DECODER_ISR_THREAD_EDN);
-			vh265_work_implement(hevc, vdec, 0);
+			if (hevc->check_suffix_data && dec_status == HEVC_DECPIC_DATA_DONE) {
+				WRITE_VREG(HEVC_DEC_STATUS_REG, HEVC_ACTION_DONE);
+				start_process_time(hevc);
+				return IRQ_HANDLED;
+			} else
+				vh265_work_implement(hevc, vdec, 0);
 		}
 
 		return IRQ_HANDLED;
@@ -12582,6 +12591,14 @@
 			return IRQ_HANDLED;
 		}
 	}
+
+	if (dec_status == HEVC_SLICE_SEGMENT_DONE && hevc->check_suffix_data) {
+		hevc->check_suffix_data = false;
+
+		hevc->dec_result = DEC_RESULT_UNFINISH;
+		vdec_schedule_work(&hevc->work);
+		return IRQ_HANDLED;
+	}
 	ATRACE_COUNTER(hevc->trace.decode_time_name, DECODER_ISR_END);
 	return IRQ_WAKE_THREAD;
 }
@@ -14397,7 +14414,7 @@
 			int i;
 		hevc->dec_again_cnt = 0;
 		decode_frame_count[hevc->index]++;
-		if (hevc->multi_frame_flag)
+		if (hevc->check_suffix_data)
 			goto done_end;
 
 #ifdef DETREFILL_ENABLE
@@ -15144,6 +15161,8 @@
 		(hevc->dec_result == DEC_RESULT_UNFINISH)) {
 		u32 res_byte = hevc->data_size - hevc->consume_byte;
 
+		hevc->data_offset_bak = hevc->data_offset;
+		hevc->data_size_bak = hevc->data_size;
 		hevc_print(hevc, PRINT_FLAG_VDEC_DETAIL,
 			"%s before, consume 0x%x, size 0x%x, offset 0x%x, res 0x%x\n", __func__,
 			hevc->consume_byte, hevc->data_size, hevc->data_offset + hevc->consume_byte, res_byte);
@@ -15182,8 +15201,6 @@
 			(hevc->chunk != NULL)) {
 			hevc->data_offset = hevc->chunk->offset;
 			hevc->data_size = r;
-			hevc->data_offset_bak = hevc->chunk->offset;
-			hevc->data_size_bak = r;
 		}
 		hevc->multi_frame_flag = 0;
 		WRITE_VREG(HEVC_WAIT_FLAG, 0);
@@ -15334,6 +15351,7 @@
 	if (is_vcpu_clk_set())
 		WRITE_VREG(HEVC_DECODE_COUNT, hevc->decode_idx);
 	hevc->init_flag = 1;
+	hevc->check_suffix_data = false;
 
 	if (hevc->pic_list_init_flag == 3)
 		init_pic_list_hw(hevc);
diff --git a/drivers/frame_provider/decoder/h265_fb/vh265_fb.c b/drivers/frame_provider/decoder/h265_fb/vh265_fb.c
index e231aca..be894aa 100644
--- a/drivers/frame_provider/decoder/h265_fb/vh265_fb.c
+++ b/drivers/frame_provider/decoder/h265_fb/vh265_fb.c
@@ -2290,6 +2290,7 @@
 	struct completion complete;
 	u32 data_size_bak;
 	u32 data_offset_bak;
+	bool check_suffix_data;
 } /*hevc_stru_t */;
 
 struct hevc_RPS_s {
@@ -12874,10 +12875,15 @@
 			) {
 				hevc->consume_byte = READ_VREG(HEVC_SHIFT_BYTE_COUNT) - 8;
 				hevc->dec_result = DEC_RESULT_UNFINISH;
+				if (efficiency_mode &&
+					hevc->front_back_mode == 0)
+					hevc->check_suffix_data = true;
 			} else {
 				hevc->data_size = 0;
 				hevc->data_offset = 0;
 				hevc->dec_result = DEC_RESULT_DONE;
+				if (hevc->front_back_mode == 0)
+					hevc->check_suffix_data = false;
 			}
 
 			if ((!input_stream_based(vdec) &&
@@ -13027,7 +13033,12 @@
 				hevc->dec_result = DEC_RESULT_AGAIN;
 			}
 			ATRACE_COUNTER(hevc->trace.decode_time_name, DECODER_ISR_THREAD_EDN);
-			vh265_work_implement(hevc,hw_to_vdec(hevc), 0);
+			if (hevc->check_suffix_data && dec_status == HEVC_DECPIC_DATA_DONE) {
+				WRITE_VREG(HEVC_DEC_STATUS_REG, HEVC_ACTION_DONE);
+				start_process_time(hevc);
+				return IRQ_HANDLED;
+			} else
+				vh265_work_implement(hevc,hw_to_vdec(hevc), 0);
 		}
 
 		return IRQ_HANDLED;
@@ -14214,6 +14225,14 @@
 			return IRQ_HANDLED;
 		}
 	}
+
+	if (dec_status == HEVC_SLICE_SEGMENT_DONE && hevc->check_suffix_data) {
+		hevc->check_suffix_data = false;
+
+		hevc->dec_result = DEC_RESULT_UNFINISH;
+		vdec_schedule_work(&hevc->work);
+		return IRQ_HANDLED;
+	}
 	ATRACE_COUNTER(hevc->trace.decode_time_name, DECODER_ISR_END);
 	return IRQ_WAKE_THREAD;
 }
@@ -16136,7 +16155,7 @@
 		hevc->dec_again_cnt = 0;
 		decode_frame_count[hevc->index]++;
 
-		if (hevc->multi_frame_flag)
+		if (hevc->check_suffix_data)
 			goto done_end;
 #ifdef DETREFILL_ENABLE
 		if (hevc->is_swap &&
@@ -17475,6 +17494,8 @@
 		(hevc->dec_result == DEC_RESULT_UNFINISH)) {
 		u32 res_byte = hevc->data_size - hevc->consume_byte;
 
+		hevc->data_offset_bak = hevc->data_offset;
+		hevc->data_size_bak = hevc->data_size;
 		hevc_print(hevc, PRINT_FLAG_VDEC_DETAIL,
 			"%s before, consume 0x%x, size 0x%x, offset 0x%x, res 0x%x\n", __func__,
 			hevc->consume_byte, hevc->data_size, hevc->data_offset + hevc->consume_byte, res_byte);
@@ -17509,8 +17530,6 @@
 			(hevc->chunk != NULL)) {
 			hevc->data_offset = hevc->chunk->offset;
 			hevc->data_size = r;
-			hevc->data_offset_bak = hevc->chunk->offset;
-			hevc->data_size_bak = r;
 		}
 		hevc->multi_frame_flag = 0;
 		if (hevc->front_back_mode == 0)
@@ -17703,6 +17722,7 @@
 	/*WRITE_VREG(HEVC_DECODE_COUNT, hevc->decode_idx);*/
 	hevc->init_flag = 1;
 	hevc->start_decoder_flag = 0;
+	hevc->check_suffix_data = false;
 	if (hevc->pic_list_init_flag == 3) {
 		if (efficiency_mode == 0) {
 #ifdef NEW_FB_CODE
diff --git a/drivers/frame_provider/decoder/utils/vdec.c b/drivers/frame_provider/decoder/utils/vdec.c
index 26da19f..924970f 100644
--- a/drivers/frame_provider/decoder/utils/vdec.c
+++ b/drivers/frame_provider/decoder/utils/vdec.c
@@ -6485,6 +6485,13 @@
 		vdec_core->isr_context[num].dev_isr = handler;
 		vdec_core->isr_context[num].dev_threaded_isr = thread_fn;
 		vdec_core->isr_context[num].dev_id = dev;
+
+		if (get_cpu_major_id() == AM_MESON_CPU_MAJOR_ID_T3X) {
+			if (num_online_cpus() > 1)
+				irq_set_affinity_hint(res_irq, cpumask_of(1));
+		} else {
+			irq_set_affinity_hint(res_irq, get_cpu_mask(num_online_cpus()));
+		}
 		ret = request_threaded_irq(res_irq,
 			vdec_isr,
 			vdec_thread_isr,
diff --git a/drivers/frame_provider/decoder_v4l/h265/vh265.c b/drivers/frame_provider/decoder_v4l/h265/vh265.c
index 082fd31..b17807e 100644
--- a/drivers/frame_provider/decoder_v4l/h265/vh265.c
+++ b/drivers/frame_provider/decoder_v4l/h265/vh265.c
@@ -2018,6 +2018,7 @@
 	u32 data_size_bak;
 	u32 data_offset_bak;
 	struct mmu_copy mmu_copy_array[BUF_FBC_NUM_MAX];
+	bool check_suffix_data;
 } /*hevc_stru_t */;
 
 struct hevc_RPS_s {
@@ -12035,10 +12036,13 @@
 				 && (frmbase_multi_slice == 1)) {
 				hevc->consume_byte = READ_VREG(HEVC_SHIFT_BYTE_COUNT) - 8;
 				hevc->dec_result = DEC_RESULT_UNFINISH;
+				if (efficiency_mode)
+					hevc->check_suffix_data = true;
 			} else {
 				hevc->data_size = 0;
 				hevc->data_offset = 0;
 				hevc->dec_result = DEC_RESULT_DONE;
+				hevc->check_suffix_data = false;
 			}
 
 			if ((!input_stream_based(vdec) &&
@@ -12157,7 +12161,13 @@
 				}
 			}
 			ATRACE_COUNTER(hevc->trace.decode_time_name, DECODER_ISR_THREAD_EDN);
-			vh265_work_implement(hevc, vdec, 0);
+			if (hevc->check_suffix_data && dec_status == HEVC_DECPIC_DATA_DONE) {
+				hevc->last_dec_result = DEC_RESULT_UNFINISH;
+				WRITE_VREG(HEVC_DEC_STATUS_REG, HEVC_ACTION_DONE);
+				start_process_time(hevc);
+				return IRQ_HANDLED;
+			} else
+				vh265_work_implement(hevc, vdec, 0);
 		}
 
 		return IRQ_HANDLED;
@@ -13053,6 +13063,13 @@
 		}
 	}
 
+	if (dec_status == HEVC_SLICE_SEGMENT_DONE && hevc->check_suffix_data) {
+		hevc->check_suffix_data = false;
+
+		hevc->dec_result = DEC_RESULT_UNFINISH;
+		vdec_schedule_work(&hevc->work);
+		return IRQ_HANDLED;
+	}
 	ATRACE_COUNTER(hevc->trace.decode_time_name, DECODER_ISR_END);
 	return IRQ_WAKE_THREAD;
 
@@ -14882,7 +14899,7 @@
 		ctx->decoder_status_info.decoder_count++;
 		decode_frame_count[hevc->index]++;
 
-		if (hevc->multi_frame_flag)
+		if (hevc->check_suffix_data)
 			goto done_end;
 
 #ifdef DETREFILL_ENABLE
@@ -15608,6 +15625,8 @@
 		(hevc->dec_result == DEC_RESULT_UNFINISH)) {
 		u32 res_byte = hevc->data_size - hevc->consume_byte;
 
+		hevc->data_offset_bak = hevc->data_offset;
+		hevc->data_size_bak = hevc->data_size;
 		hevc_print(hevc, PRINT_FLAG_VDEC_DETAIL,
 			"%s before, consume 0x%x, size 0x%x, offset 0x%x, res 0x%x\n", __func__,
 			hevc->consume_byte, hevc->data_size, hevc->data_offset + hevc->consume_byte, res_byte);
@@ -15644,11 +15663,11 @@
 		}
 		if ((vdec_frame_based(vdec)) &&
 				(hevc->chunk != NULL)) {
-				hevc->data_offset = hevc->chunk->offset;
-				hevc->data_size = r;
-			}
-			hevc->multi_frame_flag = 0;
-			WRITE_VREG(HEVC_WAIT_FLAG, 0);
+			hevc->data_offset = hevc->chunk->offset;
+			hevc->data_size = r;
+		}
+		hevc->multi_frame_flag = 0;
+		WRITE_VREG(HEVC_WAIT_FLAG, 0);
 	}
 
 	vdec_tracing(&ctx->vtr, VTRACE_DEC_ST_0, r);
@@ -15794,6 +15813,7 @@
 	if (is_vcpu_clk_set())
 		WRITE_VREG(HEVC_DECODE_COUNT, hevc->decode_idx);
 	hevc->init_flag = 1;
+	hevc->check_suffix_data = false;
 
 	if (hevc->pic_list_init_flag == 3)
 		init_pic_list_hw(hevc);
diff --git a/drivers/frame_provider/decoder_v4l/h265_fb/vh265_fb_v4l.c b/drivers/frame_provider/decoder_v4l/h265_fb/vh265_fb_v4l.c
index d0748c1..d952232 100644
--- a/drivers/frame_provider/decoder_v4l/h265_fb/vh265_fb_v4l.c
+++ b/drivers/frame_provider/decoder_v4l/h265_fb/vh265_fb_v4l.c
@@ -2278,6 +2278,7 @@
 	u32 data_size_bak;
 	u32 data_offset_bak;
 	struct mmu_copy mmu_copy_array[BUF_FBC_NUM_MAX];
+	bool check_suffix_data;
 } /*hevc_stru_t */;
 
 struct hevc_RPS_s {
@@ -13235,10 +13236,15 @@
 			) {
 				hevc->consume_byte = READ_VREG(HEVC_SHIFT_BYTE_COUNT) - 8;
 				hevc->dec_result = DEC_RESULT_UNFINISH;
+				if (efficiency_mode &&
+					hevc->front_back_mode == 0)
+					hevc->check_suffix_data = true;
 			} else {
 				hevc->data_size = 0;
 				hevc->data_offset = 0;
 				hevc->dec_result = DEC_RESULT_DONE;
+				if (hevc->front_back_mode == 0)
+					hevc->check_suffix_data = false;
 			}
 
 			if ((!input_stream_based(vdec) &&
@@ -13361,7 +13367,13 @@
 				}
 			}
 			ATRACE_COUNTER(hevc->trace.decode_time_name, DECODER_ISR_THREAD_EDN);
-			vh265_work_implement(hevc,hw_to_vdec(hevc), 0);
+			if (hevc->check_suffix_data && dec_status == HEVC_DECPIC_DATA_DONE) {
+				hevc->last_dec_result = DEC_RESULT_UNFINISH;
+				WRITE_VREG(HEVC_DEC_STATUS_REG, HEVC_ACTION_DONE);
+				start_process_time(hevc);
+				return IRQ_HANDLED;
+			} else
+				vh265_work_implement(hevc,hw_to_vdec(hevc), 0);
 		}
 
 		return IRQ_HANDLED;
@@ -14518,6 +14530,14 @@
 			return IRQ_HANDLED;
 		}
 	}
+
+	if (dec_status == HEVC_SLICE_SEGMENT_DONE && hevc->check_suffix_data) {
+		hevc->check_suffix_data = false;
+
+		hevc->dec_result = DEC_RESULT_UNFINISH;
+		vdec_schedule_work(&hevc->work);
+		return IRQ_HANDLED;
+	}
 	ATRACE_COUNTER(hevc->trace.decode_time_name, DECODER_ISR_END);
 
 	return IRQ_WAKE_THREAD;
@@ -16398,7 +16418,7 @@
 			int i;
 		decode_frame_count[hevc->index]++;
 
-		if (hevc->multi_frame_flag)
+		if (hevc->check_suffix_data)
 			goto done_end;
 #ifdef DETREFILL_ENABLE
 		if (hevc->is_swap &&
@@ -17713,6 +17733,8 @@
 		(hevc->dec_result == DEC_RESULT_UNFINISH)) {
 		u32 res_byte = hevc->data_size - hevc->consume_byte;
 
+		hevc->data_offset_bak = hevc->data_offset;
+		hevc->data_size_bak = hevc->data_size;
 		hevc_print(hevc, PRINT_FLAG_VDEC_DETAIL,
 			"%s before, consume 0x%x, size 0x%x, offset 0x%x, res 0x%x\n", __func__,
 			hevc->consume_byte, hevc->data_size, hevc->data_offset + hevc->consume_byte, res_byte);
@@ -17747,8 +17769,6 @@
 			(hevc->chunk != NULL)) {
 			hevc->data_offset = hevc->chunk->offset;
 			hevc->data_size = r;
-			hevc->data_offset_bak = hevc->chunk->offset;
-			hevc->data_size_bak = r;
 		}
 		hevc->multi_frame_flag = 0;
 		if (hevc->front_back_mode == 0)
@@ -17930,6 +17950,7 @@
 	/*WRITE_VREG(HEVC_DECODE_COUNT, hevc->decode_idx);*/
 	hevc->init_flag = 1;
 	hevc->start_decoder_flag = 0;
+	hevc->check_suffix_data = false;
 	if (hevc->pic_list_init_flag == 3) {
 		if (efficiency_mode == 0) {
 #ifdef NEW_FB_CODE