Merge "SoC s6: Fix system hang when MTE feature is enabled [1/1]" into projects/amlogic-dev
diff --git a/bl201_s905x5/hw_business.c b/bl201_s905x5/hw_business.c
index 0beccaf..b4149eb 100644
--- a/bl201_s905x5/hw_business.c
+++ b/bl201_s905x5/hw_business.c
@@ -20,6 +20,7 @@
 #include "stick_mem.h"
 #include "suspend.h"
 #include "vrtc.h"
+#include "timer_source.h"
 
 #define INT_TEST_NEST_DEPTH 6
 #define INT_TEST_GPIO_NUM 6
@@ -48,6 +49,53 @@
 #define INT_TEST_MIN_TIMER_PERIOD 50 // ms
 #define INT_TEST_MUTE_TIMER_PERIOD 200 // ms
 
+#define DMC_MON_CTRL0 ((0x0010  << 2) + 0xfe036000)
+#define MTE_FIX_STOP_BIT 0x1
+static TaskHandle_t MTEFixTask;
+
+static uint8_t is_chip_version_a(void)
+{
+	if (((REG32(SYSCTRL_SEC_STATUS_REG0) >> 8) & 0xFF) == 0xA)
+		return 1;
+	else
+		return 0;
+}
+
+static void vMTEFix(void *pvParameters)
+{
+	(void)pvParameters;
+	uint32_t val;
+
+	while (1) {
+		if ((REG32(SYSCTRL_DEBUG_REG4) & MTE_FIX_STOP_BIT) == 1) //Stop MTE feature
+			continue;
+		else {
+			val = REG32(DMC_MON_CTRL0);
+			val |= (1 << 30);
+			REG32(DMC_MON_CTRL0) = val;
+			udelay(10);
+		}
+	}
+}
+
+void create_mte_fix_task(void)
+{
+	if (!is_chip_version_a())
+		return;
+
+	if (xTaskCreate(vMTEFix, "MTEFix_Task", configMINIMAL_STACK_SIZE, NULL, 1, &MTEFixTask) < 0)
+		printf("MTEFix_Task create fail!!\n");
+}
+
+void delete_mte_fix_task(void)
+{
+	if (!is_chip_version_a())
+		return;
+
+	if (MTEFixTask)
+		vTaskDelete(MTEFixTask);
+}
+
 void config_eclic_irqs(void)
 {
 	eclic_init(ECLIC_NUM_INTERRUPTS);
@@ -73,4 +121,5 @@
 	//rtc_init();
 	vETHMailboxCallback();
 	create_str_task();
+	create_mte_fix_task();
 }
diff --git a/bl208_s905x5/hw_business.c b/bl208_s905x5/hw_business.c
index f2f7b75..3722d6b 100644
--- a/bl208_s905x5/hw_business.c
+++ b/bl208_s905x5/hw_business.c
@@ -20,6 +20,7 @@
 #include "stick_mem.h"
 #include "suspend.h"
 #include "vrtc.h"
+#include "timer_source.h"
 
 #define INT_TEST_NEST_DEPTH 6
 #define INT_TEST_GPIO_NUM 6
@@ -48,6 +49,53 @@
 #define INT_TEST_MIN_TIMER_PERIOD 50 // ms
 #define INT_TEST_MUTE_TIMER_PERIOD 200 // ms
 
+#define DMC_MON_CTRL0 ((0x0010  << 2) + 0xfe036000)
+#define MTE_FIX_STOP_BIT 0x1
+static TaskHandle_t MTEFixTask;
+
+static uint8_t is_chip_version_a(void)
+{
+	if (((REG32(SYSCTRL_SEC_STATUS_REG0) >> 8) & 0xFF) == 0xA)
+		return 1;
+	else
+		return 0;
+}
+
+static void vMTEFix(void *pvParameters)
+{
+	(void)pvParameters;
+	uint32_t val;
+
+	while (1) {
+		if ((REG32(SYSCTRL_DEBUG_REG4) & MTE_FIX_STOP_BIT) == 1) //Stop MTE feature
+			continue;
+		else {
+			val = REG32(DMC_MON_CTRL0);
+			val |= (1 << 30);
+			REG32(DMC_MON_CTRL0) = val;
+			udelay(10);
+		}
+	}
+}
+
+void create_mte_fix_task(void)
+{
+	if (!is_chip_version_a())
+		return;
+
+	if (xTaskCreate(vMTEFix, "MTEFix_Task", configMINIMAL_STACK_SIZE, NULL, 1, &MTEFixTask) < 0)
+		printf("MTEFix_Task create fail!!\n");
+}
+
+void delete_mte_fix_task(void)
+{
+	if (!is_chip_version_a())
+		return;
+
+	if (MTEFixTask)
+		vTaskDelete(MTEFixTask);
+}
+
 void config_eclic_irqs(void)
 {
 	eclic_init(ECLIC_NUM_INTERRUPTS);
@@ -73,4 +121,5 @@
 	//rtc_init();
 	vETHMailboxCallback();
 	create_str_task();
+	create_mte_fix_task();
 }
diff --git a/bl209_s905x5/hw_business.c b/bl209_s905x5/hw_business.c
index f2f7b75..3722d6b 100644
--- a/bl209_s905x5/hw_business.c
+++ b/bl209_s905x5/hw_business.c
@@ -20,6 +20,7 @@
 #include "stick_mem.h"
 #include "suspend.h"
 #include "vrtc.h"
+#include "timer_source.h"
 
 #define INT_TEST_NEST_DEPTH 6
 #define INT_TEST_GPIO_NUM 6
@@ -48,6 +49,53 @@
 #define INT_TEST_MIN_TIMER_PERIOD 50 // ms
 #define INT_TEST_MUTE_TIMER_PERIOD 200 // ms
 
+#define DMC_MON_CTRL0 ((0x0010  << 2) + 0xfe036000)
+#define MTE_FIX_STOP_BIT 0x1
+static TaskHandle_t MTEFixTask;
+
+static uint8_t is_chip_version_a(void)
+{
+	if (((REG32(SYSCTRL_SEC_STATUS_REG0) >> 8) & 0xFF) == 0xA)
+		return 1;
+	else
+		return 0;
+}
+
+static void vMTEFix(void *pvParameters)
+{
+	(void)pvParameters;
+	uint32_t val;
+
+	while (1) {
+		if ((REG32(SYSCTRL_DEBUG_REG4) & MTE_FIX_STOP_BIT) == 1) //Stop MTE feature
+			continue;
+		else {
+			val = REG32(DMC_MON_CTRL0);
+			val |= (1 << 30);
+			REG32(DMC_MON_CTRL0) = val;
+			udelay(10);
+		}
+	}
+}
+
+void create_mte_fix_task(void)
+{
+	if (!is_chip_version_a())
+		return;
+
+	if (xTaskCreate(vMTEFix, "MTEFix_Task", configMINIMAL_STACK_SIZE, NULL, 1, &MTEFixTask) < 0)
+		printf("MTEFix_Task create fail!!\n");
+}
+
+void delete_mte_fix_task(void)
+{
+	if (!is_chip_version_a())
+		return;
+
+	if (MTEFixTask)
+		vTaskDelete(MTEFixTask);
+}
+
 void config_eclic_irqs(void)
 {
 	eclic_init(ECLIC_NUM_INTERRUPTS);
@@ -73,4 +121,5 @@
 	//rtc_init();
 	vETHMailboxCallback();
 	create_str_task();
+	create_mte_fix_task();
 }
diff --git a/bq201_s905d5/hw_business.c b/bq201_s905d5/hw_business.c
index f2f7b75..3722d6b 100644
--- a/bq201_s905d5/hw_business.c
+++ b/bq201_s905d5/hw_business.c
@@ -20,6 +20,7 @@
 #include "stick_mem.h"
 #include "suspend.h"
 #include "vrtc.h"
+#include "timer_source.h"
 
 #define INT_TEST_NEST_DEPTH 6
 #define INT_TEST_GPIO_NUM 6
@@ -48,6 +49,53 @@
 #define INT_TEST_MIN_TIMER_PERIOD 50 // ms
 #define INT_TEST_MUTE_TIMER_PERIOD 200 // ms
 
+#define DMC_MON_CTRL0 ((0x0010  << 2) + 0xfe036000)
+#define MTE_FIX_STOP_BIT 0x1
+static TaskHandle_t MTEFixTask;
+
+static uint8_t is_chip_version_a(void)
+{
+	if (((REG32(SYSCTRL_SEC_STATUS_REG0) >> 8) & 0xFF) == 0xA)
+		return 1;
+	else
+		return 0;
+}
+
+static void vMTEFix(void *pvParameters)
+{
+	(void)pvParameters;
+	uint32_t val;
+
+	while (1) {
+		if ((REG32(SYSCTRL_DEBUG_REG4) & MTE_FIX_STOP_BIT) == 1) //Stop MTE feature
+			continue;
+		else {
+			val = REG32(DMC_MON_CTRL0);
+			val |= (1 << 30);
+			REG32(DMC_MON_CTRL0) = val;
+			udelay(10);
+		}
+	}
+}
+
+void create_mte_fix_task(void)
+{
+	if (!is_chip_version_a())
+		return;
+
+	if (xTaskCreate(vMTEFix, "MTEFix_Task", configMINIMAL_STACK_SIZE, NULL, 1, &MTEFixTask) < 0)
+		printf("MTEFix_Task create fail!!\n");
+}
+
+void delete_mte_fix_task(void)
+{
+	if (!is_chip_version_a())
+		return;
+
+	if (MTEFixTask)
+		vTaskDelete(MTEFixTask);
+}
+
 void config_eclic_irqs(void)
 {
 	eclic_init(ECLIC_NUM_INTERRUPTS);
@@ -73,4 +121,5 @@
 	//rtc_init();
 	vETHMailboxCallback();
 	create_str_task();
+	create_mte_fix_task();
 }
diff --git a/bq208_s905d5/hw_business.c b/bq208_s905d5/hw_business.c
index f2f7b75..3722d6b 100644
--- a/bq208_s905d5/hw_business.c
+++ b/bq208_s905d5/hw_business.c
@@ -20,6 +20,7 @@
 #include "stick_mem.h"
 #include "suspend.h"
 #include "vrtc.h"
+#include "timer_source.h"
 
 #define INT_TEST_NEST_DEPTH 6
 #define INT_TEST_GPIO_NUM 6
@@ -48,6 +49,53 @@
 #define INT_TEST_MIN_TIMER_PERIOD 50 // ms
 #define INT_TEST_MUTE_TIMER_PERIOD 200 // ms
 
+#define DMC_MON_CTRL0 ((0x0010  << 2) + 0xfe036000)
+#define MTE_FIX_STOP_BIT 0x1
+static TaskHandle_t MTEFixTask;
+
+static uint8_t is_chip_version_a(void)
+{
+	if (((REG32(SYSCTRL_SEC_STATUS_REG0) >> 8) & 0xFF) == 0xA)
+		return 1;
+	else
+		return 0;
+}
+
+static void vMTEFix(void *pvParameters)
+{
+	(void)pvParameters;
+	uint32_t val;
+
+	while (1) {
+		if ((REG32(SYSCTRL_DEBUG_REG4) & MTE_FIX_STOP_BIT) == 1) //Stop MTE feature
+			continue;
+		else {
+			val = REG32(DMC_MON_CTRL0);
+			val |= (1 << 30);
+			REG32(DMC_MON_CTRL0) = val;
+			udelay(10);
+		}
+	}
+}
+
+void create_mte_fix_task(void)
+{
+	if (!is_chip_version_a())
+		return;
+
+	if (xTaskCreate(vMTEFix, "MTEFix_Task", configMINIMAL_STACK_SIZE, NULL, 1, &MTEFixTask) < 0)
+		printf("MTEFix_Task create fail!!\n");
+}
+
+void delete_mte_fix_task(void)
+{
+	if (!is_chip_version_a())
+		return;
+
+	if (MTEFixTask)
+		vTaskDelete(MTEFixTask);
+}
+
 void config_eclic_irqs(void)
 {
 	eclic_init(ECLIC_NUM_INTERRUPTS);
@@ -73,4 +121,5 @@
 	//rtc_init();
 	vETHMailboxCallback();
 	create_str_task();
+	create_mte_fix_task();
 }
diff --git a/bq209_s905d5/hw_business.c b/bq209_s905d5/hw_business.c
index f2f7b75..3722d6b 100644
--- a/bq209_s905d5/hw_business.c
+++ b/bq209_s905d5/hw_business.c
@@ -20,6 +20,7 @@
 #include "stick_mem.h"
 #include "suspend.h"
 #include "vrtc.h"
+#include "timer_source.h"
 
 #define INT_TEST_NEST_DEPTH 6
 #define INT_TEST_GPIO_NUM 6
@@ -48,6 +49,53 @@
 #define INT_TEST_MIN_TIMER_PERIOD 50 // ms
 #define INT_TEST_MUTE_TIMER_PERIOD 200 // ms
 
+#define DMC_MON_CTRL0 ((0x0010  << 2) + 0xfe036000)
+#define MTE_FIX_STOP_BIT 0x1
+static TaskHandle_t MTEFixTask;
+
+static uint8_t is_chip_version_a(void)
+{
+	if (((REG32(SYSCTRL_SEC_STATUS_REG0) >> 8) & 0xFF) == 0xA)
+		return 1;
+	else
+		return 0;
+}
+
+static void vMTEFix(void *pvParameters)
+{
+	(void)pvParameters;
+	uint32_t val;
+
+	while (1) {
+		if ((REG32(SYSCTRL_DEBUG_REG4) & MTE_FIX_STOP_BIT) == 1) //Stop MTE feature
+			continue;
+		else {
+			val = REG32(DMC_MON_CTRL0);
+			val |= (1 << 30);
+			REG32(DMC_MON_CTRL0) = val;
+			udelay(10);
+		}
+	}
+}
+
+void create_mte_fix_task(void)
+{
+	if (!is_chip_version_a())
+		return;
+
+	if (xTaskCreate(vMTEFix, "MTEFix_Task", configMINIMAL_STACK_SIZE, NULL, 1, &MTEFixTask) < 0)
+		printf("MTEFix_Task create fail!!\n");
+}
+
+void delete_mte_fix_task(void)
+{
+	if (!is_chip_version_a())
+		return;
+
+	if (MTEFixTask)
+		vTaskDelete(MTEFixTask);
+}
+
 void config_eclic_irqs(void)
 {
 	eclic_init(ECLIC_NUM_INTERRUPTS);
@@ -73,4 +121,5 @@
 	//rtc_init();
 	vETHMailboxCallback();
 	create_str_task();
+	create_mte_fix_task();
 }