diff options
Diffstat (limited to 'include/asm-arm/cacheflush.h')
-rw-r--r-- | include/asm-arm/cacheflush.h | 34 |
1 files changed, 23 insertions, 11 deletions
diff --git a/include/asm-arm/cacheflush.h b/include/asm-arm/cacheflush.h index 759a97b56eed..e68a1cbcc852 100644 --- a/include/asm-arm/cacheflush.h +++ b/include/asm-arm/cacheflush.h | |||
@@ -95,11 +95,7 @@ | |||
95 | #endif | 95 | #endif |
96 | 96 | ||
97 | #if defined(CONFIG_CPU_FEROCEON) | 97 | #if defined(CONFIG_CPU_FEROCEON) |
98 | # ifdef _CACHE | 98 | # define MULTI_CACHE 1 |
99 | # define MULTI_CACHE 1 | ||
100 | # else | ||
101 | # define _CACHE feroceon | ||
102 | # endif | ||
103 | #endif | 99 | #endif |
104 | 100 | ||
105 | #if defined(CONFIG_CPU_V6) | 101 | #if defined(CONFIG_CPU_V6) |
@@ -410,6 +406,13 @@ extern void flush_dcache_page(struct page *); | |||
410 | 406 | ||
411 | extern void __flush_dcache_page(struct address_space *mapping, struct page *page); | 407 | extern void __flush_dcache_page(struct address_space *mapping, struct page *page); |
412 | 408 | ||
409 | static inline void __flush_icache_all(void) | ||
410 | { | ||
411 | asm("mcr p15, 0, %0, c7, c5, 0 @ invalidate I-cache\n" | ||
412 | : | ||
413 | : "r" (0)); | ||
414 | } | ||
415 | |||
413 | #define ARCH_HAS_FLUSH_ANON_PAGE | 416 | #define ARCH_HAS_FLUSH_ANON_PAGE |
414 | static inline void flush_anon_page(struct vm_area_struct *vma, | 417 | static inline void flush_anon_page(struct vm_area_struct *vma, |
415 | struct page *page, unsigned long vmaddr) | 418 | struct page *page, unsigned long vmaddr) |
@@ -421,9 +424,9 @@ static inline void flush_anon_page(struct vm_area_struct *vma, | |||
421 | } | 424 | } |
422 | 425 | ||
423 | #define flush_dcache_mmap_lock(mapping) \ | 426 | #define flush_dcache_mmap_lock(mapping) \ |
424 | write_lock_irq(&(mapping)->tree_lock) | 427 | spin_lock_irq(&(mapping)->tree_lock) |
425 | #define flush_dcache_mmap_unlock(mapping) \ | 428 | #define flush_dcache_mmap_unlock(mapping) \ |
426 | write_unlock_irq(&(mapping)->tree_lock) | 429 | spin_unlock_irq(&(mapping)->tree_lock) |
427 | 430 | ||
428 | #define flush_icache_user_range(vma,page,addr,len) \ | 431 | #define flush_icache_user_range(vma,page,addr,len) \ |
429 | flush_dcache_page(page) | 432 | flush_dcache_page(page) |
@@ -456,15 +459,19 @@ static inline void flush_ioremap_region(unsigned long phys, void __iomem *virt, | |||
456 | #define __cacheid_vivt_asid_tagged_instr(val) (__cacheid_type_v7(val) ? ((val & (3 << 14)) == (1 << 14)) : 0) | 459 | #define __cacheid_vivt_asid_tagged_instr(val) (__cacheid_type_v7(val) ? ((val & (3 << 14)) == (1 << 14)) : 0) |
457 | 460 | ||
458 | #if defined(CONFIG_CPU_CACHE_VIVT) && !defined(CONFIG_CPU_CACHE_VIPT) | 461 | #if defined(CONFIG_CPU_CACHE_VIVT) && !defined(CONFIG_CPU_CACHE_VIPT) |
459 | 462 | /* | |
463 | * VIVT caches only | ||
464 | */ | ||
460 | #define cache_is_vivt() 1 | 465 | #define cache_is_vivt() 1 |
461 | #define cache_is_vipt() 0 | 466 | #define cache_is_vipt() 0 |
462 | #define cache_is_vipt_nonaliasing() 0 | 467 | #define cache_is_vipt_nonaliasing() 0 |
463 | #define cache_is_vipt_aliasing() 0 | 468 | #define cache_is_vipt_aliasing() 0 |
464 | #define icache_is_vivt_asid_tagged() 0 | 469 | #define icache_is_vivt_asid_tagged() 0 |
465 | 470 | ||
466 | #elif defined(CONFIG_CPU_CACHE_VIPT) | 471 | #elif !defined(CONFIG_CPU_CACHE_VIVT) && defined(CONFIG_CPU_CACHE_VIPT) |
467 | 472 | /* | |
473 | * VIPT caches only | ||
474 | */ | ||
468 | #define cache_is_vivt() 0 | 475 | #define cache_is_vivt() 0 |
469 | #define cache_is_vipt() 1 | 476 | #define cache_is_vipt() 1 |
470 | #define cache_is_vipt_nonaliasing() \ | 477 | #define cache_is_vipt_nonaliasing() \ |
@@ -486,7 +493,12 @@ static inline void flush_ioremap_region(unsigned long phys, void __iomem *virt, | |||
486 | }) | 493 | }) |
487 | 494 | ||
488 | #else | 495 | #else |
489 | 496 | /* | |
497 | * VIVT or VIPT caches. Note that this is unreliable since ARM926 | ||
498 | * and V6 CPUs satisfy the "(val & (15 << 25)) == (14 << 25)" test. | ||
499 | * There's no way to tell from the CacheType register what type (!) | ||
500 | * the cache is. | ||
501 | */ | ||
490 | #define cache_is_vivt() \ | 502 | #define cache_is_vivt() \ |
491 | ({ \ | 503 | ({ \ |
492 | unsigned int __val = read_cpuid(CPUID_CACHETYPE); \ | 504 | unsigned int __val = read_cpuid(CPUID_CACHETYPE); \ |