Commit e6b6d16de73de6a76e2ec4338291e828b860f040
Exists in
master
and in
54 other branches
Merge with /home/sr/git/u-boot
Showing 3 changed files Side-by-side Diff
CHANGELOG
... | ... | @@ -2,6 +2,13 @@ |
2 | 2 | Changes for U-Boot 1.1.4: |
3 | 3 | ====================================================================== |
4 | 4 | |
5 | +* Changes to Yellowstone & Yosemite 440EP/GR eval boards: | |
6 | + - Changed GPIO setup to enable another address line in order to | |
7 | + address 64M of FLASH. | |
8 | + - Added function sdram_tr1_set to auto calculate the tr1 value for | |
9 | + the DDR. | |
10 | + Patch by Steven Blakeslee, 12 Dec 2005 | |
11 | + | |
5 | 12 | * MPC5200: Set PCI retry counter to 0 = infinite retry; |
6 | 13 | The default of 255 is too short for slow devices. |
7 | 14 | Patch by Martin Nykodym, 12 Dec 2005 |
board/amcc/yellowstone/yellowstone.c
... | ... | @@ -59,10 +59,10 @@ |
59 | 59 | * Setup the GPIO pins |
60 | 60 | *-------------------------------------------------------------------*/ |
61 | 61 | /*CPLD cs */ |
62 | - /*setup Address lines for flash sizes larger than 16Meg. */ | |
63 | - out32(GPIO0_OSRL, in32(GPIO0_OSRL) | 0x40010000); | |
64 | - out32(GPIO0_TSRL, in32(GPIO0_TSRL) | 0x40010000); | |
65 | - out32(GPIO0_ISR1L, in32(GPIO0_ISR1L) | 0x40000000); | |
62 | + /*setup Address lines for flash size 64Meg. */ | |
63 | + out32(GPIO0_OSRL, in32(GPIO0_OSRL) | 0x50010000); | |
64 | + out32(GPIO0_TSRL, in32(GPIO0_TSRL) | 0x50010000); | |
65 | + out32(GPIO0_ISR1L, in32(GPIO0_ISR1L) | 0x50000000); | |
66 | 66 | |
67 | 67 | /*setup emac */ |
68 | 68 | out32(GPIO0_TCR, in32(GPIO0_TCR) | 0xC080); |
... | ... | @@ -129,7 +129,7 @@ |
129 | 129 | #endif |
130 | 130 | |
131 | 131 | /*get rid of flash write protect */ |
132 | - *(unsigned char *)(CFG_BCSR_BASE | 0x07) = 0x40; | |
132 | + *(unsigned char *)(CFG_BCSR_BASE | 0x07) = 0x00; | |
133 | 133 | |
134 | 134 | return 0; |
135 | 135 | } |
136 | 136 | |
... | ... | @@ -207,9 +207,85 @@ |
207 | 207 | * PLB @ 133 MHz |
208 | 208 | * |
209 | 209 | ************************************************************************/ |
210 | +#define NUM_TRIES 64 | |
211 | +#define NUM_READS 10 | |
212 | + | |
213 | +void sdram_tr1_set(int ram_address, int* tr1_value) | |
214 | +{ | |
215 | + int i; | |
216 | + int j, k; | |
217 | + volatile unsigned int* ram_pointer = (unsigned int*)ram_address; | |
218 | + int first_good = -1, last_bad = 0x1ff; | |
219 | + | |
220 | + unsigned long test[NUM_TRIES] = { | |
221 | + 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, | |
222 | + 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, | |
223 | + 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, | |
224 | + 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, | |
225 | + 0xAAAAAAAA, 0xAAAAAAAA, 0x55555555, 0x55555555, | |
226 | + 0xAAAAAAAA, 0xAAAAAAAA, 0x55555555, 0x55555555, | |
227 | + 0x55555555, 0x55555555, 0xAAAAAAAA, 0xAAAAAAAA, | |
228 | + 0x55555555, 0x55555555, 0xAAAAAAAA, 0xAAAAAAAA, | |
229 | + 0xA5A5A5A5, 0xA5A5A5A5, 0x5A5A5A5A, 0x5A5A5A5A, | |
230 | + 0xA5A5A5A5, 0xA5A5A5A5, 0x5A5A5A5A, 0x5A5A5A5A, | |
231 | + 0x5A5A5A5A, 0x5A5A5A5A, 0xA5A5A5A5, 0xA5A5A5A5, | |
232 | + 0x5A5A5A5A, 0x5A5A5A5A, 0xA5A5A5A5, 0xA5A5A5A5, | |
233 | + 0xAA55AA55, 0xAA55AA55, 0x55AA55AA, 0x55AA55AA, | |
234 | + 0xAA55AA55, 0xAA55AA55, 0x55AA55AA, 0x55AA55AA, | |
235 | + 0x55AA55AA, 0x55AA55AA, 0xAA55AA55, 0xAA55AA55, | |
236 | + 0x55AA55AA, 0x55AA55AA, 0xAA55AA55, 0xAA55AA55 }; | |
237 | + | |
238 | + /* go through all possible SDRAM0_TR1[RDCT] values */ | |
239 | + for (i=0; i<=0x1ff; i++) { | |
240 | + /* set the current value for TR1 */ | |
241 | + mtsdram(mem_tr1, (0x80800800 | i)); | |
242 | + | |
243 | + /* write values */ | |
244 | + for (j=0; j<NUM_TRIES; j++) { | |
245 | + ram_pointer[j] = test[j]; | |
246 | + | |
247 | + /* clear any cache at ram location */ | |
248 | + __asm__("dcbf 0,%0": :"r" (&ram_pointer[j])); | |
249 | + } | |
250 | + | |
251 | + /* read values back */ | |
252 | + for (j=0; j<NUM_TRIES; j++) { | |
253 | + for (k=0; k<NUM_READS; k++) { | |
254 | + /* clear any cache at ram location */ | |
255 | + __asm__("dcbf 0,%0": :"r" (&ram_pointer[j])); | |
256 | + | |
257 | + if (ram_pointer[j] != test[j]) | |
258 | + break; | |
259 | + } | |
260 | + | |
261 | + /* read error */ | |
262 | + if (k != NUM_READS) { | |
263 | + break; | |
264 | + } | |
265 | + } | |
266 | + | |
267 | + /* we have a SDRAM0_TR1[RDCT] that is part of the window */ | |
268 | + if (j == NUM_TRIES) { | |
269 | + if (first_good == -1) | |
270 | + first_good = i; /* found beginning of window */ | |
271 | + } else { /* bad read */ | |
272 | + /* if we have not had a good read then don't care */ | |
273 | + if(first_good != -1) { | |
274 | + /* first failure after a good read */ | |
275 | + last_bad = i-1; | |
276 | + break; | |
277 | + } | |
278 | + } | |
279 | + } | |
280 | + | |
281 | + /* return the current value for TR1 */ | |
282 | + *tr1_value = (first_good + last_bad) / 2; | |
283 | +} | |
284 | + | |
210 | 285 | void sdram_init(void) |
211 | 286 | { |
212 | 287 | register uint reg; |
288 | + int tr1_bank1, tr1_bank2; | |
213 | 289 | |
214 | 290 | /*-------------------------------------------------------------------- |
215 | 291 | * Setup some default |
... | ... | @@ -221,7 +297,7 @@ |
221 | 297 | mtsdram(mem_wddctr, 0x40000000); /* ?? */ |
222 | 298 | |
223 | 299 | /*clear this first, if the DDR is enabled by a debugger |
224 | - then you can not make changes. */ | |
300 | + then you can not make changes. */ | |
225 | 301 | mtsdram(mem_cfg0, 0x00000000); /* Disable EEC */ |
226 | 302 | |
227 | 303 | /*-------------------------------------------------------------------- |
... | ... | @@ -234,7 +310,6 @@ |
234 | 310 | mtsdram(mem_b1cr, 0x080a4001); /* SDBA=0x080 128MB, Mode 3, enabled */ |
235 | 311 | |
236 | 312 | mtsdram(mem_tr0, 0x410a4012); /* ?? */ |
237 | - mtsdram(mem_tr1, 0x8080080b); /* ?? */ | |
238 | 313 | mtsdram(mem_rtr, 0x04080000); /* ?? */ |
239 | 314 | mtsdram(mem_cfg1, 0x00000000); /* Self-refresh exit, disable PM */ |
240 | 315 | mtsdram(mem_cfg0, 0x34000000); /* Disable EEC */ |
... | ... | @@ -250,6 +325,10 @@ |
250 | 325 | if (reg & 0x80000000) |
251 | 326 | break; |
252 | 327 | } |
328 | + | |
329 | + sdram_tr1_set(0x00000000, &tr1_bank1); | |
330 | + sdram_tr1_set(0x08000000, &tr1_bank2); | |
331 | + mtsdram(mem_tr1, (((tr1_bank1+tr1_bank2)/2) | 0x80800800) ); | |
253 | 332 | } |
254 | 333 | |
255 | 334 | /************************************************************************* |
board/amcc/yosemite/yosemite.c
... | ... | @@ -59,10 +59,10 @@ |
59 | 59 | * Setup the GPIO pins |
60 | 60 | *-------------------------------------------------------------------*/ |
61 | 61 | /*CPLD cs */ |
62 | - /*setup Address lines for flash sizes larger than 16Meg. */ | |
63 | - out32(GPIO0_OSRL, in32(GPIO0_OSRL) | 0x40010000); | |
64 | - out32(GPIO0_TSRL, in32(GPIO0_TSRL) | 0x40010000); | |
65 | - out32(GPIO0_ISR1L, in32(GPIO0_ISR1L) | 0x40000000); | |
62 | + /*setup Address lines for flash size 64Meg. */ | |
63 | + out32(GPIO0_OSRL, in32(GPIO0_OSRL) | 0x50010000); | |
64 | + out32(GPIO0_TSRL, in32(GPIO0_TSRL) | 0x50010000); | |
65 | + out32(GPIO0_ISR1L, in32(GPIO0_ISR1L) | 0x50000000); | |
66 | 66 | |
67 | 67 | /*setup emac */ |
68 | 68 | out32(GPIO0_TCR, in32(GPIO0_TCR) | 0xC080); |
... | ... | @@ -125,7 +125,7 @@ |
125 | 125 | *(unsigned char *)(CFG_BCSR_BASE | 0x09) = 0x00; |
126 | 126 | |
127 | 127 | /*get rid of flash write protect */ |
128 | - *(unsigned char *)(CFG_BCSR_BASE | 0x07) = 0x40; | |
128 | + *(unsigned char *)(CFG_BCSR_BASE | 0x07) = 0x00; | |
129 | 129 | |
130 | 130 | return 0; |
131 | 131 | } |
132 | 132 | |
... | ... | @@ -203,9 +203,85 @@ |
203 | 203 | * PLB @ 133 MHz |
204 | 204 | * |
205 | 205 | ************************************************************************/ |
206 | +#define NUM_TRIES 64 | |
207 | +#define NUM_READS 10 | |
208 | + | |
209 | +void sdram_tr1_set(int ram_address, int* tr1_value) | |
210 | +{ | |
211 | + int i; | |
212 | + int j, k; | |
213 | + volatile unsigned int* ram_pointer = (unsigned int*)ram_address; | |
214 | + int first_good = -1, last_bad = 0x1ff; | |
215 | + | |
216 | + unsigned long test[NUM_TRIES] = { | |
217 | + 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, | |
218 | + 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, | |
219 | + 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, | |
220 | + 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, | |
221 | + 0xAAAAAAAA, 0xAAAAAAAA, 0x55555555, 0x55555555, | |
222 | + 0xAAAAAAAA, 0xAAAAAAAA, 0x55555555, 0x55555555, | |
223 | + 0x55555555, 0x55555555, 0xAAAAAAAA, 0xAAAAAAAA, | |
224 | + 0x55555555, 0x55555555, 0xAAAAAAAA, 0xAAAAAAAA, | |
225 | + 0xA5A5A5A5, 0xA5A5A5A5, 0x5A5A5A5A, 0x5A5A5A5A, | |
226 | + 0xA5A5A5A5, 0xA5A5A5A5, 0x5A5A5A5A, 0x5A5A5A5A, | |
227 | + 0x5A5A5A5A, 0x5A5A5A5A, 0xA5A5A5A5, 0xA5A5A5A5, | |
228 | + 0x5A5A5A5A, 0x5A5A5A5A, 0xA5A5A5A5, 0xA5A5A5A5, | |
229 | + 0xAA55AA55, 0xAA55AA55, 0x55AA55AA, 0x55AA55AA, | |
230 | + 0xAA55AA55, 0xAA55AA55, 0x55AA55AA, 0x55AA55AA, | |
231 | + 0x55AA55AA, 0x55AA55AA, 0xAA55AA55, 0xAA55AA55, | |
232 | + 0x55AA55AA, 0x55AA55AA, 0xAA55AA55, 0xAA55AA55 }; | |
233 | + | |
234 | + /* go through all possible SDRAM0_TR1[RDCT] values */ | |
235 | + for (i=0; i<=0x1ff; i++) { | |
236 | + /* set the current value for TR1 */ | |
237 | + mtsdram(mem_tr1, (0x80800800 | i)); | |
238 | + | |
239 | + /* write values */ | |
240 | + for (j=0; j<NUM_TRIES; j++) { | |
241 | + ram_pointer[j] = test[j]; | |
242 | + | |
243 | + /* clear any cache at ram location */ | |
244 | + __asm__("dcbf 0,%0": :"r" (&ram_pointer[j])); | |
245 | + } | |
246 | + | |
247 | + /* read values back */ | |
248 | + for (j=0; j<NUM_TRIES; j++) { | |
249 | + for (k=0; k<NUM_READS; k++) { | |
250 | + /* clear any cache at ram location */ | |
251 | + __asm__("dcbf 0,%0": :"r" (&ram_pointer[j])); | |
252 | + | |
253 | + if (ram_pointer[j] != test[j]) | |
254 | + break; | |
255 | + } | |
256 | + | |
257 | + /* read error */ | |
258 | + if (k != NUM_READS) { | |
259 | + break; | |
260 | + } | |
261 | + } | |
262 | + | |
263 | + /* we have a SDRAM0_TR1[RDCT] that is part of the window */ | |
264 | + if (j == NUM_TRIES) { | |
265 | + if (first_good == -1) | |
266 | + first_good = i; /* found beginning of window */ | |
267 | + } else { /* bad read */ | |
268 | + /* if we have not had a good read then don't care */ | |
269 | + if(first_good != -1) { | |
270 | + /* first failure after a good read */ | |
271 | + last_bad = i-1; | |
272 | + break; | |
273 | + } | |
274 | + } | |
275 | + } | |
276 | + | |
277 | + /* return the current value for TR1 */ | |
278 | + *tr1_value = (first_good + last_bad) / 2; | |
279 | +} | |
280 | + | |
206 | 281 | void sdram_init(void) |
207 | 282 | { |
208 | 283 | register uint reg; |
284 | + int tr1_bank1, tr1_bank2; | |
209 | 285 | |
210 | 286 | /*-------------------------------------------------------------------- |
211 | 287 | * Setup some default |
... | ... | @@ -217,7 +293,7 @@ |
217 | 293 | mtsdram(mem_wddctr, 0x40000000); /* ?? */ |
218 | 294 | |
219 | 295 | /*clear this first, if the DDR is enabled by a debugger |
220 | - then you can not make changes. */ | |
296 | + then you can not make changes. */ | |
221 | 297 | mtsdram(mem_cfg0, 0x00000000); /* Disable EEC */ |
222 | 298 | |
223 | 299 | /*-------------------------------------------------------------------- |
... | ... | @@ -230,7 +306,6 @@ |
230 | 306 | mtsdram(mem_b1cr, 0x080a4001); /* SDBA=0x080 128MB, Mode 3, enabled */ |
231 | 307 | |
232 | 308 | mtsdram(mem_tr0, 0x410a4012); /* ?? */ |
233 | - mtsdram(mem_tr1, 0x8080080b); /* ?? */ | |
234 | 309 | mtsdram(mem_rtr, 0x04080000); /* ?? */ |
235 | 310 | mtsdram(mem_cfg1, 0x00000000); /* Self-refresh exit, disable PM */ |
236 | 311 | mtsdram(mem_cfg0, 0x34000000); /* Disable EEC */ |
... | ... | @@ -246,6 +321,10 @@ |
246 | 321 | if (reg & 0x80000000) |
247 | 322 | break; |
248 | 323 | } |
324 | + | |
325 | + sdram_tr1_set(0x00000000, &tr1_bank1); | |
326 | + sdram_tr1_set(0x08000000, &tr1_bank2); | |
327 | + mtsdram(mem_tr1, (((tr1_bank1+tr1_bank2)/2) | 0x80800800) ); | |
249 | 328 | } |
250 | 329 | |
251 | 330 | /************************************************************************* |