diff options
author | Dave Jiang <djiang@mvista.com> | 2007-07-19 04:49:52 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-07-19 13:04:54 -0400 |
commit | 91b99041c1d577ded1da599ddc28cec2e07253cf (patch) | |
tree | 21b132d19166dca5c363b98e20741b78df4ad68a /drivers/edac/edac_core.h | |
parent | 81d87cb13e367bb804bf44889ae0de7369705d6c (diff) |
drivers/edac: updated PCI monitoring
Moving PCI to a per-instance device model
This should include the correct sysfs setup as well. Please review.
Signed-off-by: Dave Jiang <djiang@mvista.com>
Signed-off-by: Douglas Thompson <dougthompson@xmission.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers/edac/edac_core.h')
-rw-r--r-- | drivers/edac/edac_core.h | 120 |
1 files changed, 114 insertions, 6 deletions
diff --git a/drivers/edac/edac_core.h b/drivers/edac/edac_core.h index b73d659a4bb..febff411142 100644 --- a/drivers/edac/edac_core.h +++ b/drivers/edac/edac_core.h | |||
@@ -60,6 +60,10 @@ | |||
60 | #define edac_device_printk(ctl, level, fmt, arg...) \ | 60 | #define edac_device_printk(ctl, level, fmt, arg...) \ |
61 | printk(level "EDAC DEVICE%d: " fmt, ctl->dev_idx, ##arg) | 61 | printk(level "EDAC DEVICE%d: " fmt, ctl->dev_idx, ##arg) |
62 | 62 | ||
63 | /* edac_pci printk */ | ||
64 | #define edac_pci_printk(ctl, level, fmt, arg...) \ | ||
65 | printk(level "EDAC PCI%d: " fmt, ctl->pci_idx, ##arg) | ||
66 | |||
63 | /* prefixes for edac_printk() and edac_mc_printk() */ | 67 | /* prefixes for edac_printk() and edac_mc_printk() */ |
64 | #define EDAC_MC "MC" | 68 | #define EDAC_MC "MC" |
65 | #define EDAC_PCI "PCI" | 69 | #define EDAC_PCI "PCI" |
@@ -200,6 +204,13 @@ enum scrub_type { | |||
200 | 204 | ||
201 | /* FIXME - should have notify capabilities: NMI, LOG, PROC, etc */ | 205 | /* FIXME - should have notify capabilities: NMI, LOG, PROC, etc */ |
202 | 206 | ||
207 | /* EDAC internal operation states */ | ||
208 | #define OP_ALLOC 0x100 | ||
209 | #define OP_RUNNING_POLL 0x201 | ||
210 | #define OP_RUNNING_INTERRUPT 0x202 | ||
211 | #define OP_RUNNING_POLL_INTR 0x203 | ||
212 | #define OP_OFFLINE 0x300 | ||
213 | |||
203 | extern char * edac_align_ptr(void *ptr, unsigned size); | 214 | extern char * edac_align_ptr(void *ptr, unsigned size); |
204 | 215 | ||
205 | /* | 216 | /* |
@@ -520,12 +531,6 @@ struct edac_device_ctl_info { | |||
520 | 531 | ||
521 | /* the internal state of this controller instance */ | 532 | /* the internal state of this controller instance */ |
522 | int op_state; | 533 | int op_state; |
523 | #define OP_ALLOC 0x100 | ||
524 | #define OP_RUNNING_POLL 0x201 | ||
525 | #define OP_RUNNING_INTERRUPT 0x202 | ||
526 | #define OP_RUNNING_POLL_INTR 0x203 | ||
527 | #define OP_OFFLINE 0x300 | ||
528 | |||
529 | /* work struct for this instance */ | 534 | /* work struct for this instance */ |
530 | #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) | 535 | #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) |
531 | struct delayed_work work; | 536 | struct delayed_work work; |
@@ -626,6 +631,84 @@ extern void edac_device_free_ctl_info( struct edac_device_ctl_info *ctl_info); | |||
626 | 631 | ||
627 | #ifdef CONFIG_PCI | 632 | #ifdef CONFIG_PCI |
628 | 633 | ||
634 | struct edac_pci_counter { | ||
635 | atomic_t pe_count; | ||
636 | atomic_t npe_count; | ||
637 | }; | ||
638 | |||
639 | /* | ||
640 | * Abstract edac_pci control info structure | ||
641 | * | ||
642 | */ | ||
643 | struct edac_pci_ctl_info { | ||
644 | /* for global list of edac_pci_ctl_info structs */ | ||
645 | struct list_head link; | ||
646 | |||
647 | int pci_idx; | ||
648 | |||
649 | /* Per instance controls for this edac_device */ | ||
650 | int check_parity_error; /* boolean for checking parity errs */ | ||
651 | int log_parity_error; /* boolean for logging parity errs */ | ||
652 | int panic_on_pe; /* boolean for panic'ing on a PE */ | ||
653 | unsigned poll_msec; /* number of milliseconds to poll interval */ | ||
654 | unsigned long delay; /* number of jiffies for poll_msec */ | ||
655 | |||
656 | struct sysdev_class *edac_class; /* pointer to class */ | ||
657 | |||
658 | /* the internal state of this controller instance */ | ||
659 | int op_state; | ||
660 | /* work struct for this instance */ | ||
661 | #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) | ||
662 | struct delayed_work work; | ||
663 | #else | ||
664 | struct work_struct work; | ||
665 | #endif | ||
666 | |||
667 | /* pointer to edac polling checking routine: | ||
668 | * If NOT NULL: points to polling check routine | ||
669 | * If NULL: Then assumes INTERRUPT operation, where | ||
670 | * MC driver will receive events | ||
671 | */ | ||
672 | void (*edac_check) (struct edac_pci_ctl_info * edac_dev); | ||
673 | |||
674 | struct device *dev; /* pointer to device structure */ | ||
675 | |||
676 | const char *mod_name; /* module name */ | ||
677 | const char *ctl_name; /* edac controller name */ | ||
678 | const char *dev_name; /* pci/platform/etc... name */ | ||
679 | |||
680 | void *pvt_info; /* pointer to 'private driver' info */ | ||
681 | |||
682 | unsigned long start_time;/* edac_pci load start time (jiffies)*/ | ||
683 | |||
684 | /* these are for safe removal of devices from global list while | ||
685 | * NMI handlers may be traversing list | ||
686 | */ | ||
687 | struct rcu_head rcu; | ||
688 | struct completion complete; | ||
689 | |||
690 | /* sysfs top name under 'edac' directory | ||
691 | * and instance name: | ||
692 | * cpu/cpu0/... | ||
693 | * cpu/cpu1/... | ||
694 | * cpu/cpu2/... | ||
695 | * ... | ||
696 | */ | ||
697 | char name[EDAC_DEVICE_NAME_LEN + 1]; | ||
698 | |||
699 | /* Event counters for the this whole EDAC Device */ | ||
700 | struct edac_pci_counter counters; | ||
701 | |||
702 | /* edac sysfs device control for the 'name' | ||
703 | * device this structure controls | ||
704 | */ | ||
705 | struct kobject kobj; | ||
706 | struct completion kobj_complete; | ||
707 | }; | ||
708 | |||
709 | #define to_edac_pci_ctl_work(w) \ | ||
710 | container_of(w, struct edac_pci_ctl_info,work) | ||
711 | |||
629 | /* write all or some bits in a byte-register*/ | 712 | /* write all or some bits in a byte-register*/ |
630 | static inline void pci_write_bits8(struct pci_dev *pdev, int offset, u8 value, | 713 | static inline void pci_write_bits8(struct pci_dev *pdev, int offset, u8 value, |
631 | u8 mask) | 714 | u8 mask) |
@@ -726,5 +809,30 @@ extern void edac_device_handle_ue(struct edac_device_ctl_info *edac_dev, | |||
726 | extern void edac_device_handle_ce(struct edac_device_ctl_info *edac_dev, | 809 | extern void edac_device_handle_ce(struct edac_device_ctl_info *edac_dev, |
727 | int inst_nr, int block_nr, const char *msg); | 810 | int inst_nr, int block_nr, const char *msg); |
728 | 811 | ||
812 | /* | ||
813 | * edac_pci APIs | ||
814 | */ | ||
815 | extern struct edac_pci_ctl_info * | ||
816 | edac_pci_alloc_ctl_info(unsigned int sz_pvt, const char *edac_pci_name); | ||
817 | |||
818 | extern void edac_pci_free_ctl_info(struct edac_pci_ctl_info *pci); | ||
819 | |||
820 | extern void | ||
821 | edac_pci_reset_delay_period(struct edac_pci_ctl_info *pci, unsigned long value); | ||
822 | |||
823 | extern int edac_pci_add_device(struct edac_pci_ctl_info *pci, int edac_idx); | ||
824 | extern struct edac_pci_ctl_info * edac_pci_del_device(struct device *dev); | ||
825 | |||
826 | extern struct edac_pci_ctl_info * | ||
827 | edac_pci_create_generic_ctl(struct device *dev, const char *mod_name); | ||
828 | |||
829 | extern void edac_pci_release_generic_ctl(struct edac_pci_ctl_info *pci); | ||
830 | extern int edac_pci_create_sysfs(struct edac_pci_ctl_info *pci); | ||
831 | extern void edac_pci_remove_sysfs(struct edac_pci_ctl_info *pci); | ||
832 | |||
833 | /* | ||
834 | * edac misc APIs | ||
835 | */ | ||
836 | extern char * edac_op_state_toString(int op_state); | ||
729 | 837 | ||
730 | #endif /* _EDAC_CORE_H_ */ | 838 | #endif /* _EDAC_CORE_H_ */ |