18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Machine check exception header file. 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright 2013 IBM Corporation 68c2ecf20Sopenharmony_ci * Author: Mahesh Salgaonkar <mahesh@linux.vnet.ibm.com> 78c2ecf20Sopenharmony_ci */ 88c2ecf20Sopenharmony_ci 98c2ecf20Sopenharmony_ci#ifndef __ASM_PPC64_MCE_H__ 108c2ecf20Sopenharmony_ci#define __ASM_PPC64_MCE_H__ 118c2ecf20Sopenharmony_ci 128c2ecf20Sopenharmony_ci#include <linux/bitops.h> 138c2ecf20Sopenharmony_ci 148c2ecf20Sopenharmony_cienum MCE_Version { 158c2ecf20Sopenharmony_ci MCE_V1 = 1, 168c2ecf20Sopenharmony_ci}; 178c2ecf20Sopenharmony_ci 188c2ecf20Sopenharmony_cienum MCE_Severity { 198c2ecf20Sopenharmony_ci MCE_SEV_NO_ERROR = 0, 208c2ecf20Sopenharmony_ci MCE_SEV_WARNING = 1, 218c2ecf20Sopenharmony_ci MCE_SEV_SEVERE = 2, 228c2ecf20Sopenharmony_ci MCE_SEV_FATAL = 3, 238c2ecf20Sopenharmony_ci}; 248c2ecf20Sopenharmony_ci 258c2ecf20Sopenharmony_cienum MCE_Disposition { 268c2ecf20Sopenharmony_ci MCE_DISPOSITION_RECOVERED = 0, 278c2ecf20Sopenharmony_ci MCE_DISPOSITION_NOT_RECOVERED = 1, 288c2ecf20Sopenharmony_ci}; 298c2ecf20Sopenharmony_ci 308c2ecf20Sopenharmony_cienum MCE_Initiator { 318c2ecf20Sopenharmony_ci MCE_INITIATOR_UNKNOWN = 0, 328c2ecf20Sopenharmony_ci MCE_INITIATOR_CPU = 1, 338c2ecf20Sopenharmony_ci MCE_INITIATOR_PCI = 2, 348c2ecf20Sopenharmony_ci MCE_INITIATOR_ISA = 3, 358c2ecf20Sopenharmony_ci MCE_INITIATOR_MEMORY= 4, 368c2ecf20Sopenharmony_ci MCE_INITIATOR_POWERMGM = 5, 378c2ecf20Sopenharmony_ci}; 388c2ecf20Sopenharmony_ci 398c2ecf20Sopenharmony_cienum MCE_ErrorType { 408c2ecf20Sopenharmony_ci MCE_ERROR_TYPE_UNKNOWN = 0, 418c2ecf20Sopenharmony_ci MCE_ERROR_TYPE_UE = 1, 428c2ecf20Sopenharmony_ci MCE_ERROR_TYPE_SLB = 2, 438c2ecf20Sopenharmony_ci MCE_ERROR_TYPE_ERAT = 3, 448c2ecf20Sopenharmony_ci MCE_ERROR_TYPE_TLB = 4, 458c2ecf20Sopenharmony_ci MCE_ERROR_TYPE_USER = 5, 468c2ecf20Sopenharmony_ci MCE_ERROR_TYPE_RA = 6, 478c2ecf20Sopenharmony_ci MCE_ERROR_TYPE_LINK = 7, 488c2ecf20Sopenharmony_ci MCE_ERROR_TYPE_DCACHE = 8, 498c2ecf20Sopenharmony_ci MCE_ERROR_TYPE_ICACHE = 9, 508c2ecf20Sopenharmony_ci}; 518c2ecf20Sopenharmony_ci 528c2ecf20Sopenharmony_cienum MCE_ErrorClass { 538c2ecf20Sopenharmony_ci MCE_ECLASS_UNKNOWN = 0, 548c2ecf20Sopenharmony_ci MCE_ECLASS_HARDWARE, 558c2ecf20Sopenharmony_ci MCE_ECLASS_HARD_INDETERMINATE, 568c2ecf20Sopenharmony_ci MCE_ECLASS_SOFTWARE, 578c2ecf20Sopenharmony_ci MCE_ECLASS_SOFT_INDETERMINATE, 588c2ecf20Sopenharmony_ci}; 598c2ecf20Sopenharmony_ci 608c2ecf20Sopenharmony_cienum MCE_UeErrorType { 618c2ecf20Sopenharmony_ci MCE_UE_ERROR_INDETERMINATE = 0, 628c2ecf20Sopenharmony_ci MCE_UE_ERROR_IFETCH = 1, 638c2ecf20Sopenharmony_ci MCE_UE_ERROR_PAGE_TABLE_WALK_IFETCH = 2, 648c2ecf20Sopenharmony_ci MCE_UE_ERROR_LOAD_STORE = 3, 658c2ecf20Sopenharmony_ci MCE_UE_ERROR_PAGE_TABLE_WALK_LOAD_STORE = 4, 668c2ecf20Sopenharmony_ci}; 678c2ecf20Sopenharmony_ci 688c2ecf20Sopenharmony_cienum MCE_SlbErrorType { 698c2ecf20Sopenharmony_ci MCE_SLB_ERROR_INDETERMINATE = 0, 708c2ecf20Sopenharmony_ci MCE_SLB_ERROR_PARITY = 1, 718c2ecf20Sopenharmony_ci MCE_SLB_ERROR_MULTIHIT = 2, 728c2ecf20Sopenharmony_ci}; 738c2ecf20Sopenharmony_ci 748c2ecf20Sopenharmony_cienum MCE_EratErrorType { 758c2ecf20Sopenharmony_ci MCE_ERAT_ERROR_INDETERMINATE = 0, 768c2ecf20Sopenharmony_ci MCE_ERAT_ERROR_PARITY = 1, 778c2ecf20Sopenharmony_ci MCE_ERAT_ERROR_MULTIHIT = 2, 788c2ecf20Sopenharmony_ci}; 798c2ecf20Sopenharmony_ci 808c2ecf20Sopenharmony_cienum MCE_TlbErrorType { 818c2ecf20Sopenharmony_ci MCE_TLB_ERROR_INDETERMINATE = 0, 828c2ecf20Sopenharmony_ci MCE_TLB_ERROR_PARITY = 1, 838c2ecf20Sopenharmony_ci MCE_TLB_ERROR_MULTIHIT = 2, 848c2ecf20Sopenharmony_ci}; 858c2ecf20Sopenharmony_ci 868c2ecf20Sopenharmony_cienum MCE_UserErrorType { 878c2ecf20Sopenharmony_ci MCE_USER_ERROR_INDETERMINATE = 0, 888c2ecf20Sopenharmony_ci MCE_USER_ERROR_TLBIE = 1, 898c2ecf20Sopenharmony_ci MCE_USER_ERROR_SCV = 2, 908c2ecf20Sopenharmony_ci}; 918c2ecf20Sopenharmony_ci 928c2ecf20Sopenharmony_cienum MCE_RaErrorType { 938c2ecf20Sopenharmony_ci MCE_RA_ERROR_INDETERMINATE = 0, 948c2ecf20Sopenharmony_ci MCE_RA_ERROR_IFETCH = 1, 958c2ecf20Sopenharmony_ci MCE_RA_ERROR_IFETCH_FOREIGN = 2, 968c2ecf20Sopenharmony_ci MCE_RA_ERROR_PAGE_TABLE_WALK_IFETCH = 3, 978c2ecf20Sopenharmony_ci MCE_RA_ERROR_PAGE_TABLE_WALK_IFETCH_FOREIGN = 4, 988c2ecf20Sopenharmony_ci MCE_RA_ERROR_LOAD = 5, 998c2ecf20Sopenharmony_ci MCE_RA_ERROR_STORE = 6, 1008c2ecf20Sopenharmony_ci MCE_RA_ERROR_PAGE_TABLE_WALK_LOAD_STORE = 7, 1018c2ecf20Sopenharmony_ci MCE_RA_ERROR_PAGE_TABLE_WALK_LOAD_STORE_FOREIGN = 8, 1028c2ecf20Sopenharmony_ci MCE_RA_ERROR_LOAD_STORE_FOREIGN = 9, 1038c2ecf20Sopenharmony_ci}; 1048c2ecf20Sopenharmony_ci 1058c2ecf20Sopenharmony_cienum MCE_LinkErrorType { 1068c2ecf20Sopenharmony_ci MCE_LINK_ERROR_INDETERMINATE = 0, 1078c2ecf20Sopenharmony_ci MCE_LINK_ERROR_IFETCH_TIMEOUT = 1, 1088c2ecf20Sopenharmony_ci MCE_LINK_ERROR_PAGE_TABLE_WALK_IFETCH_TIMEOUT = 2, 1098c2ecf20Sopenharmony_ci MCE_LINK_ERROR_LOAD_TIMEOUT = 3, 1108c2ecf20Sopenharmony_ci MCE_LINK_ERROR_STORE_TIMEOUT = 4, 1118c2ecf20Sopenharmony_ci MCE_LINK_ERROR_PAGE_TABLE_WALK_LOAD_STORE_TIMEOUT = 5, 1128c2ecf20Sopenharmony_ci}; 1138c2ecf20Sopenharmony_ci 1148c2ecf20Sopenharmony_cistruct machine_check_event { 1158c2ecf20Sopenharmony_ci enum MCE_Version version:8; 1168c2ecf20Sopenharmony_ci u8 in_use; 1178c2ecf20Sopenharmony_ci enum MCE_Severity severity:8; 1188c2ecf20Sopenharmony_ci enum MCE_Initiator initiator:8; 1198c2ecf20Sopenharmony_ci enum MCE_ErrorType error_type:8; 1208c2ecf20Sopenharmony_ci enum MCE_ErrorClass error_class:8; 1218c2ecf20Sopenharmony_ci enum MCE_Disposition disposition:8; 1228c2ecf20Sopenharmony_ci bool sync_error; 1238c2ecf20Sopenharmony_ci u16 cpu; 1248c2ecf20Sopenharmony_ci u64 gpr3; 1258c2ecf20Sopenharmony_ci u64 srr0; 1268c2ecf20Sopenharmony_ci u64 srr1; 1278c2ecf20Sopenharmony_ci union { 1288c2ecf20Sopenharmony_ci struct { 1298c2ecf20Sopenharmony_ci enum MCE_UeErrorType ue_error_type:8; 1308c2ecf20Sopenharmony_ci u8 effective_address_provided; 1318c2ecf20Sopenharmony_ci u8 physical_address_provided; 1328c2ecf20Sopenharmony_ci u8 ignore_event; 1338c2ecf20Sopenharmony_ci u8 reserved_1[4]; 1348c2ecf20Sopenharmony_ci u64 effective_address; 1358c2ecf20Sopenharmony_ci u64 physical_address; 1368c2ecf20Sopenharmony_ci u8 reserved_2[8]; 1378c2ecf20Sopenharmony_ci } ue_error; 1388c2ecf20Sopenharmony_ci 1398c2ecf20Sopenharmony_ci struct { 1408c2ecf20Sopenharmony_ci enum MCE_SlbErrorType slb_error_type:8; 1418c2ecf20Sopenharmony_ci u8 effective_address_provided; 1428c2ecf20Sopenharmony_ci u8 reserved_1[6]; 1438c2ecf20Sopenharmony_ci u64 effective_address; 1448c2ecf20Sopenharmony_ci u8 reserved_2[16]; 1458c2ecf20Sopenharmony_ci } slb_error; 1468c2ecf20Sopenharmony_ci 1478c2ecf20Sopenharmony_ci struct { 1488c2ecf20Sopenharmony_ci enum MCE_EratErrorType erat_error_type:8; 1498c2ecf20Sopenharmony_ci u8 effective_address_provided; 1508c2ecf20Sopenharmony_ci u8 reserved_1[6]; 1518c2ecf20Sopenharmony_ci u64 effective_address; 1528c2ecf20Sopenharmony_ci u8 reserved_2[16]; 1538c2ecf20Sopenharmony_ci } erat_error; 1548c2ecf20Sopenharmony_ci 1558c2ecf20Sopenharmony_ci struct { 1568c2ecf20Sopenharmony_ci enum MCE_TlbErrorType tlb_error_type:8; 1578c2ecf20Sopenharmony_ci u8 effective_address_provided; 1588c2ecf20Sopenharmony_ci u8 reserved_1[6]; 1598c2ecf20Sopenharmony_ci u64 effective_address; 1608c2ecf20Sopenharmony_ci u8 reserved_2[16]; 1618c2ecf20Sopenharmony_ci } tlb_error; 1628c2ecf20Sopenharmony_ci 1638c2ecf20Sopenharmony_ci struct { 1648c2ecf20Sopenharmony_ci enum MCE_UserErrorType user_error_type:8; 1658c2ecf20Sopenharmony_ci u8 effective_address_provided; 1668c2ecf20Sopenharmony_ci u8 reserved_1[6]; 1678c2ecf20Sopenharmony_ci u64 effective_address; 1688c2ecf20Sopenharmony_ci u8 reserved_2[16]; 1698c2ecf20Sopenharmony_ci } user_error; 1708c2ecf20Sopenharmony_ci 1718c2ecf20Sopenharmony_ci struct { 1728c2ecf20Sopenharmony_ci enum MCE_RaErrorType ra_error_type:8; 1738c2ecf20Sopenharmony_ci u8 effective_address_provided; 1748c2ecf20Sopenharmony_ci u8 reserved_1[6]; 1758c2ecf20Sopenharmony_ci u64 effective_address; 1768c2ecf20Sopenharmony_ci u8 reserved_2[16]; 1778c2ecf20Sopenharmony_ci } ra_error; 1788c2ecf20Sopenharmony_ci 1798c2ecf20Sopenharmony_ci struct { 1808c2ecf20Sopenharmony_ci enum MCE_LinkErrorType link_error_type:8; 1818c2ecf20Sopenharmony_ci u8 effective_address_provided; 1828c2ecf20Sopenharmony_ci u8 reserved_1[6]; 1838c2ecf20Sopenharmony_ci u64 effective_address; 1848c2ecf20Sopenharmony_ci u8 reserved_2[16]; 1858c2ecf20Sopenharmony_ci } link_error; 1868c2ecf20Sopenharmony_ci } u; 1878c2ecf20Sopenharmony_ci}; 1888c2ecf20Sopenharmony_ci 1898c2ecf20Sopenharmony_cistruct mce_error_info { 1908c2ecf20Sopenharmony_ci enum MCE_ErrorType error_type:8; 1918c2ecf20Sopenharmony_ci union { 1928c2ecf20Sopenharmony_ci enum MCE_UeErrorType ue_error_type:8; 1938c2ecf20Sopenharmony_ci enum MCE_SlbErrorType slb_error_type:8; 1948c2ecf20Sopenharmony_ci enum MCE_EratErrorType erat_error_type:8; 1958c2ecf20Sopenharmony_ci enum MCE_TlbErrorType tlb_error_type:8; 1968c2ecf20Sopenharmony_ci enum MCE_UserErrorType user_error_type:8; 1978c2ecf20Sopenharmony_ci enum MCE_RaErrorType ra_error_type:8; 1988c2ecf20Sopenharmony_ci enum MCE_LinkErrorType link_error_type:8; 1998c2ecf20Sopenharmony_ci } u; 2008c2ecf20Sopenharmony_ci enum MCE_Severity severity:8; 2018c2ecf20Sopenharmony_ci enum MCE_Initiator initiator:8; 2028c2ecf20Sopenharmony_ci enum MCE_ErrorClass error_class:8; 2038c2ecf20Sopenharmony_ci bool sync_error; 2048c2ecf20Sopenharmony_ci bool ignore_event; 2058c2ecf20Sopenharmony_ci}; 2068c2ecf20Sopenharmony_ci 2078c2ecf20Sopenharmony_ci#define MAX_MC_EVT 100 2088c2ecf20Sopenharmony_ci 2098c2ecf20Sopenharmony_ci/* Release flags for get_mce_event() */ 2108c2ecf20Sopenharmony_ci#define MCE_EVENT_RELEASE true 2118c2ecf20Sopenharmony_ci#define MCE_EVENT_DONTRELEASE false 2128c2ecf20Sopenharmony_ci 2138c2ecf20Sopenharmony_cistruct pt_regs; 2148c2ecf20Sopenharmony_cistruct notifier_block; 2158c2ecf20Sopenharmony_ci 2168c2ecf20Sopenharmony_ciextern void save_mce_event(struct pt_regs *regs, long handled, 2178c2ecf20Sopenharmony_ci struct mce_error_info *mce_err, uint64_t nip, 2188c2ecf20Sopenharmony_ci uint64_t addr, uint64_t phys_addr); 2198c2ecf20Sopenharmony_ciextern int get_mce_event(struct machine_check_event *mce, bool release); 2208c2ecf20Sopenharmony_ciextern void release_mce_event(void); 2218c2ecf20Sopenharmony_ciextern void machine_check_queue_event(void); 2228c2ecf20Sopenharmony_ciextern void machine_check_print_event_info(struct machine_check_event *evt, 2238c2ecf20Sopenharmony_ci bool user_mode, bool in_guest); 2248c2ecf20Sopenharmony_ciunsigned long addr_to_pfn(struct pt_regs *regs, unsigned long addr); 2258c2ecf20Sopenharmony_ciextern void mce_common_process_ue(struct pt_regs *regs, 2268c2ecf20Sopenharmony_ci struct mce_error_info *mce_err); 2278c2ecf20Sopenharmony_ciint mce_register_notifier(struct notifier_block *nb); 2288c2ecf20Sopenharmony_ciint mce_unregister_notifier(struct notifier_block *nb); 2298c2ecf20Sopenharmony_ci#ifdef CONFIG_PPC_BOOK3S_64 2308c2ecf20Sopenharmony_civoid flush_and_reload_slb(void); 2318c2ecf20Sopenharmony_cilong __machine_check_early_realmode_p7(struct pt_regs *regs); 2328c2ecf20Sopenharmony_cilong __machine_check_early_realmode_p8(struct pt_regs *regs); 2338c2ecf20Sopenharmony_cilong __machine_check_early_realmode_p9(struct pt_regs *regs); 2348c2ecf20Sopenharmony_cilong __machine_check_early_realmode_p10(struct pt_regs *regs); 2358c2ecf20Sopenharmony_ci#endif /* CONFIG_PPC_BOOK3S_64 */ 2368c2ecf20Sopenharmony_ci#endif /* __ASM_PPC64_MCE_H__ */ 237