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