Sfoglia il codice sorgente

soft_3rdpart/wave511/code/vdi/linux/driver: Fixed the bug about Vdec module reloading

Fixed the bug about Vdec module crash caused by repeated loading in linux 5.13 and 5.15.

Signed-off-by: Xingyu Wu <xingyu.wu@starfivetech.com>
xingyu.wu 2 anni fa
parent
commit
a357c726a6

+ 9 - 4
soft_3rdpart/wave511/code/vdi/linux/driver/vdec-starfive.h

@@ -51,6 +51,7 @@ void starfive_vdec_rst_status(void)
 	int rst_state;
 	for (i = 0; i < VDEC_ID_NUM; i++) {		
 		rst_state = reset_control_status(sf_vdec->rst_vdec_id[i]);
+		dev_dbg(sf_vdec->dev, "status_rst%d:%d", i, rst_state);
 	}
 	return;
 }
@@ -61,6 +62,7 @@ void starfive_vdec_clk_status(void)
 	int clk_state;
 	for (i = 0; i < VDEC_ID_NUM; i++) {		
 		clk_state = __clk_is_enabled(sf_vdec->clk_vdec_id[i]);
+		dev_dbg(sf_vdec->dev, "status_clk%d:%d", i, clk_state);
 	}
 	return;
 }
@@ -70,10 +72,13 @@ void starfive_vdec_rst_exit(void)
 	int i;
 	int ret;
 	for (i = 0; i < VDEC_ID_NUM; i++) {
-		ret = reset_control_assert(sf_vdec->rst_vdec_id[i]);
-		if (ret) {
-			dev_err(sf_vdec->dev, "reset assert failed\n");
-		}
+		/* Assert the reset of "vdecbrg_main" could crash*/
+		if (i != 1){
+			ret = reset_control_assert(sf_vdec->rst_vdec_id[i]);
+			if (ret) {
+				dev_err(sf_vdec->dev, "reset assert failed\n");
+			}
+		}		
 	}
 	return;
 }

+ 2 - 2
soft_3rdpart/wave511/code/vdi/linux/driver/vdec.c

@@ -38,7 +38,7 @@
 
 /* definitions to be changed as customer  configuration */
 /* if linux version is 5.15 or later, then can use clock and reset framework */
-#if LINUX_VERSION_CODE > KERNEL_VERSION(5,15,0)
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,15,0)
 #define VPU_SUPPORT_CLOCK_CONTROL
 #endif
 
@@ -1917,7 +1917,7 @@ static void _disable_clk(volatile unsigned long p_reg,int ibit)
 
 static void _reset_assert(volatile unsigned long p_assert_reg,volatile unsigned long p_status_reg)
 {
-    _set_reset(p_assert_reg,p_status_reg,NBIT_RSTN_VDEC_BRG_MAIN);
+    //_set_reset(p_assert_reg,p_status_reg,NBIT_RSTN_VDEC_BRG_MAIN);
     _set_reset(p_assert_reg,p_status_reg,NBIT_RSTN_VDEC_APB);
     _set_reset(p_assert_reg,p_status_reg,NBIT_RSTN_VDEC_AXI);
     _set_reset(p_assert_reg,p_status_reg,NBIT_RSTN_VDEC_BCLK);