blob: a4c6a74ad2fb7abd64c0ed57f515d7897e586ce1 [file] [log] [blame]
Thomas Gleixner1a59d1b82019-05-27 08:55:05 +02001/* SPDX-License-Identifier: GPL-2.0-or-later */
Mahesh Salgaonkare22a2272013-10-30 20:05:11 +05302/*
3 * Machine check exception header file.
4 *
Mahesh Salgaonkare22a2272013-10-30 20:05:11 +05305 * 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
Mahesh Salgaonkar36df96f2013-10-30 20:05:40 +053014enum MCE_Version {
15 MCE_V1 = 1,
16};
17
18enum MCE_Severity {
19 MCE_SEV_NO_ERROR = 0,
20 MCE_SEV_WARNING = 1,
Mahesh Salgaonkarcda66182019-04-29 23:45:55 +053021 MCE_SEV_SEVERE = 2,
Mahesh Salgaonkar36df96f2013-10-30 20:05:40 +053022 MCE_SEV_FATAL = 3,
23};
24
25enum MCE_Disposition {
26 MCE_DISPOSITION_RECOVERED = 0,
27 MCE_DISPOSITION_NOT_RECOVERED = 1,
28};
29
30enum MCE_Initiator {
31 MCE_INITIATOR_UNKNOWN = 0,
32 MCE_INITIATOR_CPU = 1,
33};
34
35enum 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,
Nicholas Piggin7b9f71f92017-02-28 12:00:48 +100041 MCE_ERROR_TYPE_USER = 5,
42 MCE_ERROR_TYPE_RA = 6,
43 MCE_ERROR_TYPE_LINK = 7,
Mahesh Salgaonkar36df96f2013-10-30 20:05:40 +053044};
45
Mahesh Salgaonkar50dbabe2019-04-29 23:46:02 +053046enum 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
Mahesh Salgaonkar36df96f2013-10-30 20:05:40 +053054enum 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
62enum MCE_SlbErrorType {
63 MCE_SLB_ERROR_INDETERMINATE = 0,
64 MCE_SLB_ERROR_PARITY = 1,
65 MCE_SLB_ERROR_MULTIHIT = 2,
66};
67
68enum MCE_EratErrorType {
69 MCE_ERAT_ERROR_INDETERMINATE = 0,
70 MCE_ERAT_ERROR_PARITY = 1,
71 MCE_ERAT_ERROR_MULTIHIT = 2,
72};
73
74enum MCE_TlbErrorType {
75 MCE_TLB_ERROR_INDETERMINATE = 0,
76 MCE_TLB_ERROR_PARITY = 1,
77 MCE_TLB_ERROR_MULTIHIT = 2,
78};
79
Nicholas Piggin7b9f71f92017-02-28 12:00:48 +100080enum MCE_UserErrorType {
81 MCE_USER_ERROR_INDETERMINATE = 0,
82 MCE_USER_ERROR_TLBIE = 1,
83};
84
85enum MCE_RaErrorType {
86 MCE_RA_ERROR_INDETERMINATE = 0,
87 MCE_RA_ERROR_IFETCH = 1,
Nicholas Piggin90df4bf2017-05-29 16:26:44 +100088 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,
Nicholas Piggin7b9f71f92017-02-28 12:00:48 +100096};
97
98enum 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
Mahesh Salgaonkar36df96f2013-10-30 20:05:40 +0530107struct machine_check_event {
Mahesh Salgaonkarcda66182019-04-29 23:45:55 +0530108 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;
Mahesh Salgaonkar50dbabe2019-04-29 23:46:02 +0530113 enum MCE_ErrorClass error_class:8;
Mahesh Salgaonkarcda66182019-04-29 23:45:55 +0530114 enum MCE_Disposition disposition:8;
115 bool sync_error;
116 u16 cpu;
117 u64 gpr3;
118 u64 srr0;
119 u64 srr1;
120 union {
Mahesh Salgaonkar36df96f2013-10-30 20:05:40 +0530121 struct {
122 enum MCE_UeErrorType ue_error_type:8;
Mahesh Salgaonkarcda66182019-04-29 23:45:55 +0530123 u8 effective_address_provided;
124 u8 physical_address_provided;
125 u8 reserved_1[5];
126 u64 effective_address;
127 u64 physical_address;
128 u8 reserved_2[8];
Mahesh Salgaonkar36df96f2013-10-30 20:05:40 +0530129 } ue_error;
130
131 struct {
132 enum MCE_SlbErrorType slb_error_type:8;
Mahesh Salgaonkarcda66182019-04-29 23:45:55 +0530133 u8 effective_address_provided;
134 u8 reserved_1[6];
135 u64 effective_address;
136 u8 reserved_2[16];
Mahesh Salgaonkar36df96f2013-10-30 20:05:40 +0530137 } slb_error;
138
139 struct {
140 enum MCE_EratErrorType erat_error_type:8;
Mahesh Salgaonkarcda66182019-04-29 23:45:55 +0530141 u8 effective_address_provided;
142 u8 reserved_1[6];
143 u64 effective_address;
144 u8 reserved_2[16];
Mahesh Salgaonkar36df96f2013-10-30 20:05:40 +0530145 } erat_error;
146
147 struct {
148 enum MCE_TlbErrorType tlb_error_type:8;
Mahesh Salgaonkarcda66182019-04-29 23:45:55 +0530149 u8 effective_address_provided;
150 u8 reserved_1[6];
151 u64 effective_address;
152 u8 reserved_2[16];
Mahesh Salgaonkar36df96f2013-10-30 20:05:40 +0530153 } tlb_error;
Nicholas Piggin7b9f71f92017-02-28 12:00:48 +1000154
155 struct {
156 enum MCE_UserErrorType user_error_type:8;
Mahesh Salgaonkarcda66182019-04-29 23:45:55 +0530157 u8 effective_address_provided;
158 u8 reserved_1[6];
159 u64 effective_address;
160 u8 reserved_2[16];
Nicholas Piggin7b9f71f92017-02-28 12:00:48 +1000161 } user_error;
162
163 struct {
164 enum MCE_RaErrorType ra_error_type:8;
Mahesh Salgaonkarcda66182019-04-29 23:45:55 +0530165 u8 effective_address_provided;
166 u8 reserved_1[6];
167 u64 effective_address;
168 u8 reserved_2[16];
Nicholas Piggin7b9f71f92017-02-28 12:00:48 +1000169 } ra_error;
170
171 struct {
172 enum MCE_LinkErrorType link_error_type:8;
Mahesh Salgaonkarcda66182019-04-29 23:45:55 +0530173 u8 effective_address_provided;
174 u8 reserved_1[6];
175 u64 effective_address;
176 u8 reserved_2[16];
Nicholas Piggin7b9f71f92017-02-28 12:00:48 +1000177 } link_error;
Mahesh Salgaonkar36df96f2013-10-30 20:05:40 +0530178 } u;
179};
180
181struct mce_error_info {
182 enum MCE_ErrorType error_type:8;
183 union {
184 enum MCE_UeErrorType ue_error_type:8;
185 enum MCE_SlbErrorType slb_error_type:8;
186 enum MCE_EratErrorType erat_error_type:8;
187 enum MCE_TlbErrorType tlb_error_type:8;
Nicholas Piggin7b9f71f92017-02-28 12:00:48 +1000188 enum MCE_UserErrorType user_error_type:8;
189 enum MCE_RaErrorType ra_error_type:8;
190 enum MCE_LinkErrorType link_error_type:8;
Mahesh Salgaonkar36df96f2013-10-30 20:05:40 +0530191 } u;
Nicholas Pigginc1bbf382017-02-28 12:00:47 +1000192 enum MCE_Severity severity:8;
193 enum MCE_Initiator initiator:8;
Mahesh Salgaonkar50dbabe2019-04-29 23:46:02 +0530194 enum MCE_ErrorClass error_class:8;
Mahesh Salgaonkarcda66182019-04-29 23:45:55 +0530195 bool sync_error;
Mahesh Salgaonkar36df96f2013-10-30 20:05:40 +0530196};
197
198#define MAX_MC_EVT 100
199
200/* Release flags for get_mce_event() */
201#define MCE_EVENT_RELEASE true
202#define MCE_EVENT_DONTRELEASE false
203
204extern void save_mce_event(struct pt_regs *regs, long handled,
Mahesh Salgaonkar55672ec2013-12-16 10:46:24 +0530205 struct mce_error_info *mce_err, uint64_t nip,
Balbir Singhba41e1e2017-09-29 14:26:53 +1000206 uint64_t addr, uint64_t phys_addr);
Mahesh Salgaonkar36df96f2013-10-30 20:05:40 +0530207extern int get_mce_event(struct machine_check_event *mce, bool release);
208extern void release_mce_event(void);
Mahesh Salgaonkarb5ff4212013-10-30 20:05:49 +0530209extern void machine_check_queue_event(void);
Michael Ellerman63f44d62017-04-03 15:29:34 +1000210extern void machine_check_print_event_info(struct machine_check_event *evt,
Paul Mackerrasc0577202019-02-21 13:40:20 +1100211 bool user_mode, bool in_guest);
Ganesh Goudar7f177f92019-04-15 15:35:44 +0530212unsigned long addr_to_pfn(struct pt_regs *regs, unsigned long addr);
Mahesh Salgaonkara43c1592018-09-11 19:57:00 +0530213#ifdef CONFIG_PPC_BOOK3S_64
214void flush_and_reload_slb(void);
215#endif /* CONFIG_PPC_BOOK3S_64 */
Mahesh Salgaonkare22a2272013-10-30 20:05:11 +0530216#endif /* __ASM_PPC64_MCE_H__ */