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