edac_pci_sysfs.c 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763
  1. /*
  2. * (C) 2005, 2006 Linux Networx (http://lnxi.com)
  3. * This file may be distributed under the terms of the
  4. * GNU General Public License.
  5. *
  6. * Written Doug Thompson <norsk5@xmission.com>
  7. *
  8. */
  9. #include <linux/module.h>
  10. #include <linux/sysdev.h>
  11. #include <linux/ctype.h>
  12. #include "edac_core.h"
  13. #include "edac_module.h"
  14. /* Turn off this whole feature if PCI is not configured */
  15. #ifdef CONFIG_PCI
  16. #define EDAC_PCI_SYMLINK "device"
  17. /* data variables exported via sysfs */
  18. static int check_pci_errors; /* default NO check PCI parity */
  19. static int edac_pci_panic_on_pe; /* default NO panic on PCI Parity */
  20. static int edac_pci_log_pe = 1; /* log PCI parity errors */
  21. static int edac_pci_log_npe = 1; /* log PCI non-parity error errors */
  22. static int edac_pci_poll_msec = 1000; /* one second workq period */
  23. static atomic_t pci_parity_count = ATOMIC_INIT(0);
  24. static atomic_t pci_nonparity_count = ATOMIC_INIT(0);
  25. static struct kobject edac_pci_top_main_kobj;
  26. static atomic_t edac_pci_sysfs_refcount = ATOMIC_INIT(0);
  27. /* getter functions for the data variables */
  28. int edac_pci_get_check_errors(void)
  29. {
  30. return check_pci_errors;
  31. }
  32. int edac_pci_get_log_pe(void)
  33. {
  34. return edac_pci_log_pe;
  35. }
  36. int edac_pci_get_log_npe(void)
  37. {
  38. return edac_pci_log_npe;
  39. }
  40. int edac_pci_get_panic_on_pe(void)
  41. {
  42. return edac_pci_panic_on_pe;
  43. }
  44. int edac_pci_get_poll_msec(void)
  45. {
  46. return edac_pci_poll_msec;
  47. }
  48. /**************************** EDAC PCI sysfs instance *******************/
  49. static ssize_t instance_pe_count_show(struct edac_pci_ctl_info *pci, char *data)
  50. {
  51. return sprintf(data, "%u\n", atomic_read(&pci->counters.pe_count));
  52. }
  53. static ssize_t instance_npe_count_show(struct edac_pci_ctl_info *pci,
  54. char *data)
  55. {
  56. return sprintf(data, "%u\n", atomic_read(&pci->counters.npe_count));
  57. }
  58. #define to_instance(k) container_of(k, struct edac_pci_ctl_info, kobj)
  59. #define to_instance_attr(a) container_of(a, struct instance_attribute, attr)
  60. /* DEVICE instance kobject release() function */
  61. static void edac_pci_instance_release(struct kobject *kobj)
  62. {
  63. struct edac_pci_ctl_info *pci;
  64. debugf0("%s()\n", __func__);
  65. /* Form pointer to containing struct, the pci control struct */
  66. pci = to_instance(kobj);
  67. /* decrement reference count on top main kobj */
  68. kobject_put(&edac_pci_top_main_kobj);
  69. kfree(pci); /* Free the control struct */
  70. }
  71. /* instance specific attribute structure */
  72. struct instance_attribute {
  73. struct attribute attr;
  74. ssize_t(*show) (struct edac_pci_ctl_info *, char *);
  75. ssize_t(*store) (struct edac_pci_ctl_info *, const char *, size_t);
  76. };
  77. /* Function to 'show' fields from the edac_pci 'instance' structure */
  78. static ssize_t edac_pci_instance_show(struct kobject *kobj,
  79. struct attribute *attr, char *buffer)
  80. {
  81. struct edac_pci_ctl_info *pci = to_instance(kobj);
  82. struct instance_attribute *instance_attr = to_instance_attr(attr);
  83. if (instance_attr->show)
  84. return instance_attr->show(pci, buffer);
  85. return -EIO;
  86. }
  87. /* Function to 'store' fields into the edac_pci 'instance' structure */
  88. static ssize_t edac_pci_instance_store(struct kobject *kobj,
  89. struct attribute *attr,
  90. const char *buffer, size_t count)
  91. {
  92. struct edac_pci_ctl_info *pci = to_instance(kobj);
  93. struct instance_attribute *instance_attr = to_instance_attr(attr);
  94. if (instance_attr->store)
  95. return instance_attr->store(pci, buffer, count);
  96. return -EIO;
  97. }
  98. /* fs_ops table */
  99. static struct sysfs_ops pci_instance_ops = {
  100. .show = edac_pci_instance_show,
  101. .store = edac_pci_instance_store
  102. };
  103. #define INSTANCE_ATTR(_name, _mode, _show, _store) \
  104. static struct instance_attribute attr_instance_##_name = { \
  105. .attr = {.name = __stringify(_name), .mode = _mode }, \
  106. .show = _show, \
  107. .store = _store, \
  108. };
  109. INSTANCE_ATTR(pe_count, S_IRUGO, instance_pe_count_show, NULL);
  110. INSTANCE_ATTR(npe_count, S_IRUGO, instance_npe_count_show, NULL);
  111. /* pci instance attributes */
  112. static struct instance_attribute *pci_instance_attr[] = {
  113. &attr_instance_pe_count,
  114. &attr_instance_npe_count,
  115. NULL
  116. };
  117. /* the ktype for a pci instance */
  118. static struct kobj_type ktype_pci_instance = {
  119. .release = edac_pci_instance_release,
  120. .sysfs_ops = &pci_instance_ops,
  121. .default_attrs = (struct attribute **)pci_instance_attr,
  122. };
  123. /*
  124. * edac_pci_create_instance_kobj
  125. *
  126. * construct one EDAC PCI instance's kobject for use
  127. */
  128. static int edac_pci_create_instance_kobj(struct edac_pci_ctl_info *pci, int idx)
  129. {
  130. struct kobject *main_kobj;
  131. int err;
  132. debugf0("%s()\n", __func__);
  133. /* Set the parent and the instance's ktype */
  134. pci->kobj.parent = &edac_pci_top_main_kobj;
  135. pci->kobj.ktype = &ktype_pci_instance;
  136. err = kobject_set_name(&pci->kobj, "pci%d", idx);
  137. if (err)
  138. return err;
  139. /* First bump the ref count on the top main kobj, which will
  140. * track the number of PCI instances we have, and thus nest
  141. * properly on keeping the module loaded
  142. */
  143. main_kobj = kobject_get(&edac_pci_top_main_kobj);
  144. if (!main_kobj) {
  145. err = -ENODEV;
  146. goto error_out;
  147. }
  148. /* And now register this new kobject under the main kobj */
  149. err = kobject_register(&pci->kobj);
  150. if (err != 0) {
  151. debugf2("%s() failed to register instance pci%d\n",
  152. __func__, idx);
  153. kobject_put(&edac_pci_top_main_kobj);
  154. goto error_out;
  155. }
  156. debugf1("%s() Register instance 'pci%d' kobject\n", __func__, idx);
  157. return 0;
  158. /* Error unwind statck */
  159. error_out:
  160. return err;
  161. }
  162. /*
  163. * edac_pci_unregister_sysfs_instance_kobj
  164. *
  165. * unregister the kobj for the EDAC PCI instance
  166. */
  167. void edac_pci_unregister_sysfs_instance_kobj(struct edac_pci_ctl_info *pci)
  168. {
  169. debugf0("%s()\n", __func__);
  170. /* Unregister the instance kobject and allow its release
  171. * function release the main reference count and then
  172. * kfree the memory
  173. */
  174. kobject_unregister(&pci->kobj);
  175. }
  176. /***************************** EDAC PCI sysfs root **********************/
  177. #define to_edacpci(k) container_of(k, struct edac_pci_ctl_info, kobj)
  178. #define to_edacpci_attr(a) container_of(a, struct edac_pci_attr, attr)
  179. /* simple show/store functions for attributes */
  180. static ssize_t edac_pci_int_show(void *ptr, char *buffer)
  181. {
  182. int *value = ptr;
  183. return sprintf(buffer, "%d\n", *value);
  184. }
  185. static ssize_t edac_pci_int_store(void *ptr, const char *buffer, size_t count)
  186. {
  187. int *value = ptr;
  188. if (isdigit(*buffer))
  189. *value = simple_strtoul(buffer, NULL, 0);
  190. return count;
  191. }
  192. struct edac_pci_dev_attribute {
  193. struct attribute attr;
  194. void *value;
  195. ssize_t(*show) (void *, char *);
  196. ssize_t(*store) (void *, const char *, size_t);
  197. };
  198. /* Set of show/store abstract level functions for PCI Parity object */
  199. static ssize_t edac_pci_dev_show(struct kobject *kobj, struct attribute *attr,
  200. char *buffer)
  201. {
  202. struct edac_pci_dev_attribute *edac_pci_dev;
  203. edac_pci_dev = (struct edac_pci_dev_attribute *)attr;
  204. if (edac_pci_dev->show)
  205. return edac_pci_dev->show(edac_pci_dev->value, buffer);
  206. return -EIO;
  207. }
  208. static ssize_t edac_pci_dev_store(struct kobject *kobj,
  209. struct attribute *attr, const char *buffer,
  210. size_t count)
  211. {
  212. struct edac_pci_dev_attribute *edac_pci_dev;
  213. edac_pci_dev = (struct edac_pci_dev_attribute *)attr;
  214. if (edac_pci_dev->show)
  215. return edac_pci_dev->store(edac_pci_dev->value, buffer, count);
  216. return -EIO;
  217. }
  218. static struct sysfs_ops edac_pci_sysfs_ops = {
  219. .show = edac_pci_dev_show,
  220. .store = edac_pci_dev_store
  221. };
  222. #define EDAC_PCI_ATTR(_name,_mode,_show,_store) \
  223. static struct edac_pci_dev_attribute edac_pci_attr_##_name = { \
  224. .attr = {.name = __stringify(_name), .mode = _mode }, \
  225. .value = &_name, \
  226. .show = _show, \
  227. .store = _store, \
  228. };
  229. #define EDAC_PCI_STRING_ATTR(_name,_data,_mode,_show,_store) \
  230. static struct edac_pci_dev_attribute edac_pci_attr_##_name = { \
  231. .attr = {.name = __stringify(_name), .mode = _mode }, \
  232. .value = _data, \
  233. .show = _show, \
  234. .store = _store, \
  235. };
  236. /* PCI Parity control files */
  237. EDAC_PCI_ATTR(check_pci_errors, S_IRUGO | S_IWUSR, edac_pci_int_show,
  238. edac_pci_int_store);
  239. EDAC_PCI_ATTR(edac_pci_log_pe, S_IRUGO | S_IWUSR, edac_pci_int_show,
  240. edac_pci_int_store);
  241. EDAC_PCI_ATTR(edac_pci_log_npe, S_IRUGO | S_IWUSR, edac_pci_int_show,
  242. edac_pci_int_store);
  243. EDAC_PCI_ATTR(edac_pci_panic_on_pe, S_IRUGO | S_IWUSR, edac_pci_int_show,
  244. edac_pci_int_store);
  245. EDAC_PCI_ATTR(pci_parity_count, S_IRUGO, edac_pci_int_show, NULL);
  246. EDAC_PCI_ATTR(pci_nonparity_count, S_IRUGO, edac_pci_int_show, NULL);
  247. /* Base Attributes of the memory ECC object */
  248. static struct edac_pci_dev_attribute *edac_pci_attr[] = {
  249. &edac_pci_attr_check_pci_errors,
  250. &edac_pci_attr_edac_pci_log_pe,
  251. &edac_pci_attr_edac_pci_log_npe,
  252. &edac_pci_attr_edac_pci_panic_on_pe,
  253. &edac_pci_attr_pci_parity_count,
  254. &edac_pci_attr_pci_nonparity_count,
  255. NULL,
  256. };
  257. /*
  258. * edac_pci_release_main_kobj
  259. *
  260. * This release function is called when the reference count to the
  261. * passed kobj goes to zero.
  262. *
  263. * This kobj is the 'main' kobject that EDAC PCI instances
  264. * link to, and thus provide for proper nesting counts
  265. */
  266. static void edac_pci_release_main_kobj(struct kobject *kobj)
  267. {
  268. debugf0("%s() here to module_put(THIS_MODULE)\n", __func__);
  269. /* last reference to top EDAC PCI kobject has been removed,
  270. * NOW release our ref count on the core module
  271. */
  272. module_put(THIS_MODULE);
  273. }
  274. /* ktype struct for the EDAC PCI main kobj */
  275. static struct kobj_type ktype_edac_pci_main_kobj = {
  276. .release = edac_pci_release_main_kobj,
  277. .sysfs_ops = &edac_pci_sysfs_ops,
  278. .default_attrs = (struct attribute **)edac_pci_attr,
  279. };
  280. /**
  281. * edac_pci_main_kobj_setup()
  282. *
  283. * setup the sysfs for EDAC PCI attributes
  284. * assumes edac_class has already been initialized
  285. */
  286. int edac_pci_main_kobj_setup(void)
  287. {
  288. int err;
  289. struct sysdev_class *edac_class;
  290. debugf0("%s()\n", __func__);
  291. /* check and count if we have already created the main kobject */
  292. if (atomic_inc_return(&edac_pci_sysfs_refcount) != 1)
  293. return 0;
  294. /* First time, so create the main kobject and its
  295. * controls and atributes
  296. */
  297. edac_class = edac_get_edac_class();
  298. if (edac_class == NULL) {
  299. debugf1("%s() no edac_class\n", __func__);
  300. err = -ENODEV;
  301. goto decrement_count_fail;
  302. }
  303. /* Need the kobject hook ups, and name setting */
  304. edac_pci_top_main_kobj.ktype = &ktype_edac_pci_main_kobj;
  305. edac_pci_top_main_kobj.parent = &edac_class->kset.kobj;
  306. err = kobject_set_name(&edac_pci_top_main_kobj, "pci");
  307. if (err)
  308. goto decrement_count_fail;
  309. /* Bump the reference count on this module to ensure the
  310. * modules isn't unloaded until we deconstruct the top
  311. * level main kobj for EDAC PCI
  312. */
  313. if (!try_module_get(THIS_MODULE)) {
  314. debugf1("%s() try_module_get() failed\n", __func__);
  315. err = -ENODEV;
  316. goto decrement_count_fail;
  317. }
  318. /* Instanstiate the pci object */
  319. /* FIXME: maybe new sysdev_create_subdir() */
  320. err = kobject_register(&edac_pci_top_main_kobj);
  321. if (err) {
  322. debugf1("Failed to register '.../edac/pci'\n");
  323. goto kobject_register_fail;
  324. }
  325. /* At this point, to 'release' the top level kobject
  326. * for EDAC PCI, then edac_pci_main_kobj_teardown()
  327. * must be used, for resources to be cleaned up properly
  328. */
  329. debugf1("Registered '.../edac/pci' kobject\n");
  330. return 0;
  331. /* Error unwind statck */
  332. kobject_register_fail:
  333. module_put(THIS_MODULE);
  334. decrement_count_fail:
  335. /* if are on this error exit, nothing to tear down */
  336. atomic_dec(&edac_pci_sysfs_refcount);
  337. return err;
  338. }
  339. /*
  340. * edac_pci_main_kobj_teardown()
  341. *
  342. * if no longer linked (needed) remove the top level EDAC PCI
  343. * kobject with its controls and attributes
  344. */
  345. static void edac_pci_main_kobj_teardown(void)
  346. {
  347. debugf0("%s()\n", __func__);
  348. /* Decrement the count and only if no more controller instances
  349. * are connected perform the unregisteration of the top level
  350. * main kobj
  351. */
  352. if (atomic_dec_return(&edac_pci_sysfs_refcount) == 0) {
  353. debugf0("%s() called kobject_unregister on main kobj\n",
  354. __func__);
  355. kobject_unregister(&edac_pci_top_main_kobj);
  356. }
  357. }
  358. /*
  359. *
  360. * edac_pci_create_sysfs
  361. *
  362. * Create the controls/attributes for the specified EDAC PCI device
  363. */
  364. int edac_pci_create_sysfs(struct edac_pci_ctl_info *pci)
  365. {
  366. int err;
  367. struct kobject *edac_kobj = &pci->kobj;
  368. debugf0("%s() idx=%d\n", __func__, pci->pci_idx);
  369. /* create the top main EDAC PCI kobject, IF needed */
  370. err = edac_pci_main_kobj_setup();
  371. if (err)
  372. return err;
  373. /* Create this instance's kobject under the MAIN kobject */
  374. err = edac_pci_create_instance_kobj(pci, pci->pci_idx);
  375. if (err)
  376. goto unregister_cleanup;
  377. err = sysfs_create_link(edac_kobj, &pci->dev->kobj, EDAC_PCI_SYMLINK);
  378. if (err) {
  379. debugf0("%s() sysfs_create_link() returned err= %d\n",
  380. __func__, err);
  381. goto symlink_fail;
  382. }
  383. return 0;
  384. /* Error unwind stack */
  385. symlink_fail:
  386. edac_pci_unregister_sysfs_instance_kobj(pci);
  387. unregister_cleanup:
  388. edac_pci_main_kobj_teardown();
  389. return err;
  390. }
  391. /*
  392. * edac_pci_remove_sysfs
  393. *
  394. * remove the controls and attributes for this EDAC PCI device
  395. */
  396. void edac_pci_remove_sysfs(struct edac_pci_ctl_info *pci)
  397. {
  398. debugf0("%s() index=%d\n", __func__, pci->pci_idx);
  399. /* Remove the symlink */
  400. sysfs_remove_link(&pci->kobj, EDAC_PCI_SYMLINK);
  401. /* remove this PCI instance's sysfs entries */
  402. edac_pci_unregister_sysfs_instance_kobj(pci);
  403. /* Call the main unregister function, which will determine
  404. * if this 'pci' is the last instance.
  405. * If it is, the main kobject will be unregistered as a result
  406. */
  407. debugf0("%s() calling edac_pci_main_kobj_teardown()\n", __func__);
  408. edac_pci_main_kobj_teardown();
  409. }
  410. /************************ PCI error handling *************************/
  411. static u16 get_pci_parity_status(struct pci_dev *dev, int secondary)
  412. {
  413. int where;
  414. u16 status;
  415. where = secondary ? PCI_SEC_STATUS : PCI_STATUS;
  416. pci_read_config_word(dev, where, &status);
  417. /* If we get back 0xFFFF then we must suspect that the card has been
  418. * pulled but the Linux PCI layer has not yet finished cleaning up.
  419. * We don't want to report on such devices
  420. */
  421. if (status == 0xFFFF) {
  422. u32 sanity;
  423. pci_read_config_dword(dev, 0, &sanity);
  424. if (sanity == 0xFFFFFFFF)
  425. return 0;
  426. }
  427. status &= PCI_STATUS_DETECTED_PARITY | PCI_STATUS_SIG_SYSTEM_ERROR |
  428. PCI_STATUS_PARITY;
  429. if (status)
  430. /* reset only the bits we are interested in */
  431. pci_write_config_word(dev, where, status);
  432. return status;
  433. }
  434. /* Clear any PCI parity errors logged by this device. */
  435. static void edac_pci_dev_parity_clear(struct pci_dev *dev)
  436. {
  437. u8 header_type;
  438. debugf0("%s()\n", __func__);
  439. get_pci_parity_status(dev, 0);
  440. /* read the device TYPE, looking for bridges */
  441. pci_read_config_byte(dev, PCI_HEADER_TYPE, &header_type);
  442. if ((header_type & 0x7F) == PCI_HEADER_TYPE_BRIDGE)
  443. get_pci_parity_status(dev, 1);
  444. }
  445. /*
  446. * PCI Parity polling
  447. *
  448. * Fucntion to retrieve the current parity status
  449. * and decode it
  450. *
  451. */
  452. static void edac_pci_dev_parity_test(struct pci_dev *dev)
  453. {
  454. unsigned long flags;
  455. u16 status;
  456. u8 header_type;
  457. /* stop any interrupts until we can acquire the status */
  458. local_irq_save(flags);
  459. /* read the STATUS register on this device */
  460. status = get_pci_parity_status(dev, 0);
  461. /* read the device TYPE, looking for bridges */
  462. pci_read_config_byte(dev, PCI_HEADER_TYPE, &header_type);
  463. local_irq_restore(flags);
  464. debugf4("PCI STATUS= 0x%04x %s\n", status, dev->dev.bus_id);
  465. /* check the status reg for errors */
  466. if (status) {
  467. if (status & (PCI_STATUS_SIG_SYSTEM_ERROR)) {
  468. edac_printk(KERN_CRIT, EDAC_PCI,
  469. "Signaled System Error on %s\n",
  470. pci_name(dev));
  471. atomic_inc(&pci_nonparity_count);
  472. }
  473. if (status & (PCI_STATUS_PARITY)) {
  474. edac_printk(KERN_CRIT, EDAC_PCI,
  475. "Master Data Parity Error on %s\n",
  476. pci_name(dev));
  477. atomic_inc(&pci_parity_count);
  478. }
  479. if (status & (PCI_STATUS_DETECTED_PARITY)) {
  480. edac_printk(KERN_CRIT, EDAC_PCI,
  481. "Detected Parity Error on %s\n",
  482. pci_name(dev));
  483. atomic_inc(&pci_parity_count);
  484. }
  485. }
  486. debugf4("PCI HEADER TYPE= 0x%02x %s\n", header_type, dev->dev.bus_id);
  487. if ((header_type & 0x7F) == PCI_HEADER_TYPE_BRIDGE) {
  488. /* On bridges, need to examine secondary status register */
  489. status = get_pci_parity_status(dev, 1);
  490. debugf4("PCI SEC_STATUS= 0x%04x %s\n", status, dev->dev.bus_id);
  491. /* check the secondary status reg for errors */
  492. if (status) {
  493. if (status & (PCI_STATUS_SIG_SYSTEM_ERROR)) {
  494. edac_printk(KERN_CRIT, EDAC_PCI, "Bridge "
  495. "Signaled System Error on %s\n",
  496. pci_name(dev));
  497. atomic_inc(&pci_nonparity_count);
  498. }
  499. if (status & (PCI_STATUS_PARITY)) {
  500. edac_printk(KERN_CRIT, EDAC_PCI, "Bridge "
  501. "Master Data Parity Error on "
  502. "%s\n", pci_name(dev));
  503. atomic_inc(&pci_parity_count);
  504. }
  505. if (status & (PCI_STATUS_DETECTED_PARITY)) {
  506. edac_printk(KERN_CRIT, EDAC_PCI, "Bridge "
  507. "Detected Parity Error on %s\n",
  508. pci_name(dev));
  509. atomic_inc(&pci_parity_count);
  510. }
  511. }
  512. }
  513. }
  514. /* reduce some complexity in definition of the iterator */
  515. typedef void (*pci_parity_check_fn_t) (struct pci_dev *dev);
  516. /*
  517. * pci_dev parity list iterator
  518. * Scan the PCI device list for one pass, looking for SERRORs
  519. * Master Parity ERRORS or Parity ERRORs on primary or secondary devices
  520. */
  521. static inline void edac_pci_dev_parity_iterator(pci_parity_check_fn_t fn)
  522. {
  523. struct pci_dev *dev = NULL;
  524. /* request for kernel access to the next PCI device, if any,
  525. * and while we are looking at it have its reference count
  526. * bumped until we are done with it
  527. */
  528. while ((dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) {
  529. fn(dev);
  530. }
  531. }
  532. /*
  533. * edac_pci_do_parity_check
  534. *
  535. * performs the actual PCI parity check operation
  536. */
  537. void edac_pci_do_parity_check(void)
  538. {
  539. int before_count;
  540. debugf3("%s()\n", __func__);
  541. /* if policy has PCI check off, leave now */
  542. if (!check_pci_errors)
  543. return;
  544. before_count = atomic_read(&pci_parity_count);
  545. /* scan all PCI devices looking for a Parity Error on devices and
  546. * bridges.
  547. * The iterator calls pci_get_device() which might sleep, thus
  548. * we cannot disable interrupts in this scan.
  549. */
  550. edac_pci_dev_parity_iterator(edac_pci_dev_parity_test);
  551. /* Only if operator has selected panic on PCI Error */
  552. if (edac_pci_get_panic_on_pe()) {
  553. /* If the count is different 'after' from 'before' */
  554. if (before_count != atomic_read(&pci_parity_count))
  555. panic("EDAC: PCI Parity Error");
  556. }
  557. }
  558. /*
  559. * edac_pci_clear_parity_errors
  560. *
  561. * function to perform an iteration over the PCI devices
  562. * and clearn their current status
  563. */
  564. void edac_pci_clear_parity_errors(void)
  565. {
  566. /* Clear any PCI bus parity errors that devices initially have logged
  567. * in their registers.
  568. */
  569. edac_pci_dev_parity_iterator(edac_pci_dev_parity_clear);
  570. }
  571. /*
  572. * edac_pci_handle_pe
  573. *
  574. * Called to handle a PARITY ERROR event
  575. */
  576. void edac_pci_handle_pe(struct edac_pci_ctl_info *pci, const char *msg)
  577. {
  578. /* global PE counter incremented by edac_pci_do_parity_check() */
  579. atomic_inc(&pci->counters.pe_count);
  580. if (edac_pci_get_log_pe())
  581. edac_pci_printk(pci, KERN_WARNING,
  582. "Parity Error ctl: %s %d: %s\n",
  583. pci->ctl_name, pci->pci_idx, msg);
  584. /*
  585. * poke all PCI devices and see which one is the troublemaker
  586. * panic() is called if set
  587. */
  588. edac_pci_do_parity_check();
  589. }
  590. EXPORT_SYMBOL_GPL(edac_pci_handle_pe);
  591. /*
  592. * edac_pci_handle_npe
  593. *
  594. * Called to handle a NON-PARITY ERROR event
  595. */
  596. void edac_pci_handle_npe(struct edac_pci_ctl_info *pci, const char *msg)
  597. {
  598. /* global NPE counter incremented by edac_pci_do_parity_check() */
  599. atomic_inc(&pci->counters.npe_count);
  600. if (edac_pci_get_log_npe())
  601. edac_pci_printk(pci, KERN_WARNING,
  602. "Non-Parity Error ctl: %s %d: %s\n",
  603. pci->ctl_name, pci->pci_idx, msg);
  604. /*
  605. * poke all PCI devices and see which one is the troublemaker
  606. * panic() is called if set
  607. */
  608. edac_pci_do_parity_check();
  609. }
  610. EXPORT_SYMBOL_GPL(edac_pci_handle_npe);
  611. /*
  612. * Define the PCI parameter to the module
  613. */
  614. module_param(check_pci_errors, int, 0644);
  615. MODULE_PARM_DESC(check_pci_errors,
  616. "Check for PCI bus parity errors: 0=off 1=on");
  617. module_param(edac_pci_panic_on_pe, int, 0644);
  618. MODULE_PARM_DESC(edac_pci_panic_on_pe,
  619. "Panic on PCI Bus Parity error: 0=off 1=on");
  620. #endif /* CONFIG_PCI */