|  | /* Memory sub-system initialization code */ | 
|  |  | 
|  | #include <config.h> | 
|  | #include <asm/regdef.h> | 
|  | #include <asm/au1x00.h> | 
|  | #include <asm/mipsregs.h> | 
|  |  | 
|  | #define AU1500_SYS_ADDR		0xB1900000 | 
|  | #define sys_endian		0x0038 | 
|  | #define CP0_Config0		$16 | 
|  | #define MEM_1MS			((396000000/1000000) * 1000) | 
|  |  | 
|  | .text | 
|  | .set noreorder | 
|  | .set mips32 | 
|  |  | 
|  | .globl	lowlevel_init | 
|  | lowlevel_init: | 
|  | /* | 
|  | * Step 1) Establish CPU endian mode. | 
|  | * NOTE: A fair amount of code is necessary on the Pb1000 to | 
|  | * obtain the value of Switch S8.1 which is used to determine | 
|  | * endian at run-time. | 
|  | */ | 
|  |  | 
|  | /* RCE1 */ | 
|  | li		t0, MEM_STCFG1 | 
|  | li		t1, 0x00000083 | 
|  | sw		t1, 0(t0) | 
|  |  | 
|  | li		t0, MEM_STTIME1 | 
|  | li		t1, 0x33030A10 | 
|  | sw		t1, 0(t0) | 
|  |  | 
|  | li		t0, MEM_STADDR1 | 
|  | li		t1, 0x11803E40 | 
|  | sw		t1, 0(t0) | 
|  |  | 
|  | /* Set DSTRB bits so switch will read correctly */ | 
|  | li		t1, 0xBE00000C | 
|  | lw		t2, 0(t1) | 
|  | or		t2, t2, 0x00000300 | 
|  | sw		t2, 0(t1) | 
|  |  | 
|  | /* Check switch setting */ | 
|  | li		t1, 0xBE000014 | 
|  | lw		t2, 0(t1) | 
|  | and		t2, t2, 0x00000100 | 
|  | bne		t2, zero, big_endian | 
|  | nop | 
|  |  | 
|  | little_endian: | 
|  |  | 
|  | /* Change Au1 core to little endian */ | 
|  | li	t0, AU1500_SYS_ADDR | 
|  | li	t1, 1 | 
|  | sw	t1, sys_endian(t0) | 
|  | mfc0	t2, CP0_CONFIG | 
|  | mtc0	t2, CP0_CONFIG | 
|  | nop | 
|  | nop | 
|  |  | 
|  | /* Big Endian is default so nothing to do but fall through */ | 
|  |  | 
|  | big_endian: | 
|  |  | 
|  | /* | 
|  | * Step 2) Establish Status Register | 
|  | * (set BEV, clear ERL, clear EXL, clear IE) | 
|  | */ | 
|  | li	t1, 0x00400000 | 
|  | mtc0	t1, CP0_STATUS | 
|  |  | 
|  | /* | 
|  | * Step 3) Establish CP0 Config0 | 
|  | * (set OD, set K0=3) | 
|  | */ | 
|  | li	t1, 0x00080003 | 
|  | mtc0	t1, CP0_CONFIG | 
|  |  | 
|  | /* | 
|  | * Step 4) Disable Watchpoint facilities | 
|  | */ | 
|  | li t1, 0x00000000 | 
|  | mtc0	t1, CP0_WATCHLO | 
|  | mtc0	t1, CP0_IWATCHLO | 
|  | /* | 
|  | * Step 5) Disable the performance counters | 
|  | */ | 
|  | mtc0	zero, CP0_PERFORMANCE | 
|  | nop | 
|  |  | 
|  | /* | 
|  | * Step 6) Establish EJTAG Debug register | 
|  | */ | 
|  | mtc0	zero, CP0_DEBUG | 
|  | nop | 
|  |  | 
|  | /* | 
|  | * Step 7) Establish Cause | 
|  | * (set IV bit) | 
|  | */ | 
|  | li	t1, 0x00800000 | 
|  | mtc0	t1, CP0_CAUSE | 
|  |  | 
|  | /* Establish Wired (and Random) */ | 
|  | mtc0	zero, CP0_WIRED | 
|  | nop | 
|  |  | 
|  | /* First setup pll:s to make serial work ok */ | 
|  | /* We have a 12 MHz crystal */ | 
|  | li	t0, SYS_CPUPLL | 
|  | li	t1, 0x21  /* 396 MHz */ | 
|  | sw	t1, 0(t0) | 
|  | sync | 
|  | nop | 
|  | nop | 
|  |  | 
|  | /* wait 1mS for clocks to settle */ | 
|  | li	t1, MEM_1MS | 
|  | 1:	add	t1, -1 | 
|  | bne	t1, zero, 1b | 
|  | nop | 
|  | /* Setup AUX PLL */ | 
|  | li	t0, SYS_AUXPLL | 
|  | li	t1, 8 /* 96 MHz */ | 
|  | sw	t1, 0(t0) /* aux pll */ | 
|  | sync | 
|  |  | 
|  | /*  Static memory controller */ | 
|  |  | 
|  | /* RCE0 8MB AMD29D323 Flash */ | 
|  | li	t0, MEM_STCFG0 | 
|  | li	t1, 0x00001403 | 
|  | sw	t1, 0(t0) | 
|  |  | 
|  | li	t0, MEM_STTIME0 | 
|  | li	t1, 0xFFFFFFDD | 
|  | sw	t1, 0(t0) | 
|  |  | 
|  | li	t0, MEM_STADDR0 | 
|  | li	t1, 0x11F83FE0 | 
|  | sw	t1, 0(t0) | 
|  |  | 
|  | /* RCE1 CPLD Board Logic */ | 
|  | li	t0, MEM_STCFG1 | 
|  | li	t1, 0x00000083 | 
|  | sw	t1, 0(t0) | 
|  |  | 
|  | li	t0, MEM_STTIME1 | 
|  | li	t1, 0x33030A10 | 
|  | sw	t1, 0(t0) | 
|  |  | 
|  | li	t0, MEM_STADDR1 | 
|  | li	t1, 0x11803E40 | 
|  | sw	t1, 0(t0) | 
|  |  | 
|  | /* RCE2 CPLD Board Logic */ | 
|  | li	t0, MEM_STCFG2 | 
|  | li	t1, 0x00000004 | 
|  | sw	t1, 0(t0) | 
|  |  | 
|  | li	t0, MEM_STTIME2 | 
|  | li	t1, 0x08061908 | 
|  | sw	t1, 0(t0) | 
|  |  | 
|  | li	t0, MEM_STADDR2 | 
|  | li	t1, 0x12A03FC0 | 
|  | sw	t1, 0(t0) | 
|  |  | 
|  | /* RCE3 PCMCIA 250ns */ | 
|  | li	t0, MEM_STCFG3 | 
|  | li	t1, 0x00000002 | 
|  | sw	t1, 0(t0) | 
|  |  | 
|  | li	t0, MEM_STTIME3 | 
|  | li	t1, 0x280E3E07 | 
|  | sw	t1, 0(t0) | 
|  |  | 
|  | li	t0, MEM_STADDR3 | 
|  | li	t1, 0x10000000 | 
|  | sw	t1, 0(t0) | 
|  |  | 
|  | sync | 
|  |  | 
|  | /* Set peripherals to a known state */ | 
|  | li	t0, IC0_CFG0CLR | 
|  | li	t1, 0xFFFFFFFF | 
|  | sw	t1, 0(t0) | 
|  |  | 
|  | li	t0, IC0_CFG0CLR | 
|  | sw	t1, 0(t0) | 
|  |  | 
|  | li	t0, IC0_CFG1CLR | 
|  | sw	t1, 0(t0) | 
|  |  | 
|  | li	t0, IC0_CFG2CLR | 
|  | sw	t1, 0(t0) | 
|  |  | 
|  | li	t0, IC0_SRCSET | 
|  | sw	t1, 0(t0) | 
|  |  | 
|  | li	t0, IC0_ASSIGNSET | 
|  | sw	t1, 0(t0) | 
|  |  | 
|  | li	t0, IC0_WAKECLR | 
|  | sw	t1, 0(t0) | 
|  |  | 
|  | li	t0, IC0_RISINGCLR | 
|  | sw	t1, 0(t0) | 
|  |  | 
|  | li	t0, IC0_FALLINGCLR | 
|  | sw	t1, 0(t0) | 
|  |  | 
|  | li	t0, IC0_TESTBIT | 
|  | li	t1, 0x00000000 | 
|  | sw	t1, 0(t0) | 
|  | sync | 
|  |  | 
|  | li	t0, IC1_CFG0CLR | 
|  | li	t1, 0xFFFFFFFF | 
|  | sw	t1, 0(t0) | 
|  |  | 
|  | li	t0, IC1_CFG0CLR | 
|  | sw	t1, 0(t0) | 
|  |  | 
|  | li	t0, IC1_CFG1CLR | 
|  | sw	t1, 0(t0) | 
|  |  | 
|  | li	t0, IC1_CFG2CLR | 
|  | sw	t1, 0(t0) | 
|  |  | 
|  | li	t0, IC1_SRCSET | 
|  | sw	t1, 0(t0) | 
|  |  | 
|  | li	t0, IC1_ASSIGNSET | 
|  | sw	t1, 0(t0) | 
|  |  | 
|  | li	t0, IC1_WAKECLR | 
|  | sw	t1, 0(t0) | 
|  |  | 
|  | li	t0, IC1_RISINGCLR | 
|  | sw	t1, 0(t0) | 
|  |  | 
|  | li	t0, IC1_FALLINGCLR | 
|  | sw	t1, 0(t0) | 
|  |  | 
|  | li	t0, IC1_TESTBIT | 
|  | li	t1, 0x00000000 | 
|  | sw	t1, 0(t0) | 
|  | sync | 
|  |  | 
|  | li	t0, SYS_FREQCTRL0 | 
|  | li	t1, 0x00000000 | 
|  | sw	t1, 0(t0) | 
|  |  | 
|  | li	t0, SYS_FREQCTRL1 | 
|  | li	t1, 0x00000000 | 
|  | sw	t1, 0(t0) | 
|  |  | 
|  | li	t0, SYS_CLKSRC | 
|  | li	t1, 0x00000000 | 
|  | sw	t1, 0(t0) | 
|  |  | 
|  | li	t0, SYS_PININPUTEN | 
|  | li	t1, 0x00000000 | 
|  | sw	t1, 0(t0) | 
|  | sync | 
|  |  | 
|  | li	t0, 0xB1100100 | 
|  | li	t1, 0x00000000 | 
|  | sw	t1, 0(t0) | 
|  |  | 
|  | li	t0, 0xB1400100 | 
|  | li	t1, 0x00000000 | 
|  | sw	t1, 0(t0) | 
|  |  | 
|  |  | 
|  | li	t0, SYS_WAKEMSK | 
|  | li	t1, 0x00000000 | 
|  | sw	t1, 0(t0) | 
|  |  | 
|  | li	t0, SYS_WAKESRC | 
|  | li	t1, 0x00000000 | 
|  | sw	t1, 0(t0) | 
|  |  | 
|  | /* wait 1mS before setup */ | 
|  | li	t1, MEM_1MS | 
|  | 1:	add	t1, -1 | 
|  | bne	t1, zero, 1b | 
|  | nop | 
|  |  | 
|  | /* | 
|  | * Skip memory setup if we are running from memory | 
|  | */ | 
|  | li		t0, 0x90000000 | 
|  | sub		t0, ra, t0 | 
|  | bltz		t0, skip_memsetup | 
|  | nop | 
|  |  | 
|  | /* | 
|  | * SDCS0 - Not used, for SMROM | 
|  | * SDCS1 - 32MB Micron 48LCBM16A2 | 
|  | * SDCS2 - 32MB Micron 48LCBM16A2 | 
|  | */ | 
|  | li	t0, MEM_SDMODE0 | 
|  | li	t1, 0x00000000 | 
|  | sw	t1, 0(t0) | 
|  |  | 
|  | li	t0, MEM_SDMODE1 | 
|  | li	t1, 0x00552229 | 
|  | sw	t1, 0(t0) | 
|  |  | 
|  | li	t0, MEM_SDMODE2 | 
|  | li	t1, 0x00552229 | 
|  | sw	t1, 0(t0) | 
|  |  | 
|  | li	t0, MEM_SDADDR0 | 
|  | li	t1, 0x00000000 | 
|  | sw	t1, 0(t0) | 
|  |  | 
|  | li	t0, MEM_SDADDR1 | 
|  | li	t1, 0x001003F8 | 
|  | sw	t1, 0(t0) | 
|  |  | 
|  | li	t0, MEM_SDADDR2 | 
|  | li	t1, 0x001023F8 | 
|  | sw	t1, 0(t0) | 
|  |  | 
|  | sync | 
|  |  | 
|  | li	t0, MEM_SDREFCFG | 
|  | li	t1, 0x74000c30 /* Disable */ | 
|  | sw	t1, 0(t0) | 
|  | sync | 
|  |  | 
|  | li	t0, MEM_SDPRECMD | 
|  | sw	zero, 0(t0) | 
|  | sync | 
|  |  | 
|  | li	t0, MEM_SDAUTOREF | 
|  | sw	zero, 0(t0) | 
|  | sync | 
|  | sw	zero, 0(t0) | 
|  | sync | 
|  |  | 
|  | li	t0, MEM_SDREFCFG | 
|  | li	t1, 0x76000c30 /* Enable */ | 
|  | sw	t1, 0(t0) | 
|  | sync | 
|  |  | 
|  | li	t0, MEM_SDWRMD0 | 
|  | li	t1, 0x00000023 | 
|  | sw	t1, 0(t0) | 
|  | sync | 
|  |  | 
|  | li	t0, MEM_SDWRMD1 | 
|  | li	t1, 0x00000023 | 
|  | sw	t1, 0(t0) | 
|  | sync | 
|  |  | 
|  | li	t0, MEM_SDWRMD2 | 
|  | li	t1, 0x00000023 | 
|  | sw	t1, 0(t0) | 
|  | sync | 
|  |  | 
|  | /* wait 1mS after setup */ | 
|  | li	t1, MEM_1MS | 
|  | 1:	add	t1, -1 | 
|  | bne	t1, zero, 1b | 
|  | nop | 
|  |  | 
|  | skip_memsetup: | 
|  |  | 
|  | li	t0, SYS_PINFUNC | 
|  | li	t1, 0/*0x00008080*/ | 
|  | sw	t1, 0(t0) | 
|  |  | 
|  | /* | 
|  | li	t0, SYS_TRIOUTCLR | 
|  | li	t1, 0x00001FFF | 
|  | sw	t1, 0(t0) | 
|  |  | 
|  | li	t0, SYS_OUTPUTCLR | 
|  | li	t1, 0x00008000 | 
|  | sw	t1, 0(t0) | 
|  | */ | 
|  | sync | 
|  |  | 
|  | jr	ra | 
|  | nop |