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

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
...@@ -144,13 +144,24 @@ static char cmdline[BOOT_COMMAND_LINE_SIZE] ...@@ -144,13 +144,24 @@ static char cmdline[BOOT_COMMAND_LINE_SIZE]
static void prep_cmdline(void *chosen) 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') if (cmdline[0] == '\0')
getprop(chosen, "bootargs", cmdline, BOOT_COMMAND_LINE_SIZE-1); getprop(chosen, "bootargs", cmdline, BOOT_COMMAND_LINE_SIZE-1);
printf("\n\rLinux/PowerPC load: %s", cmdline); printf("\n\rLinux/PowerPC load: %s", cmdline);
/* If possible, edit the command line */ /* If possible, edit the command line */
if (console_ops.edit_cmdline) if (console_ops.edit_cmdline && getline_timeout)
console_ops.edit_cmdline(cmdline, BOOT_COMMAND_LINE_SIZE); console_ops.edit_cmdline(cmdline, BOOT_COMMAND_LINE_SIZE, getline_timeout);
printf("\n\r"); printf("\n\r");
/* Put the command line back into the devtree for the kernel */ /* Put the command line back into the devtree for the kernel */
......
...@@ -58,7 +58,7 @@ extern struct dt_ops dt_ops; ...@@ -58,7 +58,7 @@ extern struct dt_ops dt_ops;
struct console_ops { struct console_ops {
int (*open)(void); int (*open)(void);
void (*write)(const char *buf, int len); 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 (*close)(void);
void *data; void *data;
}; };
......
...@@ -33,7 +33,7 @@ static void serial_write(const char *buf, int len) ...@@ -33,7 +33,7 @@ static void serial_write(const char *buf, int len)
scdp->putc(*buf++); 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; int timer = 0, count;
char ch, *cp; char ch, *cp;
...@@ -44,7 +44,7 @@ static void serial_edit_cmdline(char *buf, int len) ...@@ -44,7 +44,7 @@ static void serial_edit_cmdline(char *buf, int len)
cp = &buf[count]; cp = &buf[count];
count++; count++;
while (timer++ < 5*1000) { do {
if (scdp->tstc()) { if (scdp->tstc()) {
while (((ch = scdp->getc()) != '\n') && (ch != '\r')) { while (((ch = scdp->getc()) != '\n') && (ch != '\r')) {
/* Test for backspace/delete */ /* Test for backspace/delete */
...@@ -70,7 +70,7 @@ static void serial_edit_cmdline(char *buf, int len) ...@@ -70,7 +70,7 @@ static void serial_edit_cmdline(char *buf, int len)
break; /* Exit 'timer' loop */ break; /* Exit 'timer' loop */
} }
udelay(1000); /* 1 msec */ udelay(1000); /* 1 msec */
} } while (timer++ < timeout);
*cp = 0; *cp = 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment