diff options
author | James Bottomley <jejb@parisc-linux.org> | 2006-08-23 12:00:04 -0400 |
---|---|---|
committer | Matthew Wilcox <willy@parisc-linux.org> | 2006-10-04 08:46:21 -0400 |
commit | 20f4d3cb9b94ce3fec9a6135b9ad075b82b24f41 (patch) | |
tree | 995dec90d251e8e57abca8fea552d8ae5314a493 /include/asm-parisc/cacheflush.h | |
parent | e45da35e180a4fc91307648d021a598495742c32 (diff) |
[PARISC] parisc specific kmap API implementation for pa8800
This patch fixes the pa8800 at a gross level (there are still other
subtle incoherency issues which can still cause crashes and HPMCs).
What it does is try to force eject inequivalent aliases before they
become visible to the L2 cache (which is where we get the incoherence
problems).
A new function (parisc_requires_coherency) is introduced in
asm/processor.h to identify the pa8x00 processors (8800 and 8900)
which have the issue.
Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
Signed-off-by: Kyle McMartin <kyle@parisc-linux.org>
Diffstat (limited to 'include/asm-parisc/cacheflush.h')
-rw-r--r-- | include/asm-parisc/cacheflush.h | 30 |
1 files changed, 26 insertions, 4 deletions
diff --git a/include/asm-parisc/cacheflush.h b/include/asm-parisc/cacheflush.h index 0b459cdfbd6f..2bc41f2e0271 100644 --- a/include/asm-parisc/cacheflush.h +++ b/include/asm-parisc/cacheflush.h | |||
@@ -191,16 +191,38 @@ flush_anon_page(struct page *page, unsigned long vmaddr) | |||
191 | } | 191 | } |
192 | #define ARCH_HAS_FLUSH_ANON_PAGE | 192 | #define ARCH_HAS_FLUSH_ANON_PAGE |
193 | 193 | ||
194 | static inline void | 194 | #define ARCH_HAS_FLUSH_KERNEL_DCACHE_PAGE |
195 | flush_kernel_dcache_page(struct page *page) | 195 | void flush_kernel_dcache_page_addr(void *addr); |
196 | static inline void flush_kernel_dcache_page(struct page *page) | ||
196 | { | 197 | { |
197 | flush_kernel_dcache_page_asm(page_address(page)); | 198 | flush_kernel_dcache_page_addr(page_address(page)); |
198 | } | 199 | } |
199 | #define ARCH_HAS_FLUSH_KERNEL_DCACHE_PAGE | ||
200 | 200 | ||
201 | #ifdef CONFIG_DEBUG_RODATA | 201 | #ifdef CONFIG_DEBUG_RODATA |
202 | void mark_rodata_ro(void); | 202 | void mark_rodata_ro(void); |
203 | #endif | 203 | #endif |
204 | 204 | ||
205 | #ifdef CONFIG_PA8X00 | ||
206 | /* Only pa8800, pa8900 needs this */ | ||
207 | #define ARCH_HAS_KMAP | ||
208 | |||
209 | void kunmap_parisc(void *addr); | ||
210 | |||
211 | static inline void *kmap(struct page *page) | ||
212 | { | ||
213 | might_sleep(); | ||
214 | return page_address(page); | ||
215 | } | ||
216 | |||
217 | #define kunmap(page) kunmap_parisc(page_address(page)) | ||
218 | |||
219 | #define kmap_atomic(page, idx) page_address(page) | ||
220 | |||
221 | #define kunmap_atomic(addr, idx) kunmap_parisc(addr) | ||
222 | |||
223 | #define kmap_atomic_pfn(pfn, idx) page_address(pfn_to_page(pfn)) | ||
224 | #define kmap_atomic_to_page(ptr) virt_to_page(ptr) | ||
225 | #endif | ||
226 | |||
205 | #endif /* _PARISC_CACHEFLUSH_H */ | 227 | #endif /* _PARISC_CACHEFLUSH_H */ |
206 | 228 | ||