Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4b4b13d5 authored by Simon Kagstrom's avatar Simon Kagstrom Committed by Michael Ellerman
Browse files

powerpc/boot: Parse chosen/cmdline-timeout parameter



On some platforms a 5 second timeout during boot might be quite long, so
make it configurable. Run the loop at least once to let the user stop
the boot by holding a key pressed. If the timeout is set to 0, don't
wait for input, which can be used as a workaround if the boot hangs on
random data coming in on the serial port.

Signed-off-by: default avatarSimon Kagstrom <simon.kagstrom@netinsight.net>
[mpe: Changelog wording & whitespace]
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent 90029640
Loading
Loading
Loading
Loading
+13 −2
Original line number Diff line number Diff line
@@ -144,13 +144,24 @@ static char cmdline[BOOT_COMMAND_LINE_SIZE]

static void prep_cmdline(void *chosen)
{
	unsigned int getline_timeout = 5000;
	int v;
	int n;

	/* Wait-for-input time */
	n = getprop(chosen, "linux,cmdline-timeout", &v, sizeof(v));
	if (n == sizeof(v))
		getline_timeout = v;

	if (cmdline[0] == '\0')
		getprop(chosen, "bootargs", cmdline, BOOT_COMMAND_LINE_SIZE-1);

	printf("\n\rLinux/PowerPC load: %s", cmdline);

	/* If possible, edit the command line */
	if (console_ops.edit_cmdline)
		console_ops.edit_cmdline(cmdline, BOOT_COMMAND_LINE_SIZE);
	if (console_ops.edit_cmdline && getline_timeout)
		console_ops.edit_cmdline(cmdline, BOOT_COMMAND_LINE_SIZE, getline_timeout);

	printf("\n\r");

	/* Put the command line back into the devtree for the kernel */
+1 −1
Original line number Diff line number Diff line
@@ -58,7 +58,7 @@ extern struct dt_ops dt_ops;
struct console_ops {
	int	(*open)(void);
	void	(*write)(const char *buf, int len);
	void	(*edit_cmdline)(char *buf, int len);
	void	(*edit_cmdline)(char *buf, int len, unsigned int getline_timeout);
	void	(*close)(void);
	void	*data;
};
+3 −3
Original line number Diff line number Diff line
@@ -33,7 +33,7 @@ static void serial_write(const char *buf, int len)
		scdp->putc(*buf++);
}

static void serial_edit_cmdline(char *buf, int len)
static void serial_edit_cmdline(char *buf, int len, unsigned int timeout)
{
	int timer = 0, count;
	char ch, *cp;
@@ -44,7 +44,7 @@ static void serial_edit_cmdline(char *buf, int len)
	cp = &buf[count];
	count++;

	while (timer++ < 5*1000) {
	do {
		if (scdp->tstc()) {
			while (((ch = scdp->getc()) != '\n') && (ch != '\r')) {
				/* Test for backspace/delete */
@@ -70,7 +70,7 @@ static void serial_edit_cmdline(char *buf, int len)
			break;  /* Exit 'timer' loop */
		}
		udelay(1000);  /* 1 msec */
	}
	} while (timer++ < timeout);
	*cp = 0;
}