[U-Boot] [PATCH v2 1/3] board_r: move initr_watchdog to be called after initr_serial

Stefan Roese sr at denx.de
Sat Jun 29 08:34:58 UTC 2019


Cc'ing a few people

On 16.05.19 11:19, Weijie Gao wrote:
> The initr_watchdog is currently placed before initr_serial. The
> initr_watchdog calls printf and printf finally calls ops->putc of a serial
> driver.
> 
> However, gd->cur_serial_dev points to a udevice allocated in board_f. The
> gd->cur_serial_dev->driver->ops->putc points the the code region before
> relocation.
> 
> Some serial drivers call WATCHDOG_RESET() in ops->putc. When DM is enabled
> for watchdog, watchdog_reset() is called. watchdog_reset() calls get_timer
> to get current timer.
> 
> On some platforms the timer driver is also a DM driver. initr_watchdog is
> placed right after initr_dm, which means the timer driver hasn't been
> initialized. So dm_timer_init() is called. To create a new udevice, calloc
> is called.
> 
> However start from ops->putc, u-boot execution flow is redirected into the
> memory region before relocation (board_f). In board_f, dlmalloc hasn't
> been initialized. The call to calloc will fail, and this will cause DM to
> print out an error message, and it will call printf again, causing
> recursive error outputs.
> 
> This patch places initr_watchdog after initr_serial to solve this issue.
> 
> Cc: Stefan Roese <sr at denx.de>
> Reviewed-by: Ryder Lee <ryder.lee at mediatek.com>
> Signed-off-by: Weijie Gao <weijie.gao at mediatek.com>
> ---
> Changes since v1: move initr_watchdog instead of initr_serial
> ---
>   common/board_r.c | 6 +++---
>   1 file changed, 3 insertions(+), 3 deletions(-)
> 
> diff --git a/common/board_r.c b/common/board_r.c
> index 150e8cd424..df24021f2c 100644
> --- a/common/board_r.c
> +++ b/common/board_r.c
> @@ -678,9 +678,6 @@ static init_fnc_t init_sequence_r[] = {
>   #ifdef CONFIG_DM
>   	initr_dm,
>   #endif
> -#if defined(CONFIG_WDT)
> -	initr_watchdog,
> -#endif
>   #if defined(CONFIG_ARM) || defined(CONFIG_NDS32) || defined(CONFIG_RISCV) || \
>   	defined(CONFIG_SANDBOX)
>   	board_init,	/* Setup chipselects */
> @@ -700,6 +697,9 @@ static init_fnc_t init_sequence_r[] = {
>   	stdio_init_tables,
>   	initr_serial,
>   	initr_announce,
> +#if defined(CONFIG_WDT)
> +	initr_watchdog,
> +#endif
>   	INIT_FUNC_WATCHDOG_RESET
>   #ifdef CONFIG_NEEDS_MANUAL_RELOC
>   	initr_manual_reloc_cmdtable,

Reviewed-by: Stefan Roese <sr at denx.de>

Frank, does this patch fix the watchdog issue on your board as well?

Tom, could you please apply this patch to the upcoming release?

Thanks,
Stefan


More information about the U-Boot mailing list