2013-01-18 15:12:19 +05:30
/*
* Copyright ( C ) 2004 , 2007 - 2010 , 2011 - 2012 Synopsys , Inc . ( www . synopsys . com )
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation .
*
* vineetg : May 2011 : for Non - aliasing VIPT D - cache following can be NOPs
* - flush_cache_dup_mm ( fork )
* - likewise for flush_cache_mm ( exit / execve )
* - likewise for flush_cache_ { range , page } ( munmap , exit , COW - break )
*
* vineetg : April 2008
* - Added a critical CacheLine flush to copy_to_user_page ( ) which
* was causing gdbserver to not setup breakpoints consistently
*/
# ifndef _ASM_CACHEFLUSH_H
# define _ASM_CACHEFLUSH_H
# include <linux/mm.h>
2013-05-09 19:20:43 +05:30
# include <asm/shmparam.h>
2013-01-18 15:12:19 +05:30
2013-04-11 18:36:35 +05:30
/*
* Semantically we need this because icache doesn ' t snoop dcache / dma .
* However ARC Cache flush requires paddr as well as vaddr , latter not available
* in the flush_icache_page ( ) API . So we no - op it but do the equivalent work
* in update_mmu_cache ( )
*/
# define flush_icache_page(vma, page)
2013-01-18 15:12:19 +05:30
void flush_cache_all ( void ) ;
2015-09-14 18:43:42 -07:00
void flush_icache_range ( unsigned long kstart , unsigned long kend ) ;
void __sync_icache_dcache ( phys_addr_t paddr , unsigned long vaddr , int len ) ;
void __inv_icache_page ( phys_addr_t paddr , unsigned long vaddr ) ;
void __flush_dcache_page ( phys_addr_t paddr , unsigned long vaddr ) ;
2013-01-18 15:12:19 +05:30
# define ARCH_IMPLEMENTS_FLUSH_DCACHE_PAGE 1
void flush_dcache_page ( struct page * page ) ;
2016-03-16 15:04:39 +05:30
void dma_cache_wback_inv ( phys_addr_t start , unsigned long sz ) ;
void dma_cache_inv ( phys_addr_t start , unsigned long sz ) ;
void dma_cache_wback ( phys_addr_t start , unsigned long sz ) ;
2013-01-18 15:12:19 +05:30
# define flush_dcache_mmap_lock(mapping) do { } while (0)
# define flush_dcache_mmap_unlock(mapping) do { } while (0)
/* TBD: optimize this */
# define flush_cache_vmap(start, end) flush_cache_all()
# define flush_cache_vunmap(start, end) flush_cache_all()
2013-05-09 21:54:51 +05:30
# define flush_cache_dup_mm(mm) /* called on fork (VIVT only) */
# ifndef CONFIG_ARC_CACHE_VIPT_ALIASING
2013-01-18 15:12:19 +05:30
# define flush_cache_mm(mm) /* called on munmap/exit */
# define flush_cache_range(mm, u_vstart, u_vend)
# define flush_cache_page(vma, u_vaddr, pfn) /* PF handling/COW-break */
2013-05-09 21:54:51 +05:30
# else /* VIPT aliasing dcache */
/* To clear out stale userspace mappings */
void flush_cache_mm ( struct mm_struct * mm ) ;
void flush_cache_range ( struct vm_area_struct * vma ,
unsigned long start , unsigned long end ) ;
void flush_cache_page ( struct vm_area_struct * vma ,
unsigned long user_addr , unsigned long page ) ;
/*
* To make sure that userspace mapping is flushed to memory before
* get_user_pages ( ) uses a kernel mapping to access the page
*/
# define ARCH_HAS_FLUSH_ANON_PAGE
void flush_anon_page ( struct vm_area_struct * vma ,
struct page * page , unsigned long u_vaddr ) ;
# endif /* CONFIG_ARC_CACHE_VIPT_ALIASING */
2013-05-13 17:23:58 +05:30
/*
* A new pagecache page has PG_arch_1 clear - thus dcache dirty by default
* This works around some PIO based drivers which don ' t call flush_dcache_page
* to record that they dirtied the dcache
*/
# define PG_dc_clean PG_arch_1
2013-05-09 21:54:51 +05:30
/*
* Simple wrapper over config option
* Bootup code ensures that hardware matches kernel configuration
*/
static inline int cache_is_vipt_aliasing ( void )
{
2013-06-15 10:21:51 +05:30
return IS_ENABLED ( CONFIG_ARC_CACHE_VIPT_ALIASING ) ;
2013-05-09 21:54:51 +05:30
}
2013-05-19 14:06:44 +05:30
# define CACHE_COLOR(addr) (((unsigned long)(addr) >> (PAGE_SHIFT)) & 1)
2013-05-09 21:54:51 +05:30
/*
* checks if two addresses ( after page aligning ) index into same cache set
*/
# define addr_not_cache_congruent(addr1, addr2) \
2013-05-22 18:38:10 +05:30
( { \
2013-05-09 21:54:51 +05:30
cache_is_vipt_aliasing ( ) ? \
2013-05-22 18:38:10 +05:30
( CACHE_COLOR ( addr1 ) ! = CACHE_COLOR ( addr2 ) ) : 0 ; \
} )
2013-05-09 21:54:51 +05:30
2013-01-18 15:12:19 +05:30
# define copy_to_user_page(vma, page, vaddr, dst, src, len) \
do { \
memcpy ( dst , src , len ) ; \
if ( vma - > vm_flags & VM_EXEC ) \
2013-04-12 12:20:23 +05:30
__sync_icache_dcache ( ( unsigned long ) ( dst ) , vaddr , len ) ; \
2013-01-18 15:12:19 +05:30
} while ( 0 )
# define copy_from_user_page(vma, page, vaddr, dst, src, len) \
memcpy ( dst , src , len ) ; \
# endif