platform: generic: thead: fix stale TLB entries for th1520/sg2042
authorInochi Amaoto <inochiama@outlook.com>
Fri, 15 Sep 2023 09:39:36 +0000 (17:39 +0800)
committerAnup Patel <anup@brainfault.org>
Wed, 4 Oct 2023 13:29:54 +0000 (18:59 +0530)
The TLB entries remain functional all the time once added in T-HEAD th1520
and Sophgo sg2042 (even if the MMU is then disabled afterwards). If there
are some stale TLB entries that contains the address of SBI, it will cause
unexpected memory access and issue a illegal instruction error. To avoid
this, a TLB flush is needed to drop these TLB entries before any memory
access in the trap handler.

To handle this workaroud, add a custom trap handler with executing TLB flush
first in the T-HEAD platform to fix affected socs.

Signed-off-by: Inochi Amaoto <inochiama@outlook.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
platform/generic/Kconfig
platform/generic/configs/defconfig
platform/generic/thead/objects.mk [new file with mode: 0644]
platform/generic/thead/thead-generic.c [new file with mode: 0644]
platform/generic/thead/thead-trap-handler.S [new file with mode: 0644]

index 72768edeb921a3cbf3355b8111d54abcf4c358e5..e7bd94eb48236d9118f9908b263bebdcc63a2ba0 100644 (file)
@@ -52,6 +52,10 @@ config PLATFORM_STARFIVE_JH7110
        bool "StarFive JH7110 support"
        default n
 
+config PLATFORM_THEAD
+       bool "THEAD C9xx support"
+       default n
+
 source "$(OPENSBI_SRC_DIR)/platform/generic/andes/Kconfig"
 
 endif
index 634d41081611769452969d94fc831742278e2e93..c432bc2f8936ca7809bb7cb200ce310db2b27c61 100644 (file)
@@ -4,6 +4,7 @@ CONFIG_PLATFORM_RENESAS_RZFIVE=y
 CONFIG_PLATFORM_SIFIVE_FU540=y
 CONFIG_PLATFORM_SIFIVE_FU740=y
 CONFIG_PLATFORM_STARFIVE_JH7110=y
+CONFIG_PLATFORM_THEAD=y
 CONFIG_FDT_GPIO=y
 CONFIG_FDT_GPIO_DESIGNWARE=y
 CONFIG_FDT_GPIO_SIFIVE=y
diff --git a/platform/generic/thead/objects.mk b/platform/generic/thead/objects.mk
new file mode 100644 (file)
index 0000000..854bfbd
--- /dev/null
@@ -0,0 +1,10 @@
+#
+# SPDX-License-Identifier: BSD-2-Clause
+#
+# Copyright (C) 2023 Inochi Amaoto <inochiama@outlook.com>
+# Copyright (C) 2023 Alibaba Group Holding Limited.
+#
+
+carray-platform_override_modules-$(CONFIG_PLATFORM_THEAD) += thead_generic
+platform-objs-$(CONFIG_PLATFORM_THEAD) += thead/thead-generic.o
+platform-objs-$(CONFIG_PLATFORM_THEAD) += thead/thead-trap-handler.o
diff --git a/platform/generic/thead/thead-generic.c b/platform/generic/thead/thead-generic.c
new file mode 100644 (file)
index 0000000..8120f6f
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Authors:
+ *   Inochi Amaoto <inochiama@outlook.com>
+ *
+ */
+
+#include <platform_override.h>
+#include <sbi/riscv_barrier.h>
+#include <sbi/sbi_const.h>
+#include <sbi/sbi_platform.h>
+#include <sbi/sbi_scratch.h>
+#include <sbi/sbi_string.h>
+#include <sbi_utils/fdt/fdt_helper.h>
+
+/**
+ * T-HEAD board with this quirk need to execute sfence.vma to flush
+ * stale entrie avoid incorrect memory access.
+ */
+#define THEAD_QUIRK_TLB_FLUSH_FIXUP            BIT(0)
+
+void _thead_tlb_flush_fixup_trap_handler(void);
+
+void thead_register_tlb_flush_trap_handler(void)
+{
+       csr_write(CSR_MTVEC, &_thead_tlb_flush_fixup_trap_handler);
+}
+
+static int thead_generic_early_init(bool cold_boot,
+                                   const struct fdt_match *match)
+{
+       unsigned long quirks = (unsigned long)match->data;
+
+       if (quirks & THEAD_QUIRK_TLB_FLUSH_FIXUP)
+               thead_register_tlb_flush_trap_handler();
+
+       return 0;
+}
+
+static const struct fdt_match thead_generic_match[] = {
+       { .compatible = "thead,th1520",
+         .data = (void*)THEAD_QUIRK_TLB_FLUSH_FIXUP },
+       { },
+};
+
+const struct platform_override thead_generic = {
+       .match_table    = thead_generic_match,
+       .early_init     = thead_generic_early_init,
+};
diff --git a/platform/generic/thead/thead-trap-handler.S b/platform/generic/thead/thead-trap-handler.S
new file mode 100644 (file)
index 0000000..861c029
--- /dev/null
@@ -0,0 +1,13 @@
+/*
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Authors:
+ *   Inochi Amaoto <inochiama@outlook.com>
+ *
+ */
+       .section .entry, "ax", %progbits
+       .align 3
+       .globl _thead_tlb_flush_fixup_trap_handler
+_thead_tlb_flush_fixup_trap_handler:
+       sfence.vma t0, zero
+       j _trap_handler