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