fix(nuvoton): gfx frame buffer memory corruption during secondary boot

gfx frame buffer memory corruption because of moving TF-A to DDR

Change-Id: I6f1e0c8d048273b8047497adec631160aaf393d6
Signed-off-by: Margarita Glushkin <rutigl@gmail.com>
This commit is contained in:
rutigl@gmail.com 2024-02-19 12:51:22 +02:00
parent 19e273e670
commit ae2b4a5494
5 changed files with 84 additions and 15 deletions

View file

@ -149,7 +149,16 @@
ARM_AP_TZC_DRAM1_SIZE - 1U) ARM_AP_TZC_DRAM1_SIZE - 1U)
/* Define the Access permissions for Secure peripherals to NS_DRAM */ /* Define the Access permissions for Secure peripherals to NS_DRAM */
#if ARM_CRYPTOCELL_INTEG
/*
* Allow Secure peripheral to read NS DRAM when integrated with CryptoCell.
* This is required by CryptoCell to authenticate BL33 which is loaded
* into the Non Secure DDR.
*/
#define ARM_TZC_NS_DRAM_S_ACCESS TZC_REGION_S_RD
#else
#define ARM_TZC_NS_DRAM_S_ACCESS TZC_REGION_S_NONE #define ARM_TZC_NS_DRAM_S_ACCESS TZC_REGION_S_NONE
#endif /* ARM_CRYPTOCELL_INTEG */
#ifdef SPD_opteed #ifdef SPD_opteed
/* /*
@ -310,7 +319,7 @@
BL_RO_DATA_END - BL_RO_DATA_BASE, \ BL_RO_DATA_END - BL_RO_DATA_BASE, \
MT_RO_DATA | EL3_PAS) MT_RO_DATA | EL3_PAS)
#else #else
#define ARM_MAP_BL_RO MAP_REGION_FLAT( \ #define ARM_MAP_BL_RO_NOT_USED MAP_REGION_FLAT( \
BL_CODE_BASE, BL_CODE_END - BL_CODE_BASE, \ BL_CODE_BASE, BL_CODE_END - BL_CODE_BASE, \
MT_CODE | EL3_PAS) MT_CODE | EL3_PAS)
#endif /* SEPARATE_CODE_AND_RODATA */ #endif /* SEPARATE_CODE_AND_RODATA */
@ -474,9 +483,9 @@
#define NEW_SRAM_ALLOCATION #define NEW_SRAM_ALLOCATION
#ifdef NEW_SRAM_ALLOCATION #ifdef NEW_SRAM_ALLOCATION
#define BL31_BASE 0x20001000 #define BL31_BASE 0x02000000
#else #else
#define BL31_BASE 0x20001000 #define BL31_BASE 0x02001000
#endif /* NEW_SRAM_ALLOCATION */ #endif /* NEW_SRAM_ALLOCATION */
#define BL31_LIMIT BL2_BASE /* PLAT_ARM_MAX_BL31_SIZE */ #define BL31_LIMIT BL2_BASE /* PLAT_ARM_MAX_BL31_SIZE */
@ -502,6 +511,7 @@
* no SPD and no SPM-MM, as they are the only ones that can be used as BL32. * no SPD and no SPM-MM, as they are the only ones that can be used as BL32.
*/ */
#if defined(SPD_none) && !SPM_MM #if defined(SPD_none) && !SPM_MM
#error BL32_BASE is not defined
#undef BL32_BASE #undef BL32_BASE
#endif /* SPD_none && !SPM_MM */ #endif /* SPD_none && !SPM_MM */

View file

@ -41,7 +41,8 @@ arm_print_gic_regs
* BL31. * BL31.
*/ */
.macro plat_crash_print_regs .macro plat_crash_print_regs
/* TODO */ plat_print_gic_regs
/*print_cci_regs*/
.endm .endm
#endif /* PLAT_MACROS_S */ #endif /* PLAT_MACROS_S */

View file

@ -151,9 +151,9 @@ func plat_wait_for_warm_boot
*/ */
bl plat_my_core_pos bl plat_my_core_pos
lsl x0, x0, #3 lsl x0, x0, #3
mov x8, x0
mov_imm x2, PLAT_NPCM_TM_HOLD_BASE mov_imm x2, PLAT_NPCM_TM_HOLD_BASE
add x0, x0, x2 add x0, x0, x2
mov x8, x0
mov_imm x2, PLAT_NPCM_TRUSTED_NOTIFICATION_BASE mov_imm x2, PLAT_NPCM_TRUSTED_NOTIFICATION_BASE
add x8, x8, x2 add x8, x8, x2
/* /*

View file

@ -47,6 +47,20 @@ static entry_point_info_t bl33_image_ep_info;
BL31_END - BL31_START, \ BL31_END - BL31_START, \
MT_MEMORY | MT_RW | EL3_PAS) MT_MEMORY | MT_RW | EL3_PAS)
#if RECLAIM_INIT_CODE
IMPORT_SYM(unsigned long, __INIT_CODE_START__, BL_INIT_CODE_BASE);
IMPORT_SYM(unsigned long, __INIT_CODE_END__, BL_CODE_END_UNALIGNED);
#define BL_INIT_CODE_END ((BL_CODE_END_UNALIGNED + PAGE_SIZE - 1) & \
~(PAGE_SIZE - 1))
#define MAP_BL_INIT_CODE MAP_REGION_FLAT( \
BL_INIT_CODE_BASE, \
BL_INIT_CODE_END - \
BL_INIT_CODE_BASE, \
MT_CODE | MT_SECURE)
#endif /* RECLAIM_INIT_CODE */
#if SEPARATE_NOBITS_REGION #if SEPARATE_NOBITS_REGION
#define MAP_BL31_NOBITS MAP_REGION_FLAT( \ #define MAP_BL31_NOBITS MAP_REGION_FLAT( \
BL31_NOBITS_BASE, \ BL31_NOBITS_BASE, \
@ -117,6 +131,7 @@ unsigned int plat_get_syscnt_freq2(void)
void bl31_early_platform_setup2(u_register_t arg0, u_register_t arg1, void bl31_early_platform_setup2(u_register_t arg0, u_register_t arg1,
u_register_t arg2, u_register_t arg3) u_register_t arg2, u_register_t arg3)
{ {
arg0 = arg1 = arg2 = arg3 = 0;
#if RESET_TO_BL31 #if RESET_TO_BL31
void *from_bl2 = (void *)arg0; void *from_bl2 = (void *)arg0;
void *plat_params_from_bl2 = (void *)arg3; void *plat_params_from_bl2 = (void *)arg3;
@ -309,26 +324,23 @@ void __init npcm845x_bl31_plat_arch_setup(void)
{ {
const mmap_region_t bl_regions[] = { const mmap_region_t bl_regions[] = {
MAP_BL31_TOTAL, MAP_BL31_TOTAL,
#if SEPARATE_NOBITS_REGION #if RECLAIM_INIT_CODE
MAP_BL31_NOBITS, MAP_BL_INIT_CODE_NOT_USED,
#endif /* SEPARATE_NOBITS_REGION */ #endif /* RECLAIM_INIT_CODE */
ARM_MAP_BL_RO, ARM_MAP_BL_RO,
#if USE_ROMLIB
ARM_MAP_ROMLIB_CODE,
ARM_MAP_ROMLIB_DATA,
#endif /* USE_ROMLIB */
#if USE_COHERENT_MEM #if USE_COHERENT_MEM
ARM_MAP_BL_COHERENT_RAM, ARM_MAP_BL_COHERENT_RAM,
#endif /* USE_COHERENT_MEM */ #endif /* USE_COHERENT_MEM */
ARM_MAP_SHARED_RAM, ARM_MAP_SHARED_RAM,
#ifdef SECONDARY_BRINGUP #ifdef SECONDARY_BRINGUP
ARM_MAP_NS_DRAM1, ARM_MAP_NS_DRAM1_NO_USED,
#ifdef BL32_BASE #ifdef BL32_BASE
ARM_MAP_BL32_CORE_MEM ARM_MAP_BL32_CORE_MEM_NO_USED
#endif /* BL32_BASE */ #endif /* BL32_BASE */
#endif /* SECONDARY_BRINGUP */ #endif /* SECONDARY_BRINGUP */
{0} {0}
}; };
setup_page_tables(bl_regions, plat_arm_get_mmap()); setup_page_tables(bl_regions, plat_arm_get_mmap());
enable_mmu_el3(0U); enable_mmu_el3(0U);
NOTICE("Done enabling MMU\n");
} }

View file

@ -12,6 +12,7 @@ RESET_TO_BL31 := 1
SPMD_SPM_AT_SEL2 := 0 SPMD_SPM_AT_SEL2 := 0
#temporary until the RAM size is reduced #temporary until the RAM size is reduced
USE_COHERENT_MEM := 1 USE_COHERENT_MEM := 1
INIT_UNUSED_NS_EL2 := 1
$(eval $(call add_define,RESET_TO_BL31)) $(eval $(call add_define,RESET_TO_BL31))
@ -21,12 +22,29 @@ ifeq (${ARCH}, aarch64)
# Trusted DRAM (if available) or the TZC secured area of DRAM. # Trusted DRAM (if available) or the TZC secured area of DRAM.
# TZC secured DRAM is the default. # TZC secured DRAM is the default.
ARM_TSP_RAM_LOCATION ?= dram
ifeq (${ARM_TSP_RAM_LOCATION}, tsram)
ARM_TSP_RAM_LOCATION_ID = ARM_TRUSTED_SRAM_ID
else ifeq (${ARM_TSP_RAM_LOCATION}, tdram)
ARM_TSP_RAM_LOCATION_ID = ARM_TRUSTED_DRAM_ID
else ifeq (${ARM_TSP_RAM_LOCATION}, dram)
ARM_TSP_RAM_LOCATION_ID = ARM_DRAM_ID
else
$(error "Unsupported ARM_TSP_RAM_LOCATION value")
endif
# Process flags
# Process ARM_BL31_IN_DRAM flag # Process ARM_BL31_IN_DRAM flag
ARM_BL31_IN_DRAM := 0 ARM_BL31_IN_DRAM := 0
$(eval $(call assert_boolean,ARM_BL31_IN_DRAM)) $(eval $(call assert_boolean,ARM_BL31_IN_DRAM))
$(eval $(call add_define,ARM_BL31_IN_DRAM)) $(eval $(call add_define,ARM_BL31_IN_DRAM))
else
ARM_TSP_RAM_LOCATION_ID = ARM_TRUSTED_SRAM_ID
endif endif
$(eval $(call add_define,ARM_TSP_RAM_LOCATION_ID))
# For the original power-state parameter format, the State-ID can be encoded # For the original power-state parameter format, the State-ID can be encoded
# according to the recommended encoding or zero. This flag determines which # according to the recommended encoding or zero. This flag determines which
# State-ID encoding to be parsed. # State-ID encoding to be parsed.
@ -140,11 +158,25 @@ $(error For SEPARATE_NOBITS_REGION, RECLAIM_INIT_CODE cannot be supported)
endif endif
endif endif
# Disable ARM Cryptocell by default
ARM_CRYPTOCELL_INTEG := 0
$(eval $(call assert_boolean,ARM_CRYPTOCELL_INTEG))
$(eval $(call add_define,ARM_CRYPTOCELL_INTEG))
# Enable PIE support for RESET_TO_BL31 case # Enable PIE support for RESET_TO_BL31 case
ifeq (${RESET_TO_BL31},1) ifeq (${RESET_TO_BL31},1)
ENABLE_PIE := 1 ENABLE_PIE := 1
endif endif
# CryptoCell integration relies on coherent buffers for passing data from
# the AP CPU to the CryptoCell
ifeq (${ARM_CRYPTOCELL_INTEG},1)
ifeq (${USE_COHERENT_MEM},0)
$(error "ARM_CRYPTOCELL_INTEG needs USE_COHERENT_MEM to be set.")
endif
endif
PLAT_INCLUDES := -Iinclude/plat/nuvoton/npcm845x \ PLAT_INCLUDES := -Iinclude/plat/nuvoton/npcm845x \
-Iinclude/plat/nuvoton/common \ -Iinclude/plat/nuvoton/common \
-Iinclude/drivers/nuvoton/npcm845x \ -Iinclude/drivers/nuvoton/npcm845x \
@ -287,7 +319,8 @@ endif
# Pointer Authentication sources # Pointer Authentication sources
ifeq (${ENABLE_PAUTH}, 1) ifeq (${ENABLE_PAUTH}, 1)
PLAT_BL_COMMON_SOURCES += plat/arm/common/aarch64/arm_pauth.c PLAT_BL_COMMON_SOURCES += plat/arm/common/aarch64/arm_pauth.c \
lib/extensions/pauth/pauth_helpers.S
endif endif
ifeq (${SPD},spmd) ifeq (${SPD},spmd)
@ -325,7 +358,11 @@ BL2_SOURCES += ${AUTH_SOURCES} \
$(eval $(call TOOL_ADD_IMG,ns_bl2u,--fwu,FWU_)) $(eval $(call TOOL_ADD_IMG,ns_bl2u,--fwu,FWU_))
# We expect to locate the *.mk files under the directories specified below # We expect to locate the *.mk files under the directories specified below
ifeq (${ARM_CRYPTOCELL_INTEG},0)
CRYPTO_LIB_MK := drivers/auth/mbedtls/mbedtls_crypto.mk CRYPTO_LIB_MK := drivers/auth/mbedtls/mbedtls_crypto.mk
else
CRYPTO_LIB_MK := drivers/auth/cryptocell/cryptocell_crypto.mk
endif
IMG_PARSER_LIB_MK := drivers/auth/mbedtls/mbedtls_x509.mk IMG_PARSER_LIB_MK := drivers/auth/mbedtls/mbedtls_x509.mk
@ -336,6 +373,12 @@ $(info Including ${IMG_PARSER_LIB_MK})
include ${IMG_PARSER_LIB_MK} include ${IMG_PARSER_LIB_MK}
endif endif
ifeq (${RECLAIM_INIT_CODE}, 1)
ifeq (${ARM_XLAT_TABLES_LIB_V1}, 1)
$(error "To reclaim init code xlat tables v2 must be used")
endif
endif
ifeq (${MEASURED_BOOT},1) ifeq (${MEASURED_BOOT},1)
MEASURED_BOOT_MK := drivers/measured_boot/measured_boot.mk MEASURED_BOOT_MK := drivers/measured_boot/measured_boot.mk
$(info Including ${MEASURED_BOOT_MK}) $(info Including ${MEASURED_BOOT_MK})
@ -352,3 +395,6 @@ BL2U_SOURCES :=
DEBUG_CONSOLE ?= 0 DEBUG_CONSOLE ?= 0
$(eval $(call add_define,DEBUG_CONSOLE)) $(eval $(call add_define,DEBUG_CONSOLE))
$(eval $(call add_define,ARM_TSP_RAM_LOCATION_ID))