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();
}