[U-Boot-Users] PPC440Epx Sequoia Flash-based size limitation?
Dave Littell
littelld at verizon.net
Sat Mar 15 03:38:05 CET 2008
Stefan Roese wrote:
> > On Friday 14 March 2008, Dave Littell wrote:
>> >> I'm working on an AMCC PPC440EPx platform that is similar to the AMCC
>> >> Sequoia under U-Boot 1.3.1. I've copied the Sequoia board and
>> >> configuration as a starting point, but I've run into a problem
with the
>> >> size of the flash-based portion of U-Boot. I've added code to
>> >> initdram() that results in the addition of 3-4 dozen assembly
>> >> instructions. Now the board hangs after a very few tftp (or even
ping)
>> >> commands.
> >
> > Does it really hang, or do you get an exception?
> >
Hi Stefan,
Thanks very much for the reply - I very much appreciate any help you can
offer.
No exception appears. It hangs to the point where a JTAG debugger is
unable to regain control of the processor.
>> >> However, if I remove the code I added, there's no problem
>> >> with tftp, etc. I've narrowed it down to the point where I can
make the
>> >> difference between a working and non-working load by adding just a few
>> >> instructions to initdram(). Some boundary or limit is being crossed
>> >> somewhere...
> >
> > I don't think so. It could be a problem with the DDR2 Denali setup
for your
> > board. What did you change in the DDR2 setup code? How similar is
your board
> > design to the Sequoia regarding DDR2 chips, termination etc?
> >
>From a hardware design perspective, much of the physical layout was
copied directly from the Sequoia (so I've been told), but it does use
memory from a different manufacturer. The changes I added to initdram()
were to use the DDR Controller register values suggested by the AMCC DDR
Configuration Tool spreadsheet for two different PLB speeds. I felt the
parameters were different enough to warrant using get_bus_speed() and a
simple if() to determine which set of parameters were loaded to the DDR
Controller.
If I instead use #ifdef's to determine at compile time which set of
parameters are loaded, the board runs and I can tftp (or ping) all day.
However, if I replace that with my if() logic and both sets of
parameters (in the correct branch path - verified with the JTAG), the
board will hang after only a few tftp's (or pings).
Hm.
>> >> I'm sure I've overrun something somewhere but I'm afraid I'm not
>> >> literate enough in the magic of the .lds file (which is unmodified
from
>> >> the Sequoia platform) to understand what adding so few instructions to
>> >> the flash-based portion of U-boot might have broken.
>> >>
>> >> I've searched the FAQ and mailing list archives, all to no avail.
Does
>> >> anyone have any suggestions other that "write tighter code"? ;-)
> >
> > Another idea comes to my mind here. It's on my todo list to implement a
> > workaround for the 440EPx errata CHIP 11:
> >
>> >> CHIP_11: End of memory range area restricted access.
>> >> Category: 3
>> >> Overview:
>> >> The 440EPx DDR controller does not acknowledge any
>> >> transaction which is determined to be crossing over the
>> >> end-of-memory-range boundary, even if the starting address is
>> >> within valid memory space. Any such transaction from any PLB4
>> >> master will result in a PLB time-out on PLB4 bus.
>> >> Impact:
>> >> In case of such misaligned bursts, PLB4 masters will not
>> >> retrieve any data at all, just the available data up to the
>> >> end of memory, especially the 440 CPU. For example, if a CPU
>> >> instruction required an operand located in memory within the
>> >> last 7 words of memory, the DCU master would burst read 8
>> >> words to update the data cache and cross over the
>> >> end-of-memory-range boundary. Such a DCU read would not be
>> >> answered by the DDR controller, resulting in a PLB4 time-out
>> >> and ultimately in a Machine Check interrupt. The data would
>> >> be inaccessible to the CPU.
>> >> Workaround:
>> >> Forbid any application to access the last 256 bytes of DDR
>> >> memory. For example, make your operating system believe that
>> >> the last 256 bytes of DDR memory are absent. AMCC has a patch
>> >> that does this, available for Linux.
> >
Yes, I saw that and implemented the Linux kernel patch that AMCC
provides. However, I didn't think that U-Boot ran up against the upper
boundary of RAM.
> > One simple idea is to add :
> >
> > #define CONFIG_PRAM 1
> >
> > to your U-Boot config file.
> >
I'll certainly give that a shot.
Thanks very much,
Dave
More information about the U-Boot
mailing list