forked from Mirrors/opensbi
		
	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 <inochiama@outlook.com> Reviewed-by: Anup Patel <anup@brainfault.org>
This commit is contained in:
		
				
					committed by
					
						
						Anup Patel
					
				
			
			
				
	
			
			
			
						parent
						
							b7e9d34edf
						
					
				
				
					commit
					3669153e06
				
			@@ -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
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										10
									
								
								platform/generic/thead/objects.mk
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								platform/generic/thead/objects.mk
									
									
									
									
									
										Normal file
									
								
							@@ -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
 | 
			
		||||
							
								
								
									
										50
									
								
								platform/generic/thead/thead-generic.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								platform/generic/thead/thead-generic.c
									
									
									
									
									
										Normal file
									
								
							@@ -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,
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										13
									
								
								platform/generic/thead/thead-trap-handler.S
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								platform/generic/thead/thead-trap-handler.S
									
									
									
									
									
										Normal file
									
								
							@@ -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
 | 
			
		||||
		Reference in New Issue
	
	Block a user