home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / src / linux-headers-2.6.28-15 / arch / parisc / include / asm / cacheflush.h < prev    next >
Encoding:
C/C++ Source or Header  |  2008-12-24  |  3.7 KB  |  122 lines

  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 */
  10. void flush_data_cache_local(void *);  /* flushes local data-cache only */
  11. void flush_instruction_cache_local(void *); /* flushes local code-cache only */
  12. #ifdef CONFIG_SMP
  13. void flush_data_cache(void); /* flushes data-cache only (all processors) */
  14. void 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.  
  22. void flush_user_icache_range_asm(unsigned long, unsigned long);
  23. void flush_kernel_icache_range_asm(unsigned long, unsigned long);
  24. void flush_user_dcache_range_asm(unsigned long, unsigned long);
  25. void flush_kernel_dcache_range_asm(unsigned long, unsigned long);
  26. void flush_kernel_dcache_page_asm(void *);
  27. void flush_kernel_icache_page(void *);
  28. void flush_user_dcache_page(unsigned long);
  29. void flush_user_icache_page(unsigned long);
  30. void flush_user_dcache_range(unsigned long, unsigned long);
  31. void flush_user_icache_range(unsigned long, unsigned long);
  32.  
  33. /* Cache flush operations */
  34.  
  35. void flush_cache_all_local(void);
  36. void flush_cache_all(void);
  37. void 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.  
  45. extern 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) \
  63. do { \
  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) \
  70. do { \
  71.     flush_cache_page(vma, vaddr, page_to_pfn(page)); \
  72.     memcpy(dst, src, len); \
  73. } while (0)
  74.  
  75. void flush_cache_page(struct vm_area_struct *vma, unsigned long vmaddr, unsigned long pfn);
  76. void flush_cache_range(struct vm_area_struct *vma,
  77.         unsigned long start, unsigned long end);
  78.  
  79. #define ARCH_HAS_FLUSH_ANON_PAGE
  80. static inline void
  81. flush_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
  88. void flush_kernel_dcache_page_addr(void *addr);
  89. static 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
  95. void mark_rodata_ro(void);
  96. #endif
  97.  
  98. #ifdef CONFIG_PA8X00
  99. /* Only pa8800, pa8900 needs this */
  100. #define ARCH_HAS_KMAP
  101.  
  102. void kunmap_parisc(void *addr);
  103.  
  104. static inline void *kmap(struct page *page)
  105. {
  106.     might_sleep();
  107.     return page_address(page);
  108. }
  109.  
  110. #define kunmap(page)            kunmap_parisc(page_address(page))
  111.  
  112. #define kmap_atomic(page, idx)        page_address(page)
  113.  
  114. #define kunmap_atomic(addr, idx)    kunmap_parisc(addr)
  115.  
  116. #define kmap_atomic_pfn(pfn, idx)    page_address(pfn_to_page(pfn))
  117. #define kmap_atomic_to_page(ptr)    virt_to_page(ptr)
  118. #endif
  119.  
  120. #endif /* _PARISC_CACHEFLUSH_H */
  121.  
  122.