xref: /linux/arch/powerpc/include/asm/mce.h (revision 9d535e200f09ce347afc38c81ec7f2901187e5f0)
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 /*
3  * Machine check exception header file.
4  *
5  * Copyright 2013 IBM Corporation
6  * Author: Mahesh Salgaonkar <mahesh@linux.vnet.ibm.com>
7  */
8 
9 #ifndef __ASM_PPC64_MCE_H__
10 #define __ASM_PPC64_MCE_H__
11 
12 #include <linux/bitops.h>
13 
14 enum MCE_Version {
15 	MCE_V1 = 1,
16 };
17 
18 enum MCE_Severity {
19 	MCE_SEV_NO_ERROR = 0,
20 	MCE_SEV_WARNING = 1,
21 	MCE_SEV_SEVERE = 2,
22 	MCE_SEV_FATAL = 3,
23 };
24 
25 enum MCE_Disposition {
26 	MCE_DISPOSITION_RECOVERED = 0,
27 	MCE_DISPOSITION_NOT_RECOVERED = 1,
28 };
29 
30 enum MCE_Initiator {
31 	MCE_INITIATOR_UNKNOWN = 0,
32 	MCE_INITIATOR_CPU = 1,
33 };
34 
35 enum MCE_ErrorType {
36 	MCE_ERROR_TYPE_UNKNOWN = 0,
37 	MCE_ERROR_TYPE_UE = 1,
38 	MCE_ERROR_TYPE_SLB = 2,
39 	MCE_ERROR_TYPE_ERAT = 3,
40 	MCE_ERROR_TYPE_TLB = 4,
41 	MCE_ERROR_TYPE_USER = 5,
42 	MCE_ERROR_TYPE_RA = 6,
43 	MCE_ERROR_TYPE_LINK = 7,
44 };
45 
46 enum MCE_ErrorClass {
47 	MCE_ECLASS_UNKNOWN = 0,
48 	MCE_ECLASS_HARDWARE,
49 	MCE_ECLASS_HARD_INDETERMINATE,
50 	MCE_ECLASS_SOFTWARE,
51 	MCE_ECLASS_SOFT_INDETERMINATE,
52 };
53 
54 enum MCE_UeErrorType {
55 	MCE_UE_ERROR_INDETERMINATE = 0,
56 	MCE_UE_ERROR_IFETCH = 1,
57 	MCE_UE_ERROR_PAGE_TABLE_WALK_IFETCH = 2,
58 	MCE_UE_ERROR_LOAD_STORE = 3,
59 	MCE_UE_ERROR_PAGE_TABLE_WALK_LOAD_STORE = 4,
60 };
61 
62 enum MCE_SlbErrorType {
63 	MCE_SLB_ERROR_INDETERMINATE = 0,
64 	MCE_SLB_ERROR_PARITY = 1,
65 	MCE_SLB_ERROR_MULTIHIT = 2,
66 };
67 
68 enum MCE_EratErrorType {
69 	MCE_ERAT_ERROR_INDETERMINATE = 0,
70 	MCE_ERAT_ERROR_PARITY = 1,
71 	MCE_ERAT_ERROR_MULTIHIT = 2,
72 };
73 
74 enum MCE_TlbErrorType {
75 	MCE_TLB_ERROR_INDETERMINATE = 0,
76 	MCE_TLB_ERROR_PARITY = 1,
77 	MCE_TLB_ERROR_MULTIHIT = 2,
78 };
79 
80 enum MCE_UserErrorType {
81 	MCE_USER_ERROR_INDETERMINATE = 0,
82 	MCE_USER_ERROR_TLBIE = 1,
83 };
84 
85 enum MCE_RaErrorType {
86 	MCE_RA_ERROR_INDETERMINATE = 0,
87 	MCE_RA_ERROR_IFETCH = 1,
88 	MCE_RA_ERROR_IFETCH_FOREIGN = 2,
89 	MCE_RA_ERROR_PAGE_TABLE_WALK_IFETCH = 3,
90 	MCE_RA_ERROR_PAGE_TABLE_WALK_IFETCH_FOREIGN = 4,
91 	MCE_RA_ERROR_LOAD = 5,
92 	MCE_RA_ERROR_STORE = 6,
93 	MCE_RA_ERROR_PAGE_TABLE_WALK_LOAD_STORE = 7,
94 	MCE_RA_ERROR_PAGE_TABLE_WALK_LOAD_STORE_FOREIGN = 8,
95 	MCE_RA_ERROR_LOAD_STORE_FOREIGN = 9,
96 };
97 
98 enum MCE_LinkErrorType {
99 	MCE_LINK_ERROR_INDETERMINATE = 0,
100 	MCE_LINK_ERROR_IFETCH_TIMEOUT = 1,
101 	MCE_LINK_ERROR_PAGE_TABLE_WALK_IFETCH_TIMEOUT = 2,
102 	MCE_LINK_ERROR_LOAD_TIMEOUT = 3,
103 	MCE_LINK_ERROR_STORE_TIMEOUT = 4,
104 	MCE_LINK_ERROR_PAGE_TABLE_WALK_LOAD_STORE_TIMEOUT = 5,
105 };
106 
107 struct machine_check_event {
108 	enum MCE_Version	version:8;
109 	u8			in_use;
110 	enum MCE_Severity	severity:8;
111 	enum MCE_Initiator	initiator:8;
112 	enum MCE_ErrorType	error_type:8;
113 	enum MCE_ErrorClass	error_class:8;
114 	enum MCE_Disposition	disposition:8;
115 	bool			sync_error;
116 	u16			cpu;
117 	u64			gpr3;
118 	u64			srr0;
119 	u64			srr1;
120 	union {
121 		struct {
122 			enum MCE_UeErrorType ue_error_type:8;
123 			u8		effective_address_provided;
124 			u8		physical_address_provided;
125 			u8		ignore_event;
126 			u8		reserved_1[4];
127 			u64		effective_address;
128 			u64		physical_address;
129 			u8		reserved_2[8];
130 		} ue_error;
131 
132 		struct {
133 			enum MCE_SlbErrorType slb_error_type:8;
134 			u8		effective_address_provided;
135 			u8		reserved_1[6];
136 			u64		effective_address;
137 			u8		reserved_2[16];
138 		} slb_error;
139 
140 		struct {
141 			enum MCE_EratErrorType erat_error_type:8;
142 			u8		effective_address_provided;
143 			u8		reserved_1[6];
144 			u64		effective_address;
145 			u8		reserved_2[16];
146 		} erat_error;
147 
148 		struct {
149 			enum MCE_TlbErrorType tlb_error_type:8;
150 			u8		effective_address_provided;
151 			u8		reserved_1[6];
152 			u64		effective_address;
153 			u8		reserved_2[16];
154 		} tlb_error;
155 
156 		struct {
157 			enum MCE_UserErrorType user_error_type:8;
158 			u8		effective_address_provided;
159 			u8		reserved_1[6];
160 			u64		effective_address;
161 			u8		reserved_2[16];
162 		} user_error;
163 
164 		struct {
165 			enum MCE_RaErrorType ra_error_type:8;
166 			u8		effective_address_provided;
167 			u8		reserved_1[6];
168 			u64		effective_address;
169 			u8		reserved_2[16];
170 		} ra_error;
171 
172 		struct {
173 			enum MCE_LinkErrorType link_error_type:8;
174 			u8		effective_address_provided;
175 			u8		reserved_1[6];
176 			u64		effective_address;
177 			u8		reserved_2[16];
178 		} link_error;
179 	} u;
180 };
181 
182 struct mce_error_info {
183 	enum MCE_ErrorType error_type:8;
184 	union {
185 		enum MCE_UeErrorType ue_error_type:8;
186 		enum MCE_SlbErrorType slb_error_type:8;
187 		enum MCE_EratErrorType erat_error_type:8;
188 		enum MCE_TlbErrorType tlb_error_type:8;
189 		enum MCE_UserErrorType user_error_type:8;
190 		enum MCE_RaErrorType ra_error_type:8;
191 		enum MCE_LinkErrorType link_error_type:8;
192 	} u;
193 	enum MCE_Severity	severity:8;
194 	enum MCE_Initiator	initiator:8;
195 	enum MCE_ErrorClass	error_class:8;
196 	bool			sync_error;
197 	bool			ignore_event;
198 };
199 
200 #define MAX_MC_EVT	100
201 
202 /* Release flags for get_mce_event() */
203 #define MCE_EVENT_RELEASE	true
204 #define MCE_EVENT_DONTRELEASE	false
205 
206 extern void save_mce_event(struct pt_regs *regs, long handled,
207 			   struct mce_error_info *mce_err, uint64_t nip,
208 			   uint64_t addr, uint64_t phys_addr);
209 extern int get_mce_event(struct machine_check_event *mce, bool release);
210 extern void release_mce_event(void);
211 extern void machine_check_queue_event(void);
212 extern void machine_check_print_event_info(struct machine_check_event *evt,
213 					   bool user_mode, bool in_guest);
214 unsigned long addr_to_pfn(struct pt_regs *regs, unsigned long addr);
215 #ifdef CONFIG_PPC_BOOK3S_64
216 void flush_and_reload_slb(void);
217 #endif /* CONFIG_PPC_BOOK3S_64 */
218 #endif /* __ASM_PPC64_MCE_H__ */
219