FRV: fix the extern declaration of kallsyms_num_syms
[linux-2.6/btrfs-unstable.git] / arch / sh64 / mm / cache.c
blob421487cfff4cb77a30ca570b142f281ac6e51218
1 /*
2 * This file is subject to the terms and conditions of the GNU General Public
3 * License. See the file "COPYING" in the main directory of this archive
4 * for more details.
6 * arch/sh64/mm/cache.c
8 * Original version Copyright (C) 2000, 2001 Paolo Alberelli
9 * Second version Copyright (C) benedict.gaster@superh.com 2002
10 * Third version Copyright Richard.Curnow@superh.com 2003
11 * Hacks to third version Copyright (C) 2003 Paul Mundt
14 /****************************************************************************/
16 #include <linux/init.h>
17 #include <linux/mman.h>
18 #include <linux/mm.h>
19 #include <linux/threads.h>
20 #include <asm/page.h>
21 #include <asm/pgtable.h>
22 #include <asm/processor.h>
23 #include <asm/cache.h>
24 #include <asm/tlb.h>
25 #include <asm/io.h>
26 #include <asm/uaccess.h>
27 #include <asm/mmu_context.h>
28 #include <asm/pgalloc.h> /* for flush_itlb_range */
30 #include <linux/proc_fs.h>
32 /* This function is in entry.S */
33 extern unsigned long switch_and_save_asid(unsigned long new_asid);
35 /* Wired TLB entry for the D-cache */
36 static unsigned long long dtlb_cache_slot;
38 /**
39 * sh64_cache_init()
41 * This is pretty much just a straightforward clone of the SH
42 * detect_cpu_and_cache_system().
44 * This function is responsible for setting up all of the cache
45 * info dynamically as well as taking care of CPU probing and
46 * setting up the relevant subtype data.
48 * FIXME: For the time being, we only really support the SH5-101
49 * out of the box, and don't support dynamic probing for things
50 * like the SH5-103 or even cut2 of the SH5-101. Implement this
51 * later!
53 int __init sh64_cache_init(void)
56 * First, setup some sane values for the I-cache.
58 cpu_data->icache.ways = 4;
59 cpu_data->icache.sets = 256;
60 cpu_data->icache.linesz = L1_CACHE_BYTES;
63 * FIXME: This can probably be cleaned up a bit as well.. for example,
64 * do we really need the way shift _and_ the way_step_shift ?? Judging
65 * by the existing code, I would guess no.. is there any valid reason
66 * why we need to be tracking this around?
68 cpu_data->icache.way_shift = 13;
69 cpu_data->icache.entry_shift = 5;
70 cpu_data->icache.set_shift = 4;
71 cpu_data->icache.way_step_shift = 16;
72 cpu_data->icache.asid_shift = 2;
75 * way offset = cache size / associativity, so just don't factor in
76 * associativity in the first place..
78 cpu_data->icache.way_ofs = cpu_data->icache.sets *
79 cpu_data->icache.linesz;
81 cpu_data->icache.asid_mask = 0x3fc;
82 cpu_data->icache.idx_mask = 0x1fe0;
83 cpu_data->icache.epn_mask = 0xffffe000;
84 cpu_data->icache.flags = 0;
87 * Next, setup some sane values for the D-cache.
89 * On the SH5, these are pretty consistent with the I-cache settings,
90 * so we just copy over the existing definitions.. these can be fixed
91 * up later, especially if we add runtime CPU probing.
93 * Though in the meantime it saves us from having to duplicate all of
94 * the above definitions..
96 cpu_data->dcache = cpu_data->icache;
99 * Setup any cache-related flags here
101 #if defined(CONFIG_DCACHE_WRITE_THROUGH)
102 set_bit(SH_CACHE_MODE_WT, &(cpu_data->dcache.flags));
103 #elif defined(CONFIG_DCACHE_WRITE_BACK)
104 set_bit(SH_CACHE_MODE_WB, &(cpu_data->dcache.flags));
105 #endif
108 * We also need to reserve a slot for the D-cache in the DTLB, so we
109 * do this now ..
111 dtlb_cache_slot = sh64_get_wired_dtlb_entry();
113 return 0;
116 #ifdef CONFIG_DCACHE_DISABLED
117 #define sh64_dcache_purge_all() do { } while (0)
118 #define sh64_dcache_purge_coloured_phy_page(paddr, eaddr) do { } while (0)
119 #define sh64_dcache_purge_user_range(mm, start, end) do { } while (0)
120 #define sh64_dcache_purge_phy_page(paddr) do { } while (0)
121 #define sh64_dcache_purge_virt_page(mm, eaddr) do { } while (0)
122 #define sh64_dcache_purge_kernel_range(start, end) do { } while (0)
123 #define sh64_dcache_wback_current_user_range(start, end) do { } while (0)
124 #endif
126 /*##########################################################################*/
128 /* From here onwards, a rewrite of the implementation,
129 by Richard.Curnow@superh.com.
131 The major changes in this compared to the old version are;
132 1. use more selective purging through OCBP instead of using ALLOCO to purge
133 by natural replacement. This avoids purging out unrelated cache lines
134 that happen to be in the same set.
135 2. exploit the APIs copy_user_page and clear_user_page better
136 3. be more selective about I-cache purging, in particular use invalidate_all
137 more sparingly.
141 /*##########################################################################
142 SUPPORT FUNCTIONS
143 ##########################################################################*/
145 /****************************************************************************/
146 /* The following group of functions deal with mapping and unmapping a temporary
147 page into the DTLB slot that have been set aside for our exclusive use. */
148 /* In order to accomplish this, we use the generic interface for adding and
149 removing a wired slot entry as defined in arch/sh64/mm/tlb.c */
150 /****************************************************************************/
152 static unsigned long slot_own_flags;
154 static inline void sh64_setup_dtlb_cache_slot(unsigned long eaddr, unsigned long asid, unsigned long paddr)
156 local_irq_save(slot_own_flags);
157 sh64_setup_tlb_slot(dtlb_cache_slot, eaddr, asid, paddr);
160 static inline void sh64_teardown_dtlb_cache_slot(void)
162 sh64_teardown_tlb_slot(dtlb_cache_slot);
163 local_irq_restore(slot_own_flags);
166 /****************************************************************************/
168 #ifndef CONFIG_ICACHE_DISABLED
170 static void __inline__ sh64_icache_inv_all(void)
172 unsigned long long addr, flag, data;
173 unsigned int flags;
175 addr=ICCR0;
176 flag=ICCR0_ICI;
177 data=0;
179 /* Make this a critical section for safety (probably not strictly necessary.) */
180 local_irq_save(flags);
182 /* Without %1 it gets unexplicably wrong */
183 asm volatile("getcfg %3, 0, %0\n\t"
184 "or %0, %2, %0\n\t"
185 "putcfg %3, 0, %0\n\t"
186 "synci"
187 : "=&r" (data)
188 : "0" (data), "r" (flag), "r" (addr));
190 local_irq_restore(flags);
193 static void sh64_icache_inv_kernel_range(unsigned long start, unsigned long end)
195 /* Invalidate range of addresses [start,end] from the I-cache, where
196 * the addresses lie in the kernel superpage. */
198 unsigned long long ullend, addr, aligned_start;
199 #if (NEFF == 32)
200 aligned_start = (unsigned long long)(signed long long)(signed long) start;
201 #else
202 #error "NEFF != 32"
203 #endif
204 aligned_start &= L1_CACHE_ALIGN_MASK;
205 addr = aligned_start;
206 #if (NEFF == 32)
207 ullend = (unsigned long long) (signed long long) (signed long) end;
208 #else
209 #error "NEFF != 32"
210 #endif
211 while (addr <= ullend) {
212 asm __volatile__ ("icbi %0, 0" : : "r" (addr));
213 addr += L1_CACHE_BYTES;
217 static void sh64_icache_inv_user_page(struct vm_area_struct *vma, unsigned long eaddr)
219 /* If we get called, we know that vma->vm_flags contains VM_EXEC.
220 Also, eaddr is page-aligned. */
222 unsigned long long addr, end_addr;
223 unsigned long flags = 0;
224 unsigned long running_asid, vma_asid;
225 addr = eaddr;
226 end_addr = addr + PAGE_SIZE;
228 /* Check whether we can use the current ASID for the I-cache
229 invalidation. For example, if we're called via
230 access_process_vm->flush_cache_page->here, (e.g. when reading from
231 /proc), 'running_asid' will be that of the reader, not of the
232 victim.
234 Also, note the risk that we might get pre-empted between the ASID
235 compare and blocking IRQs, and before we regain control, the
236 pid->ASID mapping changes. However, the whole cache will get
237 invalidated when the mapping is renewed, so the worst that can
238 happen is that the loop below ends up invalidating somebody else's
239 cache entries.
242 running_asid = get_asid();
243 vma_asid = (vma->vm_mm->context & MMU_CONTEXT_ASID_MASK);
244 if (running_asid != vma_asid) {
245 local_irq_save(flags);
246 switch_and_save_asid(vma_asid);
248 while (addr < end_addr) {
249 /* Worth unrolling a little */
250 asm __volatile__("icbi %0, 0" : : "r" (addr));
251 asm __volatile__("icbi %0, 32" : : "r" (addr));
252 asm __volatile__("icbi %0, 64" : : "r" (addr));
253 asm __volatile__("icbi %0, 96" : : "r" (addr));
254 addr += 128;
256 if (running_asid != vma_asid) {
257 switch_and_save_asid(running_asid);
258 local_irq_restore(flags);
262 /****************************************************************************/
264 static void sh64_icache_inv_user_page_range(struct mm_struct *mm,
265 unsigned long start, unsigned long end)
267 /* Used for invalidating big chunks of I-cache, i.e. assume the range
268 is whole pages. If 'start' or 'end' is not page aligned, the code
269 is conservative and invalidates to the ends of the enclosing pages.
270 This is functionally OK, just a performance loss. */
272 /* See the comments below in sh64_dcache_purge_user_range() regarding
273 the choice of algorithm. However, for the I-cache option (2) isn't
274 available because there are no physical tags so aliases can't be
275 resolved. The icbi instruction has to be used through the user
276 mapping. Because icbi is cheaper than ocbp on a cache hit, it
277 would be cheaper to use the selective code for a large range than is
278 possible with the D-cache. Just assume 64 for now as a working
279 figure.
282 int n_pages;
284 if (!mm) return;
286 n_pages = ((end - start) >> PAGE_SHIFT);
287 if (n_pages >= 64) {
288 sh64_icache_inv_all();
289 } else {
290 unsigned long aligned_start;
291 unsigned long eaddr;
292 unsigned long after_last_page_start;
293 unsigned long mm_asid, current_asid;
294 unsigned long long flags = 0ULL;
296 mm_asid = mm->context & MMU_CONTEXT_ASID_MASK;
297 current_asid = get_asid();
299 if (mm_asid != current_asid) {
300 /* Switch ASID and run the invalidate loop under cli */
301 local_irq_save(flags);
302 switch_and_save_asid(mm_asid);
305 aligned_start = start & PAGE_MASK;
306 after_last_page_start = PAGE_SIZE + ((end - 1) & PAGE_MASK);
308 while (aligned_start < after_last_page_start) {
309 struct vm_area_struct *vma;
310 unsigned long vma_end;
311 vma = find_vma(mm, aligned_start);
312 if (!vma || (aligned_start <= vma->vm_end)) {
313 /* Avoid getting stuck in an error condition */
314 aligned_start += PAGE_SIZE;
315 continue;
317 vma_end = vma->vm_end;
318 if (vma->vm_flags & VM_EXEC) {
319 /* Executable */
320 eaddr = aligned_start;
321 while (eaddr < vma_end) {
322 sh64_icache_inv_user_page(vma, eaddr);
323 eaddr += PAGE_SIZE;
326 aligned_start = vma->vm_end; /* Skip to start of next region */
328 if (mm_asid != current_asid) {
329 switch_and_save_asid(current_asid);
330 local_irq_restore(flags);
335 static void sh64_icache_inv_user_small_range(struct mm_struct *mm,
336 unsigned long start, int len)
339 /* Invalidate a small range of user context I-cache, not necessarily
340 page (or even cache-line) aligned. */
342 unsigned long long eaddr = start;
343 unsigned long long eaddr_end = start + len;
344 unsigned long current_asid, mm_asid;
345 unsigned long long flags;
346 unsigned long long epage_start;
348 /* Since this is used inside ptrace, the ASID in the mm context
349 typically won't match current_asid. We'll have to switch ASID to do
350 this. For safety, and given that the range will be small, do all
351 this under cli.
353 Note, there is a hazard that the ASID in mm->context is no longer
354 actually associated with mm, i.e. if the mm->context has started a
355 new cycle since mm was last active. However, this is just a
356 performance issue: all that happens is that we invalidate lines
357 belonging to another mm, so the owning process has to refill them
358 when that mm goes live again. mm itself can't have any cache
359 entries because there will have been a flush_cache_all when the new
360 mm->context cycle started. */
362 /* Align to start of cache line. Otherwise, suppose len==8 and start
363 was at 32N+28 : the last 4 bytes wouldn't get invalidated. */
364 eaddr = start & L1_CACHE_ALIGN_MASK;
365 eaddr_end = start + len;
367 local_irq_save(flags);
368 mm_asid = mm->context & MMU_CONTEXT_ASID_MASK;
369 current_asid = switch_and_save_asid(mm_asid);
371 epage_start = eaddr & PAGE_MASK;
373 while (eaddr < eaddr_end)
375 asm __volatile__("icbi %0, 0" : : "r" (eaddr));
376 eaddr += L1_CACHE_BYTES;
378 switch_and_save_asid(current_asid);
379 local_irq_restore(flags);
382 static void sh64_icache_inv_current_user_range(unsigned long start, unsigned long end)
384 /* The icbi instruction never raises ITLBMISS. i.e. if there's not a
385 cache hit on the virtual tag the instruction ends there, without a
386 TLB lookup. */
388 unsigned long long aligned_start;
389 unsigned long long ull_end;
390 unsigned long long addr;
392 ull_end = end;
394 /* Just invalidate over the range using the natural addresses. TLB
395 miss handling will be OK (TBC). Since it's for the current process,
396 either we're already in the right ASID context, or the ASIDs have
397 been recycled since we were last active in which case we might just
398 invalidate another processes I-cache entries : no worries, just a
399 performance drop for him. */
400 aligned_start = start & L1_CACHE_ALIGN_MASK;
401 addr = aligned_start;
402 while (addr < ull_end) {
403 asm __volatile__ ("icbi %0, 0" : : "r" (addr));
404 asm __volatile__ ("nop");
405 asm __volatile__ ("nop");
406 addr += L1_CACHE_BYTES;
410 #endif /* !CONFIG_ICACHE_DISABLED */
412 /****************************************************************************/
414 #ifndef CONFIG_DCACHE_DISABLED
416 /* Buffer used as the target of alloco instructions to purge data from cache
417 sets by natural eviction. -- RPC */
418 #define DUMMY_ALLOCO_AREA_SIZE L1_CACHE_SIZE_BYTES + (1024 * 4)
419 static unsigned char dummy_alloco_area[DUMMY_ALLOCO_AREA_SIZE] __cacheline_aligned = { 0, };
421 /****************************************************************************/
423 static void __inline__ sh64_dcache_purge_sets(int sets_to_purge_base, int n_sets)
425 /* Purge all ways in a particular block of sets, specified by the base
426 set number and number of sets. Can handle wrap-around, if that's
427 needed. */
429 int dummy_buffer_base_set;
430 unsigned long long eaddr, eaddr0, eaddr1;
431 int j;
432 int set_offset;
434 dummy_buffer_base_set = ((int)&dummy_alloco_area & cpu_data->dcache.idx_mask) >> cpu_data->dcache.entry_shift;
435 set_offset = sets_to_purge_base - dummy_buffer_base_set;
437 for (j=0; j<n_sets; j++, set_offset++) {
438 set_offset &= (cpu_data->dcache.sets - 1);
439 eaddr0 = (unsigned long long)dummy_alloco_area + (set_offset << cpu_data->dcache.entry_shift);
441 /* Do one alloco which hits the required set per cache way. For
442 write-back mode, this will purge the #ways resident lines. There's
443 little point unrolling this loop because the allocos stall more if
444 they're too close together. */
445 eaddr1 = eaddr0 + cpu_data->dcache.way_ofs * cpu_data->dcache.ways;
446 for (eaddr=eaddr0; eaddr<eaddr1; eaddr+=cpu_data->dcache.way_ofs) {
447 asm __volatile__ ("alloco %0, 0" : : "r" (eaddr));
448 asm __volatile__ ("synco"); /* TAKum03020 */
451 eaddr1 = eaddr0 + cpu_data->dcache.way_ofs * cpu_data->dcache.ways;
452 for (eaddr=eaddr0; eaddr<eaddr1; eaddr+=cpu_data->dcache.way_ofs) {
453 /* Load from each address. Required because alloco is a NOP if
454 the cache is write-through. Write-through is a config option. */
455 if (test_bit(SH_CACHE_MODE_WT, &(cpu_data->dcache.flags)))
456 *(volatile unsigned char *)(int)eaddr;
460 /* Don't use OCBI to invalidate the lines. That costs cycles directly.
461 If the dummy block is just left resident, it will naturally get
462 evicted as required. */
464 return;
467 /****************************************************************************/
469 static void sh64_dcache_purge_all(void)
471 /* Purge the entire contents of the dcache. The most efficient way to
472 achieve this is to use alloco instructions on a region of unused
473 memory equal in size to the cache, thereby causing the current
474 contents to be discarded by natural eviction. The alternative,
475 namely reading every tag, setting up a mapping for the corresponding
476 page and doing an OCBP for the line, would be much more expensive.
479 sh64_dcache_purge_sets(0, cpu_data->dcache.sets);
481 return;
485 /****************************************************************************/
487 static void sh64_dcache_purge_kernel_range(unsigned long start, unsigned long end)
489 /* Purge the range of addresses [start,end] from the D-cache. The
490 addresses lie in the superpage mapping. There's no harm if we
491 overpurge at either end - just a small performance loss. */
492 unsigned long long ullend, addr, aligned_start;
493 #if (NEFF == 32)
494 aligned_start = (unsigned long long)(signed long long)(signed long) start;
495 #else
496 #error "NEFF != 32"
497 #endif
498 aligned_start &= L1_CACHE_ALIGN_MASK;
499 addr = aligned_start;
500 #if (NEFF == 32)
501 ullend = (unsigned long long) (signed long long) (signed long) end;
502 #else
503 #error "NEFF != 32"
504 #endif
505 while (addr <= ullend) {
506 asm __volatile__ ("ocbp %0, 0" : : "r" (addr));
507 addr += L1_CACHE_BYTES;
509 return;
512 /* Assumes this address (+ (2**n_synbits) pages up from it) aren't used for
513 anything else in the kernel */
514 #define MAGIC_PAGE0_START 0xffffffffec000000ULL
516 static void sh64_dcache_purge_coloured_phy_page(unsigned long paddr, unsigned long eaddr)
518 /* Purge the physical page 'paddr' from the cache. It's known that any
519 cache lines requiring attention have the same page colour as the the
520 address 'eaddr'.
522 This relies on the fact that the D-cache matches on physical tags
523 when no virtual tag matches. So we create an alias for the original
524 page and purge through that. (Alternatively, we could have done
525 this by switching ASID to match the original mapping and purged
526 through that, but that involves ASID switching cost + probably a
527 TLBMISS + refill anyway.)
530 unsigned long long magic_page_start;
531 unsigned long long magic_eaddr, magic_eaddr_end;
533 magic_page_start = MAGIC_PAGE0_START + (eaddr & CACHE_OC_SYN_MASK);
535 /* As long as the kernel is not pre-emptible, this doesn't need to be
536 under cli/sti. */
538 sh64_setup_dtlb_cache_slot(magic_page_start, get_asid(), paddr);
540 magic_eaddr = magic_page_start;
541 magic_eaddr_end = magic_eaddr + PAGE_SIZE;
542 while (magic_eaddr < magic_eaddr_end) {
543 /* Little point in unrolling this loop - the OCBPs are blocking
544 and won't go any quicker (i.e. the loop overhead is parallel
545 to part of the OCBP execution.) */
546 asm __volatile__ ("ocbp %0, 0" : : "r" (magic_eaddr));
547 magic_eaddr += L1_CACHE_BYTES;
550 sh64_teardown_dtlb_cache_slot();
553 /****************************************************************************/
555 static void sh64_dcache_purge_phy_page(unsigned long paddr)
557 /* Pure a page given its physical start address, by creating a
558 temporary 1 page mapping and purging across that. Even if we know
559 the virtual address (& vma or mm) of the page, the method here is
560 more elegant because it avoids issues of coping with page faults on
561 the purge instructions (i.e. no special-case code required in the
562 critical path in the TLB miss handling). */
564 unsigned long long eaddr_start, eaddr, eaddr_end;
565 int i;
567 /* As long as the kernel is not pre-emptible, this doesn't need to be
568 under cli/sti. */
570 eaddr_start = MAGIC_PAGE0_START;
571 for (i=0; i < (1 << CACHE_OC_N_SYNBITS); i++) {
572 sh64_setup_dtlb_cache_slot(eaddr_start, get_asid(), paddr);
574 eaddr = eaddr_start;
575 eaddr_end = eaddr + PAGE_SIZE;
576 while (eaddr < eaddr_end) {
577 asm __volatile__ ("ocbp %0, 0" : : "r" (eaddr));
578 eaddr += L1_CACHE_BYTES;
581 sh64_teardown_dtlb_cache_slot();
582 eaddr_start += PAGE_SIZE;
586 static void sh64_dcache_purge_user_pages(struct mm_struct *mm,
587 unsigned long addr, unsigned long end)
589 pgd_t *pgd;
590 pmd_t *pmd;
591 pte_t *pte;
592 pte_t entry;
593 spinlock_t *ptl;
594 unsigned long paddr;
596 if (!mm)
597 return; /* No way to find physical address of page */
599 pgd = pgd_offset(mm, addr);
600 if (pgd_bad(*pgd))
601 return;
603 pmd = pmd_offset(pgd, addr);
604 if (pmd_none(*pmd) || pmd_bad(*pmd))
605 return;
607 pte = pte_offset_map_lock(mm, pmd, addr, &ptl);
608 do {
609 entry = *pte;
610 if (pte_none(entry) || !pte_present(entry))
611 continue;
612 paddr = pte_val(entry) & PAGE_MASK;
613 sh64_dcache_purge_coloured_phy_page(paddr, addr);
614 } while (pte++, addr += PAGE_SIZE, addr != end);
615 pte_unmap_unlock(pte - 1, ptl);
617 /****************************************************************************/
619 static void sh64_dcache_purge_user_range(struct mm_struct *mm,
620 unsigned long start, unsigned long end)
622 /* There are at least 5 choices for the implementation of this, with
623 pros (+), cons(-), comments(*):
625 1. ocbp each line in the range through the original user's ASID
626 + no lines spuriously evicted
627 - tlbmiss handling (must either handle faults on demand => extra
628 special-case code in tlbmiss critical path), or map the page in
629 advance (=> flush_tlb_range in advance to avoid multiple hits)
630 - ASID switching
631 - expensive for large ranges
633 2. temporarily map each page in the range to a special effective
634 address and ocbp through the temporary mapping; relies on the
635 fact that SH-5 OCB* always do TLB lookup and match on ptags (they
636 never look at the etags)
637 + no spurious evictions
638 - expensive for large ranges
639 * surely cheaper than (1)
641 3. walk all the lines in the cache, check the tags, if a match
642 occurs create a page mapping to ocbp the line through
643 + no spurious evictions
644 - tag inspection overhead
645 - (especially for small ranges)
646 - potential cost of setting up/tearing down page mapping for
647 every line that matches the range
648 * cost partly independent of range size
650 4. walk all the lines in the cache, check the tags, if a match
651 occurs use 4 * alloco to purge the line (+3 other probably
652 innocent victims) by natural eviction
653 + no tlb mapping overheads
654 - spurious evictions
655 - tag inspection overhead
657 5. implement like flush_cache_all
658 + no tag inspection overhead
659 - spurious evictions
660 - bad for small ranges
662 (1) can be ruled out as more expensive than (2). (2) appears best
663 for small ranges. The choice between (3), (4) and (5) for large
664 ranges and the range size for the large/small boundary need
665 benchmarking to determine.
667 For now use approach (2) for small ranges and (5) for large ones.
671 int n_pages;
673 n_pages = ((end - start) >> PAGE_SHIFT);
674 if (n_pages >= 64 || ((start ^ (end - 1)) & PMD_MASK)) {
675 #if 1
676 sh64_dcache_purge_all();
677 #else
678 unsigned long long set, way;
679 unsigned long mm_asid = mm->context & MMU_CONTEXT_ASID_MASK;
680 for (set = 0; set < cpu_data->dcache.sets; set++) {
681 unsigned long long set_base_config_addr = CACHE_OC_ADDRESS_ARRAY + (set << cpu_data->dcache.set_shift);
682 for (way = 0; way < cpu_data->dcache.ways; way++) {
683 unsigned long long config_addr = set_base_config_addr + (way << cpu_data->dcache.way_step_shift);
684 unsigned long long tag0;
685 unsigned long line_valid;
687 asm __volatile__("getcfg %1, 0, %0" : "=r" (tag0) : "r" (config_addr));
688 line_valid = tag0 & SH_CACHE_VALID;
689 if (line_valid) {
690 unsigned long cache_asid;
691 unsigned long epn;
693 cache_asid = (tag0 & cpu_data->dcache.asid_mask) >> cpu_data->dcache.asid_shift;
694 /* The next line needs some
695 explanation. The virtual tags
696 encode bits [31:13] of the virtual
697 address, bit [12] of the 'tag' being
698 implied by the cache set index. */
699 epn = (tag0 & cpu_data->dcache.epn_mask) | ((set & 0x80) << cpu_data->dcache.entry_shift);
701 if ((cache_asid == mm_asid) && (start <= epn) && (epn < end)) {
702 /* TODO : could optimise this
703 call by batching multiple
704 adjacent sets together. */
705 sh64_dcache_purge_sets(set, 1);
706 break; /* Don't waste time inspecting other ways for this set */
711 #endif
712 } else {
713 /* Small range, covered by a single page table page */
714 start &= PAGE_MASK; /* should already be so */
715 end = PAGE_ALIGN(end); /* should already be so */
716 sh64_dcache_purge_user_pages(mm, start, end);
718 return;
721 static void sh64_dcache_wback_current_user_range(unsigned long start, unsigned long end)
723 unsigned long long aligned_start;
724 unsigned long long ull_end;
725 unsigned long long addr;
727 ull_end = end;
729 /* Just wback over the range using the natural addresses. TLB miss
730 handling will be OK (TBC) : the range has just been written to by
731 the signal frame setup code, so the PTEs must exist.
733 Note, if we have CONFIG_PREEMPT and get preempted inside this loop,
734 it doesn't matter, even if the pid->ASID mapping changes whilst
735 we're away. In that case the cache will have been flushed when the
736 mapping was renewed. So the writebacks below will be nugatory (and
737 we'll doubtless have to fault the TLB entry/ies in again with the
738 new ASID), but it's a rare case.
740 aligned_start = start & L1_CACHE_ALIGN_MASK;
741 addr = aligned_start;
742 while (addr < ull_end) {
743 asm __volatile__ ("ocbwb %0, 0" : : "r" (addr));
744 addr += L1_CACHE_BYTES;
748 /****************************************************************************/
750 /* These *MUST* lie in an area of virtual address space that's otherwise unused. */
751 #define UNIQUE_EADDR_START 0xe0000000UL
752 #define UNIQUE_EADDR_END 0xe8000000UL
754 static unsigned long sh64_make_unique_eaddr(unsigned long user_eaddr, unsigned long paddr)
756 /* Given a physical address paddr, and a user virtual address
757 user_eaddr which will eventually be mapped to it, create a one-off
758 kernel-private eaddr mapped to the same paddr. This is used for
759 creating special destination pages for copy_user_page and
760 clear_user_page */
762 static unsigned long current_pointer = UNIQUE_EADDR_START;
763 unsigned long coloured_pointer;
765 if (current_pointer == UNIQUE_EADDR_END) {
766 sh64_dcache_purge_all();
767 current_pointer = UNIQUE_EADDR_START;
770 coloured_pointer = (current_pointer & ~CACHE_OC_SYN_MASK) | (user_eaddr & CACHE_OC_SYN_MASK);
771 sh64_setup_dtlb_cache_slot(coloured_pointer, get_asid(), paddr);
773 current_pointer += (PAGE_SIZE << CACHE_OC_N_SYNBITS);
775 return coloured_pointer;
778 /****************************************************************************/
780 static void sh64_copy_user_page_coloured(void *to, void *from, unsigned long address)
782 void *coloured_to;
784 /* Discard any existing cache entries of the wrong colour. These are
785 present quite often, if the kernel has recently used the page
786 internally, then given it up, then it's been allocated to the user.
788 sh64_dcache_purge_coloured_phy_page(__pa(to), (unsigned long) to);
790 coloured_to = (void *) sh64_make_unique_eaddr(address, __pa(to));
791 sh64_page_copy(from, coloured_to);
793 sh64_teardown_dtlb_cache_slot();
796 static void sh64_clear_user_page_coloured(void *to, unsigned long address)
798 void *coloured_to;
800 /* Discard any existing kernel-originated lines of the wrong colour (as
801 above) */
802 sh64_dcache_purge_coloured_phy_page(__pa(to), (unsigned long) to);
804 coloured_to = (void *) sh64_make_unique_eaddr(address, __pa(to));
805 sh64_page_clear(coloured_to);
807 sh64_teardown_dtlb_cache_slot();
810 #endif /* !CONFIG_DCACHE_DISABLED */
812 /****************************************************************************/
814 /*##########################################################################
815 EXTERNALLY CALLABLE API.
816 ##########################################################################*/
818 /* These functions are described in Documentation/cachetlb.txt.
819 Each one of these functions varies in behaviour depending on whether the
820 I-cache and/or D-cache are configured out.
822 Note that the Linux term 'flush' corresponds to what is termed 'purge' in
823 the sh/sh64 jargon for the D-cache, i.e. write back dirty data then
824 invalidate the cache lines, and 'invalidate' for the I-cache.
827 #undef FLUSH_TRACE
829 void flush_cache_all(void)
831 /* Invalidate the entire contents of both caches, after writing back to
832 memory any dirty data from the D-cache. */
833 sh64_dcache_purge_all();
834 sh64_icache_inv_all();
837 /****************************************************************************/
839 void flush_cache_mm(struct mm_struct *mm)
841 /* Invalidate an entire user-address space from both caches, after
842 writing back dirty data (e.g. for shared mmap etc). */
844 /* This could be coded selectively by inspecting all the tags then
845 doing 4*alloco on any set containing a match (as for
846 flush_cache_range), but fork/exit/execve (where this is called from)
847 are expensive anyway. */
849 /* Have to do a purge here, despite the comments re I-cache below.
850 There could be odd-coloured dirty data associated with the mm still
851 in the cache - if this gets written out through natural eviction
852 after the kernel has reused the page there will be chaos.
855 sh64_dcache_purge_all();
857 /* The mm being torn down won't ever be active again, so any Icache
858 lines tagged with its ASID won't be visible for the rest of the
859 lifetime of this ASID cycle. Before the ASID gets reused, there
860 will be a flush_cache_all. Hence we don't need to touch the
861 I-cache. This is similar to the lack of action needed in
862 flush_tlb_mm - see fault.c. */
865 /****************************************************************************/
867 void flush_cache_range(struct vm_area_struct *vma, unsigned long start,
868 unsigned long end)
870 struct mm_struct *mm = vma->vm_mm;
872 /* Invalidate (from both caches) the range [start,end) of virtual
873 addresses from the user address space specified by mm, after writing
874 back any dirty data.
876 Note, 'end' is 1 byte beyond the end of the range to flush. */
878 sh64_dcache_purge_user_range(mm, start, end);
879 sh64_icache_inv_user_page_range(mm, start, end);
882 /****************************************************************************/
884 void flush_cache_page(struct vm_area_struct *vma, unsigned long eaddr, unsigned long pfn)
886 /* Invalidate any entries in either cache for the vma within the user
887 address space vma->vm_mm for the page starting at virtual address
888 'eaddr'. This seems to be used primarily in breaking COW. Note,
889 the I-cache must be searched too in case the page in question is
890 both writable and being executed from (e.g. stack trampolines.)
892 Note, this is called with pte lock held.
895 sh64_dcache_purge_phy_page(pfn << PAGE_SHIFT);
897 if (vma->vm_flags & VM_EXEC) {
898 sh64_icache_inv_user_page(vma, eaddr);
902 /****************************************************************************/
904 #ifndef CONFIG_DCACHE_DISABLED
906 void copy_user_page(void *to, void *from, unsigned long address, struct page *page)
908 /* 'from' and 'to' are kernel virtual addresses (within the superpage
909 mapping of the physical RAM). 'address' is the user virtual address
910 where the copy 'to' will be mapped after. This allows a custom
911 mapping to be used to ensure that the new copy is placed in the
912 right cache sets for the user to see it without having to bounce it
913 out via memory. Note however : the call to flush_page_to_ram in
914 (generic)/mm/memory.c:(break_cow) undoes all this good work in that one
915 very important case!
917 TBD : can we guarantee that on every call, any cache entries for
918 'from' are in the same colour sets as 'address' also? i.e. is this
919 always used just to deal with COW? (I suspect not). */
921 /* There are two possibilities here for when the page 'from' was last accessed:
922 * by the kernel : this is OK, no purge required.
923 * by the/a user (e.g. for break_COW) : need to purge.
925 If the potential user mapping at 'address' is the same colour as
926 'from' there is no need to purge any cache lines from the 'from'
927 page mapped into cache sets of colour 'address'. (The copy will be
928 accessing the page through 'from').
931 if (((address ^ (unsigned long) from) & CACHE_OC_SYN_MASK) != 0) {
932 sh64_dcache_purge_coloured_phy_page(__pa(from), address);
935 if (((address ^ (unsigned long) to) & CACHE_OC_SYN_MASK) == 0) {
936 /* No synonym problem on destination */
937 sh64_page_copy(from, to);
938 } else {
939 sh64_copy_user_page_coloured(to, from, address);
942 /* Note, don't need to flush 'from' page from the cache again - it's
943 done anyway by the generic code */
946 void clear_user_page(void *to, unsigned long address, struct page *page)
948 /* 'to' is a kernel virtual address (within the superpage
949 mapping of the physical RAM). 'address' is the user virtual address
950 where the 'to' page will be mapped after. This allows a custom
951 mapping to be used to ensure that the new copy is placed in the
952 right cache sets for the user to see it without having to bounce it
953 out via memory.
956 if (((address ^ (unsigned long) to) & CACHE_OC_SYN_MASK) == 0) {
957 /* No synonym problem on destination */
958 sh64_page_clear(to);
959 } else {
960 sh64_clear_user_page_coloured(to, address);
964 #endif /* !CONFIG_DCACHE_DISABLED */
966 /****************************************************************************/
968 void flush_dcache_page(struct page *page)
970 sh64_dcache_purge_phy_page(page_to_phys(page));
971 wmb();
974 /****************************************************************************/
976 void flush_icache_range(unsigned long start, unsigned long end)
978 /* Flush the range [start,end] of kernel virtual adddress space from
979 the I-cache. The corresponding range must be purged from the
980 D-cache also because the SH-5 doesn't have cache snooping between
981 the caches. The addresses will be visible through the superpage
982 mapping, therefore it's guaranteed that there no cache entries for
983 the range in cache sets of the wrong colour.
985 Primarily used for cohering the I-cache after a module has
986 been loaded. */
988 /* We also make sure to purge the same range from the D-cache since
989 flush_page_to_ram() won't be doing this for us! */
991 sh64_dcache_purge_kernel_range(start, end);
992 wmb();
993 sh64_icache_inv_kernel_range(start, end);
996 /****************************************************************************/
998 void flush_icache_user_range(struct vm_area_struct *vma,
999 struct page *page, unsigned long addr, int len)
1001 /* Flush the range of user (defined by vma->vm_mm) address space
1002 starting at 'addr' for 'len' bytes from the cache. The range does
1003 not straddle a page boundary, the unique physical page containing
1004 the range is 'page'. This seems to be used mainly for invalidating
1005 an address range following a poke into the program text through the
1006 ptrace() call from another process (e.g. for BRK instruction
1007 insertion). */
1009 sh64_dcache_purge_coloured_phy_page(page_to_phys(page), addr);
1010 mb();
1012 if (vma->vm_flags & VM_EXEC) {
1013 sh64_icache_inv_user_small_range(vma->vm_mm, addr, len);
1017 /*##########################################################################
1018 ARCH/SH64 PRIVATE CALLABLE API.
1019 ##########################################################################*/
1021 void flush_cache_sigtramp(unsigned long start, unsigned long end)
1023 /* For the address range [start,end), write back the data from the
1024 D-cache and invalidate the corresponding region of the I-cache for
1025 the current process. Used to flush signal trampolines on the stack
1026 to make them executable. */
1028 sh64_dcache_wback_current_user_range(start, end);
1029 wmb();
1030 sh64_icache_inv_current_user_range(start, end);