Merge branch 'next' of git://git.denx.de/u-boot-avr32
[platform/kernel/u-boot.git] / cpu / mpc83xx / start.S
index 0e1a5fd..16ed494 100644 (file)
@@ -2,7 +2,7 @@
  * Copyright (C) 1998  Dan Malek <dmalek@jlc.net>
  * Copyright (C) 1999  Magnus Damm <kieraypc01.p.y.kie.era.ericsson.se>
  * Copyright (C) 2000, 2001,2002 Wolfgang Denk <wd@denx.de>
- * Copyright 2004 Freescale Semiconductor, Inc.
+ * Copyright Freescale Semiconductor, Inc. 2004, 2006, 2008.
  *
  * See file CREDITS for list of people who contributed to this
  * project.
 #define MSR_KERNEL (MSR_FP|MSR_ME|MSR_RI)
 #endif
 
+#if !defined(CONFIG_NAND_SPL) && !defined(CFG_RAMBOOT)
+#define CFG_FLASHBOOT
+#endif
+
 /*
  * Set up GOT: Global Offset Table
  *
  */
        START_GOT
        GOT_ENTRY(_GOT2_TABLE_)
-       GOT_ENTRY(_FIXUP_TABLE_)
+       GOT_ENTRY(__bss_start)
+       GOT_ENTRY(_end)
 
+#ifndef CONFIG_NAND_SPL
+       GOT_ENTRY(_FIXUP_TABLE_)
        GOT_ENTRY(_start)
        GOT_ENTRY(_start_of_vectors)
        GOT_ENTRY(_end_of_vectors)
        GOT_ENTRY(transfer_to_handler)
-
-       GOT_ENTRY(__init_end)
-       GOT_ENTRY(_end)
-       GOT_ENTRY(__bss_start)
+#endif
        END_GOT
 
 /*
- * Version string - must be in data segment because MPC83xx uses the
- * first 256 bytes for the Hard Reset Configuration Word table (see
- * below).  Similarly, can't have the U-Boot Magic Number as the first
- * thing in the image - don't know how this will affect the image tools,
- * but I guess I'll find out soon.
+ * The Hard Reset Configuration Word (HRCW) table is in the first 64
+ * (0x40) bytes of flash.  It has 8 bytes, but each byte is repeated 8
+ * times so the processor can fetch it out of flash whether the flash
+ * is 8, 16, 32, or 64 bits wide (hardware trickery).
  */
-       .data
-       .globl  version_string
-version_string:
-       .ascii U_BOOT_VERSION
-       .ascii " (", __DATE__, " - ", __TIME__, ")"
-       .ascii " ", CONFIG_IDENT_STRING, "\0"
-
        .text
 #define _HRCW_TABLE_ENTRY(w)           \
        .fill   8,1,(((w)>>24)&0xff);   \
@@ -100,13 +96,25 @@ version_string:
        _HRCW_TABLE_ENTRY(CFG_HRCW_LOW)
        _HRCW_TABLE_ENTRY(CFG_HRCW_HIGH)
 
+/*
+ * Magic number and version string - put it after the HRCW since it
+ * cannot be first in flash like it is in many other processors.
+ */
+       .long   0x27051956              /* U-Boot Magic Number */
+
+       .globl  version_string
+version_string:
+       .ascii U_BOOT_VERSION
+       .ascii " (", __DATE__, " - ", __TIME__, ")"
+       .ascii " ", CONFIG_IDENT_STRING, "\0"
+
 
 #ifndef CONFIG_DEFAULT_IMMR
 #error CONFIG_DEFAULT_IMMR must be defined
 #endif /* CFG_DEFAULT_IMMR */
-#ifndef CFG_IMMRBAR
-#define CFG_IMMRBAR CONFIG_DEFAULT_IMMR
-#endif /* CFG_IMMRBAR */
+#ifndef CFG_IMMR
+#define CFG_IMMR CONFIG_DEFAULT_IMMR
+#endif /* CFG_IMMR */
 
 /*
  * After configuration, a system reset exception is executed using the
@@ -152,8 +160,8 @@ boot_cold: /* time t 3 */
        nop
 boot_warm: /* time t 5 */
        mfmsr   r5                      /* save msr contents    */
-       lis     r3, CFG_IMMRBAR@h
-       ori     r3, r3, CFG_IMMRBAR@l
+       lis     r3, CFG_IMMR@h
+       ori     r3, r3, CFG_IMMR@l
        stw     r3, IMMRBAR(r4)
 
        /* Initialise the E300 processor core           */
@@ -161,7 +169,7 @@ boot_warm: /* time t 5 */
 
        bl      init_e300_core
 
-#ifndef CFG_RAMBOOT
+#ifdef CFG_FLASHBOOT
 
        /* Inflate flash location so it appears everywhere, calculate */
        /* the absolute address in final location of the FLASH, jump  */
@@ -177,19 +185,56 @@ in_flash:
 #if 1 /* Remapping flash with LAW0. */
        bl remap_flash_by_law0
 #endif
-#endif /* CFG_RAMBOOT */
+#endif /* CFG_FLASHBOOT */
+
+       /* setup the bats */
+       bl      setup_bats
+       sync
+
+       /*
+        * Cache must be enabled here for stack-in-cache trick.
+        * This means we need to enable the BATS.
+        * This means:
+        *   1) for the EVB, original gt regs need to be mapped
+        *   2) need to have an IBAT for the 0xf region,
+        *      we are running there!
+        * Cache should be turned on after BATs, since by default
+        * everything is write-through.
+        * The init-mem BAT can be reused after reloc. The old
+        * gt-regs BAT can be reused after board_init_f calls
+        * board_early_init_f (EVB only).
+        */
+       /* enable address translation */
+       bl      enable_addr_trans
+       sync
+
+       /* enable and invalidate the data cache */
+       bl      dcache_enable
+       sync
+#ifdef CFG_INIT_RAM_LOCK
+       bl      lock_ram_in_cache
+       sync
+#endif
+
+       /* set up the stack pointer in our newly created
+        * cache-ram (r1) */
+       lis     r1, (CFG_INIT_RAM_ADDR + CFG_GBL_DATA_OFFSET)@h
+       ori     r1, r1, (CFG_INIT_RAM_ADDR + CFG_GBL_DATA_OFFSET)@l
+
+       li      r0, 0           /* Make room for stack frame header and */
+       stwu    r0, -4(r1)      /* clear final stack frame so that      */
+       stwu    r0, -4(r1)      /* stack backtraces terminate cleanly   */
 
-       bl setup_stack_in_data_cache_on_r1
 
        /* let the C-code set up the rest                           */
-       /*                                                                                  */
+       /*                                                          */
        /* Be careful to keep code relocatable & stack humble   */
        /*------------------------------------------------------*/
 
        GET_GOT                 /* initialize GOT access        */
 
        /* r3: IMMR */
-       lis     r3, CFG_IMMRBAR@h
+       lis     r3, CFG_IMMR@h
        /* run low-level CPU init code (in Flash)*/
        bl      cpu_init_f
 
@@ -198,6 +243,7 @@ in_flash:
        /* run 1st part of board init code (in Flash)*/
        bl      board_init_f
 
+#ifndef CONFIG_NAND_SPL
 /*
  * Vector Table
  */
@@ -222,7 +268,7 @@ _start_of_vectors:
 /* Alignment exception. */
        . = 0x600
 Alignment:
-       EXCEPTION_PROLOG
+       EXCEPTION_PROLOG(SRR0, SRR1)
        mfspr   r4,DAR
        stw     r4,_DAR(r21)
        mfspr   r5,DSISR
@@ -241,7 +287,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 */
@@ -387,6 +433,7 @@ int_return:
        lwz     r1,GPR1(r1)
        SYNC
        rfi
+#endif /* !CONFIG_NAND_SPL */
 
 /*
  * This code initialises the E300 processor core
@@ -409,7 +456,7 @@ init_e300_core: /* time t 10 */
        mtspr   SRR1, r3                        /* Make SRR1 match MSR */
 
 
-       lis     r3, CFG_IMMRBAR@h
+       lis     r3, CFG_IMMR@h
 #if defined(CONFIG_WATCHDOG)
        /* Initialise the Wathcdog values and reset it (if req) */
        /*------------------------------------------------------*/
@@ -421,7 +468,7 @@ init_e300_core: /* time t 10 */
 
        li      r4, 0x556C
        sth     r4, SWSRR@l(r3)
-       li      r4, 0xAA39
+       li      r4, -0x55C7
        sth     r4, SWSRR@l(r3)
 #else
        /* Disable Wathcdog  */
@@ -455,27 +502,146 @@ init_e300_core: /* time t 10 */
        SYNC
        mtspr   HID2, r3
 
-       /* clear all BAT's                                      */
-       /*----------------------------------*/
-
-       xor     r0, r0, r0
-       mtspr   DBAT0U, r0
-       mtspr   DBAT0L, r0
-       mtspr   DBAT1U, r0
-       mtspr   DBAT1L, r0
-       mtspr   DBAT2U, r0
-       mtspr   DBAT2L, r0
-       mtspr   DBAT3U, r0
-       mtspr   DBAT3L, r0
-       mtspr   IBAT0U, r0
-       mtspr   IBAT0L, r0
-       mtspr   IBAT1U, r0
-       mtspr   IBAT1L, r0
-       mtspr   IBAT2U, r0
-       mtspr   IBAT2L, r0
-       mtspr   IBAT3U, r0
-       mtspr   IBAT3L, r0
-       SYNC
+       /* Done!                                                */
+       /*------------------------------*/
+       blr
+
+       /* setup_bats - set them up to some initial state */
+       .globl  setup_bats
+setup_bats:
+       addis   r0, r0, 0x0000
+
+       /* IBAT 0 */
+       addis   r4, r0, CFG_IBAT0L@h
+       ori     r4, r4, CFG_IBAT0L@l
+       addis   r3, r0, CFG_IBAT0U@h
+       ori     r3, r3, CFG_IBAT0U@l
+       mtspr   IBAT0L, r4
+       mtspr   IBAT0U, r3
+
+       /* DBAT 0 */
+       addis   r4, r0, CFG_DBAT0L@h
+       ori     r4, r4, CFG_DBAT0L@l
+       addis   r3, r0, CFG_DBAT0U@h
+       ori     r3, r3, CFG_DBAT0U@l
+       mtspr   DBAT0L, r4
+       mtspr   DBAT0U, r3
+
+       /* IBAT 1 */
+       addis   r4, r0, CFG_IBAT1L@h
+       ori     r4, r4, CFG_IBAT1L@l
+       addis   r3, r0, CFG_IBAT1U@h
+       ori     r3, r3, CFG_IBAT1U@l
+       mtspr   IBAT1L, r4
+       mtspr   IBAT1U, r3
+
+       /* DBAT 1 */
+       addis   r4, r0, CFG_DBAT1L@h
+       ori     r4, r4, CFG_DBAT1L@l
+       addis   r3, r0, CFG_DBAT1U@h
+       ori     r3, r3, CFG_DBAT1U@l
+       mtspr   DBAT1L, r4
+       mtspr   DBAT1U, r3
+
+       /* IBAT 2 */
+       addis   r4, r0, CFG_IBAT2L@h
+       ori     r4, r4, CFG_IBAT2L@l
+       addis   r3, r0, CFG_IBAT2U@h
+       ori     r3, r3, CFG_IBAT2U@l
+       mtspr   IBAT2L, r4
+       mtspr   IBAT2U, r3
+
+       /* DBAT 2 */
+       addis   r4, r0, CFG_DBAT2L@h
+       ori     r4, r4, CFG_DBAT2L@l
+       addis   r3, r0, CFG_DBAT2U@h
+       ori     r3, r3, CFG_DBAT2U@l
+       mtspr   DBAT2L, r4
+       mtspr   DBAT2U, r3
+
+       /* IBAT 3 */
+       addis   r4, r0, CFG_IBAT3L@h
+       ori     r4, r4, CFG_IBAT3L@l
+       addis   r3, r0, CFG_IBAT3U@h
+       ori     r3, r3, CFG_IBAT3U@l
+       mtspr   IBAT3L, r4
+       mtspr   IBAT3U, r3
+
+       /* DBAT 3 */
+       addis   r4, r0, CFG_DBAT3L@h
+       ori     r4, r4, CFG_DBAT3L@l
+       addis   r3, r0, CFG_DBAT3U@h
+       ori     r3, r3, CFG_DBAT3U@l
+       mtspr   DBAT3L, r4
+       mtspr   DBAT3U, r3
+
+#ifdef CONFIG_HIGH_BATS
+       /* IBAT 4 */
+       addis   r4, r0, CFG_IBAT4L@h
+       ori     r4, r4, CFG_IBAT4L@l
+       addis   r3, r0, CFG_IBAT4U@h
+       ori     r3, r3, CFG_IBAT4U@l
+       mtspr   IBAT4L, r4
+       mtspr   IBAT4U, r3
+
+       /* DBAT 4 */
+       addis   r4, r0, CFG_DBAT4L@h
+       ori     r4, r4, CFG_DBAT4L@l
+       addis   r3, r0, CFG_DBAT4U@h
+       ori     r3, r3, CFG_DBAT4U@l
+       mtspr   DBAT4L, r4
+       mtspr   DBAT4U, r3
+
+       /* IBAT 5 */
+       addis   r4, r0, CFG_IBAT5L@h
+       ori     r4, r4, CFG_IBAT5L@l
+       addis   r3, r0, CFG_IBAT5U@h
+       ori     r3, r3, CFG_IBAT5U@l
+       mtspr   IBAT5L, r4
+       mtspr   IBAT5U, r3
+
+       /* DBAT 5 */
+       addis   r4, r0, CFG_DBAT5L@h
+       ori     r4, r4, CFG_DBAT5L@l
+       addis   r3, r0, CFG_DBAT5U@h
+       ori     r3, r3, CFG_DBAT5U@l
+       mtspr   DBAT5L, r4
+       mtspr   DBAT5U, r3
+
+       /* IBAT 6 */
+       addis   r4, r0, CFG_IBAT6L@h
+       ori     r4, r4, CFG_IBAT6L@l
+       addis   r3, r0, CFG_IBAT6U@h
+       ori     r3, r3, CFG_IBAT6U@l
+       mtspr   IBAT6L, r4
+       mtspr   IBAT6U, r3
+
+       /* DBAT 6 */
+       addis   r4, r0, CFG_DBAT6L@h
+       ori     r4, r4, CFG_DBAT6L@l
+       addis   r3, r0, CFG_DBAT6U@h
+       ori     r3, r3, CFG_DBAT6U@l
+       mtspr   DBAT6L, r4
+       mtspr   DBAT6U, r3
+
+       /* IBAT 7 */
+       addis   r4, r0, CFG_IBAT7L@h
+       ori     r4, r4, CFG_IBAT7L@l
+       addis   r3, r0, CFG_IBAT7U@h
+       ori     r3, r3, CFG_IBAT7U@l
+       mtspr   IBAT7L, r4
+       mtspr   IBAT7U, r3
+
+       /* DBAT 7 */
+       addis   r4, r0, CFG_DBAT7L@h
+       ori     r4, r4, CFG_DBAT7L@l
+       addis   r3, r0, CFG_DBAT7U@h
+       ori     r3, r3, CFG_DBAT7U@l
+       mtspr   DBAT7L, r4
+       mtspr   DBAT7U, r3
+#endif
+
+       isync
 
        /* invalidate all tlb's
         *
@@ -496,19 +662,38 @@ init_e300_core: /* time t 10 */
         * based on code in "flush_tlbs" from arch/ppc/kernel/head.S
         *
         */
+       lis     r3, 0
+       lis     r5, 2
 
-       li      r3, 32
-       mtctr   r3
-       li      r3, 0
-1:     tlbie   r3
+1:
+       tlbie   r3
        addi    r3, r3, 0x1000
-       bdnz    1b
-       SYNC
+       cmp     0, 0, r3, r5
+       blt     1b
 
-       /* Done!                                                */
-       /*------------------------------*/
        blr
 
+       .globl enable_addr_trans
+enable_addr_trans:
+       /* enable address translation */
+       mfmsr   r5
+       ori     r5, r5, (MSR_IR | MSR_DR)
+       mtmsr   r5
+       isync
+       blr
+
+       .globl disable_addr_trans
+disable_addr_trans:
+       /* disable address translation */
+       mflr    r4
+       mfmsr   r3
+       andi.   r0, r3, (MSR_IR | MSR_DR)
+       beqlr
+       andc    r3, r3, r0
+       mtspr   SRR0, r4
+       mtspr   SRR1, r3
+       rfi
+
 /* Cache functions.
  *
  * Note: requires that all cache bits in
@@ -544,32 +729,31 @@ icache_disable:
        .globl  icache_status
 icache_status:
        mfspr   r3, HID0
-       rlwinm  r3, r3, HID0_ICE_SHIFT, 31, 31
+       rlwinm  r3, r3, (31 - HID0_ICE_SHIFT + 1), 31, 31
        blr
 
        .globl  dcache_enable
 dcache_enable:
        mfspr   r3, HID0
-       ori     r3, r3, HID0_ENABLE_DATA_CACHE
-       lis     r4, 0
-       ori     r4, r4, HID0_LOCK_DATA_CACHE
-       andc    r3, r3, r4
-       ori     r4, r3, HID0_LOCK_INSTRUCTION_CACHE
+       li      r5, HID0_DCFI|HID0_DLOCK
+       andc    r3, r3, r5
+       mtspr   HID0, r3                /* no invalidate, unlock */
+       ori     r3, r3, HID0_DCE
+       ori     r5, r3, HID0_DCFI
+       mtspr   HID0, r5                /* enable + invalidate */
+       mtspr   HID0, r3                /* enable */
        sync
-       mtspr   HID0, r4    /* sets enable and invalidate, clears lock */
-       sync
-       mtspr   HID0, r3        /* clears invalidate */
        blr
 
        .globl  dcache_disable
 dcache_disable:
        mfspr   r3, HID0
        lis     r4, 0
-       ori     r4, r4, HID0_ENABLE_DATA_CACHE|HID0_LOCK_DATA_CACHE
+       ori     r4, r4, HID0_DCE|HID0_DLOCK
        andc    r3, r3, r4
-       ori     r4, r3, HID0_INVALIDATE_DATA_CACHE
+       ori     r4, r3, HID0_DCI
        sync
-       mtspr   HID0, r4    /* sets invalidate, clears enable and lock */
+       mtspr   HID0, r4        /* sets invalidate, clears enable and lock */
        sync
        mtspr   HID0, r3        /* clears invalidate */
        blr
@@ -577,7 +761,7 @@ dcache_disable:
        .globl  dcache_status
 dcache_status:
        mfspr   r3, HID0
-       rlwinm  r3, r3, HID0_DCE_SHIFT, 31, 31
+       rlwinm  r3, r3, (31 - HID0_DCE_SHIFT + 1), 31, 31
        blr
 
        .globl get_pvr
@@ -585,6 +769,18 @@ get_pvr:
        mfspr   r3, PVR
        blr
 
+       .globl  ppcDWstore
+ppcDWstore:
+       lfd     1, 0(r4)
+       stfd    1, 0(r3)
+       blr
+
+       .globl  ppcDWload
+ppcDWload:
+       lfd     1, 0(r3)
+       stfd    1, 0(r4)
+       blr
+
 /*-------------------------------------------------------------------*/
 
 /*
@@ -607,7 +803,7 @@ relocate_code:
        mr      r3,  r5                         /* Destination Address */
        lis     r4, CFG_MONITOR_BASE@h          /* Source      Address */
        ori     r4, r4, CFG_MONITOR_BASE@l
-       lwz     r5, GOT(__init_end)
+       lwz     r5, GOT(__bss_start)
        sub     r5, r5, r4
        li      r6, CFG_CACHELINE_SIZE          /* Cache Line Size */
 
@@ -674,46 +870,29 @@ relocate_code:
  * Now flush the cache: note that we must start from a cache aligned
  * address. Otherwise we might miss one cache line.
  */
-4:
-       bl un_setup_stack_in_data_cache
-       mr r7, r3
-       mr r8, r4
-       bl dcache_disable
-       mr r3, r7
-       mr r4, r8
-
-       cmpwi   r6,0
+4:     cmpwi   r6,0
        add     r5,r3,r5
-       beq     7f      /* Always flush prefetch queue in any case */
+       beq     7f              /* Always flush prefetch queue in any case */
        subi    r0,r6,1
        andc    r3,r3,r0
-       mfspr   r7,HID0         /* don't do dcbst if dcache is disabled*/
-       rlwinm  r7,r7,HID0_DCE_SHIFT,31,31
-       cmpwi   r7,0
-       beq     9f
        mr      r4,r3
 5:     dcbst   0,r4
        add     r4,r4,r6
        cmplw   r4,r5
        blt     5b
-       sync            /* Wait for all dcbst to complete on bus */
-9:     mfspr   r7,HID0         /* don't do icbi if icache is disabled */
-       rlwinm  r7,r7,HID0_DCE_SHIFT,31,31
-       cmpwi   r7,0
-       beq     7f
+       sync                    /* Wait for all dcbst to complete on bus */
        mr      r4,r3
 6:     icbi    0,r4
        add     r4,r4,r6
        cmplw   r4,r5
        blt     6b
-7:     sync            /* Wait for all icbi to complete on bus */
+7:     sync                    /* Wait for all icbi to complete on bus */
        isync
 
 /*
  * We are done. Do not return, instead branch to second part of board
  * initialization, now running from RAM.
  */
-
        addi    r0, r10, in_ram - _start + EXC_OFF_SYS_RESET
        mtlr    r0
        blr
@@ -737,6 +916,7 @@ in_ram:
        stw     r0,0(r3)
        bdnz    1b
 
+#ifndef CONFIG_NAND_SPL
        /*
         * Now adjust the fixups and the pointers to the fixups
         * in case we need to move ourselves again.
@@ -754,6 +934,8 @@ in_ram:
        stw     r0,0(r4)
        bdnz    3b
 4:
+#endif
+
 clear_bss:
        /*
         * Now clear BSS segment
@@ -787,6 +969,7 @@ clear_bss:
        mr      r4, r10         /* Destination Address          */
        bl      board_init_r
 
+#ifndef CONFIG_NAND_SPL
        /*
         * Copy exception vector code to low memory
         *
@@ -869,8 +1052,31 @@ trap_reloc:
        stw     r0, 4(r7)
 
        blr
+#endif /* !CONFIG_NAND_SPL */
 
 #ifdef CFG_INIT_RAM_LOCK
+lock_ram_in_cache:
+       /* Allocate Initial RAM in data cache.
+        */
+       lis     r3, (CFG_INIT_RAM_ADDR & ~31)@h
+       ori     r3, r3, (CFG_INIT_RAM_ADDR & ~31)@l
+       li      r2, ((CFG_INIT_RAM_END & ~31) + \
+                    (CFG_INIT_RAM_ADDR & 31) + 31) / 32
+       mtctr   r2
+1:
+       dcbz    r0, r3
+       addi    r3, r3, 32
+       bdnz    1b
+
+       /* Lock the data cache */
+       mfspr   r0, HID0
+       ori     r0, r0, 0x1000
+       sync
+       mtspr   HID0, r0
+       sync
+       blr
+
+#ifndef CONFIG_NAND_SPL
 .globl unlock_ram_in_cache
 unlock_ram_in_cache:
        /* invalidate the INIT_RAM section */
@@ -884,14 +1090,25 @@ unlock_ram_in_cache:
        bdnz    1b
        sync                    /* Wait for all icbi to complete on bus */
        isync
+
+       /* Unlock the data cache and invalidate it */
+       mfspr   r3, HID0
+       li      r5, HID0_DLOCK|HID0_DCFI
+       andc    r3, r3, r5              /* no invalidate, unlock */
+       ori     r5, r3, HID0_DCFI       /* invalidate, unlock */
+       mtspr   HID0, r5                /* invalidate, unlock */
+       mtspr   HID0, r3                /* no invalidate, unlock */
+       sync
        blr
-#endif
+#endif /* !CONFIG_NAND_SPL */
+#endif /* CFG_INIT_RAM_LOCK */
 
+#ifdef CFG_FLASHBOOT
 map_flash_by_law1:
        /* When booting from ROM (Flash or EPROM), clear the  */
        /* Address Mask in OR0 so ROM appears everywhere      */
        /*----------------------------------------------------*/
-       lis     r3, (CFG_IMMRBAR)@h  /* r3 <= CFG_IMMRBAR    */
+       lis     r3, (CFG_IMMR)@h  /* r3 <= CFG_IMMR    */
        lwz     r4, OR0@l(r3)
        li      r5, 0x7fff        /* r5 <= 0x00007FFFF */
        and     r4, r4, r5
@@ -916,8 +1133,15 @@ map_flash_by_law1:
        lis r4, (CFG_FLASH_BASE)@h
        ori r4, r4, (CFG_FLASH_BASE)@l
        stw r4, LBLAWBAR1(r3) /* LBLAWBAR1 <= CFG_FLASH_BASE */
-       lis r4, (0x80000016)@h
-       ori r4, r4, (0x80000016)@l
+
+       /* Store 0x80000012 + log2(CFG_FLASH_SIZE) into LBLAWAR1 */
+       lis r4, (0x80000012)@h
+       ori r4, r4, (0x80000012)@l
+       li r5, CFG_FLASH_SIZE
+1:     srawi. r5, r5, 1        /* r5 = r5 >> 1 */
+       addi r4, r4, 1
+       bne 1b
+
        stw r4, LBLAWAR1(r3) /* LBLAWAR1 <= 8MB Flash Size */
        blr
 
@@ -936,164 +1160,26 @@ remap_flash_by_law0:
        stw r5, BR0(r3) /* r5 <= (CFG_FLASH_BASE & 0xFFFF8000) | (BR0 & 0x00007FFF) */
 
        lwz r4, OR0(r3)
-       lis r5, 0xFF80 /* 8M */
+       lis r5, ~((CFG_FLASH_SIZE << 4) - 1)
        or r4, r4, r5
-       stw r4, OR0(r3) /* OR0 <= OR0 | 0xFF800000 */
+       stw r4, OR0(r3)
 
        lis r4, (CFG_FLASH_BASE)@h
        ori r4, r4, (CFG_FLASH_BASE)@l
        stw r4, LBLAWBAR0(r3) /* LBLAWBAR0 <= CFG_FLASH_BASE */
 
-       lis r4, (0x80000016)@h
-       ori r4, r4, (0x80000016)@l
-       stw r4, LBLAWAR0(r3) /* LBLAWAR0 <= 8MB Flash Size */
+       /* Store 0x80000012 + log2(CFG_FLASH_SIZE) into LBLAWAR0 */
+       lis r4, (0x80000012)@h
+       ori r4, r4, (0x80000012)@l
+       li r5, CFG_FLASH_SIZE
+1:     srawi. r5, r5, 1 /* r5 = r5 >> 1 */
+       addi r4, r4, 1
+       bne 1b
+       stw r4, LBLAWAR0(r3) /* LBLAWAR0 <= Flash Size */
+
 
        xor r4, r4, r4
        stw r4, LBLAWBAR1(r3)
        stw r4, LBLAWAR1(r3) /* Off LBIU LAW1 */
        blr
-
-setup_stack_in_data_cache_on_r1:
-       lis r3, (CFG_IMMRBAR)@h
-
-       /* setup D-BAT for the D-Cache (with out real memory backup) */
-
-       lis r4, (CFG_INIT_RAM_ADDR & 0xFFFE0000)@h
-       mtspr   DBAT0U, r4
-       ori r4, r4, 0x0002
-       mtspr   DBAT0L, r4
-       isync
-
-#if 0
-       /* Enable MMU */
-       mfmsr r4
-       ori r4, r4, (MSR_DR | MSR_IR)@l
-       mtmsr r4
-#endif
-
-       /* Enable and invalidate data cache. */
-       mfspr   r4, HID0
-       mr      r5, r4
-       ori     r4, r4, HID0_DCE | HID0_DCI
-       ori     r5, r5, HID0_DCE
-       sync
-       mtspr   HID0, r4
-       mtspr   HID0, r5
-       sync
-
-       /* Allocate Initial RAM in data cache.*/
-       li  r0, 0
-       lis     r4, (CFG_INIT_RAM_ADDR)@h
-       ori     r4, r4, (CFG_INIT_RAM_ADDR)@l
-       li      r5, 128*8 /* 128*8*32=32Kb */
-       mtctr   r5
-1:
-       dcbz    r0, r4
-       addi    r4, r4, 32
-       bdnz    1b
-       isync
-
-       /* Lock all the D-cache, basically leaving the reset of the program without dcache */
-       mfspr   r4, HID0
-       ori     r4, r4, (HID0_DLOCK)@l
-       sync
-       mtspr   HID0 , r4
-
-       /* setup the stack pointer in r1 */
-       lis     r1, (CFG_INIT_RAM_ADDR + CFG_GBL_DATA_OFFSET)@h
-       ori     r1, r1, (CFG_INIT_RAM_ADDR + CFG_GBL_DATA_OFFSET)@l
-       li      r0, 0                   /* Make room for stack frame header and */
-
-       stwu    r0, -4(r1)              /* clear final stack frame so that      */
-       stwu    r0, -4(r1)              /* stack backtraces terminate cleanly   */
-
-       blr
-
-un_setup_stack_in_data_cache:
-       blr
-       mr r14, r4
-       mr r15, r5
-
-
-       lis r4, (CFG_INIT_RAM_ADDR & 0xFFFE0000)@h
-       mtspr   DBAT0U, r4
-       ori r4, r4, 0x0002
-       mtspr   DBAT0L, r4
-       isync
-
-       /* un lock all the D-cache */
-       mfspr   r4, HID0
-       lis r5, (~(HID0_DLOCK))@h
-       ori     r5, r5, (~(HID0_DLOCK))@l
-       and r4, r4, r5
-       sync
-       mtspr   HID0 , r4
-
-       /* Re - Allocate Initial RAM in data cache.*/
-       li  r0, 0
-       lis     r4, (CFG_INIT_RAM_ADDR)@h
-       ori     r4, r4, (CFG_INIT_RAM_ADDR)@l
-       li      r5, 128*8 /* 128*8*32=32Kb */
-       mtctr   r5
-1:
-       dcbz    r0, r4
-       addi    r4, r4, 32
-       bdnz    1b
-       isync
-
-       mflr r16
-       bl dcache_disable
-       mtlr r16
-
-       blr
-
-#if 0
-#define GREEN_LIGHT 0x2B0D4046
-#define RED_LIGHT   0x250D4046
-#define LIB_CNT     0x4FFF
-
-/*
- * Lib Light
- */
-
-       .globl liblight
-liblight:
-       lis     r3, CFG_IMMRBAR@h
-       ori     r3, r3, CFG_IMMRBAR@l
-       li r4, 0x3002
-       mtmsr r4
-       xor r4, r4, r4
-       mtspr   HID0, r4
-       mtspr   HID2, r4
-       lis r4, 0xF8000000@h
-       ori r4, r4, 0xF8000000@l
-       stw r4, LBLAWBAR1(r3)
-       lis r4, 0x8000000E@h
-       ori r4, r4, 0x8000000E@l
-       stw r4, LBLAWAR1(r3)
-       lis r4, 0xF8000801@h
-       ori r4, r4, 0xF8000801@l
-       stw r4, BR1(r3)
-       lis r4, 0xFFFFE8f0@h
-       ori r4, r4, 0xFFFFE8f0@l
-       stw r4, OR1(r3)
-
-       lis r4, 0xF8000000@h
-       ori r4, r4, 0xF8000000@l
-       lis r5, GREEN_LIGHT@h
-       ori r5, r5, GREEN_LIGHT@l
-       lis r6, RED_LIGHT@h
-       ori r6, r6, RED_LIGHT@l
-       lis r7, LIB_CNT@h
-       ori r7, r7, LIB_CNT@l
-
-1:
-       stw r5, 0(r4)
-       mtctr r7
-2:     bdnz 2b
-       stw r6, 0(r4)
-       mtctr r7
-3:     bdnz 3b
-       b 1b
-
-#endif
+#endif /* CFG_FLASHBOOT */