xref: /openbmc/u-boot/common/bootretry.c (revision 83d290c56fab2d38cd1ab4c4cc7099559c1d5046)
1*83d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+
20098e179SSimon Glass /*
30098e179SSimon Glass  * (C) Copyright 2000
40098e179SSimon Glass  * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
50098e179SSimon Glass  */
60098e179SSimon Glass 
70098e179SSimon Glass #include <common.h>
80098e179SSimon Glass #include <bootretry.h>
90098e179SSimon Glass #include <cli.h>
100098e179SSimon Glass #include <errno.h>
110098e179SSimon Glass #include <watchdog.h>
120098e179SSimon Glass 
130098e179SSimon Glass #ifndef CONFIG_BOOT_RETRY_MIN
140098e179SSimon Glass #define CONFIG_BOOT_RETRY_MIN CONFIG_BOOT_RETRY_TIME
150098e179SSimon Glass #endif
160098e179SSimon Glass 
170098e179SSimon Glass static uint64_t endtime;  /* must be set, default is instant timeout */
180098e179SSimon Glass static int      retry_time = -1; /* -1 so can call readline before main_loop */
190098e179SSimon Glass 
200098e179SSimon Glass /***************************************************************************
210098e179SSimon Glass  * initialize command line timeout
220098e179SSimon Glass  */
bootretry_init_cmd_timeout(void)23b26440f1SSimon Glass void bootretry_init_cmd_timeout(void)
240098e179SSimon Glass {
2500caae6dSSimon Glass 	char *s = env_get("bootretry");
260098e179SSimon Glass 
270098e179SSimon Glass 	if (s != NULL)
280098e179SSimon Glass 		retry_time = (int)simple_strtol(s, NULL, 10);
290098e179SSimon Glass 	else
300098e179SSimon Glass 		retry_time = CONFIG_BOOT_RETRY_TIME;
310098e179SSimon Glass 
320098e179SSimon Glass 	if (retry_time >= 0 && retry_time < CONFIG_BOOT_RETRY_MIN)
330098e179SSimon Glass 		retry_time = CONFIG_BOOT_RETRY_MIN;
340098e179SSimon Glass }
350098e179SSimon Glass 
360098e179SSimon Glass /***************************************************************************
370098e179SSimon Glass  * reset command line timeout to retry_time seconds
380098e179SSimon Glass  */
bootretry_reset_cmd_timeout(void)39b26440f1SSimon Glass void bootretry_reset_cmd_timeout(void)
400098e179SSimon Glass {
410098e179SSimon Glass 	endtime = endtick(retry_time);
420098e179SSimon Glass }
430098e179SSimon Glass 
bootretry_tstc_timeout(void)440098e179SSimon Glass int bootretry_tstc_timeout(void)
450098e179SSimon Glass {
460098e179SSimon Glass 	while (!tstc()) {	/* while no incoming data */
470098e179SSimon Glass 		if (retry_time >= 0 && get_ticks() > endtime)
480098e179SSimon Glass 			return -ETIMEDOUT;
490098e179SSimon Glass 		WATCHDOG_RESET();
500098e179SSimon Glass 	}
510098e179SSimon Glass 
520098e179SSimon Glass 	return 0;
530098e179SSimon Glass }
540098e179SSimon Glass 
bootretry_dont_retry(void)550098e179SSimon Glass void bootretry_dont_retry(void)
560098e179SSimon Glass {
570098e179SSimon Glass 	retry_time = -1;
580098e179SSimon Glass }
59