diff --git a/platform/generic/Kconfig b/platform/generic/Kconfig index ea3b5cf..3be75cf 100644 --- a/platform/generic/Kconfig +++ b/platform/generic/Kconfig @@ -55,6 +55,7 @@ config PLATFORM_STARFIVE_JH7110 config PLATFORM_THEAD bool "THEAD C9xx support" + select THEAD_C9XX_ERRATA default n source "$(OPENSBI_SRC_DIR)/platform/generic/andes/Kconfig" diff --git a/platform/generic/include/thead/c9xx_errata.h b/platform/generic/include/thead/c9xx_errata.h new file mode 100644 index 0000000..bf97938 --- /dev/null +++ b/platform/generic/include/thead/c9xx_errata.h @@ -0,0 +1,13 @@ + +#ifndef __RISCV_THEAD_C9XX_ERRATA_H____ +#define __RISCV_THEAD_C9XX_ERRATA_H____ + +/** + * T-HEAD board with this quirk need to execute sfence.vma to flush + * stale entrie avoid incorrect memory access. + */ +#define THEAD_QUIRK_ERRATA_TLB_FLUSH BIT(0) + +void thead_register_tlb_flush_trap_handler(void); + +#endif // __RISCV_THEAD_C9XX_ERRATA_H____ diff --git a/platform/generic/thead/Kconfig b/platform/generic/thead/Kconfig index e54e621..c50d38e 100644 --- a/platform/generic/thead/Kconfig +++ b/platform/generic/thead/Kconfig @@ -3,3 +3,7 @@ config THEAD_C9XX_PMU bool "T-HEAD c9xx M-mode PMU support" default n + +config THEAD_C9XX_ERRATA + bool "T-HEAD c9xx errata support" + default n diff --git a/platform/generic/thead/objects.mk b/platform/generic/thead/objects.mk index df2c61b..84f9faf 100644 --- a/platform/generic/thead/objects.mk +++ b/platform/generic/thead/objects.mk @@ -7,6 +7,8 @@ platform-objs-$(CONFIG_THEAD_C9XX_PMU) += thead/thead_c9xx_pmu.o +platform-objs-$(CONFIG_THEAD_C9XX_ERRATA) += thead/thead_c9xx_tlb_trap_handler.o +platform-objs-$(CONFIG_THEAD_C9XX_ERRATA) += thead/thead_c9xx_errata_tlb_flush.o + 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 index 8120f6f..c77140c 100644 --- a/platform/generic/thead/thead-generic.c +++ b/platform/generic/thead/thead-generic.c @@ -7,40 +7,34 @@ */ #include -#include +#include #include #include #include #include #include -/** - * 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); -} +struct thead_generic_quirks { + u64 errata; +}; static int thead_generic_early_init(bool cold_boot, const struct fdt_match *match) { - unsigned long quirks = (unsigned long)match->data; + struct thead_generic_quirks *quirks = (void *)match->data; - if (quirks & THEAD_QUIRK_TLB_FLUSH_FIXUP) + if (quirks->errata & THEAD_QUIRK_ERRATA_TLB_FLUSH) thead_register_tlb_flush_trap_handler(); return 0; } +static struct thead_generic_quirks thead_th1520_quirks = { + .errata = THEAD_QUIRK_ERRATA_TLB_FLUSH, +}; + static const struct fdt_match thead_generic_match[] = { - { .compatible = "thead,th1520", - .data = (void*)THEAD_QUIRK_TLB_FLUSH_FIXUP }, + { .compatible = "thead,th1520", .data = &thead_th1520_quirks }, { }, }; diff --git a/platform/generic/thead/thead_c9xx_errata_tlb_flush.c b/platform/generic/thead/thead_c9xx_errata_tlb_flush.c new file mode 100644 index 0000000..755899a --- /dev/null +++ b/platform/generic/thead/thead_c9xx_errata_tlb_flush.c @@ -0,0 +1,17 @@ +/* + * SPDX-License-Identifier: BSD-2-Clause + * + * Authors: + * Inochi Amaoto + * + */ + +#include +#include + +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); +} diff --git a/platform/generic/thead/thead-trap-handler.S b/platform/generic/thead/thead_c9xx_tlb_trap_handler.S similarity index 100% rename from platform/generic/thead/thead-trap-handler.S rename to platform/generic/thead/thead_c9xx_tlb_trap_handler.S