diff options
| author | Michal Simek <monstr@monstr.eu> | 2009-12-10 05:43:57 -0500 |
|---|---|---|
| committer | Michal Simek <monstr@monstr.eu> | 2009-12-14 02:45:10 -0500 |
| commit | 2ee2ff875a4d3bdb941e2bb1173cd927c09d5a67 (patch) | |
| tree | a1ec4db3055527a2814cbdb006652dbf0885b348 /arch/microblaze/kernel/cpu | |
| parent | c8983a5c6ecc5ca68a871c44bc35f714663a4dfa (diff) | |
microblaze: Support for WB cache
Microblaze version 7.20.d is the first MB version which can be run
on MMU linux. Please do not used previous version because they contain
HW bug.
Based on WB support was necessary to redesign whole cache design.
Microblaze versions from 7.20.a don't need to disable IRQ and cache
before working with them that's why there are special structures for it.
Signed-off-by: Michal Simek <monstr@monstr.eu>
Diffstat (limited to 'arch/microblaze/kernel/cpu')
| -rw-r--r-- | arch/microblaze/kernel/cpu/cache.c | 663 |
1 files changed, 477 insertions, 186 deletions
diff --git a/arch/microblaze/kernel/cpu/cache.c b/arch/microblaze/kernel/cpu/cache.c index 538f1df6761d..d9d63831cc2f 100644 --- a/arch/microblaze/kernel/cpu/cache.c +++ b/arch/microblaze/kernel/cpu/cache.c | |||
| @@ -3,7 +3,7 @@ | |||
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2007-2009 Michal Simek <monstr@monstr.eu> | 4 | * Copyright (C) 2007-2009 Michal Simek <monstr@monstr.eu> |
| 5 | * Copyright (C) 2007-2009 PetaLogix | 5 | * Copyright (C) 2007-2009 PetaLogix |
| 6 | * Copyright (C) 2007 John Williams <john.williams@petalogix.com> | 6 | * Copyright (C) 2007-2009 John Williams <john.williams@petalogix.com> |
| 7 | * | 7 | * |
| 8 | * This file is subject to the terms and conditions of the GNU General | 8 | * This file is subject to the terms and conditions of the GNU General |
| 9 | * Public License. See the file COPYING in the main directory of this | 9 | * Public License. See the file COPYING in the main directory of this |
| @@ -13,243 +13,534 @@ | |||
| 13 | #include <asm/cacheflush.h> | 13 | #include <asm/cacheflush.h> |
| 14 | #include <linux/cache.h> | 14 | #include <linux/cache.h> |
| 15 | #include <asm/cpuinfo.h> | 15 | #include <asm/cpuinfo.h> |
| 16 | #include <asm/pvr.h> | ||
| 16 | 17 | ||
| 17 | /* Exported functions */ | 18 | static inline void __invalidate_flush_icache(unsigned int addr) |
| 19 | { | ||
| 20 | __asm__ __volatile__ ("wic %0, r0;" \ | ||
| 21 | : : "r" (addr)); | ||
| 22 | } | ||
| 23 | |||
| 24 | static inline void __flush_dcache(unsigned int addr) | ||
| 25 | { | ||
| 26 | __asm__ __volatile__ ("wdc.flush %0, r0;" \ | ||
| 27 | : : "r" (addr)); | ||
| 28 | } | ||
| 29 | |||
| 30 | static inline void __invalidate_dcache(unsigned int baseaddr, | ||
| 31 | unsigned int offset) | ||
| 32 | { | ||
| 33 | __asm__ __volatile__ ("wdc.clear %0, %1;" \ | ||
| 34 | : : "r" (baseaddr), "r" (offset)); | ||
| 35 | } | ||
| 18 | 36 | ||
| 19 | void _enable_icache(void) | 37 | static inline void __enable_icache_msr(void) |
| 20 | { | 38 | { |
| 21 | if (cpuinfo.use_icache) { | 39 | __asm__ __volatile__ (" msrset r0, %0; \ |
| 22 | #if CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR | 40 | nop; " \ |
| 23 | __asm__ __volatile__ (" \ | 41 | : : "i" (MSR_ICE) : "memory"); |
| 24 | msrset r0, %0; \ | 42 | } |
| 25 | nop; " \ | 43 | |
| 26 | : \ | 44 | static inline void __disable_icache_msr(void) |
| 27 | : "i" (MSR_ICE) \ | 45 | { |
| 46 | __asm__ __volatile__ (" msrclr r0, %0; \ | ||
| 47 | nop; " \ | ||
| 48 | : : "i" (MSR_ICE) : "memory"); | ||
| 49 | } | ||
| 50 | |||
| 51 | static inline void __enable_dcache_msr(void) | ||
| 52 | { | ||
| 53 | __asm__ __volatile__ (" msrset r0, %0; \ | ||
| 54 | nop; " \ | ||
| 55 | : \ | ||
| 56 | : "i" (MSR_DCE) \ | ||
| 28 | : "memory"); | 57 | : "memory"); |
| 29 | #else | ||
| 30 | __asm__ __volatile__ (" \ | ||
| 31 | mfs r12, rmsr; \ | ||
| 32 | nop; \ | ||
| 33 | ori r12, r12, %0; \ | ||
| 34 | mts rmsr, r12; \ | ||
| 35 | nop; " \ | ||
| 36 | : \ | ||
| 37 | : "i" (MSR_ICE) \ | ||
| 38 | : "memory", "r12"); | ||
| 39 | #endif | ||
| 40 | } | ||
| 41 | } | 58 | } |
| 42 | 59 | ||
| 43 | void _disable_icache(void) | 60 | static inline void __disable_dcache_msr(void) |
| 44 | { | 61 | { |
| 45 | if (cpuinfo.use_icache) { | 62 | __asm__ __volatile__ (" msrclr r0, %0; \ |
| 46 | #if CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR | 63 | nop; " \ |
| 47 | __asm__ __volatile__ (" \ | 64 | : \ |
| 48 | msrclr r0, %0; \ | 65 | : "i" (MSR_DCE) \ |
| 49 | nop; " \ | ||
| 50 | : \ | ||
| 51 | : "i" (MSR_ICE) \ | ||
| 52 | : "memory"); | 66 | : "memory"); |
| 53 | #else | 67 | } |
| 54 | __asm__ __volatile__ (" \ | 68 | |
| 55 | mfs r12, rmsr; \ | 69 | static inline void __enable_icache_nomsr(void) |
| 56 | nop; \ | 70 | { |
| 57 | andi r12, r12, ~%0; \ | 71 | __asm__ __volatile__ (" mfs r12, rmsr; \ |
| 58 | mts rmsr, r12; \ | 72 | nop; \ |
| 59 | nop; " \ | 73 | ori r12, r12, %0; \ |
| 60 | : \ | 74 | mts rmsr, r12; \ |
| 61 | : "i" (MSR_ICE) \ | 75 | nop; " \ |
| 76 | : \ | ||
| 77 | : "i" (MSR_ICE) \ | ||
| 62 | : "memory", "r12"); | 78 | : "memory", "r12"); |
| 63 | #endif | ||
| 64 | } | ||
| 65 | } | 79 | } |
| 66 | 80 | ||
| 67 | void _invalidate_icache(unsigned int addr) | 81 | static inline void __disable_icache_nomsr(void) |
| 68 | { | 82 | { |
| 69 | if (cpuinfo.use_icache) { | 83 | __asm__ __volatile__ (" mfs r12, rmsr; \ |
| 70 | __asm__ __volatile__ (" \ | 84 | nop; \ |
| 71 | wic %0, r0" \ | 85 | andi r12, r12, ~%0; \ |
| 72 | : \ | 86 | mts rmsr, r12; \ |
| 73 | : "r" (addr)); | 87 | nop; " \ |
| 74 | } | 88 | : \ |
| 89 | : "i" (MSR_ICE) \ | ||
| 90 | : "memory", "r12"); | ||
| 75 | } | 91 | } |
| 76 | 92 | ||
| 77 | void _enable_dcache(void) | 93 | static inline void __enable_dcache_nomsr(void) |
| 78 | { | 94 | { |
| 79 | if (cpuinfo.use_dcache) { | 95 | __asm__ __volatile__ (" mfs r12, rmsr; \ |
| 80 | #if CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR | 96 | nop; \ |
| 81 | __asm__ __volatile__ (" \ | 97 | ori r12, r12, %0; \ |
| 82 | msrset r0, %0; \ | 98 | mts rmsr, r12; \ |
| 83 | nop; " \ | 99 | nop; " \ |
| 84 | : \ | 100 | : \ |
| 85 | : "i" (MSR_DCE) \ | 101 | : "i" (MSR_DCE) \ |
| 86 | : "memory"); | ||
| 87 | #else | ||
| 88 | __asm__ __volatile__ (" \ | ||
| 89 | mfs r12, rmsr; \ | ||
| 90 | nop; \ | ||
| 91 | ori r12, r12, %0; \ | ||
| 92 | mts rmsr, r12; \ | ||
| 93 | nop; " \ | ||
| 94 | : \ | ||
| 95 | : "i" (MSR_DCE) \ | ||
| 96 | : "memory", "r12"); | 102 | : "memory", "r12"); |
| 97 | #endif | ||
| 98 | } | ||
| 99 | } | 103 | } |
| 100 | 104 | ||
| 101 | void _disable_dcache(void) | 105 | static inline void __disable_dcache_nomsr(void) |
| 102 | { | 106 | { |
| 103 | #if CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR | 107 | __asm__ __volatile__ (" mfs r12, rmsr; \ |
| 104 | __asm__ __volatile__ (" \ | 108 | nop; \ |
| 105 | msrclr r0, %0; \ | 109 | andi r12, r12, ~%0; \ |
| 106 | nop; " \ | 110 | mts rmsr, r12; \ |
