11a59d1b8SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */ 2e22a2274SMahesh Salgaonkar /* 3e22a2274SMahesh Salgaonkar * Machine check exception header file. 4e22a2274SMahesh Salgaonkar * 5e22a2274SMahesh Salgaonkar * Copyright 2013 IBM Corporation 6e22a2274SMahesh Salgaonkar * Author: Mahesh Salgaonkar <mahesh@linux.vnet.ibm.com> 7e22a2274SMahesh Salgaonkar */ 8e22a2274SMahesh Salgaonkar 9e22a2274SMahesh Salgaonkar #ifndef __ASM_PPC64_MCE_H__ 10e22a2274SMahesh Salgaonkar #define __ASM_PPC64_MCE_H__ 11e22a2274SMahesh Salgaonkar 12e22a2274SMahesh Salgaonkar #include <linux/bitops.h> 13e22a2274SMahesh Salgaonkar 1436df96f8SMahesh Salgaonkar enum MCE_Version { 1536df96f8SMahesh Salgaonkar MCE_V1 = 1, 1636df96f8SMahesh Salgaonkar }; 1736df96f8SMahesh Salgaonkar 1836df96f8SMahesh Salgaonkar enum MCE_Severity { 1936df96f8SMahesh Salgaonkar MCE_SEV_NO_ERROR = 0, 2036df96f8SMahesh Salgaonkar MCE_SEV_WARNING = 1, 21cda6618dSMahesh Salgaonkar MCE_SEV_SEVERE = 2, 2236df96f8SMahesh Salgaonkar MCE_SEV_FATAL = 3, 2336df96f8SMahesh Salgaonkar }; 2436df96f8SMahesh Salgaonkar 2536df96f8SMahesh Salgaonkar enum MCE_Disposition { 2636df96f8SMahesh Salgaonkar MCE_DISPOSITION_RECOVERED = 0, 2736df96f8SMahesh Salgaonkar MCE_DISPOSITION_NOT_RECOVERED = 1, 2836df96f8SMahesh Salgaonkar }; 2936df96f8SMahesh Salgaonkar 3036df96f8SMahesh Salgaonkar enum MCE_Initiator { 3136df96f8SMahesh Salgaonkar MCE_INITIATOR_UNKNOWN = 0, 3236df96f8SMahesh Salgaonkar MCE_INITIATOR_CPU = 1, 339ca766f9SNicholas Piggin MCE_INITIATOR_PCI = 2, 349ca766f9SNicholas Piggin MCE_INITIATOR_ISA = 3, 359ca766f9SNicholas Piggin MCE_INITIATOR_MEMORY= 4, 369ca766f9SNicholas Piggin MCE_INITIATOR_POWERMGM = 5, 3736df96f8SMahesh Salgaonkar }; 3836df96f8SMahesh Salgaonkar 3936df96f8SMahesh Salgaonkar enum MCE_ErrorType { 4036df96f8SMahesh Salgaonkar MCE_ERROR_TYPE_UNKNOWN = 0, 4136df96f8SMahesh Salgaonkar MCE_ERROR_TYPE_UE = 1, 4236df96f8SMahesh Salgaonkar MCE_ERROR_TYPE_SLB = 2, 4336df96f8SMahesh Salgaonkar MCE_ERROR_TYPE_ERAT = 3, 4436df96f8SMahesh Salgaonkar MCE_ERROR_TYPE_TLB = 4, 457b9f71f9SNicholas Piggin MCE_ERROR_TYPE_USER = 5, 467b9f71f9SNicholas Piggin MCE_ERROR_TYPE_RA = 6, 477b9f71f9SNicholas Piggin MCE_ERROR_TYPE_LINK = 7, 489ca766f9SNicholas Piggin MCE_ERROR_TYPE_DCACHE = 8, 499ca766f9SNicholas Piggin MCE_ERROR_TYPE_ICACHE = 9, 5036df96f8SMahesh Salgaonkar }; 5136df96f8SMahesh Salgaonkar 5250dbabe0SMahesh Salgaonkar enum MCE_ErrorClass { 5350dbabe0SMahesh Salgaonkar MCE_ECLASS_UNKNOWN = 0, 5450dbabe0SMahesh Salgaonkar MCE_ECLASS_HARDWARE, 5550dbabe0SMahesh Salgaonkar MCE_ECLASS_HARD_INDETERMINATE, 5650dbabe0SMahesh Salgaonkar MCE_ECLASS_SOFTWARE, 5750dbabe0SMahesh Salgaonkar MCE_ECLASS_SOFT_INDETERMINATE, 5850dbabe0SMahesh Salgaonkar }; 5950dbabe0SMahesh Salgaonkar 6036df96f8SMahesh Salgaonkar enum MCE_UeErrorType { 6136df96f8SMahesh Salgaonkar MCE_UE_ERROR_INDETERMINATE = 0, 6236df96f8SMahesh Salgaonkar MCE_UE_ERROR_IFETCH = 1, 6336df96f8SMahesh Salgaonkar MCE_UE_ERROR_PAGE_TABLE_WALK_IFETCH = 2, 6436df96f8SMahesh Salgaonkar MCE_UE_ERROR_LOAD_STORE = 3, 6536df96f8SMahesh Salgaonkar MCE_UE_ERROR_PAGE_TABLE_WALK_LOAD_STORE = 4, 6636df96f8SMahesh Salgaonkar }; 6736df96f8SMahesh Salgaonkar 6836df96f8SMahesh Salgaonkar enum MCE_SlbErrorType { 6936df96f8SMahesh Salgaonkar MCE_SLB_ERROR_INDETERMINATE = 0, 7036df96f8SMahesh Salgaonkar MCE_SLB_ERROR_PARITY = 1, 7136df96f8SMahesh Salgaonkar MCE_SLB_ERROR_MULTIHIT = 2, 7236df96f8SMahesh Salgaonkar }; 7336df96f8SMahesh Salgaonkar 7436df96f8SMahesh Salgaonkar enum MCE_EratErrorType { 7536df96f8SMahesh Salgaonkar MCE_ERAT_ERROR_INDETERMINATE = 0, 7636df96f8SMahesh Salgaonkar MCE_ERAT_ERROR_PARITY = 1, 7736df96f8SMahesh Salgaonkar MCE_ERAT_ERROR_MULTIHIT = 2, 7836df96f8SMahesh Salgaonkar }; 7936df96f8SMahesh Salgaonkar 8036df96f8SMahesh Salgaonkar enum MCE_TlbErrorType { 8136df96f8SMahesh Salgaonkar MCE_TLB_ERROR_INDETERMINATE = 0, 8236df96f8SMahesh Salgaonkar MCE_TLB_ERROR_PARITY = 1, 8336df96f8SMahesh Salgaonkar MCE_TLB_ERROR_MULTIHIT = 2, 8436df96f8SMahesh Salgaonkar }; 8536df96f8SMahesh Salgaonkar 867b9f71f9SNicholas Piggin enum MCE_UserErrorType { 877b9f71f9SNicholas Piggin MCE_USER_ERROR_INDETERMINATE = 0, 887b9f71f9SNicholas Piggin MCE_USER_ERROR_TLBIE = 1, 89201220bbSNicholas Piggin MCE_USER_ERROR_SCV = 2, 907b9f71f9SNicholas Piggin }; 917b9f71f9SNicholas Piggin 927b9f71f9SNicholas Piggin enum MCE_RaErrorType { 937b9f71f9SNicholas Piggin MCE_RA_ERROR_INDETERMINATE = 0, 947b9f71f9SNicholas Piggin MCE_RA_ERROR_IFETCH = 1, 9590df4bfbSNicholas Piggin MCE_RA_ERROR_IFETCH_FOREIGN = 2, 9690df4bfbSNicholas Piggin MCE_RA_ERROR_PAGE_TABLE_WALK_IFETCH = 3, 9790df4bfbSNicholas Piggin MCE_RA_ERROR_PAGE_TABLE_WALK_IFETCH_FOREIGN = 4, 9890df4bfbSNicholas Piggin MCE_RA_ERROR_LOAD = 5, 9990df4bfbSNicholas Piggin MCE_RA_ERROR_STORE = 6, 10090df4bfbSNicholas Piggin MCE_RA_ERROR_PAGE_TABLE_WALK_LOAD_STORE = 7, 10190df4bfbSNicholas Piggin MCE_RA_ERROR_PAGE_TABLE_WALK_LOAD_STORE_FOREIGN = 8, 10290df4bfbSNicholas Piggin MCE_RA_ERROR_LOAD_STORE_FOREIGN = 9, 1037b9f71f9SNicholas Piggin }; 1047b9f71f9SNicholas Piggin 1057b9f71f9SNicholas Piggin enum MCE_LinkErrorType { 1067b9f71f9SNicholas Piggin MCE_LINK_ERROR_INDETERMINATE = 0, 1077b9f71f9SNicholas Piggin MCE_LINK_ERROR_IFETCH_TIMEOUT = 1, 1087b9f71f9SNicholas Piggin MCE_LINK_ERROR_PAGE_TABLE_WALK_IFETCH_TIMEOUT = 2, 1097b9f71f9SNicholas Piggin MCE_LINK_ERROR_LOAD_TIMEOUT = 3, 1107b9f71f9SNicholas Piggin MCE_LINK_ERROR_STORE_TIMEOUT = 4, 1117b9f71f9SNicholas Piggin MCE_LINK_ERROR_PAGE_TABLE_WALK_LOAD_STORE_TIMEOUT = 5, 1127b9f71f9SNicholas Piggin }; 1137b9f71f9SNicholas Piggin 11436df96f8SMahesh Salgaonkar struct machine_check_event { 115cda6618dSMahesh Salgaonkar enum MCE_Version version:8; 116cda6618dSMahesh Salgaonkar u8 in_use; 117cda6618dSMahesh Salgaonkar enum MCE_Severity severity:8; 118cda6618dSMahesh Salgaonkar enum MCE_Initiator initiator:8; 119cda6618dSMahesh Salgaonkar enum MCE_ErrorType error_type:8; 12050dbabe0SMahesh Salgaonkar enum MCE_ErrorClass error_class:8; 121cda6618dSMahesh Salgaonkar enum MCE_Disposition disposition:8; 122cda6618dSMahesh Salgaonkar bool sync_error; 123cda6618dSMahesh Salgaonkar u16 cpu; 124cda6618dSMahesh Salgaonkar u64 gpr3; 125cda6618dSMahesh Salgaonkar u64 srr0; 126cda6618dSMahesh Salgaonkar u64 srr1; 127cda6618dSMahesh Salgaonkar union { 12836df96f8SMahesh Salgaonkar struct { 12936df96f8SMahesh Salgaonkar enum MCE_UeErrorType ue_error_type:8; 130cda6618dSMahesh Salgaonkar u8 effective_address_provided; 131cda6618dSMahesh Salgaonkar u8 physical_address_provided; 132895e3dceSBalbir Singh u8 ignore_event; 133895e3dceSBalbir Singh u8 reserved_1[4]; 134cda6618dSMahesh Salgaonkar u64 effective_address; 135cda6618dSMahesh Salgaonkar u64 physical_address; 136cda6618dSMahesh Salgaonkar u8 reserved_2[8]; 13736df96f8SMahesh Salgaonkar } ue_error; 13836df96f8SMahesh Salgaonkar 13936df96f8SMahesh Salgaonkar struct { 14036df96f8SMahesh Salgaonkar enum MCE_SlbErrorType slb_error_type:8; 141cda6618dSMahesh Salgaonkar u8 effective_address_provided; 142cda6618dSMahesh Salgaonkar u8 reserved_1[6]; 143cda6618dSMahesh Salgaonkar u64 effective_address; 144cda6618dSMahesh Salgaonkar u8 reserved_2[16]; 14536df96f8SMahesh Salgaonkar } slb_error; 14636df96f8SMahesh Salgaonkar 14736df96f8SMahesh Salgaonkar struct { 14836df96f8SMahesh Salgaonkar enum MCE_EratErrorType erat_error_type:8; 149cda6618dSMahesh Salgaonkar u8 effective_address_provided; 150cda6618dSMahesh Salgaonkar u8 reserved_1[6]; 151cda6618dSMahesh Salgaonkar u64 effective_address; 152cda6618dSMahesh Salgaonkar u8 reserved_2[16]; 15336df96f8SMahesh Salgaonkar } erat_error; 15436df96f8SMahesh Salgaonkar 15536df96f8SMahesh Salgaonkar struct { 15636df96f8SMahesh Salgaonkar enum MCE_TlbErrorType tlb_error_type:8; 157cda6618dSMahesh Salgaonkar u8 effective_address_provided; 158cda6618dSMahesh Salgaonkar u8 reserved_1[6]; 159cda6618dSMahesh Salgaonkar u64 effective_address; 160cda6618dSMahesh Salgaonkar u8 reserved_2[16]; 16136df96f8SMahesh Salgaonkar } tlb_error; 1627b9f71f9SNicholas Piggin 1637b9f71f9SNicholas Piggin struct { 1647b9f71f9SNicholas Piggin enum MCE_UserErrorType user_error_type:8; 165cda6618dSMahesh Salgaonkar u8 effective_address_provided; 166cda6618dSMahesh Salgaonkar u8 reserved_1[6]; 167cda6618dSMahesh Salgaonkar u64 effective_address; 168cda6618dSMahesh Salgaonkar u8 reserved_2[16]; 1697b9f71f9SNicholas Piggin } user_error; 1707b9f71f9SNicholas Piggin 1717b9f71f9SNicholas Piggin struct { 1727b9f71f9SNicholas Piggin enum MCE_RaErrorType ra_error_type:8; 173cda6618dSMahesh Salgaonkar u8 effective_address_provided; 174cda6618dSMahesh Salgaonkar u8 reserved_1[6]; 175cda6618dSMahesh Salgaonkar u64 effective_address; 176cda6618dSMahesh Salgaonkar u8 reserved_2[16]; 1777b9f71f9SNicholas Piggin } ra_error; 1787b9f71f9SNicholas Piggin 1797b9f71f9SNicholas Piggin struct { 1807b9f71f9SNicholas Piggin enum MCE_LinkErrorType link_error_type:8; 181cda6618dSMahesh Salgaonkar u8 effective_address_provided; 182cda6618dSMahesh Salgaonkar u8 reserved_1[6]; 183cda6618dSMahesh Salgaonkar u64 effective_address; 184cda6618dSMahesh Salgaonkar u8 reserved_2[16]; 1857b9f71f9SNicholas Piggin } link_error; 18636df96f8SMahesh Salgaonkar } u; 18736df96f8SMahesh Salgaonkar }; 18836df96f8SMahesh Salgaonkar 18936df96f8SMahesh Salgaonkar struct mce_error_info { 19036df96f8SMahesh Salgaonkar enum MCE_ErrorType error_type:8; 19136df96f8SMahesh Salgaonkar union { 19236df96f8SMahesh Salgaonkar enum MCE_UeErrorType ue_error_type:8; 19336df96f8SMahesh Salgaonkar enum MCE_SlbErrorType slb_error_type:8; 19436df96f8SMahesh Salgaonkar enum MCE_EratErrorType erat_error_type:8; 19536df96f8SMahesh Salgaonkar enum MCE_TlbErrorType tlb_error_type:8; 1967b9f71f9SNicholas Piggin enum MCE_UserErrorType user_error_type:8; 1977b9f71f9SNicholas Piggin enum MCE_RaErrorType ra_error_type:8; 1987b9f71f9SNicholas Piggin enum MCE_LinkErrorType link_error_type:8; 19936df96f8SMahesh Salgaonkar } u; 200c1bbf387SNicholas Piggin enum MCE_Severity severity:8; 201c1bbf387SNicholas Piggin enum MCE_Initiator initiator:8; 20250dbabe0SMahesh Salgaonkar enum MCE_ErrorClass error_class:8; 203cda6618dSMahesh Salgaonkar bool sync_error; 204895e3dceSBalbir Singh bool ignore_event; 20536df96f8SMahesh Salgaonkar }; 20636df96f8SMahesh Salgaonkar 20736df96f8SMahesh Salgaonkar #define MAX_MC_EVT 100 20836df96f8SMahesh Salgaonkar 20936df96f8SMahesh Salgaonkar /* Release flags for get_mce_event() */ 21036df96f8SMahesh Salgaonkar #define MCE_EVENT_RELEASE true 21136df96f8SMahesh Salgaonkar #define MCE_EVENT_DONTRELEASE false 21236df96f8SMahesh Salgaonkar 213388692e9SMadhavan Srinivasan struct pt_regs; 214388692e9SMadhavan Srinivasan struct notifier_block; 215388692e9SMadhavan Srinivasan 21636df96f8SMahesh Salgaonkar extern void save_mce_event(struct pt_regs *regs, long handled, 21755672ecfSMahesh Salgaonkar struct mce_error_info *mce_err, uint64_t nip, 218ba41e1e1SBalbir Singh uint64_t addr, uint64_t phys_addr); 21936df96f8SMahesh Salgaonkar extern int get_mce_event(struct machine_check_event *mce, bool release); 22036df96f8SMahesh Salgaonkar extern void release_mce_event(void); 221b5ff4211SMahesh Salgaonkar extern void machine_check_queue_event(void); 22263f44d65SMichael Ellerman extern void machine_check_print_event_info(struct machine_check_event *evt, 223c0577201SPaul Mackerras bool user_mode, bool in_guest); 2247f177f98SGanesh Goudar unsigned long addr_to_pfn(struct pt_regs *regs, unsigned long addr); 225efbc4303SGanesh Goudar extern void mce_common_process_ue(struct pt_regs *regs, 226efbc4303SGanesh Goudar struct mce_error_info *mce_err); 227c37a63afSSantosh Sivaraj int mce_register_notifier(struct notifier_block *nb); 228c37a63afSSantosh Sivaraj int mce_unregister_notifier(struct notifier_block *nb); 229a43c1590SMahesh Salgaonkar #ifdef CONFIG_PPC_BOOK3S_64 230a43c1590SMahesh Salgaonkar void flush_and_reload_slb(void); 231*82f70a05SNicholas Piggin void flush_erat(void); 232388692e9SMadhavan Srinivasan long __machine_check_early_realmode_p7(struct pt_regs *regs); 233388692e9SMadhavan Srinivasan long __machine_check_early_realmode_p8(struct pt_regs *regs); 234388692e9SMadhavan Srinivasan long __machine_check_early_realmode_p9(struct pt_regs *regs); 235388692e9SMadhavan Srinivasan long __machine_check_early_realmode_p10(struct pt_regs *regs); 236a43c1590SMahesh Salgaonkar #endif /* CONFIG_PPC_BOOK3S_64 */ 237e22a2274SMahesh Salgaonkar #endif /* __ASM_PPC64_MCE_H__ */ 238