|
@@ -13,11 +13,13 @@
|
|
|
*
|
|
|
*/
|
|
|
|
|
|
+#include <asm/page.h>
|
|
|
#include <asm/processor.h>
|
|
|
#include <asm/cputable.h>
|
|
|
#include <asm/ppc_asm.h>
|
|
|
#include <asm/mmu-book3e.h>
|
|
|
#include <asm/asm-offsets.h>
|
|
|
+#include <asm/mpc85xx.h>
|
|
|
|
|
|
_GLOBAL(__e500_icache_setup)
|
|
|
mfspr r0, SPRN_L1CSR1
|
|
@@ -233,3 +235,113 @@ _GLOBAL(__setup_cpu_e5500)
|
|
|
mtlr r5
|
|
|
blr
|
|
|
#endif
|
|
|
+
|
|
|
+/* flush L1 date cache, it can apply to e500v2, e500mc and e5500 */
|
|
|
+_GLOBAL(flush_dcache_L1)
|
|
|
+ mfmsr r10
|
|
|
+ wrteei 0
|
|
|
+
|
|
|
+ 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
|
|
|
+
|
|
|
+ LOAD_REG_IMMEDIATE(r6, KERNELBASE)
|
|
|
+ mr r4, r6
|
|
|
+ mtctr r7
|
|
|
+
|
|
|
+1: lwz r3,0(r4) /* Load... */
|
|
|
+ add r4,r4,r5
|
|
|
+ bdnz 1b
|
|
|
+
|
|
|
+ msync
|
|
|
+ mr r4, r6
|
|
|
+ mtctr r7
|
|
|
+
|
|
|
+1: dcbf 0,r4 /* ...and flush. */
|
|
|
+ add r4,r4,r5
|
|
|
+ bdnz 1b
|
|
|
+
|
|
|
+ /* restore HID0 */
|
|
|
+ mtspr SPRN_HID0,r8
|
|
|
+ isync
|
|
|
+
|
|
|
+ wrtee r10
|
|
|
+
|
|
|
+ blr
|
|
|
+
|
|
|
+has_L2_cache:
|
|
|
+ /* skip L2 cache on P2040/P2040E as they have no L2 cache */
|
|
|
+ mfspr r3, SPRN_SVR
|
|
|
+ /* shift right by 8 bits and clear E bit of SVR */
|
|
|
+ rlwinm r4, r3, 24, ~0x800
|
|
|
+
|
|
|
+ lis r3, SVR_P2040@h
|
|
|
+ ori r3, r3, SVR_P2040@l
|
|
|
+ cmpw r4, r3
|
|
|
+ beq 1f
|
|
|
+
|
|
|
+ li r3, 1
|
|
|
+ blr
|
|
|
+1:
|
|
|
+ li r3, 0
|
|
|
+ blr
|
|
|
+
|
|
|
+/* flush backside L2 cache */
|
|
|
+flush_backside_L2_cache:
|
|
|
+ mflr r10
|
|
|
+ bl has_L2_cache
|
|
|
+ mtlr r10
|
|
|
+ cmpwi r3, 0
|
|
|
+ beq 2f
|
|
|
+
|
|
|
+ /* Flush the L2 cache */
|
|
|
+ mfspr r3, SPRN_L2CSR0
|
|
|
+ ori r3, r3, L2CSR0_L2FL@l
|
|
|
+ msync
|
|
|
+ isync
|
|
|
+ mtspr SPRN_L2CSR0,r3
|
|
|
+ isync
|
|
|
+
|
|
|
+ /* check if it is complete */
|
|
|
+1: mfspr r3,SPRN_L2CSR0
|
|
|
+ andi. r3, r3, L2CSR0_L2FL@l
|
|
|
+ bne 1b
|
|
|
+2:
|
|
|
+ blr
|
|
|
+
|
|
|
+_GLOBAL(cpu_down_flush_e500v2)
|
|
|
+ mflr r0
|
|
|
+ bl flush_dcache_L1
|
|
|
+ mtlr r0
|
|
|
+ blr
|
|
|
+
|
|
|
+_GLOBAL(cpu_down_flush_e500mc)
|
|
|
+_GLOBAL(cpu_down_flush_e5500)
|
|
|
+ mflr r0
|
|
|
+ bl flush_dcache_L1
|
|
|
+ bl flush_backside_L2_cache
|
|
|
+ mtlr r0
|
|
|
+ blr
|
|
|
+
|
|
|
+/* L1 Data Cache of e6500 contains no modified data, no flush is required */
|
|
|
+_GLOBAL(cpu_down_flush_e6500)
|
|
|
+ blr
|