diff options
author | Christophe Leroy <christophe.leroy@c-s.fr> | 2016-02-09 11:08:21 -0500 |
---|---|---|
committer | Scott Wood <oss@buserror.net> | 2016-03-11 18:20:11 -0500 |
commit | 766d45cbeecc383b8ee230370b316d0b1e30d915 (patch) | |
tree | 934a848219ee9f1aea3291bd0fafbf4166fc7dee /arch/powerpc | |
parent | a7761fe48993f103d6deac6037bf786bd1db0501 (diff) |
powerpc/8xx: rewrite flush_instruction_cache() in C
On PPC8xx, flushing instruction cache is performed by writing
in register SPRN_IC_CST. This registers suffers CPU6 ERRATA.
The patch rewrites the fonction in C so that CPU6 ERRATA will
be handled transparently
Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr>
Signed-off-by: Scott Wood <oss@buserror.net>
Diffstat (limited to 'arch/powerpc')
-rw-r--r-- | arch/powerpc/kernel/misc_32.S | 10 | ||||
-rw-r--r-- | arch/powerpc/mm/8xx_mmu.c | 7 |
2 files changed, 11 insertions, 6 deletions
diff --git a/arch/powerpc/kernel/misc_32.S b/arch/powerpc/kernel/misc_32.S index be8edd67f05b..7d1284f4d89e 100644 --- a/arch/powerpc/kernel/misc_32.S +++ b/arch/powerpc/kernel/misc_32.S | |||
@@ -296,12 +296,9 @@ _GLOBAL(real_writeb) | |||
296 | * Flush instruction cache. | 296 | * Flush instruction cache. |
297 | * This is a no-op on the 601. | 297 | * This is a no-op on the 601. |
298 | */ | 298 | */ |
299 | #ifndef CONFIG_PPC_8xx | ||
299 | _GLOBAL(flush_instruction_cache) | 300 | _GLOBAL(flush_instruction_cache) |
300 | #if defined(CONFIG_8xx) | 301 | #if defined(CONFIG_4xx) |
301 | isync | ||
302 | lis r5, IDC_INVALL@h | ||
303 | mtspr SPRN_IC_CST, r5 | ||
304 | #elif defined(CONFIG_4xx) | ||
305 | #ifdef CONFIG_403GCX | 302 | #ifdef CONFIG_403GCX |
306 | li r3, 512 | 303 | li r3, 512 |
307 | mtctr r3 | 304 | mtctr r3 |
@@ -334,9 +331,10 @@ END_FTR_SECTION_IFSET(CPU_FTR_UNIFIED_ID_CACHE) | |||
334 | mfspr r3,SPRN_HID0 | 331 | mfspr r3,SPRN_HID0 |
335 | ori r3,r3,HID0_ICFI | 332 | ori r3,r3,HID0_ICFI |
336 | mtspr SPRN_HID0,r3 | 333 | mtspr SPRN_HID0,r3 |
337 | #endif /* CONFIG_8xx/4xx */ | 334 | #endif /* CONFIG_4xx */ |
338 | isync | 335 | isync |
339 | blr | 336 | blr |
337 | #endif /* CONFIG_PPC_8xx */ | ||
340 | 338 | ||
341 | /* | 339 | /* |
342 | * Write any modified data cache blocks out to memory | 340 | * Write any modified data cache blocks out to memory |
diff --git a/arch/powerpc/mm/8xx_mmu.c b/arch/powerpc/mm/8xx_mmu.c index 606d2319a44f..949100577db5 100644 --- a/arch/powerpc/mm/8xx_mmu.c +++ b/arch/powerpc/mm/8xx_mmu.c | |||
@@ -132,3 +132,10 @@ void set_context(unsigned long id, pgd_t *pgd) | |||
132 | /* sync */ | 132 | /* sync */ |
133 | mb(); | 133 | mb(); |
134 | } | 134 | } |
135 | |||
136 | void flush_instruction_cache(void) | ||
137 | { | ||
138 | isync(); | ||
139 | mtspr(SPRN_IC_CST, IDC_INVALL); | ||
140 | isync(); | ||
141 | } | ||