[U-Boot] {Spam?} u-boot relocation

Reinhard Meyer u-boot at emk-elektronik.de
Sun Dec 26 21:10:13 CET 2010


Dear Marcel,
> On Sunday, December 26, 2010 02:38:04 pm Reinhard Meyer wrote:
>> Dear Marcel,
>>
>>> Hi,
>>>
>>> I updated my u-boot-usb to continue my work on the SAM9 USB parts, but
>>> got stuck with the following issue :
>>>
>>> There seems to be a new relocation scheme. I also added some stuff to
>>> make it detect the SDRAM, but than I get stuck.
>>>
>>>    int dram_init(void)
>>>
>>> {
>>>
>>>           gd->bd->bi_dram[0].start = PHYS_SDRAM;
>>>           gd->bd->bi_dram[0].size = PHYS_SDRAM_SIZE;
>>
>> This is accessing bss before relocation. BSS does not exist then.
>
> At what point bss does exist ?
After Relocation.
> Forgive me for not having a clue on this. I started working on u-boot to make
> USB working a while ago. I almost had that working but unfortunately had to go
> away for a while for business. Now that I can continue I usually first update
> to keep up with the latest things, but this is not always easy if things break
> completely.
>
>>>           /* dram_init must store complete ramsize in gd->ram_size */
>>>           gd->ram_size = get_ram_size((volatile void *)PHYS_SDRAM,
>>>
>>> PHYS_SDRAM_SIZE);
>>>
>>>           dram_init_banksize();
>>
>> This function, if defined, is called automagically. Normally, with single
>> DRAM bank AT91SAM9 designs the default weak function provided by u-boot is
>> sufficient:
>> void __dram_init_banksize(void)
>> {
>> 	gd->bd->bi_dram[0].start = CONFIG_SYS_SDRAM_BASE;
>> 	gd->bd->bi_dram[0].size =  gd->ram_size;
>> }
>> void dram_init_banksize(void)
>> 	__attribute__((weak, alias("__dram_init_banksize")));
>>
>> Don't define this function in your board file!!!
>
> I got rid of the call in my board file.
>
>>>           return 0;
>>>
>>> }
>>
>> Please have a look at the emk/top9000 board for what is needed:
>>
>> int dram_init(void)
>> {
>> 	gd->ram_size = get_ram_size(
>> 		(void *)CONFIG_SYS_SDRAM_BASE,
>> 		CONFIG_SYS_SDRAM_SIZE);
>> 	return 0;
>> }
>>
>> /* NO dram_init_banksize() !!! */
>>
>> Note also that the defines have changed to have a CONFIG_SYS_ prefix.
>> Change your board definition accordingly.
>>
>> Best Regards,
>> Reinhard
>
> I currently only have this :
> int dram_init(void)
> {
> 	gd->ram_size = get_ram_size(
> 		(void *)CONFIG_SYS_SDRAM_BASE,
> 		CONFIG_SYS_SDRAM_SIZE);
> 	return 0;
> }
>
> I defined CONFIG_SYS_SDRAM_BASE and CONFIG_SYS_SDRAM_SIZE but I gave them the
> same address and size as my previous PHYS_SDRAM and PHYS_SDRAM_SIZE.
Give them the *correct* values; however I assume they are correct.

CONFIG_SYS_TEXT_BASE must be set to the address u-boot is loaded to by the initial
bootstrap (or directly the NOR address if it is starting from there).

U-boot will relocate itself to top of RAM. Therefore CONFIG_SYS_TEXT_BASE should
not be near top of RAM to avoid overlap.
>
> It doesn't change anything so far, so I must have missed some things I guess.
> I'll continue reading and hope I find something. I do however feel  like I'm
> wasting my time on this one.

I have the same frustration sometimes, however changes are not done to frustrate
people but to make things better and more straightforward. Progress sometimes
means making significant changes to get rid of ballast...

Best Regards,
Reinhard


More information about the U-Boot mailing list