diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-03-17 13:11:25 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-03-17 13:11:25 -0400 |
commit | 7b7adc4a016a1decb806eb71ecab98721fa7f146 (patch) | |
tree | 0a6f9a6e5659faa94604fbc575382a18f143c657 /arch/unicore32/mm/flush.c | |
parent | 31598e8713ef501c8f6aad2e2ec8a9457e8877c1 (diff) | |
parent | 289d6b0e287e0acd85f3e6b7ea6c2cb5c234909a (diff) |
Merge branch 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/epip/linux-2.6-unicore32
* 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/epip/linux-2.6-unicore32: (40 commits)
unicore32: rewrite arch-specific tlb.h to use asm-generic version
unicore32: modify io_p2v and io_v2p macros, and adjust PKUNITY_mmio_BASEs
unicore32: replace unicore32-specific iomap functions with generic lib implementation
unicore32 machine related: add frame buffer driver for pkunity-v3 soc
unicore32 machine related files: add i2c bus drivers for pkunity-v3 soc
unicore32 io: redefine __REG(x) and re-use readl/writel funcs
unicore32 i8042 upgrade and bugfix: adjust resource request region type
unicore32 upgrade to v2.6.38-rc5: add one more paramter for pte_alloc_map call
unicore32 i8042: adjust io funcs of i8042-unicore32io.h
unicore32: rename PKUNITY_IOSPACE_BASE to PKUNITY_MMIO_BASE
unicore32: modify function names and parameters for irq_chips
unicore32: remove unused lines in arch/unicore32/include/asm/irq.h
unicore32 time.c: change calculate method for clock_event_device
unicore32: ADD MAINTAINER for unicore32 architecture
unicore32 machine related files: ps2 driver
unicore32 machine related files: pci bus handling
unicore32 machine related files: hardware registers
unicore32 machine related files: core files
unicore32 additional architecture files: boot process
unicore32 additional architecture files: low-level lib: misc
...
Acked-by: Arnd Bergmann <arnd@arndb.de>
Diffstat (limited to 'arch/unicore32/mm/flush.c')
-rw-r--r-- | arch/unicore32/mm/flush.c | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/arch/unicore32/mm/flush.c b/arch/unicore32/mm/flush.c new file mode 100644 index 00000000000..93478cc8b26 --- /dev/null +++ b/arch/unicore32/mm/flush.c | |||
@@ -0,0 +1,98 @@ | |||
1 | /* | ||
2 | * linux/arch/unicore32/mm/flush.c | ||
3 | * | ||
4 | * Code specific to PKUnity SoC and UniCore ISA | ||
5 | * | ||
6 | * Copyright (C) 2001-2010 GUAN Xue-tao | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License version 2 as | ||
10 | * published by the Free Software Foundation. | ||
11 | */ | ||
12 | #include <linux/module.h> | ||
13 | #include <linux/mm.h> | ||
14 | #include <linux/pagemap.h> | ||
15 | |||
16 | #include <asm/cacheflush.h> | ||
17 | #include <asm/system.h> | ||
18 | #include <asm/tlbflush.h> | ||
19 | |||
20 | void flush_cache_mm(struct mm_struct *mm) | ||
21 | { | ||
22 | } | ||
23 | |||
24 | void flush_cache_range(struct vm_area_struct *vma, unsigned long start, | ||
25 | unsigned long end) | ||
26 | { | ||
27 | if (vma->vm_flags & VM_EXEC) | ||
28 | __flush_icache_all(); | ||
29 | } | ||
30 | |||
31 | void flush_cache_page(struct vm_area_struct *vma, unsigned long user_addr, | ||
32 | unsigned long pfn) | ||
33 | { | ||
34 | } | ||
35 | |||
36 | static void flush_ptrace_access(struct vm_area_struct *vma, struct page *page, | ||
37 | unsigned long uaddr, void *kaddr, unsigned long len) | ||
38 | { | ||
39 | /* VIPT non-aliasing D-cache */ | ||
40 | if (vma->vm_flags & VM_EXEC) { | ||
41 | unsigned long addr = (unsigned long)kaddr; | ||
42 | |||
43 | __cpuc_coherent_kern_range(addr, addr + len); | ||
44 | } | ||
45 | } | ||
46 | |||
47 | /* | ||
48 | * Copy user data from/to a page which is mapped into a different | ||
49 | * processes address space. Really, we want to allow our "user | ||
50 | * space" model to handle this. | ||
51 | * | ||
52 | * Note that this code needs to run on the current CPU. | ||
53 | */ | ||
54 | void copy_to_user_page(struct vm_area_struct *vma, struct page *page, | ||
55 | unsigned long uaddr, void *dst, const void *src, | ||
56 | unsigned long len) | ||
57 | { | ||
58 | memcpy(dst, src, len); | ||
59 | flush_ptrace_access(vma, page, uaddr, dst, len); | ||
60 | } | ||
61 | |||
62 | void __flush_dcache_page(struct address_space *mapping, struct page *page) | ||
63 | { | ||
64 | /* | ||
65 | * Writeback any data associated with the kernel mapping of this | ||
66 | * page. This ensures that data in the physical page is mutually | ||
67 | * coherent with the kernels mapping. | ||
68 | */ | ||
69 | __cpuc_flush_kern_dcache_area(page_address(page), PAGE_SIZE); | ||
70 | } | ||
71 | |||
72 | /* | ||
73 | * Ensure cache coherency between kernel mapping and userspace mapping | ||
74 | * of this page. | ||
75 | */ | ||
76 | void flush_dcache_page(struct page *page) | ||
77 | { | ||
78 | struct address_space *mapping; | ||
79 | |||
80 | /* | ||
81 | * The zero page is never written to, so never has any dirty | ||
82 | * cache lines, and therefore never needs to be flushed. | ||
83 | */ | ||
84 | if (page == ZERO_PAGE(0)) | ||
85 | return; | ||
86 | |||
87 | mapping = page_mapping(page); | ||
88 | |||
89 | if (mapping && !mapping_mapped(mapping)) | ||
90 | clear_bit(PG_dcache_clean, &page->flags); | ||
91 | else { | ||
92 | __flush_dcache_page(mapping, page); | ||
93 | if (mapping) | ||
94 | __flush_icache_all(); | ||
95 | set_bit(PG_dcache_clean, &page->flags); | ||
96 | } | ||
97 | } | ||
98 | EXPORT_SYMBOL(flush_dcache_page); | ||