From: Paul Mackerras Firmware can report errors at any time, and not atypically during boot. However, these reports were being discarded until th rtasd comes up, which occurs fairly late in the boot cycle. As a result, firmware errors during boot were being silently ignored. Signed-off-by: Linas Vepstas Signed-off-by: Paul Mackerras Signed-off-by: Andrew Morton --- 25-akpm/arch/ppc64/kernel/rtasd.c | 13 ++++++++++++- 1 files changed, 12 insertions(+), 1 deletion(-) diff -puN arch/ppc64/kernel/rtasd.c~ppc64-log-firmware-errors-during-boot arch/ppc64/kernel/rtasd.c --- 25/arch/ppc64/kernel/rtasd.c~ppc64-log-firmware-errors-during-boot 2004-08-17 23:47:38.647094368 -0700 +++ 25-akpm/arch/ppc64/kernel/rtasd.c 2004-08-17 23:47:38.651093760 -0700 @@ -57,6 +57,8 @@ volatile int error_log_cnt = 0; */ static unsigned char logdata[RTAS_ERROR_LOG_MAX]; +static int get_eventscan_parms(void); + /* To see this info, grep RTAS /var/log/messages and each entry * will be collected together with obvious begin/end. * There will be a unique identifier on the begin and end lines. @@ -121,6 +123,9 @@ static int log_rtas_len(char * buf) len += err->extended_log_length; } + if (rtas_error_log_max == 0) { + get_eventscan_parms(); + } if (len > rtas_error_log_max) len = rtas_error_log_max; @@ -148,7 +153,6 @@ void pSeries_log_error(char *buf, unsign int len = 0; DEBUG("logging event\n"); - if (buf == NULL) return; @@ -171,6 +175,13 @@ void pSeries_log_error(char *buf, unsign if (!no_more_logging && !(err_type & ERR_FLAG_BOOT)) nvram_write_error_log(buf, len, err_type); + /* rtas errors can occur during boot, and we do want to capture + * those somewhere, even if nvram isn't ready (why not?), and even + * if rtasd isn't ready. Put them into the boot log, at least. */ + if ((err_type & ERR_TYPE_MASK) == ERR_TYPE_RTAS_LOG) { + printk_log_rtas(buf, len); + } + /* Check to see if we need to or have stopped logging */ if (fatal || no_more_logging) { no_more_logging = 1; _