Merge branch 'upstream-fixes' of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik...
[linux-2.6/verdex.git] / drivers / edac / edac_mc.c
blobb10ee4698b1db95f8b3045fd7fd814648cedfed0
1 /*
2 * edac_mc kernel module
3 * (C) 2005 Linux Networx (http://lnxi.com)
4 * This file may be distributed under the terms of the
5 * GNU General Public License.
7 * Written by Thayne Harbaugh
8 * Based on work by Dan Hollis <goemon at anime dot net> and others.
9 * http://www.anime.net/~goemon/linux-ecc/
11 * Modified by Dave Peterson and Doug Thompson
16 #include <linux/config.h>
17 #include <linux/module.h>
18 #include <linux/proc_fs.h>
19 #include <linux/kernel.h>
20 #include <linux/types.h>
21 #include <linux/smp.h>
22 #include <linux/init.h>
23 #include <linux/sysctl.h>
24 #include <linux/highmem.h>
25 #include <linux/timer.h>
26 #include <linux/slab.h>
27 #include <linux/jiffies.h>
28 #include <linux/spinlock.h>
29 #include <linux/list.h>
30 #include <linux/sysdev.h>
31 #include <linux/ctype.h>
33 #include <asm/uaccess.h>
34 #include <asm/page.h>
35 #include <asm/edac.h>
37 #include "edac_mc.h"
39 #define EDAC_MC_VERSION "edac_mc Ver: 2.0.0 " __DATE__
41 #ifdef CONFIG_EDAC_DEBUG
42 /* Values of 0 to 4 will generate output */
43 int edac_debug_level = 1;
44 EXPORT_SYMBOL(edac_debug_level);
45 #endif
47 /* EDAC Controls, setable by module parameter, and sysfs */
48 static int log_ue = 1;
49 static int log_ce = 1;
50 static int panic_on_ue = 1;
51 static int poll_msec = 1000;
53 static int check_pci_parity = 0; /* default YES check PCI parity */
54 static int panic_on_pci_parity; /* default no panic on PCI Parity */
55 static atomic_t pci_parity_count = ATOMIC_INIT(0);
57 /* lock to memory controller's control array */
58 static DECLARE_MUTEX(mem_ctls_mutex);
59 static struct list_head mc_devices = LIST_HEAD_INIT(mc_devices);
61 /* Structure of the whitelist and blacklist arrays */
62 struct edac_pci_device_list {
63 unsigned int vendor; /* Vendor ID */
64 unsigned int device; /* Deviice ID */
68 #define MAX_LISTED_PCI_DEVICES 32
70 /* List of PCI devices (vendor-id:device-id) that should be skipped */
71 static struct edac_pci_device_list pci_blacklist[MAX_LISTED_PCI_DEVICES];
72 static int pci_blacklist_count;
74 /* List of PCI devices (vendor-id:device-id) that should be scanned */
75 static struct edac_pci_device_list pci_whitelist[MAX_LISTED_PCI_DEVICES];
76 static int pci_whitelist_count ;
78 /* START sysfs data and methods */
80 static const char *mem_types[] = {
81 [MEM_EMPTY] = "Empty",
82 [MEM_RESERVED] = "Reserved",
83 [MEM_UNKNOWN] = "Unknown",
84 [MEM_FPM] = "FPM",
85 [MEM_EDO] = "EDO",
86 [MEM_BEDO] = "BEDO",
87 [MEM_SDR] = "Unbuffered-SDR",
88 [MEM_RDR] = "Registered-SDR",
89 [MEM_DDR] = "Unbuffered-DDR",
90 [MEM_RDDR] = "Registered-DDR",
91 [MEM_RMBS] = "RMBS"
94 static const char *dev_types[] = {
95 [DEV_UNKNOWN] = "Unknown",
96 [DEV_X1] = "x1",
97 [DEV_X2] = "x2",
98 [DEV_X4] = "x4",
99 [DEV_X8] = "x8",
100 [DEV_X16] = "x16",
101 [DEV_X32] = "x32",
102 [DEV_X64] = "x64"
105 static const char *edac_caps[] = {
106 [EDAC_UNKNOWN] = "Unknown",
107 [EDAC_NONE] = "None",
108 [EDAC_RESERVED] = "Reserved",
109 [EDAC_PARITY] = "PARITY",
110 [EDAC_EC] = "EC",
111 [EDAC_SECDED] = "SECDED",
112 [EDAC_S2ECD2ED] = "S2ECD2ED",
113 [EDAC_S4ECD4ED] = "S4ECD4ED",
114 [EDAC_S8ECD8ED] = "S8ECD8ED",
115 [EDAC_S16ECD16ED] = "S16ECD16ED"
119 /* sysfs object: /sys/devices/system/edac */
120 static struct sysdev_class edac_class = {
121 set_kset_name("edac"),
124 /* sysfs objects:
125 * /sys/devices/system/edac/mc
126 * /sys/devices/system/edac/pci
128 static struct kobject edac_memctrl_kobj;
129 static struct kobject edac_pci_kobj;
132 * /sys/devices/system/edac/mc;
133 * data structures and methods
135 static ssize_t memctrl_string_show(void *ptr, char *buffer)
137 char *value = (char*) ptr;
138 return sprintf(buffer, "%s\n", value);
141 static ssize_t memctrl_int_show(void *ptr, char *buffer)
143 int *value = (int*) ptr;
144 return sprintf(buffer, "%d\n", *value);
147 static ssize_t memctrl_int_store(void *ptr, const char *buffer, size_t count)
149 int *value = (int*) ptr;
151 if (isdigit(*buffer))
152 *value = simple_strtoul(buffer, NULL, 0);
154 return count;
157 struct memctrl_dev_attribute {
158 struct attribute attr;
159 void *value;
160 ssize_t (*show)(void *,char *);
161 ssize_t (*store)(void *, const char *, size_t);
164 /* Set of show/store abstract level functions for memory control object */
165 static ssize_t
166 memctrl_dev_show(struct kobject *kobj, struct attribute *attr, char *buffer)
168 struct memctrl_dev_attribute *memctrl_dev;
169 memctrl_dev = (struct memctrl_dev_attribute*)attr;
171 if (memctrl_dev->show)
172 return memctrl_dev->show(memctrl_dev->value, buffer);
173 return -EIO;
176 static ssize_t
177 memctrl_dev_store(struct kobject *kobj, struct attribute *attr,
178 const char *buffer, size_t count)
180 struct memctrl_dev_attribute *memctrl_dev;
181 memctrl_dev = (struct memctrl_dev_attribute*)attr;
183 if (memctrl_dev->store)
184 return memctrl_dev->store(memctrl_dev->value, buffer, count);
185 return -EIO;
188 static struct sysfs_ops memctrlfs_ops = {
189 .show = memctrl_dev_show,
190 .store = memctrl_dev_store
193 #define MEMCTRL_ATTR(_name,_mode,_show,_store) \
194 struct memctrl_dev_attribute attr_##_name = { \
195 .attr = {.name = __stringify(_name), .mode = _mode }, \
196 .value = &_name, \
197 .show = _show, \
198 .store = _store, \
201 #define MEMCTRL_STRING_ATTR(_name,_data,_mode,_show,_store) \
202 struct memctrl_dev_attribute attr_##_name = { \
203 .attr = {.name = __stringify(_name), .mode = _mode }, \
204 .value = _data, \
205 .show = _show, \
206 .store = _store, \
209 /* cwrow<id> attribute f*/
210 MEMCTRL_STRING_ATTR(mc_version,EDAC_MC_VERSION,S_IRUGO,memctrl_string_show,NULL);
212 /* csrow<id> control files */
213 MEMCTRL_ATTR(panic_on_ue,S_IRUGO|S_IWUSR,memctrl_int_show,memctrl_int_store);
214 MEMCTRL_ATTR(log_ue,S_IRUGO|S_IWUSR,memctrl_int_show,memctrl_int_store);
215 MEMCTRL_ATTR(log_ce,S_IRUGO|S_IWUSR,memctrl_int_show,memctrl_int_store);
216 MEMCTRL_ATTR(poll_msec,S_IRUGO|S_IWUSR,memctrl_int_show,memctrl_int_store);
219 /* Base Attributes of the memory ECC object */
220 static struct memctrl_dev_attribute *memctrl_attr[] = {
221 &attr_panic_on_ue,
222 &attr_log_ue,
223 &attr_log_ce,
224 &attr_poll_msec,
225 &attr_mc_version,
226 NULL,
229 /* Main MC kobject release() function */
230 static void edac_memctrl_master_release(struct kobject *kobj)
232 debugf1("EDAC MC: " __FILE__ ": %s()\n", __func__);
235 static struct kobj_type ktype_memctrl = {
236 .release = edac_memctrl_master_release,
237 .sysfs_ops = &memctrlfs_ops,
238 .default_attrs = (struct attribute **) memctrl_attr,
242 /* Initialize the main sysfs entries for edac:
243 * /sys/devices/system/edac
245 * and children
247 * Return: 0 SUCCESS
248 * !0 FAILURE
250 static int edac_sysfs_memctrl_setup(void)
252 int err=0;
254 debugf1("MC: " __FILE__ ": %s()\n", __func__);
256 /* create the /sys/devices/system/edac directory */
257 err = sysdev_class_register(&edac_class);
258 if (!err) {
259 /* Init the MC's kobject */
260 memset(&edac_memctrl_kobj, 0, sizeof (edac_memctrl_kobj));
261 kobject_init(&edac_memctrl_kobj);
263 edac_memctrl_kobj.parent = &edac_class.kset.kobj;
264 edac_memctrl_kobj.ktype = &ktype_memctrl;
266 /* generate sysfs "..../edac/mc" */
267 err = kobject_set_name(&edac_memctrl_kobj,"mc");
268 if (!err) {
269 /* FIXME: maybe new sysdev_create_subdir() */
270 err = kobject_register(&edac_memctrl_kobj);
271 if (err) {
272 debugf1("Failed to register '.../edac/mc'\n");
273 } else {
274 debugf1("Registered '.../edac/mc' kobject\n");
277 } else {
278 debugf1(KERN_WARNING "__FILE__ %s() error=%d\n", __func__,err);
281 return err;
285 * MC teardown:
286 * the '..../edac/mc' kobject followed by '..../edac' itself
288 static void edac_sysfs_memctrl_teardown(void)
290 debugf0("MC: " __FILE__ ": %s()\n", __func__);
292 /* Unregister the MC's kobject */
293 kobject_unregister(&edac_memctrl_kobj);
295 /* release the master edac mc kobject */
296 kobject_put(&edac_memctrl_kobj);
298 /* Unregister the 'edac' object */
299 sysdev_class_unregister(&edac_class);
303 * /sys/devices/system/edac/pci;
304 * data structures and methods
307 struct list_control {
308 struct edac_pci_device_list *list;
309 int *count;
312 /* Output the list as: vendor_id:device:id<,vendor_id:device_id> */
313 static ssize_t edac_pci_list_string_show(void *ptr, char *buffer)
315 struct list_control *listctl;
316 struct edac_pci_device_list *list;
317 char *p = buffer;
318 int len=0;
319 int i;
321 listctl = ptr;
322 list = listctl->list;
324 for (i = 0; i < *(listctl->count); i++, list++ ) {
325 if (len > 0)
326 len += snprintf(p + len, (PAGE_SIZE-len), ",");
328 len += snprintf(p + len,
329 (PAGE_SIZE-len),
330 "%x:%x",
331 list->vendor,list->device);
334 len += snprintf(p + len,(PAGE_SIZE-len), "\n");
336 return (ssize_t) len;
341 * Scan string from **s to **e looking for one 'vendor:device' tuple
342 * where each field is a hex value
344 * return 0 if an entry is NOT found
345 * return 1 if an entry is found
346 * fill in *vendor_id and *device_id with values found
348 * In both cases, make sure *s has been moved forward toward *e
350 static int parse_one_device(const char **s,const char **e,
351 unsigned int *vendor_id, unsigned int *device_id)
353 const char *runner, *p;
355 /* if null byte, we are done */
356 if (!**s) {
357 (*s)++; /* keep *s moving */
358 return 0;
361 /* skip over newlines & whitespace */
362 if ((**s == '\n') || isspace(**s)) {
363 (*s)++;
364 return 0;
367 if (!isxdigit(**s)) {
368 (*s)++;
369 return 0;
372 /* parse vendor_id */
373 runner = *s;
374 while (runner < *e) {
375 /* scan for vendor:device delimiter */
376 if (*runner == ':') {
377 *vendor_id = simple_strtol((char*) *s, (char**) &p, 16);
378 runner = p + 1;
379 break;
381 runner++;
384 if (!isxdigit(*runner)) {
385 *s = ++runner;
386 return 0;
389 /* parse device_id */
390 if (runner < *e) {
391 *device_id = simple_strtol((char*)runner, (char**)&p, 16);
392 runner = p;
395 *s = runner;
397 return 1;
400 static ssize_t edac_pci_list_string_store(void *ptr, const char *buffer,
401 size_t count)
403 struct list_control *listctl;
404 struct edac_pci_device_list *list;
405 unsigned int vendor_id, device_id;
406 const char *s, *e;
407 int *index;
409 s = (char*)buffer;
410 e = s + count;
412 listctl = ptr;
413 list = listctl->list;
414 index = listctl->count;
416 *index = 0;
417 while (*index < MAX_LISTED_PCI_DEVICES) {
419 if (parse_one_device(&s,&e,&vendor_id,&device_id)) {
420 list[ *index ].vendor = vendor_id;
421 list[ *index ].device = device_id;
422 (*index)++;
425 /* check for all data consume */
426 if (s >= e)
427 break;
430 return count;
433 static ssize_t edac_pci_int_show(void *ptr, char *buffer)
435 int *value = ptr;
436 return sprintf(buffer,"%d\n",*value);
439 static ssize_t edac_pci_int_store(void *ptr, const char *buffer, size_t count)
441 int *value = ptr;
443 if (isdigit(*buffer))
444 *value = simple_strtoul(buffer,NULL,0);
446 return count;
449 struct edac_pci_dev_attribute {
450 struct attribute attr;
451 void *value;
452 ssize_t (*show)(void *,char *);
453 ssize_t (*store)(void *, const char *,size_t);
456 /* Set of show/store abstract level functions for PCI Parity object */
457 static ssize_t edac_pci_dev_show(struct kobject *kobj, struct attribute *attr,
458 char *buffer)
460 struct edac_pci_dev_attribute *edac_pci_dev;
461 edac_pci_dev= (struct edac_pci_dev_attribute*)attr;
463 if (edac_pci_dev->show)
464 return edac_pci_dev->show(edac_pci_dev->value, buffer);
465 return -EIO;
468 static ssize_t edac_pci_dev_store(struct kobject *kobj, struct attribute *attr,
469 const char *buffer, size_t count)
471 struct edac_pci_dev_attribute *edac_pci_dev;
472 edac_pci_dev= (struct edac_pci_dev_attribute*)attr;
474 if (edac_pci_dev->show)
475 return edac_pci_dev->store(edac_pci_dev->value, buffer, count);
476 return -EIO;
479 static struct sysfs_ops edac_pci_sysfs_ops = {
480 .show = edac_pci_dev_show,
481 .store = edac_pci_dev_store
485 #define EDAC_PCI_ATTR(_name,_mode,_show,_store) \
486 struct edac_pci_dev_attribute edac_pci_attr_##_name = { \
487 .attr = {.name = __stringify(_name), .mode = _mode }, \
488 .value = &_name, \
489 .show = _show, \
490 .store = _store, \
493 #define EDAC_PCI_STRING_ATTR(_name,_data,_mode,_show,_store) \
494 struct edac_pci_dev_attribute edac_pci_attr_##_name = { \
495 .attr = {.name = __stringify(_name), .mode = _mode }, \
496 .value = _data, \
497 .show = _show, \
498 .store = _store, \
501 static struct list_control pci_whitelist_control = {
502 .list = pci_whitelist,
503 .count = &pci_whitelist_count
506 static struct list_control pci_blacklist_control = {
507 .list = pci_blacklist,
508 .count = &pci_blacklist_count
511 /* whitelist attribute */
512 EDAC_PCI_STRING_ATTR(pci_parity_whitelist,
513 &pci_whitelist_control,
514 S_IRUGO|S_IWUSR,
515 edac_pci_list_string_show,
516 edac_pci_list_string_store);
518 EDAC_PCI_STRING_ATTR(pci_parity_blacklist,
519 &pci_blacklist_control,
520 S_IRUGO|S_IWUSR,
521 edac_pci_list_string_show,
522 edac_pci_list_string_store);
524 /* PCI Parity control files */
525 EDAC_PCI_ATTR(check_pci_parity,S_IRUGO|S_IWUSR,edac_pci_int_show,edac_pci_int_store);
526 EDAC_PCI_ATTR(panic_on_pci_parity,S_IRUGO|S_IWUSR,edac_pci_int_show,edac_pci_int_store);
527 EDAC_PCI_ATTR(pci_parity_count,S_IRUGO,edac_pci_int_show,NULL);
529 /* Base Attributes of the memory ECC object */
530 static struct edac_pci_dev_attribute *edac_pci_attr[] = {
531 &edac_pci_attr_check_pci_parity,
532 &edac_pci_attr_panic_on_pci_parity,
533 &edac_pci_attr_pci_parity_count,
534 &edac_pci_attr_pci_parity_whitelist,
535 &edac_pci_attr_pci_parity_blacklist,
536 NULL,
539 /* No memory to release */
540 static void edac_pci_release(struct kobject *kobj)
542 debugf1("EDAC PCI: " __FILE__ ": %s()\n", __func__);
545 static struct kobj_type ktype_edac_pci = {
546 .release = edac_pci_release,
547 .sysfs_ops = &edac_pci_sysfs_ops,
548 .default_attrs = (struct attribute **) edac_pci_attr,
552 * edac_sysfs_pci_setup()
555 static int edac_sysfs_pci_setup(void)
557 int err;
559 debugf1("MC: " __FILE__ ": %s()\n", __func__);
561 memset(&edac_pci_kobj, 0, sizeof(edac_pci_kobj));
563 kobject_init(&edac_pci_kobj);
564 edac_pci_kobj.parent = &edac_class.kset.kobj;
565 edac_pci_kobj.ktype = &ktype_edac_pci;
567 err = kobject_set_name(&edac_pci_kobj, "pci");
568 if (!err) {
569 /* Instanstiate the csrow object */
570 /* FIXME: maybe new sysdev_create_subdir() */
571 err = kobject_register(&edac_pci_kobj);
572 if (err)
573 debugf1("Failed to register '.../edac/pci'\n");
574 else
575 debugf1("Registered '.../edac/pci' kobject\n");
577 return err;
581 static void edac_sysfs_pci_teardown(void)
583 debugf0("MC: " __FILE__ ": %s()\n", __func__);
585 kobject_unregister(&edac_pci_kobj);
586 kobject_put(&edac_pci_kobj);
589 /* EDAC sysfs CSROW data structures and methods */
591 /* Set of more detailed csrow<id> attribute show/store functions */
592 static ssize_t csrow_ch0_dimm_label_show(struct csrow_info *csrow, char *data)
594 ssize_t size = 0;
596 if (csrow->nr_channels > 0) {
597 size = snprintf(data, EDAC_MC_LABEL_LEN,"%s\n",
598 csrow->channels[0].label);
600 return size;
603 static ssize_t csrow_ch1_dimm_label_show(struct csrow_info *csrow, char *data)
605 ssize_t size = 0;
607 if (csrow->nr_channels > 0) {
608 size = snprintf(data, EDAC_MC_LABEL_LEN, "%s\n",
609 csrow->channels[1].label);
611 return size;
614 static ssize_t csrow_ch0_dimm_label_store(struct csrow_info *csrow,
615 const char *data, size_t size)
617 ssize_t max_size = 0;
619 if (csrow->nr_channels > 0) {
620 max_size = min((ssize_t)size,(ssize_t)EDAC_MC_LABEL_LEN-1);
621 strncpy(csrow->channels[0].label, data, max_size);
622 csrow->channels[0].label[max_size] = '\0';
624 return size;
627 static ssize_t csrow_ch1_dimm_label_store(struct csrow_info *csrow,
628 const char *data, size_t size)
630 ssize_t max_size = 0;
632 if (csrow->nr_channels > 1) {
633 max_size = min((ssize_t)size,(ssize_t)EDAC_MC_LABEL_LEN-1);
634 strncpy(csrow->channels[1].label, data, max_size);
635 csrow->channels[1].label[max_size] = '\0';
637 return max_size;
640 static ssize_t csrow_ue_count_show(struct csrow_info *csrow, char *data)
642 return sprintf(data,"%u\n", csrow->ue_count);
645 static ssize_t csrow_ce_count_show(struct csrow_info *csrow, char *data)
647 return sprintf(data,"%u\n", csrow->ce_count);
650 static ssize_t csrow_ch0_ce_count_show(struct csrow_info *csrow, char *data)
652 ssize_t size = 0;
654 if (csrow->nr_channels > 0) {
655 size = sprintf(data,"%u\n", csrow->channels[0].ce_count);
657 return size;
660 static ssize_t csrow_ch1_ce_count_show(struct csrow_info *csrow, char *data)
662 ssize_t size = 0;
664 if (csrow->nr_channels > 1) {
665 size = sprintf(data,"%u\n", csrow->channels[1].ce_count);
667 return size;
670 static ssize_t csrow_size_show(struct csrow_info *csrow, char *data)
672 return sprintf(data,"%u\n", PAGES_TO_MiB(csrow->nr_pages));
675 static ssize_t csrow_mem_type_show(struct csrow_info *csrow, char *data)
677 return sprintf(data,"%s\n", mem_types[csrow->mtype]);
680 static ssize_t csrow_dev_type_show(struct csrow_info *csrow, char *data)
682 return sprintf(data,"%s\n", dev_types[csrow->dtype]);
685 static ssize_t csrow_edac_mode_show(struct csrow_info *csrow, char *data)
687 return sprintf(data,"%s\n", edac_caps[csrow->edac_mode]);
690 struct csrowdev_attribute {
691 struct attribute attr;
692 ssize_t (*show)(struct csrow_info *,char *);
693 ssize_t (*store)(struct csrow_info *, const char *,size_t);
696 #define to_csrow(k) container_of(k, struct csrow_info, kobj)
697 #define to_csrowdev_attr(a) container_of(a, struct csrowdev_attribute, attr)
699 /* Set of show/store higher level functions for csrow objects */
700 static ssize_t csrowdev_show(struct kobject *kobj, struct attribute *attr,
701 char *buffer)
703 struct csrow_info *csrow = to_csrow(kobj);
704 struct csrowdev_attribute *csrowdev_attr = to_csrowdev_attr(attr);
706 if (csrowdev_attr->show)
707 return csrowdev_attr->show(csrow, buffer);
708 return -EIO;
711 static ssize_t csrowdev_store(struct kobject *kobj, struct attribute *attr,
712 const char *buffer, size_t count)
714 struct csrow_info *csrow = to_csrow(kobj);
715 struct csrowdev_attribute * csrowdev_attr = to_csrowdev_attr(attr);
717 if (csrowdev_attr->store)
718 return csrowdev_attr->store(csrow, buffer, count);
719 return -EIO;
722 static struct sysfs_ops csrowfs_ops = {
723 .show = csrowdev_show,
724 .store = csrowdev_store
727 #define CSROWDEV_ATTR(_name,_mode,_show,_store) \
728 struct csrowdev_attribute attr_##_name = { \
729 .attr = {.name = __stringify(_name), .mode = _mode }, \
730 .show = _show, \
731 .store = _store, \
734 /* cwrow<id>/attribute files */
735 CSROWDEV_ATTR(size_mb,S_IRUGO,csrow_size_show,NULL);
736 CSROWDEV_ATTR(dev_type,S_IRUGO,csrow_dev_type_show,NULL);
737 CSROWDEV_ATTR(mem_type,S_IRUGO,csrow_mem_type_show,NULL);
738 CSROWDEV_ATTR(edac_mode,S_IRUGO,csrow_edac_mode_show,NULL);
739 CSROWDEV_ATTR(ue_count,S_IRUGO,csrow_ue_count_show,NULL);
740 CSROWDEV_ATTR(ce_count,S_IRUGO,csrow_ce_count_show,NULL);
741 CSROWDEV_ATTR(ch0_ce_count,S_IRUGO,csrow_ch0_ce_count_show,NULL);
742 CSROWDEV_ATTR(ch1_ce_count,S_IRUGO,csrow_ch1_ce_count_show,NULL);
744 /* control/attribute files */
745 CSROWDEV_ATTR(ch0_dimm_label,S_IRUGO|S_IWUSR,
746 csrow_ch0_dimm_label_show,
747 csrow_ch0_dimm_label_store);
748 CSROWDEV_ATTR(ch1_dimm_label,S_IRUGO|S_IWUSR,
749 csrow_ch1_dimm_label_show,
750 csrow_ch1_dimm_label_store);
753 /* Attributes of the CSROW<id> object */
754 static struct csrowdev_attribute *csrow_attr[] = {
755 &attr_dev_type,
756 &attr_mem_type,
757 &attr_edac_mode,
758 &attr_size_mb,
759 &attr_ue_count,
760 &attr_ce_count,
761 &attr_ch0_ce_count,
762 &attr_ch1_ce_count,
763 &attr_ch0_dimm_label,
764 &attr_ch1_dimm_label,
765 NULL,
769 /* No memory to release */
770 static void edac_csrow_instance_release(struct kobject *kobj)
772 debugf1("EDAC MC: " __FILE__ ": %s()\n", __func__);
775 static struct kobj_type ktype_csrow = {
776 .release = edac_csrow_instance_release,
777 .sysfs_ops = &csrowfs_ops,
778 .default_attrs = (struct attribute **) csrow_attr,
781 /* Create a CSROW object under specifed edac_mc_device */
782 static int edac_create_csrow_object(struct kobject *edac_mci_kobj,
783 struct csrow_info *csrow, int index )
785 int err = 0;
787 debugf0("MC: " __FILE__ ": %s()\n", __func__);
789 memset(&csrow->kobj, 0, sizeof(csrow->kobj));
791 /* generate ..../edac/mc/mc<id>/csrow<index> */
793 kobject_init(&csrow->kobj);
794 csrow->kobj.parent = edac_mci_kobj;
795 csrow->kobj.ktype = &ktype_csrow;
797 /* name this instance of csrow<id> */
798 err = kobject_set_name(&csrow->kobj,"csrow%d",index);
799 if (!err) {
800 /* Instanstiate the csrow object */
801 err = kobject_register(&csrow->kobj);
802 if (err)
803 debugf0("Failed to register CSROW%d\n",index);
804 else
805 debugf0("Registered CSROW%d\n",index);
808 return err;
811 /* sysfs data structures and methods for the MCI kobjects */
813 static ssize_t mci_reset_counters_store(struct mem_ctl_info *mci,
814 const char *data, size_t count )
816 int row, chan;
818 mci->ue_noinfo_count = 0;
819 mci->ce_noinfo_count = 0;
820 mci->ue_count = 0;
821 mci->ce_count = 0;
822 for (row = 0; row < mci->nr_csrows; row++) {
823 struct csrow_info *ri = &mci->csrows[row];
825 ri->ue_count = 0;
826 ri->ce_count = 0;
827 for (chan = 0; chan < ri->nr_channels; chan++)
828 ri->channels[chan].ce_count = 0;
830 mci->start_time = jiffies;
832 return count;
835 static ssize_t mci_ue_count_show(struct mem_ctl_info *mci, char *data)
837 return sprintf(data,"%d\n", mci->ue_count);
840 static ssize_t mci_ce_count_show(struct mem_ctl_info *mci, char *data)
842 return sprintf(data,"%d\n", mci->ce_count);
845 static ssize_t mci_ce_noinfo_show(struct mem_ctl_info *mci, char *data)
847 return sprintf(data,"%d\n", mci->ce_noinfo_count);
850 static ssize_t mci_ue_noinfo_show(struct mem_ctl_info *mci, char *data)
852 return sprintf(data,"%d\n", mci->ue_noinfo_count);
855 static ssize_t mci_seconds_show(struct mem_ctl_info *mci, char *data)
857 return sprintf(data,"%ld\n", (jiffies - mci->start_time) / HZ);
860 static ssize_t mci_mod_name_show(struct mem_ctl_info *mci, char *data)
862 return sprintf(data,"%s %s\n", mci->mod_name, mci->mod_ver);
865 static ssize_t mci_ctl_name_show(struct mem_ctl_info *mci, char *data)
867 return sprintf(data,"%s\n", mci->ctl_name);
870 static int mci_output_edac_cap(char *buf, unsigned long edac_cap)
872 char *p = buf;
873 int bit_idx;
875 for (bit_idx = 0; bit_idx < 8 * sizeof(edac_cap); bit_idx++) {
876 if ((edac_cap >> bit_idx) & 0x1)
877 p += sprintf(p, "%s ", edac_caps[bit_idx]);
880 return p - buf;
883 static ssize_t mci_edac_capability_show(struct mem_ctl_info *mci, char *data)
885 char *p = data;
887 p += mci_output_edac_cap(p,mci->edac_ctl_cap);
888 p += sprintf(p, "\n");
890 return p - data;
893 static ssize_t mci_edac_current_capability_show(struct mem_ctl_info *mci,
894 char *data)
896 char *p = data;
898 p += mci_output_edac_cap(p,mci->edac_cap);
899 p += sprintf(p, "\n");
901 return p - data;
904 static int mci_output_mtype_cap(char *buf, unsigned long mtype_cap)
906 char *p = buf;
907 int bit_idx;
909 for (bit_idx = 0; bit_idx < 8 * sizeof(mtype_cap); bit_idx++) {
910 if ((mtype_cap >> bit_idx) & 0x1)
911 p += sprintf(p, "%s ", mem_types[bit_idx]);
914 return p - buf;
917 static ssize_t mci_supported_mem_type_show(struct mem_ctl_info *mci, char *data)
919 char *p = data;
921 p += mci_output_mtype_cap(p,mci->mtype_cap);
922 p += sprintf(p, "\n");
924 return p - data;
927 static ssize_t mci_size_mb_show(struct mem_ctl_info *mci, char *data)
929 int total_pages, csrow_idx;
931 for (total_pages = csrow_idx = 0; csrow_idx < mci->nr_csrows;
932 csrow_idx++) {
933 struct csrow_info *csrow = &mci->csrows[csrow_idx];
935 if (!csrow->nr_pages)
936 continue;
937 total_pages += csrow->nr_pages;
940 return sprintf(data,"%u\n", PAGES_TO_MiB(total_pages));
943 struct mcidev_attribute {
944 struct attribute attr;
945 ssize_t (*show)(struct mem_ctl_info *,char *);
946 ssize_t (*store)(struct mem_ctl_info *, const char *,size_t);
949 #define to_mci(k) container_of(k, struct mem_ctl_info, edac_mci_kobj)
950 #define to_mcidev_attr(a) container_of(a, struct mcidev_attribute, attr)
952 static ssize_t mcidev_show(struct kobject *kobj, struct attribute *attr,
953 char *buffer)
955 struct mem_ctl_info *mem_ctl_info = to_mci(kobj);
956 struct mcidev_attribute * mcidev_attr = to_mcidev_attr(attr);
958 if (mcidev_attr->show)
959 return mcidev_attr->show(mem_ctl_info, buffer);
960 return -EIO;
963 static ssize_t mcidev_store(struct kobject *kobj, struct attribute *attr,
964 const char *buffer, size_t count)
966 struct mem_ctl_info *mem_ctl_info = to_mci(kobj);
967 struct mcidev_attribute * mcidev_attr = to_mcidev_attr(attr);
969 if (mcidev_attr->store)
970 return mcidev_attr->store(mem_ctl_info, buffer, count);
971 return -EIO;
974 static struct sysfs_ops mci_ops = {
975 .show = mcidev_show,
976 .store = mcidev_store
979 #define MCIDEV_ATTR(_name,_mode,_show,_store) \
980 struct mcidev_attribute mci_attr_##_name = { \
981 .attr = {.name = __stringify(_name), .mode = _mode }, \
982 .show = _show, \
983 .store = _store, \
986 /* Control file */
987 MCIDEV_ATTR(reset_counters,S_IWUSR,NULL,mci_reset_counters_store);
989 /* Attribute files */
990 MCIDEV_ATTR(mc_name,S_IRUGO,mci_ctl_name_show,NULL);
991 MCIDEV_ATTR(module_name,S_IRUGO,mci_mod_name_show,NULL);
992 MCIDEV_ATTR(edac_capability,S_IRUGO,mci_edac_capability_show,NULL);
993 MCIDEV_ATTR(size_mb,S_IRUGO,mci_size_mb_show,NULL);
994 MCIDEV_ATTR(seconds_since_reset,S_IRUGO,mci_seconds_show,NULL);
995 MCIDEV_ATTR(ue_noinfo_count,S_IRUGO,mci_ue_noinfo_show,NULL);
996 MCIDEV_ATTR(ce_noinfo_count,S_IRUGO,mci_ce_noinfo_show,NULL);
997 MCIDEV_ATTR(ue_count,S_IRUGO,mci_ue_count_show,NULL);
998 MCIDEV_ATTR(ce_count,S_IRUGO,mci_ce_count_show,NULL);
999 MCIDEV_ATTR(edac_current_capability,S_IRUGO,
1000 mci_edac_current_capability_show,NULL);
1001 MCIDEV_ATTR(supported_mem_type,S_IRUGO,
1002 mci_supported_mem_type_show,NULL);
1005 static struct mcidev_attribute *mci_attr[] = {
1006 &mci_attr_reset_counters,
1007 &mci_attr_module_name,
1008 &mci_attr_mc_name,
1009 &mci_attr_edac_capability,
1010 &mci_attr_edac_current_capability,
1011 &mci_attr_supported_mem_type,
1012 &mci_attr_size_mb,
1013 &mci_attr_seconds_since_reset,
1014 &mci_attr_ue_noinfo_count,
1015 &mci_attr_ce_noinfo_count,
1016 &mci_attr_ue_count,
1017 &mci_attr_ce_count,
1018 NULL
1023 * Release of a MC controlling instance
1025 static void edac_mci_instance_release(struct kobject *kobj)
1027 struct mem_ctl_info *mci;
1028 mci = container_of(kobj,struct mem_ctl_info,edac_mci_kobj);
1030 debugf0("MC: " __FILE__ ": %s() idx=%d calling kfree\n",
1031 __func__, mci->mc_idx);
1033 kfree(mci);
1036 static struct kobj_type ktype_mci = {
1037 .release = edac_mci_instance_release,
1038 .sysfs_ops = &mci_ops,
1039 .default_attrs = (struct attribute **) mci_attr,
1042 #define EDAC_DEVICE_SYMLINK "device"
1045 * Create a new Memory Controller kobject instance,
1046 * mc<id> under the 'mc' directory
1048 * Return:
1049 * 0 Success
1050 * !0 Failure
1052 static int edac_create_sysfs_mci_device(struct mem_ctl_info *mci)
1054 int i;
1055 int err;
1056 struct csrow_info *csrow;
1057 struct kobject *edac_mci_kobj=&mci->edac_mci_kobj;
1059 debugf0("MC: " __FILE__ ": %s() idx=%d\n", __func__, mci->mc_idx);
1061 memset(edac_mci_kobj, 0, sizeof(*edac_mci_kobj));
1062 kobject_init(edac_mci_kobj);
1064 /* set the name of the mc<id> object */
1065 err = kobject_set_name(edac_mci_kobj,"mc%d",mci->mc_idx);
1066 if (err)
1067 return err;
1069 /* link to our parent the '..../edac/mc' object */
1070 edac_mci_kobj->parent = &edac_memctrl_kobj;
1071 edac_mci_kobj->ktype = &ktype_mci;
1073 /* register the mc<id> kobject */
1074 err = kobject_register(edac_mci_kobj);
1075 if (err)
1076 return err;
1078 /* create a symlink for the device */
1079 err = sysfs_create_link(edac_mci_kobj, &mci->pdev->dev.kobj,
1080 EDAC_DEVICE_SYMLINK);
1081 if (err) {
1082 kobject_unregister(edac_mci_kobj);
1083 return err;
1086 /* Make directories for each CSROW object
1087 * under the mc<id> kobject
1089 for (i = 0; i < mci->nr_csrows; i++) {
1091 csrow = &mci->csrows[i];
1093 /* Only expose populated CSROWs */
1094 if (csrow->nr_pages > 0) {
1095 err = edac_create_csrow_object(edac_mci_kobj,csrow,i);
1096 if (err)
1097 goto fail;
1101 /* Mark this MCI instance as having sysfs entries */
1102 mci->sysfs_active = MCI_SYSFS_ACTIVE;
1104 return 0;
1107 /* CSROW error: backout what has already been registered, */
1108 fail:
1109 for ( i--; i >= 0; i--) {
1110 if (csrow->nr_pages > 0) {
1111 kobject_unregister(&mci->csrows[i].kobj);
1112 kobject_put(&mci->csrows[i].kobj);
1116 kobject_unregister(edac_mci_kobj);
1117 kobject_put(edac_mci_kobj);
1119 return err;
1123 * remove a Memory Controller instance
1125 static void edac_remove_sysfs_mci_device(struct mem_ctl_info *mci)
1127 int i;
1129 debugf0("MC: " __FILE__ ": %s()\n", __func__);
1131 /* remove all csrow kobjects */
1132 for (i = 0; i < mci->nr_csrows; i++) {
1133 if (mci->csrows[i].nr_pages > 0) {
1134 kobject_unregister(&mci->csrows[i].kobj);
1135 kobject_put(&mci->csrows[i].kobj);
1139 sysfs_remove_link(&mci->edac_mci_kobj, EDAC_DEVICE_SYMLINK);
1141 kobject_unregister(&mci->edac_mci_kobj);
1142 kobject_put(&mci->edac_mci_kobj);
1145 /* END OF sysfs data and methods */
1147 #ifdef CONFIG_EDAC_DEBUG
1149 EXPORT_SYMBOL(edac_mc_dump_channel);
1151 void edac_mc_dump_channel(struct channel_info *chan)
1153 debugf4("\tchannel = %p\n", chan);
1154 debugf4("\tchannel->chan_idx = %d\n", chan->chan_idx);
1155 debugf4("\tchannel->ce_count = %d\n", chan->ce_count);
1156 debugf4("\tchannel->label = '%s'\n", chan->label);
1157 debugf4("\tchannel->csrow = %p\n\n", chan->csrow);
1161 EXPORT_SYMBOL(edac_mc_dump_csrow);
1163 void edac_mc_dump_csrow(struct csrow_info *csrow)
1165 debugf4("\tcsrow = %p\n", csrow);
1166 debugf4("\tcsrow->csrow_idx = %d\n", csrow->csrow_idx);
1167 debugf4("\tcsrow->first_page = 0x%lx\n",
1168 csrow->first_page);
1169 debugf4("\tcsrow->last_page = 0x%lx\n", csrow->last_page);
1170 debugf4("\tcsrow->page_mask = 0x%lx\n", csrow->page_mask);
1171 debugf4("\tcsrow->nr_pages = 0x%x\n", csrow->nr_pages);
1172 debugf4("\tcsrow->nr_channels = %d\n",
1173 csrow->nr_channels);
1174 debugf4("\tcsrow->channels = %p\n", csrow->channels);
1175 debugf4("\tcsrow->mci = %p\n\n", csrow->mci);
1179 EXPORT_SYMBOL(edac_mc_dump_mci);
1181 void edac_mc_dump_mci(struct mem_ctl_info *mci)
1183 debugf3("\tmci = %p\n", mci);
1184 debugf3("\tmci->mtype_cap = %lx\n", mci->mtype_cap);
1185 debugf3("\tmci->edac_ctl_cap = %lx\n", mci->edac_ctl_cap);
1186 debugf3("\tmci->edac_cap = %lx\n", mci->edac_cap);
1187 debugf4("\tmci->edac_check = %p\n", mci->edac_check);
1188 debugf3("\tmci->nr_csrows = %d, csrows = %p\n",
1189 mci->nr_csrows, mci->csrows);
1190 debugf3("\tpdev = %p\n", mci->pdev);
1191 debugf3("\tmod_name:ctl_name = %s:%s\n",
1192 mci->mod_name, mci->ctl_name);
1193 debugf3("\tpvt_info = %p\n\n", mci->pvt_info);
1197 #endif /* CONFIG_EDAC_DEBUG */
1199 /* 'ptr' points to a possibly unaligned item X such that sizeof(X) is 'size'.
1200 * Adjust 'ptr' so that its alignment is at least as stringent as what the
1201 * compiler would provide for X and return the aligned result.
1203 * If 'size' is a constant, the compiler will optimize this whole function
1204 * down to either a no-op or the addition of a constant to the value of 'ptr'.
1206 static inline char * align_ptr (void *ptr, unsigned size)
1208 unsigned align, r;
1210 /* Here we assume that the alignment of a "long long" is the most
1211 * stringent alignment that the compiler will ever provide by default.
1212 * As far as I know, this is a reasonable assumption.
1214 if (size > sizeof(long))
1215 align = sizeof(long long);
1216 else if (size > sizeof(int))
1217 align = sizeof(long);
1218 else if (size > sizeof(short))
1219 align = sizeof(int);
1220 else if (size > sizeof(char))
1221 align = sizeof(short);
1222 else
1223 return (char *) ptr;
1225 r = size % align;
1227 if (r == 0)
1228 return (char *) ptr;
1230 return (char *) (((unsigned long) ptr) + align - r);
1234 EXPORT_SYMBOL(edac_mc_alloc);
1237 * edac_mc_alloc: Allocate a struct mem_ctl_info structure
1238 * @size_pvt: size of private storage needed
1239 * @nr_csrows: Number of CWROWS needed for this MC
1240 * @nr_chans: Number of channels for the MC
1242 * Everything is kmalloc'ed as one big chunk - more efficient.
1243 * Only can be used if all structures have the same lifetime - otherwise
1244 * you have to allocate and initialize your own structures.
1246 * Use edac_mc_free() to free mc structures allocated by this function.
1248 * Returns:
1249 * NULL allocation failed
1250 * struct mem_ctl_info pointer
1252 struct mem_ctl_info *edac_mc_alloc(unsigned sz_pvt, unsigned nr_csrows,
1253 unsigned nr_chans)
1255 struct mem_ctl_info *mci;
1256 struct csrow_info *csi, *csrow;
1257 struct channel_info *chi, *chp, *chan;
1258 void *pvt;
1259 unsigned size;
1260 int row, chn;
1262 /* Figure out the offsets of the various items from the start of an mc
1263 * structure. We want the alignment of each item to be at least as
1264 * stringent as what the compiler would provide if we could simply
1265 * hardcode everything into a single struct.
1267 mci = (struct mem_ctl_info *) 0;
1268 csi = (struct csrow_info *)align_ptr(&mci[1], sizeof(*csi));
1269 chi = (struct channel_info *)
1270 align_ptr(&csi[nr_csrows], sizeof(*chi));
1271 pvt = align_ptr(&chi[nr_chans * nr_csrows], sz_pvt);
1272 size = ((unsigned long) pvt) + sz_pvt;
1274 if ((mci = kmalloc(size, GFP_KERNEL)) == NULL)
1275 return NULL;
1277 /* Adjust pointers so they point within the memory we just allocated
1278 * rather than an imaginary chunk of memory located at address 0.
1280 csi = (struct csrow_info *) (((char *) mci) + ((unsigned long) csi));
1281 chi = (struct channel_info *) (((char *) mci) + ((unsigned long) chi));
1282 pvt = sz_pvt ? (((char *) mci) + ((unsigned long) pvt)) : NULL;
1284 memset(mci, 0, size); /* clear all fields */
1286 mci->csrows = csi;
1287 mci->pvt_info = pvt;
1288 mci->nr_csrows = nr_csrows;
1290 for (row = 0; row < nr_csrows; row++) {
1291 csrow = &csi[row];
1292 csrow->csrow_idx = row;
1293 csrow->mci = mci;
1294 csrow->nr_channels = nr_chans;
1295 chp = &chi[row * nr_chans];
1296 csrow->channels = chp;
1298 for (chn = 0; chn < nr_chans; chn++) {
1299 chan = &chp[chn];
1300 chan->chan_idx = chn;
1301 chan->csrow = csrow;
1305 return mci;
1309 EXPORT_SYMBOL(edac_mc_free);
1312 * edac_mc_free: Free a previously allocated 'mci' structure
1313 * @mci: pointer to a struct mem_ctl_info structure
1315 * Free up a previously allocated mci structure
1316 * A MCI structure can be in 2 states after being allocated
1317 * by edac_mc_alloc().
1318 * 1) Allocated in a MC driver's probe, but not yet committed
1319 * 2) Allocated and committed, by a call to edac_mc_add_mc()
1320 * edac_mc_add_mc() is the function that adds the sysfs entries
1321 * thus, this free function must determine which state the 'mci'
1322 * structure is in, then either free it directly or
1323 * perform kobject cleanup by calling edac_remove_sysfs_mci_device().
1325 * VOID Return
1327 void edac_mc_free(struct mem_ctl_info *mci)
1329 /* only if sysfs entries for this mci instance exist
1330 * do we remove them and defer the actual kfree via
1331 * the kobject 'release()' callback.
1333 * Otherwise, do a straight kfree now.
1335 if (mci->sysfs_active == MCI_SYSFS_ACTIVE)
1336 edac_remove_sysfs_mci_device(mci);
1337 else
1338 kfree(mci);
1343 EXPORT_SYMBOL(edac_mc_find_mci_by_pdev);
1345 struct mem_ctl_info *edac_mc_find_mci_by_pdev(struct pci_dev *pdev)
1347 struct mem_ctl_info *mci;
1348 struct list_head *item;
1350 debugf3("MC: " __FILE__ ": %s()\n", __func__);
1352 list_for_each(item, &mc_devices) {
1353 mci = list_entry(item, struct mem_ctl_info, link);
1355 if (mci->pdev == pdev)
1356 return mci;
1359 return NULL;
1362 static int add_mc_to_global_list (struct mem_ctl_info *mci)
1364 struct list_head *item, *insert_before;
1365 struct mem_ctl_info *p;
1366 int i;
1368 if (list_empty(&mc_devices)) {
1369 mci->mc_idx = 0;
1370 insert_before = &mc_devices;
1371 } else {
1372 if (edac_mc_find_mci_by_pdev(mci->pdev)) {
1373 printk(KERN_WARNING
1374 "EDAC MC: %s (%s) %s %s already assigned %d\n",
1375 mci->pdev->dev.bus_id, pci_name(mci->pdev),
1376 mci->mod_name, mci->ctl_name, mci->mc_idx);
1377 return 1;
1380 insert_before = NULL;
1381 i = 0;
1383 list_for_each(item, &mc_devices) {
1384 p = list_entry(item, struct mem_ctl_info, link);
1386 if (p->mc_idx != i) {
1387 insert_before = item;
1388 break;
1391 i++;
1394 mci->mc_idx = i;
1396 if (insert_before == NULL)
1397 insert_before = &mc_devices;
1400 list_add_tail_rcu(&mci->link, insert_before);
1401 return 0;
1406 EXPORT_SYMBOL(edac_mc_add_mc);
1409 * edac_mc_add_mc: Insert the 'mci' structure into the mci global list
1410 * @mci: pointer to the mci structure to be added to the list
1412 * Return:
1413 * 0 Success
1414 * !0 Failure
1417 /* FIXME - should a warning be printed if no error detection? correction? */
1418 int edac_mc_add_mc(struct mem_ctl_info *mci)
1420 int rc = 1;
1422 debugf0("MC: " __FILE__ ": %s()\n", __func__);
1423 #ifdef CONFIG_EDAC_DEBUG
1424 if (edac_debug_level >= 3)
1425 edac_mc_dump_mci(mci);
1426 if (edac_debug_level >= 4) {
1427 int i;
1429 for (i = 0; i < mci->nr_csrows; i++) {
1430 int j;
1431 edac_mc_dump_csrow(&mci->csrows[i]);
1432 for (j = 0; j < mci->csrows[i].nr_channels; j++)
1433 edac_mc_dump_channel(&mci->csrows[i].
1434 channels[j]);
1437 #endif
1438 down(&mem_ctls_mutex);
1440 if (add_mc_to_global_list(mci))
1441 goto finish;
1443 /* set load time so that error rate can be tracked */
1444 mci->start_time = jiffies;
1446 if (edac_create_sysfs_mci_device(mci)) {
1447 printk(KERN_WARNING
1448 "EDAC MC%d: failed to create sysfs device\n",
1449 mci->mc_idx);
1450 /* FIXME - should there be an error code and unwind? */
1451 goto finish;
1454 /* Report action taken */
1455 printk(KERN_INFO
1456 "EDAC MC%d: Giving out device to %s %s: PCI %s\n",
1457 mci->mc_idx, mci->mod_name, mci->ctl_name,
1458 pci_name(mci->pdev));
1461 rc = 0;
1463 finish:
1464 up(&mem_ctls_mutex);
1465 return rc;
1470 static void complete_mc_list_del (struct rcu_head *head)
1472 struct mem_ctl_info *mci;
1474 mci = container_of(head, struct mem_ctl_info, rcu);
1475 INIT_LIST_HEAD(&mci->link);
1476 complete(&mci->complete);
1479 static void del_mc_from_global_list (struct mem_ctl_info *mci)
1481 list_del_rcu(&mci->link);
1482 init_completion(&mci->complete);
1483 call_rcu(&mci->rcu, complete_mc_list_del);
1484 wait_for_completion(&mci->complete);
1487 EXPORT_SYMBOL(edac_mc_del_mc);
1490 * edac_mc_del_mc: Remove the specified mci structure from global list
1491 * @mci: Pointer to struct mem_ctl_info structure
1493 * Returns:
1494 * 0 Success
1495 * 1 Failure
1497 int edac_mc_del_mc(struct mem_ctl_info *mci)
1499 int rc = 1;
1501 debugf0("MC%d: " __FILE__ ": %s()\n", mci->mc_idx, __func__);
1502 down(&mem_ctls_mutex);
1503 del_mc_from_global_list(mci);
1504 printk(KERN_INFO
1505 "EDAC MC%d: Removed device %d for %s %s: PCI %s\n",
1506 mci->mc_idx, mci->mc_idx, mci->mod_name, mci->ctl_name,
1507 pci_name(mci->pdev));
1508 rc = 0;
1509 up(&mem_ctls_mutex);
1511 return rc;
1515 EXPORT_SYMBOL(edac_mc_scrub_block);
1517 void edac_mc_scrub_block(unsigned long page, unsigned long offset,
1518 u32 size)
1520 struct page *pg;
1521 void *virt_addr;
1522 unsigned long flags = 0;
1524 debugf3("MC: " __FILE__ ": %s()\n", __func__);
1526 /* ECC error page was not in our memory. Ignore it. */
1527 if(!pfn_valid(page))
1528 return;
1530 /* Find the actual page structure then map it and fix */
1531 pg = pfn_to_page(page);
1533 if (PageHighMem(pg))
1534 local_irq_save(flags);
1536 virt_addr = kmap_atomic(pg, KM_BOUNCE_READ);
1538 /* Perform architecture specific atomic scrub operation */
1539 atomic_scrub(virt_addr + offset, size);
1541 /* Unmap and complete */
1542 kunmap_atomic(virt_addr, KM_BOUNCE_READ);
1544 if (PageHighMem(pg))
1545 local_irq_restore(flags);
1549 /* FIXME - should return -1 */
1550 EXPORT_SYMBOL(edac_mc_find_csrow_by_page);
1552 int edac_mc_find_csrow_by_page(struct mem_ctl_info *mci,
1553 unsigned long page)
1555 struct csrow_info *csrows = mci->csrows;
1556 int row, i;
1558 debugf1("MC%d: " __FILE__ ": %s(): 0x%lx\n", mci->mc_idx, __func__,
1559 page);
1560 row = -1;
1562 for (i = 0; i < mci->nr_csrows; i++) {
1563 struct csrow_info *csrow = &csrows[i];
1565 if (csrow->nr_pages == 0)
1566 continue;
1568 debugf3("MC%d: " __FILE__
1569 ": %s(): first(0x%lx) page(0x%lx)"
1570 " last(0x%lx) mask(0x%lx)\n", mci->mc_idx,
1571 __func__, csrow->first_page, page,
1572 csrow->last_page, csrow->page_mask);
1574 if ((page >= csrow->first_page) &&
1575 (page <= csrow->last_page) &&
1576 ((page & csrow->page_mask) ==
1577 (csrow->first_page & csrow->page_mask))) {
1578 row = i;
1579 break;
1583 if (row == -1)
1584 printk(KERN_ERR
1585 "EDAC MC%d: could not look up page error address %lx\n",
1586 mci->mc_idx, (unsigned long) page);
1588 return row;
1592 EXPORT_SYMBOL(edac_mc_handle_ce);
1594 /* FIXME - setable log (warning/emerg) levels */
1595 /* FIXME - integrate with evlog: http://evlog.sourceforge.net/ */
1596 void edac_mc_handle_ce(struct mem_ctl_info *mci,
1597 unsigned long page_frame_number,
1598 unsigned long offset_in_page,
1599 unsigned long syndrome, int row, int channel,
1600 const char *msg)
1602 unsigned long remapped_page;
1604 debugf3("MC%d: " __FILE__ ": %s()\n", mci->mc_idx, __func__);
1606 /* FIXME - maybe make panic on INTERNAL ERROR an option */
1607 if (row >= mci->nr_csrows || row < 0) {
1608 /* something is wrong */
1609 printk(KERN_ERR
1610 "EDAC MC%d: INTERNAL ERROR: row out of range (%d >= %d)\n",
1611 mci->mc_idx, row, mci->nr_csrows);
1612 edac_mc_handle_ce_no_info(mci, "INTERNAL ERROR");
1613 return;
1615 if (channel >= mci->csrows[row].nr_channels || channel < 0) {
1616 /* something is wrong */
1617 printk(KERN_ERR
1618 "EDAC MC%d: INTERNAL ERROR: channel out of range "
1619 "(%d >= %d)\n",
1620 mci->mc_idx, channel, mci->csrows[row].nr_channels);
1621 edac_mc_handle_ce_no_info(mci, "INTERNAL ERROR");
1622 return;
1625 if (log_ce)
1626 /* FIXME - put in DIMM location */
1627 printk(KERN_WARNING
1628 "EDAC MC%d: CE page 0x%lx, offset 0x%lx,"
1629 " grain %d, syndrome 0x%lx, row %d, channel %d,"
1630 " label \"%s\": %s\n", mci->mc_idx,
1631 page_frame_number, offset_in_page,
1632 mci->csrows[row].grain, syndrome, row, channel,
1633 mci->csrows[row].channels[channel].label, msg);
1635 mci->ce_count++;
1636 mci->csrows[row].ce_count++;
1637 mci->csrows[row].channels[channel].ce_count++;
1639 if (mci->scrub_mode & SCRUB_SW_SRC) {
1641 * Some MC's can remap memory so that it is still available
1642 * at a different address when PCI devices map into memory.
1643 * MC's that can't do this lose the memory where PCI devices
1644 * are mapped. This mapping is MC dependant and so we call
1645 * back into the MC driver for it to map the MC page to
1646 * a physical (CPU) page which can then be mapped to a virtual
1647 * page - which can then be scrubbed.
1649 remapped_page = mci->ctl_page_to_phys ?
1650 mci->ctl_page_to_phys(mci, page_frame_number) :
1651 page_frame_number;
1653 edac_mc_scrub_block(remapped_page, offset_in_page,
1654 mci->csrows[row].grain);
1659 EXPORT_SYMBOL(edac_mc_handle_ce_no_info);
1661 void edac_mc_handle_ce_no_info(struct mem_ctl_info *mci,
1662 const char *msg)
1664 if (log_ce)
1665 printk(KERN_WARNING
1666 "EDAC MC%d: CE - no information available: %s\n",
1667 mci->mc_idx, msg);
1668 mci->ce_noinfo_count++;
1669 mci->ce_count++;
1673 EXPORT_SYMBOL(edac_mc_handle_ue);
1675 void edac_mc_handle_ue(struct mem_ctl_info *mci,
1676 unsigned long page_frame_number,
1677 unsigned long offset_in_page, int row,
1678 const char *msg)
1680 int len = EDAC_MC_LABEL_LEN * 4;
1681 char labels[len + 1];
1682 char *pos = labels;
1683 int chan;
1684 int chars;
1686 debugf3("MC%d: " __FILE__ ": %s()\n", mci->mc_idx, __func__);
1688 /* FIXME - maybe make panic on INTERNAL ERROR an option */
1689 if (row >= mci->nr_csrows || row < 0) {
1690 /* something is wrong */
1691 printk(KERN_ERR
1692 "EDAC MC%d: INTERNAL ERROR: row out of range (%d >= %d)\n",
1693 mci->mc_idx, row, mci->nr_csrows);
1694 edac_mc_handle_ue_no_info(mci, "INTERNAL ERROR");
1695 return;
1698 chars = snprintf(pos, len + 1, "%s",
1699 mci->csrows[row].channels[0].label);
1700 len -= chars;
1701 pos += chars;
1702 for (chan = 1; (chan < mci->csrows[row].nr_channels) && (len > 0);
1703 chan++) {
1704 chars = snprintf(pos, len + 1, ":%s",
1705 mci->csrows[row].channels[chan].label);
1706 len -= chars;
1707 pos += chars;
1710 if (log_ue)
1711 printk(KERN_EMERG
1712 "EDAC MC%d: UE page 0x%lx, offset 0x%lx, grain %d, row %d,"
1713 " labels \"%s\": %s\n", mci->mc_idx,
1714 page_frame_number, offset_in_page,
1715 mci->csrows[row].grain, row, labels, msg);
1717 if (panic_on_ue)
1718 panic
1719 ("EDAC MC%d: UE page 0x%lx, offset 0x%lx, grain %d, row %d,"
1720 " labels \"%s\": %s\n", mci->mc_idx,
1721 page_frame_number, offset_in_page,
1722 mci->csrows[row].grain, row, labels, msg);
1724 mci->ue_count++;
1725 mci->csrows[row].ue_count++;
1729 EXPORT_SYMBOL(edac_mc_handle_ue_no_info);
1731 void edac_mc_handle_ue_no_info(struct mem_ctl_info *mci,
1732 const char *msg)
1734 if (panic_on_ue)
1735 panic("EDAC MC%d: Uncorrected Error", mci->mc_idx);
1737 if (log_ue)
1738 printk(KERN_WARNING
1739 "EDAC MC%d: UE - no information available: %s\n",
1740 mci->mc_idx, msg);
1741 mci->ue_noinfo_count++;
1742 mci->ue_count++;
1746 #ifdef CONFIG_PCI
1748 static u16 get_pci_parity_status(struct pci_dev *dev, int secondary)
1750 int where;
1751 u16 status;
1753 where = secondary ? PCI_SEC_STATUS : PCI_STATUS;
1754 pci_read_config_word(dev, where, &status);
1756 /* If we get back 0xFFFF then we must suspect that the card has been pulled but
1757 the Linux PCI layer has not yet finished cleaning up. We don't want to report
1758 on such devices */
1760 if (status == 0xFFFF) {
1761 u32 sanity;
1762 pci_read_config_dword(dev, 0, &sanity);
1763 if (sanity == 0xFFFFFFFF)
1764 return 0;
1766 status &= PCI_STATUS_DETECTED_PARITY | PCI_STATUS_SIG_SYSTEM_ERROR |
1767 PCI_STATUS_PARITY;
1769 if (status)
1770 /* reset only the bits we are interested in */
1771 pci_write_config_word(dev, where, status);
1773 return status;
1776 typedef void (*pci_parity_check_fn_t) (struct pci_dev *dev);
1778 /* Clear any PCI parity errors logged by this device. */
1779 static void edac_pci_dev_parity_clear( struct pci_dev *dev )
1781 u8 header_type;
1783 get_pci_parity_status(dev, 0);
1785 /* read the device TYPE, looking for bridges */
1786 pci_read_config_byte(dev, PCI_HEADER_TYPE, &header_type);
1788 if ((header_type & 0x7F) == PCI_HEADER_TYPE_BRIDGE)
1789 get_pci_parity_status(dev, 1);
1793 * PCI Parity polling
1796 static void edac_pci_dev_parity_test(struct pci_dev *dev)
1798 u16 status;
1799 u8 header_type;
1801 /* read the STATUS register on this device
1803 status = get_pci_parity_status(dev, 0);
1805 debugf2("PCI STATUS= 0x%04x %s\n", status, dev->dev.bus_id );
1807 /* check the status reg for errors */
1808 if (status) {
1809 if (status & (PCI_STATUS_SIG_SYSTEM_ERROR))
1810 printk(KERN_CRIT
1811 "EDAC PCI- "
1812 "Signaled System Error on %s\n",
1813 pci_name (dev));
1815 if (status & (PCI_STATUS_PARITY)) {
1816 printk(KERN_CRIT
1817 "EDAC PCI- "
1818 "Master Data Parity Error on %s\n",
1819 pci_name (dev));
1821 atomic_inc(&pci_parity_count);
1824 if (status & (PCI_STATUS_DETECTED_PARITY)) {
1825 printk(KERN_CRIT
1826 "EDAC PCI- "
1827 "Detected Parity Error on %s\n",
1828 pci_name (dev));
1830 atomic_inc(&pci_parity_count);
1834 /* read the device TYPE, looking for bridges */
1835 pci_read_config_byte(dev, PCI_HEADER_TYPE, &header_type);
1837 debugf2("PCI HEADER TYPE= 0x%02x %s\n", header_type, dev->dev.bus_id );
1839 if ((header_type & 0x7F) == PCI_HEADER_TYPE_BRIDGE) {
1840 /* On bridges, need to examine secondary status register */
1841 status = get_pci_parity_status(dev, 1);
1843 debugf2("PCI SEC_STATUS= 0x%04x %s\n",
1844 status, dev->dev.bus_id );
1846 /* check the secondary status reg for errors */
1847 if (status) {
1848 if (status & (PCI_STATUS_SIG_SYSTEM_ERROR))
1849 printk(KERN_CRIT
1850 "EDAC PCI-Bridge- "
1851 "Signaled System Error on %s\n",
1852 pci_name (dev));
1854 if (status & (PCI_STATUS_PARITY)) {
1855 printk(KERN_CRIT
1856 "EDAC PCI-Bridge- "
1857 "Master Data Parity Error on %s\n",
1858 pci_name (dev));
1860 atomic_inc(&pci_parity_count);
1863 if (status & (PCI_STATUS_DETECTED_PARITY)) {
1864 printk(KERN_CRIT
1865 "EDAC PCI-Bridge- "
1866 "Detected Parity Error on %s\n",
1867 pci_name (dev));
1869 atomic_inc(&pci_parity_count);
1876 * check_dev_on_list: Scan for a PCI device on a white/black list
1877 * @list: an EDAC &edac_pci_device_list white/black list pointer
1878 * @free_index: index of next free entry on the list
1879 * @pci_dev: PCI Device pointer
1881 * see if list contains the device.
1883 * Returns: 0 not found
1884 * 1 found on list
1886 static int check_dev_on_list(struct edac_pci_device_list *list, int free_index,
1887 struct pci_dev *dev)
1889 int i;
1890 int rc = 0; /* Assume not found */
1891 unsigned short vendor=dev->vendor;
1892 unsigned short device=dev->device;
1894 /* Scan the list, looking for a vendor/device match
1896 for (i = 0; i < free_index; i++, list++ ) {
1897 if ( (list->vendor == vendor ) &&
1898 (list->device == device )) {
1899 rc = 1;
1900 break;
1904 return rc;
1908 * pci_dev parity list iterator
1909 * Scan the PCI device list for one iteration, looking for SERRORs
1910 * Master Parity ERRORS or Parity ERRORs on primary or secondary devices
1912 static inline void edac_pci_dev_parity_iterator(pci_parity_check_fn_t fn)
1914 struct pci_dev *dev=NULL;
1916 /* request for kernel access to the next PCI device, if any,
1917 * and while we are looking at it have its reference count
1918 * bumped until we are done with it
1920 while((dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) {
1922 /* if whitelist exists then it has priority, so only scan those
1923 * devices on the whitelist
1925 if (pci_whitelist_count > 0 ) {
1926 if (check_dev_on_list(pci_whitelist,
1927 pci_whitelist_count, dev))
1928 fn(dev);
1929 } else {
1931 * if no whitelist, then check if this devices is
1932 * blacklisted
1934 if (!check_dev_on_list(pci_blacklist,
1935 pci_blacklist_count, dev))
1936 fn(dev);
1941 static void do_pci_parity_check(void)
1943 unsigned long flags;
1944 int before_count;
1946 debugf3("MC: " __FILE__ ": %s()\n", __func__);
1948 if (!check_pci_parity)
1949 return;
1951 before_count = atomic_read(&pci_parity_count);
1953 /* scan all PCI devices looking for a Parity Error on devices and
1954 * bridges
1956 local_irq_save(flags);
1957 edac_pci_dev_parity_iterator(edac_pci_dev_parity_test);
1958 local_irq_restore(flags);
1960 /* Only if operator has selected panic on PCI Error */
1961 if (panic_on_pci_parity) {
1962 /* If the count is different 'after' from 'before' */
1963 if (before_count != atomic_read(&pci_parity_count))
1964 panic("EDAC: PCI Parity Error");
1969 static inline void clear_pci_parity_errors(void)
1971 /* Clear any PCI bus parity errors that devices initially have logged
1972 * in their registers.
1974 edac_pci_dev_parity_iterator(edac_pci_dev_parity_clear);
1978 #else /* CONFIG_PCI */
1981 static inline void do_pci_parity_check(void)
1983 /* no-op */
1987 static inline void clear_pci_parity_errors(void)
1989 /* no-op */
1993 #endif /* CONFIG_PCI */
1996 * Iterate over all MC instances and check for ECC, et al, errors
1998 static inline void check_mc_devices (void)
2000 unsigned long flags;
2001 struct list_head *item;
2002 struct mem_ctl_info *mci;
2004 debugf3("MC: " __FILE__ ": %s()\n", __func__);
2006 /* during poll, have interrupts off */
2007 local_irq_save(flags);
2009 list_for_each(item, &mc_devices) {
2010 mci = list_entry(item, struct mem_ctl_info, link);
2012 if (mci->edac_check != NULL)
2013 mci->edac_check(mci);
2016 local_irq_restore(flags);
2021 * Check MC status every poll_msec.
2022 * Check PCI status every poll_msec as well.
2024 * This where the work gets done for edac.
2026 * SMP safe, doesn't use NMI, and auto-rate-limits.
2028 static void do_edac_check(void)
2031 debugf3("MC: " __FILE__ ": %s()\n", __func__);
2033 check_mc_devices();
2035 do_pci_parity_check();
2040 * EDAC thread state information
2042 struct bs_thread_info
2044 struct task_struct *task;
2045 struct completion *event;
2046 char *name;
2047 void (*run)(void);
2050 static struct bs_thread_info bs_thread;
2053 * edac_kernel_thread
2054 * This the kernel thread that processes edac operations
2055 * in a normal thread environment
2057 static int edac_kernel_thread(void *arg)
2059 struct bs_thread_info *thread = (struct bs_thread_info *) arg;
2061 /* detach thread */
2062 daemonize(thread->name);
2064 current->exit_signal = SIGCHLD;
2065 allow_signal(SIGKILL);
2066 thread->task = current;
2068 /* indicate to starting task we have started */
2069 complete(thread->event);
2071 /* loop forever, until we are told to stop */
2072 while(thread->run != NULL) {
2073 void (*run)(void);
2075 /* call the function to check the memory controllers */
2076 run = thread->run;
2077 if (run)
2078 run();
2080 if (signal_pending(current))
2081 flush_signals(current);
2083 /* ensure we are interruptable */
2084 set_current_state(TASK_INTERRUPTIBLE);
2086 /* goto sleep for the interval */
2087 schedule_timeout((HZ * poll_msec) / 1000);
2088 try_to_freeze();
2091 /* notify waiter that we are exiting */
2092 complete(thread->event);
2094 return 0;
2098 * edac_mc_init
2099 * module initialization entry point
2101 static int __init edac_mc_init(void)
2103 int ret;
2104 struct completion event;
2106 printk(KERN_INFO "MC: " __FILE__ " version " EDAC_MC_VERSION "\n");
2109 * Harvest and clear any boot/initialization PCI parity errors
2111 * FIXME: This only clears errors logged by devices present at time of
2112 * module initialization. We should also do an initial clear
2113 * of each newly hotplugged device.
2115 clear_pci_parity_errors();
2117 /* perform check for first time to harvest boot leftovers */
2118 do_edac_check();
2120 /* Create the MC sysfs entires */
2121 if (edac_sysfs_memctrl_setup()) {
2122 printk(KERN_ERR "EDAC MC: Error initializing sysfs code\n");
2123 return -ENODEV;
2126 /* Create the PCI parity sysfs entries */
2127 if (edac_sysfs_pci_setup()) {
2128 edac_sysfs_memctrl_teardown();
2129 printk(KERN_ERR "EDAC PCI: Error initializing sysfs code\n");
2130 return -ENODEV;
2133 /* Create our kernel thread */
2134 init_completion(&event);
2135 bs_thread.event = &event;
2136 bs_thread.name = "kedac";
2137 bs_thread.run = do_edac_check;
2139 /* create our kernel thread */
2140 ret = kernel_thread(edac_kernel_thread, &bs_thread, CLONE_KERNEL);
2141 if (ret < 0) {
2142 /* remove the sysfs entries */
2143 edac_sysfs_memctrl_teardown();
2144 edac_sysfs_pci_teardown();
2145 return -ENOMEM;
2148 /* wait for our kernel theard ack that it is up and running */
2149 wait_for_completion(&event);
2151 return 0;
2156 * edac_mc_exit()
2157 * module exit/termination functioni
2159 static void __exit edac_mc_exit(void)
2161 struct completion event;
2163 debugf0("MC: " __FILE__ ": %s()\n", __func__);
2165 init_completion(&event);
2166 bs_thread.event = &event;
2168 /* As soon as ->run is set to NULL, the task could disappear,
2169 * so we need to hold tasklist_lock until we have sent the signal
2171 read_lock(&tasklist_lock);
2172 bs_thread.run = NULL;
2173 send_sig(SIGKILL, bs_thread.task, 1);
2174 read_unlock(&tasklist_lock);
2175 wait_for_completion(&event);
2177 /* tear down the sysfs device */
2178 edac_sysfs_memctrl_teardown();
2179 edac_sysfs_pci_teardown();
2185 module_init(edac_mc_init);
2186 module_exit(edac_mc_exit);
2188 MODULE_LICENSE("GPL");
2189 MODULE_AUTHOR("Linux Networx (http://lnxi.com) Thayne Harbaugh et al\n"
2190 "Based on.work by Dan Hollis et al");
2191 MODULE_DESCRIPTION("Core library routines for MC reporting");
2193 module_param(panic_on_ue, int, 0644);
2194 MODULE_PARM_DESC(panic_on_ue, "Panic on uncorrected error: 0=off 1=on");
2195 module_param(check_pci_parity, int, 0644);
2196 MODULE_PARM_DESC(check_pci_parity, "Check for PCI bus parity errors: 0=off 1=on");
2197 module_param(panic_on_pci_parity, int, 0644);
2198 MODULE_PARM_DESC(panic_on_pci_parity, "Panic on PCI Bus Parity error: 0=off 1=on");
2199 module_param(log_ue, int, 0644);
2200 MODULE_PARM_DESC(log_ue, "Log uncorrectable error to console: 0=off 1=on");
2201 module_param(log_ce, int, 0644);
2202 MODULE_PARM_DESC(log_ce, "Log correctable error to console: 0=off 1=on");
2203 module_param(poll_msec, int, 0644);
2204 MODULE_PARM_DESC(poll_msec, "Polling period in milliseconds");
2205 #ifdef CONFIG_EDAC_DEBUG
2206 module_param(edac_debug_level, int, 0644);
2207 MODULE_PARM_DESC(edac_debug_level, "Debug level");
2208 #endif