From: Siva Durga Prasad Paladugu Date: Sat, 6 Dec 2014 07:27:52 +0000 (+0530) Subject: armv8: caches: Added routine to set non cacheable region X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=1e940ec94f8416095723dde87914a46862faf4cd;p=thirdparty%2Fu-boot.git armv8: caches: Added routine to set non cacheable region Added routine mmu_set_region_dcache_behaviour() to set a particular region as non cacheable. Define dummy routine for mmu_set_region_dcache_behaviour() to handle incase of dcahe off Signed-off-by: Siva Durga Prasad Paladugu Signed-off-by: Michal Simek --- diff --git a/arch/arm/cpu/armv8/cache_v8.c b/arch/arm/cpu/armv8/cache_v8.c index 9dbcdf22afe..3b63571d970 100644 --- a/arch/arm/cpu/armv8/cache_v8.c +++ b/arch/arm/cpu/armv8/cache_v8.c @@ -135,6 +135,24 @@ int dcache_status(void) return (get_sctlr() & CR_C) != 0; } +void mmu_set_region_dcache_behaviour(u32 start, int size, + enum dcache_option option) +{ + /* get the level2_table0 start address */ + u64 *page_table = (u64 *)(gd->arch.tlb_addr + 0x3000); + u64 upto, end; + + end = ALIGN(start + size, (1 << MMU_SECTION_SHIFT)) >> + MMU_SECTION_SHIFT; + start = start >> MMU_SECTION_SHIFT; + for (upto = start; upto < end; upto++) { + page_table[upto] &= ~PMD_ATTRINDX_MASK; + page_table[upto] |= PMD_ATTRINDX(option); + } + + flush_dcache_range(page_table[start], page_table[end]); + __asm_invalidate_tlb_all(); +} #else /* CONFIG_SYS_DCACHE_OFF */ void invalidate_dcache_all(void) @@ -166,6 +184,11 @@ int dcache_status(void) return 0; } +void mmu_set_region_dcache_behaviour(u32 start, int size, + enum dcache_option option) +{ +} + #endif /* CONFIG_SYS_DCACHE_OFF */ #ifndef CONFIG_SYS_ICACHE_OFF diff --git a/arch/arm/include/asm/system.h b/arch/arm/include/asm/system.h index ca2d44faf4e..fa2fd124f26 100644 --- a/arch/arm/include/asm/system.h +++ b/arch/arm/include/asm/system.h @@ -15,9 +15,15 @@ #define CR_EE (1 << 25) /* Exception (Big) Endian */ #define PGTABLE_SIZE (0x10000) +/* 2M granularity */ +#define MMU_SECTION_SHIFT 21 #ifndef __ASSEMBLY__ +enum dcache_option { + DCACHE_OFF = 0x3, +}; + #define isb() \ ({asm volatile( \ "isb" : : : "memory"); \ @@ -194,16 +200,6 @@ enum { MMU_SECTION_SIZE = 1 << MMU_SECTION_SHIFT, }; -/** - * Change the cache settings for a region. - * - * \param start start address of memory region to change - * \param size size of memory region to change - * \param option dcache option to select - */ -void mmu_set_region_dcache_behaviour(u32 start, int size, - enum dcache_option option); - /** * Register an update to the page tables, and flush the TLB * @@ -220,4 +216,16 @@ void mmu_page_table_flush(unsigned long start, unsigned long stop); #endif /* CONFIG_ARM64 */ +#ifndef __ASSEMBLY__ +/** + * Change the cache settings for a region. + * + * \param start start address of memory region to change + * \param size size of memory region to change + * \param option dcache option to select + */ +void mmu_set_region_dcache_behaviour(u32 start, int size, + enum dcache_option option); +#endif /* __ASSEMBLY__ */ + #endif