Hi Bin, On 10 March 2016 at 21:31, Bin Meng <bmeng...@gmail.com> wrote: > Hi Simon, > > On Mon, Mar 7, 2016 at 10:27 AM, Simon Glass <s...@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 <s...@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 _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot