The FF-A EFI runtime variable path uses a shared MM communication buffer after ExitBootServices(). Before sending a request to the MM secure partition the buffer range must be flushed, and after the response the same range must be invalidated.
Keep flush_dcache_range() and invalidate_dcache_range() available from EFI runtime code on arm64, together with the underlying assembly range helpers, so the FF-A runtime transport can maintain the shared buffer without using whole-cache operations after ExitBootServices(). Reviewed-by: Simon Glass <[email protected]> Signed-off-by: Harsimran Singh Tungal <[email protected]> --- arch/arm/cpu/armv8/cache.S | 8 ++++++++ arch/arm/cpu/armv8/cache_v8.c | 13 +++++++++---- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/arch/arm/cpu/armv8/cache.S b/arch/arm/cpu/armv8/cache.S index c9e46859b4f..916558fe477 100644 --- a/arch/arm/cpu/armv8/cache.S +++ b/arch/arm/cpu/armv8/cache.S @@ -169,7 +169,11 @@ ENDPROC(__asm_flush_l3_dcache) * x0: start address * x1: end address */ +#ifdef CONFIG_EFI_LOADER +.pushsection .text.efi_runtime.__asm_flush_dcache_range, "ax" +#else .pushsection .text.__asm_flush_dcache_range, "ax" +#endif ENTRY(__asm_flush_dcache_range) mrs x3, ctr_el0 ubfx x3, x3, #16, #4 @@ -195,7 +199,11 @@ ENDPROC(__asm_flush_dcache_range) * x0: start address * x1: end address */ +#ifdef CONFIG_EFI_LOADER +.pushsection .text.efi_runtime.__asm_invalidate_dcache_range, "ax" +#else .pushsection .text.__asm_invalidate_dcache_range, "ax" +#endif ENTRY(__asm_invalidate_dcache_range) mrs x3, ctr_el0 ubfx x3, x3, #16, #4 diff --git a/arch/arm/cpu/armv8/cache_v8.c b/arch/arm/cpu/armv8/cache_v8.c index 7c0e3f6d055..d150da4778e 100644 --- a/arch/arm/cpu/armv8/cache_v8.c +++ b/arch/arm/cpu/armv8/cache_v8.c @@ -8,6 +8,7 @@ */ #include <cpu_func.h> +#include <efi_loader.h> #include <hang.h> #include <log.h> #include <asm/cache.h> @@ -855,7 +856,8 @@ inline void flush_dcache_all(void) /* * Invalidates range in all levels of D-cache/unified cache */ -void invalidate_dcache_range(unsigned long start, unsigned long stop) +void __efi_runtime invalidate_dcache_range(unsigned long start, + unsigned long stop) { __asm_invalidate_dcache_range(start, stop); } @@ -863,16 +865,19 @@ void invalidate_dcache_range(unsigned long start, unsigned long stop) /* * Flush range(clean & invalidate) from all levels of D-cache/unified cache */ -void flush_dcache_range(unsigned long start, unsigned long stop) +void __efi_runtime flush_dcache_range(unsigned long start, + unsigned long stop) { __asm_flush_dcache_range(start, stop); } #else -void invalidate_dcache_range(unsigned long start, unsigned long stop) +void __efi_runtime invalidate_dcache_range(unsigned long start, + unsigned long stop) { } -void flush_dcache_range(unsigned long start, unsigned long stop) +void __efi_runtime flush_dcache_range(unsigned long start, + unsigned long stop) { } #endif /* CONFIG_SYS_DISABLE_DCACHE_OPS */ -- 2.34.1
