patch-2_6_7-vs1_9_1_12
[linux-2.6.git] / arch / ppc64 / kernel / rtasd.c
1 /*
2  * Copyright (C) 2001 Anton Blanchard <anton@au.ibm.com>, IBM
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version
7  * 2 of the License, or (at your option) any later version.
8  *
9  * Communication to userspace based on kernel/printk.c
10  */
11
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>
17 #include <linux/proc_fs.h>
18 #include <linux/init.h>
19 #include <linux/vmalloc.h>
20 #include <linux/spinlock.h>
21 #include <linux/cpu.h>
22
23 #include <asm/uaccess.h>
24 #include <asm/io.h>
25 #include <asm/rtas.h>
26 #include <asm/prom.h>
27 #include <asm/nvram.h>
28 #include <asm/atomic.h>
29
30 #if 0
31 #define DEBUG(A...)     printk(KERN_ERR A)
32 #else
33 #define DEBUG(A...)
34 #endif
35
36 static spinlock_t log_lock = SPIN_LOCK_UNLOCKED;
37
38 DECLARE_WAIT_QUEUE_HEAD(rtas_log_wait);
39
40 static char *rtas_log_buf;
41 static unsigned long rtas_log_start;
42 static unsigned long rtas_log_size;
43
44 static int surveillance_timeout = -1;
45 static unsigned int rtas_event_scan_rate;
46 static unsigned int rtas_error_log_max;
47 static unsigned int rtas_error_log_buffer_max;
48
49 extern volatile int no_more_logging;
50
51 volatile int error_log_cnt = 0;
52
53 /*
54  * Since we use 32 bit RTAS, the physical address of this must be below
55  * 4G or else bad things happen. Allocate this in the kernel data and
56  * make it big enough.
57  */
58 static unsigned char logdata[RTAS_ERROR_LOG_MAX];
59
60 /* To see this info, grep RTAS /var/log/messages and each entry
61  * will be collected together with obvious begin/end.
62  * There will be a unique identifier on the begin and end lines.
63  * This will persist across reboots.
64  *
65  * format of error logs returned from RTAS:
66  * bytes        (size)  : contents
67  * --------------------------------------------------------
68  * 0-7          (8)     : rtas_error_log
69  * 8-47         (40)    : extended info
70  * 48-51        (4)     : vendor id
71  * 52-1023 (vendor specific) : location code and debug data
72  */
73 static void printk_log_rtas(char *buf, int len)
74 {
75
76         int i,j,n;
77         int perline = 16;
78         char buffer[64];
79         char * str = "RTAS event";
80
81         printk(RTAS_DEBUG "%d -------- %s begin --------\n", error_log_cnt, str);
82
83         /*
84          * Print perline bytes on each line, each line will start
85          * with RTAS and a changing number, so syslogd will
86          * print lines that are otherwise the same.  Separate every
87          * 4 bytes with a space.
88          */
89         for (i=0; i < len; i++) {
90                 j = i % perline;
91                 if (j == 0) {
92                         memset(buffer, 0, sizeof(buffer));
93                         n = sprintf(buffer, "RTAS %d:", i/perline);
94                 }
95
96                 if ((i % 4) == 0)
97                         n += sprintf(buffer+n, " ");
98
99                 n += sprintf(buffer+n, "%02x", (unsigned char)buf[i]);
100
101                 if (j == (perline-1))
102                         printk(KERN_DEBUG "%s\n", buffer);
103         }
104         if ((i % perline) != 0)
105                 printk(KERN_DEBUG "%s\n", buffer);
106
107         printk(RTAS_DEBUG "%d -------- %s end ----------\n", error_log_cnt, str);
108 }
109
110 static int log_rtas_len(char * buf)
111 {
112         int len;
113         struct rtas_error_log *err;
114
115         /* rtas fixed header */
116         len = 8;
117         err = (struct rtas_error_log *)buf;
118         if (err->extended_log_length) {
119
120                 /* extended header */
121                 len += err->extended_log_length;
122         }
123
124         if (len > rtas_error_log_max)
125                 len = rtas_error_log_max;
126
127         return len;
128 }
129
130 /*
131  * First write to nvram, if fatal error, that is the only
132  * place we log the info.  The error will be picked up
133  * on the next reboot by rtasd.  If not fatal, run the
134  * method for the type of error.  Currently, only RTAS
135  * errors have methods implemented, but in the future
136  * there might be a need to store data in nvram before a
137  * call to panic().
138  *
139  * XXX We write to nvram periodically, to indicate error has
140  * been written and sync'd, but there is a possibility
141  * that if we don't shutdown correctly, a duplicate error
142  * record will be created on next reboot.
143  */
144 void pSeries_log_error(char *buf, unsigned int err_type, int fatal)
145 {
146         unsigned long offset;
147         unsigned long s;
148         int len = 0;
149
150         DEBUG("logging event\n");
151
152         if (buf == NULL)
153                 return;
154
155         spin_lock_irqsave(&log_lock, s);
156
157         /* get length and increase count */
158         switch (err_type & ERR_TYPE_MASK) {
159         case ERR_TYPE_RTAS_LOG:
160                 len = log_rtas_len(buf);
161                 if (!(err_type & ERR_FLAG_BOOT))
162                         error_log_cnt++;
163                 break;
164         case ERR_TYPE_KERNEL_PANIC:
165         default:
166                 spin_unlock_irqrestore(&log_lock, s);
167                 return;
168         }
169
170         /* Write error to NVRAM */
171         if (!no_more_logging && !(err_type & ERR_FLAG_BOOT))
172                 nvram_write_error_log(buf, len, err_type);
173
174         /* Check to see if we need to or have stopped logging */
175         if (fatal || no_more_logging) {
176                 no_more_logging = 1;
177                 spin_unlock_irqrestore(&log_lock, s);
178                 return;
179         }
180
181         /* call type specific method for error */
182         switch (err_type & ERR_TYPE_MASK) {
183         case ERR_TYPE_RTAS_LOG:
184                 /* put into syslog and error_log file */
185                 printk_log_rtas(buf, len);
186
187                 offset = rtas_error_log_buffer_max *
188                         ((rtas_log_start+rtas_log_size) & LOG_NUMBER_MASK);
189
190                 /* First copy over sequence number */
191                 memcpy(&rtas_log_buf[offset], (void *) &error_log_cnt, sizeof(int));
192
193                 /* Second copy over error log data */
194                 offset += sizeof(int);
195                 memcpy(&rtas_log_buf[offset], buf, len);
196
197                 if (rtas_log_size < LOG_NUMBER)
198                         rtas_log_size += 1;
199                 else
200                         rtas_log_start += 1;
201
202                 spin_unlock_irqrestore(&log_lock, s);
203                 wake_up_interruptible(&rtas_log_wait);
204                 break;
205         case ERR_TYPE_KERNEL_PANIC:
206         default:
207                 spin_unlock_irqrestore(&log_lock, s);
208                 return;
209         }
210
211 }
212
213
214 static int rtas_log_open(struct inode * inode, struct file * file)
215 {
216         return 0;
217 }
218
219 static int rtas_log_release(struct inode * inode, struct file * file)
220 {
221         return 0;
222 }
223
224 /* This will check if all events are logged, if they are then, we
225  * know that we can safely clear the events in NVRAM.
226  * Next we'll sit and wait for something else to log.
227  */
228 static ssize_t rtas_log_read(struct file * file, char * buf,
229                          size_t count, loff_t *ppos)
230 {
231         int error;
232         char *tmp;
233         unsigned long s;
234         unsigned long offset;
235
236         if (!buf || count < rtas_error_log_buffer_max)
237                 return -EINVAL;
238
239         count = rtas_error_log_buffer_max;
240
241         error = verify_area(VERIFY_WRITE, buf, count);
242         if (error)
243                 return -EFAULT;
244
245         tmp = kmalloc(count, GFP_KERNEL);
246         if (!tmp)
247                 return -ENOMEM;
248
249
250         spin_lock_irqsave(&log_lock, s);
251         /* if it's 0, then we know we got the last one (the one in NVRAM) */
252         if (rtas_log_size == 0 && !no_more_logging)
253                 nvram_clear_error_log();
254         spin_unlock_irqrestore(&log_lock, s);
255
256
257         error = wait_event_interruptible(rtas_log_wait, rtas_log_size);
258         if (error)
259                 goto out;
260
261         spin_lock_irqsave(&log_lock, s);
262         offset = rtas_error_log_buffer_max * (rtas_log_start & LOG_NUMBER_MASK);
263         memcpy(tmp, &rtas_log_buf[offset], count);
264
265         rtas_log_start += 1;
266         rtas_log_size -= 1;
267         spin_unlock_irqrestore(&log_lock, s);
268
269         error = copy_to_user(buf, tmp, count) ? -EFAULT : count;
270 out:
271         kfree(tmp);
272         return error;
273 }
274
275 static unsigned int rtas_log_poll(struct file *file, poll_table * wait)
276 {
277         poll_wait(file, &rtas_log_wait, wait);
278         if (rtas_log_size)
279                 return POLLIN | POLLRDNORM;
280         return 0;
281 }
282
283 struct file_operations proc_rtas_log_operations = {
284         .read =         rtas_log_read,
285         .poll =         rtas_log_poll,
286         .open =         rtas_log_open,
287         .release =      rtas_log_release,
288 };
289
290 static int enable_surveillance(int timeout)
291 {
292         int error;
293
294         error = rtas_call(rtas_token("set-indicator"), 3, 1, NULL,
295                           SURVEILLANCE_TOKEN, 0, timeout);
296
297         if (error) {
298                 printk(KERN_ERR "rtasd: could not enable surveillance\n");
299                 return -1;
300         }
301
302         return 0;
303 }
304
305 static int get_eventscan_parms(void)
306 {
307         struct device_node *node;
308         int *ip;
309
310         node = of_find_node_by_path("/rtas");
311
312         ip = (int *)get_property(node, "rtas-event-scan-rate", NULL);
313         if (ip == NULL) {
314                 printk(KERN_ERR "rtasd: no rtas-event-scan-rate\n");
315                 of_node_put(node);
316                 return -1;
317         }
318         rtas_event_scan_rate = *ip;
319         DEBUG("rtas-event-scan-rate %d\n", rtas_event_scan_rate);
320
321         ip = (int *)get_property(node, "rtas-error-log-max", NULL);
322         if (ip == NULL) {
323                 printk(KERN_ERR "rtasd: no rtas-error-log-max\n");
324                 of_node_put(node);
325                 return -1;
326         }
327         rtas_error_log_max = *ip;
328         DEBUG("rtas-error-log-max %d\n", rtas_error_log_max);
329
330         if (rtas_error_log_max > RTAS_ERROR_LOG_MAX) {
331                 printk(KERN_ERR "rtasd: truncated error log from %d to %d bytes\n", rtas_error_log_max, RTAS_ERROR_LOG_MAX);
332                 rtas_error_log_max = RTAS_ERROR_LOG_MAX;
333         }
334
335         /* Make room for the sequence number */
336         rtas_error_log_buffer_max = rtas_error_log_max + sizeof(int);
337
338         of_node_put(node);
339
340         return 0;
341 }
342
343 static void do_event_scan(int event_scan)
344 {
345         int error;
346         do {
347                 memset(logdata, 0, rtas_error_log_max);
348                 error = rtas_call(event_scan, 4, 1, NULL,
349                                   RTAS_EVENT_SCAN_ALL_EVENTS, 0,
350                                   __pa(logdata), rtas_error_log_max);
351                 if (error == -1) {
352                         printk(KERN_ERR "event-scan failed\n");
353                         break;
354                 }
355
356                 if (error == 0)
357                         pSeries_log_error(logdata, ERR_TYPE_RTAS_LOG, 0);
358
359         } while(error == 0);
360 }
361
362 static int rtasd(void *unused)
363 {
364         unsigned int err_type;
365         int cpu = 0;
366         int event_scan = rtas_token("event-scan");
367         cpumask_t all = CPU_MASK_ALL;
368         int rc;
369
370         daemonize("rtasd");
371
372         if (event_scan == RTAS_UNKNOWN_SERVICE || get_eventscan_parms() == -1)
373                 goto error;
374
375         rtas_log_buf = vmalloc(rtas_error_log_buffer_max*LOG_NUMBER);
376         if (!rtas_log_buf) {
377                 printk(KERN_ERR "rtasd: no memory\n");
378                 goto error;
379         }
380
381         /* We can use rtas_log_buf now */
382         no_more_logging = 0;
383
384         printk(KERN_ERR "RTAS daemon started\n");
385
386         DEBUG("will sleep for %d jiffies\n", (HZ*60/rtas_event_scan_rate) / 2);
387
388         /* See if we have any error stored in NVRAM */
389         memset(logdata, 0, rtas_error_log_max);
390
391         rc = nvram_read_error_log(logdata, rtas_error_log_max, &err_type);
392         if (!rc) {
393                 if (err_type != ERR_FLAG_ALREADY_LOGGED) {
394                         pSeries_log_error(logdata, err_type | ERR_FLAG_BOOT, 0);
395                 }
396         }
397
398         /* First pass. */
399         lock_cpu_hotplug();
400         for_each_online_cpu(cpu) {
401                 DEBUG("scheduling on %d\n", cpu);
402                 set_cpus_allowed(current, cpumask_of_cpu(cpu));
403                 DEBUG("watchdog scheduled on cpu %d\n", smp_processor_id());
404
405                 do_event_scan(event_scan);
406                 set_current_state(TASK_INTERRUPTIBLE);
407                 schedule_timeout(HZ);
408         }
409         unlock_cpu_hotplug();
410
411         if (surveillance_timeout != -1) {
412                 DEBUG("enabling surveillance\n");
413                 enable_surveillance(surveillance_timeout);
414                 DEBUG("surveillance enabled\n");
415         }
416
417         lock_cpu_hotplug();
418         cpu = first_cpu_const(mk_cpumask_const(cpu_online_map));
419         for (;;) {
420                 set_cpus_allowed(current, cpumask_of_cpu(cpu));
421                 do_event_scan(event_scan);
422                 set_cpus_allowed(current, all);
423
424                 /* Drop hotplug lock, and sleep for a bit (at least
425                  * one second since some machines have problems if we
426                  * call event-scan too quickly). */
427                 unlock_cpu_hotplug();
428                 set_current_state(TASK_INTERRUPTIBLE);
429                 schedule_timeout((HZ*60/rtas_event_scan_rate) / 2);
430                 lock_cpu_hotplug();
431
432                 cpu = next_cpu_const(cpu, mk_cpumask_const(cpu_online_map));
433                 if (cpu == NR_CPUS)
434                         cpu = first_cpu_const(mk_cpumask_const(cpu_online_map));
435         }
436
437 error:
438         /* Should delete proc entries */
439         return -EINVAL;
440 }
441
442 static int __init rtas_init(void)
443 {
444         struct proc_dir_entry *entry;
445
446         /* No RTAS, only warn if we are on a pSeries box  */
447         if (rtas_token("event-scan") == RTAS_UNKNOWN_SERVICE) {
448                 if (systemcfg->platform & PLATFORM_PSERIES);
449                         printk(KERN_ERR "rtasd: no RTAS on system\n");
450                 return 1;
451         }
452
453         entry = create_proc_entry("ppc64/rtas/error_log", S_IRUSR, NULL);
454         if (entry)
455                 entry->proc_fops = &proc_rtas_log_operations;
456         else
457                 printk(KERN_ERR "Failed to create error_log proc entry\n");
458
459         if (kernel_thread(rtasd, 0, CLONE_FS) < 0)
460                 printk(KERN_ERR "Failed to start RTAS daemon\n");
461
462         return 0;
463 }
464
465 static int __init surveillance_setup(char *str)
466 {
467         int i;
468
469         if (get_option(&str,&i)) {
470                 if (i >= 0 && i <= 255)
471                         surveillance_timeout = i;
472         }
473
474         return 1;
475 }
476
477 __initcall(rtas_init);
478 __setup("surveillance=", surveillance_setup);