2008-02-08 04:19:31 -08:00
/* MN10300 Cache flushing
*
* Copyright ( C ) 2007 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 Licence
* as published by the Free Software Foundation ; either version
* 2 of the Licence , or ( at your option ) any later version .
*/
# ifndef _ASM_CACHEFLUSH_H
# define _ASM_CACHEFLUSH_H
# ifndef __ASSEMBLY__
/* Keep includes the same across arches. */
# include <linux/mm.h>
/*
2010-10-27 17:28:43 +01:00
* Primitive routines
2008-02-08 04:19:31 -08:00
*/
2010-10-27 17:28:42 +01:00
# ifdef CONFIG_MN10300_CACHE_ENABLED
2010-10-27 17:28:45 +01:00
extern void mn10300_local_icache_inv ( void ) ;
extern void mn10300_local_icache_inv_page ( unsigned long start ) ;
extern void mn10300_local_icache_inv_range ( unsigned long start , unsigned long end ) ;
extern void mn10300_local_icache_inv_range2 ( unsigned long start , unsigned long size ) ;
extern void mn10300_local_dcache_inv ( void ) ;
extern void mn10300_local_dcache_inv_page ( unsigned long start ) ;
extern void mn10300_local_dcache_inv_range ( unsigned long start , unsigned long end ) ;
extern void mn10300_local_dcache_inv_range2 ( unsigned long start , unsigned long size ) ;
2008-02-08 04:19:31 -08:00
extern void mn10300_icache_inv ( void ) ;
2010-10-27 17:28:45 +01:00
extern void mn10300_icache_inv_page ( unsigned long start ) ;
extern void mn10300_icache_inv_range ( unsigned long start , unsigned long end ) ;
extern void mn10300_icache_inv_range2 ( unsigned long start , unsigned long size ) ;
2008-02-08 04:19:31 -08:00
extern void mn10300_dcache_inv ( void ) ;
2010-10-27 17:28:44 +01:00
extern void mn10300_dcache_inv_page ( unsigned long start ) ;
extern void mn10300_dcache_inv_range ( unsigned long start , unsigned long end ) ;
extern void mn10300_dcache_inv_range2 ( unsigned long start , unsigned long size ) ;
2008-02-08 04:19:31 -08:00
# ifdef CONFIG_MN10300_CACHE_WBACK
2010-10-27 17:28:45 +01:00
extern void mn10300_local_dcache_flush ( void ) ;
extern void mn10300_local_dcache_flush_page ( unsigned long start ) ;
extern void mn10300_local_dcache_flush_range ( unsigned long start , unsigned long end ) ;
extern void mn10300_local_dcache_flush_range2 ( unsigned long start , unsigned long size ) ;
extern void mn10300_local_dcache_flush_inv ( void ) ;
extern void mn10300_local_dcache_flush_inv_page ( unsigned long start ) ;
extern void mn10300_local_dcache_flush_inv_range ( unsigned long start , unsigned long end ) ;
extern void mn10300_local_dcache_flush_inv_range2 ( unsigned long start , unsigned long size ) ;
2008-02-08 04:19:31 -08:00
extern void mn10300_dcache_flush ( void ) ;
2010-10-27 17:28:44 +01:00
extern void mn10300_dcache_flush_page ( unsigned long start ) ;
extern void mn10300_dcache_flush_range ( unsigned long start , unsigned long end ) ;
extern void mn10300_dcache_flush_range2 ( unsigned long start , unsigned long size ) ;
2008-02-08 04:19:31 -08:00
extern void mn10300_dcache_flush_inv ( void ) ;
2010-10-27 17:28:44 +01:00
extern void mn10300_dcache_flush_inv_page ( unsigned long start ) ;
extern void mn10300_dcache_flush_inv_range ( unsigned long start , unsigned long end ) ;
extern void mn10300_dcache_flush_inv_range2 ( unsigned long start , unsigned long size ) ;
2008-02-08 04:19:31 -08:00
# else
2010-10-27 17:28:45 +01:00
# define mn10300_local_dcache_flush() do {} while (0)
# define mn10300_local_dcache_flush_page(start) do {} while (0)
# define mn10300_local_dcache_flush_range(start, end) do {} while (0)
# define mn10300_local_dcache_flush_range2(start, size) do {} while (0)
# define mn10300_local_dcache_flush_inv() \
mn10300_local_dcache_inv ( )
# define mn10300_local_dcache_flush_inv_page(start) \
mn10300_local_dcache_inv_page ( start )
# define mn10300_local_dcache_flush_inv_range(start, end) \
mn10300_local_dcache_inv_range ( start , end )
# define mn10300_local_dcache_flush_inv_range2(start, size) \
mn10300_local_dcache_inv_range2 ( start , size )
2008-02-08 04:19:31 -08:00
# define mn10300_dcache_flush() do {} while (0)
# define mn10300_dcache_flush_page(start) do {} while (0)
# define mn10300_dcache_flush_range(start, end) do {} while (0)
# define mn10300_dcache_flush_range2(start, size) do {} while (0)
# define mn10300_dcache_flush_inv() mn10300_dcache_inv()
# define mn10300_dcache_flush_inv_page(start) \
mn10300_dcache_inv_page ( ( start ) )
# define mn10300_dcache_flush_inv_range(start, end) \
mn10300_dcache_inv_range ( ( start ) , ( end ) )
# define mn10300_dcache_flush_inv_range2(start, size) \
mn10300_dcache_inv_range2 ( ( start ) , ( size ) )
# endif /* CONFIG_MN10300_CACHE_WBACK */
# else
2010-10-27 17:28:45 +01:00
# define mn10300_local_icache_inv() do {} while (0)
# define mn10300_local_icache_inv_page(start) do {} while (0)
# define mn10300_local_icache_inv_range(start, end) do {} while (0)
# define mn10300_local_icache_inv_range2(start, size) do {} while (0)
# define mn10300_local_dcache_inv() do {} while (0)
# define mn10300_local_dcache_inv_page(start) do {} while (0)
# define mn10300_local_dcache_inv_range(start, end) do {} while (0)
# define mn10300_local_dcache_inv_range2(start, size) do {} while (0)
# define mn10300_local_dcache_flush() do {} while (0)
# define mn10300_local_dcache_flush_inv_page(start) do {} while (0)
# define mn10300_local_dcache_flush_inv() do {} while (0)
# define mn10300_local_dcache_flush_inv_range(start, end)do {} while (0)
# define mn10300_local_dcache_flush_inv_range2(start, size) do {} while (0)
# define mn10300_local_dcache_flush_page(start) do {} while (0)
# define mn10300_local_dcache_flush_range(start, end) do {} while (0)
# define mn10300_local_dcache_flush_range2(start, size) do {} while (0)
2008-02-08 04:19:31 -08:00
# define mn10300_icache_inv() do {} while (0)
2010-10-27 17:28:45 +01:00
# define mn10300_icache_inv_page(start) do {} while (0)
# define mn10300_icache_inv_range(start, end) do {} while (0)
# define mn10300_icache_inv_range2(start, size) do {} while (0)
2008-02-08 04:19:31 -08:00
# define mn10300_dcache_inv() do {} while (0)
# define mn10300_dcache_inv_page(start) do {} while (0)
# define mn10300_dcache_inv_range(start, end) do {} while (0)
# define mn10300_dcache_inv_range2(start, size) do {} while (0)
# define mn10300_dcache_flush() do {} while (0)
# define mn10300_dcache_flush_inv_page(start) do {} while (0)
# define mn10300_dcache_flush_inv() do {} while (0)
# define mn10300_dcache_flush_inv_range(start, end) do {} while (0)
# define mn10300_dcache_flush_inv_range2(start, size) do {} while (0)
# define mn10300_dcache_flush_page(start) do {} while (0)
# define mn10300_dcache_flush_range(start, end) do {} while (0)
# define mn10300_dcache_flush_range2(start, size) do {} while (0)
2010-10-27 17:28:42 +01:00
# endif /* CONFIG_MN10300_CACHE_ENABLED */
2008-02-08 04:19:31 -08:00
/*
2010-10-27 17:28:43 +01:00
* Virtually - indexed cache management ( our cache is physically indexed )
*/
# define flush_cache_all() do {} while (0)
# define flush_cache_mm(mm) do {} while (0)
# define flush_cache_dup_mm(mm) do {} while (0)
# 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 ARCH_IMPLEMENTS_FLUSH_DCACHE_PAGE 0
# define flush_dcache_page(page) do {} while (0)
# define flush_dcache_mmap_lock(mapping) do {} while (0)
# define flush_dcache_mmap_unlock(mapping) do {} while (0)
/*
* Physically - indexed cache management
*/
2010-10-27 17:28:46 +01:00
# if defined(CONFIG_MN10300_CACHE_FLUSH_ICACHE)
extern void flush_icache_page ( struct vm_area_struct * vma , struct page * page ) ;
extern void flush_icache_range ( unsigned long start , unsigned long end ) ;
# elif defined(CONFIG_MN10300_CACHE_INV_ICACHE)
static inline void flush_icache_page ( struct vm_area_struct * vma ,
struct page * page )
{
mn10300_icache_inv_page ( page_to_phys ( page ) ) ;
}
2010-10-27 17:28:43 +01:00
extern void flush_icache_range ( unsigned long start , unsigned long end ) ;
# else
# define flush_icache_range(start, end) do {} while (0)
# define flush_icache_page(vma, pg) do {} while (0)
# endif
2010-10-27 17:28:46 +01:00
2010-10-27 17:28:43 +01:00
# define flush_icache_user_range(vma, pg, adr, len) \
flush_icache_range ( adr , adr + len )
# define copy_to_user_page(vma, page, vaddr, dst, src, len) \
do { \
memcpy ( dst , src , len ) ; \
flush_icache_page ( vma , page ) ; \
} while ( 0 )
# define copy_from_user_page(vma, page, vaddr, dst, src, len) \
memcpy ( dst , src , len )
/*
* Internal debugging function
2008-02-08 04:19:31 -08:00
*/
# ifdef CONFIG_DEBUG_PAGEALLOC
extern void kernel_map_pages ( struct page * page , int numpages , int enable ) ;
# endif
# endif /* __ASSEMBLY__ */
# endif /* _ASM_CACHEFLUSH_H */