linux/arch/parisc/include/asm/cacheflush.h
<<
>>
Prefs
   1#ifndef _PARISC_CACHEFLUSH_H
   2#define _PARISC_CACHEFLUSH_H
   3
   4#include <linux/mm.h>
   5
   6/* The usual comment is "Caches aren't brain-dead on the <architecture>".
   7 * Unfortunately, that doesn't apply to PA-RISC. */
   8
   9/* Internal implementation */
  10void flush_data_cache_local(void *);  /* flushes local data-cache only */
  11void flush_instruction_cache_local(void *); /* flushes local code-cache only */
  12#ifdef CONFIG_SMP
  13void flush_data_cache(void); /* flushes data-cache only (all processors) */
  14void flush_instruction_cache(void); /* flushes i-cache only (all processors) */
  15#else
  16#define flush_data_cache() flush_data_cache_local(NULL)
  17#define flush_instruction_cache() flush_instruction_cache_local(NULL)
  18#endif
  19
  20#define flush_cache_dup_mm(mm) flush_cache_mm(mm)
  21
  22void flush_user_icache_range_asm(unsigned long, unsigned long);
  23void flush_kernel_icache_range_asm(unsigned long, unsigned long);
  24void flush_user_dcache_range_asm(unsigned long, unsigned long);
  25void flush_kernel_dcache_range_asm(unsigned long, unsigned long);
  26void flush_kernel_dcache_page_asm(void *);
  27void flush_kernel_icache_page(void *);
  28void flush_user_dcache_page(unsigned long);
  29void flush_user_icache_page(unsigned long);
  30void flush_user_dcache_range(unsigned long, unsigned long);
  31void flush_user_icache_range(unsigned long, unsigned long);
  32
  33/* Cache flush operations */
  34
  35void flush_cache_all_local(void);
  36void flush_cache_all(void);
  37void flush_cache_mm(struct mm_struct *mm);
  38
  39#define flush_kernel_dcache_range(start,size) \
  40        flush_kernel_dcache_range_asm((start), (start)+(size));
  41
  42#define flush_cache_vmap(start, end)            flush_cache_all()
  43#define flush_cache_vunmap(start, end)          flush_cache_all()
  44
  45extern void flush_dcache_page(struct page *page);
  46
  47#define flush_dcache_mmap_lock(mapping) \
  48        spin_lock_irq(&(mapping)->tree_lock)
  49#define flush_dcache_mmap_unlock(mapping) \
  50        spin_unlock_irq(&(mapping)->tree_lock)
  51
  52#define flush_icache_page(vma,page)     do {            \
  53        flush_kernel_dcache_page(page);                 \
  54        flush_kernel_icache_page(page_address(page));   \
  55} while (0)
  56
  57#define flush_icache_range(s,e)         do {            \
  58        flush_kernel_dcache_range_asm(s,e);             \
  59        flush_kernel_icache_range_asm(s,e);             \
  60} while (0)
  61
  62#define copy_to_user_page(vma, page, vaddr, dst, src, len) \
  63do { \
  64        flush_cache_page(vma, vaddr, page_to_pfn(page)); \
  65        memcpy(dst, src, len); \
  66        flush_kernel_dcache_range_asm((unsigned long)dst, (unsigned long)dst + len); \
  67} while (0)
  68
  69#define copy_from_user_page(vma, page, vaddr, dst, src, len) \
  70do { \
  71        flush_cache_page(vma, vaddr, page_to_pfn(page)); \
  72        memcpy(dst, src, len); \
  73} while (0)
  74
  75void flush_cache_page(struct vm_area_struct *vma, unsigned long vmaddr, unsigned long pfn);
  76void flush_cache_range(struct vm_area_struct *vma,
  77                unsigned long start, unsigned long end);
  78
  79#define ARCH_HAS_FLUSH_ANON_PAGE
  80static inline void
  81flush_anon_page(struct vm_area_struct *vma, struct page *page, unsigned long vmaddr)
  82{
  83        if (PageAnon(page))
  84                flush_user_dcache_page(vmaddr);
  85}
  86
  87#define ARCH_HAS_FLUSH_KERNEL_DCACHE_PAGE
  88void flush_kernel_dcache_page_addr(void *addr);
  89static inline void flush_kernel_dcache_page(struct page *page)
  90{
  91        flush_kernel_dcache_page_addr(page_address(page));
  92}
  93
  94#ifdef CONFIG_DEBUG_RODATA
  95void mark_rodata_ro(void);
  96#endif
  97
  98#ifdef CONFIG_PA8X00
  99/* Only pa8800, pa8900 needs this */
 100
 101#include <asm/kmap_types.h>
 102
 103#define ARCH_HAS_KMAP
 104
 105void kunmap_parisc(void *addr);
 106
 107static inline void *kmap(struct page *page)
 108{
 109        might_sleep();
 110        return page_address(page);
 111}
 112
 113#define kunmap(page)                    kunmap_parisc(page_address(page))
 114
 115#define kmap_atomic(page, idx)          page_address(page)
 116
 117#define kunmap_atomic(addr, idx)        kunmap_parisc(addr)
 118
 119#define kmap_atomic_pfn(pfn, idx)       page_address(pfn_to_page(pfn))
 120#define kmap_atomic_to_page(ptr)        virt_to_page(ptr)
 121#endif
 122
 123#endif /* _PARISC_CACHEFLUSH_H */
 124
 125