summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/mips/genmongoosev/start/start.S
diff options
context:
space:
mode:
Diffstat (limited to 'c/src/lib/libbsp/mips/genmongoosev/start/start.S')
-rw-r--r--c/src/lib/libbsp/mips/genmongoosev/start/start.S909
1 files changed, 0 insertions, 909 deletions
diff --git a/c/src/lib/libbsp/mips/genmongoosev/start/start.S b/c/src/lib/libbsp/mips/genmongoosev/start/start.S
deleted file mode 100644
index 190c2d1e48..0000000000
--- a/c/src/lib/libbsp/mips/genmongoosev/start/start.S
+++ /dev/null
@@ -1,909 +0,0 @@
-/*
-** start.S -- startup file for Mongoose V BSP based upon crt0.S from
-** newlib-1.8.2/libgloss/mips and adapted for RTEMS.
-**
-** crt0.S -- startup file for MIPS.
-**
-** Copyright (c) 1995, 1996, 1997 Cygnus Support
-**
-** The authors hereby grant permission to use, copy, modify, distribute,
-** and license this software and its documentation for any purpose, provided
-** that existing copyright notices are retained in all copies and that this
-** notice is included verbatim in any distributions. No written agreement,
-** license, or royalty fee is required for any of the authorized uses.
-** Modifications to this software may be copyrighted by their authors
-** and need not follow the licensing terms described here, provided that
-** the new terms are clearly indicated on the first page of each file where
-** they apply.
-**
-**
-** Modification History:
-** 01/XX/01 Joel Sherrill, OAR Corp,
-** Modified for Mongoose V BSP for NASA/GSFC Code 582.
-**
-** 06/XX/01 Greg Menke, Raytheon, Code 582
-** Debug modifications. Removed R4000 dependencies.
-** Added HACKED_PMON defines to facilitate startup.
-** Added DEFAULT_EXIT_RETURN_TO_MONITOR option.
-**
-** 11/14/01 A.Ferrer, NASA/GSFC, Code 582
-** Cleanup for ST5 mission.
-**
-** 11/27/01 A.Ferrer, NASA/GSFC, Code 582
-** Added cache flush routines.
-*/
-
-#ifndef LANGUAGE_ASSEMBLY
-#define LANGUAGE_ASSEMBLY
-#endif
-
-#include <rtems/asm.h>
-#include <bsp/regs.h>
-#include "mg5.h"
-
-#ifdef __mips16
- /* This file contains 32 bit assembly code. */
- .set nomips16
-#endif
-
-/*
-** defined by linkcmds, pointing to the start of the relocation target
-** memory, referenced in this way so we can avoid defining it
-** multiply
-*/
- .bss
- .word 0
- .text
- .align 2
-
-/**********************************************************************
-**
-** Function: _start
-*/
-
- /* Without the following nop, GDB thinks _start is a data variable.
- ** This is probably a bug in GDB in handling a symbol that is at the
- ** start of the .text section.
- */
- nop
- .globl _start
- .ent _start
-
- .globl putch_rom
-_start:
- .set noreorder
- $LF1 = . + 8
-
- /*
- ** Get the address of start into $5 in a position independent fashion.
- ** This lets us know whether we have been relocated or not.
- */
-
- bal $LF1
- nop
-_branch:
- move a1, ra /* save return address from the jump above */
-
- /* ensure we're sane before doing anything */
-
- li t0, SR_CU0|SR_PE
- mtc0 t0, C0_SR
- nop
- li t0, 0
- mtc0 t0, C0_DCIC
- nop
- mtc0 t0, C0_CAUSE
- nop
-
- /*
- ** Call cpuinit. Masking used to call EEPROM address of _cpuinit. Label is RAM label.
- */
- move t2,a1
- and t2,0xffff0000
- la t0,_cpuinit
- and t0,0x0000ffff
- or t0,t2
- jal t0
- nop
-
- /*
- ** Configure UART
- */
- move t2,a1
- and t2,0xffff0000
- la t0,config_uart
- and t0,0x0000ffff
- or t0,t2
- jal t0
- nop
-
- /*
- ** Print 'b'. Show that we started.
- */
- move t2,a1
- and t2,0xffff0000
- li a0,'b'
- la t0,putch_rom
- and t0,0x0000ffff
- or t0,t2
- jal t0
- nop
-
- li k0,0
- li k1,0
-
- move t1,a1
- nop
- li t2,0xa0000000 /* lower limit of kseg1 */
- li t3,0xbfffffff /* upper limit of kseg1 */
-
- subu t0,t1,t2
- srl t0,31 /* shift high bit down to bit 0 */
- bnez t0,1f /* booting from below kseg1 */
-
- subu t0,t3,t1
- srl t0,31 /* shift high bit down to bit 0 */
- bnez t0,1f /* booting from above kseg1 */
-
- /*
- ** Call IcacheFlush. Masking used to call EEPROM address of IcacheFlush. Label is RAM label.
- */
- move t2,a1
- and t2,0xffff0000
- la t0,IcacheFlush
- and t0,0x0000ffff
- or t0,t2
- move k0,t0 /* save cache flush in-prom address */
- jal t0
- nop
-
- /*
- ** Print 'I'. Show that we flushed I cache.
- */
- move t2,a1
- and t2,0xffff0000
- li a0,'I'
- la t0,putch_rom
- and t0,0x0000ffff
- or t0,t2
- jal t0
- nop
-
- /*
- ** Call DcacheFlush. Masking used to call EEPROM address of DcacheFlush. Label is RAM label.
- */
- move t2,a1
- and t2,0xffff0000
- la t0,DcacheFlush
- and t0,0x0000ffff
- or t0,t2
- jal t0
- nop
-
- /*
- ** Print 'D'. Show that we flushed D cache.
- */
- move t2,a1
- and t2,0xffff0000
- li a0,'D'
- la t0,putch_rom
- and t0,0x0000ffff
- or t0,t2
- move k1,t0 /* save cache flush in-prom address */
- jal t0
- nop
-
-1:
- /*
- ** Print ' RTEMS b'. Show that we are booting.
- */
- move t2,a1
- and t2,0xffff0000
- li a0,' '
- la t0,putch_rom
- and t0,0x0000ffff
- or t0,t2
- jal t0
- nop
-
- move t2,a1
- and t2,0xffff0000
- li a0,'R'
- la t0,putch_rom
- and t0,0x0000ffff
- or t0,t2
- jal t0
- nop
-
- move t2,a1
- and t2,0xffff0000
- li a0,'T'
- la t0,putch_rom
- and t0,0x0000ffff
- or t0,t2
- jal t0
- nop
-
- move t2,a1
- and t2,0xffff0000
- li a0,'E'
- la t0,putch_rom
- and t0,0x0000ffff
- or t0,t2
- jal t0
- nop
-
- move t2,a1
- and t2,0xffff0000
- li a0,'M'
- la t0,putch_rom
- and t0,0x0000ffff
- or t0,t2
- jal t0
- nop
-
- move t2,a1
- and t2,0xffff0000
- li a0,'S'
- la t0,putch_rom
- and t0,0x0000ffff
- or t0,t2
- jal t0
- nop
-
- move t2,a1
- and t2,0xffff0000
- li a0,' '
- la t0,putch_rom
- and t0,0x0000ffff
- or t0,t2
- jal t0
- nop
-
- move t2,a1
- and t2,0xffff0000
- li a0,'b'
- la t0,putch_rom
- and t0,0x0000ffff
- or t0,t2
- jal t0
- nop
-
- /*
- ** get the address of the _branch label above as it would appear in
- ** the relocated code
- */
-
- la a2, _branch /* relocation destination */
- beq a1, a2, _start_in_ram /* skip relocating if we're already there */
- nop
-
- /* relocate the code from EEPROM to RAM */
-
- /*
- ** Print 'r'
- */
- move t2,a1
- and t2,0xffff0000
- li a0,'r'
- la t0,putch_rom
- and t0,0x0000ffff
- or t0,t2
- jal t0
- nop
-
- la a3, _edata
-relocate:
- lw t0, (a1) /* load from EEPROM */
- addu a1, 4
- sw t0, (a2) /* store to RAM */
- addu a2, 4
- bne a2, a3, relocate /* copied all the way to edata? */
- nop
-
- /*
- ** Print 'R'
- */
- li a0,'R'
- la t0,putch_rom
- and t0,0x0000ffff
- or t0,t2
- jal t0
- nop
-
- la a2, _start_in_ram
- jr a2
- nop
- .end _start
-
-/**********************************************************************
-**
-** Function: _start_in_ram
-*/
-
- .globl _start_in_ram
- .ent _start_in_ram
-_start_in_ram:
-
- /*
- ** Print 'S'. Already in RAM no need to reference EEPROM address.
- */
- li a0,'S'
- jal putch_rom
- nop
-
- la gp, _gp /* set the global data pointer */
- .end _start_in_ram
-
-/**********************************************************************
-**
-** Function: zerobss
-*/
- .globl zerobss
- .ent zerobss
-zerobss:
-
- /*
- ** Print 'z'. Starting to zero out bss.
- */
- li a0,'z'
- jal putch_rom
- nop
-
- la v0, _fbss
- la v1, _end
-3:
- sw zero,0(v0)
- bltu v0,v1,3b
- addiu v0,v0,4 /* executed in delay slot */
-
- la t0, _stack_init /* initialize stack so we */
-
- /*
- ** We must subtract 24 bytes for the 3 8 byte arguments to main, in
- ** case main wants to write them back to the stack. The caller is
- ** supposed to allocate stack space for parameters in registers in
- ** the old MIPS ABIs. We must do this even though we aren't passing
- ** arguments, because main might be declared to have them.
- **
- ** Some ports need a larger alignment for the stack, so we subtract
- ** 32, which satisifes the stack for the arguments and keeps the
- ** stack pointer better aligned.
- */
- subu t0,t0,32
- move sp,t0 /* set stack pointer */
- nop
-
- /*
- ** Print 'Z'. Finished zeroing bss.
- */
- li a0,'Z'
- jal putch_rom
- nop
-
- .end zerobss
-
-/**********************************************************************
-**
-** Function: _init
-*/
- .globl exit .text
- .globl _initialize_rtems
- .ent _initialize_rtems
-_initialize_rtems:
-
- /*
- ** Print 'i'. Starting to initialize RTEMS.
- */
- li a0, 'i'
- jal putch_rom
- nop
-
- /*
- ** Save the boot-time addresses of the I & D cache flush routines.
- ** Note, if we're running from RAM, we cannot manipulate the cache
- ** so we just disable the cache flush functions.
- */
- la a0,_promIcache
- sw k0,0(a0)
- nop
-
- la a0,_promDcache
- sw k1,0(a0)
- nop
-
- move a0,zero /* set command line to 0 */
- jal boot_card /* call the program start function */
- nop
-
- /*
- ** fall through to the "exit" routine
- */
- jal _sys_exit
- nop
- .end _initialize_rtems
-
-/**********************************************************************
-**
-** Function: _sys_exit
-**
-** Exit from the application by jumping to PMON address in EEPROM.
-*/
- .globl _sys_exit
- .ent _sys_exit
-_sys_exit:
- la t0, PMON_ADDRESS
- jal t0
- .end _sys_exit
-
-/**********************************************************************
-**
-** function: putch
-** input : ASCII character in A0
-** registers used: ra, a0, t0, t1
-**
-*/
- .globl putch_rom
- .ent putch_rom
-putch_rom:
-
- /*
- ** Delay for UART
- */
- li t0, 1000
- move t1, zero
-2:
- beq t0, t1, 3f
- addu t1, 1
- b 2b
- nop
-
-3:
- /*
- ** Print a character out from a0
- */
-
- li t0, MG5_INT_STATUS_REG /* load uart register base address */
- lw t1, 0(t0) /* Read status */
- nop
- and t1, t1, UART_0_TX_READY_BIT /* see if the transmitter is ready */
- beq t1 , zero , 1f /* skip uart output if not ready */
- nop
- la t0, MG5_UART_0_TX_REG
- sw a0, 0(t0)
- nop
-
-1: /*
- ** if jumped to here, UART was not ready...forget it
- */
- j ra
- .end putch_rom
-
-/**********************************************************************
-**
-** function: config_uart
-** registers used: ra, t0, t1
-**
-*/
-
- .globl config_uart
- .ent config_uart
-config_uart:
-
- /*
- ** Configure UART 0
- */
-
- /* First, reset the uart */
- la t0, MG5_COMMAND_REG
- li t1, UART_RESET_BIT
- sw t1, 0(t0)
-
- /* Next, set the baud rate register for 19200 with a clock speed of 12 Mhz*/
- la t0, MG5_UART_0_BAUD_REG
- li t1, 0x02700270
- sw t1, 0(t0)
-
- /* Now, clear the reset bit & set the tx enable bit */
- la t0, MG5_COMMAND_REG
- li t1, UART_0_TX_ENABLE_BIT
- sw t1, 0(t0)
-
- /*
- ** return
- */
- j ra
-.end config_uart
-
-/*************************************************************
-* CpuInit:
-* Perform CPU-specific initialization
-* This routine is only callable from assembly because it
-* clobbers s7. It should be called from your ROM-based startup
-* code. It returns:
-* s0 = address of cache flush routine
-*/
-
- .globl _cpuinit
- .ent _cpuinit
-_cpuinit:
-
- /*
- ** BIU/Cache config register setup
- **
- ** RES = 0: 31 -> 18 : Reserved
- ** RES = 1: 17 : Reserved must be set to 1 (Synova Manual)
- ** RES = 0: 16 : Reserved must be set to 0 (Synova Manual)
- ** BGNT = 0: 15 : Disable Bus Grant (set to 0)
- ** NOPAD = 1: 14 : No padding of waitstates between transactions
- ** RDPRI = 1: 13 : Loads have priority over stores
- ** INTP = 1: 12 : Interrupts are active high
- ** IS1 = 1: 11 : Enable I-Cache
- ** IS0 = 0: 10 : Hardwired to zero
- ** IBLKSZ =10: 9 -> 8 : I-Cache refill size = 8 words
- ** DS = 1: 7 : Enable D-Cache
- ** RES = 0: 6 : Hardwared to zero
- ** DBLKSZ =10: 5 -> 4 : D-Cache refill block size 8 words
- ** RAM = 0: 3 : No Scratchpad RAM
- ** TAG = 0: 2 : Disable tag test
- ** INV = 0: 1 : Disable invalidate mode
- ** LOCK = 0: 0 : Disable cache lock
- **
- ** 0x00027AA0 caches on
- ** 0x00027220 caches off
- */
- li t0,0x00027aa0
- sw t0,M_BIU
-
- /*
- ** Refresh register setup
- **
- ** set 94 clock cycles at 12Mhz
- */
- li t1,M_RTIC
- li t0,0x5E
- sw t0,(t1)
-
- /*
- ** DRAM register setup
- **
- **
- ** RESERVED=0: 31 -> 29 : Reserved
- ** SYNC = 0 : 27 : No Syncronous DRAM
- ** SCFG = 0 : 26 : No Syncronous DRAM
- ** DMARDY =1 : 25 : Internal DRDY for DMA
- ** DMABLK =0 : 24 -> 22 : 2 word blk size for DMA transfers
- ** DPTH = 0 : 21 -> 20 : No interleaved or syncronous memory
- ** RDYW = 0 : 19 : No interleaved or syncronous memory
- ** PGSZ = 110: 18 -> 16 : Page size = 1K
- ** PGMW = 0 : 15 : Disable page mode write
- ** RFWE = 0 : 14 -> 13 : Allow BIU to do non-DRAM work during refresh
- ** RFEN = 1 : 12 : Enable Refresh generator
- ** RDYEN = 1 : 11 : Internal DRDY
- ** BFD = 1 : 10 : Block fetch disable
- ** PE = 0 : 9 : No parity checking
- ** RPC = 0 : 8 -> 7 : RAS Precharge = 2 SYSCLK cycles
- ** RCD = 1 : 6 -> 5 : RAS-to-CAS delay = 3 cycles
- ** CS = 0 : 4 : CAS shortened by 1/2 cycle
- ** CL = 1 : 3 -> 1 : 2.5 cycle CAS pulse width
- ** DCE = 1 : 0 : Enable DRAM controller
- */
- li s0,0x02061C23
- sw s0,M_DRAM
-
- /*
- ** SRAM setup
- ** Dont Care about this, we are not using SRAM
- ** Power on default of 0x0 is ok
- */
- li t0,0
- sw t0,M_SRAM
-
- /*
- ** SPEC0 setup
- **
- ** SPEC0 contains the BCRT registers, BCRT Shared RAM and EEPROM
- ** This area is configured to use an external waitstate generator
- ** and Data Ready signal.
- ** Also, I see no need to cache this data. It could confuse the
- ** BCRT.
- **
- ** - 9/29/99 - APC - set NOSNOOP to 1 and EXTGNT to 1
- ** Bit 23 = 1 : EXTGNT External data ready = 1
- ** Bit 19 = 1 : NOSNOOP No Snoop = 1
- */
- li t0,0x00880000 # use external waitstates
- sw t0,M_SPEC0
-
- /*
- ** SPEC1 setup
- **
- ** This is where most of the SDB I/O is.
- **
- ** Important fields:
- **
- ** Bit 19 =1 : NOSNOOP = 1
- ** Bit 6 = 1 : Enable DAWG
- ** Bit 5 -> 0 = 1 : 1 Wait state
- */
- li t0,0x00880000 /* Bit23 EXTGNT set to 1, Bit19 NOSNOOP set to 1 */
- sw t0,M_SPEC1
-
- /*
- ** SPEC2 setup
- **
- ** SPEC2 is not currently used on the SDB.
- ** Bit 19 = 1 : NOSNOOP = 1
- **
- **li t0, 0x00080000
- **sw t0,M_SPEC2
- */
- li t0, 0x0
- sw t0,M_SPEC2
-
- /*
- ** SPEC3 Setup
- ** SPEC3 will be used for the SONIC ethernet controller.
- ** Use the same ** of waitstates that the turborocket board uses.
- ** Bit 19 = 1 : NOSNOOP = 1
- **
- **li t0, (SPC_CACHED | SPC_WAITENA | (16<<SPC_WAITSHFT))
- **sw t0,M_SPEC3
- */
- li t0, 0x0
- sw t0,M_SPEC3
-
- /*
- ** Finally, delay to allow RAM to stabilize
- */
- li t0,2000
-1: subu t0,1
- bne t0,zero,1b
- nop
-
- /*
- ** Init Mongoose V registers.
- */
-
- /*
- ** Mongoose V Control Register Setup
- ** For now just setup UART defaults, turn edac off.
- ** May not even need to put anything in here...
- */
- li t0,0
- sw t0,MG5_COMMAND_REG
-
- /*
- ** Setup Mongoose V extended interrupt mask
- */
- li t0,0
- sw t0,MG5_INT_MASK_REG
-
- /*
- ** Clear Mongoose V extended interrupts
- ** Clear all of the pulse interrupts that may be pending.
- */
- li t0,( EDAC_SERR_BIT | EDAC_MERR_BIT | UART_0_RX_OVERRUN_BIT | UART_0_FRAME_ERR_BIT | UART_1_RX_OVERRUN_BIT | UART_1_FRAME_ERR_BIT | MAVN_WRITE_ACC_BIT | MAVN_READ_ACC_BIT )
- sw t0,MG5_INT_STATUS_REG
-
- /*
- ** Setup MAVN Access Priv Register
- */
- li t0,0x7FFFFFFF /* Default reset value */
- sw t0,MG5_MAVN_PRIVLEGE_REG
-
- /*
- ** Mavn Range Register 0 -- 0 and 1 cover EEPROM
- ** 0xbfc00000 -> 0xbfe00000
- */
- li t0,( 0xBFC00000 | 0x15 )
- sw t0,MG5_MAVN_RANGE_0_REG
-
- /*
- ** Mavn Range Register 1
- ** 0xbfe00000 -> 0xc0000000
- */
- li t0,( 0xBFE00000 | 0x15 )
- sw t0,MG5_MAVN_RANGE_1_REG
-
- /*
- ** Mavn Range Register 2 -- 2 and 3 cover the first RAM
- ** 0x80000000 -> 0x80200000
- */
- li t0,( 0x80000000 | 0x15 )
- sw t0,MG5_MAVN_RANGE_2_REG
-
- /*
- ** Mavn Range Register 3
- ** 0x80200000 -> 0x80400000
- */
- li t0, ( 0x80200000 | 0x15 )
- sw t0, MG5_MAVN_RANGE_3_REG
-
- /*
- ** Mavn Range Register 4 -- IO Space 1
- ** 0xBE00000 -> 0xBe0000200
- */
- li t0, ( 0xBe000000 | 0x09 )
- sw t0, MG5_MAVN_RANGE_4_REG
-
- /*
- ** Mavn Range Register 5 -- IO Space 2
- ** 0xBe200000 -> 0xbe400000
- */
- li t0, ( 0xBE200000 | 0x15 )
- sw t0, MG5_MAVN_RANGE_5_REG
-
- /*
- ** MAVN Error Address Register ( Unstick )
- */
- la t0, MG5_MAVN_VIOLATION_REG
- lw t1, 0(t0)
-
- /*
- ** Read EDAC Error Register to unstick it
- */
- la t0, MG5_EDAC_ADDR_REG
- lw t1, 0(t0)
-
- /*
- ** Enable Mongoose V EDAC
- */
- la t0, MG5_COMMAND_REG
- li t1, EDAC_ENABLE_BIT
- sw t1, 0(t0)
- nop
-
- /*
- ** Program Watchdog to 10 seconds - If PMON will
- ** run, it will be set to MAX later.
- */
- la t0, 0xBE000000
- li t1, 0xA0
- sw t1, 0(t0)
-
-3: nop
-
- j ra
- .end _cpuinit
-
-/**********************************************************************
-**
-** Keep the boot-time address of the I & D cache reset code for
-** later on. If we need to clear the I/D caches, we <must> run from
-** non-cached memory. This means the relocated versions are useless,
-** thankfully they are quite small.
-*/
-
-_promIcache: .word 0
-_promDcache: .word 0
-
- .globl promCopyIcacheFlush
- .ent promCopyIcacheFlush
- .set noreorder
-promCopyIcacheFlush:
- move a0,ra
-
- la t1,_promIcache
- lw t0,0(t1)
- nop
- beqz t0,1f
-
- jal t0
- nop
-
-1: j a0
- nop
- .set reorder
- .end promCopyIcacheFlush
-
- .globl promCopyDcacheFlush
- .ent promCopyDcacheFlush
- .set noreorder
-promCopyDcacheFlush:
- move a0,ra
-
- la t1,_promDcache
- lw t0,0(t1)
- nop
- beqz t0,1f
-
- jal t0
- nop
-
-1: j a0
- nop
- .set reorder
- .end promCopyDcacheFlush
-
-/*******************************************************************************
-** Function Name: IcacheFlush
-** Description: This functions flushes the on chip icache.
-*/
-
- .ent IcacheFlush
- .set noreorder
-IcacheFlush:
-
-1:
- /*
- ** Assume I cache is already enabled in BIU/Cache setup
- ** Get contents of M_BIU register and save in t1
- */
- li t0, M_BIU
- lw t1, 0(t0)
-
- /*
- ** Isolate I cache
- */
- mfc0 t3, C0_SR /* Read Status Register */
- nop
- or t0, t3, SR_ISC /* Isolate Cache so we don't propagate operations */
- mtc0 t0, C0_SR /* Write it back to Status Register */
- nop
-
- /*
- ** Setup for cache flush
- */
- li t8, 0 /* Store zero */
- li t9, LR33300_IC_SIZE
-
-icache_write:
- sw zero, 0(t8) /* Store zero to memory addres in t8 */
- addu t8, 4 /* Increment t8 address by 4 */
- bltu t8, t9, icache_write /* check to see if we are done */
- nop
-
- /*
- ** De-isolate I cache
- */
- mtc0 t3, C0_SR /* Load unchanged t3 to Status Register */
- nop
-
- jal ra
- nop
- .set reorder
- .end IcacheFlush
-
-/********************************************************
-** Function Name: DcacheFlush
-** Description: This functions flushes the on chip dcache.
-*/
-
- .ent DcacheFlush
- .set noreorder
-DcacheFlush:
-
- /*
- ** isolate icache
- */
- mfc0 t3,C0_SR
- nop
- or t0, t3, SR_ISC
- mtc0 t0, C0_SR
- nop
-
- /*
- ** Setup up for cache flush
- */
- li t8, 0
- li t9, LR33300_DC_SIZE
-
-dcache_write:
- sw zero, 0(t8)
- addu t8, 4
- bltu t8, t9, dcache_write /* check to see if we are done */
- nop
-
- /*
- ** De-isolate cache
- */
- mtc0 t3, C0_SR
- nop
-
- jal ra
- nop
- .set reorder
- .end DcacheFlush
-
-/* EOF start.S */