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