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