cacheflush.h 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. /*
  2. * Cache flush operations for the Hexagon architecture
  3. *
  4. * Copyright (c) 2010-2011, The Linux Foundation. All rights reserved.
  5. *
  6. * This program is free software; you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License version 2 and
  8. * only version 2 as published by the Free Software Foundation.
  9. *
  10. * This program is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. *
  15. * You should have received a copy of the GNU General Public License
  16. * along with this program; if not, write to the Free Software
  17. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
  18. * 02110-1301, USA.
  19. */
  20. #ifndef _ASM_CACHEFLUSH_H
  21. #define _ASM_CACHEFLUSH_H
  22. #include <linux/cache.h>
  23. #include <linux/mm.h>
  24. #include <asm/string.h>
  25. #include <asm-generic/cacheflush.h>
  26. /* Cache flushing:
  27. *
  28. * - flush_cache_all() flushes entire cache
  29. * - flush_cache_mm(mm) flushes the specified mm context's cache lines
  30. * - flush_cache_page(mm, vmaddr, pfn) flushes a single page
  31. * - flush_cache_range(vma, start, end) flushes a range of pages
  32. * - flush_icache_range(start, end) flush a range of instructions
  33. * - flush_dcache_page(pg) flushes(wback&invalidates) a page for dcache
  34. * - flush_icache_page(vma, pg) flushes(invalidates) a page for icache
  35. *
  36. * Need to doublecheck which one is really needed for ptrace stuff to work.
  37. */
  38. #define LINESIZE 32
  39. #define LINEBITS 5
  40. /*
  41. * Flush Dcache range through current map.
  42. */
  43. extern void flush_dcache_range(unsigned long start, unsigned long end);
  44. /*
  45. * Flush Icache range through current map.
  46. */
  47. #undef flush_icache_range
  48. extern void flush_icache_range(unsigned long start, unsigned long end);
  49. /*
  50. * Memory-management related flushes are there to ensure in non-physically
  51. * indexed cache schemes that stale lines belonging to a given ASID aren't
  52. * in the cache to confuse things. The prototype Hexagon Virtual Machine
  53. * only uses a single ASID for all user-mode maps, which should
  54. * mean that they aren't necessary. A brute-force, flush-everything
  55. * implementation, with the name xxxxx_hexagon() is present in
  56. * arch/hexagon/mm/cache.c, but let's not wire it up until we know
  57. * it is needed.
  58. */
  59. extern void flush_cache_all_hexagon(void);
  60. /*
  61. * This may or may not ever have to be non-null, depending on the
  62. * virtual machine MMU. For a native kernel, it's definitiely a no-op
  63. *
  64. * This is also the place where deferred cache coherency stuff seems
  65. * to happen, classically... but instead we do it like ia64 and
  66. * clean the cache when the PTE is set.
  67. *
  68. */
  69. static inline void update_mmu_cache(struct vm_area_struct *vma,
  70. unsigned long address, pte_t *ptep)
  71. {
  72. /* generic_ptrace_pokedata doesn't wind up here, does it? */
  73. }
  74. #undef copy_to_user_page
  75. static inline void copy_to_user_page(struct vm_area_struct *vma,
  76. struct page *page,
  77. unsigned long vaddr,
  78. void *dst, void *src, int len)
  79. {
  80. memcpy(dst, src, len);
  81. if (vma->vm_flags & VM_EXEC) {
  82. flush_icache_range((unsigned long) dst,
  83. (unsigned long) dst + len);
  84. }
  85. }
  86. extern void hexagon_inv_dcache_range(unsigned long start, unsigned long end);
  87. extern void hexagon_clean_dcache_range(unsigned long start, unsigned long end);
  88. #endif