1 // SPDX-License-Identifier: GPL-2.0-only
2 #include <linux/module.h>
3 #include <linux/slab.h>
9 static struct amd_decoder_ops fam_ops
;
11 static u8 xec_mask
= 0xf;
13 static void (*decode_dram_ecc
)(int node_id
, struct mce
*m
);
15 void amd_register_ecc_decoder(void (*f
)(int, struct mce
*))
19 EXPORT_SYMBOL_GPL(amd_register_ecc_decoder
);
21 void amd_unregister_ecc_decoder(void (*f
)(int, struct mce
*))
23 if (decode_dram_ecc
) {
24 WARN_ON(decode_dram_ecc
!= f
);
26 decode_dram_ecc
= NULL
;
29 EXPORT_SYMBOL_GPL(amd_unregister_ecc_decoder
);
32 * string representation for the different MCA reported error types, see F3x48
36 /* transaction type */
37 static const char * const tt_msgs
[] = { "INSN", "DATA", "GEN", "RESV" };
40 static const char * const ll_msgs
[] = { "RESV", "L1", "L2", "L3/GEN" };
42 /* memory transaction type */
43 static const char * const rrrr_msgs
[] = {
44 "GEN", "RD", "WR", "DRD", "DWR", "IRD", "PRF", "EV", "SNP"
47 /* participating processor */
48 const char * const pp_msgs
[] = { "SRC", "RES", "OBS", "GEN" };
49 EXPORT_SYMBOL_GPL(pp_msgs
);
52 static const char * const to_msgs
[] = { "no timeout", "timed out" };
55 static const char * const ii_msgs
[] = { "MEM", "RESV", "IO", "GEN" };
57 /* internal error type */
58 static const char * const uu_msgs
[] = { "RESV", "RESV", "HWA", "RESV" };
60 static const char * const f15h_mc1_mce_desc
[] = {
61 "UC during a demand linefill from L2",
62 "Parity error during data load from IC",
63 "Parity error for IC valid bit",
64 "Main tag parity error",
65 "Parity error in prediction queue",
66 "PFB data/address parity error",
67 "Parity error in the branch status reg",
68 "PFB promotion address error",
69 "Tag error during probe/victimization",
70 "Parity error for IC probe tag valid bit",
71 "PFB non-cacheable bit parity error",
72 "PFB valid bit parity error", /* xec = 0xd */
73 "Microcode Patch Buffer", /* xec = 010 */
81 static const char * const f15h_mc2_mce_desc
[] = {
82 "Fill ECC error on data fills", /* xec = 0x4 */
83 "Fill parity error on insn fills",
84 "Prefetcher request FIFO parity error",
85 "PRQ address parity error",
86 "PRQ data parity error",
89 "WCB Data parity error",
90 "VB Data ECC or parity error",
91 "L2 Tag ECC error", /* xec = 0x10 */
92 "Hard L2 Tag ECC error",
93 "Multiple hits on L2 tag",
95 "PRB address parity error"
98 static const char * const mc4_mce_desc
[] = {
99 "DRAM ECC error detected on the NB",
100 "CRC error detected on HT link",
101 "Link-defined sync error packets detected on HT link",
104 "Invalid GART PTE entry during GART table walk",
105 "Unsupported atomic RMW received from an IO link",
106 "Watchdog timeout due to lack of progress",
107 "DRAM ECC error detected on the NB",
108 "SVM DMA Exclusion Vector error",
109 "HT data error detected on link",
110 "Protocol error (link, L3, probe filter)",
111 "NB internal arrays parity error",
112 "DRAM addr/ctl signals parity error",
113 "IO link transmission error",
114 "L3 data cache ECC error", /* xec = 0x1c */
115 "L3 cache tag error",
116 "L3 LRU parity bits error",
117 "ECC Error in the Probe Filter directory"
120 static const char * const mc5_mce_desc
[] = {
121 "CPU Watchdog timer expire",
122 "Wakeup array dest tag",
126 "Retire dispatch queue",
127 "Mapper checkpoint array",
128 "Physical register file EX0 port",
129 "Physical register file EX1 port",
130 "Physical register file AG0 port",
131 "Physical register file AG1 port",
132 "Flag register file",
134 "Retire status queue"
137 static const char * const mc6_mce_desc
[] = {
138 "Hardware Assertion",
140 "Physical Register File",
143 "Status Register File",
146 static bool f12h_mc0_mce(u16 ec
, u8 xec
)
155 pr_cont("during L1 linefill from L2.\n");
156 else if (ll
== LL_L1
)
157 pr_cont("Data/Tag %s error.\n", R4_MSG(ec
));
164 static bool f10h_mc0_mce(u16 ec
, u8 xec
)
166 if (R4(ec
) == R4_GEN
&& LL(ec
) == LL_L1
) {
167 pr_cont("during data scrub.\n");
170 return f12h_mc0_mce(ec
, xec
);
173 static bool k8_mc0_mce(u16 ec
, u8 xec
)
176 pr_cont("during system linefill.\n");
180 return f10h_mc0_mce(ec
, xec
);
183 static bool cat_mc0_mce(u16 ec
, u8 xec
)
190 if (TT(ec
) != TT_DATA
|| LL(ec
) != LL_L1
)
196 pr_cont("Data/Tag parity error due to %s.\n",
197 (r4
== R4_DRD
? "load/hw prf" : "store"));
200 pr_cont("Copyback parity error on a tag miss.\n");
203 pr_cont("Tag parity error during snoop.\n");
208 } else if (BUS_ERROR(ec
)) {
210 if ((II(ec
) != II_MEM
&& II(ec
) != II_IO
) || LL(ec
) != LL_LG
)
213 pr_cont("System read data error on a ");
217 pr_cont("TLB reload.\n");
235 static bool f15h_mc0_mce(u16 ec
, u8 xec
)
243 pr_cont("Data Array access error.\n");
247 pr_cont("UC error during a linefill from L2/NB.\n");
252 pr_cont("STQ access error.\n");
256 pr_cont("SCB access error.\n");
260 pr_cont("Tag error.\n");
264 pr_cont("LDQ access error.\n");
270 } else if (BUS_ERROR(ec
)) {
273 pr_cont("System Read Data Error.\n");
275 pr_cont(" Internal error condition type %d.\n", xec
);
276 } else if (INT_ERROR(ec
)) {
278 pr_cont("Hardware Assert.\n");
288 static void decode_mc0_mce(struct mce
*m
)
290 u16 ec
= EC(m
->status
);
291 u8 xec
= XEC(m
->status
, xec_mask
);
293 pr_emerg(HW_ERR
"MC0 Error: ");
295 /* TLB error signatures are the same across families */
297 if (TT(ec
) == TT_DATA
) {
298 pr_cont("%s TLB %s.\n", LL_MSG(ec
),
299 ((xec
== 2) ? "locked miss"
300 : (xec
? "multimatch" : "parity")));
303 } else if (fam_ops
.mc0_mce(ec
, xec
))
306 pr_emerg(HW_ERR
"Corrupted MC0 MCE info?\n");
309 static bool k8_mc1_mce(u16 ec
, u8 xec
)
318 pr_cont("during a linefill from L2.\n");
319 else if (ll
== 0x1) {
322 pr_cont("Parity error during data load.\n");
326 pr_cont("Copyback Parity/Victim error.\n");
330 pr_cont("Tag Snoop error.\n");
343 static bool cat_mc1_mce(u16 ec
, u8 xec
)
351 if (TT(ec
) != TT_INSTR
)
355 pr_cont("Data/tag array parity error for a tag hit.\n");
356 else if (r4
== R4_SNOOP
)
357 pr_cont("Tag error during snoop/victimization.\n");
359 pr_cont("Tag parity error from victim castout.\n");
361 pr_cont("Microcode patch RAM parity error.\n");
368 static bool f15h_mc1_mce(u16 ec
, u8 xec
)
377 pr_cont("%s.\n", f15h_mc1_mce_desc
[xec
]);
381 pr_cont("%s.\n", f15h_mc1_mce_desc
[xec
-2]);
385 pr_cont("%s.\n", f15h_mc1_mce_desc
[xec
-4]);
389 pr_cont("Decoder %s parity error.\n", f15h_mc1_mce_desc
[xec
-4]);
398 static void decode_mc1_mce(struct mce
*m
)
400 u16 ec
= EC(m
->status
);
401 u8 xec
= XEC(m
->status
, xec_mask
);
403 pr_emerg(HW_ERR
"MC1 Error: ");
406 pr_cont("%s TLB %s.\n", LL_MSG(ec
),
407 (xec
? "multimatch" : "parity error"));
408 else if (BUS_ERROR(ec
)) {
409 bool k8
= (boot_cpu_data
.x86
== 0xf && (m
->status
& BIT_64(58)));
411 pr_cont("during %s.\n", (k8
? "system linefill" : "NB data read"));
412 } else if (INT_ERROR(ec
)) {
414 pr_cont("Hardware Assert.\n");
417 } else if (fam_ops
.mc1_mce(ec
, xec
))
425 pr_emerg(HW_ERR
"Corrupted MC1 MCE info?\n");
428 static bool k8_mc2_mce(u16 ec
, u8 xec
)
433 pr_cont(" in the write data buffers.\n");
435 pr_cont(" in the victim data buffers.\n");
436 else if (xec
== 0x2 && MEM_ERROR(ec
))
437 pr_cont(": %s error in the L2 cache tags.\n", R4_MSG(ec
));
438 else if (xec
== 0x0) {
440 pr_cont("%s error in a Page Descriptor Cache or Guest TLB.\n",
442 else if (BUS_ERROR(ec
))
443 pr_cont(": %s/ECC error in data read from NB: %s.\n",
444 R4_MSG(ec
), PP_MSG(ec
));
445 else if (MEM_ERROR(ec
)) {
449 pr_cont(": %s error during data copyback.\n",
452 pr_cont(": %s parity/ECC error during data "
453 "access from L2.\n", R4_MSG(ec
));
464 static bool f15h_mc2_mce(u16 ec
, u8 xec
)
470 pr_cont("Data parity TLB read error.\n");
472 pr_cont("Poison data provided for TLB fill.\n");
475 } else if (BUS_ERROR(ec
)) {
479 pr_cont("Error during attempted NB data read.\n");
480 } else if (MEM_ERROR(ec
)) {
483 pr_cont("%s.\n", f15h_mc2_mce_desc
[xec
- 0x4]);
487 pr_cont("%s.\n", f15h_mc2_mce_desc
[xec
- 0x7]);
493 } else if (INT_ERROR(ec
)) {
495 pr_cont("Hardware Assert.\n");
503 static bool f16h_mc2_mce(u16 ec
, u8 xec
)
512 pr_cont("%cBUFF parity error.\n", (r4
== R4_RD
) ? 'I' : 'O');
517 pr_cont("ECC error in L2 tag (%s).\n",
518 ((r4
== R4_GEN
) ? "BankReq" :
519 ((r4
== R4_SNOOP
) ? "Prb" : "Fill")));
524 pr_cont("ECC error in L2 data array (%s).\n",
525 (((r4
== R4_RD
) && !(xec
& 0x3)) ? "Hit" :
526 ((r4
== R4_GEN
) ? "Attr" :
527 ((r4
== R4_EVICT
) ? "Vict" : "Fill"))));
532 pr_cont("Parity error in L2 attribute bits (%s).\n",
533 ((r4
== R4_RD
) ? "Hit" :
534 ((r4
== R4_GEN
) ? "Attr" : "Fill")));
544 static void decode_mc2_mce(struct mce
*m
)
546 u16 ec
= EC(m
->status
);
547 u8 xec
= XEC(m
->status
, xec_mask
);
549 pr_emerg(HW_ERR
"MC2 Error: ");
551 if (!fam_ops
.mc2_mce(ec
, xec
))
552 pr_cont(HW_ERR
"Corrupted MC2 MCE info?\n");
555 static void decode_mc3_mce(struct mce
*m
)
557 u16 ec
= EC(m
->status
);
558 u8 xec
= XEC(m
->status
, xec_mask
);
560 if (boot_cpu_data
.x86
>= 0x14) {
561 pr_emerg("You shouldn't be seeing MC3 MCE on this cpu family,"
562 " please report on LKML.\n");
566 pr_emerg(HW_ERR
"MC3 Error");
571 if (!BUS_ERROR(ec
) || (r4
!= R4_DRD
&& r4
!= R4_DWR
))
574 pr_cont(" during %s.\n", R4_MSG(ec
));
581 pr_emerg(HW_ERR
"Corrupted MC3 MCE info?\n");
584 static void decode_mc4_mce(struct mce
*m
)
586 unsigned int fam
= x86_family(m
->cpuid
);
587 int node_id
= topology_amd_node_id(m
->extcpu
);
588 u16 ec
= EC(m
->status
);
589 u8 xec
= XEC(m
->status
, 0x1f);
592 pr_emerg(HW_ERR
"MC4 Error (node %d): ", node_id
);
597 /* special handling for DRAM ECCs */
598 if (xec
== 0x0 || xec
== 0x8) {
599 /* no ECCs on F11h */
603 pr_cont("%s.\n", mc4_mce_desc
[xec
]);
606 decode_dram_ecc(node_id
, m
);
613 pr_cont("GART Table Walk data error.\n");
614 else if (BUS_ERROR(ec
))
615 pr_cont("DMA Exclusion Vector Table Walk error.\n");
621 if (fam
== 0x15 || fam
== 0x16)
622 pr_cont("Compute Unit Data Error.\n");
635 pr_cont("%s.\n", mc4_mce_desc
[xec
- offset
]);
639 pr_emerg(HW_ERR
"Corrupted MC4 MCE info?\n");
642 static void decode_mc5_mce(struct mce
*m
)
644 unsigned int fam
= x86_family(m
->cpuid
);
645 u16 ec
= EC(m
->status
);
646 u8 xec
= XEC(m
->status
, xec_mask
);
648 if (fam
== 0xf || fam
== 0x11)
651 pr_emerg(HW_ERR
"MC5 Error: ");
655 pr_cont("Hardware Assert.\n");
661 if (xec
== 0x0 || xec
== 0xc)
662 pr_cont("%s.\n", mc5_mce_desc
[xec
]);
664 pr_cont("%s parity error.\n", mc5_mce_desc
[xec
]);
671 pr_emerg(HW_ERR
"Corrupted MC5 MCE info?\n");
674 static void decode_mc6_mce(struct mce
*m
)
676 u8 xec
= XEC(m
->status
, xec_mask
);
678 pr_emerg(HW_ERR
"MC6 Error: ");
683 pr_cont("%s parity error.\n", mc6_mce_desc
[xec
]);
687 pr_emerg(HW_ERR
"Corrupted MC6 MCE info?\n");
690 static const char * const smca_long_names
[] = {
691 [SMCA_LS
... SMCA_LS_V2
] = "Load Store Unit",
692 [SMCA_IF
] = "Instruction Fetch Unit",
693 [SMCA_L2_CACHE
] = "L2 Cache",
694 [SMCA_DE
] = "Decode Unit",
695 [SMCA_RESERVED
] = "Reserved",
696 [SMCA_EX
] = "Execution Unit",
697 [SMCA_FP
] = "Floating Point Unit",
698 [SMCA_L3_CACHE
] = "L3 Cache",
699 [SMCA_CS
... SMCA_CS_V2
] = "Coherent Slave",
700 [SMCA_PIE
] = "Power, Interrupts, etc.",
702 /* UMC v2 is separate because both of them can exist in a single system. */
703 [SMCA_UMC
] = "Unified Memory Controller",
704 [SMCA_UMC_V2
] = "Unified Memory Controller v2",
705 [SMCA_PB
] = "Parameter Block",
706 [SMCA_PSP
... SMCA_PSP_V2
] = "Platform Security Processor",
707 [SMCA_SMU
... SMCA_SMU_V2
] = "System Management Unit",
708 [SMCA_MP5
] = "Microprocessor 5 Unit",
709 [SMCA_MPDMA
] = "MPDMA Unit",
710 [SMCA_NBIO
] = "Northbridge IO Unit",
711 [SMCA_PCIE
... SMCA_PCIE_V2
] = "PCI Express Unit",
712 [SMCA_XGMI_PCS
] = "Ext Global Memory Interconnect PCS Unit",
713 [SMCA_NBIF
] = "NBIF Unit",
714 [SMCA_SHUB
] = "System Hub Unit",
715 [SMCA_SATA
] = "SATA Unit",
716 [SMCA_USB
] = "USB Unit",
717 [SMCA_GMI_PCS
] = "Global Memory Interconnect PCS Unit",
718 [SMCA_XGMI_PHY
] = "Ext Global Memory Interconnect PHY Unit",
719 [SMCA_WAFL_PHY
] = "WAFL PHY Unit",
720 [SMCA_GMI_PHY
] = "Global Memory Interconnect PHY Unit",
723 static const char *smca_get_long_name(enum smca_bank_types t
)
725 if (t
>= N_SMCA_BANK_TYPES
)
728 return smca_long_names
[t
];
731 /* Decode errors according to Scalable MCA specification */
732 static void decode_smca_error(struct mce
*m
)
734 enum smca_bank_types bank_type
= smca_get_bank_type(m
->extcpu
, m
->bank
);
735 u8 xec
= XEC(m
->status
, xec_mask
);
737 if (bank_type
>= N_SMCA_BANK_TYPES
)
740 if (bank_type
== SMCA_RESERVED
) {
741 pr_emerg(HW_ERR
"Bank %d is reserved.\n", m
->bank
);
745 pr_emerg(HW_ERR
"%s Ext. Error Code: %d", smca_get_long_name(bank_type
), xec
);
747 if ((bank_type
== SMCA_UMC
|| bank_type
== SMCA_UMC_V2
) &&
748 xec
== 0 && decode_dram_ecc
)
749 decode_dram_ecc(topology_amd_node_id(m
->extcpu
), m
);
752 static inline void amd_decode_err_code(u16 ec
)
755 pr_emerg(HW_ERR
"internal: %s\n", UU_MSG(ec
));
759 pr_emerg(HW_ERR
"cache level: %s", LL_MSG(ec
));
762 pr_cont(", mem/io: %s", II_MSG(ec
));
764 pr_cont(", tx: %s", TT_MSG(ec
));
766 if (MEM_ERROR(ec
) || BUS_ERROR(ec
)) {
767 pr_cont(", mem-tx: %s", R4_MSG(ec
));
770 pr_cont(", part-proc: %s (%s)", PP_MSG(ec
), TO_MSG(ec
));
776 static const char *decode_error_status(struct mce
*m
)
778 if (m
->status
& MCI_STATUS_UC
) {
779 if (m
->status
& MCI_STATUS_PCC
)
780 return "System Fatal error.";
781 if (m
->mcgstatus
& MCG_STATUS_RIPV
)
782 return "Uncorrected, software restartable error.";
783 return "Uncorrected, software containable error.";
786 if (m
->status
& MCI_STATUS_DEFERRED
)
787 return "Deferred error, no action required.";
789 return "Corrected error, no action required.";
793 amd_decode_mce(struct notifier_block
*nb
, unsigned long val
, void *data
)
795 struct mce
*m
= (struct mce
*)data
;
796 struct mce_hw_err
*err
= to_mce_hw_err(m
);
797 unsigned int fam
= x86_family(m
->cpuid
);
798 u32 mca_config_lo
= 0, dummy
;
801 if (m
->kflags
& MCE_HANDLED_CEC
)
804 pr_emerg(HW_ERR
"%s\n", decode_error_status(m
));
806 pr_emerg(HW_ERR
"CPU:%d (%x:%x:%x) MC%d_STATUS[%s|%s|%s|%s|%s",
808 fam
, x86_model(m
->cpuid
), x86_stepping(m
->cpuid
),
810 ((m
->status
& MCI_STATUS_OVER
) ? "Over" : "-"),
811 ((m
->status
& MCI_STATUS_UC
) ? "UE" :
812 (m
->status
& MCI_STATUS_DEFERRED
) ? "-" : "CE"),
813 ((m
->status
& MCI_STATUS_MISCV
) ? "MiscV" : "-"),
814 ((m
->status
& MCI_STATUS_ADDRV
) ? "AddrV" : "-"),
815 ((m
->status
& MCI_STATUS_PCC
) ? "PCC" : "-"));
817 if (boot_cpu_has(X86_FEATURE_SMCA
)) {
818 rdmsr_safe(MSR_AMD64_SMCA_MCx_CONFIG(m
->bank
), &mca_config_lo
, &dummy
);
820 if (mca_config_lo
& MCI_CONFIG_MCAX
)
821 pr_cont("|%s", ((m
->status
& MCI_STATUS_TCC
) ? "TCC" : "-"));
823 pr_cont("|%s", ((m
->status
& MCI_STATUS_SYNDV
) ? "SyndV" : "-"));
826 /* do the two bits[14:13] together */
827 ecc
= (m
->status
>> 45) & 0x3;
829 pr_cont("|%sECC", ((ecc
== 2) ? "C" : "U"));
832 pr_cont("|%s", (m
->status
& MCI_STATUS_DEFERRED
? "Deferred" : "-"));
834 /* F15h, bank4, bit 43 is part of McaStatSubCache. */
835 if (fam
!= 0x15 || m
->bank
!= 4)
836 pr_cont("|%s", (m
->status
& MCI_STATUS_POISON
? "Poison" : "-"));
840 pr_cont("|%s", (m
->status
& MCI_STATUS_SCRUB
? "Scrub" : "-"));
842 pr_cont("]: 0x%016llx\n", m
->status
);
844 if (m
->status
& MCI_STATUS_ADDRV
)
845 pr_emerg(HW_ERR
"Error Addr: 0x%016llx\n", m
->addr
);
848 pr_emerg(HW_ERR
"PPIN: 0x%016llx\n", m
->ppin
);
850 if (boot_cpu_has(X86_FEATURE_SMCA
)) {
851 pr_emerg(HW_ERR
"IPID: 0x%016llx", m
->ipid
);
853 if (m
->status
& MCI_STATUS_SYNDV
) {
854 pr_cont(", Syndrome: 0x%016llx\n", m
->synd
);
855 if (mca_config_lo
& MCI_CONFIG_FRUTEXT
) {
859 memcpy(&frutext
[0], &err
->vendor
.amd
.synd1
, 8);
860 memcpy(&frutext
[8], &err
->vendor
.amd
.synd2
, 8);
862 pr_emerg(HW_ERR
"FRU Text: %s", frutext
);
868 decode_smca_error(m
);
873 pr_emerg(HW_ERR
"TSC: %llu\n", m
->tsc
);
875 /* Doesn't matter which member to test. */
876 if (!fam_ops
.mc0_mce
)
913 amd_decode_err_code(m
->status
& 0xffff);
915 m
->kflags
|= MCE_HANDLED_EDAC
;
919 static struct notifier_block amd_mce_dec_nb
= {
920 .notifier_call
= amd_decode_mce
,
921 .priority
= MCE_PRIO_EDAC
,
924 static int __init
mce_amd_init(void)
926 struct cpuinfo_x86
*c
= &boot_cpu_data
;
928 if (c
->x86_vendor
!= X86_VENDOR_AMD
&&
929 c
->x86_vendor
!= X86_VENDOR_HYGON
)
932 if (cpu_feature_enabled(X86_FEATURE_HYPERVISOR
))
935 if (boot_cpu_has(X86_FEATURE_SMCA
)) {
942 fam_ops
.mc0_mce
= k8_mc0_mce
;
943 fam_ops
.mc1_mce
= k8_mc1_mce
;
944 fam_ops
.mc2_mce
= k8_mc2_mce
;
948 fam_ops
.mc0_mce
= f10h_mc0_mce
;
949 fam_ops
.mc1_mce
= k8_mc1_mce
;
950 fam_ops
.mc2_mce
= k8_mc2_mce
;
954 fam_ops
.mc0_mce
= k8_mc0_mce
;
955 fam_ops
.mc1_mce
= k8_mc1_mce
;
956 fam_ops
.mc2_mce
= k8_mc2_mce
;
960 fam_ops
.mc0_mce
= f12h_mc0_mce
;
961 fam_ops
.mc1_mce
= k8_mc1_mce
;
962 fam_ops
.mc2_mce
= k8_mc2_mce
;
966 fam_ops
.mc0_mce
= cat_mc0_mce
;
967 fam_ops
.mc1_mce
= cat_mc1_mce
;
968 fam_ops
.mc2_mce
= k8_mc2_mce
;
972 xec_mask
= c
->x86_model
== 0x60 ? 0x3f : 0x1f;
974 fam_ops
.mc0_mce
= f15h_mc0_mce
;
975 fam_ops
.mc1_mce
= f15h_mc1_mce
;
976 fam_ops
.mc2_mce
= f15h_mc2_mce
;
981 fam_ops
.mc0_mce
= cat_mc0_mce
;
982 fam_ops
.mc1_mce
= cat_mc1_mce
;
983 fam_ops
.mc2_mce
= f16h_mc2_mce
;
988 pr_warn_once("Decoding supported only on Scalable MCA processors.\n");
992 printk(KERN_WARNING
"Huh? What family is it: 0x%x?!\n", c
->x86
);
997 pr_info("MCE: In-kernel MCE decoding enabled.\n");
999 mce_register_decode_chain(&amd_mce_dec_nb
);
1003 early_initcall(mce_amd_init
);
1006 static void __exit
mce_amd_exit(void)
1008 mce_unregister_decode_chain(&amd_mce_dec_nb
);
1011 MODULE_DESCRIPTION("AMD MCE decoder");
1012 MODULE_ALIAS("edac-mce-amd");
1013 MODULE_LICENSE("GPL");
1014 module_exit(mce_amd_exit
);