]> git.sur5r.net Git - u-boot/blobdiff - cpu/mpc86xx/start.S
Merge branch 'mpc86xx'
[u-boot] / cpu / mpc86xx / start.S
index 531bd0c5fbdbdcc367f8684f4eb27fe1548cadbb..e537dcb329b8f213433c71dbc23d48a342f85c97 100644 (file)
@@ -74,7 +74,7 @@
  * r4 - 2nd arg to board_init(): boot flag
  */
        .text
-       .long   0x27051956              /* U-Boot Magic Number          */
+       .long   0x27051956              /* U-Boot Magic Number */
        .globl  version_string
 version_string:
        .ascii  U_BOOT_VERSION
@@ -92,7 +92,7 @@ _start:
 
        .globl  _start_warm
 _start_warm:
-       li      r21, BOOTFLAG_WARM      /* Software reboot              */
+       li      r21, BOOTFLAG_WARM      /* Software reboot */
        b       boot_warm
        sync
 
@@ -183,7 +183,7 @@ boot_cold:
 boot_warm:
 
        /* if this is a multi-core system we need to check which cpu
-        * this is, if it is not cpu 0 send the cpu to the linux reset 
+        * this is, if it is not cpu 0 send the cpu to the linux reset
         * vector */
 #if (CONFIG_NUM_CPUS > 1)
        mfspr   r0, MSSCR0
@@ -194,7 +194,7 @@ boot_warm:
 
        bl      secondary_cpu_setup
 #endif
-       
+
        /* disable everything */
 1:     li      r0, 0
        mtspr   HID0, r0
@@ -202,21 +202,17 @@ boot_warm:
        mtmsr   0
        bl      invalidate_bats
        sync
-       
+
 #ifdef CFG_L2
        /* init the L2 cache */
        addis   r3, r0, L2_INIT@h
        ori     r3, r3, L2_INIT@l
-       sync
-       mtspr   l2cr, r3        
-#ifdef CONFIG_ALTIVEC
-       dssall
-#endif
+       mtspr   l2cr, r3
        /* invalidate the L2 cache */
        bl      l2cache_invalidate
        sync
 #endif
-       
+
        /*
         * Calculate absolute address in FLASH and jump there
         *------------------------------------------------------*/
@@ -235,7 +231,7 @@ in_flash:
 
        /* enable extended addressing */
        bl      enable_ext_addr
-       
+
        /* setup the bats */
        bl      setup_bats
        sync
@@ -244,7 +240,14 @@ in_flash:
        /* setup ccsrbar */
        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
        sync
@@ -276,17 +279,17 @@ in_flash:
        stw     r4, 0(r3)
        sync
 #endif
-#if 1  
+#if 1
        /* make sure timer enabled in guts register too */
        lis     r3, CFG_CCSRBAR@h
        oris    r3,r3, 0xE
-       ori     r3,r3,0x0070  /*Jason from 3*/
+       ori     r3,r3,0x0070
        lwz     r4, 0(r3)
-       lis     r5,0xFFFC     /*Jason from 0xffff*/
+       lis     r5,0xFFFC
        ori     r5,r5,0x5FFF
        and     r4,r4,r5
        stw     r4,0(r3)
-#endif 
+#endif
        /*
         * Cache must be enabled here for stack-in-cache trick.
         * This means we need to enable the BATS.
@@ -300,13 +303,13 @@ in_flash:
 
        /* enable and invalidate the data cache */
 /*     bl      l1dcache_enable */
-        bl      dcache_enable 
+        bl      dcache_enable
        sync
 
 #if 1
        bl      icache_enable
 #endif
-       
+
 #ifdef CFG_INIT_RAM_LOCK
        bl      lock_ram_in_cache
        sync
@@ -327,7 +330,7 @@ in_flash:
        bl      cpu_init_f
        sync
 
-#ifdef  RUN_DIAG        
+#ifdef  RUN_DIAG
 
         /* Sri:  Code to run the diagnostic automatically */
 
@@ -358,9 +361,9 @@ in_flash:
 
         /* Branch to diagnostic */
         blr
-        
-diag_done:      
-#endif        
+
+diag_done:
+#endif
 
   /*      bl      l2cache_enable*/
         mr     r3, r21
@@ -374,7 +377,7 @@ diag_done:
 
        .globl  invalidate_bats
 invalidate_bats:
-       
+
        /* invalidate BATs */
        mtspr   IBAT0U, r0
        mtspr   IBAT1U, r0
@@ -398,12 +401,12 @@ invalidate_bats:
        isync
        sync
        blr
-       
-       
+
+
        /* setup_bats - set them up to some initial state */
        .globl  setup_bats
 setup_bats:
-       
+
        addis   r0, r0, 0x0000
 
        /* IBAT 0 */
@@ -550,7 +553,7 @@ setup_bats:
        mtspr   DBAT7U, r3
        isync
 
-1:     
+1:
        addis   r3, 0, 0x0000
        addis   r5, 0, 0x4    /* upper bound of 0x00040000 for 7400/750 */
        isync
@@ -659,142 +662,140 @@ get_svr:
        blr
 
 
-/*------------------------------------------------------------------------------- */
-/* Function:    in8 */
-/* Description:         Input 8 bits */
-/*------------------------------------------------------------------------------- */
+/*
+ * Function:    in8
+ * Description:         Input 8 bits
+ */
        .globl  in8
 in8:
        lbz     r3,0x0000(r3)
        blr
 
-/*------------------------------------------------------------------------------- */
-/* Function:    out8 */
-/* Description:         Output 8 bits */
-/*------------------------------------------------------------------------------- */
+/*
+ * Function:    out8
+ * Description:         Output 8 bits
+ */
        .globl  out8
 out8:
        stb     r4,0x0000(r3)
        blr
 
-/*------------------------------------------------------------------------------- */
-/* Function:    out16 */
-/* Description:         Output 16 bits */
-/*------------------------------------------------------------------------------- */
+/*
+ * Function:    out16
+ * Description:         Output 16 bits
+ */
        .globl  out16
 out16:
        sth     r4,0x0000(r3)
        blr
 
-/*------------------------------------------------------------------------------- */
-/* Function:    out16r */
-/* Description:         Byte reverse and output 16 bits */
-/*------------------------------------------------------------------------------- */
+/*
+ * Function:    out16r
+ * Description:         Byte reverse and output 16 bits
+ */
        .globl  out16r
 out16r:
        sthbrx  r4,r0,r3
        blr
 
-/*------------------------------------------------------------------------------- */
-/* Function:    out32 */
-/* Description:         Output 32 bits */
-/*------------------------------------------------------------------------------- */
+/*
+ * Function:    out32
+ * Description:         Output 32 bits
+ */
        .globl  out32
 out32:
        stw     r4,0x0000(r3)
        blr
 
-/*------------------------------------------------------------------------------- */
-/* Function:    out32r */
-/* Description:         Byte reverse and output 32 bits */
-/*------------------------------------------------------------------------------- */
+/*
+ * Function:    out32r
+ * Description:         Byte reverse and output 32 bits
+ */
        .globl  out32r
 out32r:
        stwbrx  r4,r0,r3
        blr
 
-/*------------------------------------------------------------------------------- */
-/* Function:    in16 */
-/* Description:         Input 16 bits */
-/*------------------------------------------------------------------------------- */
+/*
+ * Function:    in16
+ * Description:         Input 16 bits
+ */
        .globl  in16
 in16:
        lhz     r3,0x0000(r3)
        blr
 
-/*------------------------------------------------------------------------------- */
-/* Function:    in16r */
-/* Description:         Input 16 bits and byte reverse */
-/*------------------------------------------------------------------------------- */
+/*
+ * Function:    in16r
+ * Description:         Input 16 bits and byte reverse
+ */
        .globl  in16r
 in16r:
        lhbrx   r3,r0,r3
        blr
 
-/*------------------------------------------------------------------------------- */
-/* Function:    in32 */
-/* Description:         Input 32 bits */
-/*------------------------------------------------------------------------------- */
+/*
+ * Function:    in32
+ * Description:         Input 32 bits
+ */
        .globl  in32
 in32:
        lwz     3,0x0000(3)
        blr
 
-/*------------------------------------------------------------------------------- */
-/* Function:    in32r */
-/* Description:         Input 32 bits and byte reverse */
-/*------------------------------------------------------------------------------- */
+/*
+ * Function:    in32r
+ * Description:         Input 32 bits and byte reverse
+ */
        .globl  in32r
 in32r:
        lwbrx   r3,r0,r3
        blr
 
-/*------------------------------------------------------------------------------- */
-/* Function:    ppcDcbf */
-/* Description:         Data Cache block flush */
-/* Input:       r3 = effective address */
-/* Output:      none. */
-/*------------------------------------------------------------------------------- */
+/*
+ * Function:    ppcDcbf
+ * Description:         Data Cache block flush
+ * Input:       r3 = effective address
+ * Output:      none.
+ */
        .globl  ppcDcbf
 ppcDcbf:
        dcbf    r0,r3
        blr
 
-/*------------------------------------------------------------------------------- */
-/* Function:    ppcDcbi */
-/* Description:         Data Cache block Invalidate */
-/* Input:       r3 = effective address */
-/* Output:      none. */
-/*------------------------------------------------------------------------------- */
+/*
+ * Function:    ppcDcbi
+ * Description:         Data Cache block Invalidate
+ * Input:       r3 = effective address
+ * Output:      none.
+ */
        .globl  ppcDcbi
 ppcDcbi:
        dcbi    r0,r3
        blr
 
-/*--------------------------------------------------------------------------
+/*
  * Function:    ppcDcbz
  * Description:         Data Cache block zero.
  * Input:       r3 = effective address
  * Output:      none.
- *-------------------------------------------------------------------------- */
-
+ */
        .globl  ppcDcbz
 ppcDcbz:
        dcbz    r0,r3
        blr
 
-/*------------------------------------------------------------------------------- */
-/* Function:    ppcSync */
-/* Description:         Processor Synchronize */
-/* Input:       none. */
-/* Output:      none. */
-/*------------------------------------------------------------------------------- */
+/*
+ * Function:    ppcSync
+ * Description:         Processor Synchronize
+ * Input:       none.
+ * Output:      none.
+ */
        .globl  ppcSync
 ppcSync:
        sync
        blr
-       
-/*-----------------------------------------------------------------------*/
+
 /*
  * void relocate_code (addr_sp, gd, addr_moni)
  *
@@ -811,8 +812,9 @@ relocate_code:
 
         mr     r1,  r3         /* Set new stack pointer                */
        mr      r9,  r4         /* Save copy of Global Data pointer     */
+       mr      r29, r9         /* Save for DECLARE_GLOBAL_DATA_PTR     */
        mr      r10, r5         /* Save copy of Destination Address     */
-        
+
        mr      r3,  r5                         /* Destination Address  */
        lis     r4, CFG_MONITOR_BASE@h          /* Source      Address  */
        ori     r4, r4, CFG_MONITOR_BASE@l
@@ -955,8 +957,9 @@ in_ram:
        cmplw   0, r3, r4
        bne     5b
 6:
-       mr      r3, r10         /* Destination Address          */
-       bl      after_reloc
+       mr      r3, r9          /* Init Date pointer            */
+       mr      r4, r10         /* Destination Address          */
+       bl      board_init_r
 
        /* not reached - end relocate_code */
 /*-----------------------------------------------------------------------*/
@@ -1057,7 +1060,7 @@ enable_ext_addr:
 
 #if (CFG_CCSRBAR_DEFAULT != CFG_CCSRBAR)
 .globl setup_ccsrbar
-setup_ccsrbar:         
+setup_ccsrbar:
        /* Special sequence needed to update CCSRBAR itself */
        lis     r4, CFG_CCSRBAR_DEFAULT@h
        ori     r4, r4, CFG_CCSRBAR_DEFAULT@l
@@ -1076,10 +1079,10 @@ setup_ccsrbar:
        lis     r3, CFG_CCSRBAR@h
        lwz     r5, CFG_CCSRBAR@l(r3)
        isync
-       
+
        blr
 #endif
-                       
+
 #ifdef CFG_INIT_RAM_LOCK
 lock_ram_in_cache:
        /* Allocate Initial RAM in data cache.
@@ -1115,7 +1118,7 @@ lock_ram_in_cache:
        isync
        blr
 #endif
-       
+
 .globl unlock_ram_in_cache
 unlock_ram_in_cache:
        /* invalidate the INIT_RAM section */
@@ -1141,7 +1144,7 @@ unlock_ram_in_cache:
        sync
        blr
 #endif
-#if 0  
+#if 0
        /* Unlock the first way of the data cache */
        mfspr   r0, LDSTCR
        li      r3,0x0080
@@ -1168,16 +1171,16 @@ unlock_ram_in_cache:
  * from Linux.  We'll do some basic cpu init and then pass
  * it to the Linux Reset Vector.
  * Sri:  Much of this initialization is not required. Linux
- * rewrites the bats, and the sprs and also enables the L1 cache.      
+ * rewrites the bats, and the sprs and also enables the L1 cache.
  */
 #if (CONFIG_NUM_CPUS > 1)
 .globl secondary_cpu_setup
-secondary_cpu_setup:   
+secondary_cpu_setup:
        /* Do only core setup on all cores except cpu0 */
        bl      invalidate_bats
        sync
        bl      enable_ext_addr
-       
+
 #ifdef CFG_L2
        /* init the L2 cache */
        addis   r3, r0, L2_INIT@h
@@ -1192,13 +1195,6 @@ secondary_cpu_setup:
        sync
 #endif
 
-       /* setup the bats */
-       bl      setup_bats
-       sync
-       /* enable address translation */
-       bl      enable_addr_trans
-       sync
-
        /* enable and invalidate the data cache */
        bl      dcache_enable
        sync
@@ -1206,35 +1202,26 @@ secondary_cpu_setup:
         /* enable and invalidate the instruction cache*/
         bl      icache_enable
         sync
-        
-        /* Set up MSR and HID0, HID1*/        
-               /* Enable interrupts */
-/*        mfmsr        r28     
-        li     r4,0
-       ori     r4,r4,MSR_EE
-        or      r28,r28,r4
-        mtmsr   r28
-  */      
 
         /* TBEN  in HID0 */
        mfspr   r4, HID0
-        oris    r4, r4, 0x0400 
+        oris    r4, r4, 0x0400
         mtspr   HID0, r4
         sync
         isync
-        
+
         /*SYNCBE|ABE in HID1*/
         mfspr  r4, HID1
-        ori     r4, r4, 0x0C00 
+        ori     r4, r4, 0x0C00
         mtspr   HID1, r4
         sync
         isync
-        
+
         lis    r3, CONFIG_LINUX_RESET_VEC@h
        ori     r3, r3, CONFIG_LINUX_RESET_VEC@l
        mtlr    r3
        blr
-       
-       /* Never Returns, Running in Linux Now */    
+
+       /* Never Returns, Running in Linux Now */
 #endif