diff options
| author | Greg KH <gregkh@suse.de> | 2005-09-09 17:26:01 -0400 |
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@suse.de> | 2005-09-09 17:26:01 -0400 |
| commit | 8ccc457722ba226ea72fca6f9ba3b54535d4749e (patch) | |
| tree | e323eda3b7ed55a5398751021e8031c1cae56f9d /arch/arm/mm/flush.c | |
| parent | 20dd026d7f5a6972dc78b4928a99620001fa547d (diff) | |
| parent | 5dce225bd9ea60e28e17076de63df0dee51b2883 (diff) | |
Merge gregkh@master.kernel.org:/pub/scm/linux/kernel/git/gregkh/driver-2.6
Diffstat (limited to 'arch/arm/mm/flush.c')
| -rw-r--r-- | arch/arm/mm/flush.c | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/arch/arm/mm/flush.c b/arch/arm/mm/flush.c index 191788fb18d1..b0208c992576 100644 --- a/arch/arm/mm/flush.c +++ b/arch/arm/mm/flush.c | |||
| @@ -16,6 +16,58 @@ | |||
| 16 | #include <asm/tlbflush.h> | 16 | #include <asm/tlbflush.h> |
| 17 | 17 | ||
| 18 | #ifdef CONFIG_CPU_CACHE_VIPT | 18 | #ifdef CONFIG_CPU_CACHE_VIPT |
| 19 | |||
| 20 | void flush_cache_mm(struct mm_struct *mm) | ||
| 21 | { | ||
| 22 | if (cache_is_vivt()) { | ||
| 23 | if (cpu_isset(smp_processor_id(), mm->cpu_vm_mask)) | ||
| 24 | __cpuc_flush_user_all(); | ||
| 25 | return; | ||
| 26 | } | ||
| 27 | |||
| 28 | if (cache_is_vipt_aliasing()) { | ||
| 29 | asm( "mcr p15, 0, %0, c7, c14, 0\n" | ||
| 30 | " mcr p15, 0, %0, c7, c5, 0\n" | ||
| 31 | " mcr p15, 0, %0, c7, c10, 4" | ||
| 32 | : | ||
| 33 | : "r" (0) | ||
| 34 | : "cc"); | ||
| 35 | } | ||
| 36 | } | ||
| 37 | |||
| 38 | void flush_cache_range(struct vm_area_struct *vma, unsigned long start, unsigned long end) | ||
| 39 | { | ||
| 40 | if (cache_is_vivt()) { | ||
| 41 | if (cpu_isset(smp_processor_id(), vma->vm_mm->cpu_vm_mask)) | ||
| 42 | __cpuc_flush_user_range(start & PAGE_MASK, PAGE_ALIGN(end), | ||
| 43 | vma->vm_flags); | ||
| 44 | return; | ||
| 45 | } | ||
| 46 | |||
| 47 | if (cache_is_vipt_aliasing()) { | ||
| 48 | asm( "mcr p15, 0, %0, c7, c14, 0\n" | ||
| 49 | " mcr p15, 0, %0, c7, c5, 0\n" | ||
| 50 | " mcr p15, 0, %0, c7, c10, 4" | ||
| 51 | : | ||
| 52 | : "r" (0) | ||
| 53 | : "cc"); | ||
| 54 | } | ||
| 55 | } | ||
| 56 | |||
| 57 | void flush_cache_page(struct vm_area_struct *vma, unsigned long user_addr, unsigned long pfn) | ||
| 58 | { | ||
| 59 | if (cache_is_vivt()) { | ||
| 60 | if (cpu_isset(smp_processor_id(), vma->vm_mm->cpu_vm_mask)) { | ||
| 61 | unsigned long addr = user_addr & PAGE_MASK; | ||
| 62 | __cpuc_flush_user_range(addr, addr + PAGE_SIZE, vma->vm_flags); | ||
| 63 | } | ||
| 64 | return; | ||
| 65 | } | ||
| 66 | |||
| 67 | if (cache_is_vipt_aliasing()) | ||
| 68 | flush_pfn_alias(pfn, user_addr); | ||
| 69 | } | ||
| 70 | |||
| 19 | #define ALIAS_FLUSH_START 0xffff4000 | 71 | #define ALIAS_FLUSH_START 0xffff4000 |
| 20 | 72 | ||
| 21 | #define TOP_PTE(x) pte_offset_kernel(top_pmd, x) | 73 | #define TOP_PTE(x) pte_offset_kernel(top_pmd, x) |
