diff options
Diffstat (limited to 'arch/blackfin/mach-common/cache.S')
-rw-r--r-- | arch/blackfin/mach-common/cache.S | 38 |
1 files changed, 32 insertions, 6 deletions
diff --git a/arch/blackfin/mach-common/cache.S b/arch/blackfin/mach-common/cache.S index ab4a925a443e..9f4dd35bfd74 100644 --- a/arch/blackfin/mach-common/cache.S +++ b/arch/blackfin/mach-common/cache.S | |||
@@ -11,12 +11,6 @@ | |||
11 | #include <asm/cache.h> | 11 | #include <asm/cache.h> |
12 | #include <asm/page.h> | 12 | #include <asm/page.h> |
13 | 13 | ||
14 | #ifdef CONFIG_CACHE_FLUSH_L1 | ||
15 | .section .l1.text | ||
16 | #else | ||
17 | .text | ||
18 | #endif | ||
19 | |||
20 | /* 05000443 - IFLUSH cannot be last instruction in hardware loop */ | 14 | /* 05000443 - IFLUSH cannot be last instruction in hardware loop */ |
21 | #if ANOMALY_05000443 | 15 | #if ANOMALY_05000443 |
22 | # define BROK_FLUSH_INST "IFLUSH" | 16 | # define BROK_FLUSH_INST "IFLUSH" |
@@ -68,11 +62,43 @@ | |||
68 | RTS; | 62 | RTS; |
69 | .endm | 63 | .endm |
70 | 64 | ||
65 | #ifdef CONFIG_ICACHE_FLUSH_L1 | ||
66 | .section .l1.text | ||
67 | #else | ||
68 | .text | ||
69 | #endif | ||
70 | |||
71 | /* Invalidate all instruction cache lines assocoiated with this memory area */ | 71 | /* Invalidate all instruction cache lines assocoiated with this memory area */ |
72 | #ifdef CONFIG_SMP | ||
73 | # define _blackfin_icache_flush_range _blackfin_icache_flush_range_l1 | ||
74 | #endif | ||
72 | ENTRY(_blackfin_icache_flush_range) | 75 | ENTRY(_blackfin_icache_flush_range) |
73 | do_flush IFLUSH | 76 | do_flush IFLUSH |
74 | ENDPROC(_blackfin_icache_flush_range) | 77 | ENDPROC(_blackfin_icache_flush_range) |
75 | 78 | ||
79 | #ifdef CONFIG_SMP | ||
80 | .text | ||
81 | # undef _blackfin_icache_flush_range | ||
82 | ENTRY(_blackfin_icache_flush_range) | ||
83 | p0.L = LO(DSPID); | ||
84 | p0.H = HI(DSPID); | ||
85 | r3 = [p0]; | ||
86 | r3 = r3.b (z); | ||
87 | p2 = r3; | ||
88 | p0.L = _blackfin_iflush_l1_entry; | ||
89 | p0.H = _blackfin_iflush_l1_entry; | ||
90 | p0 = p0 + (p2 << 2); | ||
91 | p1 = [p0]; | ||
92 | jump (p1); | ||
93 | ENDPROC(_blackfin_icache_flush_range) | ||
94 | #endif | ||
95 | |||
96 | #ifdef CONFIG_DCACHE_FLUSH_L1 | ||
97 | .section .l1.text | ||
98 | #else | ||
99 | .text | ||
100 | #endif | ||
101 | |||
76 | /* Throw away all D-cached data in specified region without any obligation to | 102 | /* Throw away all D-cached data in specified region without any obligation to |
77 | * write them back. Since the Blackfin ISA does not have an "invalidate" | 103 | * write them back. Since the Blackfin ISA does not have an "invalidate" |
78 | * instruction, we use flush/invalidate. Perhaps as a speed optimization we | 104 | * instruction, we use flush/invalidate. Perhaps as a speed optimization we |