1
2#ifndef _ASM_X86_MCE_H
3#define _ASM_X86_MCE_H
4
5#include <uapi/asm/mce.h>
6
7
8
9
10
11
12#define MCG_BANKCNT_MASK 0xff
13#define MCG_CTL_P BIT_ULL(8)
14#define MCG_EXT_P BIT_ULL(9)
15#define MCG_CMCI_P BIT_ULL(10)
16#define MCG_EXT_CNT_MASK 0xff0000
17#define MCG_EXT_CNT_SHIFT 16
18#define MCG_EXT_CNT(c) (((c) & MCG_EXT_CNT_MASK) >> MCG_EXT_CNT_SHIFT)
19#define MCG_SER_P BIT_ULL(24)
20#define MCG_ELOG_P BIT_ULL(26)
21#define MCG_LMCE_P BIT_ULL(27)
22
23
24#define MCG_STATUS_RIPV BIT_ULL(0)
25#define MCG_STATUS_EIPV BIT_ULL(1)
26#define MCG_STATUS_MCIP BIT_ULL(2)
27#define MCG_STATUS_LMCES BIT_ULL(3)
28
29
30#define MCG_EXT_CTL_LMCE_EN BIT_ULL(0)
31
32
33#define MCI_STATUS_VAL BIT_ULL(63)
34#define MCI_STATUS_OVER BIT_ULL(62)
35#define MCI_STATUS_UC BIT_ULL(61)
36#define MCI_STATUS_EN BIT_ULL(60)
37#define MCI_STATUS_MISCV BIT_ULL(59)
38#define MCI_STATUS_ADDRV BIT_ULL(58)
39#define MCI_STATUS_PCC BIT_ULL(57)
40#define MCI_STATUS_S BIT_ULL(56)
41#define MCI_STATUS_AR BIT_ULL(55)
42#define MCI_STATUS_CEC_SHIFT 38
43#define MCI_STATUS_CEC_MASK GENMASK_ULL(52,38)
44#define MCI_STATUS_CEC(c) (((c) & MCI_STATUS_CEC_MASK) >> MCI_STATUS_CEC_SHIFT)
45
46
47#define MCI_STATUS_TCC BIT_ULL(55)
48#define MCI_STATUS_SYNDV BIT_ULL(53)
49#define MCI_STATUS_DEFERRED BIT_ULL(44)
50#define MCI_STATUS_POISON BIT_ULL(43)
51#define MCI_STATUS_SCRUB BIT_ULL(40)
52
53
54
55
56
57
58
59
60#define MCI_CONFIG_MCAX 0x1
61#define MCI_IPID_MCATYPE 0xFFFF0000
62#define MCI_IPID_HWID 0xFFF
63
64
65
66
67
68
69
70
71
72#define MCACOD 0xefff
73
74
75#define MCACOD_SCRUB 0x00C0
76#define MCACOD_SCRUBMSK 0xeff0
77#define MCACOD_L3WB 0x017A
78#define MCACOD_DATA 0x0134
79#define MCACOD_INSTR 0x0150
80
81
82#define MCI_MISC_ADDR_LSB(m) ((m) & 0x3f)
83#define MCI_MISC_ADDR_MODE(m) (((m) >> 6) & 7)
84#define MCI_MISC_ADDR_SEGOFF 0
85#define MCI_MISC_ADDR_LINEAR 1
86#define MCI_MISC_ADDR_PHYS 2
87#define MCI_MISC_ADDR_MEM 3
88#define MCI_MISC_ADDR_GENERIC 7
89
90
91#define MCI_CTL2_CMCI_EN BIT_ULL(30)
92#define MCI_CTL2_CMCI_THRESHOLD_MASK 0x7fffULL
93
94#define MCJ_CTX_MASK 3
95#define MCJ_CTX(flags) ((flags) & MCJ_CTX_MASK)
96#define MCJ_CTX_RANDOM 0
97#define MCJ_CTX_PROCESS 0x1
98#define MCJ_CTX_IRQ 0x2
99#define MCJ_NMI_BROADCAST 0x4
100#define MCJ_EXCEPTION 0x8
101#define MCJ_IRQ_BROADCAST 0x10
102
103#define MCE_OVERFLOW 0
104
105#define MCE_LOG_MIN_LEN 32U
106#define MCE_LOG_SIGNATURE "MACHINECHECK"
107
108
109#define MSR_AMD64_SMCA_MC0_CTL 0xc0002000
110#define MSR_AMD64_SMCA_MC0_STATUS 0xc0002001
111#define MSR_AMD64_SMCA_MC0_ADDR 0xc0002002
112#define MSR_AMD64_SMCA_MC0_MISC0 0xc0002003
113#define MSR_AMD64_SMCA_MC0_CONFIG 0xc0002004
114#define MSR_AMD64_SMCA_MC0_IPID 0xc0002005
115#define MSR_AMD64_SMCA_MC0_SYND 0xc0002006
116#define MSR_AMD64_SMCA_MC0_DESTAT 0xc0002008
117#define MSR_AMD64_SMCA_MC0_DEADDR 0xc0002009
118#define MSR_AMD64_SMCA_MC0_MISC1 0xc000200a
119#define MSR_AMD64_SMCA_MCx_CTL(x) (MSR_AMD64_SMCA_MC0_CTL + 0x10*(x))
120#define MSR_AMD64_SMCA_MCx_STATUS(x) (MSR_AMD64_SMCA_MC0_STATUS + 0x10*(x))
121#define MSR_AMD64_SMCA_MCx_ADDR(x) (MSR_AMD64_SMCA_MC0_ADDR + 0x10*(x))
122#define MSR_AMD64_SMCA_MCx_MISC(x) (MSR_AMD64_SMCA_MC0_MISC0 + 0x10*(x))
123#define MSR_AMD64_SMCA_MCx_CONFIG(x) (MSR_AMD64_SMCA_MC0_CONFIG + 0x10*(x))
124#define MSR_AMD64_SMCA_MCx_IPID(x) (MSR_AMD64_SMCA_MC0_IPID + 0x10*(x))
125#define MSR_AMD64_SMCA_MCx_SYND(x) (MSR_AMD64_SMCA_MC0_SYND + 0x10*(x))
126#define MSR_AMD64_SMCA_MCx_DESTAT(x) (MSR_AMD64_SMCA_MC0_DESTAT + 0x10*(x))
127#define MSR_AMD64_SMCA_MCx_DEADDR(x) (MSR_AMD64_SMCA_MC0_DEADDR + 0x10*(x))
128#define MSR_AMD64_SMCA_MCx_MISCy(x, y) ((MSR_AMD64_SMCA_MC0_MISC1 + y) + (0x10*(x)))
129
130
131
132
133
134
135
136struct mce_log_buffer {
137 char signature[12];
138 unsigned len;
139 unsigned next;
140 unsigned flags;
141 unsigned recordlen;
142 struct mce entry[];
143};
144
145enum mce_notifier_prios {
146 MCE_PRIO_FIRST = INT_MAX,
147 MCE_PRIO_UC = INT_MAX - 1,
148 MCE_PRIO_EXTLOG = INT_MAX - 2,
149 MCE_PRIO_NFIT = INT_MAX - 3,
150 MCE_PRIO_EDAC = INT_MAX - 4,
151 MCE_PRIO_MCELOG = 1,
152 MCE_PRIO_LOWEST = 0,
153};
154
155struct notifier_block;
156extern void mce_register_decode_chain(struct notifier_block *nb);
157extern void mce_unregister_decode_chain(struct notifier_block *nb);
158
159#include <linux/percpu.h>
160#include <linux/atomic.h>
161
162extern int mce_p5_enabled;
163
164#ifdef CONFIG_X86_MCE
165int mcheck_init(void);
166void mcheck_cpu_init(struct cpuinfo_x86 *c);
167void mcheck_cpu_clear(struct cpuinfo_x86 *c);
168void mcheck_vendor_init_severity(void);
169#else
170static inline int mcheck_init(void) { return 0; }
171static inline void mcheck_cpu_init(struct cpuinfo_x86 *c) {}
172static inline void mcheck_cpu_clear(struct cpuinfo_x86 *c) {}
173static inline void mcheck_vendor_init_severity(void) {}
174#endif
175
176#ifdef CONFIG_X86_ANCIENT_MCE
177void intel_p5_mcheck_init(struct cpuinfo_x86 *c);
178void winchip_mcheck_init(struct cpuinfo_x86 *c);
179static inline void enable_p5_mce(void) { mce_p5_enabled = 1; }
180#else
181static inline void intel_p5_mcheck_init(struct cpuinfo_x86 *c) {}
182static inline void winchip_mcheck_init(struct cpuinfo_x86 *c) {}
183static inline void enable_p5_mce(void) {}
184#endif
185
186void mce_setup(struct mce *m);
187void mce_log(struct mce *m);
188DECLARE_PER_CPU(struct device *, mce_device);
189
190
191
192
193
194
195#define MAX_NR_BANKS 32
196
197#ifdef CONFIG_X86_MCE_INTEL
198void mce_intel_feature_init(struct cpuinfo_x86 *c);
199void mce_intel_feature_clear(struct cpuinfo_x86 *c);
200void cmci_clear(void);
201void cmci_reenable(void);
202void cmci_rediscover(void);
203void cmci_recheck(void);
204#else
205static inline void mce_intel_feature_init(struct cpuinfo_x86 *c) { }
206static inline void mce_intel_feature_clear(struct cpuinfo_x86 *c) { }
207static inline void cmci_clear(void) {}
208static inline void cmci_reenable(void) {}
209static inline void cmci_rediscover(void) {}
210static inline void cmci_recheck(void) {}
211#endif
212
213int mce_available(struct cpuinfo_x86 *c);
214bool mce_is_memory_error(struct mce *m);
215bool mce_is_correctable(struct mce *m);
216int mce_usable_address(struct mce *m);
217
218DECLARE_PER_CPU(unsigned, mce_exception_count);
219DECLARE_PER_CPU(unsigned, mce_poll_count);
220
221typedef DECLARE_BITMAP(mce_banks_t, MAX_NR_BANKS);
222DECLARE_PER_CPU(mce_banks_t, mce_poll_banks);
223
224enum mcp_flags {
225 MCP_TIMESTAMP = BIT(0),
226 MCP_UC = BIT(1),
227 MCP_DONTLOG = BIT(2),
228};
229bool machine_check_poll(enum mcp_flags flags, mce_banks_t *b);
230
231int mce_notify_irq(void);
232
233DECLARE_PER_CPU(struct mce, injectm);
234
235
236extern void mce_disable_bank(int bank);
237
238
239
240
241void do_machine_check(struct pt_regs *, long);
242
243
244
245
246extern void (*mce_threshold_vector)(void);
247
248
249extern void (*deferred_error_int_vector)(void);
250
251
252
253
254
255void intel_init_thermal(struct cpuinfo_x86 *c);
256
257
258extern int (*platform_thermal_notify)(__u64 msr_val);
259
260
261extern int (*platform_thermal_package_notify)(__u64 msr_val);
262
263
264
265extern bool (*platform_thermal_package_rate_control)(void);
266
267#ifdef CONFIG_X86_THERMAL_VECTOR
268extern void mcheck_intel_therm_init(void);
269#else
270static inline void mcheck_intel_therm_init(void) { }
271#endif
272
273
274
275
276
277struct cper_sec_mem_err;
278extern void apei_mce_report_mem_error(int corrected,
279 struct cper_sec_mem_err *mem_err);
280
281
282
283
284
285#ifdef CONFIG_X86_MCE_AMD
286
287
288enum smca_bank_types {
289 SMCA_LS = 0,
290 SMCA_LS_V2,
291 SMCA_IF,
292 SMCA_L2_CACHE,
293 SMCA_DE,
294 SMCA_RESERVED,
295 SMCA_EX,
296 SMCA_FP,
297 SMCA_L3_CACHE,
298 SMCA_CS,
299 SMCA_CS_V2,
300 SMCA_PIE,
301 SMCA_UMC,
302 SMCA_PB,
303 SMCA_PSP,
304 SMCA_PSP_V2,
305 SMCA_SMU,
306 SMCA_SMU_V2,
307 SMCA_MP5,
308 SMCA_NBIO,
309 SMCA_PCIE,
310 N_SMCA_BANK_TYPES
311};
312
313#define HWID_MCATYPE(hwid, mcatype) (((hwid) << 16) | (mcatype))
314
315struct smca_hwid {
316 unsigned int bank_type;
317 u32 hwid_mcatype;
318 u32 xec_bitmap;
319 u8 count;
320};
321
322struct smca_bank {
323 struct smca_hwid *hwid;
324 u32 id;
325 u8 sysfs_id;
326};
327
328extern struct smca_bank smca_banks[MAX_NR_BANKS];
329
330extern const char *smca_get_long_name(enum smca_bank_types t);
331extern bool amd_mce_is_memory_error(struct mce *m);
332
333extern int mce_threshold_create_device(unsigned int cpu);
334extern int mce_threshold_remove_device(unsigned int cpu);
335
336void mce_amd_feature_init(struct cpuinfo_x86 *c);
337int umc_normaddr_to_sysaddr(u64 norm_addr, u16 nid, u8 umc, u64 *sys_addr);
338
339#else
340
341static inline int mce_threshold_create_device(unsigned int cpu) { return 0; };
342static inline int mce_threshold_remove_device(unsigned int cpu) { return 0; };
343static inline bool amd_mce_is_memory_error(struct mce *m) { return false; };
344static inline void mce_amd_feature_init(struct cpuinfo_x86 *c) { }
345static inline int
346umc_normaddr_to_sysaddr(u64 norm_addr, u16 nid, u8 umc, u64 *sys_addr) { return -EINVAL; };
347#endif
348
349static inline void mce_hygon_feature_init(struct cpuinfo_x86 *c) { return mce_amd_feature_init(c); }
350
351#endif
352