Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/drivers/edac/edac_pci_sysfs.c
15109 views
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 <[email protected]>
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 */
23
static int check_pci_errors; /* default NO check PCI parity */
24
static int edac_pci_panic_on_pe; /* default NO panic on PCI Parity */
25
static int edac_pci_log_pe = 1; /* log PCI parity errors */
26
static int edac_pci_log_npe = 1; /* log PCI non-parity error errors */
27
static int edac_pci_poll_msec = 1000; /* one second workq period */
28
29
static atomic_t pci_parity_count = ATOMIC_INIT(0);
30
static atomic_t pci_nonparity_count = ATOMIC_INIT(0);
31
32
static struct kobject *edac_pci_top_main_kobj;
33
static atomic_t edac_pci_sysfs_refcount = ATOMIC_INIT(0);
34
35
/* getter functions for the data variables */
36
int edac_pci_get_check_errors(void)
37
{
38
return check_pci_errors;
39
}
40
41
static int edac_pci_get_log_pe(void)
42
{
43
return edac_pci_log_pe;
44
}
45
46
static int edac_pci_get_log_npe(void)
47
{
48
return edac_pci_log_npe;
49
}
50
51
static int edac_pci_get_panic_on_pe(void)
52
{
53
return edac_pci_panic_on_pe;
54
}
55
56
int edac_pci_get_poll_msec(void)
57
{
58
return edac_pci_poll_msec;
59
}
60
61
/**************************** EDAC PCI sysfs instance *******************/
62
static 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
67
static 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 */
77
static 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 */
93
struct 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 */
100
static 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 */
112
static 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 */
125
static 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) \
131
static struct instance_attribute attr_instance_##_name = { \
132
.attr = {.name = __stringify(_name), .mode = _mode }, \
133
.show = _show, \
134
.store = _store, \
135
};
136
137
INSTANCE_ATTR(pe_count, S_IRUGO, instance_pe_count_show, NULL);
138
INSTANCE_ATTR(npe_count, S_IRUGO, instance_npe_count_show, NULL);
139
140
/* pci instance attributes */
141
static 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 */
148
static 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
*/
159
static 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 */
192
error_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
*/
201
static 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 */
218
static ssize_t edac_pci_int_show(void *ptr, char *buffer)
219
{
220
int *value = ptr;
221
return sprintf(buffer, "%d\n", *value);
222
}
223
224
static 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
234
struct 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 */
242
static 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
253
static 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
265
static 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) \
271
static 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) \
279
static 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 */
287
EDAC_PCI_ATTR(check_pci_errors, S_IRUGO | S_IWUSR, edac_pci_int_show,
288
edac_pci_int_store);
289
EDAC_PCI_ATTR(edac_pci_log_pe, S_IRUGO | S_IWUSR, edac_pci_int_show,
290
edac_pci_int_store);
291
EDAC_PCI_ATTR(edac_pci_log_npe, S_IRUGO | S_IWUSR, edac_pci_int_show,
292
edac_pci_int_store);
293
EDAC_PCI_ATTR(edac_pci_panic_on_pe, S_IRUGO | S_IWUSR, edac_pci_int_show,
294
edac_pci_int_store);
295
EDAC_PCI_ATTR(pci_parity_count, S_IRUGO, edac_pci_int_show, NULL);
296
EDAC_PCI_ATTR(pci_nonparity_count, S_IRUGO, edac_pci_int_show, NULL);
297
298
/* Base Attributes of the memory ECC object */
299
static 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
*/
318
static 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 */
331
static 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
*/
343
static 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 attributes
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 */
400
kobject_init_and_add_fail:
401
kfree(edac_pci_top_main_kobj);
402
403
kzalloc_fail:
404
module_put(THIS_MODULE);
405
406
mod_get_fail:
407
edac_put_sysfs_class();
408
409
decrement_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
*/
422
static 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
*/
444
int 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 */
471
symlink_fail:
472
edac_pci_unregister_sysfs_instance_kobj(pci);
473
474
unregister_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
*/
485
void 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 *************************/
504
static 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. */
538
static 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
* Function to retrieve the current parity status
555
* and decode it
556
*
557
*/
558
static 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 */
645
typedef 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
*/
652
static 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
*/
670
void 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
*/
703
void 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
*/
716
void 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
}
733
EXPORT_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
*/
741
void 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
}
758
EXPORT_SYMBOL_GPL(edac_pci_handle_npe);
759
760
/*
761
* Define the PCI parameter to the module
762
*/
763
module_param(check_pci_errors, int, 0644);
764
MODULE_PARM_DESC(check_pci_errors,
765
"Check for PCI bus parity errors: 0=off 1=on");
766
module_param(edac_pci_panic_on_pe, int, 0644);
767
MODULE_PARM_DESC(edac_pci_panic_on_pe,
768
"Panic on PCI Bus Parity error: 0=off 1=on");
769
770
#endif /* CONFIG_PCI */
771
772