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: Simon Kagstrom <simon.kagstrom@netinsight.net> [mpe: Changelog wording & whitespace] Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
This commit is contained in:
parent
90029640fd
commit
4b4b13d5fe
3 changed files with 17 additions and 6 deletions
|
@ -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;
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
break; /* Exit 'timer' loop */
|
break; /* Exit 'timer' loop */
|
||||||
}
|
}
|
||||||
udelay(1000); /* 1 msec */
|
udelay(1000); /* 1 msec */
|
||||||
}
|
} while (timer++ < timeout);
|
||||||
*cp = 0;
|
*cp = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue