/*****************************************************************************/ /* * crt0_ram.S -- startup code for MCF5206e ColdFire based eLITE boards. * * (C) Copyright 1999-2002, Greg Ungerer (gerg@snapgear.com). * Copyright (C) 1999 Rob Scott (rscott@mtrob.fdns.net) * * 1999/02/24 Modified for the 5307 processor David W. Miller */ /*****************************************************************************/ #include "linux/autoconf.h" #include "asm/coldfire.h" #include "asm/mcfsim.h" /*****************************************************************************/ /* * M5206eLITE ColdFire eval board, chip select and memory setup. */ #ifdef CONFIG_SMALL #define MEM_BASE 0x30000000 /* Base memory for M5206eLITE */ #define MEM_RESERVED 0x00020000 /* Don't use memory reserved by dBUG */ #define MEM_SIZE 0x00100000 /* 1 MB of SRAM on M5206eLITE */ #else #define MEM_BASE 0x00000000 /* Base memory for M5206eLITE */ #define MEM_RESERVED 0x00010000 /* Skip first MEM_LUMP for colilo */ #define MEM_SIZE 0x02000000 /* Max DRAM 32Mb */ #endif #define MEM_MIN MEM_BASE+MEM_RESERVED /* Define end of probeable memory space */ #define MEM_MAX MEM_BASE+MEM_SIZE #define MEM_BUILTIN 0x20000000 /* Put built in SRAM at dBUG loc */ #define MEM_TMPSTACK MEM_BUILTIN+0x800 /* Use built in SRAM for tmp stack */ #define MEM_LUMP 0x00010000 /* 64 Kb chunks */ #define VBR_BASE MEM_BUILTIN /* Use built in SRAM for vectors */ #define CS0_ADDR 0x0000ffe0 /* CS0 connected to Flash ROM */ #define CS0_MASK 0x000f0000 /* is 1Mbyte */ #define CS0_CTRL 0x00001da3 /* read-write (for flash) */ #define CS1_ADDR 0x00000000 /* CS1 not connected */ #define CS1_MASK 0x00000000 #define CS1_CTRL 0x00000000 #define CS2_ADDR 0x00003000 /* CS2 connected to SRAM */ #define CS2_MASK 0x000f0000 /* is 1Mbyte */ #define CS2_CTRL 0x00001903 /* read-write */ #define CS3_ADDR 0x00004000 /* CS3 connected to LED, par port */ #define CS3_MASK 0x000f0000 /* is 1Mbyte */ #define CS3_CTRL 0x00000183 /* read-write */ #define CS4_ADDR 0x00000000 /* CS4 not connected */ #define CS4_MASK 0x00000000 #define CS4_CTRL 0x00000000 #define CS5_ADDR 0x00000000 /* CS5 not connected */ #define CS5_MASK 0x00000000 #define CS5_CTRL 0x00000000 #define CS6_ADDR 0x00000000 /* CS6 not connected */ #define CS6_MASK 0x00000000 #define CS6_CTRL 0x00000000 #define CS7_ADDR 0x00000000 /* CS7 not connected */ #define CS7_MASK 0x00000000 #define CS7_CTRL 0x00000000 #define DMC_CTRL 0x00000000 /* default memory control */ #define DCRR 0x00000034 /* Refresh period */ /* DCTR definition: <15>: DAEM, 1 = Drive Multiplexed Address During External Master DRAM xfer <14>: EDO, 1 = EDO, 0 = Normal <12>: RCD, 1 = 2 clk RAS-to-CAS, 0 = 1.0 clk RAS-to-CAS <10:09>: RSH, 10 = 3.5 clk RAS low, 01 = 2.5 clk, 00 = 1.5 clk <06:05>: RP, 10 = 3.5 clk RAS Precharge, 01 = 2.5 clk, 00 = 1.5 clk <03>: CAS, 1 = 2.5 clk CAS assertion, 0 = 1.5 clk <01>: CP, 1 = 1.5 CAS clk precharge, 0 = .5 clk <00>: CSR, 1 = 2.0 clk CAS before RAS setup, 0 = 1.0 clk */ #define DCTR 0x0000144B /* Slow DRAM */ #define DCAR0 0x00000000 /* DRAM0 address, 0 base addr */ #define DCMR0 0x003e0000 /* DRAM0 mask, 4Mb DRAM */ #define DCCR0 0x00000007 /* DRAM0 control, R/W, burst pg mde */ #define DCAR1 0x00000000 /* DRAM1 address, 0 base addr */ #define DCMR1 0x00000000 /* DRAM1 mask, no DRAM */ #define DCCR1 0x00000000 /* DRAM1 control, off */ /*****************************************************************************/ .global _start .global _rambase .global _ramvec .global _ramstart .global _ramend /*****************************************************************************/ .data /* * Set up the usable of RAM stuff. Size of RAM is determined then * an initial stack set up at the end. */ _rambase: .long 0 _ramvec: .long 0 _ramstart: .long 0 _ramend: .long 0 #if CONFIG_BLK_DEV_INITRD /* * Setup initial RAM disk limits of using INITRD. */ .extern initrd_start .extern initrd_end #endif /*****************************************************************************/ .text /* * This is the codes first entry point. This is where it all * begins... */ _start: nop /* Filler */ move.w #0x2700, %sr /* No interrupts */ move.l #MCF_MBAR+1, %a0 /* Set I/O base addr */ movec %a0, %MBAR /* Note: bit 0 is Validate */ move.l #MEM_BUILTIN+1,%a0 /* Set SRAM base addr */ movec %a0, %RAMBAR0 /* Note: bit 0 is Validate */ move.l #MCF_MBAR, %a0 /* Get I/O base addr */ /* ----------------------- CS1 ----------------------- */ move.w #CS1_ADDR, %d0 /* CS1 address */ move.w %d0, MCFSIM_CSAR1(%a0) /* CS1 address */ move.l #CS1_MASK, %d0 /* CS1 mask */ move.l %d0, MCFSIM_CSMR1(%a0) /* CS1 mask */ move.w #CS1_CTRL, %d0 /* CS1 control */ move.w %d0, MCFSIM_CSCR1(%a0) /* CS1 control */ /* ----------------------- CS2 ----------------------- */ move.w #CS2_ADDR, %d0 /* CS2 address */ move.w %d0, MCFSIM_CSAR2(%a0) /* CS2 address */ move.l #CS2_MASK, %d0 /* CS2 mask */ move.l %d0, MCFSIM_CSMR2(%a0) /* CS2 mask */ move.w #CS2_CTRL, %d0 /* CS2 control */ move.w %d0, MCFSIM_CSCR2(%a0) /* CS2 control */ /* ----------------------- CS3 ----------------------- */ move.w #CS3_ADDR, %d0 /* CS3 address */ move.w %d0, MCFSIM_CSAR3(%a0) /* CS3 address */ move.l #CS3_MASK, %d0 /* CS3 mask */ move.l %d0, MCFSIM_CSMR3(%a0) /* CS3 mask */ move.w #CS3_CTRL, %d0 /* CS3 control */ move.w %d0, MCFSIM_CSCR3(%a0) /* CS3 control */ /* ----------------------- CS4 ----------------------- */ move.w #CS4_ADDR, %d0 /* CS4 address */ move.w %d0, MCFSIM_CSAR4(%a0) /* CS4 address */ move.l #CS4_MASK, %d0 /* CS4 mask */ move.l %d0, MCFSIM_CSMR4(%a0) /* CS4 mask */ move.w #CS4_CTRL, %d0 /* CS4 control */ move.w %d0, MCFSIM_CSCR4(%a0) /* CS4 control */ /* ----------------------- CS5 ----------------------- */ move.w #CS5_ADDR, %d0 /* CS5 address */ move.w %d0, MCFSIM_CSAR5(%a0) /* CS5 address */ move.l #CS5_MASK, %d0 /* CS5 mask */ move.l %d0, MCFSIM_CSMR5(%a0) /* CS5 mask */ move.w #CS5_CTRL, %d0 /* CS5 control */ move.w %d0, MCFSIM_CSCR5(%a0) /* CS5 control */ /* ----------------------- CS6 ----------------------- */ move.w #CS6_ADDR, %d0 /* CS6 address */ move.w %d0, MCFSIM_CSAR6(%a0) /* CS6 address */ move.l #CS6_MASK, %d0 /* CS6 mask */ move.l %d0, MCFSIM_CSMR6(%a0) /* CS6 mask */ move.w #CS6_CTRL, %d0 /* CS6 control */ move.w %d0, MCFSIM_CSCR6(%a0) /* CS6 control */ /* ----------------------- CS7 ----------------------- */ move.w #CS7_ADDR, %d0 /* CS7 address */ move.w %d0, MCFSIM_CSAR7(%a0) /* CS7 address */ move.l #CS7_MASK, %d0 /* CS7 mask */ move.l %d0, MCFSIM_CSMR7(%a0) /* CS7 mask */ move.w #CS7_CTRL, %d0 /* CS7 control */ move.w %d0, MCFSIM_CSCR7(%a0) /* CS7 control */ /* --------------------- Default --------------------- */ move.w #DMC_CTRL, %d0 /* Default control */ move.w %d0, MCFSIM_DMCR(%a0) /* Default control */ /* ----------------------- DRAM ------------------------ */ move.w #DCRR, %d0 /* Refresh period */ move.w %d0, MCFSIM_DCRR(%a0) /* Refresh period */ move.w #DCTR, %d0 /* Timing address */ move.w %d0, MCFSIM_DCTR(%a0) /* Timing address */ move.w #DCAR0, %d0 /* DRAM0 base address */ move.w %d0, MCFSIM_DCAR0(%a0) /* DRAM0 base address */ move.l #DCMR0, %d0 /* DRAM0 mask */ move.l %d0, MCFSIM_DCMR0(%a0) /* DRAM0 mask */ move.b #DCCR0, %d0 /* DRAM0 control */ move.b %d0, MCFSIM_DCCR0(%a0) /* DRAM0 control */ move.w #DCAR1, %d0 /* DRAM1 base address */ move.w %d0, MCFSIM_DCAR1(%a0) /* DRAM1 base address */ move.l #DCMR1, %d0 /* DRAM1 mask */ move.l %d0, MCFSIM_DCMR1(%a0) /* DRAM1 mask */ move.b #DCCR1, %d0 /* DRAM1 control */ move.b %d0, MCFSIM_DCCR1(%a0) /* DRAM1 control */ /* * ChipSelect 0 - ROM cs * * ChipSelect 0 is the global chip select coming out of system reset. * CS0 is asserted for every access until CSMR0 is written. Therefore, * the entire ChipSelect must be properly set prior to asserting * CSCR0_V. */ move.w #CS0_ADDR, %d0 /* CS0 address */ move.w %d0, MCFSIM_CSAR0(%a0) /* CS0 address */ move.l #CS0_MASK, %d0 /* CS0 mask */ move.l %d0, MCFSIM_CSMR0(%a0) /* CS0 mask */ move.w #CS0_CTRL, %d0 /* CS0 control */ move.w %d0, MCFSIM_CSCR0(%a0) /* CS0 control */ /* * Setup VBR here, otherwise buserror remap will not work. * if dBug was active before (on my SBC with dBug 1.1 of Dec 16 1996) * * bkr@cut.de 19990306 * * Note: this is because dBUG points VBR to ROM, making vectors read * only, so the bus trap can't be changed. (RS) */ move.l #VBR_BASE, %a7 /* Note VBR can't be read */ movec %a7, %VBR move.l %a7, _ramvec /* Set up vector addr */ move.l %a7, _rambase /* Set up base RAM addr */ /* * Determine size of RAM, then set up initial stack * Done differently for different eval boards and cpus. */ #if defined(CONFIG_SMALL) /* * Set to SRAM size when configuring a minimal system */ move.l #MEM_MAX, %a0 #else /* * On the Arnewsh 5206 board and the Motorola m5206eLITE board * we can probe for the amount of DRAM present... */ move.l #MEM_MIN, %a0 /* Start at bottom */ move.l #MEM_MAX, %a1 /* Set stop point */ lea.l MEM_TMPSTACK, %sp /* Set up tmp stack ptr */ move.l #VBR_BASE+8, %a2 /* Address of bus trap */ lea.l _ram_buserr, %a3 /* Get RAM trap address */ move.l %a3, (%a2) /* Set trap to local ptr */ _find_ram: move.l (%a0), %d0 /* Attempt read */ add.l #MEM_LUMP, %a0 /* Try next bank */ cmp.l %a1, %a0 /* Check more? */ bne _find_ram /* * BUS error trap handler - used for RAM probing. */ _ram_buserr: bra _found_ram _found_ram: /* Vectored here on bus err */ #endif move.l %a0, %d0 /* Mem end addr is in a0 */ move.l %d0, %sp /* Set up initial stack ptr */ move.l %d0, _ramend /* Set end ram addr */ /* * Enable CPU internal cache. */ move.l #0x01000000, %d0 /* Invalidate cache cmd */ movec %d0, %CACR /* Invalidate cache */ move.l #0x80000100, %d0 /* Setup cache mask */ movec %d0, %CACR /* Enable cache */ /* * Move ROM filesystem above bss :-) */ lea.l _sbss, %a0 /* Get start of bss */ lea.l _ebss, %a1 /* Set up destination */ move.l %a0, %a2 /* Copy of bss start */ #if CONFIG_BLK_DEV_INITRD move.l %a1, %d2 add.l #0xfff, %d2 /* Round ROMfs start to page */ and.l #0xfffff000, %d2 move.l %d2, %a1 /* Save result for later */ #endif move.l 8(%a0), %d1 /* Get size of ROMFS */ addq.l #8, %d1 /* Allow for rounding */ and.l #0xfffffffc, %d1 /* Whole words */ add.l %d1, %a0 /* Copy from end */ add.l %d1, %a1 /* Copy from end */ move.l %a1, _ramstart /* Set start of ram */ _copy_romfs: move.l -(%a0), %d0 /* Copy dword */ move.l %d0, -(%a1) cmp.l %a0, %a2 /* Check if at end */ bne _copy_romfs /* * Zero out the bss region. */ lea.l _sbss, %a0 /* Get start of bss */ lea.l _ebss, %a1 /* Get end of bss */ clr.l %d0 /* Set value */ _clear_bss: move.l %d0, (%a0)+ /* Clear each word */ cmp.l %a0, %a1 /* Check if at end */ bne _clear_bss #if CONFIG_BLK_DEV_INITRD /* * Setup up RAMdisk info if using it. * (Must do this after clearing the bss :-) */ move.l %d2, initrd_start /* Set up start of initrd */ add.l %d1, %d2 /* Calculate end of initrd */ move.l %d2, initrd_end #endif /* * Load the current task pointer and stack. */ lea init_task_union, %a0 movel %a0, _current_task lea 0x2000(%a0), %sp /* * Assember start up done, start code proper. */ jsr start_kernel /* Start Linux kernel */ _exit: jmp _exit /* Should never get here */ /*****************************************************************************/