diff options
Diffstat (limited to 'arch/mips/mm/c-r4k.c')
-rw-r--r-- | arch/mips/mm/c-r4k.c | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/arch/mips/mm/c-r4k.c b/arch/mips/mm/c-r4k.c index b9aabb998a32..a79fe9aa7721 100644 --- a/arch/mips/mm/c-r4k.c +++ b/arch/mips/mm/c-r4k.c | |||
@@ -722,6 +722,39 @@ static void r4k_flush_icache_all(void) | |||
722 | r4k_blast_icache(); | 722 | r4k_blast_icache(); |
723 | } | 723 | } |
724 | 724 | ||
725 | struct flush_kernel_vmap_range_args { | ||
726 | unsigned long vaddr; | ||
727 | int size; | ||
728 | }; | ||
729 | |||
730 | static inline void local_r4k_flush_kernel_vmap_range(void *args) | ||
731 | { | ||
732 | struct flush_kernel_vmap_range_args *vmra = args; | ||
733 | unsigned long vaddr = vmra->vaddr; | ||
734 | int size = vmra->size; | ||
735 | |||
736 | /* | ||
737 | * Aliases only affect the primary caches so don't bother with | ||
738 | * S-caches or T-caches. | ||
739 | */ | ||
740 | if (cpu_has_safe_index_cacheops && size >= dcache_size) | ||
741 | r4k_blast_dcache(); | ||
742 | else { | ||
743 | R4600_HIT_CACHEOP_WAR_IMPL; | ||
744 | blast_dcache_range(vaddr, vaddr + size); | ||
745 | } | ||
746 | } | ||
747 | |||
748 | static void r4k_flush_kernel_vmap_range(unsigned long vaddr, int size) | ||
749 | { | ||
750 | struct flush_kernel_vmap_range_args args; | ||
751 | |||
752 | args.vaddr = (unsigned long) vaddr; | ||
753 | args.size = size; | ||
754 | |||
755 | r4k_on_each_cpu(local_r4k_flush_kernel_vmap_range, &args); | ||
756 | } | ||
757 | |||
725 | static inline void rm7k_erratum31(void) | 758 | static inline void rm7k_erratum31(void) |
726 | { | 759 | { |
727 | const unsigned long ic_lsize = 32; | 760 | const unsigned long ic_lsize = 32; |
@@ -1403,6 +1436,8 @@ void __cpuinit r4k_cache_init(void) | |||
1403 | flush_cache_page = r4k_flush_cache_page; | 1436 | flush_cache_page = r4k_flush_cache_page; |
1404 | flush_cache_range = r4k_flush_cache_range; | 1437 | flush_cache_range = r4k_flush_cache_range; |
1405 | 1438 | ||
1439 | __flush_kernel_vmap_range = r4k_flush_kernel_vmap_range; | ||
1440 | |||
1406 | flush_cache_sigtramp = r4k_flush_cache_sigtramp; | 1441 | flush_cache_sigtramp = r4k_flush_cache_sigtramp; |
1407 | flush_icache_all = r4k_flush_icache_all; | 1442 | flush_icache_all = r4k_flush_icache_all; |
1408 | local_flush_data_cache_page = local_r4k_flush_data_cache_page; | 1443 | local_flush_data_cache_page = local_r4k_flush_data_cache_page; |