rtasd.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:28k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  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. #include <linux/types.h>
  12. #include <linux/errno.h>
  13. #include <linux/sched.h>
  14. #include <linux/kernel.h>
  15. #include <linux/poll.h>
  16. #include <linux/proc_fs.h>
  17. #include <linux/init.h>
  18. #include <linux/vmalloc.h>
  19. #include <asm/uaccess.h>
  20. #include <asm/io.h>
  21. #include <asm/rtas.h>
  22. #include <asm/prom.h>
  23. #if 0
  24. #define DEBUG(A...) printk(KERN_ERR A)
  25. #else
  26. #define DEBUG(A...)
  27. #endif
  28. static spinlock_t rtas_log_lock = SPIN_LOCK_UNLOCKED;
  29. DECLARE_WAIT_QUEUE_HEAD(rtas_log_wait);
  30. #define LOG_NUMBER 64 /* must be a power of two */
  31. #define LOG_NUMBER_MASK (LOG_NUMBER-1)
  32. static char *rtas_log_buf;
  33. static unsigned long rtas_log_start;
  34. static unsigned long rtas_log_size;
  35. static int surveillance_requested;
  36. static unsigned int rtas_event_scan_rate;
  37. static unsigned int rtas_error_log_max;
  38. #define EVENT_SCAN_ALL_EVENTS 0xf0000000
  39. #define SURVEILLANCE_TOKEN 9000
  40. #define SURVEILLANCE_TIMEOUT 1
  41. #define SURVEILLANCE_SCANRATE 1
  42. /*
  43.  * Since we use 32 bit RTAS, the physical address of this must be below
  44.  * 4G or else bad things happen. Allocate this in the kernel data and
  45.  * make it big enough.
  46.  */
  47. #define RTAS_ERROR_LOG_MAX 1024
  48. static unsigned char logdata[RTAS_ERROR_LOG_MAX];
  49. static int rtas_log_open(struct inode * inode, struct file * file)
  50. {
  51. return 0;
  52. }
  53. static int rtas_log_release(struct inode * inode, struct file * file)
  54. {
  55. return 0;
  56. }
  57. static ssize_t rtas_log_read(struct file * file, char * buf,
  58.  size_t count, loff_t *ppos)
  59. {
  60. int error;
  61. char *tmp;
  62. unsigned long offset;
  63. if (!buf || count < rtas_error_log_max)
  64. return -EINVAL;
  65. count = rtas_error_log_max;
  66. error = verify_area(VERIFY_WRITE, buf, count);
  67. if (error)
  68. return -EINVAL;
  69. tmp = kmalloc(rtas_error_log_max, GFP_KERNEL);
  70. if (!tmp)
  71. return -ENOMEM;
  72. error = wait_event_interruptible(rtas_log_wait, rtas_log_size);
  73. if (error)
  74. goto out;
  75. spin_lock(&rtas_log_lock);
  76. offset = rtas_error_log_max * (rtas_log_start & LOG_NUMBER_MASK);
  77. memcpy(tmp, &rtas_log_buf[offset], count);
  78. rtas_log_start += 1;
  79. rtas_log_size -= 1;
  80. spin_unlock(&rtas_log_lock);
  81. error = copy_to_user(buf, tmp, count) ? -EFAULT : count;
  82. out:
  83. kfree(tmp);
  84. return error;
  85. }
  86. static unsigned int rtas_log_poll(struct file *file, poll_table * wait)
  87. {
  88. poll_wait(file, &rtas_log_wait, wait);
  89. if (rtas_log_size)
  90. return POLLIN | POLLRDNORM;
  91. return 0;
  92. }
  93. struct file_operations proc_rtas_log_operations = {
  94. read: rtas_log_read,
  95. poll: rtas_log_poll,
  96. open: rtas_log_open,
  97. release: rtas_log_release,
  98. };
  99. #define RTAS_ERR KERN_ERR "RTAS: "
  100. /* Extended error log header (12 bytes) */
  101. struct exthdr {
  102. unsigned int valid:1;
  103. unsigned int unrecoverable:1;
  104. unsigned int recoverable:1;
  105. unsigned int unrecoverable_bypassed:1; /* i.e. degraded performance */
  106. unsigned int predictive:1;
  107. unsigned int newlog:1;
  108. unsigned int bigendian:1; /* always 1 */
  109. unsigned int /* reserved */:1;
  110. unsigned int platform_specific:1; /* only in version 3+ */
  111. unsigned int /* reserved */:3;
  112. unsigned int platform_value:4; /* valid iff platform_specific */
  113. unsigned int power_pc:1; /* always 1 */
  114. unsigned int /* reserved */:2;
  115. unsigned int addr_invalid:1; /* failing_address is invalid */
  116. unsigned int format_type:4;
  117. #define EXTLOG_FMT_CPU 1
  118. #define EXTLOG_FMT_MEMORY 2
  119. #define EXTLOG_FMT_IO 3
  120. #define EXTLOG_FMT_POST 4
  121. #define EXTLOG_FMT_ENV 5
  122. #define EXTLOG_FMT_POW 6
  123. #define EXTLOG_FMT_IBMDIAG 12
  124. #define EXTLOG_FMT_IBMSP 13
  125. /* This group is in version 3+ only */
  126. unsigned int non_hardware:1; /* Firmware or software is suspect */
  127. unsigned int hot_plug:1; /* Failing component may be hot plugged */
  128. unsigned int group_failure:1; /* Group of components should be replaced */
  129. unsigned int /* reserved */:1;
  130. unsigned int residual:1; /* Residual error from previous boot (maybe a crash) */
  131. unsigned int boot:1; /* Error during boot */
  132. unsigned int config_change:1; /* Configuration changed since last boot */
  133. unsigned int post:1; /* Error during POST */
  134. unsigned int bcdtime:32; /* Time of error in BCD HHMMSS00 */
  135. unsigned int bcddate:32; /* Time of error in BCD YYYYMMDD */
  136. };
  137. struct cpuhdr {
  138. unsigned int internal:1;
  139. unsigned int intcache:1;
  140. unsigned int extcache_parity:1; /* or multi-bit ECC */
  141. unsigned int extcache_ecc:1;
  142. unsigned int sysbus_timeout:1;
  143. unsigned int io_timeout:1;
  144. unsigned int sysbus_parity:1;
  145. unsigned int sysbus_protocol:1;
  146. unsigned int cpuid:8;
  147. unsigned int element:16;
  148. unsigned int failing_address_hi:32;
  149. unsigned int failing_address_lo:32;
  150. /* These are version 4+ */
  151. unsigned int try_reboot:1; /* 1 => fault may be fixed by reboot */
  152. unsigned int /* reserved */:7;
  153. /* 15 bytes reserved here */
  154. };
  155. struct memhdr {
  156. unsigned int uncorrectable:1;
  157. unsigned int ECC:1;
  158. unsigned int threshold_exceeded:1;
  159. unsigned int control_internal:1;
  160. unsigned int bad_address:1;
  161. unsigned int bad_data:1;
  162. unsigned int bus:1;
  163. unsigned int timeout:1;
  164. unsigned int sysbus_parity:1;
  165. unsigned int sysbus_timeout:1;
  166. unsigned int sysbus_protocol:1;
  167. unsigned int hostbridge_timeout:1;
  168. unsigned int hostbridge_parity:1;
  169. unsigned int reserved1:1;
  170. unsigned int support:1;
  171. unsigned int sysbus_internal:1;
  172. unsigned int mem_controller_detected:8; /* who detected fault? */
  173. unsigned int mem_controller_faulted:8; /* who caused fault? */
  174. unsigned int failing_address_hi:32;
  175. unsigned int failing_address_lo:32;
  176. unsigned int ecc_syndrome:16;
  177. unsigned int memory_card:8;
  178. unsigned int reserved2:8;
  179. unsigned int sub_elements:32; /* one bit per element */
  180. unsigned int element:16;
  181. };
  182. struct iohdr {
  183. unsigned int bus_addr_parity:1;
  184. unsigned int bus_data_parity:1;
  185. unsigned int bus_timeout:1;
  186. unsigned int bridge_internal:1;
  187. unsigned int non_pci:1; /* i.e. secondary bus such as ISA */
  188. unsigned int mezzanine_addr_parity:1;
  189. unsigned int mezzanine_data_parity:1;
  190. unsigned int mezzanine_timeout:1;
  191. unsigned int bridge_via_sysbus:1;
  192. unsigned int bridge_via_mezzanine:1;
  193. unsigned int bridge_via_expbus:1;
  194. unsigned int detected_by_expbus:1;
  195. unsigned int expbus_data_parity:1;
  196. unsigned int expbus_timeout:1;
  197. unsigned int expbus_connection_failure:1;
  198. unsigned int expbus_not_operating:1;
  199. /* IOA signalling the error */
  200. unsigned int pci_sig_busno:8;
  201. unsigned int pci_sig_devfn:8;
  202. unsigned int pci_sig_deviceid:16;
  203. unsigned int pci_sig_vendorid:16;
  204. unsigned int pci_sig_revisionid:8;
  205. unsigned int pci_sig_slot:8; /* 00 => system board, ff => multiple */
  206. /* IOA sending at time of error */
  207. unsigned int pci_send_busno:8;
  208. unsigned int pci_send_devfn:8;
  209. unsigned int pci_send_deviceid:16;
  210. unsigned int pci_send_vendorid:16;
  211. unsigned int pci_send_revisionid:8;
  212. unsigned int pci_send_slot:8; /* 00 => system board, ff => multiple */
  213. };
  214. struct posthdr {
  215. unsigned int firmware:1;
  216. unsigned int config:1;
  217. unsigned int cpu:1;
  218. unsigned int memory:1;
  219. unsigned int io:1;
  220. unsigned int keyboard:1;
  221. unsigned int mouse:1;
  222. unsigned int display:1;
  223. unsigned int ipl_floppy:1;
  224. unsigned int ipl_controller:1;
  225. unsigned int ipl_cdrom:1;
  226. unsigned int ipl_disk:1;
  227. unsigned int ipl_net:1;
  228. unsigned int ipl_other:1;
  229. unsigned int /* reserved */:1;
  230. unsigned int firmware_selftest:1;
  231. char         devname[12];
  232. unsigned int post_code:4;
  233. unsigned int firmware_rev:2;
  234. unsigned int loc_code:8; /* currently unused */
  235. };
  236. struct epowhdr {
  237. unsigned int epow_sensor_value:32;
  238. unsigned int sensor:1;
  239. unsigned int power_fault:1;
  240. unsigned int fan:1;
  241. unsigned int temp:1;
  242. unsigned int redundancy:1;
  243. unsigned int CUoD:1;
  244. unsigned int /* reserved */:2;
  245. unsigned int general:1;
  246. unsigned int power_loss:1;
  247. unsigned int power_supply:1;
  248. unsigned int power_switch:1;
  249. unsigned int /* reserved */:4;
  250. unsigned int /* reserved */:16;
  251. unsigned int sensor_token:32;
  252. unsigned int sensor_index:32;
  253. unsigned int sensor_value:32;
  254. unsigned int sensor_status:32;
  255. };
  256. struct pm_eventhdr {
  257. unsigned int event_id:32;
  258. };
  259. struct sphdr {
  260. unsigned int ibm:32; /* "IBM" */
  261. unsigned int timeout:1;
  262. unsigned int i2c_bus:1;
  263. unsigned int i2c_secondary_bus:1;
  264. unsigned int sp_memory:1;
  265. unsigned int sp_registers:1;
  266. unsigned int sp_communication:1;
  267. unsigned int sp_firmware:1;
  268. unsigned int sp_hardware:1;
  269. unsigned int vpd_eeprom:1;
  270. unsigned int op_panel:1;
  271. unsigned int power_controller:1;
  272. unsigned int fan_sensor:1;
  273. unsigned int thermal_sensor:1;
  274. unsigned int voltage_sensor:1;
  275. unsigned int reserved1:2;
  276. unsigned int serial_port:1;
  277. unsigned int nvram:1;
  278. unsigned int rtc:1;
  279. unsigned int jtag:1;
  280. unsigned int tod_battery:1;
  281. unsigned int reserved2:1;
  282. unsigned int heartbeat:1;
  283. unsigned int surveillance:1;
  284. unsigned int pcn_connection:1; /* power control network */
  285. unsigned int pcn_node:1;
  286. unsigned int reserved3:2;
  287. unsigned int pcn_access:1;
  288. unsigned int reserved:3;
  289. unsigned int sensor_token:32; /* zero if undef */
  290. unsigned int sensor_index:32; /* zero if undef */
  291. };
  292. static char *severity_names[] = {
  293. "NO ERROR", "EVENT", "WARNING", "ERROR_SYNC", "ERROR", "FATAL", "(6)", "(7)"
  294. };
  295. static char *rtas_disposition_names[] = {
  296. "FULLY RECOVERED", "LIMITED RECOVERY", "NOT RECOVERED", "(4)"
  297. };
  298. static char *entity_names[] = { /* for initiator & targets */
  299. "UNKNOWN", "CPU", "PCI", "ISA", "MEMORY", "POWER MANAGEMENT", "HOT PLUG", "(7)", "(8)",
  300. "(9)", "(10)", "(11)", "(12)", "(13)", "(14)", "(15)"
  301. };
  302. static char *error_type[] = { /* Not all types covered here so need to bounds check */
  303. "UNKNOWN", "RETRY", "TCE_ERR", "INTERN_DEV_FAIL",
  304. "TIMEOUT", "DATA_PARITY", "ADDR_PARITY", "CACHE_PARITY",
  305. "ADDR_INVALID", "ECC_UNCORR", "ECC_CORR",
  306. };
  307. static char *rtas_error_type(int type)
  308. {
  309. if (type < 11)
  310. return error_type[type];
  311. if (type == 64)
  312. return "SENSOR";
  313. if (type >=96 && type <= 159)
  314. return "POWER";
  315. return error_type[0];
  316. }
  317. static void printk_cpu_failure(int version, struct exthdr *exthdr, char *data)
  318. {
  319. struct cpuhdr cpuhdr;
  320. memcpy(&cpuhdr, data, sizeof(cpuhdr));
  321. if (cpuhdr.internal) printk(RTAS_ERR "Internal error (not cache)n");
  322. if (cpuhdr.intcache) printk(RTAS_ERR "Internal cachen");
  323. if (cpuhdr.extcache_parity) printk(RTAS_ERR "External cache parity (or multi-bit)n");
  324. if (cpuhdr.extcache_ecc) printk(RTAS_ERR "External cache ECCn");
  325. if (cpuhdr.sysbus_timeout) printk(RTAS_ERR "System bus timeoutn");
  326. if (cpuhdr.io_timeout) printk(RTAS_ERR "I/O timeoutn");
  327. if (cpuhdr.sysbus_parity) printk(RTAS_ERR "System bus parityn");
  328. if (cpuhdr.sysbus_protocol) printk(RTAS_ERR "System bus protocol/transfern");
  329. printk(RTAS_ERR "CPU id: %dn", cpuhdr.cpuid);
  330. printk(RTAS_ERR "Failing element: 0x%04xn", cpuhdr.element);
  331. if (!exthdr->addr_invalid)
  332. printk(RTAS_ERR "Failing address: %08x%08xn", cpuhdr.failing_address_hi, cpuhdr.failing_address_lo);
  333. if (version >= 4 && cpuhdr.try_reboot)
  334. printk(RTAS_ERR "A reboot of the system may correct the problemn");
  335. }
  336. static void printk_mem_failure(int version, struct exthdr *exthdr, char *data)
  337. {
  338. struct memhdr memhdr;
  339. memcpy(&memhdr, data, sizeof(memhdr));
  340. if (memhdr.uncorrectable) printk(RTAS_ERR "Uncorrectable Memory errorn");
  341. if (memhdr.ECC) printk(RTAS_ERR "ECC Correctable errorn");
  342. if (memhdr.threshold_exceeded) printk(RTAS_ERR "Correctable threshold exceededn");
  343. if (memhdr.control_internal) printk(RTAS_ERR "Memory Controller internal errorn");
  344. if (memhdr.bad_address) printk(RTAS_ERR "Memory Address errorn");
  345. if (memhdr.bad_data) printk(RTAS_ERR "Memory Data errorn");
  346. if (memhdr.bus) printk(RTAS_ERR "Memory bus/switch internal errorn");
  347. if (memhdr.timeout) printk(RTAS_ERR "Memory timeoutn");
  348. if (memhdr.sysbus_parity) printk(RTAS_ERR "System bus parityn");
  349. if (memhdr.sysbus_timeout) printk(RTAS_ERR "System bus timeoutn");
  350. if (memhdr.sysbus_protocol) printk(RTAS_ERR "System bus protocol/transfern");
  351. if (memhdr.hostbridge_timeout) printk(RTAS_ERR "I/O Host Bridge timeoutn");
  352. if (memhdr.hostbridge_parity) printk(RTAS_ERR "I/O Host Bridge parityn");
  353. if (memhdr.support) printk(RTAS_ERR "System support function errorn");
  354. if (memhdr.sysbus_internal) printk(RTAS_ERR "System bus internal hardware/switch errorn");
  355. printk(RTAS_ERR "Memory Controller that detected failure: %dn", memhdr.mem_controller_detected);
  356. printk(RTAS_ERR "Memory Controller that faulted: %dn", memhdr.mem_controller_faulted);
  357. if (!exthdr->addr_invalid)
  358. printk(RTAS_ERR "Failing address: 0x%016x%016xn", memhdr.failing_address_hi, memhdr.failing_address_lo);
  359. printk(RTAS_ERR "ECC syndrome bits: 0x%04xn", memhdr.ecc_syndrome);
  360. printk(RTAS_ERR "Memory Card: %dn", memhdr.memory_card);
  361. printk(RTAS_ERR "Failing element: 0x%04xn", memhdr.element);
  362. printk(RTAS_ERR "Sub element bits: 0x%08xn", memhdr.sub_elements);
  363. }
  364. static void printk_io_failure(int version, struct exthdr *exthdr, char *data)
  365. {
  366. struct iohdr iohdr;
  367. memcpy(&iohdr, data, sizeof(iohdr));
  368. if (iohdr.bus_addr_parity) printk(RTAS_ERR "I/O bus address parityn");
  369. if (iohdr.bus_data_parity) printk(RTAS_ERR "I/O bus data parityn");
  370. if (iohdr.bus_timeout) printk(RTAS_ERR "I/O bus timeout, access or othern");
  371. if (iohdr.bridge_internal) printk(RTAS_ERR "I/O bus bridge/device internaln");
  372. if (iohdr.non_pci) printk(RTAS_ERR "Signaling IOA is a PCI to non-PCI bridge (e.g. ISA)n");
  373. if (iohdr.mezzanine_addr_parity) printk(RTAS_ERR "Mezzanine/System bus address parityn");
  374. if (iohdr.mezzanine_data_parity) printk(RTAS_ERR "Mezzanine/System bus data parityn");
  375. if (iohdr.mezzanine_timeout) printk(RTAS_ERR "Mezzanine/System bus timeout, transfer or protocoln");
  376. if (iohdr.bridge_via_sysbus) printk(RTAS_ERR "Bridge is connected to system busn");
  377. if (iohdr.bridge_via_mezzanine) printk(RTAS_ERR "Bridge is connected to memory controller via mezzanine busn");
  378. if (iohdr.bridge_via_expbus) printk(RTAS_ERR "Bridge is connected to I/O expansion busn");
  379. if (iohdr.detected_by_expbus) printk(RTAS_ERR "Error on system bus detected by I/O expansion bus controllern");
  380. if (iohdr.expbus_data_parity) printk(RTAS_ERR "I/O expansion bus data errorn");
  381. if (iohdr.expbus_timeout) printk(RTAS_ERR "I/O expansion bus timeout, access or othern");
  382. if (iohdr.expbus_connection_failure) printk(RTAS_ERR "I/O expansion bus connection failuren");
  383. if (iohdr.expbus_not_operating) printk(RTAS_ERR "I/O expansion unit not in an operating state (powered off, off-line)n");
  384. printk(RTAS_ERR "IOA Signaling the error: %d:%d.%d vendor:%04x device:%04x rev:%02x slot:%dn",
  385.        iohdr.pci_sig_busno, iohdr.pci_sig_devfn >> 3, iohdr.pci_sig_devfn & 0x7,
  386.        iohdr.pci_sig_vendorid, iohdr.pci_sig_deviceid, iohdr.pci_sig_revisionid, iohdr.pci_sig_slot);
  387. printk(RTAS_ERR "IOA Sending during the error: %d:%d.%d vendor:%04x device:%04x rev:%02x slot:%dn",
  388.        iohdr.pci_send_busno, iohdr.pci_send_devfn >> 3, iohdr.pci_send_devfn & 0x7,
  389.        iohdr.pci_send_vendorid, iohdr.pci_send_deviceid, iohdr.pci_send_revisionid, iohdr.pci_send_slot);
  390. }
  391. static void printk_post_failure(int version, struct exthdr *exthdr, char *data)
  392. {
  393. struct posthdr posthdr;
  394. memcpy(&posthdr, data, sizeof(posthdr));
  395. if (posthdr.devname[0]) printk(RTAS_ERR "Failing Device: %sn", posthdr.devname);
  396. if (posthdr.firmware) printk(RTAS_ERR "Firmware Errorn");
  397. if (posthdr.config) printk(RTAS_ERR "Configuration Errorn");
  398. if (posthdr.cpu) printk(RTAS_ERR "CPU POST Errorn");
  399. if (posthdr.memory) printk(RTAS_ERR "Memory POST Errorn");
  400. if (posthdr.io) printk(RTAS_ERR "I/O Subsystem POST Errorn");
  401. if (posthdr.keyboard) printk(RTAS_ERR "Keyboard POST Errorn");
  402. if (posthdr.mouse) printk(RTAS_ERR "Mouse POST Errorn");
  403. if (posthdr.display) printk(RTAS_ERR "Display POST Errorn");
  404. if (posthdr.ipl_floppy) printk(RTAS_ERR "Floppy IPL Errorn");
  405. if (posthdr.ipl_controller) printk(RTAS_ERR "Drive Controller Error during IPLn");
  406. if (posthdr.ipl_cdrom) printk(RTAS_ERR "CDROM IPL Errorn");
  407. if (posthdr.ipl_disk) printk(RTAS_ERR "Disk IPL Errorn");
  408. if (posthdr.ipl_net) printk(RTAS_ERR "Network IPL Errorn");
  409. if (posthdr.ipl_other) printk(RTAS_ERR "Other (tape,flash) IPL Errorn");
  410. if (posthdr.firmware_selftest) printk(RTAS_ERR "Self-test error in firmware extended diagnosticsn");
  411. printk(RTAS_ERR "POST Code: %dn", posthdr.post_code);
  412. printk(RTAS_ERR "Firmware Revision Code: %dn", posthdr.firmware_rev);
  413. }
  414. static void printk_epow_warning(int version, struct exthdr *exthdr, char *data)
  415. {
  416. struct epowhdr epowhdr;
  417. memcpy(&epowhdr, data, sizeof(epowhdr));
  418. printk(RTAS_ERR "EPOW Sensor Value:  0x%08xn", epowhdr.epow_sensor_value); 
  419. if (epowhdr.sensor) {
  420. printk(RTAS_ERR "EPOW detected by a sensorn");
  421. printk(RTAS_ERR "Sensor Token:  0x%08xn", epowhdr.sensor_token); 
  422. printk(RTAS_ERR "Sensor Index:  0x%08xn", epowhdr.sensor_index); 
  423. printk(RTAS_ERR "Sensor Value:  0x%08xn", epowhdr.sensor_value); 
  424. printk(RTAS_ERR "Sensor Status: 0x%08xn", epowhdr.sensor_status);
  425. }
  426. if (epowhdr.power_fault) printk(RTAS_ERR "EPOW caused by a power faultn");
  427. if (epowhdr.fan) printk(RTAS_ERR "EPOW caused by fan failuren");
  428. if (epowhdr.temp) printk(RTAS_ERR "EPOW caused by over-temperature conditionn");
  429. if (epowhdr.redundancy) printk(RTAS_ERR "EPOW warning due to loss of redundancyn");
  430. if (epowhdr.CUoD) printk(RTAS_ERR "EPOW warning due to CUoD Entitlement Exceededn");
  431. if (epowhdr.general) printk(RTAS_ERR "EPOW general power faultn");
  432. if (epowhdr.power_loss) printk(RTAS_ERR "EPOW power fault due to loss of power sourcen");
  433. if (epowhdr.power_supply) printk(RTAS_ERR "EPOW power fault due to internal power supply failuren");
  434. if (epowhdr.power_switch) printk(RTAS_ERR "EPOW power fault due to activation of power switchn");
  435. }
  436. static void printk_pm_event(int version, struct exthdr *exthdr, char *data)
  437. {
  438. struct pm_eventhdr pm_eventhdr;
  439. memcpy(&pm_eventhdr, data, sizeof(pm_eventhdr));
  440. printk(RTAS_ERR "Event id: 0x%08xn", pm_eventhdr.event_id);
  441. }
  442. static void printk_sp_log_msg(int version, struct exthdr *exthdr, char *data)
  443. {
  444. struct sphdr sphdr;
  445. u32 eyecatcher;
  446. memcpy(&sphdr, data, sizeof(sphdr));
  447. eyecatcher = sphdr.ibm;
  448. if (strcmp((char *)&eyecatcher, "IBM") != 0)
  449. printk(RTAS_ERR "This log entry may be corrupt (IBM signature malformed)n");
  450. if (sphdr.timeout) printk(RTAS_ERR "Timeout on communication response from service processorn");
  451. if (sphdr.i2c_bus) printk(RTAS_ERR "I2C general bus errorn");
  452. if (sphdr.i2c_secondary_bus) printk(RTAS_ERR "I2C secondary bus errorn");
  453. if (sphdr.sp_memory) printk(RTAS_ERR "Internal service processor memory errorn");
  454. if (sphdr.sp_registers) printk(RTAS_ERR "Service processor error accessing special registersn");
  455. if (sphdr.sp_communication) printk(RTAS_ERR "Service processor reports unknown communcation errorn");
  456. if (sphdr.sp_firmware) printk(RTAS_ERR "Internal service processor firmware errorn");
  457. if (sphdr.sp_hardware) printk(RTAS_ERR "Other internal service processor hardware errorn");
  458. if (sphdr.vpd_eeprom) printk(RTAS_ERR "Service processor error accessing VPD EEPROMn");
  459. if (sphdr.op_panel) printk(RTAS_ERR "Service processor error accessing Operator Paneln");
  460. if (sphdr.power_controller) printk(RTAS_ERR "Service processor error accessing Power Controllern");
  461. if (sphdr.fan_sensor) printk(RTAS_ERR "Service processor error accessing Fan Sensorn");
  462. if (sphdr.thermal_sensor) printk(RTAS_ERR "Service processor error accessing Thermal Sensorn");
  463. if (sphdr.voltage_sensor) printk(RTAS_ERR "Service processor error accessing Voltage Sensorn");
  464. if (sphdr.serial_port) printk(RTAS_ERR "Service processor error accessing serial portn");
  465. if (sphdr.nvram) printk(RTAS_ERR "Service processor detected NVRAM errorn");
  466. if (sphdr.rtc) printk(RTAS_ERR "Service processor error accessing real time clockn");
  467. if (sphdr.jtag) printk(RTAS_ERR "Service processor error accessing JTAG/COPn");
  468. if (sphdr.tod_battery) printk(RTAS_ERR "Service processor or RTAS detects loss of voltage from TOD batteryn");
  469. if (sphdr.heartbeat) printk(RTAS_ERR "Loss of heartbeat from Service processorn");
  470. if (sphdr.surveillance) printk(RTAS_ERR "Service processor detected a surveillance timeoutn");
  471. if (sphdr.pcn_connection) printk(RTAS_ERR "Power Control Network general connection failuren");
  472. if (sphdr.pcn_node) printk(RTAS_ERR "Power Control Network node failuren");
  473. if (sphdr.pcn_access) printk(RTAS_ERR "Service processor error accessing Power Control Networkn");
  474. if (sphdr.sensor_token) printk(RTAS_ERR "Sensor Token 0x%08x (%d)n", sphdr.sensor_token, sphdr.sensor_token);
  475. if (sphdr.sensor_index) printk(RTAS_ERR "Sensor Index 0x%08x (%d)n", sphdr.sensor_index, sphdr.sensor_index);
  476. }
  477. static void printk_ext_raw_data(char *data)
  478. {
  479. int i;
  480. printk(RTAS_ERR "raw ext data: ");
  481. for (i = 0; i < 40; i++) {
  482. printk("%02x", data[i]);
  483. }
  484. printk("n");
  485. }
  486. static void printk_ext_log_data(int version, char *buf)
  487. {
  488. char *data = buf+12;
  489. struct exthdr exthdr;
  490. memcpy(&exthdr, buf, sizeof(exthdr)); /* copy for alignment */
  491. if (!exthdr.valid) {
  492. if (exthdr.bigendian && exthdr.power_pc)
  493. printk(RTAS_ERR "extended log data is not validn");
  494. else
  495. printk(RTAS_ERR "extended log data can not be decodedn");
  496. return;
  497. }
  498. /* Dump useful stuff in the exthdr */
  499. printk(RTAS_ERR "Status:%s%s%s%s%sn",
  500.        exthdr.unrecoverable ? " unrecoverable" : "",
  501.        exthdr.recoverable ? " recoverable" : "",
  502.        exthdr.unrecoverable_bypassed ? " bypassed" : "",
  503.        exthdr.predictive ? " predictive" : "",
  504.        exthdr.newlog ? " new" : "");
  505. printk(RTAS_ERR "Date/Time: %08x %08xn", exthdr.bcddate, exthdr.bcdtime);
  506. switch (exthdr.format_type) {
  507.     case EXTLOG_FMT_CPU:
  508. printk(RTAS_ERR "CPU Failuren");
  509. printk_cpu_failure(version, &exthdr, data);
  510. break;
  511.     case EXTLOG_FMT_MEMORY:
  512. printk(RTAS_ERR "Memory Failuren");
  513. printk_mem_failure(version, &exthdr, data);
  514. break;
  515.     case EXTLOG_FMT_IO:
  516. printk(RTAS_ERR "I/O Failuren");
  517. printk_io_failure(version, &exthdr, data);
  518. break;
  519.     case EXTLOG_FMT_POST:
  520. printk(RTAS_ERR "POST Failuren");
  521. printk_post_failure(version, &exthdr, data);
  522. break;
  523.     case EXTLOG_FMT_ENV:
  524. printk(RTAS_ERR "Environment and Power Warningn");
  525. printk_epow_warning(version, &exthdr, data);
  526. break;
  527.     case EXTLOG_FMT_POW:
  528. printk(RTAS_ERR "Power Management Eventn");
  529. printk_pm_event(version, &exthdr, data);
  530. break;
  531.     case EXTLOG_FMT_IBMDIAG:
  532. printk(RTAS_ERR "IBM Diagnostic Logn");
  533. printk_ext_raw_data(data);
  534. break;
  535.     case EXTLOG_FMT_IBMSP:
  536. printk(RTAS_ERR "IBM Service Processor Logn");
  537. printk_sp_log_msg(version, &exthdr, data);
  538. break;
  539.     default:
  540. printk(RTAS_ERR "Unknown ext format type %dn", exthdr.format_type);
  541. printk_ext_raw_data(data);
  542. break;
  543. }
  544. }
  545. #define MAX_LOG_DEBUG 10
  546. /* Print log debug data.  This appears after the location code.
  547.  * We limit the number of debug logs in case the data is somehow corrupt.
  548.  */
  549. static void printk_log_debug(char *buf)
  550. {
  551. unsigned char *p = (unsigned char *)_ALIGN((unsigned long)buf, 8);
  552. int len, n, logged;
  553. logged = 0;
  554. while ((logged < MAX_LOG_DEBUG) && (len = ((p[0] << 8) | p[1])) != 2) {
  555. /* len includes 2-byte length thus len == 2 is the end */
  556. printk("RTAS: Log Debug: ");
  557. if (len >= 4) /* next 2 bytes are an ascii code */
  558. printk("%c%c ", p[2], p[3]);
  559. for (n=4; n < len; n++)
  560. printk("%02x", p[n]);
  561. printk("n");
  562. p += len;
  563. logged++;
  564. }
  565. if (logged == 0)
  566. printk("RTAS: no log debug data presentn");
  567. }
  568. /* Yeah, the output here is ugly, but we want a CE to be
  569.  * able to grep RTAS /var/log/messages and see all the info
  570.  * collected together with obvious begin/end.
  571.  */
  572. static void printk_log_rtas(char *buf)
  573. {
  574. struct rtas_error_log *err = (struct rtas_error_log *)buf;
  575. printk(RTAS_ERR "-------- event-scan begin --------n");
  576. if (strcmp(buf+8+40, "IBM") == 0) {
  577. /* Location code follows */
  578. char *loc = buf+8+40+4;
  579. int len = strlen(loc);
  580. if (len < 64) { /* Sanity check */
  581. printk(RTAS_ERR "Location Code: %sn", loc);
  582. printk_log_debug(loc+len+1);
  583. }
  584. }
  585. printk(RTAS_ERR "%s: (%s) type: %sn",
  586.        severity_names[err->severity],
  587.        rtas_disposition_names[err->disposition],
  588.        rtas_error_type(err->type));
  589. printk(RTAS_ERR "initiator: %s  target: %sn",
  590.        entity_names[err->initiator], entity_names[err->target]);
  591. if (err->extended_log_length)
  592. printk_ext_log_data(err->version, buf+8);
  593. printk(RTAS_ERR "-------- event-scan end ----------n");
  594. }
  595. static void log_rtas(char *buf)
  596. {
  597. unsigned long offset;
  598. DEBUG("logging rtas eventn");
  599. /* Temporary -- perhaps we can do this when nobody has the log open? */
  600. printk_log_rtas(buf);
  601. spin_lock(&rtas_log_lock);
  602. offset = rtas_error_log_max *
  603. ((rtas_log_start+rtas_log_size) & LOG_NUMBER_MASK);
  604. memcpy(&rtas_log_buf[offset], buf, rtas_error_log_max);
  605. if (rtas_log_size < LOG_NUMBER)
  606. rtas_log_size += 1;
  607. else
  608. rtas_log_start += 1;
  609. spin_unlock(&rtas_log_lock);
  610. wake_up_interruptible(&rtas_log_wait);
  611. }
  612. static int enable_surveillance(void)
  613. {
  614. int error;
  615. error = rtas_call(rtas_token("set-indicator"), 3, 1, NULL, SURVEILLANCE_TOKEN,
  616. 0, SURVEILLANCE_TIMEOUT);
  617. if (error) {
  618. printk(KERN_ERR "rtasd: could not enable surveillancen");
  619. return -1;
  620. }
  621. rtas_event_scan_rate = SURVEILLANCE_SCANRATE;
  622. return 0;
  623. }
  624. static int get_eventscan_parms(void)
  625. {
  626. struct device_node *node;
  627. int *ip;
  628. node = find_path_device("/rtas");
  629. ip = (int *)get_property(node, "rtas-event-scan-rate", NULL);
  630. if (ip == NULL) {
  631. printk(KERN_ERR "rtasd: no rtas-event-scan-raten");
  632. return -1;
  633. }
  634. rtas_event_scan_rate = *ip;
  635. DEBUG("rtas-event-scan-rate %dn", rtas_event_scan_rate);
  636. ip = (int *)get_property(node, "rtas-error-log-max", NULL);
  637. if (ip == NULL) {
  638. printk(KERN_ERR "rtasd: no rtas-error-log-maxn");
  639. return -1;
  640. }
  641. rtas_error_log_max = *ip;
  642. DEBUG("rtas-error-log-max %dn", rtas_error_log_max);
  643. if (rtas_error_log_max > RTAS_ERROR_LOG_MAX) {
  644. printk(KERN_ERR "rtasd: truncated error log from %d to %d bytesn", rtas_error_log_max, RTAS_ERROR_LOG_MAX);
  645. rtas_error_log_max = RTAS_ERROR_LOG_MAX;
  646. }
  647. return 0;
  648. }
  649. extern long sys_sched_get_priority_max(int policy);
  650. static int rtasd(void *unused)
  651. {
  652. int cpu = 0;
  653. int error;
  654. int first_pass = 1;
  655. int event_scan = rtas_token("event-scan");
  656. if (event_scan == RTAS_UNKNOWN_SERVICE || get_eventscan_parms() == -1)
  657. goto error;
  658. rtas_log_buf = vmalloc(rtas_error_log_max*LOG_NUMBER);
  659. if (!rtas_log_buf) {
  660. printk(KERN_ERR "rtasd: no memoryn");
  661. goto error;
  662. }
  663. DEBUG("will sleep for %d jiffiesn", (HZ*60/rtas_event_scan_rate) / 2);
  664. daemonize();
  665. sigfillset(&current->blocked);
  666. sprintf(current->comm, "rtasd");
  667. /* Rusty unreal time task */
  668. current->policy = SCHED_FIFO;
  669. current->nice = sys_sched_get_priority_max(SCHED_FIFO) + 1;
  670. cpu = 0;
  671. current->cpus_allowed = 1UL << cpu_logical_map(cpu);
  672. schedule();
  673. while(1) {
  674. do {
  675. memset(logdata, 0, rtas_error_log_max);
  676. error = rtas_call(event_scan, 4, 1, NULL,
  677. EVENT_SCAN_ALL_EVENTS, 0,
  678. __pa(logdata), rtas_error_log_max);
  679. if (error == -1) {
  680. printk(KERN_ERR "event-scan failedn");
  681. break;
  682. }
  683. if (error == 0)
  684. log_rtas(logdata);
  685. } while(error == 0);
  686. DEBUG("watchdog scheduled on cpu %dn", smp_processor_id());
  687. cpu++;
  688. if (cpu >= smp_num_cpus) {
  689. if (first_pass && surveillance_requested) {
  690. DEBUG("enabling surveillancen");
  691. if (enable_surveillance())
  692. goto error_vfree;
  693. DEBUG("surveillance enabledn");
  694. }
  695. first_pass = 0;
  696. cpu = 0;
  697. }
  698. current->cpus_allowed = 1UL << cpu_logical_map(cpu);
  699. /* Check all cpus for pending events before sleeping*/
  700. if (first_pass) {
  701. schedule();
  702. } else {
  703. set_current_state(TASK_INTERRUPTIBLE);
  704. schedule_timeout((HZ*60/rtas_event_scan_rate) / 2);
  705. }
  706. }
  707. error_vfree:
  708. vfree(rtas_log_buf);
  709. error:
  710. /* Should delete proc entries */
  711. return -EINVAL;
  712. }
  713. static void __init rtas_init(void)
  714. {
  715. struct proc_dir_entry *rtas_dir, *entry;
  716. rtas_dir = proc_mkdir("rtas", 0);
  717. if (!rtas_dir) {
  718. printk(KERN_ERR "Failed to create rtas proc directoryn");
  719. } else {
  720. entry = create_proc_entry("error_log", S_IRUSR, rtas_dir);
  721. if (entry)
  722. entry->proc_fops = &proc_rtas_log_operations;
  723. else
  724. printk(KERN_ERR "Failed to create rtas/error_log proc entryn");
  725. }
  726. if (kernel_thread(rtasd, 0, CLONE_FS) < 0)
  727. printk(KERN_ERR "Failed to start RTAS daemonn");
  728. printk(KERN_ERR "RTAS daemon startedn");
  729. }
  730. static int __init surveillance_setup(char *str)
  731. {
  732. int i;
  733. if (get_option(&str,&i)) {
  734. if (i == 1)
  735. surveillance_requested = 1;
  736. }
  737. return 1;
  738. }
  739. __initcall(rtas_init);
  740. __setup("surveillance=", surveillance_setup);