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