Blame view
board/w7o/init.S
8.28 KB
46263f2de
|
1 |
/* |
1b387ef55
|
2 |
* SPDX-License-Identifier: GPL-2.0 IBM-pibs |
46263f2de
|
3 |
*/ |
c609719b8
|
4 |
#include <config.h> |
b36df5611
|
5 |
#include <asm/ppc4xx.h> |
c609719b8
|
6 |
|
c609719b8
|
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
#include <ppc_asm.tmpl> #include <ppc_defs.h> #include <asm/cache.h> #include <asm/mmu.h> /****************************************************************************** * Function: ext_bus_cntlr_init * * Description: Configures EBC Controller and a few basic chip selects. * * CS0 is setup to get the Boot Flash out of the addresss range * so that we may setup a stack. CS7 is setup so that we can * access and reset the hardware watchdog. * * IMPORTANT: For pass1 this code must run from * cache since you can not reliably change a peripheral banks * timing register (pbxap) while running code from that bank. * For ex., since we are running from ROM on bank 0, we can NOT * execute the code that modifies bank 0 timings from ROM, so * we run it from cache. * * Notes: Does NOT use the stack. *****************************************************************************/ .section ".text" .align 2 .globl ext_bus_cntlr_init .type ext_bus_cntlr_init, @function ext_bus_cntlr_init: mflr r0 /******************************************************************** * Prefetch entire ext_bus_cntrl_init function into the icache. * This is necessary because we are going to change the same CS we * are executing from. Otherwise a CPU lockup may occur. *******************************************************************/ bl ..getAddr ..getAddr: mflr r3 /* get address of ..getAddr */ /* Calculate number of cache lines for this function */ |
6d0f6bcf3
|
47 |
addi r4, 0, (((.Lfe0 - ..getAddr) / CONFIG_SYS_CACHELINE_SIZE) + 2) |
c609719b8
|
48 49 50 |
mtctr r4 ..ebcloop: icbt r0, r3 /* prefetch cache line for addr in r3*/ |
6d0f6bcf3
|
51 |
addi r3, r3, CONFIG_SYS_CACHELINE_SIZE /* move to next cache line */ |
c609719b8
|
52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
bdnz ..ebcloop /* continue for $CTR cache lines */ /******************************************************************** * Delay to ensure all accesses to ROM are complete before changing * bank 0 timings. 200usec should be enough. * 200,000,000 (cycles/sec) X .000200 (sec) = 0x9C40 cycles. *******************************************************************/ addis r3, 0, 0x0 ori r3, r3, 0xA000 /* wait 200us from reset */ mtctr r3 ..spinlp: bdnz ..spinlp /* spin loop */ /******************************************************************** * Setup External Bus Controller (EBC). *******************************************************************/ |
d1c3b2752
|
68 69 |
addi r3, 0, EBC0_CFG mtdcr EBC0_CFGADDR, r3 |
c609719b8
|
70 71 |
addis r4, 0, 0xb040 /* Device base timeout = 1024 cycles */ ori r4, r4, 0x0 /* Drive CS with external master */ |
d1c3b2752
|
72 |
mtdcr EBC0_CFGDATA, r4 |
c609719b8
|
73 74 75 76 |
/******************************************************************** * Change PCIINT signal to PerWE *******************************************************************/ |
d1c3b2752
|
77 |
mfdcr r4, CPC0_CR1 |
c609719b8
|
78 |
ori r4, r4, 0x4000 |
d1c3b2752
|
79 |
mtdcr CPC0_CR1, r4 |
c609719b8
|
80 81 82 83 |
/******************************************************************** * Memory Bank 0 (Flash Bank 0) initialization *******************************************************************/ |
d1c3b2752
|
84 85 |
addi r3, 0, PB1AP mtdcr EBC0_CFGADDR, r3 |
6d0f6bcf3
|
86 87 |
addis r4, 0, CONFIG_SYS_W7O_EBC_PB0AP@h ori r4, r4, CONFIG_SYS_W7O_EBC_PB0AP@l |
d1c3b2752
|
88 |
mtdcr EBC0_CFGDATA, r4 |
c609719b8
|
89 |
|
d1c3b2752
|
90 91 |
addi r3, 0, PB0CR mtdcr EBC0_CFGADDR, r3 |
6d0f6bcf3
|
92 93 |
addis r4, 0, CONFIG_SYS_W7O_EBC_PB0CR@h ori r4, r4, CONFIG_SYS_W7O_EBC_PB0CR@l |
d1c3b2752
|
94 |
mtdcr EBC0_CFGDATA, r4 |
c609719b8
|
95 96 97 98 |
/******************************************************************** * Memory Bank 7 LEDs - NEEDED BECAUSE OF HW WATCHDOG AND LEDs. *******************************************************************/ |
d1c3b2752
|
99 100 |
addi r3, 0, PB7AP mtdcr EBC0_CFGADDR, r3 |
6d0f6bcf3
|
101 102 |
addis r4, 0, CONFIG_SYS_W7O_EBC_PB7AP@h ori r4, r4, CONFIG_SYS_W7O_EBC_PB7AP@l |
d1c3b2752
|
103 |
mtdcr EBC0_CFGDATA, r4 |
c609719b8
|
104 |
|
d1c3b2752
|
105 106 |
addi r3, 0, PB7CR mtdcr EBC0_CFGADDR, r3 |
6d0f6bcf3
|
107 108 |
addis r4, 0, CONFIG_SYS_W7O_EBC_PB7CR@h ori r4, r4, CONFIG_SYS_W7O_EBC_PB7CR@l |
d1c3b2752
|
109 |
mtdcr EBC0_CFGDATA, r4 |
c609719b8
|
110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 |
/* We are all done */ mtlr r0 /* Restore link register */ blr /* Return to calling function */ .Lfe0: .size ext_bus_cntlr_init,.Lfe0-ext_bus_cntlr_init /* end ext_bus_cntlr_init() */ /****************************************************************************** * Function: sdram_init * * Description: Configures SDRAM memory banks. * * Serial Presence Detect, "SPD," reads the SDRAM EEPROM * via the IIC bus and then configures the SDRAM memory * banks appropriately. If Auto Memory Configuration is * is not used, it is assumed that a 4MB 11x8x2, non-ECC, * SDRAM is soldered down. * * Notes: Expects that the stack is already setup. *****************************************************************************/ .section ".text" .align 2 .globl sdram_init .type sdram_init, @function sdram_init: /* save the return info on stack */ mflr r0 /* Get link register */ stwu r1, -8(r1) /* Save back chain and move SP */ stw r0, +12(r1) /* Save link register */ /* * First call spd_sdram to try to init SDRAM according to the * contents of the SPD EEPROM. If the SPD EEPROM is blank or * erronious, spd_sdram returns 0 in R3. */ |
db2f721ff
|
145 |
li r3,0 |
c609719b8
|
146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 |
bl spd_sdram addic. r3, r3, 0 /* Check for error, save dram size */ bne ..sdri_done /* If it worked, we're done... */ /******************************************************************** * If SPD detection fails, we'll default to 4MB, 11x8x2, as this * is the SMALLEST SDRAM size the 405 supports. We can do this * because W7O boards have soldered on RAM, and there will always * be some amount present. If we were using DIMMs, we should hang * the board instead, since it doesn't have any RAM to continue * running with. *******************************************************************/ /* * Disable memory controller to allow * values to be changed. */ |
95b602bab
|
163 |
addi r3, 0, SDRAM0_CFG |
d1c3b2752
|
164 |
mtdcr SDRAM0_CFGADDR, r3 |
c609719b8
|
165 166 |
addis r4, 0, 0x0 ori r4, r4, 0x0 |
d1c3b2752
|
167 |
mtdcr SDRAM0_CFGDATA, r4 |
c609719b8
|
168 169 170 171 172 |
/* * Set MB0CF for ext bank 0. (0-4MB) Address Mode 5 since 11x8x2 * All other banks are disabled. */ |
95b602bab
|
173 |
addi r3, 0, SDRAM0_B0CR |
d1c3b2752
|
174 |
mtdcr SDRAM0_CFGADDR, r3 |
c609719b8
|
175 176 |
addis r4, 0, 0x0000 /* BA=0x0, SZ=4MB */ ori r4, r4, 0x8001 /* Mode is 5, 11x8x2or4, BE=Enabled */ |
d1c3b2752
|
177 |
mtdcr SDRAM0_CFGDATA, r4 |
c609719b8
|
178 179 180 181 182 |
/* Clear MB1CR,MB2CR,MB3CR to turn other banks off */ addi r4, 0, 0 /* Zero the data reg */ addi r3, r3, 4 /* Point to MB1CF reg */ |
d1c3b2752
|
183 184 |
mtdcr SDRAM0_CFGADDR, r3 /* Set the address */ mtdcr SDRAM0_CFGDATA, r4 /* Zero the reg */ |
c609719b8
|
185 186 |
addi r3, r3, 4 /* Point to MB2CF reg */ |
d1c3b2752
|
187 188 |
mtdcr SDRAM0_CFGADDR, r3 /* Set the address */ mtdcr SDRAM0_CFGDATA, r4 /* Zero the reg */ |
c609719b8
|
189 190 |
addi r3, r3, 4 /* Point to MB3CF reg */ |
d1c3b2752
|
191 192 |
mtdcr SDRAM0_CFGADDR, r3 /* Set the address */ mtdcr SDRAM0_CFGDATA, r4 /* Zero the reg */ |
c609719b8
|
193 194 195 196 197 198 199 200 201 202 |
/******************************************************************** * Set the SDRAM Timing reg, SDTR1 and the refresh timer reg, RTR. * To set the appropriate timings, we assume sdram is * 100MHz (pc100 compliant). *******************************************************************/ /* * Set up SDTR1 */ |
95b602bab
|
203 |
addi r3, 0, SDRAM0_TR |
d1c3b2752
|
204 |
mtdcr SDRAM0_CFGADDR, r3 |
c609719b8
|
205 206 |
addis r4, 0, 0x0086 /* SDTR1 value for 100Mhz */ ori r4, r4, 0x400D |
d1c3b2752
|
207 |
mtdcr SDRAM0_CFGDATA, r4 |
c609719b8
|
208 209 210 211 |
/* * Set RTR */ |
95b602bab
|
212 |
addi r3, 0, SDRAM0_RTR |
d1c3b2752
|
213 |
mtdcr SDRAM0_CFGADDR, r3 |
c609719b8
|
214 |
addis r4, 0, 0x05F0 /* RTR refresh val = 15.625ms@100Mhz */ |
d1c3b2752
|
215 |
mtdcr SDRAM0_CFGDATA, r4 |
c609719b8
|
216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 |
/******************************************************************** * Delay to ensure 200usec have elapsed since reset. Assume worst * case that the core is running 200Mhz: * 200,000,000 (cycles/sec) X .000200 (sec) = 0x9C40 cycles *******************************************************************/ addis r3, 0, 0x0000 ori r3, r3, 0xA000 /* Wait 200us from reset */ mtctr r3 ..spinlp2: bdnz ..spinlp2 /* spin loop */ /******************************************************************** * Set memory controller options reg, MCOPT1. *******************************************************************/ |
95b602bab
|
231 |
addi r3, 0, SDRAM0_CFG |
d1c3b2752
|
232 |
mtdcr SDRAM0_CFGADDR, r3 |
c609719b8
|
233 234 |
addis r4, 0, 0x80E0 /* DC_EN=1,SRE=0,PME=0,MEMCHK=0 */ ori r4, r4, 0x0000 /* REGEN=0,DRW=00,BRPF=01,ECCDD=1 */ |
d1c3b2752
|
235 |
mtdcr SDRAM0_CFGDATA, r4 /* EMDULR=1 */ |
c609719b8
|
236 237 238 239 240 241 242 243 244 |
..sdri_done: /* restore and return */ lwz r0, +12(r1) /* Get saved link register */ addi r1, r1, +8 /* Remove frame from stack */ mtlr r0 /* Restore link register */ blr /* Return to calling function */ .Lfe1: .size sdram_init,.Lfe1-sdram_init /* end sdram_init() */ |