cacheflush.h 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. /*
  2. * Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com)
  3. *
  4. * This program is free software; you can redistribute it and/or modify
  5. * it under the terms of the GNU General Public License version 2 as
  6. * published by the Free Software Foundation.
  7. *
  8. * vineetg: May 2011: for Non-aliasing VIPT D-cache following can be NOPs
  9. * -flush_cache_dup_mm (fork)
  10. * -likewise for flush_cache_mm (exit/execve)
  11. * -likewise for flush_cache_{range,page} (munmap, exit, COW-break)
  12. *
  13. * vineetg: April 2008
  14. * -Added a critical CacheLine flush to copy_to_user_page( ) which
  15. * was causing gdbserver to not setup breakpoints consistently
  16. */
  17. #ifndef _ASM_CACHEFLUSH_H
  18. #define _ASM_CACHEFLUSH_H
  19. #include <linux/mm.h>
  20. #include <asm/shmparam.h>
  21. /*
  22. * Semantically we need this because icache doesn't snoop dcache/dma.
  23. * However ARC Cache flush requires paddr as well as vaddr, latter not available
  24. * in the flush_icache_page() API. So we no-op it but do the equivalent work
  25. * in update_mmu_cache()
  26. */
  27. #define flush_icache_page(vma, page)
  28. void flush_cache_all(void);
  29. void flush_icache_range(unsigned long kstart, unsigned long kend);
  30. void __sync_icache_dcache(phys_addr_t paddr, unsigned long vaddr, int len);
  31. void __inv_icache_page(phys_addr_t paddr, unsigned long vaddr);
  32. void __flush_dcache_page(phys_addr_t paddr, unsigned long vaddr);
  33. #define ARCH_IMPLEMENTS_FLUSH_DCACHE_PAGE 1
  34. void flush_dcache_page(struct page *page);
  35. void dma_cache_wback_inv(unsigned long start, unsigned long sz);
  36. void dma_cache_inv(unsigned long start, unsigned long sz);
  37. void dma_cache_wback(unsigned long start, unsigned long sz);
  38. #define flush_dcache_mmap_lock(mapping) do { } while (0)
  39. #define flush_dcache_mmap_unlock(mapping) do { } while (0)
  40. /* TBD: optimize this */
  41. #define flush_cache_vmap(start, end) flush_cache_all()
  42. #define flush_cache_vunmap(start, end) flush_cache_all()
  43. #define flush_cache_dup_mm(mm) /* called on fork (VIVT only) */
  44. #ifndef CONFIG_ARC_CACHE_VIPT_ALIASING
  45. #define flush_cache_mm(mm) /* called on munmap/exit */
  46. #define flush_cache_range(mm, u_vstart, u_vend)
  47. #define flush_cache_page(vma, u_vaddr, pfn) /* PF handling/COW-break */
  48. #else /* VIPT aliasing dcache */
  49. /* To clear out stale userspace mappings */
  50. void flush_cache_mm(struct mm_struct *mm);
  51. void flush_cache_range(struct vm_area_struct *vma,
  52. unsigned long start,unsigned long end);
  53. void flush_cache_page(struct vm_area_struct *vma,
  54. unsigned long user_addr, unsigned long page);
  55. /*
  56. * To make sure that userspace mapping is flushed to memory before
  57. * get_user_pages() uses a kernel mapping to access the page
  58. */
  59. #define ARCH_HAS_FLUSH_ANON_PAGE
  60. void flush_anon_page(struct vm_area_struct *vma,
  61. struct page *page, unsigned long u_vaddr);
  62. #endif /* CONFIG_ARC_CACHE_VIPT_ALIASING */
  63. /*
  64. * A new pagecache page has PG_arch_1 clear - thus dcache dirty by default
  65. * This works around some PIO based drivers which don't call flush_dcache_page
  66. * to record that they dirtied the dcache
  67. */
  68. #define PG_dc_clean PG_arch_1
  69. #define CACHE_COLORS_NUM 4
  70. #define CACHE_COLORS_MSK (CACHE_COLORS_NUM - 1)
  71. #define CACHE_COLOR(addr) (((unsigned long)(addr) >> (PAGE_SHIFT)) & CACHE_COLORS_MSK)
  72. /*
  73. * Simple wrapper over config option
  74. * Bootup code ensures that hardware matches kernel configuration
  75. */
  76. static inline int cache_is_vipt_aliasing(void)
  77. {
  78. return IS_ENABLED(CONFIG_ARC_CACHE_VIPT_ALIASING);
  79. }
  80. /*
  81. * checks if two addresses (after page aligning) index into same cache set
  82. */
  83. #define addr_not_cache_congruent(addr1, addr2) \
  84. ({ \
  85. cache_is_vipt_aliasing() ? \
  86. (CACHE_COLOR(addr1) != CACHE_COLOR(addr2)) : 0; \
  87. })
  88. #define copy_to_user_page(vma, page, vaddr, dst, src, len) \
  89. do { \
  90. memcpy(dst, src, len); \
  91. if (vma->vm_flags & VM_EXEC) \
  92. __sync_icache_dcache((unsigned long)(dst), vaddr, len); \
  93. } while (0)
  94. #define copy_from_user_page(vma, page, vaddr, dst, src, len) \
  95. memcpy(dst, src, len); \
  96. #endif