f4f88921a5
* Fix memory initialization. This fixes the problem with kernel oopses during heavy load. * Cleanup pinsetup, which for reference is among other things needed for proper flash erasing. Signed-off-by: Kristoffer Ericson <kristoffer.ericson@gmail.com>
211 lines
4.9 KiB
ArmAsm
211 lines
4.9 KiB
ArmAsm
/*
|
|
* Memory Setup stuff - taken from blob memsetup.S
|
|
*
|
|
* Copyright (C) 1999 2000 2001 Erik Mouw (J.A.K.Mouw@its.tudelft.nl) and
|
|
* Jan-Derk Bakker (J.D.Bakker@its.tudelft.nl)
|
|
* 2004 (c) MontaVista Software, Inc.
|
|
*
|
|
* See file CREDITS for list of people who contributed to this
|
|
* project.
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License as
|
|
* published by the Free Software Foundation; either version 2 of
|
|
* the License, or (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
|
* MA 02111-1307 USA
|
|
*/
|
|
|
|
|
|
#include "config.h"
|
|
#include "version.h"
|
|
|
|
|
|
/*-----------------------------------------------------------------------
|
|
* Board defines:
|
|
*/
|
|
|
|
#define MDCNFG 0x00
|
|
#define MDCAS00 0x04
|
|
#define MDCAS01 0x08
|
|
#define MDCAS02 0x0C
|
|
#define MSC0 0x10
|
|
#define MSC1 0x14
|
|
#define MECR 0x18
|
|
#define MDREFR 0x1C
|
|
#define MDCAS20 0x20
|
|
#define MDCAS21 0x24
|
|
#define MDCAS22 0x28
|
|
#define MSC2 0x2C
|
|
#define SMCNFG 0x30
|
|
|
|
#define GPDR 0x04
|
|
#define GPSR 0x08
|
|
#define GPCR 0x0C
|
|
#define GAFR 0x1C
|
|
|
|
#define PPDR 0x00
|
|
#define PPSR 0x04
|
|
#define PPAR 0x08
|
|
|
|
#define MDREFR_TRASR(n_) (n_ & (0x0000000f))
|
|
#define MDREFR_DRI(n_) ((n_ & (0x00000fff)) << 4)
|
|
#define MDREFR_K0DB2 (1 << 18)
|
|
#define MDREFR_K1DB2 (1 << 22)
|
|
#define MDREFR_K2DB2 (1 << 26)
|
|
|
|
#define MDREFR_K0RUN (1 << 17)
|
|
#define MDREFR_K1RUN (1 << 21)
|
|
#define MDREFR_K2RUN (1 << 25)
|
|
|
|
#define MDREFR_SLFRSH (1 << 31)
|
|
#define MDREFR_E1PIN (1 << 20)
|
|
|
|
#define PSSR 0x04
|
|
#define PSSR_DH 0x00000008
|
|
#define POSR 0x08
|
|
#define RCSR 0x04
|
|
|
|
/*-----------------------------------------------------------------------
|
|
* Setup parameters for the board:
|
|
*/
|
|
MEM_BASE: .long 0xa0000000
|
|
MEM_START: .long 0xc0000000
|
|
PWR_BASE: .word 0x90020000
|
|
RST_BASE: .long 0x90030000
|
|
PPC_BASE: .long 0x90060000
|
|
GPIO_BASE: .long 0x90040000
|
|
IC_BASE: .word 0x90050000
|
|
|
|
cpuspeed: .word 0xa0
|
|
/* calculated from old blob bootloader */
|
|
mdcnfg: .long 0x00037267 /* mdcnfg 0x00037267 */
|
|
mdcas00: .long 0x5555557f /* mdcas00 0x5555557f */
|
|
mdcas01: .long 0x55555555 /* mdcas01 0x55555555 */
|
|
mdcas02: .long 0x55555555 /* mdcas02 0x55555555 */
|
|
msc0: .long 0xfff04f78 /* msc0 0xfff04f78 */
|
|
msc1: .long 0xfff8fff0 /* msc1 0xfff8fff0 */
|
|
mecr: .long 0x98c698c6 /* mecr 0x98c698c6 */
|
|
mdrefr: .long 0x067600c7 /* mdrefr 0x04340327 */
|
|
mdcas20: .long 0xd1284142 /* mdcas20 0xd1284142 */
|
|
mdcas21: .long 0x72249529 /* mdcas21 0x72249529 */
|
|
mdcas22: .long 0x78414351 /* mdcas22 0x78414351 */
|
|
msc2: .long 0x201d2959 /* msc2 0x201d2959 */
|
|
smcnfg: .long 0x00000000 /* smcnfg 0x00000000 */
|
|
|
|
pin_set_out: .long 0x37ff70
|
|
pin_set_dir: .long 0x11480
|
|
|
|
gpdr_set: .long 0x0B3A0900
|
|
gpsr_set: .long 0x02100800
|
|
gpcr_set: .long 0x092A0100
|
|
gafr_set: .long 0x08600000
|
|
|
|
.globl lowlevel_init
|
|
lowlevel_init:
|
|
|
|
|
|
/* this is required for flashing */
|
|
ldr r0, PPC_BASE
|
|
ldr r1, pin_set_out
|
|
str r1, [r0, #PPSR]
|
|
ldr r1, pin_set_dir
|
|
str r1, [r0, #PPDR]
|
|
|
|
/* Setting up the memory and stuff */
|
|
/***********************************/
|
|
|
|
ldr r0, MEM_BASE
|
|
|
|
ldr r1, mdcnfg
|
|
str r1, [r0, #MDCNFG]
|
|
ldr r1, mdcas00
|
|
str r1, [r0, #MDCAS00]
|
|
ldr r1, mdcas01
|
|
str r1, [r0, #MDCAS01]
|
|
ldr r1, mdcas02
|
|
str r1, [r0, #MDCAS02]
|
|
ldr r1, mdcas20
|
|
str r1, [r0, #MDCAS20]
|
|
ldr r1, mdcas21
|
|
str r1, [r0, #MDCAS21]
|
|
ldr r1, mdcas22
|
|
str r1, [r0, #MDCAS22]
|
|
|
|
/* clear kxDB2 */
|
|
ldr r2, [r0, #MDREFR]
|
|
bic r2, r2, #MDREFR_K0DB2
|
|
bic r2, r2, #MDREFR_K1DB2
|
|
bic r2, r2, #MDREFR_K2DB2
|
|
str r2, [r0, #MDREFR]
|
|
|
|
ldr r2, [r0, #MDREFR]
|
|
orr r2, r2, #MDREFR_TRASR(7)
|
|
|
|
mov r4, #0x2000
|
|
spin: subs r4, r4, #1
|
|
bne spin
|
|
|
|
ldr r1, PWR_BASE
|
|
mov r2, #PSSR_DH
|
|
str r2, [r1, #PSSR]
|
|
|
|
ldr r2, [r0, #MDREFR]
|
|
bic r2, r2, #MDREFR_K0DB2
|
|
bic r2, r2, #MDREFR_K1DB2
|
|
bic r2, r2, #MDREFR_K2DB2
|
|
str r2, [r0, #MDREFR]
|
|
|
|
ldr r2, [r0, #MDREFR]
|
|
orr r2, r2, #MDREFR_TRASR(7)
|
|
orr r2, r2, #MDREFR_DRI(12)
|
|
orr r2, r2, #MDREFR_K0DB2
|
|
orr r2, r2, #MDREFR_K1DB2
|
|
orr r2, r2, #MDREFR_K2DB2
|
|
str r2, [r0, #MDREFR]
|
|
|
|
ldr r2, [r0, #MDREFR]
|
|
orr r2, r2, #MDREFR_K0RUN
|
|
orr r2, r2, #MDREFR_K1RUN
|
|
orr r2, r2, #MDREFR_K2RUN
|
|
str r2, [r0, #MDREFR]
|
|
|
|
ldr r2, [r0, #MDREFR]
|
|
bic r2, r2, #MDREFR_SLFRSH
|
|
str r2, [r0, #MDREFR]
|
|
|
|
ldr r2, [r0, #MDREFR]
|
|
orr r2, r2, #MDREFR_E1PIN
|
|
str r2, [r0, #MDREFR]
|
|
|
|
ldr r2, MEM_START
|
|
.rept 8
|
|
ldr r3, [r2]
|
|
.endr
|
|
|
|
ldr r2, [r0, #MDCNFG]
|
|
orr r2, r2, #0x00000003
|
|
orr r2, r2, #0x00030000
|
|
str r2, [r0, #MDCNFG]
|
|
|
|
ldr r1, msc0
|
|
str r1, [r0, #MSC0]
|
|
ldr r1, msc1
|
|
str r1, [r0, #MSC1]
|
|
ldr r1, msc2
|
|
str r1, [r0, #MSC2]
|
|
ldr r1, smcnfg
|
|
str r1, [r0, #SMCNFG]
|
|
ldr r1, mecr
|
|
str r1, [r0, #MECR]
|
|
|
|
mov pc, lr
|