Merge branch 'master' into u-boot-5329-early
[oweals/u-boot.git] / cpu / mpc86xx / start.S
index 7406fe2248b407fe26d7c5df6963154c26c6fe2b..412745bdaeacf5921c44032d70b98beb4d9dc596 100644 (file)
@@ -116,7 +116,7 @@ _start_of_vectors:
 /* Alignment exception. */
        . = 0x600
 Alignment:
-       EXCEPTION_PROLOG
+       EXCEPTION_PROLOG(SRR0, SRR1)
        mfspr   r4,DAR
        stw     r4,_DAR(r21)
        mfspr   r5,DSISR
@@ -134,7 +134,7 @@ Alignment:
 /* Program check exception */
        . = 0x700
 ProgramCheck:
-       EXCEPTION_PROLOG
+       EXCEPTION_PROLOG(SRR0, SRR1)
        addi    r3,r1,STACK_FRAME_OVERHEAD
        li      r20,MSR_KERNEL
        rlwimi  r20,r23,0,16,16         /* copy EE bit from saved MSR */
@@ -241,26 +241,40 @@ in_flash:
        bl      setup_ccsrbar
 #endif
 
-       /* Fix for SMP linux - Changing arbitration to round-robin */
-       lis     r3, CFG_CCSRBAR@h
-       ori     r3, r3, 0x1000
-       xor     r4, r4, r4
-       li      r4, 0x1000
-       stw     r4, 0(r3)
 
-       /* setup the law entries */
-       bl      law_entry
+       /* -- MPC8641 Rev 1.0 MCM Errata fixups -- */
+
+       /* skip fixups if not Rev 1.0 */
+       mfspr   r4, SVR
+       rlwinm  r4,r4,0,24,31
+       cmpwi   r4,0x10
+       bne     1f
+
+       lis     r3,MCM_ABCR@ha
+       lwz     r4,MCM_ABCR@l(r3)       /* ABCR -> r4 */
+
+       /* set ABCR[A_STRM_CNT] = 0 */
+       rlwinm  r4,r4,0,0,29
+
+       /* set ABCR[ARB_POLICY] to 0x1 (round-robin) */
+       addi    r0,r0,1
+       rlwimi  r4,r0,12,18,19
+
+       stw     r4,MCM_ABCR@l(r3)       /* r4 -> ABCR */
        sync
 
-       /* Don't use this feature due to bug in 8641D PD4 */
-       /* Disable ERD_DIS */
-       lis     r3, CFG_CCSRBAR@h
-       ori     r3, r3, 0x1008
-       lwz     r4, 0(r3)
+       /* Set DBCR[ERD_DIS] */
+       lis     r3,MCM_DBCR@ha
+       lwz     r4,MCM_DBCR@l(r3)
        oris    r4, r4, 0x4000
-       stw     r4, 0(r3)
+       stw     r4,MCM_DBCR@l(r3)
+       sync
+1:
+       /* setup the law entries */
+       bl      law_entry
        sync
 
+
 #if (EMULATOR_RUN == 1)
        /* On the emulator we want to adjust these ASAP */
        /* otherwise things are sloooow */