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