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, 897b9f71f9SNicholas Piggin }; 907b9f71f9SNicholas Piggin 917b9f71f9SNicholas Piggin enum MCE_RaErrorType { 927b9f71f9SNicholas Piggin MCE_RA_ERROR_INDETERMINATE = 0, 937b9f71f9SNicholas Piggin MCE_RA_ERROR_IFETCH = 1, 9490df4bfbSNicholas Piggin MCE_RA_ERROR_IFETCH_FOREIGN = 2, 9590df4bfbSNicholas Piggin MCE_RA_ERROR_PAGE_TABLE_WALK_IFETCH = 3, 9690df4bfbSNicholas Piggin MCE_RA_ERROR_PAGE_TABLE_WALK_IFETCH_FOREIGN = 4, 9790df4bfbSNicholas Piggin MCE_RA_ERROR_LOAD = 5, 9890df4bfbSNicholas Piggin MCE_RA_ERROR_STORE = 6, 9990df4bfbSNicholas Piggin MCE_RA_ERROR_PAGE_TABLE_WALK_LOAD_STORE = 7, 10090df4bfbSNicholas Piggin MCE_RA_ERROR_PAGE_TABLE_WALK_LOAD_STORE_FOREIGN = 8, 10190df4bfbSNicholas Piggin MCE_RA_ERROR_LOAD_STORE_FOREIGN = 9, 1027b9f71f9SNicholas Piggin }; 1037b9f71f9SNicholas Piggin 1047b9f71f9SNicholas Piggin enum MCE_LinkErrorType { 1057b9f71f9SNicholas Piggin MCE_LINK_ERROR_INDETERMINATE = 0, 1067b9f71f9SNicholas Piggin MCE_LINK_ERROR_IFETCH_TIMEOUT = 1, 1077b9f71f9SNicholas Piggin MCE_LINK_ERROR_PAGE_TABLE_WALK_IFETCH_TIMEOUT = 2, 1087b9f71f9SNicholas Piggin MCE_LINK_ERROR_LOAD_TIMEOUT = 3, 1097b9f71f9SNicholas Piggin MCE_LINK_ERROR_STORE_TIMEOUT = 4, 1107b9f71f9SNicholas Piggin MCE_LINK_ERROR_PAGE_TABLE_WALK_LOAD_STORE_TIMEOUT = 5, 1117b9f71f9SNicholas Piggin }; 1127b9f71f9SNicholas Piggin 11336df96f8SMahesh Salgaonkar struct machine_check_event { 114cda6618dSMahesh Salgaonkar enum MCE_Version version:8; 115cda6618dSMahesh Salgaonkar u8 in_use; 116cda6618dSMahesh Salgaonkar enum MCE_Severity severity:8; 117cda6618dSMahesh Salgaonkar enum MCE_Initiator initiator:8; 118cda6618dSMahesh Salgaonkar enum MCE_ErrorType error_type:8; 11950dbabe0SMahesh Salgaonkar enum MCE_ErrorClass error_class:8; 120cda6618dSMahesh Salgaonkar enum MCE_Disposition disposition:8; 121cda6618dSMahesh Salgaonkar bool sync_error; 122cda6618dSMahesh Salgaonkar u16 cpu; 123cda6618dSMahesh Salgaonkar u64 gpr3; 124cda6618dSMahesh Salgaonkar u64 srr0; 125cda6618dSMahesh Salgaonkar u64 srr1; 126cda6618dSMahesh Salgaonkar union { 12736df96f8SMahesh Salgaonkar struct { 12836df96f8SMahesh Salgaonkar enum MCE_UeErrorType ue_error_type:8; 129cda6618dSMahesh Salgaonkar u8 effective_address_provided; 130cda6618dSMahesh Salgaonkar u8 physical_address_provided; 131895e3dceSBalbir Singh u8 ignore_event; 132895e3dceSBalbir Singh u8 reserved_1[4]; 133cda6618dSMahesh Salgaonkar u64 effective_address; 134cda6618dSMahesh Salgaonkar u64 physical_address; 135cda6618dSMahesh Salgaonkar u8 reserved_2[8]; 13636df96f8SMahesh Salgaonkar } ue_error; 13736df96f8SMahesh Salgaonkar 13836df96f8SMahesh Salgaonkar struct { 13936df96f8SMahesh Salgaonkar enum MCE_SlbErrorType slb_error_type:8; 140cda6618dSMahesh Salgaonkar u8 effective_address_provided; 141cda6618dSMahesh Salgaonkar u8 reserved_1[6]; 142cda6618dSMahesh Salgaonkar u64 effective_address; 143cda6618dSMahesh Salgaonkar u8 reserved_2[16]; 14436df96f8SMahesh Salgaonkar } slb_error; 14536df96f8SMahesh Salgaonkar 14636df96f8SMahesh Salgaonkar struct { 14736df96f8SMahesh Salgaonkar enum MCE_EratErrorType erat_error_type:8; 148cda6618dSMahesh Salgaonkar u8 effective_address_provided; 149cda6618dSMahesh Salgaonkar u8 reserved_1[6]; 150cda6618dSMahesh Salgaonkar u64 effective_address; 151cda6618dSMahesh Salgaonkar u8 reserved_2[16]; 15236df96f8SMahesh Salgaonkar } erat_error; 15336df96f8SMahesh Salgaonkar 15436df96f8SMahesh Salgaonkar struct { 15536df96f8SMahesh Salgaonkar enum MCE_TlbErrorType tlb_error_type:8; 156cda6618dSMahesh Salgaonkar u8 effective_address_provided; 157cda6618dSMahesh Salgaonkar u8 reserved_1[6]; 158cda6618dSMahesh Salgaonkar u64 effective_address; 159cda6618dSMahesh Salgaonkar u8 reserved_2[16]; 16036df96f8SMahesh Salgaonkar } tlb_error; 1617b9f71f9SNicholas Piggin 1627b9f71f9SNicholas Piggin struct { 1637b9f71f9SNicholas Piggin enum MCE_UserErrorType user_error_type:8; 164cda6618dSMahesh Salgaonkar u8 effective_address_provided; 165cda6618dSMahesh Salgaonkar u8 reserved_1[6]; 166cda6618dSMahesh Salgaonkar u64 effective_address; 167cda6618dSMahesh Salgaonkar u8 reserved_2[16]; 1687b9f71f9SNicholas Piggin } user_error; 1697b9f71f9SNicholas Piggin 1707b9f71f9SNicholas Piggin struct { 1717b9f71f9SNicholas Piggin enum MCE_RaErrorType ra_error_type:8; 172cda6618dSMahesh Salgaonkar u8 effective_address_provided; 173cda6618dSMahesh Salgaonkar u8 reserved_1[6]; 174cda6618dSMahesh Salgaonkar u64 effective_address; 175cda6618dSMahesh Salgaonkar u8 reserved_2[16]; 1767b9f71f9SNicholas Piggin } ra_error; 1777b9f71f9SNicholas Piggin 1787b9f71f9SNicholas Piggin struct { 1797b9f71f9SNicholas Piggin enum MCE_LinkErrorType link_error_type:8; 180cda6618dSMahesh Salgaonkar u8 effective_address_provided; 181cda6618dSMahesh Salgaonkar u8 reserved_1[6]; 182cda6618dSMahesh Salgaonkar u64 effective_address; 183cda6618dSMahesh Salgaonkar u8 reserved_2[16]; 1847b9f71f9SNicholas Piggin } link_error; 18536df96f8SMahesh Salgaonkar } u; 18636df96f8SMahesh Salgaonkar }; 18736df96f8SMahesh Salgaonkar 18836df96f8SMahesh Salgaonkar struct mce_error_info { 18936df96f8SMahesh Salgaonkar enum MCE_ErrorType error_type:8; 19036df96f8SMahesh Salgaonkar union { 19136df96f8SMahesh Salgaonkar enum MCE_UeErrorType ue_error_type:8; 19236df96f8SMahesh Salgaonkar enum MCE_SlbErrorType slb_error_type:8; 19336df96f8SMahesh Salgaonkar enum MCE_EratErrorType erat_error_type:8; 19436df96f8SMahesh Salgaonkar enum MCE_TlbErrorType tlb_error_type:8; 1957b9f71f9SNicholas Piggin enum MCE_UserErrorType user_error_type:8; 1967b9f71f9SNicholas Piggin enum MCE_RaErrorType ra_error_type:8; 1977b9f71f9SNicholas Piggin enum MCE_LinkErrorType link_error_type:8; 19836df96f8SMahesh Salgaonkar } u; 199c1bbf387SNicholas Piggin enum MCE_Severity severity:8; 200c1bbf387SNicholas Piggin enum MCE_Initiator initiator:8; 20150dbabe0SMahesh Salgaonkar enum MCE_ErrorClass error_class:8; 202cda6618dSMahesh Salgaonkar bool sync_error; 203895e3dceSBalbir Singh bool ignore_event; 20436df96f8SMahesh Salgaonkar }; 20536df96f8SMahesh Salgaonkar 20636df96f8SMahesh Salgaonkar #define MAX_MC_EVT 100 20736df96f8SMahesh Salgaonkar 20836df96f8SMahesh Salgaonkar /* Release flags for get_mce_event() */ 20936df96f8SMahesh Salgaonkar #define MCE_EVENT_RELEASE true 21036df96f8SMahesh Salgaonkar #define MCE_EVENT_DONTRELEASE false 21136df96f8SMahesh Salgaonkar 21236df96f8SMahesh Salgaonkar extern void save_mce_event(struct pt_regs *regs, long handled, 21355672ecfSMahesh Salgaonkar struct mce_error_info *mce_err, uint64_t nip, 214ba41e1e1SBalbir Singh uint64_t addr, uint64_t phys_addr); 21536df96f8SMahesh Salgaonkar extern int get_mce_event(struct machine_check_event *mce, bool release); 21636df96f8SMahesh Salgaonkar extern void release_mce_event(void); 217b5ff4211SMahesh Salgaonkar extern void machine_check_queue_event(void); 21863f44d65SMichael Ellerman extern void machine_check_print_event_info(struct machine_check_event *evt, 219c0577201SPaul Mackerras bool user_mode, bool in_guest); 2207f177f98SGanesh Goudar unsigned long addr_to_pfn(struct pt_regs *regs, unsigned long addr); 221*efbc4303SGanesh Goudar extern void mce_common_process_ue(struct pt_regs *regs, 222*efbc4303SGanesh Goudar struct mce_error_info *mce_err); 223a43c1590SMahesh Salgaonkar #ifdef CONFIG_PPC_BOOK3S_64 224a43c1590SMahesh Salgaonkar void flush_and_reload_slb(void); 225a43c1590SMahesh Salgaonkar #endif /* CONFIG_PPC_BOOK3S_64 */ 226e22a2274SMahesh Salgaonkar #endif /* __ASM_PPC64_MCE_H__ */ 227