
Hi Simon,
On Mon, Mar 7, 2016 at 10:27 AM, Simon Glass sjg@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@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)?
/* * 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(); }
Regards, Bin