cacheflush.h 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. #ifndef _PARISC_CACHEFLUSH_H
  3. #define _PARISC_CACHEFLUSH_H
  4. #include <linux/mm.h>
  5. #include <linux/uaccess.h>
  6. #include <asm/tlbflush.h>
  7. /* The usual comment is "Caches aren't brain-dead on the <architecture>".
  8. * Unfortunately, that doesn't apply to PA-RISC. */
  9. #include <linux/jump_label.h>
  10. DECLARE_STATIC_KEY_TRUE(parisc_has_cache);
  11. DECLARE_STATIC_KEY_TRUE(parisc_has_dcache);
  12. DECLARE_STATIC_KEY_TRUE(parisc_has_icache);
  13. #define flush_cache_dup_mm(mm) flush_cache_mm(mm)
  14. void flush_user_icache_range_asm(unsigned long, unsigned long);
  15. void flush_kernel_icache_range_asm(unsigned long, unsigned long);
  16. void flush_user_dcache_range_asm(unsigned long, unsigned long);
  17. void flush_kernel_dcache_range_asm(unsigned long, unsigned long);
  18. void purge_kernel_dcache_range_asm(unsigned long, unsigned long);
  19. void flush_kernel_dcache_page_asm(const void *addr);
  20. void flush_kernel_icache_page(void *);
  21. /* Cache flush operations */
  22. void flush_cache_all_local(void);
  23. void flush_cache_all(void);
  24. void flush_cache_mm(struct mm_struct *mm);
  25. #define flush_kernel_dcache_range(start,size) \
  26. flush_kernel_dcache_range_asm((start), (start)+(size));
  27. /* The only way to flush a vmap range is to flush whole cache */
  28. #define ARCH_IMPLEMENTS_FLUSH_KERNEL_VMAP_RANGE 1
  29. void flush_kernel_vmap_range(void *vaddr, int size);
  30. void invalidate_kernel_vmap_range(void *vaddr, int size);
  31. void flush_cache_vmap(unsigned long start, unsigned long end);
  32. #define flush_cache_vmap_early(start, end) do { } while (0)
  33. void flush_cache_vunmap(unsigned long start, unsigned long end);
  34. void flush_dcache_folio(struct folio *folio);
  35. #define flush_dcache_folio flush_dcache_folio
  36. #define ARCH_IMPLEMENTS_FLUSH_DCACHE_PAGE 1
  37. static inline void flush_dcache_page(struct page *page)
  38. {
  39. flush_dcache_folio(page_folio(page));
  40. }
  41. #define flush_dcache_mmap_lock(mapping) xa_lock_irq(&mapping->i_pages)
  42. #define flush_dcache_mmap_unlock(mapping) xa_unlock_irq(&mapping->i_pages)
  43. #define flush_dcache_mmap_lock_irqsave(mapping, flags) \
  44. xa_lock_irqsave(&mapping->i_pages, flags)
  45. #define flush_dcache_mmap_unlock_irqrestore(mapping, flags) \
  46. xa_unlock_irqrestore(&mapping->i_pages, flags)
  47. void flush_icache_pages(struct vm_area_struct *vma, struct page *page,
  48. unsigned int nr);
  49. #define flush_icache_pages flush_icache_pages
  50. #define flush_icache_range(s,e) do { \
  51. flush_kernel_dcache_range_asm(s,e); \
  52. flush_kernel_icache_range_asm(s,e); \
  53. } while (0)
  54. void copy_to_user_page(struct vm_area_struct *vma, struct page *page,
  55. unsigned long user_vaddr, void *dst, void *src, int len);
  56. void copy_from_user_page(struct vm_area_struct *vma, struct page *page,
  57. unsigned long user_vaddr, void *dst, void *src, int len);
  58. void flush_cache_page(struct vm_area_struct *vma, unsigned long vmaddr,
  59. unsigned long pfn);
  60. void flush_cache_range(struct vm_area_struct *vma,
  61. unsigned long start, unsigned long end);
  62. #define ARCH_HAS_FLUSH_ANON_PAGE
  63. void flush_anon_page(struct vm_area_struct *vma, struct page *page, unsigned long vmaddr);
  64. #define ARCH_HAS_FLUSH_ON_KUNMAP
  65. void kunmap_flush_on_unmap(const void *addr);
  66. #endif /* _PARISC_CACHEFLUSH_H */