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