]> git.ipfire.org Git - people/ms/u-boot.git/blobdiff - cpu/ppc4xx/start.S
Restructure POST directory to support of other CPUs, boards, etc.
[people/ms/u-boot.git] / cpu / ppc4xx / start.S
index 3473baafc505ad0b7299f1b1a197069c7ac7826b..6b2c170335910b159ad8eaec0d853f907ed202c6 100644 (file)
@@ -42,7 +42,7 @@
 /*      LICENSED MATERIAL  -  PROGRAM PROPERTY OF I B M */
 /*------------------------------------------------------------------------------- */
 
-/*  U-Boot - Startup Code for IBM 4xx PowerPC based Embedded Boards
+/*  U-Boot - Startup Code for AMCC 4xx PowerPC based Embedded Boards
  *
  *
  *  The processor starts at 0xfffffffc and the code is executed
 
        .extern ext_bus_cntlr_init
        .extern sdram_init
+#ifdef CONFIG_NAND_U_BOOT
+       .extern reconfig_tlb0
+#endif
 
 /*
  * Set up GOT: Global Offset Table
  *
  * Use r14 to access the GOT
  */
+#if !defined(CONFIG_NAND_SPL)
        START_GOT
        GOT_ENTRY(_GOT2_TABLE_)
        GOT_ENTRY(_FIXUP_TABLE_)
        GOT_ENTRY(_end)
        GOT_ENTRY(__bss_start)
        END_GOT
+#endif /* CONFIG_NAND_SPL */
+
+#if defined(CONFIG_NAND_U_BOOT) && !defined(CONFIG_NAND_SPL)
+       /*
+        * NAND U-Boot image is started from offset 0
+        */
+       .text
+       bl      reconfig_tlb0
+       GET_GOT
+       bl      cpu_init_f      /* run low-level CPU init code     (from Flash) */
+       bl      board_init_f
+#endif
 
 /*
  * 440 Startup -- on reset only the top 4k of the effective
  */
 
 #if defined(CONFIG_440)
+#if !defined(CONFIG_NAND_SPL)
     .section .bootpg,"ax"
+#endif
     .globl _start_440
 
 /**************************************************************************/
 _start_440:
+       /*--------------------------------------------------------------------+
+       | 440EPX BUP Change - Hardware team request
+       +--------------------------------------------------------------------*/
+#if defined(CONFIG_440EPX) || defined(CONFIG_440GRX)
+       sync
+       nop
+       nop
+#endif
+       /*----------------------------------------------------------------+
+       | Core bug fix.  Clear the esr
+       +-----------------------------------------------------------------*/
+       li      r0,0
+       mtspr   esr,r0
        /*----------------------------------------------------------------*/
        /* Clear and set up some registers. */
        /*----------------------------------------------------------------*/
-       iccci   r0,r0           /* NOTE: operands not used for 440 */
-       dccci   r0,r0           /* NOTE: operands not used for 440 */
+       iccci   r0,r0           /* NOTE: operands not used for 440 */
+       dccci   r0,r0           /* NOTE: operands not used for 440 */
        sync
        li      r0,0
        mtspr   srr0,r0
        mtspr   srr1,r0
        mtspr   csrr0,r0
        mtspr   csrr1,r0
-#if defined (CONFIG_440_GX) /* NOTE: 440GX adds machine check status regs */
-       mtspr   mcsrr0,r0
-       mtspr   mcsrr1,r0
-       mfspr   r1, mcsr
-       mtspr   mcsr,r1
+       /* NOTE: 440GX adds machine check status regs */
+#if defined(CONFIG_440) && !defined(CONFIG_440GP)
+       mtspr   mcsrr0,r0
+       mtspr   mcsrr1,r0
+       mfspr   r1,mcsr
+       mtspr   mcsr,r1
 #endif
+
+       /*----------------------------------------------------------------*/
+       /* CCR0 init */
+       /*----------------------------------------------------------------*/
+       /* Disable store gathering & broadcast, guarantee inst/data
+       * cache block touch, force load/store alignment
+       * (see errata 1.12: 440_33)
+       */
+       lis     r1,0x0030       /* store gathering & broadcast disable */
+       ori     r1,r1,0x6000    /* cache touch */
+       mtspr   ccr0,r1
+
        /*----------------------------------------------------------------*/
        /* Initialize debug */
        /*----------------------------------------------------------------*/
+       mfspr   r1,dbcr0
+       andis.  r1, r1, 0x8000  /* test DBCR0[EDM] bit                  */
+       bne     skip_debug_init /* if set, don't clear debug register   */
        mtspr   dbcr0,r0
        mtspr   dbcr1,r0
        mtspr   dbcr2,r0
@@ -188,29 +235,44 @@ _start_440:
 
        mfspr   r1,dbsr
        mtspr   dbsr,r1         /* Clear all valid bits */
-
-       /*----------------------------------------------------------------*/
-       /* CCR0 init */
-       /*----------------------------------------------------------------*/
-       /* Disable store gathering & broadcast, guarantee inst/data
-       * cache block touch, force load/store alignment
-       * (see errata 1.12: 440_33)
-       */
-       lis     r1,0x0030       /* store gathering & broadcast disable */
-       ori     r1,r1,0x6000    /* cache touch */
-       mtspr   ccr0,r1
+skip_debug_init:
+
+#if defined (CONFIG_440SPE)
+       /*----------------------------------------------------------------+
+       | Initialize Core Configuration Reg1.
+       | a. ICDPEI: Record even parity. Normal operation.
+       | b. ICTPEI: Record even parity. Normal operation.
+       | c. DCTPEI: Record even parity. Normal operation.
+       | d. DCDPEI: Record even parity. Normal operation.
+       | e. DCUPEI: Record even parity. Normal operation.
+       | f. DCMPEI: Record even parity. Normal operation.
+       | g. FCOM:   Normal operation
+       | h. MMUPEI: Record even parity. Normal operation.
+       | i. FFF:    Flush only as much data as necessary.
+       | j. TCS:    Timebase increments from CPU clock.
+       +-----------------------------------------------------------------*/
+       li      r0,0
+       mtspr   ccr1, r0
+
+       /*----------------------------------------------------------------+
+       | Reset the timebase.
+       | The previous write to CCR1 sets the timebase source.
+       +-----------------------------------------------------------------*/
+       mtspr   tbl, r0
+       mtspr   tbu, r0
+#endif
 
        /*----------------------------------------------------------------*/
        /* Setup interrupt vectors */
        /*----------------------------------------------------------------*/
        mtspr   ivpr,r0         /* Vectors start at 0x0000_0000 */
-       li      r1,0x0100
+       li      r1,0x0100
        mtspr   ivor0,r1        /* Critical input */
-       li      r1,0x0200
+       li      r1,0x0200
        mtspr   ivor1,r1        /* Machine check */
-       li      r1,0x0300
+       li      r1,0x0300
        mtspr   ivor2,r1        /* Data storage */
-       li      r1,0x0400
+       li      r1,0x0400
        mtspr   ivor3,r1        /* Instruction storage */
        li      r1,0x0500
        mtspr   ivor4,r1        /* External interrupt */
@@ -261,20 +323,47 @@ _start_440:
        mtspr   ivlim,r1
        mtspr   dvlim,r1
 
+       /*----------------------------------------------------------------+
+       |Initialize MMUCR[STID] = 0.
+       +-----------------------------------------------------------------*/
+       mfspr   r0,mmucr
+       addis   r1,0,0xFFFF
+       ori     r1,r1,0xFF00
+       and     r0,r0,r1
+       mtspr   mmucr,r0
+
        /*----------------------------------------------------------------*/
        /* Clear all TLB entries -- TID = 0, TS = 0 */
        /*----------------------------------------------------------------*/
-       mtspr   mmucr,r0
+       addis   r0,0,0x0000
        li      r1,0x003f       /* 64 TLB entries */
        mtctr   r1
-0:     tlbwe   r0,r1,0x0000    /* Invalidate all entries (V=0)*/
+rsttlb:        tlbwe   r0,r1,0x0000    /* Invalidate all entries (V=0)*/
+       tlbwe   r0,r1,0x0001
+       tlbwe   r0,r1,0x0002
        subi    r1,r1,0x0001
-       bdnz    0b
+       bdnz    rsttlb
 
        /*----------------------------------------------------------------*/
        /* TLB entry setup -- step thru tlbtab */
        /*----------------------------------------------------------------*/
+#if defined(CONFIG_440SPE)
+       /*----------------------------------------------------------------*/
+       /* We have different TLB tables for revA and rev B of 440SPe */
+       /*----------------------------------------------------------------*/
+       mfspr   r1, PVR
+       lis     r0,0x5342
+       ori     r0,r0,0x1891
+       cmpw    r7,r1,r0
+       bne     r7,..revA
+       bl      tlbtabB
+       b       ..goon
+..revA:
+       bl      tlbtabA
+..goon:
+#else
        bl      tlbtab          /* Get tlbtab pointer */
+#endif
        mr      r5,r0
        li      r1,0x003f       /* 64 TLB entries max */
        mtctr   r1
@@ -295,7 +384,53 @@ _start_440:
        /*----------------------------------------------------------------*/
        /* Continue from 'normal' start */
        /*----------------------------------------------------------------*/
-2:     bl      3f
+2:
+
+#if defined(CONFIG_NAND_SPL)
+       /*
+        * Enable internal SRAM
+        */
+       lis     r2,0x7fff
+       ori     r2,r2,0xffff
+       mfdcr   r1,isram0_dpc
+       and     r1,r1,r2                /* Disable parity check */
+       mtdcr   isram0_dpc,r1
+       mfdcr   r1,isram0_pmeg
+       and     r1,r1,r2                /* Disable pwr mgmt */
+       mtdcr   isram0_pmeg,r1
+
+       /*
+        * Copy SPL from cache into internal SRAM
+        */
+       li      r4,(CFG_NAND_BOOT_SPL_SIZE >> 2) - 1
+       mtctr   r4
+       lis     r2,CFG_NAND_BOOT_SPL_SRC@h
+       ori     r2,r2,CFG_NAND_BOOT_SPL_SRC@l
+       lis     r3,CFG_NAND_BOOT_SPL_DST@h
+       ori     r3,r3,CFG_NAND_BOOT_SPL_DST@l
+spl_loop:
+       lwzu    r4,4(r2)
+       stwu    r4,4(r3)
+       bdnz    spl_loop
+
+       /*
+        * Jump to code in RAM
+        */
+       bl      00f
+00:    mflr    r10
+       lis     r3,(CFG_NAND_BOOT_SPL_SRC - CFG_NAND_BOOT_SPL_DST)@h
+       ori     r3,r3,(CFG_NAND_BOOT_SPL_SRC - CFG_NAND_BOOT_SPL_DST)@l
+       sub     r10,r10,r3
+       addi    r10,r10,28
+       mtlr    r10
+       blr
+
+start_ram:
+       sync
+       isync
+#endif
+
+       bl      3f
        b       _start
 
 3:     li      r0,0
@@ -309,6 +444,7 @@ _start_440:
  * r3 - 1st arg to board_init(): IMMP pointer
  * r4 - 2nd arg to board_init(): boot flag
  */
+#ifndef CONFIG_NAND_SPL
        .text
        .long   0x27051956              /* U-Boot Magic Number                  */
        .globl  version_string
@@ -322,6 +458,7 @@ version_string:
  * location (0x100) is where the CriticalInput Execption should be.
  */
        . = EXC_OFF_SYS_RESET
+#endif
        .globl  _start
 _start:
 
@@ -340,23 +477,6 @@ _start:
        mtspr   tcr,r0                  /* disable all */
        mtspr   esr,r0                  /* clear exception syndrome register */
        mtxer   r0                      /* clear integer exception register */
-#if !defined(CONFIG_440_GX)
-       lis     r1,0x0002               /* set CE bit (Critical Exceptions) */
-       ori     r1,r1,0x1000            /* set ME bit (Machine Exceptions) */
-       mtmsr   r1                      /* change MSR */
-#else
-       bl      __440gx_msr_set
-       b       __440gx_msr_continue
-
-__440gx_msr_set:
-       lis     r1, 0x0002              /* set CE bit (Critical Exceptions) */
-       ori     r1,r1,0x1000    /* set ME bit (Machine Exceptions) */
-       mtspr   srr1,r1
-       mflr    r1
-       mtspr   srr0,r1
-       rfi
-__440gx_msr_continue:
-#endif
 
        /*----------------------------------------------------------------*/
        /* Debug setup -- some (not very good) ice's need an event*/
@@ -377,44 +497,79 @@ __440gx_msr_continue:
        /* Setup the internal SRAM */
        /*----------------------------------------------------------------*/
        li      r0,0
-#if defined (CONFIG_440_GX)
-       mtdcr   l2_cache_cfg,r0         /* Ensure L2 Cache is off */
+
+#ifdef CFG_INIT_RAM_DCACHE
+       /* Clear Dcache to use as RAM */
+       addis   r3,r0,CFG_INIT_RAM_ADDR@h
+       ori     r3,r3,CFG_INIT_RAM_ADDR@l
+       addis   r4,r0,CFG_INIT_RAM_END@h
+       ori     r4,r4,CFG_INIT_RAM_END@l
+       rlwinm. r5,r4,0,27,31
+       rlwinm  r5,r4,27,5,31
+       beq     ..d_ran
+       addi    r5,r5,0x0001
+..d_ran:
+       mtctr   r5
+..d_ag:
+       dcbz    r0,r3
+       addi    r3,r3,32
+       bdnz    ..d_ag
+#endif /* CFG_INIT_RAM_DCACHE */
+
+       /* 440EP & 440GR are only 440er PPC's without internal SRAM */
+#if !defined(CONFIG_440EP) && !defined(CONFIG_440GR)
+       /* not all PPC's have internal SRAM usable as L2-cache */
+#if defined(CONFIG_440GX) || defined(CONFIG_440SP) || defined(CONFIG_440SPE)
+       mtdcr   l2_cache_cfg,r0         /* Ensure L2 Cache is off */
 #endif
-       mtdcr   isram0_sb1cr,r0         /* Disable bank 1 */
 
-       li      r2,0x7fff
+       lis     r2,0x7fff
        ori     r2,r2,0xffff
        mfdcr   r1,isram0_dpc
        and     r1,r1,r2                /* Disable parity check */
        mtdcr   isram0_dpc,r1
        mfdcr   r1,isram0_pmeg
-       andis.  r1,r1,r2                /* Disable pwr mgmt */
+       and     r1,r1,r2                /* Disable pwr mgmt */
        mtdcr   isram0_pmeg,r1
 
        lis     r1,0x8000               /* BAS = 8000_0000 */
-#if defined(CONFIG_440_GX)
+#if defined(CONFIG_440GX) || defined(CONFIG_440SP)
        ori     r1,r1,0x0980            /* first 64k */
-       mtdcr   isram0_sb0cr,r1
+       mtdcr   isram0_sb0cr,r1
        lis     r1,0x8001
        ori     r1,r1,0x0980            /* second 64k */
-       mtdcr   isram0_sb1cr,r1
+       mtdcr   isram0_sb1cr,r1
        lis     r1, 0x8002
        ori     r1,r1, 0x0980           /* third 64k */
-       mtdcr   isram0_sb2cr,r1
+       mtdcr   isram0_sb2cr,r1
        lis     r1, 0x8003
        ori     r1,r1, 0x0980           /* fourth 64k */
-       mtdcr   isram0_sb3cr,r1
-#else
+       mtdcr   isram0_sb3cr,r1
+#elif defined(CONFIG_440SPE)
+       lis     r1,0x0000               /* BAS = 0000_0000 */
+       ori     r1,r1,0x0984            /* first 64k */
+       mtdcr   isram0_sb0cr,r1
+       lis     r1,0x0001
+       ori     r1,r1,0x0984            /* second 64k */
+       mtdcr   isram0_sb1cr,r1
+       lis     r1, 0x0002
+       ori     r1,r1, 0x0984           /* third 64k */
+       mtdcr   isram0_sb2cr,r1
+       lis     r1, 0x0003
+       ori     r1,r1, 0x0984           /* fourth 64k */
+       mtdcr   isram0_sb3cr,r1
+#elif defined(CONFIG_440GP)
        ori     r1,r1,0x0380            /* 8k rw */
        mtdcr   isram0_sb0cr,r1
+       mtdcr   isram0_sb1cr,r0         /* Disable bank 1 */
 #endif
+#endif /* #if !defined(CONFIG_440EP) && !defined(CONFIG_440GR) */
 
        /*----------------------------------------------------------------*/
        /* Setup the stack in internal SRAM */
        /*----------------------------------------------------------------*/
        lis     r1,CFG_INIT_RAM_ADDR@h
        ori     r1,r1,CFG_INIT_SP_OFFSET@l
-
        li      r0,0
        stwu    r0,-4(r1)
        stwu    r0,-4(r1)               /* Terminate call chain */
@@ -425,8 +580,14 @@ __440gx_msr_continue:
        stwu    r1,-8(r1)               /* Save back chain and move SP */
        stw     r0,+12(r1)              /* Save return addr (underflow vect) */
 
+#ifdef CONFIG_NAND_SPL
+       bl      nand_boot               /* will not return */
+#else
        GET_GOT
+
+       bl      cpu_init_f      /* run low-level CPU init code     (from Flash) */
        bl      board_init_f
+#endif
 
 #endif /* CONFIG_440 */
 
@@ -439,9 +600,6 @@ __440gx_msr_continue:
        mtspr   esr,r0                  /* clear Exception Syndrome Reg */
        mttcr   r0                      /* timer control register */
        mtexier r0                      /* disable all interrupts */
-       addi    r4,r0,0x1000            /* set ME bit (Machine Exceptions) */
-       oris    r4,r4,0x2               /* set CE bit (Critical Exceptions) */
-       mtmsr   r4                      /* change MSR */
        addis   r4,r0,0xFFFF            /* set r4 to 0xFFFFFFFF (status in the */
        ori     r4,r4,0xFFFF            /* dbsr is cleared by setting bits to 1) */
        mtdbsr  r4                      /* clear/reset the dbsr */
@@ -552,9 +710,6 @@ __440gx_msr_continue:
        mttcr   r4                      /* clear Timer Control Reg */
        mtxer   r4                      /* clear Fixed-Point Exception Reg */
        mtevpr  r4                      /* clear Exception Vector Prefix Reg */
-       addi    r4,r0,0x1000            /* set ME bit (Machine Exceptions) */
-       oris    r4,r4,0x0002            /* set CE bit (Critical Exceptions) */
-       mtmsr   r4                      /* change MSR */
        addi    r4,r0,(0xFFFF-0x10000)          /* set r4 to 0xFFFFFFFF (status in the */
                                        /* dbsr is cleared by setting bits to 1) */
        mtdbsr  r4                      /* clear/reset the dbsr */
@@ -592,11 +747,11 @@ __440gx_msr_continue:
        /*----------------------------------------------------------------------- */
        /* DMA Status, clear to come up clean */
        /*----------------------------------------------------------------------- */
-       addis   r3,r0, 0xFFFF         /* Clear all existing DMA status */
-       ori     r3,r3, 0xFFFF
-       mtdcr   dmasr, r3
+       addis   r3,r0, 0xFFFF         /* Clear all existing DMA status */
+       ori     r3,r3, 0xFFFF
+       mtdcr   dmasr, r3
 
-       bl      ppc405ep_init         /* do ppc405ep specific init */
+       bl      ppc405ep_init         /* do ppc405ep specific init */
 #endif /* CONFIG_405EP */
 
 #if defined(CFG_OCM_DATA_ADDR) && defined(CFG_OCM_DATA_SIZE)
@@ -606,7 +761,7 @@ __440gx_msr_continue:
        /* Setup OCM */
        lis     r0, 0x7FFF
        ori     r0, r0, 0xFFFF
-       mfdcr   r3, ocmiscntl           /* get instr-side IRAM config */
+       mfdcr   r3, ocmiscntl           /* get instr-side IRAM config */
        mfdcr   r4, ocmdscntl   /* get data-side IRAM config */
        and     r3, r3, r0      /* disable data-side IRAM */
        and     r4, r4, r0      /* disable data-side IRAM */
@@ -648,13 +803,13 @@ __440gx_msr_continue:
        /* set stack pointer and clear stack to known value */
 
        lis     r1,CFG_INIT_RAM_ADDR@h
-       ori     r1,r1,CFG_INIT_SP_OFFSET@l
+       ori     r1,r1,CFG_INIT_SP_OFFSET@l
 
        li      r4,2048                 /* we store 2048 words to stack */
        mtctr   r4
 
        lis     r2,CFG_INIT_RAM_ADDR@h          /* we also clear data area */
-       ori     r2,r2,CFG_INIT_RAM_END@l        /* so cant copy value from r1 */
+       ori     r2,r2,CFG_INIT_RAM_END@l        /* so cant copy value from r1 */
 
        lis     r4,0xdead               /* we store 0xdeaddead in the stack */
        ori     r4,r4,0xdead
@@ -703,7 +858,7 @@ __440gx_msr_continue:
 #endif /* CFG_INIT_DCACHE_CS */
 
        /*----------------------------------------------------------------------- */
-       /* Initialize SDRAM Controller  */
+       /* Initialize SDRAM Controller  */
        /*----------------------------------------------------------------------- */
        bl      sdram_init
 
@@ -729,11 +884,11 @@ __440gx_msr_continue:
        ori     r0, r0, RESET_VECTOR@l
        stwu    r1, -8(r1)              /* Save back chain and move SP */
        stw     r0, +12(r1)             /* Save return addr (underflow vect) */
-#endif /* !(CFG_INIT_DCACHE_CS  || !CFG_TEM_STACK_OCM) */
+#endif /* !(CFG_INIT_DCACHE_CS || !CFG_TEM_STACK_OCM) */
 
        GET_GOT                 /* initialize GOT access                        */
 
-       bl      cpu_init_f      /* run low-level CPU init code     (from Flash) */
+       bl      cpu_init_f      /* run low-level CPU init code     (from Flash) */
 
        /* NEVER RETURNS! */
        bl      board_init_f    /* run first part of init code (from Flash)     */
@@ -742,6 +897,7 @@ __440gx_msr_continue:
        /*----------------------------------------------------------------------- */
 
 
+#ifndef CONFIG_NAND_SPL
 /*****************************************************************************/
        .globl  _start_of_vectors
 _start_of_vectors:
@@ -947,6 +1103,7 @@ crit_return:
        lwz     r1,GPR1(r1)
        SYNC
        rfci
+#endif /* CONFIG_NAND_SPL */
 
 /* Cache functions.
 */
@@ -957,12 +1114,8 @@ invalidate_icache:
 invalidate_dcache:
        addi    r6,0,0x0000             /* clear GPR 6 */
        /* Do loop for # of dcache congruence classes. */
-#if defined(CONFIG_440_GX)
-       lis     r7, (CFG_DCACHE_SIZE / CFG_CACHELINE_SIZE / 2)@ha       /* TBS for large sized cache */
-       ori     r7, r7, (CFG_DCACHE_SIZE / CFG_CACHELINE_SIZE / 2)@l
-#else
-       addi    r7,r0, (CFG_DCACHE_SIZE / CFG_CACHELINE_SIZE / 2)
-#endif
+       lis     r7, (CFG_DCACHE_SIZE / CFG_CACHELINE_SIZE / 2)@ha       /* TBS for large sized cache */
+       ori     r7, r7, (CFG_DCACHE_SIZE / CFG_CACHELINE_SIZE / 2)@l
                                        /* NOTE: dccci invalidates both */
        mtctr   r7                      /* ways in the D cache */
 ..dcloop:
@@ -983,17 +1136,12 @@ flush_dcache:
        mtdccr  r10
 
        /* do loop for # of congruence classes. */
-#if defined(CONFIG_440_GX)
-       lis     r10,(CFG_DCACHE_SIZE / CFG_CACHELINE_SIZE / 2)@ha       /* TBS: for large cache sizes */
-       ori     r10,r10,(CFG_DCACHE_SIZE / CFG_CACHELINE_SIZE / 2)@l
-       lis     r11,(CFG_DCACHE_SIZE / 2)@ha /* D cache set size - 2 way sets */
-       ori     r11,r11,(CFG_DCACHE_SIZE / 2)@l /* D cache set size - 2 way sets */
-#else
-       addi    r10,r0,(CFG_DCACHE_SIZE / CFG_CACHELINE_SIZE / 2)
-       addi    r11,r0,(CFG_DCACHE_SIZE / 2) /* D cache set size - 2 way sets */
-#endif
+       lis     r10,(CFG_DCACHE_SIZE / CFG_CACHELINE_SIZE / 2)@ha       /* TBS: for large cache sizes */
+       ori     r10,r10,(CFG_DCACHE_SIZE / CFG_CACHELINE_SIZE / 2)@l
+       lis     r11,(CFG_DCACHE_SIZE / 2)@ha /* D cache set size - 2 way sets */
+       ori     r11,r11,(CFG_DCACHE_SIZE / 2)@l /* D cache set size - 2 way sets */
        mtctr   r10
-       addi    r10,r0,(0xE000-0x10000) /* start at 0xFFFFE000 */
+       addi    r10,r0,(0xE000-0x10000) /* start at 0xFFFFE000 */
        add     r11,r10,r11             /* add to get to other side of cache line */
 ..flush_dcache_loop:
        lwz     r3,0(r10)               /* least recently used side */
@@ -1197,6 +1345,7 @@ ppcSync:
 
 /*------------------------------------------------------------------------------*/
 
+#ifndef CONFIG_NAND_SPL
 /*
  * void relocate_code (addr_sp, gd, addr_moni)
  *
@@ -1210,6 +1359,24 @@ ppcSync:
  */
        .globl  relocate_code
 relocate_code:
+#if defined(CONFIG_440EP) || defined(CONFIG_440GR) || \
+    defined(CONFIG_440EPX) || defined(CONFIG_440GRX) || \
+    defined(CONFIG_440SPE)
+       /*
+        * On some 440er platforms the cache is enabled in the first TLB (Boot-CS)
+        * to speed up the boot process. Now this cache needs to be disabled.
+        */
+       iccci   0,0                     /* Invalidate inst cache */
+       dccci   0,0                     /* Invalidate data cache, now no longer our stack */
+       sync
+       isync
+       addi    r1,r0,0x0000            /* TLB entry #0 */
+       tlbre   r0,r1,0x0002            /* Read contents */
+       ori     r0,r0,0x0c00            /* Or in the inhibit, write through bit */
+       tlbwe   r0,r1,0x0002            /* Save it out */
+       sync
+       isync
+#endif
        mr      r1,  r3         /* Set new stack pointer                */
        mr      r9,  r4         /* Save copy of Init Data pointer       */
        mr      r10, r5         /* Save copy of Destination Address     */
@@ -1409,6 +1576,24 @@ trap_init:
        cmplw   0, r7, r8
        blt     4b
 
+#if !defined(CONFIG_440)
+       addi    r7,r0,0x1000            /* set ME bit (Machine Exceptions) */
+       oris    r7,r7,0x0002            /* set CE bit (Critical Exceptions) */
+       mtmsr   r7                      /* change MSR */
+#else
+       bl      __440_msr_set
+       b       __440_msr_continue
+
+__440_msr_set:
+       addi    r7,r0,0x1000            /* set ME bit (Machine Exceptions) */
+       oris    r7,r7,0x0002            /* set CE bit (Critical Exceptions) */
+       mtspr   srr1,r7
+       mflr    r7
+       mtspr   srr0,r7
+       rfi
+__440_msr_continue:
+#endif
+
        mtlr    r4                      /* restore link register        */
        blr
 
@@ -1425,15 +1610,16 @@ trap_reloc:
        stw     r0, 4(r7)
 
        blr
+#endif /* CONFIG_NAND_SPL */
 
 
 /**************************************************************************/
-/* PPC405EP specific stuff                                                */
+/* PPC405EP specific stuff                                               */
 /**************************************************************************/
 #ifdef CONFIG_405EP
 ppc405ep_init:
 
-#ifdef CONFIG_BUBINGA405EP
+#ifdef CONFIG_BUBINGA
        /*
         * Initialize EBC chip selects 1 & 4 and GPIO pins (for alternate
         * function) to support FPGA and NVRAM accesses below.
@@ -1512,43 +1698,47 @@ ppc405ep_init:
        mtdcr   ebccfgd,r3
 #endif
 
-       addi    r3,0,CPC0_PCI_HOST_CFG_EN
-#ifdef CONFIG_BUBINGA405EP
+#ifndef CFG_CPC0_PCI
+       li      r3,CPC0_PCI_HOST_CFG_EN
+#ifdef CONFIG_BUBINGA
        /*
        !-----------------------------------------------------------------------
        ! Check FPGA for PCI internal/external arbitration
        !   If board is set to internal arbitration, update cpc0_pci
        !-----------------------------------------------------------------------
        */
-       addis   r5,r0,FPGA_REG1@h      /* set offset for FPGA_REG1 */
-       ori     r5,r5,FPGA_REG1@l
-       lbz     r5,0x0(r5)              /* read to get PCI arb selection */
-       andi.   r6,r5,FPGA_REG1_PCI_INT_ARB  /* using internal arbiter ?*/
-       beq     ..pci_cfg_set             /* if not set, then bypass reg write*/
+       addis   r5,r0,FPGA_REG1@h      /* set offset for FPGA_REG1 */
+       ori     r5,r5,FPGA_REG1@l
+       lbz     r5,0x0(r5)              /* read to get PCI arb selection */
+       andi.   r6,r5,FPGA_REG1_PCI_INT_ARB  /* using internal arbiter ?*/
+       beq     ..pci_cfg_set             /* if not set, then bypass reg write*/
 #endif
-       ori     r3,r3,CPC0_PCI_ARBIT_EN
+       ori     r3,r3,CPC0_PCI_ARBIT_EN
+#else /* CFG_CPC0_PCI */
+       li      r3,CFG_CPC0_PCI
+#endif /* CFG_CPC0_PCI */
 ..pci_cfg_set:
-       mtdcr   CPC0_PCI, r3             /* Enable internal arbiter*/
+       mtdcr   CPC0_PCI, r3             /* Enable internal arbiter*/
 
        /*
        !-----------------------------------------------------------------------
        ! Check to see if chip is in bypass mode.
        ! If so, write stored CPC0_PLLMR0 and CPC0_PLLMR1 values and perform a
        ! CPU reset   Otherwise, skip this step and keep going.
-       ! Note:  Running BIOS in bypass mode is not supported since PLB speed
-       !        will not be fast enough for the SDRAM (min 66MHz)
+       ! Note:  Running BIOS in bypass mode is not supported since PLB speed
+       !        will not be fast enough for the SDRAM (min 66MHz)
        !-----------------------------------------------------------------------
        */
-       mfdcr   r5, CPC0_PLLMR1
-       rlwinm  r4,r5,1,0x1            /* get system clock source (SSCS) */
-       cmpi    cr0,0,r4,0x1
+       mfdcr   r5, CPC0_PLLMR1
+       rlwinm  r4,r5,1,0x1            /* get system clock source (SSCS) */
+       cmpi    cr0,0,r4,0x1
 
-       beq    pll_done                   /* if SSCS =b'1' then PLL has */
+       beq    pll_done                   /* if SSCS =b'1' then PLL has */
                                          /* already been set */
                                          /* and CPU has been reset */
                                          /* so skip to next section */
 
-#ifdef CONFIG_BUBINGA405EP
+#ifdef CONFIG_BUBINGA
        /*
        !-----------------------------------------------------------------------
        ! Read NVRAM to get value to write in PLLMR.
@@ -1557,40 +1747,40 @@ ppc405ep_init:
        ! See CPU_DEFAULT_200 and CPU_DEFAULT_266 above.
        !
        ! WARNING:  This code assumes the first three words in the nvram_t
-       !           structure in openbios.h.  Changing the beginning of
-       !           the structure will break this code.
+       !           structure in openbios.h.  Changing the beginning of
+       !           the structure will break this code.
        !
        !-----------------------------------------------------------------------
        */
-       addis   r3,0,NVRAM_BASE@h
-       addi    r3,r3,NVRAM_BASE@l
-
-       lwz     r4, 0(r3)
-       addis   r5,0,NVRVFY1@h
-       addi    r5,r5,NVRVFY1@l
-       cmp     cr0,0,r4,r5            /* Compare 1st NVRAM Magic number*/
-       bne     ..no_pllset
-       addi    r3,r3,4
-       lwz     r4, 0(r3)
-       addis   r5,0,NVRVFY2@h
-       addi    r5,r5,NVRVFY2@l
-       cmp     cr0,0,r4,r5            /* Compare 2 NVRAM Magic number */
-       bne     ..no_pllset
-       addi    r3,r3,8                 /* Skip over conf_size */
-       lwz     r4, 4(r3)               /* Load PLLMR1 value from NVRAM */
-       lwz     r3, 0(r3)               /* Load PLLMR0 value from NVRAM */
-       rlwinm  r5,r4,1,0x1             /* get system clock source (SSCS) */
-       cmpi     cr0,0,r5,1             /* See if PLL is locked */
-       beq     pll_write
+       addis   r3,0,NVRAM_BASE@h
+       addi    r3,r3,NVRAM_BASE@l
+
+       lwz     r4, 0(r3)
+       addis   r5,0,NVRVFY1@h
+       addi    r5,r5,NVRVFY1@l
+       cmp     cr0,0,r4,r5            /* Compare 1st NVRAM Magic number*/
+       bne     ..no_pllset
+       addi    r3,r3,4
+       lwz     r4, 0(r3)
+       addis   r5,0,NVRVFY2@h
+       addi    r5,r5,NVRVFY2@l
+       cmp     cr0,0,r4,r5            /* Compare 2 NVRAM Magic number */
+       bne     ..no_pllset
+       addi    r3,r3,8                 /* Skip over conf_size */
+       lwz     r4, 4(r3)               /* Load PLLMR1 value from NVRAM */
+       lwz     r3, 0(r3)               /* Load PLLMR0 value from NVRAM */
+       rlwinm  r5,r4,1,0x1             /* get system clock source (SSCS) */
+       cmpi     cr0,0,r5,1             /* See if PLL is locked */
+       beq     pll_write
 ..no_pllset:
-#endif /* CONFIG_BUBINGA405EP */
+#endif /* CONFIG_BUBINGA */
 
-       addis   r3,0,PLLMR0_DEFAULT@h       /* PLLMR0 default value */
-       ori     r3,r3,PLLMR0_DEFAULT@l     /* */
-       addis   r4,0,PLLMR1_DEFAULT@h       /* PLLMR1 default value */
-       ori     r4,r4,PLLMR1_DEFAULT@l     /* */
+       addis   r3,0,PLLMR0_DEFAULT@h       /* PLLMR0 default value */
+       ori     r3,r3,PLLMR0_DEFAULT@l     /* */
+       addis   r4,0,PLLMR1_DEFAULT@h       /* PLLMR1 default value */
+       ori     r4,r4,PLLMR1_DEFAULT@l     /* */
 
-       b       pll_write                 /* Write the CPC0_PLLMR with new value */
+       b       pll_write                 /* Write the CPC0_PLLMR with new value */
 
 pll_done:
        /*
@@ -1599,27 +1789,27 @@ pll_done:
        ! This is needed to enable PCI if not booting from serial EPROM
        !-----------------------------------------------------------------------
                */
-       addi    r3, 0, 0x0
-       mtdcr   CPC0_SRR, r3
+       addi    r3, 0, 0x0
+       mtdcr   CPC0_SRR, r3
 
-       addis    r3,0,0x0010
-       mtctr   r3
+       addis    r3,0,0x0010
+       mtctr   r3
 pci_wait:
-       bdnz    pci_wait
+       bdnz    pci_wait
 
        blr                               /* return to main code */
 
 /*
 !-----------------------------------------------------------------------------
-! Function:     pll_write
-! Description:  Updates the value of the CPC0_PLLMR according to CMOS27E documentation
-!               That is:
-!                         1.  Pll is first disabled (de-activated by putting in bypass mode)
-!                         2.  PLL is reset
-!                         3.  Clock dividers are set while PLL is held in reset and bypassed
-!                         4.  PLL Reset is cleared
-!                         5.  Wait 100us for PLL to lock
-!                         6.  A core reset is performed
+! Function:    pll_write
+! Description: Updates the value of the CPC0_PLLMR according to CMOS27E documentation
+!              That is:
+!                        1.  Pll is first disabled (de-activated by putting in bypass mode)
+!                        2.  PLL is reset
+!                        3.  Clock dividers are set while PLL is held in reset and bypassed
+!                        4.  PLL Reset is cleared
+!                        5.  Wait 100us for PLL to lock
+!                        6.  A core reset is performed
 ! Input: r3 = Value to write to CPC0_PLLMR0
 ! Input: r4 = Value to write to CPC0_PLLMR1
 ! Output r3 = none
@@ -1628,41 +1818,141 @@ pci_wait:
 pll_write:
        mfdcr  r5, CPC0_UCR
        andis. r5,r5,0xFFFF
-       ori    r5,r5,0x0101              /* Stop the UART clocks */
-       mtdcr  CPC0_UCR,r5               /* Before changing PLL */
+       ori    r5,r5,0x0101              /* Stop the UART clocks */
+       mtdcr  CPC0_UCR,r5               /* Before changing PLL */
 
        mfdcr  r5, CPC0_PLLMR1
-       rlwinm r5,r5,0,0x7FFFFFFF        /* Disable PLL */
-       mtdcr   CPC0_PLLMR1,r5
-       oris   r5,r5,0x4000              /* Set PLL Reset */
-       mtdcr   CPC0_PLLMR1,r5
-
-       mtdcr   CPC0_PLLMR0,r3           /* Set clock dividers */
-       rlwinm r5,r4,0,0x3FFFFFFF        /* Reset & Bypass new PLL dividers */
-       oris   r5,r5,0x4000              /* Set PLL Reset */
-       mtdcr   CPC0_PLLMR1,r5           /* Set clock dividers */
-       rlwinm r5,r5,0,0xBFFFFFFF        /* Clear PLL Reset */
-       mtdcr   CPC0_PLLMR1,r5
+       rlwinm r5,r5,0,0x7FFFFFFF        /* Disable PLL */
+       mtdcr   CPC0_PLLMR1,r5
+       oris   r5,r5,0x4000              /* Set PLL Reset */
+       mtdcr   CPC0_PLLMR1,r5
+
+       mtdcr   CPC0_PLLMR0,r3           /* Set clock dividers */
+       rlwinm r5,r4,0,0x3FFFFFFF        /* Reset & Bypass new PLL dividers */
+       oris   r5,r5,0x4000              /* Set PLL Reset */
+       mtdcr   CPC0_PLLMR1,r5           /* Set clock dividers */
+       rlwinm r5,r5,0,0xBFFFFFFF        /* Clear PLL Reset */
+       mtdcr   CPC0_PLLMR1,r5
 
                /*
        ! Wait min of 100us for PLL to lock.
        ! See CMOS 27E databook for more info.
        ! At 200MHz, that means waiting 20,000 instructions
                 */
-       addi    r3,0,20000              /* 2000 = 0x4e20 */
-       mtctr   r3
+       addi    r3,0,20000              /* 2000 = 0x4e20 */
+       mtctr   r3
 pll_wait:
-       bdnz    pll_wait
+       bdnz    pll_wait
 
-       oris   r5,r5,0x8000             /* Enable PLL */
-       mtdcr   CPC0_PLLMR1,r5          /* Engage */
+       oris   r5,r5,0x8000             /* Enable PLL */
+       mtdcr   CPC0_PLLMR1,r5          /* Engage */
 
        /*
         * Reset CPU to guarantee timings are OK
         * Not sure if this is needed...
         */
        addis r3,0,0x1000
-       mtspr dbcr0,r3               /* This will cause a CPU core reset, and */
+       mtspr dbcr0,r3               /* This will cause a CPU core reset, and */
                                     /* execution will continue from the poweron */
                                     /* vector of 0xfffffffc */
 #endif /* CONFIG_405EP */
+
+#if defined(CONFIG_440)
+#define function_prolog(func_name)      .text; \
+                                       .align 2; \
+                                       .globl func_name; \
+                                       func_name:
+#define function_epilog(func_name)      .type func_name,@function; \
+                                       .size func_name,.-func_name
+
+/*----------------------------------------------------------------------------+
+| mttlb3.
++----------------------------------------------------------------------------*/
+       function_prolog(mttlb3)
+       TLBWE(4,3,2)
+       blr
+       function_epilog(mttlb3)
+
+/*----------------------------------------------------------------------------+
+| mftlb3.
++----------------------------------------------------------------------------*/
+       function_prolog(mftlb3)
+       TLBRE(3,3,2)
+       blr
+       function_epilog(mftlb3)
+
+/*----------------------------------------------------------------------------+
+| mttlb2.
++----------------------------------------------------------------------------*/
+       function_prolog(mttlb2)
+       TLBWE(4,3,1)
+       blr
+       function_epilog(mttlb2)
+
+/*----------------------------------------------------------------------------+
+| mftlb2.
++----------------------------------------------------------------------------*/
+       function_prolog(mftlb2)
+       TLBRE(3,3,1)
+       blr
+       function_epilog(mftlb2)
+
+/*----------------------------------------------------------------------------+
+| mttlb1.
++----------------------------------------------------------------------------*/
+       function_prolog(mttlb1)
+       TLBWE(4,3,0)
+       blr
+       function_epilog(mttlb1)
+
+/*----------------------------------------------------------------------------+
+| mftlb1.
++----------------------------------------------------------------------------*/
+       function_prolog(mftlb1)
+       TLBRE(3,3,0)
+       blr
+       function_epilog(mftlb1)
+
+/*----------------------------------------------------------------------------+
+| dcbz_area.
++----------------------------------------------------------------------------*/
+       function_prolog(dcbz_area)
+       rlwinm. r5,r4,0,27,31
+       rlwinm  r5,r4,27,5,31
+       beq     ..d_ra2
+       addi    r5,r5,0x0001
+..d_ra2:mtctr   r5
+..d_ag2:dcbz    r0,r3
+       addi    r3,r3,32
+       bdnz    ..d_ag2
+       sync
+       blr
+       function_epilog(dcbz_area)
+
+/*----------------------------------------------------------------------------+
+| dflush.  Assume 32K at vector address is cachable.
++----------------------------------------------------------------------------*/
+       function_prolog(dflush)
+       mfmsr   r9
+       rlwinm  r8,r9,0,15,13
+       rlwinm  r8,r8,0,17,15
+       mtmsr   r8
+       addi    r3,r0,0x0000
+       mtspr   dvlim,r3
+       mfspr   r3,ivpr
+       addi    r4,r0,1024
+       mtctr   r4
+..dflush_loop:
+       lwz     r6,0x0(r3)
+       addi    r3,r3,32
+       bdnz    ..dflush_loop
+       addi    r3,r3,-32
+       mtctr   r4
+..ag:   dcbf    r0,r3
+       addi    r3,r3,-32
+       bdnz    ..ag
+       sync
+       mtmsr   r9
+       blr
+       function_epilog(dflush)
+#endif /* CONFIG_440 */