[U-Boot] [Question] Driver-Model UART on NOR-boot ? Work?

Masahiro YAMADA yamada.m at jp.panasonic.com
Wed Oct 1 18:27:55 CEST 2014


Hi Simon,

2014-10-02 0:31 GMT+09:00 Simon Glass <sjg at chromium.org>:
> Hi Masahiro,
>
> On 1 October 2014 05:23, Masahiro Yamada <yamada.m at jp.panasonic.com> wrote:
>> Hi Simon,
>>
>>
>>
>> I am looking at the driver-model serial code.
>>
>>
>> I notice driver-model serial code uses ".data" section
>> for storing the current device even before relocation.
>>
>>
>> This code in drivers/serial/serial-uclass.c:
>>
>>   /* The currently-selected console serial device */
>>   struct udevice *cur_dev __attribute__ ((section(".data")));
>>
>>
>>
>> In my understanding, we should not write any data to
>> .data section before relocation.
>>
>>
>> Let's say we are booting U-Boot from NOR flash.
>>
>> Before relocation, everything (including .data section)
>> is placed on NOR flash which is read-only.
>> (Please point out if I am wrong.)
>>
>> We are only allowed to write data to the stack, gd_t, bd_t
>> and malloc area (if CONFIG_SYS_MALLOC_F_LEN is defined)
>> before relocation, I think.
>>
>>
>>
>> I think that is why pre-driver-model serial uses a hard-coded
>> default serial port before relocation.
>>
>>
>>   This code in driver/serial/serial.c:
>>
>>      if (!(gd->flags & GD_FLG_RELOC))
>>                 dev = default_serial_console();
>>      else if (!serial_current)
>>                 dev = default_serial_console();
>>      else
>>                 dev = serial_current;
>>
>>
>>
>>
>> My question is,  does printf() work
>> with driver-model UART and XIP device such NOR flash?
>
> The global_data structure needs to go somewhere, even before
> relocation. On ARM this is general SRAM I suppose. In your case I
> think you have some cache RAM to use. Do you use SPL?

UniPhier SoCs support various boot-modes.

I use SPL for NAND and MMC card boot, but I don't for NOR boot.

For NAND boot or MMC card boot, yes,
.data section is on some cache RAM, i.e. it is writable.

For NOR boot, the program is running eXecutable-In-Place; therefore
before relocation, .data section is remaining on NOR flash and it is read-only.



> The pre-reloc malloc() area goes below global_data so uses the same mechanism.
>
> Yes it is true that strictly speaking we should not use data before
> relocation. I suppose we could move cur_dev to global_data instead for
> this particular case. It doesn't really scale to other drivers, but
> then I expect that only serial needs to keep a 'current' pointer
> before relocation, and even that will eventually go away once the
> serial stuff is cleaned up.
>
> So let me know if that solution works.

I think it will work.

Moving cur_dev to struct global_data is easy.
My concern is only that struct global_data is already too cluttered.


Some other options I have come up with are:

[1]
Before relocation, cur_dev is set to a fixed-device by a board file.
This is the same solution as pre-driver-model UART does.

This would be unfortunate.  We are using Device-Tree more and more these days.
Run-time choosing would be more flexible.


[2]
Make .data section writable even before relocation.

The boot sequence would be:

   1.   Copy .data to the temporary SRAM and clear .bss section
   2.   board_init_f()
   3.   Relocate all sections to SDRAM
   4.   board_init_r()





-- 
Best Regards
Masahiro Yamada


More information about the U-Boot mailing list