cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

edac_pci_sysfs.c (19384B)


      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");