12 #include <linux/types.h>
13 #include <linux/errno.h>
14 #include <linux/sched.h>
15 #include <linux/kernel.h>
16 #include <linux/poll.h>
23 #include <linux/slab.h>
25 #include <asm/uaccess.h>
29 #include <asm/nvram.h>
31 #include <asm/machdep.h>
38 static char *rtas_log_buf;
39 static unsigned long rtas_log_start;
40 static unsigned long rtas_log_size;
42 static int surveillance_timeout = -1;
44 static unsigned int rtas_error_log_max;
45 static unsigned int rtas_error_log_buffer_max;
48 static unsigned int event_scan;
49 static unsigned int rtas_event_scan_rate;
51 static int full_rtas_msgs = 0;
54 static int logging_enabled;
57 static int error_log_cnt;
64 static unsigned char logdata[RTAS_ERROR_LOG_MAX];
66 static char *rtas_type[] = {
67 "Unknown",
"Retry",
"TCE Error",
"Internal Device Failure",
68 "Timeout",
"Data Parity",
"Address Parity",
"Cache Parity",
69 "Address Invalid",
"ECC Uncorrected",
"ECC Corrupted",
72 static char *rtas_event_type(
int type)
74 if ((type > 0) && (type < 11))
75 return rtas_type[
type];
80 case RTAS_TYPE_PLATFORM:
81 return "Platform Error";
85 return "Platform Information Event";
86 case RTAS_TYPE_DEALLOC:
87 return "Resource Deallocation Event";
89 return "Dump Notification Event";
108 static void printk_log_rtas(
char *
buf,
int len)
114 char *
str =
"RTAS event";
116 if (full_rtas_msgs) {
117 printk(RTAS_DEBUG
"%d -------- %s begin --------\n",
126 for (i = 0; i < len; i++) {
129 memset(buffer, 0,
sizeof(buffer));
130 n =
sprintf(buffer,
"RTAS %d:", i/perline);
136 n +=
sprintf(buffer+n,
"%02x", (
unsigned char)buf[i]);
138 if (j == (perline-1))
141 if ((i % perline) != 0)
144 printk(RTAS_DEBUG
"%d -------- %s end ----------\n",
147 struct rtas_error_log *errlog = (
struct rtas_error_log *)buf;
149 printk(RTAS_DEBUG
"event: %d, Type: %s, Severity: %d\n",
150 error_log_cnt, rtas_event_type(errlog->type),
155 static int log_rtas_len(
char * buf)
158 struct rtas_error_log *
err;
162 err = (
struct rtas_error_log *)buf;
163 if (err->extended && err->extended_log_length) {
166 len += err->extended_log_length;
169 if (rtas_error_log_max == 0)
170 rtas_error_log_max = rtas_get_error_log_max();
172 if (len > rtas_error_log_max)
173 len = rtas_error_log_max;
205 switch (err_type & ERR_TYPE_MASK) {
206 case ERR_TYPE_RTAS_LOG:
207 len = log_rtas_len(buf);
208 if (!(err_type & ERR_FLAG_BOOT))
211 case ERR_TYPE_KERNEL_PANIC:
214 spin_unlock_irqrestore(&rtasd_log_lock, s);
220 if (logging_enabled && !(err_type & ERR_FLAG_BOOT))
229 if ((err_type & ERR_TYPE_MASK) == ERR_TYPE_RTAS_LOG)
230 printk_log_rtas(buf, len);
233 if (fatal || !logging_enabled) {
236 spin_unlock_irqrestore(&rtasd_log_lock, s);
241 switch (err_type & ERR_TYPE_MASK) {
242 case ERR_TYPE_RTAS_LOG:
243 offset = rtas_error_log_buffer_max *
244 ((rtas_log_start+rtas_log_size) & LOG_NUMBER_MASK);
247 memcpy(&rtas_log_buf[offset], (
void *) &error_log_cnt,
sizeof(
int));
250 offset +=
sizeof(
int);
251 memcpy(&rtas_log_buf[offset], buf, len);
253 if (rtas_log_size < LOG_NUMBER)
259 spin_unlock_irqrestore(&rtasd_log_lock, s);
262 case ERR_TYPE_KERNEL_PANIC:
265 spin_unlock_irqrestore(&rtasd_log_lock, s);
286 size_t count, loff_t *ppos)
293 if (!buf || count < rtas_error_log_buffer_max)
296 count = rtas_error_log_buffer_max;
308 while (rtas_log_size == 0) {
310 spin_unlock_irqrestore(&rtasd_log_lock, s);
315 if (!logging_enabled) {
316 spin_unlock_irqrestore(&rtasd_log_lock, s);
324 spin_unlock_irqrestore(&rtasd_log_lock, s);
331 offset = rtas_error_log_buffer_max * (rtas_log_start & LOG_NUMBER_MASK);
332 memcpy(tmp, &rtas_log_buf[offset], count);
336 spin_unlock_irqrestore(&rtasd_log_lock, s);
344 static unsigned int rtas_log_poll(
struct file *file,
poll_table *
wait)
346 poll_wait(file, &rtas_log_wait, wait);
353 .read = rtas_log_read,
354 .poll = rtas_log_poll,
355 .open = rtas_log_open,
356 .release = rtas_log_release,
360 static int enable_surveillance(
int timeout)
378 static void do_event_scan(
void)
382 memset(logdata, 0, rtas_error_log_max);
384 RTAS_EVENT_SCAN_ALL_EVENTS, 0,
385 __pa(logdata), rtas_error_log_max);
404 static unsigned long event_scan_delay = 1*
HZ;
405 static int first_pass = 1;
417 if (cpu >= nr_cpu_ids) {
418 cpu = cpumask_first(cpu_online_mask);
422 event_scan_delay = 30*
HZ/rtas_event_scan_rate;
424 if (surveillance_timeout != -1) {
425 pr_debug(
"rtasd: enabling surveillance\n");
426 enable_surveillance(surveillance_timeout);
427 pr_debug(
"rtasd: surveillance enabled\n");
439 static void retreive_nvram_error_log(
void)
441 unsigned int err_type ;
445 memset(logdata, 0, rtas_error_log_max);
447 &err_type, &error_log_cnt);
451 if (err_type != ERR_FLAG_ALREADY_LOGGED) {
457 static void retreive_nvram_error_log(
void)
462 static void start_event_scan(
void)
465 pr_debug(
"rtasd: will sleep for %d milliseconds\n",
466 (30000 / rtas_event_scan_rate));
469 retreive_nvram_error_log();
472 &event_scan_work, event_scan_delay);
482 static int __init rtas_init(
void)
486 if (!machine_is(pseries) && !machine_is(chrp))
491 if (event_scan == RTAS_UNKNOWN_SERVICE) {
496 rtas_event_scan_rate =
rtas_token(
"rtas-event-scan-rate");
497 if (rtas_event_scan_rate == RTAS_UNKNOWN_SERVICE) {
502 if (!rtas_event_scan_rate) {
509 rtas_error_log_max = rtas_get_error_log_max();
510 rtas_error_log_buffer_max = rtas_error_log_max +
sizeof(
int);
512 rtas_log_buf =
vmalloc(rtas_error_log_buffer_max*LOG_NUMBER);
518 entry = proc_create(
"powerpc/rtas/error_log",
S_IRUSR,
NULL,
519 &proc_rtas_log_operations);
529 static int __init surveillance_setup(
char *str)
534 if (!machine_is(pseries))
538 if (i >= 0 && i <= 255)
539 surveillance_timeout =
i;
544 __setup(
"surveillance=", surveillance_setup);
546 static int __init rtasmsgs_setup(
char *str)
548 if (
strcmp(str,
"on") == 0)
550 else if (
strcmp(str,
"off") == 0)
555 __setup(
"rtasmsgs=", rtasmsgs_setup);