2005-04-17 02:20:36 +04:00
/* cacheflush.h: FRV cache flushing routines
*
* Copyright ( C ) 2004 Red Hat , Inc . All Rights Reserved .
* Written by David Howells ( dhowells @ redhat . com )
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation ; either version
* 2 of the License , or ( at your option ) any later version .
*/
# ifndef _ASM_CACHEFLUSH_H
# define _ASM_CACHEFLUSH_H
/* Keep includes the same across arches. */
# include <linux/mm.h>
/*
* virtually - indexed cache management ( our cache is physically indexed )
*/
# define flush_cache_all() do {} while(0)
# define flush_cache_mm(mm) do {} while(0)
2006-12-12 20:14:57 +03:00
# define flush_cache_dup_mm(mm) do {} while(0)
2005-04-17 02:20:36 +04:00
# define flush_cache_range(mm, start, end) do {} while(0)
# define flush_cache_page(vma, vmaddr, pfn) do {} while(0)
# define flush_cache_vmap(start, end) do {} while(0)
# define flush_cache_vunmap(start, end) do {} while(0)
# define flush_dcache_mmap_lock(mapping) do {} while(0)
# define flush_dcache_mmap_unlock(mapping) do {} while(0)
/*
2008-02-03 18:34:55 +03:00
* physically - indexed cache management
2005-04-17 02:20:36 +04:00
* - see arch / frv / lib / cache . S
*/
extern void frv_dcache_writeback ( unsigned long start , unsigned long size ) ;
extern void frv_cache_invalidate ( unsigned long start , unsigned long size ) ;
extern void frv_icache_invalidate ( unsigned long start , unsigned long size ) ;
extern void frv_cache_wback_inv ( unsigned long start , unsigned long size ) ;
static inline void __flush_cache_all ( void )
{
asm volatile ( " dcef @(gr0,gr0),#1 \n "
" icei @(gr0,gr0),#1 \n "
" membar \n "
: : : " memory "
) ;
}
/* dcache/icache coherency... */
2009-11-26 11:16:19 +03:00
# define ARCH_IMPLEMENTS_FLUSH_DCACHE_PAGE 1
2005-04-17 02:20:36 +04:00
# ifdef CONFIG_MMU
extern void flush_dcache_page ( struct page * page ) ;
# else
static inline void flush_dcache_page ( struct page * page )
{
unsigned long addr = page_to_phys ( page ) ;
frv_dcache_writeback ( addr , addr + PAGE_SIZE ) ;
}
# endif
static inline void flush_page_to_ram ( struct page * page )
{
flush_dcache_page ( page ) ;
}
static inline void flush_icache ( void )
{
__flush_cache_all ( ) ;
}
static inline void flush_icache_range ( unsigned long start , unsigned long end )
{
frv_cache_wback_inv ( start , end ) ;
}
# ifdef CONFIG_MMU
extern void flush_icache_user_range ( struct vm_area_struct * vma , struct page * page ,
unsigned long start , unsigned long len ) ;
# else
static inline void flush_icache_user_range ( struct vm_area_struct * vma , struct page * page ,
unsigned long start , unsigned long len )
{
frv_cache_wback_inv ( start , start + len ) ;
}
# endif
static inline void flush_icache_page ( struct vm_area_struct * vma , struct page * page )
{
flush_icache_user_range ( vma , page , page_to_phys ( page ) , PAGE_SIZE ) ;
}
2006-02-15 00:53:18 +03:00
/*
* permit ptrace to access another process ' s address space through the icache
* and the dcache
*/
# define copy_to_user_page(vma, page, vaddr, dst, src, len) \
do { \
memcpy ( ( dst ) , ( src ) , ( len ) ) ; \
flush_icache_user_range ( ( vma ) , ( page ) , ( vaddr ) , ( len ) ) ; \
} while ( 0 )
# define copy_from_user_page(vma, page, vaddr, dst, src, len) \
memcpy ( ( dst ) , ( src ) , ( len ) )
2005-04-17 02:20:36 +04:00
# endif /* _ASM_CACHEFLUSH_H */