18beb8503SMichal Simek /* 246fb9be9SMichal Simek * Copyright (C) 2007-2009 Michal Simek <monstr@monstr.eu> 346fb9be9SMichal Simek * Copyright (C) 2007-2009 PetaLogix 48beb8503SMichal Simek * Copyright (C) 2007 John Williams <john.williams@petalogix.com> 58beb8503SMichal Simek * based on v850 version which was 68beb8503SMichal Simek * Copyright (C) 2001,02,03 NEC Electronics Corporation 78beb8503SMichal Simek * Copyright (C) 2001,02,03 Miles Bader <miles@gnu.org> 88beb8503SMichal Simek * 98beb8503SMichal Simek * This file is subject to the terms and conditions of the GNU General 108beb8503SMichal Simek * Public License. See the file COPYING in the main directory of this 118beb8503SMichal Simek * archive for more details. 128beb8503SMichal Simek * 138beb8503SMichal Simek */ 148beb8503SMichal Simek 158beb8503SMichal Simek #ifndef _ASM_MICROBLAZE_CACHEFLUSH_H 168beb8503SMichal Simek #define _ASM_MICROBLAZE_CACHEFLUSH_H 178beb8503SMichal Simek 188beb8503SMichal Simek /* Somebody depends on this; sigh... */ 198beb8503SMichal Simek #include <linux/mm.h> 208beb8503SMichal Simek 218beb8503SMichal Simek /* 228beb8503SMichal Simek * Cache handling functions. 238beb8503SMichal Simek * Microblaze has a write-through data cache, meaning that the data cache 248beb8503SMichal Simek * never needs to be flushed. The only flushing operations that are 258beb8503SMichal Simek * implemented are to invalidate the instruction cache. These are called 268beb8503SMichal Simek * after loading a user application into memory, we must invalidate the 278beb8503SMichal Simek * instruction cache to make sure we don't fetch old, bad code. 288beb8503SMichal Simek */ 298beb8503SMichal Simek 308beb8503SMichal Simek /* FIXME for LL-temac driver */ 318beb8503SMichal Simek #define invalidate_dcache_range(start, end) \ 328beb8503SMichal Simek __invalidate_dcache_range(start, end) 338beb8503SMichal Simek 348beb8503SMichal Simek #define flush_cache_all() __invalidate_cache_all() 358beb8503SMichal Simek #define flush_cache_mm(mm) do { } while (0) 368beb8503SMichal Simek #define flush_cache_range(vma, start, end) __invalidate_cache_all() 378beb8503SMichal Simek #define flush_cache_page(vma, vmaddr, pfn) do { } while (0) 388beb8503SMichal Simek 398beb8503SMichal Simek #define flush_dcache_range(start, end) __invalidate_dcache_range(start, end) 40*2d4dc890SIlya Loginov #define ARCH_IMPLEMENTS_FLUSH_DCACHE_PAGE 0 418beb8503SMichal Simek #define flush_dcache_page(page) do { } while (0) 428beb8503SMichal Simek #define flush_dcache_mmap_lock(mapping) do { } while (0) 438beb8503SMichal Simek #define flush_dcache_mmap_unlock(mapping) do { } while (0) 448beb8503SMichal Simek 458beb8503SMichal Simek #define flush_icache_range(start, len) __invalidate_icache_range(start, len) 468beb8503SMichal Simek #define flush_icache_page(vma, pg) do { } while (0) 478beb8503SMichal Simek 4846fb9be9SMichal Simek #ifndef CONFIG_MMU 4946fb9be9SMichal Simek # define flush_icache_user_range(start, len) do { } while (0) 5046fb9be9SMichal Simek #else 5146fb9be9SMichal Simek # define flush_icache_user_range(vma, pg, adr, len) __invalidate_icache_all() 5246fb9be9SMichal Simek 5346fb9be9SMichal Simek # define flush_page_to_ram(page) do { } while (0) 5446fb9be9SMichal Simek 5546fb9be9SMichal Simek # define flush_icache() __invalidate_icache_all() 5646fb9be9SMichal Simek # define flush_cache_sigtramp(vaddr) \ 5746fb9be9SMichal Simek __invalidate_icache_range(vaddr, vaddr + 8) 5846fb9be9SMichal Simek 5946fb9be9SMichal Simek # define flush_dcache_mmap_lock(mapping) do { } while (0) 6046fb9be9SMichal Simek # define flush_dcache_mmap_unlock(mapping) do { } while (0) 6146fb9be9SMichal Simek 6246fb9be9SMichal Simek # define flush_cache_dup_mm(mm) do { } while (0) 6346fb9be9SMichal Simek #endif 6446fb9be9SMichal Simek 658beb8503SMichal Simek #define flush_cache_vmap(start, end) do { } while (0) 668beb8503SMichal Simek #define flush_cache_vunmap(start, end) do { } while (0) 678beb8503SMichal Simek 688beb8503SMichal Simek struct page; 698beb8503SMichal Simek struct mm_struct; 708beb8503SMichal Simek struct vm_area_struct; 718beb8503SMichal Simek 728beb8503SMichal Simek /* see arch/microblaze/kernel/cache.c */ 738beb8503SMichal Simek extern void __invalidate_icache_all(void); 748beb8503SMichal Simek extern void __invalidate_icache_range(unsigned long start, unsigned long end); 758beb8503SMichal Simek extern void __invalidate_icache_page(struct vm_area_struct *vma, 768beb8503SMichal Simek struct page *page); 778beb8503SMichal Simek extern void __invalidate_icache_user_range(struct vm_area_struct *vma, 788beb8503SMichal Simek struct page *page, 798beb8503SMichal Simek unsigned long adr, int len); 808beb8503SMichal Simek extern void __invalidate_cache_sigtramp(unsigned long addr); 818beb8503SMichal Simek 828beb8503SMichal Simek extern void __invalidate_dcache_all(void); 838beb8503SMichal Simek extern void __invalidate_dcache_range(unsigned long start, unsigned long end); 848beb8503SMichal Simek extern void __invalidate_dcache_page(struct vm_area_struct *vma, 858beb8503SMichal Simek struct page *page); 868beb8503SMichal Simek extern void __invalidate_dcache_user_range(struct vm_area_struct *vma, 878beb8503SMichal Simek struct page *page, 888beb8503SMichal Simek unsigned long adr, int len); 898beb8503SMichal Simek 908beb8503SMichal Simek extern inline void __invalidate_cache_all(void) 918beb8503SMichal Simek { 928beb8503SMichal Simek __invalidate_icache_all(); 938beb8503SMichal Simek __invalidate_dcache_all(); 948beb8503SMichal Simek } 958beb8503SMichal Simek 968beb8503SMichal Simek #define copy_to_user_page(vma, page, vaddr, dst, src, len) \ 978beb8503SMichal Simek do { memcpy((dst), (src), (len)); \ 988beb8503SMichal Simek flush_icache_range((unsigned) (dst), (unsigned) (dst) + (len)); \ 998beb8503SMichal Simek } while (0) 1008beb8503SMichal Simek 1018beb8503SMichal Simek #define copy_from_user_page(vma, page, vaddr, dst, src, len) \ 1028beb8503SMichal Simek memcpy((dst), (src), (len)) 1038beb8503SMichal Simek 1048beb8503SMichal Simek #endif /* _ASM_MICROBLAZE_CACHEFLUSH_H */ 105