powerpc/cache: add cache flush operation for various e500
Various e500 core have different cache architecture, so they need different cache flush operations. Therefore, add a callback function cpu_flush_caches to the struct cpu_spec. The cache flush operation for the specific kind of e500 is selected at init time. The callback function will flush all caches inside the current cpu. Signed-off-by: Chenhui Zhao <chenhui.zhao@freescale.com> Signed-off-by: Tang Yuantian <Yuantian.Tang@feescale.com> Signed-off-by: Scott Wood <oss@buserror.net>
This commit is contained in:
@@ -1037,80 +1037,6 @@ _GLOBAL(set_context)
|
||||
isync /* Force context change */
|
||||
blr
|
||||
|
||||
_GLOBAL(flush_dcache_L1)
|
||||
mfspr r3,SPRN_L1CFG0
|
||||
|
||||
rlwinm r5,r3,9,3 /* Extract cache block size */
|
||||
twlgti r5,1 /* Only 32 and 64 byte cache blocks
|
||||
* are currently defined.
|
||||
*/
|
||||
li r4,32
|
||||
subfic r6,r5,2 /* r6 = log2(1KiB / cache block size) -
|
||||
* log2(number of ways)
|
||||
*/
|
||||
slw r5,r4,r5 /* r5 = cache block size */
|
||||
|
||||
rlwinm r7,r3,0,0xff /* Extract number of KiB in the cache */
|
||||
mulli r7,r7,13 /* An 8-way cache will require 13
|
||||
* loads per set.
|
||||
*/
|
||||
slw r7,r7,r6
|
||||
|
||||
/* save off HID0 and set DCFA */
|
||||
mfspr r8,SPRN_HID0
|
||||
ori r9,r8,HID0_DCFA@l
|
||||
mtspr SPRN_HID0,r9
|
||||
isync
|
||||
|
||||
lis r4,KERNELBASE@h
|
||||
mtctr r7
|
||||
|
||||
1: lwz r3,0(r4) /* Load... */
|
||||
add r4,r4,r5
|
||||
bdnz 1b
|
||||
|
||||
msync
|
||||
lis r4,KERNELBASE@h
|
||||
mtctr r7
|
||||
|
||||
1: dcbf 0,r4 /* ...and flush. */
|
||||
add r4,r4,r5
|
||||
bdnz 1b
|
||||
|
||||
/* restore HID0 */
|
||||
mtspr SPRN_HID0,r8
|
||||
isync
|
||||
|
||||
blr
|
||||
|
||||
/* Flush L1 d-cache, invalidate and disable d-cache and i-cache */
|
||||
_GLOBAL(__flush_disable_L1)
|
||||
mflr r10
|
||||
bl flush_dcache_L1 /* Flush L1 d-cache */
|
||||
mtlr r10
|
||||
|
||||
mfspr r4, SPRN_L1CSR0 /* Invalidate and disable d-cache */
|
||||
li r5, 2
|
||||
rlwimi r4, r5, 0, 3
|
||||
|
||||
msync
|
||||
isync
|
||||
mtspr SPRN_L1CSR0, r4
|
||||
isync
|
||||
|
||||
1: mfspr r4, SPRN_L1CSR0 /* Wait for the invalidate to finish */
|
||||
andi. r4, r4, 2
|
||||
bne 1b
|
||||
|
||||
mfspr r4, SPRN_L1CSR1 /* Invalidate and disable i-cache */
|
||||
li r5, 2
|
||||
rlwimi r4, r5, 0, 3
|
||||
|
||||
mtspr SPRN_L1CSR1, r4
|
||||
isync
|
||||
|
||||
blr
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
/* When we get here, r24 needs to hold the CPU # */
|
||||
.globl __secondary_start
|
||||
|
Reference in New Issue
Block a user