[U-Boot] [PATCH 13/69] x86: Allow use of serial soon after relocation
Simon Glass
sjg at chromium.org
Sat Mar 12 06:04:25 CET 2016
Hi Bin,
On 10 March 2016 at 21:31, Bin Meng <bmeng.cn at gmail.com> wrote:
> Hi Simon,
>
> On Mon, Mar 7, 2016 at 10:27 AM, Simon Glass <sjg at chromium.org> wrote:
>> At present on x86 machines with use cache-as-RAM, the memory goes away just
>> before board_init_r() is called. This means that serial drivers are
>> no-longer unavailable, until initr_dm() it called, etc.
>>
>> Any attempt to use printf() within this period will cause a hang.
>>
>> To fix this, mark the serial devices as 'unavailable' when it is no-longer
>> available. Bring it back when serial_initialize() is called. This means that
>> the debug UART will be used instead for this period.
>>
>> Signed-off-by: Simon Glass <sjg at chromium.org>
>> ---
>>
>> common/board_f.c | 7 +++++++
>> drivers/serial/serial-uclass.c | 1 +
>> 2 files changed, 8 insertions(+)
>>
>> diff --git a/common/board_f.c b/common/board_f.c
>> index 622093a..109025a 100644
>> --- a/common/board_f.c
>> +++ b/common/board_f.c
>> @@ -1096,6 +1096,13 @@ void board_init_f_r(void)
>> hang();
>>
>> /*
>> + * The pre-relocation drivers may be using memory that has now gone
>> + * away. Mark serial as unavailable - this will fall back to the debug
>> + * UART if available.
>> + */
>> + gd->flags &= ~GD_FLG_SERIAL_READY;
>> +
>
> What about other architectures (non-X86 and non-ARC)?
This problem hasn't happened on any ARM chip I am aware of. I am
pretty sure it is x86-specific.
>
>> + /*
>> * U-Boot has been copied into SDRAM, the BSS has been cleared etc.
>> * Transfer execution from Flash to RAM by calculating the address
>> * of the in-RAM copy of board_init_r() and calling it
>> diff --git a/drivers/serial/serial-uclass.c b/drivers/serial/serial-uclass.c
>> index 1c447ff..6562be0 100644
>> --- a/drivers/serial/serial-uclass.c
>> +++ b/drivers/serial/serial-uclass.c
>> @@ -116,6 +116,7 @@ int serial_init(void)
>> void serial_initialize(void)
>> {
>> serial_find_console_or_panic();
>> + gd->flags |= GD_FLG_SERIAL_READY;
>
> I think we can simply replace this to:
>
> void serial_initialize(void)
> {
> serial_init();
> }
OK.
Regards,
Simon
More information about the U-Boot
mailing list