diff options
-rw-r--r-- | Documentation/edac.txt | 151 | ||||
-rw-r--r-- | drivers/edac/edac_mc_sysfs.c | 117 |
2 files changed, 73 insertions, 195 deletions
diff --git a/Documentation/edac.txt b/Documentation/edac.txt index a5c36842ecef..ced527388001 100644 --- a/Documentation/edac.txt +++ b/Documentation/edac.txt | |||
@@ -222,74 +222,9 @@ both csrow2 and csrow3 are populated, this indicates a dual ranked | |||
222 | set of DIMMs for channels 0 and 1. | 222 | set of DIMMs for channels 0 and 1. |
223 | 223 | ||
224 | 224 | ||
225 | Within each of the 'mc','mcX' and 'csrowX' directories are several | 225 | Within each of the 'mcX' and 'csrowX' directories are several |
226 | EDAC control and attribute files. | 226 | EDAC control and attribute files. |
227 | 227 | ||
228 | |||
229 | ============================================================================ | ||
230 | DIRECTORY 'mc' | ||
231 | |||
232 | In directory 'mc' are EDAC system overall control and attribute files: | ||
233 | |||
234 | |||
235 | Panic on UE control file: | ||
236 | |||
237 | 'edac_mc_panic_on_ue' | ||
238 | |||
239 | An uncorrectable error will cause a machine panic. This is usually | ||
240 | desirable. It is a bad idea to continue when an uncorrectable error | ||
241 | occurs - it is indeterminate what was uncorrected and the operating | ||
242 | system context might be so mangled that continuing will lead to further | ||
243 | corruption. If the kernel has MCE configured, then EDAC will never | ||
244 | notice the UE. | ||
245 | |||
246 | LOAD TIME: module/kernel parameter: panic_on_ue=[0|1] | ||
247 | |||
248 | RUN TIME: echo "1" >/sys/devices/system/edac/mc/edac_mc_panic_on_ue | ||
249 | |||
250 | |||
251 | Log UE control file: | ||
252 | |||
253 | 'edac_mc_log_ue' | ||
254 | |||
255 | Generate kernel messages describing uncorrectable errors. These errors | ||
256 | are reported through the system message log system. UE statistics | ||
257 | will be accumulated even when UE logging is disabled. | ||
258 | |||
259 | LOAD TIME: module/kernel parameter: log_ue=[0|1] | ||
260 | |||
261 | RUN TIME: echo "1" >/sys/devices/system/edac/mc/edac_mc_log_ue | ||
262 | |||
263 | |||
264 | Log CE control file: | ||
265 | |||
266 | 'edac_mc_log_ce' | ||
267 | |||
268 | Generate kernel messages describing correctable errors. These | ||
269 | errors are reported through the system message log system. | ||
270 | CE statistics will be accumulated even when CE logging is disabled. | ||
271 | |||
272 | LOAD TIME: module/kernel parameter: log_ce=[0|1] | ||
273 | |||
274 | RUN TIME: echo "1" >/sys/devices/system/edac/mc/edac_mc_log_ce | ||
275 | |||
276 | |||
277 | Polling period control file: | ||
278 | |||
279 | 'edac_mc_poll_msec' | ||
280 | |||
281 | The time period, in milliseconds, for polling for error information. | ||
282 | Too small a value wastes resources. Too large a value might delay | ||
283 | necessary handling of errors and might loose valuable information for | ||
284 | locating the error. 1000 milliseconds (once each second) is the current | ||
285 | default. Systems which require all the bandwidth they can get, may | ||
286 | increase this. | ||
287 | |||
288 | LOAD TIME: module/kernel parameter: poll_msec=[0|1] | ||
289 | |||
290 | RUN TIME: echo "1000" >/sys/devices/system/edac/mc/edac_mc_poll_msec | ||
291 | |||
292 | |||
293 | ============================================================================ | 228 | ============================================================================ |
294 | 'mcX' DIRECTORIES | 229 | 'mcX' DIRECTORIES |
295 | 230 | ||
@@ -537,7 +472,6 @@ Channel 1 DIMM Label control file: | |||
537 | motherboard specific and determination of this information | 472 | motherboard specific and determination of this information |
538 | must occur in userland at this time. | 473 | must occur in userland at this time. |
539 | 474 | ||
540 | |||
541 | ============================================================================ | 475 | ============================================================================ |
542 | SYSTEM LOGGING | 476 | SYSTEM LOGGING |
543 | 477 | ||
@@ -570,7 +504,6 @@ error type, a notice of "no info" and then an optional, | |||
570 | driver-specific error message. | 504 | driver-specific error message. |
571 | 505 | ||
572 | 506 | ||
573 | |||
574 | ============================================================================ | 507 | ============================================================================ |
575 | PCI Bus Parity Detection | 508 | PCI Bus Parity Detection |
576 | 509 | ||
@@ -604,6 +537,74 @@ Enable/Disable PCI Parity checking control file: | |||
604 | echo "0" >/sys/devices/system/edac/pci/check_pci_parity | 537 | echo "0" >/sys/devices/system/edac/pci/check_pci_parity |
605 | 538 | ||
606 | 539 | ||
540 | Parity Count: | ||
541 | |||
542 | 'pci_parity_count' | ||
543 | |||
544 | This attribute file will display the number of parity errors that | ||
545 | have been detected. | ||
546 | |||
547 | |||
548 | ============================================================================ | ||
549 | MODULE PARAMETERS | ||
550 | |||
551 | Panic on UE control file: | ||
552 | |||
553 | 'edac_mc_panic_on_ue' | ||
554 | |||
555 | An uncorrectable error will cause a machine panic. This is usually | ||
556 | desirable. It is a bad idea to continue when an uncorrectable error | ||
557 | occurs - it is indeterminate what was uncorrected and the operating | ||
558 | system context might be so mangled that continuing will lead to further | ||
559 | corruption. If the kernel has MCE configured, then EDAC will never | ||
560 | notice the UE. | ||
561 | |||
562 | LOAD TIME: module/kernel parameter: edac_mc_panic_on_ue=[0|1] | ||
563 | |||
564 | RUN TIME: echo "1" > /sys/module/edac_core/parameters/edac_mc_panic_on_ue | ||
565 | |||
566 | |||
567 | Log UE control file: | ||
568 | |||
569 | 'edac_mc_log_ue' | ||
570 | |||
571 | Generate kernel messages describing uncorrectable errors. These errors | ||
572 | are reported through the system message log system. UE statistics | ||
573 | will be accumulated even when UE logging is disabled. | ||
574 | |||
575 | LOAD TIME: module/kernel parameter: edac_mc_log_ue=[0|1] | ||
576 | |||
577 | RUN TIME: echo "1" > /sys/module/edac_core/parameters/edac_mc_log_ue | ||
578 | |||
579 | |||
580 | Log CE control file: | ||
581 | |||
582 | 'edac_mc_log_ce' | ||
583 | |||
584 | Generate kernel messages describing correctable errors. These | ||
585 | errors are reported through the system message log system. | ||
586 | CE statistics will be accumulated even when CE logging is disabled. | ||
587 | |||
588 | LOAD TIME: module/kernel parameter: edac_mc_log_ce=[0|1] | ||
589 | |||
590 | RUN TIME: echo "1" > /sys/module/edac_core/parameters/edac_mc_log_ce | ||
591 | |||
592 | |||
593 | Polling period control file: | ||
594 | |||
595 | 'edac_mc_poll_msec' | ||
596 | |||
597 | The time period, in milliseconds, for polling for error information. | ||
598 | Too small a value wastes resources. Too large a value might delay | ||
599 | necessary handling of errors and might loose valuable information for | ||
600 | locating the error. 1000 milliseconds (once each second) is the current | ||
601 | default. Systems which require all the bandwidth they can get, may | ||
602 | increase this. | ||
603 | |||
604 | LOAD TIME: module/kernel parameter: edac_mc_poll_msec=[0|1] | ||
605 | |||
606 | RUN TIME: echo "1000" > /sys/module/edac_core/parameters/edac_mc_poll_msec | ||
607 | |||
607 | 608 | ||
608 | Panic on PCI PARITY Error: | 609 | Panic on PCI PARITY Error: |
609 | 610 | ||
@@ -614,21 +615,13 @@ Panic on PCI PARITY Error: | |||
614 | error has been detected. | 615 | error has been detected. |
615 | 616 | ||
616 | 617 | ||
617 | module/kernel parameter: panic_on_pci_parity=[0|1] | 618 | module/kernel parameter: edac_panic_on_pci_pe=[0|1] |
618 | 619 | ||
619 | Enable: | 620 | Enable: |
620 | echo "1" >/sys/devices/system/edac/pci/panic_on_pci_parity | 621 | echo "1" > /sys/module/edac_core/parameters/edac_panic_on_pci_pe |
621 | 622 | ||
622 | Disable: | 623 | Disable: |
623 | echo "0" >/sys/devices/system/edac/pci/panic_on_pci_parity | 624 | echo "0" > /sys/module/edac_core/parameters/edac_panic_on_pci_pe |
624 | |||
625 | |||
626 | Parity Count: | ||
627 | |||
628 | 'pci_parity_count' | ||
629 | |||
630 | This attribute file will display the number of parity errors that | ||
631 | have been detected. | ||
632 | 625 | ||
633 | 626 | ||
634 | 627 | ||
diff --git a/drivers/edac/edac_mc_sysfs.c b/drivers/edac/edac_mc_sysfs.c index 7bb9c1532b90..cbe1a17e42f7 100644 --- a/drivers/edac/edac_mc_sysfs.c +++ b/drivers/edac/edac_mc_sysfs.c | |||
@@ -123,16 +123,6 @@ static const char *edac_caps[] = { | |||
123 | 123 | ||
124 | 124 | ||
125 | 125 | ||
126 | /* | ||
127 | * /sys/devices/system/edac/mc; | ||
128 | * data structures and methods | ||
129 | */ | ||
130 | static ssize_t memctrl_int_show(void *ptr, char *buffer) | ||
131 | { | ||
132 | int *value = (int *)ptr; | ||
133 | return sprintf(buffer, "%u\n", *value); | ||
134 | } | ||
135 | |||
136 | static ssize_t memctrl_int_store(void *ptr, const char *buffer, size_t count) | 126 | static ssize_t memctrl_int_store(void *ptr, const char *buffer, size_t count) |
137 | { | 127 | { |
138 | int *value = (int *)ptr; | 128 | int *value = (int *)ptr; |
@@ -143,23 +133,6 @@ static ssize_t memctrl_int_store(void *ptr, const char *buffer, size_t count) | |||
143 | return count; | 133 | return count; |
144 | } | 134 | } |
145 | 135 | ||
146 | /* | ||
147 | * mc poll_msec time value | ||
148 | */ | ||
149 | static ssize_t poll_msec_int_store(void *ptr, const char *buffer, size_t count) | ||
150 | { | ||
151 | int *value = (int *)ptr; | ||
152 | |||
153 | if (isdigit(*buffer)) { | ||
154 | *value = simple_strtoul(buffer, NULL, 0); | ||
155 | |||
156 | /* notify edac_mc engine to reset the poll period */ | ||
157 | edac_mc_reset_delay_period(*value); | ||
158 | } | ||
159 | |||
160 | return count; | ||
161 | } | ||
162 | |||
163 | 136 | ||
164 | /* EDAC sysfs CSROW data structures and methods | 137 | /* EDAC sysfs CSROW data structures and methods |
165 | */ | 138 | */ |
@@ -669,98 +642,10 @@ static struct kobj_type ktype_mci = { | |||
669 | .default_attrs = (struct attribute **)mci_attr, | 642 | .default_attrs = (struct attribute **)mci_attr, |
670 | }; | 643 | }; |
671 | 644 | ||
672 | /* show/store, tables, etc for the MC kset */ | ||
673 | |||
674 | |||
675 | struct memctrl_dev_attribute { | ||
676 | struct attribute attr; | ||
677 | void *value; | ||
678 | ssize_t(*show) (void *, char *); | ||
679 | ssize_t(*store) (void *, const char *, size_t); | ||
680 | }; | ||
681 | |||
682 | /* Set of show/store abstract level functions for memory control object */ | ||
683 | static ssize_t memctrl_dev_show(struct kobject *kobj, | ||
684 | struct attribute *attr, char *buffer) | ||
685 | { | ||
686 | struct memctrl_dev_attribute *memctrl_dev; | ||
687 | memctrl_dev = (struct memctrl_dev_attribute *)attr; | ||
688 | |||
689 | if (memctrl_dev->show) | ||
690 | return memctrl_dev->show(memctrl_dev->value, buffer); | ||
691 | |||
692 | return -EIO; | ||
693 | } | ||
694 | |||
695 | static ssize_t memctrl_dev_store(struct kobject *kobj, struct attribute *attr, | ||
696 | const char *buffer, size_t count) | ||
697 | { | ||
698 | struct memctrl_dev_attribute *memctrl_dev; | ||
699 | memctrl_dev = (struct memctrl_dev_attribute *)attr; | ||
700 | |||
701 | if (memctrl_dev->store) | ||
702 | return memctrl_dev->store(memctrl_dev->value, buffer, count); | ||
703 | |||
704 | return -EIO; | ||
705 | } | ||
706 | |||
707 | static struct sysfs_ops memctrlfs_ops = { | ||
708 | .show = memctrl_dev_show, | ||
709 | .store = memctrl_dev_store | ||
710 | }; | ||
711 | |||
712 | #define MEMCTRL_ATTR(_name, _mode, _show, _store) \ | ||
713 | static struct memctrl_dev_attribute attr_##_name = { \ | ||
714 | .attr = {.name = __stringify(_name), .mode = _mode }, \ | ||
715 | .value = &_name, \ | ||
716 | .show = _show, \ | ||
717 | .store = _store, \ | ||
718 | }; | ||
719 | |||
720 | #define MEMCTRL_STRING_ATTR(_name, _data, _mode, _show, _store) \ | ||
721 | static struct memctrl_dev_attribute attr_##_name = { \ | ||
722 | .attr = {.name = __stringify(_name), .mode = _mode }, \ | ||
723 | .value = _data, \ | ||
724 | .show = _show, \ | ||
725 | .store = _store, \ | ||
726 | }; | ||
727 | |||
728 | /* csrow<id> control files */ | ||
729 | MEMCTRL_ATTR(edac_mc_panic_on_ue, | ||
730 | S_IRUGO | S_IWUSR, memctrl_int_show, memctrl_int_store); | ||
731 | |||
732 | MEMCTRL_ATTR(edac_mc_log_ue, | ||
733 | S_IRUGO | S_IWUSR, memctrl_int_show, memctrl_int_store); | ||
734 | |||
735 | MEMCTRL_ATTR(edac_mc_log_ce, | ||
736 | S_IRUGO | S_IWUSR, memctrl_int_show, memctrl_int_store); | ||
737 | |||
738 | MEMCTRL_ATTR(edac_mc_poll_msec, | ||
739 | S_IRUGO | S_IWUSR, memctrl_int_show, poll_msec_int_store); | ||
740 | |||
741 | /* Base Attributes of the memory ECC object */ | ||
742 | static struct memctrl_dev_attribute *memctrl_attr[] = { | ||
743 | &attr_edac_mc_panic_on_ue, | ||
744 | &attr_edac_mc_log_ue, | ||
745 | &attr_edac_mc_log_ce, | ||
746 | &attr_edac_mc_poll_msec, | ||
747 | NULL, | ||
748 | }; | ||
749 | |||
750 | |||
751 | /* the ktype for the mc_kset internal kobj */ | ||
752 | static struct kobj_type ktype_mc_set_attribs = { | ||
753 | .sysfs_ops = &memctrlfs_ops, | ||
754 | .default_attrs = (struct attribute **)memctrl_attr, | ||
755 | }; | ||
756 | |||
757 | /* EDAC memory controller sysfs kset: | 645 | /* EDAC memory controller sysfs kset: |
758 | * /sys/devices/system/edac/mc | 646 | * /sys/devices/system/edac/mc |
759 | */ | 647 | */ |
760 | static struct kset mc_kset = { | 648 | static struct kset mc_kset; |
761 | .kobj = {.ktype = &ktype_mc_set_attribs }, | ||
762 | }; | ||
763 | |||
764 | 649 | ||
765 | /* | 650 | /* |
766 | * edac_mc_register_sysfs_main_kobj | 651 | * edac_mc_register_sysfs_main_kobj |