summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorInochi Amaoto <[email protected]>2023-09-15 17:39:36 +0800
committerAnup Patel <[email protected]>2023-10-04 18:59:54 +0530
commit3669153e06cbae66da28b685c29c8e622d547263 (patch)
treec6fbce1adc6f521c17dd922e9e5748d7012afd6b
parentb7e9d34edf4f728bb02d11f73a2f9f79ad4acce4 (diff)
platform: generic: thead: fix stale TLB entries for th1520/sg2042
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 <[email protected]> Reviewed-by: Anup Patel <[email protected]>
-rw-r--r--platform/generic/Kconfig4
-rw-r--r--platform/generic/configs/defconfig1
-rw-r--r--platform/generic/thead/objects.mk10
-rw-r--r--platform/generic/thead/thead-generic.c50
-rw-r--r--platform/generic/thead/thead-trap-handler.S13
5 files changed, 78 insertions, 0 deletions
diff --git a/platform/generic/Kconfig b/platform/generic/Kconfig
index 72768ede..e7bd94eb 100644
--- a/platform/generic/Kconfig
+++ b/platform/generic/Kconfig
@@ -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
diff --git a/platform/generic/configs/defconfig b/platform/generic/configs/defconfig
index 634d4108..c432bc2f 100644
--- a/platform/generic/configs/defconfig
+++ b/platform/generic/configs/defconfig
@@ -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
index 00000000..854bfbde
--- /dev/null
+++ b/platform/generic/thead/objects.mk
@@ -0,0 +1,10 @@
+#
+# SPDX-License-Identifier: BSD-2-Clause
+#
+# Copyright (C) 2023 Inochi Amaoto <[email protected]>
+# 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
index 00000000..8120f6fc
--- /dev/null
+++ b/platform/generic/thead/thead-generic.c
@@ -0,0 +1,50 @@
+/*
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Authors:
+ * Inochi Amaoto <[email protected]>
+ *
+ */
+
+#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
index 00000000..861c0292
--- /dev/null
+++ b/platform/generic/thead/thead-trap-handler.S
@@ -0,0 +1,13 @@
+/*
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Authors:
+ * Inochi Amaoto <[email protected]>
+ *
+ */
+ .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