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.
 
   6  * Written Doug Thompson <norsk5@xmission.com>
 
   9 #include <linux/module.h>
 
  10 #include <linux/sysdev.h>
 
  11 #include <linux/ctype.h>
 
  13 #include "edac_core.h"
 
  14 #include "edac_module.h"
 
  16 /* Turn off this whole feature if PCI is not configured */
 
  19 #define EDAC_PCI_SYMLINK        "device"
 
  21 /* data variables exported via sysfs */
 
  22 static int check_pci_errors;            /* default NO check PCI parity */
 
  23 static int edac_pci_panic_on_pe;        /* default NO panic on PCI Parity */
 
  24 static int edac_pci_log_pe = 1;         /* log PCI parity errors */
 
  25 static int edac_pci_log_npe = 1;        /* log PCI non-parity error errors */
 
  26 static int edac_pci_poll_msec = 1000;   /* one second workq period */
 
  28 static atomic_t pci_parity_count = ATOMIC_INIT(0);
 
  29 static atomic_t pci_nonparity_count = ATOMIC_INIT(0);
 
  31 static struct kobject edac_pci_top_main_kobj;
 
  32 static atomic_t edac_pci_sysfs_refcount = ATOMIC_INIT(0);
 
  34 /* getter functions for the data variables */
 
  35 int edac_pci_get_check_errors(void)
 
  37         return check_pci_errors;
 
  40 int edac_pci_get_log_pe(void)
 
  42         return edac_pci_log_pe;
 
  45 int edac_pci_get_log_npe(void)
 
  47         return edac_pci_log_npe;
 
  50 int edac_pci_get_panic_on_pe(void)
 
  52         return edac_pci_panic_on_pe;
 
  55 int edac_pci_get_poll_msec(void)
 
  57         return edac_pci_poll_msec;
 
  60 /**************************** EDAC PCI sysfs instance *******************/
 
  61 static ssize_t instance_pe_count_show(struct edac_pci_ctl_info *pci, char *data)
 
  63         return sprintf(data, "%u\n", atomic_read(&pci->counters.pe_count));
 
  66 static ssize_t instance_npe_count_show(struct edac_pci_ctl_info *pci,
 
  69         return sprintf(data, "%u\n", atomic_read(&pci->counters.npe_count));
 
  72 #define to_instance(k) container_of(k, struct edac_pci_ctl_info, kobj)
 
  73 #define to_instance_attr(a) container_of(a, struct instance_attribute, attr)
 
  75 /* DEVICE instance kobject release() function */
 
  76 static void edac_pci_instance_release(struct kobject *kobj)
 
  78         struct edac_pci_ctl_info *pci;
 
  80         debugf0("%s()\n", __func__);
 
  82         /* Form pointer to containing struct, the pci control struct */
 
  83         pci = to_instance(kobj);
 
  85         /* decrement reference count on top main kobj */
 
  86         kobject_put(&edac_pci_top_main_kobj);
 
  88         kfree(pci);     /* Free the control struct */
 
  91 /* instance specific attribute structure */
 
  92 struct instance_attribute {
 
  93         struct attribute attr;
 
  94         ssize_t(*show) (struct edac_pci_ctl_info *, char *);
 
  95         ssize_t(*store) (struct edac_pci_ctl_info *, const char *, size_t);
 
  98 /* Function to 'show' fields from the edac_pci 'instance' structure */
 
  99 static ssize_t edac_pci_instance_show(struct kobject *kobj,
 
 100                                 struct attribute *attr, char *buffer)
 
 102         struct edac_pci_ctl_info *pci = to_instance(kobj);
 
 103         struct instance_attribute *instance_attr = to_instance_attr(attr);
 
 105         if (instance_attr->show)
 
 106                 return instance_attr->show(pci, buffer);
 
 110 /* Function to 'store' fields into the edac_pci 'instance' structure */
 
 111 static ssize_t edac_pci_instance_store(struct kobject *kobj,
 
 112                                 struct attribute *attr,
 
 113                                 const char *buffer, size_t count)
 
 115         struct edac_pci_ctl_info *pci = to_instance(kobj);
 
 116         struct instance_attribute *instance_attr = to_instance_attr(attr);
 
 118         if (instance_attr->store)
 
 119                 return instance_attr->store(pci, buffer, count);
 
 124 static struct sysfs_ops pci_instance_ops = {
 
 125         .show = edac_pci_instance_show,
 
 126         .store = edac_pci_instance_store
 
 129 #define INSTANCE_ATTR(_name, _mode, _show, _store)      \
 
 130 static struct instance_attribute attr_instance_##_name = {      \
 
 131         .attr   = {.name = __stringify(_name), .mode = _mode }, \
 
 136 INSTANCE_ATTR(pe_count, S_IRUGO, instance_pe_count_show, NULL);
 
 137 INSTANCE_ATTR(npe_count, S_IRUGO, instance_npe_count_show, NULL);
 
 139 /* pci instance attributes */
 
 140 static struct instance_attribute *pci_instance_attr[] = {
 
 141         &attr_instance_pe_count,
 
 142         &attr_instance_npe_count,
 
 146 /* the ktype for a pci instance */
 
 147 static struct kobj_type ktype_pci_instance = {
 
 148         .release = edac_pci_instance_release,
 
 149         .sysfs_ops = &pci_instance_ops,
 
 150         .default_attrs = (struct attribute **)pci_instance_attr,
 
 154  * edac_pci_create_instance_kobj
 
 156  *      construct one EDAC PCI instance's kobject for use
 
 158 static int edac_pci_create_instance_kobj(struct edac_pci_ctl_info *pci, int idx)
 
 160         struct kobject *main_kobj;
 
 163         debugf0("%s()\n", __func__);
 
 165         /* Set the parent and the instance's ktype */
 
 166         pci->kobj.parent = &edac_pci_top_main_kobj;
 
 167         pci->kobj.ktype = &ktype_pci_instance;
 
 169         err = kobject_set_name(&pci->kobj, "pci%d", idx);
 
 173         /* First bump the ref count on the top main kobj, which will
 
 174          * track the number of PCI instances we have, and thus nest
 
 175          * properly on keeping the module loaded
 
 177         main_kobj = kobject_get(&edac_pci_top_main_kobj);
 
 183         /* And now register this new kobject under the main kobj */
 
 184         err = kobject_register(&pci->kobj);
 
 186                 debugf2("%s() failed to register instance pci%d\n",
 
 188                 kobject_put(&edac_pci_top_main_kobj);
 
 192         debugf1("%s() Register instance 'pci%d' kobject\n", __func__, idx);
 
 196         /* Error unwind statck */
 
 202  * edac_pci_unregister_sysfs_instance_kobj
 
 204  *      unregister the kobj for the EDAC PCI instance
 
 206 void edac_pci_unregister_sysfs_instance_kobj(struct edac_pci_ctl_info *pci)
 
 208         debugf0("%s()\n", __func__);
 
 210         /* Unregister the instance kobject and allow its release
 
 211          * function release the main reference count and then
 
 214         kobject_unregister(&pci->kobj);
 
 217 /***************************** EDAC PCI sysfs root **********************/
 
 218 #define to_edacpci(k) container_of(k, struct edac_pci_ctl_info, kobj)
 
 219 #define to_edacpci_attr(a) container_of(a, struct edac_pci_attr, attr)
 
 221 /* simple show/store functions for attributes */
 
 222 static ssize_t edac_pci_int_show(void *ptr, char *buffer)
 
 225         return sprintf(buffer, "%d\n", *value);
 
 228 static ssize_t edac_pci_int_store(void *ptr, const char *buffer, size_t count)
 
 232         if (isdigit(*buffer))
 
 233                 *value = simple_strtoul(buffer, NULL, 0);
 
 238 struct edac_pci_dev_attribute {
 
 239         struct attribute attr;
 
 241          ssize_t(*show) (void *, char *);
 
 242          ssize_t(*store) (void *, const char *, size_t);
 
 245 /* Set of show/store abstract level functions for PCI Parity object */
 
 246 static ssize_t edac_pci_dev_show(struct kobject *kobj, struct attribute *attr,
 
 249         struct edac_pci_dev_attribute *edac_pci_dev;
 
 250         edac_pci_dev = (struct edac_pci_dev_attribute *)attr;
 
 252         if (edac_pci_dev->show)
 
 253                 return edac_pci_dev->show(edac_pci_dev->value, buffer);
 
 257 static ssize_t edac_pci_dev_store(struct kobject *kobj,
 
 258                                 struct attribute *attr, const char *buffer,
 
 261         struct edac_pci_dev_attribute *edac_pci_dev;
 
 262         edac_pci_dev = (struct edac_pci_dev_attribute *)attr;
 
 264         if (edac_pci_dev->show)
 
 265                 return edac_pci_dev->store(edac_pci_dev->value, buffer, count);
 
 269 static struct sysfs_ops edac_pci_sysfs_ops = {
 
 270         .show = edac_pci_dev_show,
 
 271         .store = edac_pci_dev_store
 
 274 #define EDAC_PCI_ATTR(_name,_mode,_show,_store)                 \
 
 275 static struct edac_pci_dev_attribute edac_pci_attr_##_name = {          \
 
 276         .attr = {.name = __stringify(_name), .mode = _mode },   \
 
 282 #define EDAC_PCI_STRING_ATTR(_name,_data,_mode,_show,_store)    \
 
 283 static struct edac_pci_dev_attribute edac_pci_attr_##_name = {          \
 
 284         .attr = {.name = __stringify(_name), .mode = _mode },   \
 
 290 /* PCI Parity control files */
 
 291 EDAC_PCI_ATTR(check_pci_errors, S_IRUGO | S_IWUSR, edac_pci_int_show,
 
 293 EDAC_PCI_ATTR(edac_pci_log_pe, S_IRUGO | S_IWUSR, edac_pci_int_show,
 
 295 EDAC_PCI_ATTR(edac_pci_log_npe, S_IRUGO | S_IWUSR, edac_pci_int_show,
 
 297 EDAC_PCI_ATTR(edac_pci_panic_on_pe, S_IRUGO | S_IWUSR, edac_pci_int_show,
 
 299 EDAC_PCI_ATTR(pci_parity_count, S_IRUGO, edac_pci_int_show, NULL);
 
 300 EDAC_PCI_ATTR(pci_nonparity_count, S_IRUGO, edac_pci_int_show, NULL);
 
 302 /* Base Attributes of the memory ECC object */
 
 303 static struct edac_pci_dev_attribute *edac_pci_attr[] = {
 
 304         &edac_pci_attr_check_pci_errors,
 
 305         &edac_pci_attr_edac_pci_log_pe,
 
 306         &edac_pci_attr_edac_pci_log_npe,
 
 307         &edac_pci_attr_edac_pci_panic_on_pe,
 
 308         &edac_pci_attr_pci_parity_count,
 
 309         &edac_pci_attr_pci_nonparity_count,
 
 314  * edac_pci_release_main_kobj
 
 316  *      This release function is called when the reference count to the
 
 317  *      passed kobj goes to zero.
 
 319  *      This kobj is the 'main' kobject that EDAC PCI instances
 
 320  *      link to, and thus provide for proper nesting counts
 
 322 static void edac_pci_release_main_kobj(struct kobject *kobj)
 
 325         debugf0("%s() here to module_put(THIS_MODULE)\n", __func__);
 
 327         /* last reference to top EDAC PCI kobject has been removed,
 
 328          * NOW release our ref count on the core module
 
 330         module_put(THIS_MODULE);
 
 333 /* ktype struct for the EDAC PCI main kobj */
 
 334 static struct kobj_type ktype_edac_pci_main_kobj = {
 
 335         .release = edac_pci_release_main_kobj,
 
 336         .sysfs_ops = &edac_pci_sysfs_ops,
 
 337         .default_attrs = (struct attribute **)edac_pci_attr,
 
 341  * edac_pci_main_kobj_setup()
 
 343  *      setup the sysfs for EDAC PCI attributes
 
 344  *      assumes edac_class has already been initialized
 
 346 int edac_pci_main_kobj_setup(void)
 
 349         struct sysdev_class *edac_class;
 
 351         debugf0("%s()\n", __func__);
 
 353         /* check and count if we have already created the main kobject */
 
 354         if (atomic_inc_return(&edac_pci_sysfs_refcount) != 1)
 
 357         /* First time, so create the main kobject and its
 
 358          * controls and atributes
 
 360         edac_class = edac_get_edac_class();
 
 361         if (edac_class == NULL) {
 
 362                 debugf1("%s() no edac_class\n", __func__);
 
 364                 goto decrement_count_fail;
 
 367         /* Need the kobject hook ups, and name setting */
 
 368         edac_pci_top_main_kobj.ktype = &ktype_edac_pci_main_kobj;
 
 369         edac_pci_top_main_kobj.parent = &edac_class->kset.kobj;
 
 371         err = kobject_set_name(&edac_pci_top_main_kobj, "pci");
 
 373                 goto decrement_count_fail;
 
 375         /* Bump the reference count on this module to ensure the
 
 376          * modules isn't unloaded until we deconstruct the top
 
 377          * level main kobj for EDAC PCI
 
 379         if (!try_module_get(THIS_MODULE)) {
 
 380                 debugf1("%s() try_module_get() failed\n", __func__);
 
 382                 goto decrement_count_fail;
 
 385         /* Instanstiate the pci object */
 
 386         /* FIXME: maybe new sysdev_create_subdir() */
 
 387         err = kobject_register(&edac_pci_top_main_kobj);
 
 389                 debugf1("Failed to register '.../edac/pci'\n");
 
 390                 goto kobject_register_fail;
 
 393         /* At this point, to 'release' the top level kobject
 
 394          * for EDAC PCI, then edac_pci_main_kobj_teardown()
 
 395          * must be used, for resources to be cleaned up properly
 
 397         debugf1("Registered '.../edac/pci' kobject\n");
 
 401         /* Error unwind statck */
 
 402 kobject_register_fail:
 
 403         module_put(THIS_MODULE);
 
 405 decrement_count_fail:
 
 406         /* if are on this error exit, nothing to tear down */
 
 407         atomic_dec(&edac_pci_sysfs_refcount);
 
 413  * edac_pci_main_kobj_teardown()
 
 415  *      if no longer linked (needed) remove the top level EDAC PCI
 
 416  *      kobject with its controls and attributes
 
 418 static void edac_pci_main_kobj_teardown(void)
 
 420         debugf0("%s()\n", __func__);
 
 422         /* Decrement the count and only if no more controller instances
 
 423          * are connected perform the unregisteration of the top level
 
 426         if (atomic_dec_return(&edac_pci_sysfs_refcount) == 0) {
 
 427                 debugf0("%s() called kobject_unregister on main kobj\n",
 
 429                 kobject_unregister(&edac_pci_top_main_kobj);
 
 435  * edac_pci_create_sysfs
 
 437  *      Create the controls/attributes for the specified EDAC PCI device
 
 439 int edac_pci_create_sysfs(struct edac_pci_ctl_info *pci)
 
 442         struct kobject *edac_kobj = &pci->kobj;
 
 444         debugf0("%s() idx=%d\n", __func__, pci->pci_idx);
 
 446         /* create the top main EDAC PCI kobject, IF needed */
 
 447         err = edac_pci_main_kobj_setup();
 
 451         /* Create this instance's kobject under the MAIN kobject */
 
 452         err = edac_pci_create_instance_kobj(pci, pci->pci_idx);
 
 454                 goto unregister_cleanup;
 
 456         err = sysfs_create_link(edac_kobj, &pci->dev->kobj, EDAC_PCI_SYMLINK);
 
 458                 debugf0("%s() sysfs_create_link() returned err= %d\n",
 
 465         /* Error unwind stack */
 
 467         edac_pci_unregister_sysfs_instance_kobj(pci);
 
 470         edac_pci_main_kobj_teardown();
 
 476  * edac_pci_remove_sysfs
 
 478  *      remove the controls and attributes for this EDAC PCI device
 
 480 void edac_pci_remove_sysfs(struct edac_pci_ctl_info *pci)
 
 482         debugf0("%s() index=%d\n", __func__, pci->pci_idx);
 
 484         /* Remove the symlink */
 
 485         sysfs_remove_link(&pci->kobj, EDAC_PCI_SYMLINK);
 
 487         /* remove this PCI instance's sysfs entries */
 
 488         edac_pci_unregister_sysfs_instance_kobj(pci);
 
 490         /* Call the main unregister function, which will determine
 
 491          * if this 'pci' is the last instance.
 
 492          * If it is, the main kobject will be unregistered as a result
 
 494         debugf0("%s() calling edac_pci_main_kobj_teardown()\n", __func__);
 
 495         edac_pci_main_kobj_teardown();
 
 498 /************************ PCI error handling *************************/
 
 499 static u16 get_pci_parity_status(struct pci_dev *dev, int secondary)
 
 504         where = secondary ? PCI_SEC_STATUS : PCI_STATUS;
 
 505         pci_read_config_word(dev, where, &status);
 
 507         /* If we get back 0xFFFF then we must suspect that the card has been
 
 508          * pulled but the Linux PCI layer has not yet finished cleaning up.
 
 509          * We don't want to report on such devices
 
 512         if (status == 0xFFFF) {
 
 515                 pci_read_config_dword(dev, 0, &sanity);
 
 517                 if (sanity == 0xFFFFFFFF)
 
 521         status &= PCI_STATUS_DETECTED_PARITY | PCI_STATUS_SIG_SYSTEM_ERROR |
 
 525                 /* reset only the bits we are interested in */
 
 526                 pci_write_config_word(dev, where, status);
 
 532 /* Clear any PCI parity errors logged by this device. */
 
 533 static void edac_pci_dev_parity_clear(struct pci_dev *dev)
 
 537         debugf0("%s()\n", __func__);
 
 539         get_pci_parity_status(dev, 0);
 
 541         /* read the device TYPE, looking for bridges */
 
 542         pci_read_config_byte(dev, PCI_HEADER_TYPE, &header_type);
 
 544         if ((header_type & 0x7F) == PCI_HEADER_TYPE_BRIDGE)
 
 545                 get_pci_parity_status(dev, 1);
 
 551  *      Fucntion to retrieve the current parity status
 
 555 static void edac_pci_dev_parity_test(struct pci_dev *dev)
 
 561         /* stop any interrupts until we can acquire the status */
 
 562         local_irq_save(flags);
 
 564         /* read the STATUS register on this device */
 
 565         status = get_pci_parity_status(dev, 0);
 
 567         /* read the device TYPE, looking for bridges */
 
 568         pci_read_config_byte(dev, PCI_HEADER_TYPE, &header_type);
 
 570         local_irq_restore(flags);
 
 572         debugf4("PCI STATUS= 0x%04x %s\n", status, dev->dev.bus_id);
 
 574         /* check the status reg for errors */
 
 576                 if (status & (PCI_STATUS_SIG_SYSTEM_ERROR)) {
 
 577                         edac_printk(KERN_CRIT, EDAC_PCI,
 
 578                                 "Signaled System Error on %s\n",
 
 580                         atomic_inc(&pci_nonparity_count);
 
 583                 if (status & (PCI_STATUS_PARITY)) {
 
 584                         edac_printk(KERN_CRIT, EDAC_PCI,
 
 585                                 "Master Data Parity Error on %s\n",
 
 588                         atomic_inc(&pci_parity_count);
 
 591                 if (status & (PCI_STATUS_DETECTED_PARITY)) {
 
 592                         edac_printk(KERN_CRIT, EDAC_PCI,
 
 593                                 "Detected Parity Error on %s\n",
 
 596                         atomic_inc(&pci_parity_count);
 
 601         debugf4("PCI HEADER TYPE= 0x%02x %s\n", header_type, dev->dev.bus_id);
 
 603         if ((header_type & 0x7F) == PCI_HEADER_TYPE_BRIDGE) {
 
 604                 /* On bridges, need to examine secondary status register  */
 
 605                 status = get_pci_parity_status(dev, 1);
 
 607                 debugf4("PCI SEC_STATUS= 0x%04x %s\n", status, dev->dev.bus_id);
 
 609                 /* check the secondary status reg for errors */
 
 611                         if (status & (PCI_STATUS_SIG_SYSTEM_ERROR)) {
 
 612                                 edac_printk(KERN_CRIT, EDAC_PCI, "Bridge "
 
 613                                         "Signaled System Error on %s\n",
 
 615                                 atomic_inc(&pci_nonparity_count);
 
 618                         if (status & (PCI_STATUS_PARITY)) {
 
 619                                 edac_printk(KERN_CRIT, EDAC_PCI, "Bridge "
 
 620                                         "Master Data Parity Error on "
 
 621                                         "%s\n", pci_name(dev));
 
 623                                 atomic_inc(&pci_parity_count);
 
 626                         if (status & (PCI_STATUS_DETECTED_PARITY)) {
 
 627                                 edac_printk(KERN_CRIT, EDAC_PCI, "Bridge "
 
 628                                         "Detected Parity Error on %s\n",
 
 631                                 atomic_inc(&pci_parity_count);
 
 637 /* reduce some complexity in definition of the iterator */
 
 638 typedef void (*pci_parity_check_fn_t) (struct pci_dev *dev);
 
 641  * pci_dev parity list iterator
 
 642  *      Scan the PCI device list for one pass, looking for SERRORs
 
 643  *      Master Parity ERRORS or Parity ERRORs on primary or secondary devices
 
 645 static inline void edac_pci_dev_parity_iterator(pci_parity_check_fn_t fn)
 
 647         struct pci_dev *dev = NULL;
 
 649         /* request for kernel access to the next PCI device, if any,
 
 650          * and while we are looking at it have its reference count
 
 651          * bumped until we are done with it
 
 653         while ((dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) {
 
 659  * edac_pci_do_parity_check
 
 661  *      performs the actual PCI parity check operation
 
 663 void edac_pci_do_parity_check(void)
 
 667         debugf3("%s()\n", __func__);
 
 669         /* if policy has PCI check off, leave now */
 
 670         if (!check_pci_errors)
 
 673         before_count = atomic_read(&pci_parity_count);
 
 675         /* scan all PCI devices looking for a Parity Error on devices and
 
 677          * The iterator calls pci_get_device() which might sleep, thus
 
 678          * we cannot disable interrupts in this scan.
 
 680         edac_pci_dev_parity_iterator(edac_pci_dev_parity_test);
 
 682         /* Only if operator has selected panic on PCI Error */
 
 683         if (edac_pci_get_panic_on_pe()) {
 
 684                 /* If the count is different 'after' from 'before' */
 
 685                 if (before_count != atomic_read(&pci_parity_count))
 
 686                         panic("EDAC: PCI Parity Error");
 
 691  * edac_pci_clear_parity_errors
 
 693  *      function to perform an iteration over the PCI devices
 
 694  *      and clearn their current status
 
 696 void edac_pci_clear_parity_errors(void)
 
 698         /* Clear any PCI bus parity errors that devices initially have logged
 
 699          * in their registers.
 
 701         edac_pci_dev_parity_iterator(edac_pci_dev_parity_clear);
 
 707  *      Called to handle a PARITY ERROR event
 
 709 void edac_pci_handle_pe(struct edac_pci_ctl_info *pci, const char *msg)
 
 712         /* global PE counter incremented by edac_pci_do_parity_check() */
 
 713         atomic_inc(&pci->counters.pe_count);
 
 715         if (edac_pci_get_log_pe())
 
 716                 edac_pci_printk(pci, KERN_WARNING,
 
 717                                 "Parity Error ctl: %s %d: %s\n",
 
 718                                 pci->ctl_name, pci->pci_idx, msg);
 
 721          * poke all PCI devices and see which one is the troublemaker
 
 722          * panic() is called if set
 
 724         edac_pci_do_parity_check();
 
 726 EXPORT_SYMBOL_GPL(edac_pci_handle_pe);
 
 730  * edac_pci_handle_npe
 
 732  *      Called to handle a NON-PARITY ERROR event
 
 734 void edac_pci_handle_npe(struct edac_pci_ctl_info *pci, const char *msg)
 
 737         /* global NPE counter incremented by edac_pci_do_parity_check() */
 
 738         atomic_inc(&pci->counters.npe_count);
 
 740         if (edac_pci_get_log_npe())
 
 741                 edac_pci_printk(pci, KERN_WARNING,
 
 742                                 "Non-Parity Error ctl: %s %d: %s\n",
 
 743                                 pci->ctl_name, pci->pci_idx, msg);
 
 746          * poke all PCI devices and see which one is the troublemaker
 
 747          * panic() is called if set
 
 749         edac_pci_do_parity_check();
 
 751 EXPORT_SYMBOL_GPL(edac_pci_handle_npe);
 
 754  * Define the PCI parameter to the module
 
 756 module_param(check_pci_errors, int, 0644);
 
 757 MODULE_PARM_DESC(check_pci_errors,
 
 758                  "Check for PCI bus parity errors: 0=off 1=on");
 
 759 module_param(edac_pci_panic_on_pe, int, 0644);
 
 760 MODULE_PARM_DESC(edac_pci_panic_on_pe,
 
 761                  "Panic on PCI Bus Parity error: 0=off 1=on");
 
 763 #endif                          /* CONFIG_PCI */