1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20#ifndef _EDAC_CORE_H_
21#define _EDAC_CORE_H_
22
23#include <linux/kernel.h>
24#include <linux/types.h>
25#include <linux/module.h>
26#include <linux/spinlock.h>
27#include <linux/smp.h>
28#include <linux/pci.h>
29#include <linux/time.h>
30#include <linux/nmi.h>
31#include <linux/rcupdate.h>
32#include <linux/completion.h>
33#include <linux/kobject.h>
34#include <linux/platform_device.h>
35#include <linux/sysdev.h>
36#include <linux/workqueue.h>
37
38#define EDAC_MC_LABEL_LEN 31
39#define EDAC_DEVICE_NAME_LEN 31
40#define EDAC_ATTRIB_VALUE_LEN 15
41#define MC_PROC_NAME_MAX_LEN 7
42
43#if PAGE_SHIFT < 20
44#define PAGES_TO_MiB( pages ) ( ( pages ) >> ( 20 - PAGE_SHIFT ) )
45#else
46#define PAGES_TO_MiB( pages ) ( ( pages ) << ( PAGE_SHIFT - 20 ) )
47#endif
48
49#define edac_printk(level, prefix, fmt, arg...) \
50 printk(level "EDAC " prefix ": " fmt, ##arg)
51
52#define edac_printk_verbose(level, prefix, fmt, arg...) \
53 printk(level "EDAC " prefix ": " "in %s, line at %d: " fmt, \
54 __FILE__, __LINE__, ##arg)
55
56#define edac_mc_printk(mci, level, fmt, arg...) \
57 printk(level "EDAC MC%d: " fmt, mci->mc_idx, ##arg)
58
59#define edac_mc_chipset_printk(mci, level, prefix, fmt, arg...) \
60 printk(level "EDAC " prefix " MC%d: " fmt, mci->mc_idx, ##arg)
61
62
63#define edac_device_printk(ctl, level, fmt, arg...) \
64 printk(level "EDAC DEVICE%d: " fmt, ctl->dev_idx, ##arg)
65
66
67#define edac_pci_printk(ctl, level, fmt, arg...) \
68 printk(level "EDAC PCI%d: " fmt, ctl->pci_idx, ##arg)
69
70
71#define EDAC_MC "MC"
72#define EDAC_PCI "PCI"
73#define EDAC_DEBUG "DEBUG"
74
75#ifdef CONFIG_EDAC_DEBUG
76extern int edac_debug_level;
77extern const char *edac_mem_types[];
78
79#ifndef CONFIG_EDAC_DEBUG_VERBOSE
80#define edac_debug_printk(level, fmt, arg...) \
81 do { \
82 if (level <= edac_debug_level) \
83 edac_printk(KERN_DEBUG, EDAC_DEBUG, \
84 "%s: " fmt, __func__, ##arg); \
85 } while (0)
86#else
87#define edac_debug_printk(level, fmt, arg...) \
88 do { \
89 if (level <= edac_debug_level) \
90 edac_printk_verbose(KERN_DEBUG, EDAC_DEBUG, fmt, \
91 ##arg); \
92 } while (0)
93#endif
94
95#define debugf0( ... ) edac_debug_printk(0, __VA_ARGS__ )
96#define debugf1( ... ) edac_debug_printk(1, __VA_ARGS__ )
97#define debugf2( ... ) edac_debug_printk(2, __VA_ARGS__ )
98#define debugf3( ... ) edac_debug_printk(3, __VA_ARGS__ )
99#define debugf4( ... ) edac_debug_printk(4, __VA_ARGS__ )
100
101#else
102
103#define debugf0( ... )
104#define debugf1( ... )
105#define debugf2( ... )
106#define debugf3( ... )
107#define debugf4( ... )
108
109#endif
110
111#define PCI_VEND_DEV(vend, dev) PCI_VENDOR_ID_ ## vend, \
112 PCI_DEVICE_ID_ ## vend ## _ ## dev
113
114#define edac_dev_name(dev) (dev)->dev_name
115
116
117enum dev_type {
118 DEV_UNKNOWN = 0,
119 DEV_X1,
120 DEV_X2,
121 DEV_X4,
122 DEV_X8,
123 DEV_X16,
124 DEV_X32,
125 DEV_X64
126};
127
128#define DEV_FLAG_UNKNOWN BIT(DEV_UNKNOWN)
129#define DEV_FLAG_X1 BIT(DEV_X1)
130#define DEV_FLAG_X2 BIT(DEV_X2)
131#define DEV_FLAG_X4 BIT(DEV_X4)
132#define DEV_FLAG_X8 BIT(DEV_X8)
133#define DEV_FLAG_X16 BIT(DEV_X16)
134#define DEV_FLAG_X32 BIT(DEV_X32)
135#define DEV_FLAG_X64 BIT(DEV_X64)
136
137
138enum mem_type {
139 MEM_EMPTY = 0,
140 MEM_RESERVED,
141 MEM_UNKNOWN,
142 MEM_FPM,
143 MEM_EDO,
144 MEM_BEDO,
145 MEM_SDR,
146 MEM_RDR,
147 MEM_DDR,
148 MEM_RDDR,
149 MEM_RMBS,
150 MEM_DDR2,
151 MEM_FB_DDR2,
152 MEM_RDDR2,
153 MEM_XDR,
154 MEM_DDR3,
155 MEM_RDDR3,
156};
157
158#define MEM_FLAG_EMPTY BIT(MEM_EMPTY)
159#define MEM_FLAG_RESERVED BIT(MEM_RESERVED)
160#define MEM_FLAG_UNKNOWN BIT(MEM_UNKNOWN)
161#define MEM_FLAG_FPM BIT(MEM_FPM)
162#define MEM_FLAG_EDO BIT(MEM_EDO)
163#define MEM_FLAG_BEDO BIT(MEM_BEDO)
164#define MEM_FLAG_SDR BIT(MEM_SDR)
165#define MEM_FLAG_RDR BIT(MEM_RDR)
166#define MEM_FLAG_DDR BIT(MEM_DDR)
167#define MEM_FLAG_RDDR BIT(MEM_RDDR)
168#define MEM_FLAG_RMBS BIT(MEM_RMBS)
169#define MEM_FLAG_DDR2 BIT(MEM_DDR2)
170#define MEM_FLAG_FB_DDR2 BIT(MEM_FB_DDR2)
171#define MEM_FLAG_RDDR2 BIT(MEM_RDDR2)
172#define MEM_FLAG_XDR BIT(MEM_XDR)
173#define MEM_FLAG_DDR3 BIT(MEM_DDR3)
174#define MEM_FLAG_RDDR3 BIT(MEM_RDDR3)
175
176
177enum edac_type {
178 EDAC_UNKNOWN = 0,
179 EDAC_NONE,
180 EDAC_RESERVED,
181 EDAC_PARITY,
182 EDAC_EC,
183 EDAC_SECDED,
184 EDAC_S2ECD2ED,
185 EDAC_S4ECD4ED,
186 EDAC_S8ECD8ED,
187 EDAC_S16ECD16ED,
188};
189
190#define EDAC_FLAG_UNKNOWN BIT(EDAC_UNKNOWN)
191#define EDAC_FLAG_NONE BIT(EDAC_NONE)
192#define EDAC_FLAG_PARITY BIT(EDAC_PARITY)
193#define EDAC_FLAG_EC BIT(EDAC_EC)
194#define EDAC_FLAG_SECDED BIT(EDAC_SECDED)
195#define EDAC_FLAG_S2ECD2ED BIT(EDAC_S2ECD2ED)
196#define EDAC_FLAG_S4ECD4ED BIT(EDAC_S4ECD4ED)
197#define EDAC_FLAG_S8ECD8ED BIT(EDAC_S8ECD8ED)
198#define EDAC_FLAG_S16ECD16ED BIT(EDAC_S16ECD16ED)
199
200
201enum scrub_type {
202 SCRUB_UNKNOWN = 0,
203 SCRUB_NONE,
204 SCRUB_SW_PROG,
205 SCRUB_SW_SRC,
206 SCRUB_SW_PROG_SRC,
207 SCRUB_SW_TUNABLE,
208 SCRUB_HW_PROG,
209 SCRUB_HW_SRC,
210 SCRUB_HW_PROG_SRC,
211 SCRUB_HW_TUNABLE
212};
213
214#define SCRUB_FLAG_SW_PROG BIT(SCRUB_SW_PROG)
215#define SCRUB_FLAG_SW_SRC BIT(SCRUB_SW_SRC)
216#define SCRUB_FLAG_SW_PROG_SRC BIT(SCRUB_SW_PROG_SRC)
217#define SCRUB_FLAG_SW_TUN BIT(SCRUB_SW_SCRUB_TUNABLE)
218#define SCRUB_FLAG_HW_PROG BIT(SCRUB_HW_PROG)
219#define SCRUB_FLAG_HW_SRC BIT(SCRUB_HW_SRC)
220#define SCRUB_FLAG_HW_PROG_SRC BIT(SCRUB_HW_PROG_SRC)
221#define SCRUB_FLAG_HW_TUN BIT(SCRUB_HW_TUNABLE)
222
223
224
225
226#define OP_ALLOC 0x100
227#define OP_RUNNING_POLL 0x201
228#define OP_RUNNING_INTERRUPT 0x202
229#define OP_RUNNING_POLL_INTR 0x203
230#define OP_OFFLINE 0x300
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314struct channel_info {
315 int chan_idx;
316 u32 ce_count;
317 char label[EDAC_MC_LABEL_LEN + 1];
318 struct csrow_info *csrow;
319};
320
321struct csrow_info {
322 unsigned long first_page;
323 unsigned long last_page;
324 unsigned long page_mask;
325
326
327 u32 nr_pages;
328 u32 grain;
329 int csrow_idx;
330 enum dev_type dtype;
331 u32 ue_count;
332 u32 ce_count;
333 enum mem_type mtype;
334 enum edac_type edac_mode;
335 struct mem_ctl_info *mci;
336
337 struct kobject kobj;
338
339
340 u32 nr_channels;
341 struct channel_info *channels;
342};
343
344struct mcidev_sysfs_group {
345 const char *name;
346 struct mcidev_sysfs_attribute *mcidev_attr;
347};
348
349struct mcidev_sysfs_group_kobj {
350 struct list_head list;
351
352 struct kobject kobj;
353
354 struct mcidev_sysfs_group *grp;
355 struct mem_ctl_info *mci;
356};
357
358
359
360
361
362struct mcidev_sysfs_attribute {
363
364 struct attribute attr;
365 struct mcidev_sysfs_group *grp;
366
367
368 ssize_t (*show)(struct mem_ctl_info *,char *);
369 ssize_t (*store)(struct mem_ctl_info *, const char *,size_t);
370};
371
372
373
374struct mem_ctl_info {
375 struct list_head link;
376
377 struct module *owner;
378
379 unsigned long mtype_cap;
380 unsigned long edac_ctl_cap;
381 unsigned long edac_cap;
382
383
384
385
386
387
388
389 unsigned long scrub_cap;
390 enum scrub_type scrub_mode;
391
392
393
394
395
396 int (*set_sdram_scrub_rate) (struct mem_ctl_info * mci, u32 * bw);
397
398
399
400
401
402 int (*get_sdram_scrub_rate) (struct mem_ctl_info * mci, u32 * bw);
403
404
405
406 void (*edac_check) (struct mem_ctl_info * mci);
407
408
409
410
411
412
413 unsigned long (*ctl_page_to_phys) (struct mem_ctl_info * mci,
414 unsigned long page);
415 int mc_idx;
416 int nr_csrows;
417 struct csrow_info *csrows;
418
419
420
421
422
423 struct device *dev;
424 const char *mod_name;
425 const char *mod_ver;
426 const char *ctl_name;
427 const char *dev_name;
428 char proc_name[MC_PROC_NAME_MAX_LEN + 1];
429 void *pvt_info;
430 u32 ue_noinfo_count;
431 u32 ce_noinfo_count;
432 u32 ue_count;
433 u32 ce_count;
434 unsigned long start_time;
435
436
437
438
439 struct rcu_head rcu;
440 struct completion complete;
441
442
443 struct kobject edac_mci_kobj;
444
445
446 struct list_head grp_kobj_list;
447
448
449
450
451
452
453
454
455
456
457
458 struct mcidev_sysfs_attribute *mc_driver_sysfs_attributes;
459
460
461 struct delayed_work work;
462
463
464 int op_state;
465};
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506struct edac_device_counter {
507 u32 ue_count;
508 u32 ce_count;
509};
510
511
512struct edac_device_ctl_info;
513struct edac_device_block;
514
515
516
517
518
519
520struct edac_dev_sysfs_attribute {
521 struct attribute attr;
522 ssize_t (*show)(struct edac_device_ctl_info *, char *);
523 ssize_t (*store)(struct edac_device_ctl_info *, const char *, size_t);
524};
525
526
527
528
529
530
531
532
533
534
535
536
537
538struct edac_dev_sysfs_block_attribute {
539 struct attribute attr;
540 ssize_t (*show)(struct kobject *, struct attribute *, char *);
541 ssize_t (*store)(struct kobject *, struct attribute *,
542 const char *, size_t);
543 struct edac_device_block *block;
544
545 unsigned int value;
546};
547
548
549struct edac_device_block {
550 struct edac_device_instance *instance;
551 char name[EDAC_DEVICE_NAME_LEN + 1];
552
553 struct edac_device_counter counters;
554
555 int nr_attribs;
556
557
558 struct edac_dev_sysfs_block_attribute *block_attributes;
559
560
561 struct kobject kobj;
562};
563
564
565struct edac_device_instance {
566 struct edac_device_ctl_info *ctl;
567 char name[EDAC_DEVICE_NAME_LEN + 4];
568
569 struct edac_device_counter counters;
570
571 u32 nr_blocks;
572 struct edac_device_block *blocks;
573
574
575 struct kobject kobj;
576};
577
578
579
580
581
582
583struct edac_device_ctl_info {
584
585 struct list_head link;
586
587 struct module *owner;
588
589 int dev_idx;
590
591
592 int log_ue;
593 int log_ce;
594 int panic_on_ue;
595 unsigned poll_msec;
596 unsigned long delay;
597
598
599
600
601
602
603
604
605
606
607
608 struct edac_dev_sysfs_attribute *sysfs_attributes;
609
610
611 struct sysdev_class *edac_class;
612
613
614 int op_state;
615
616 struct delayed_work work;
617
618
619
620
621
622
623 void (*edac_check) (struct edac_device_ctl_info * edac_dev);
624
625 struct device *dev;
626
627 const char *mod_name;
628 const char *ctl_name;
629 const char *dev_name;
630
631 void *pvt_info;
632
633 unsigned long start_time;
634
635
636
637
638 struct rcu_head rcu;
639 struct completion removal_complete;
640
641
642
643
644
645
646
647
648 char name[EDAC_DEVICE_NAME_LEN + 1];
649
650
651
652
653 u32 nr_instances;
654 struct edac_device_instance *instances;
655
656
657 struct edac_device_counter counters;
658
659
660
661
662 struct kobject kobj;
663};
664
665
666#define to_edac_mem_ctl_work(w) \
667 container_of(w, struct mem_ctl_info, work)
668
669#define to_edac_device_ctl_work(w) \
670 container_of(w,struct edac_device_ctl_info,work)
671
672
673
674
675
676
677extern struct edac_device_ctl_info *edac_device_alloc_ctl_info(
678 unsigned sizeof_private,
679 char *edac_device_name, unsigned nr_instances,
680 char *edac_block_name, unsigned nr_blocks,
681 unsigned offset_value,
682 struct edac_dev_sysfs_block_attribute *block_attributes,
683 unsigned nr_attribs,
684 int device_index);
685
686
687
688
689
690
691
692#define BLOCK_OFFSET_VALUE_OFF ((unsigned) -1)
693
694extern void edac_device_free_ctl_info(struct edac_device_ctl_info *ctl_info);
695
696#ifdef CONFIG_PCI
697
698struct edac_pci_counter {
699 atomic_t pe_count;
700 atomic_t npe_count;
701};
702
703
704
705
706
707struct edac_pci_ctl_info {
708
709 struct list_head link;
710
711 int pci_idx;
712
713 struct sysdev_class *edac_class;
714
715
716 int op_state;
717
718 struct delayed_work work;
719
720
721
722
723
724
725 void (*edac_check) (struct edac_pci_ctl_info * edac_dev);
726
727 struct device *dev;
728
729 const char *mod_name;
730 const char *ctl_name;
731 const char *dev_name;
732
733 void *pvt_info;
734
735 unsigned long start_time;
736
737
738
739
740 struct rcu_head rcu;
741 struct completion complete;
742
743
744
745
746
747
748
749
750 char name[EDAC_DEVICE_NAME_LEN + 1];
751
752
753 struct edac_pci_counter counters;
754
755
756
757
758 struct kobject kobj;
759 struct completion kobj_complete;
760};
761
762#define to_edac_pci_ctl_work(w) \
763 container_of(w, struct edac_pci_ctl_info,work)
764
765
766static inline void pci_write_bits8(struct pci_dev *pdev, int offset, u8 value,
767 u8 mask)
768{
769 if (mask != 0xff) {
770 u8 buf;
771
772 pci_read_config_byte(pdev, offset, &buf);
773 value &= mask;
774 buf &= ~mask;
775 value |= buf;
776 }
777
778 pci_write_config_byte(pdev, offset, value);
779}
780
781
782static inline void pci_write_bits16(struct pci_dev *pdev, int offset,
783 u16 value, u16 mask)
784{
785 if (mask != 0xffff) {
786 u16 buf;
787
788 pci_read_config_word(pdev, offset, &buf);
789 value &= mask;
790 buf &= ~mask;
791 value |= buf;
792 }
793
794 pci_write_config_word(pdev, offset, value);
795}
796
797
798
799
800
801
802
803
804
805
806static inline void pci_write_bits32(struct pci_dev *pdev, int offset,
807 u32 value, u32 mask)
808{
809 if (mask != 0xffffffff) {
810 u32 buf;
811
812 pci_read_config_dword(pdev, offset, &buf);
813 value &= mask;
814 buf &= ~mask;
815 value |= buf;
816 }
817
818 pci_write_config_dword(pdev, offset, value);
819}
820
821#endif
822
823extern struct mem_ctl_info *edac_mc_alloc(unsigned sz_pvt, unsigned nr_csrows,
824 unsigned nr_chans, int edac_index);
825extern int edac_mc_add_mc(struct mem_ctl_info *mci);
826extern void edac_mc_free(struct mem_ctl_info *mci);
827extern struct mem_ctl_info *edac_mc_find(int idx);
828extern struct mem_ctl_info *edac_mc_del_mc(struct device *dev);
829extern int edac_mc_find_csrow_by_page(struct mem_ctl_info *mci,
830 unsigned long page);
831
832
833
834
835
836
837
838
839
840
841
842extern void edac_mc_handle_ce(struct mem_ctl_info *mci,
843 unsigned long page_frame_number,
844 unsigned long offset_in_page,
845 unsigned long syndrome, int row, int channel,
846 const char *msg);
847extern void edac_mc_handle_ce_no_info(struct mem_ctl_info *mci,
848 const char *msg);
849extern void edac_mc_handle_ue(struct mem_ctl_info *mci,
850 unsigned long page_frame_number,
851 unsigned long offset_in_page, int row,
852 const char *msg);
853extern void edac_mc_handle_ue_no_info(struct mem_ctl_info *mci,
854 const char *msg);
855extern void edac_mc_handle_fbd_ue(struct mem_ctl_info *mci, unsigned int csrow,
856 unsigned int channel0, unsigned int channel1,
857 char *msg);
858extern void edac_mc_handle_fbd_ce(struct mem_ctl_info *mci, unsigned int csrow,
859 unsigned int channel, char *msg);
860
861
862
863
864extern int edac_device_add_device(struct edac_device_ctl_info *edac_dev);
865extern struct edac_device_ctl_info *edac_device_del_device(struct device *dev);
866extern void edac_device_handle_ue(struct edac_device_ctl_info *edac_dev,
867 int inst_nr, int block_nr, const char *msg);
868extern void edac_device_handle_ce(struct edac_device_ctl_info *edac_dev,
869 int inst_nr, int block_nr, const char *msg);
870extern int edac_device_alloc_index(void);
871
872
873
874
875extern struct edac_pci_ctl_info *edac_pci_alloc_ctl_info(unsigned int sz_pvt,
876 const char *edac_pci_name);
877
878extern void edac_pci_free_ctl_info(struct edac_pci_ctl_info *pci);
879
880extern void edac_pci_reset_delay_period(struct edac_pci_ctl_info *pci,
881 unsigned long value);
882
883extern int edac_pci_alloc_index(void);
884extern int edac_pci_add_device(struct edac_pci_ctl_info *pci, int edac_idx);
885extern struct edac_pci_ctl_info *edac_pci_del_device(struct device *dev);
886
887extern struct edac_pci_ctl_info *edac_pci_create_generic_ctl(
888 struct device *dev,
889 const char *mod_name);
890
891extern void edac_pci_release_generic_ctl(struct edac_pci_ctl_info *pci);
892extern int edac_pci_create_sysfs(struct edac_pci_ctl_info *pci);
893extern void edac_pci_remove_sysfs(struct edac_pci_ctl_info *pci);
894
895
896
897
898extern char *edac_op_state_to_string(int op_state);
899
900#endif
901