162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci#undef TRACE_SYSTEM 362306a36Sopenharmony_ci#define TRACE_SYSTEM ras 462306a36Sopenharmony_ci#define TRACE_INCLUDE_FILE ras_event 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci#if !defined(_TRACE_HW_EVENT_MC_H) || defined(TRACE_HEADER_MULTI_READ) 762306a36Sopenharmony_ci#define _TRACE_HW_EVENT_MC_H 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include <linux/tracepoint.h> 1062306a36Sopenharmony_ci#include <linux/edac.h> 1162306a36Sopenharmony_ci#include <linux/ktime.h> 1262306a36Sopenharmony_ci#include <linux/pci.h> 1362306a36Sopenharmony_ci#include <linux/aer.h> 1462306a36Sopenharmony_ci#include <linux/cper.h> 1562306a36Sopenharmony_ci#include <linux/mm.h> 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci/* 1862306a36Sopenharmony_ci * MCE Extended Error Log trace event 1962306a36Sopenharmony_ci * 2062306a36Sopenharmony_ci * These events are generated when hardware detects a corrected or 2162306a36Sopenharmony_ci * uncorrected event. 2262306a36Sopenharmony_ci */ 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci/* memory trace event */ 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci#if defined(CONFIG_ACPI_EXTLOG) || defined(CONFIG_ACPI_EXTLOG_MODULE) 2762306a36Sopenharmony_ciTRACE_EVENT(extlog_mem_event, 2862306a36Sopenharmony_ci TP_PROTO(struct cper_sec_mem_err *mem, 2962306a36Sopenharmony_ci u32 err_seq, 3062306a36Sopenharmony_ci const guid_t *fru_id, 3162306a36Sopenharmony_ci const char *fru_text, 3262306a36Sopenharmony_ci u8 sev), 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ci TP_ARGS(mem, err_seq, fru_id, fru_text, sev), 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ci TP_STRUCT__entry( 3762306a36Sopenharmony_ci __field(u32, err_seq) 3862306a36Sopenharmony_ci __field(u8, etype) 3962306a36Sopenharmony_ci __field(u8, sev) 4062306a36Sopenharmony_ci __field(u64, pa) 4162306a36Sopenharmony_ci __field(u8, pa_mask_lsb) 4262306a36Sopenharmony_ci __field_struct(guid_t, fru_id) 4362306a36Sopenharmony_ci __string(fru_text, fru_text) 4462306a36Sopenharmony_ci __field_struct(struct cper_mem_err_compact, data) 4562306a36Sopenharmony_ci ), 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_ci TP_fast_assign( 4862306a36Sopenharmony_ci __entry->err_seq = err_seq; 4962306a36Sopenharmony_ci if (mem->validation_bits & CPER_MEM_VALID_ERROR_TYPE) 5062306a36Sopenharmony_ci __entry->etype = mem->error_type; 5162306a36Sopenharmony_ci else 5262306a36Sopenharmony_ci __entry->etype = ~0; 5362306a36Sopenharmony_ci __entry->sev = sev; 5462306a36Sopenharmony_ci if (mem->validation_bits & CPER_MEM_VALID_PA) 5562306a36Sopenharmony_ci __entry->pa = mem->physical_addr; 5662306a36Sopenharmony_ci else 5762306a36Sopenharmony_ci __entry->pa = ~0ull; 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_ci if (mem->validation_bits & CPER_MEM_VALID_PA_MASK) 6062306a36Sopenharmony_ci __entry->pa_mask_lsb = (u8)__ffs64(mem->physical_addr_mask); 6162306a36Sopenharmony_ci else 6262306a36Sopenharmony_ci __entry->pa_mask_lsb = ~0; 6362306a36Sopenharmony_ci __entry->fru_id = *fru_id; 6462306a36Sopenharmony_ci __assign_str(fru_text, fru_text); 6562306a36Sopenharmony_ci cper_mem_err_pack(mem, &__entry->data); 6662306a36Sopenharmony_ci ), 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_ci TP_printk("{%d} %s error: %s physical addr: %016llx (mask lsb: %x) %sFRU: %pUl %.20s", 6962306a36Sopenharmony_ci __entry->err_seq, 7062306a36Sopenharmony_ci cper_severity_str(__entry->sev), 7162306a36Sopenharmony_ci cper_mem_err_type_str(__entry->etype), 7262306a36Sopenharmony_ci __entry->pa, 7362306a36Sopenharmony_ci __entry->pa_mask_lsb, 7462306a36Sopenharmony_ci cper_mem_err_unpack(p, &__entry->data), 7562306a36Sopenharmony_ci &__entry->fru_id, 7662306a36Sopenharmony_ci __get_str(fru_text)) 7762306a36Sopenharmony_ci); 7862306a36Sopenharmony_ci#endif 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_ci/* 8162306a36Sopenharmony_ci * Hardware Events Report 8262306a36Sopenharmony_ci * 8362306a36Sopenharmony_ci * Those events are generated when hardware detected a corrected or 8462306a36Sopenharmony_ci * uncorrected event, and are meant to replace the current API to report 8562306a36Sopenharmony_ci * errors defined on both EDAC and MCE subsystems. 8662306a36Sopenharmony_ci * 8762306a36Sopenharmony_ci * FIXME: Add events for handling memory errors originated from the 8862306a36Sopenharmony_ci * MCE subsystem. 8962306a36Sopenharmony_ci */ 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_ci/* 9262306a36Sopenharmony_ci * Hardware-independent Memory Controller specific events 9362306a36Sopenharmony_ci */ 9462306a36Sopenharmony_ci 9562306a36Sopenharmony_ci/* 9662306a36Sopenharmony_ci * Default error mechanisms for Memory Controller errors (CE and UE) 9762306a36Sopenharmony_ci */ 9862306a36Sopenharmony_ciTRACE_EVENT(mc_event, 9962306a36Sopenharmony_ci 10062306a36Sopenharmony_ci TP_PROTO(const unsigned int err_type, 10162306a36Sopenharmony_ci const char *error_msg, 10262306a36Sopenharmony_ci const char *label, 10362306a36Sopenharmony_ci const int error_count, 10462306a36Sopenharmony_ci const u8 mc_index, 10562306a36Sopenharmony_ci const s8 top_layer, 10662306a36Sopenharmony_ci const s8 mid_layer, 10762306a36Sopenharmony_ci const s8 low_layer, 10862306a36Sopenharmony_ci unsigned long address, 10962306a36Sopenharmony_ci const u8 grain_bits, 11062306a36Sopenharmony_ci unsigned long syndrome, 11162306a36Sopenharmony_ci const char *driver_detail), 11262306a36Sopenharmony_ci 11362306a36Sopenharmony_ci TP_ARGS(err_type, error_msg, label, error_count, mc_index, 11462306a36Sopenharmony_ci top_layer, mid_layer, low_layer, address, grain_bits, 11562306a36Sopenharmony_ci syndrome, driver_detail), 11662306a36Sopenharmony_ci 11762306a36Sopenharmony_ci TP_STRUCT__entry( 11862306a36Sopenharmony_ci __field( unsigned int, error_type ) 11962306a36Sopenharmony_ci __string( msg, error_msg ) 12062306a36Sopenharmony_ci __string( label, label ) 12162306a36Sopenharmony_ci __field( u16, error_count ) 12262306a36Sopenharmony_ci __field( u8, mc_index ) 12362306a36Sopenharmony_ci __field( s8, top_layer ) 12462306a36Sopenharmony_ci __field( s8, middle_layer ) 12562306a36Sopenharmony_ci __field( s8, lower_layer ) 12662306a36Sopenharmony_ci __field( long, address ) 12762306a36Sopenharmony_ci __field( u8, grain_bits ) 12862306a36Sopenharmony_ci __field( long, syndrome ) 12962306a36Sopenharmony_ci __string( driver_detail, driver_detail ) 13062306a36Sopenharmony_ci ), 13162306a36Sopenharmony_ci 13262306a36Sopenharmony_ci TP_fast_assign( 13362306a36Sopenharmony_ci __entry->error_type = err_type; 13462306a36Sopenharmony_ci __assign_str(msg, error_msg); 13562306a36Sopenharmony_ci __assign_str(label, label); 13662306a36Sopenharmony_ci __entry->error_count = error_count; 13762306a36Sopenharmony_ci __entry->mc_index = mc_index; 13862306a36Sopenharmony_ci __entry->top_layer = top_layer; 13962306a36Sopenharmony_ci __entry->middle_layer = mid_layer; 14062306a36Sopenharmony_ci __entry->lower_layer = low_layer; 14162306a36Sopenharmony_ci __entry->address = address; 14262306a36Sopenharmony_ci __entry->grain_bits = grain_bits; 14362306a36Sopenharmony_ci __entry->syndrome = syndrome; 14462306a36Sopenharmony_ci __assign_str(driver_detail, driver_detail); 14562306a36Sopenharmony_ci ), 14662306a36Sopenharmony_ci 14762306a36Sopenharmony_ci TP_printk("%d %s error%s:%s%s on %s (mc:%d location:%d:%d:%d address:0x%08lx grain:%d syndrome:0x%08lx%s%s)", 14862306a36Sopenharmony_ci __entry->error_count, 14962306a36Sopenharmony_ci mc_event_error_type(__entry->error_type), 15062306a36Sopenharmony_ci __entry->error_count > 1 ? "s" : "", 15162306a36Sopenharmony_ci __get_str(msg)[0] ? " " : "", 15262306a36Sopenharmony_ci __get_str(msg), 15362306a36Sopenharmony_ci __get_str(label), 15462306a36Sopenharmony_ci __entry->mc_index, 15562306a36Sopenharmony_ci __entry->top_layer, 15662306a36Sopenharmony_ci __entry->middle_layer, 15762306a36Sopenharmony_ci __entry->lower_layer, 15862306a36Sopenharmony_ci __entry->address, 15962306a36Sopenharmony_ci 1 << __entry->grain_bits, 16062306a36Sopenharmony_ci __entry->syndrome, 16162306a36Sopenharmony_ci __get_str(driver_detail)[0] ? " " : "", 16262306a36Sopenharmony_ci __get_str(driver_detail)) 16362306a36Sopenharmony_ci); 16462306a36Sopenharmony_ci 16562306a36Sopenharmony_ci/* 16662306a36Sopenharmony_ci * ARM Processor Events Report 16762306a36Sopenharmony_ci * 16862306a36Sopenharmony_ci * This event is generated when hardware detects an ARM processor error 16962306a36Sopenharmony_ci * has occurred. UEFI 2.6 spec section N.2.4.4. 17062306a36Sopenharmony_ci */ 17162306a36Sopenharmony_ciTRACE_EVENT(arm_event, 17262306a36Sopenharmony_ci 17362306a36Sopenharmony_ci TP_PROTO(const struct cper_sec_proc_arm *proc), 17462306a36Sopenharmony_ci 17562306a36Sopenharmony_ci TP_ARGS(proc), 17662306a36Sopenharmony_ci 17762306a36Sopenharmony_ci TP_STRUCT__entry( 17862306a36Sopenharmony_ci __field(u64, mpidr) 17962306a36Sopenharmony_ci __field(u64, midr) 18062306a36Sopenharmony_ci __field(u32, running_state) 18162306a36Sopenharmony_ci __field(u32, psci_state) 18262306a36Sopenharmony_ci __field(u8, affinity) 18362306a36Sopenharmony_ci ), 18462306a36Sopenharmony_ci 18562306a36Sopenharmony_ci TP_fast_assign( 18662306a36Sopenharmony_ci if (proc->validation_bits & CPER_ARM_VALID_AFFINITY_LEVEL) 18762306a36Sopenharmony_ci __entry->affinity = proc->affinity_level; 18862306a36Sopenharmony_ci else 18962306a36Sopenharmony_ci __entry->affinity = ~0; 19062306a36Sopenharmony_ci if (proc->validation_bits & CPER_ARM_VALID_MPIDR) 19162306a36Sopenharmony_ci __entry->mpidr = proc->mpidr; 19262306a36Sopenharmony_ci else 19362306a36Sopenharmony_ci __entry->mpidr = 0ULL; 19462306a36Sopenharmony_ci __entry->midr = proc->midr; 19562306a36Sopenharmony_ci if (proc->validation_bits & CPER_ARM_VALID_RUNNING_STATE) { 19662306a36Sopenharmony_ci __entry->running_state = proc->running_state; 19762306a36Sopenharmony_ci __entry->psci_state = proc->psci_state; 19862306a36Sopenharmony_ci } else { 19962306a36Sopenharmony_ci __entry->running_state = ~0; 20062306a36Sopenharmony_ci __entry->psci_state = ~0; 20162306a36Sopenharmony_ci } 20262306a36Sopenharmony_ci ), 20362306a36Sopenharmony_ci 20462306a36Sopenharmony_ci TP_printk("affinity level: %d; MPIDR: %016llx; MIDR: %016llx; " 20562306a36Sopenharmony_ci "running state: %d; PSCI state: %d", 20662306a36Sopenharmony_ci __entry->affinity, __entry->mpidr, __entry->midr, 20762306a36Sopenharmony_ci __entry->running_state, __entry->psci_state) 20862306a36Sopenharmony_ci); 20962306a36Sopenharmony_ci 21062306a36Sopenharmony_ci/* 21162306a36Sopenharmony_ci * Non-Standard Section Report 21262306a36Sopenharmony_ci * 21362306a36Sopenharmony_ci * This event is generated when hardware detected a hardware 21462306a36Sopenharmony_ci * error event, which may be of non-standard section as defined 21562306a36Sopenharmony_ci * in UEFI spec appendix "Common Platform Error Record", or may 21662306a36Sopenharmony_ci * be of sections for which TRACE_EVENT is not defined. 21762306a36Sopenharmony_ci * 21862306a36Sopenharmony_ci */ 21962306a36Sopenharmony_ciTRACE_EVENT(non_standard_event, 22062306a36Sopenharmony_ci 22162306a36Sopenharmony_ci TP_PROTO(const guid_t *sec_type, 22262306a36Sopenharmony_ci const guid_t *fru_id, 22362306a36Sopenharmony_ci const char *fru_text, 22462306a36Sopenharmony_ci const u8 sev, 22562306a36Sopenharmony_ci const u8 *err, 22662306a36Sopenharmony_ci const u32 len), 22762306a36Sopenharmony_ci 22862306a36Sopenharmony_ci TP_ARGS(sec_type, fru_id, fru_text, sev, err, len), 22962306a36Sopenharmony_ci 23062306a36Sopenharmony_ci TP_STRUCT__entry( 23162306a36Sopenharmony_ci __array(char, sec_type, UUID_SIZE) 23262306a36Sopenharmony_ci __array(char, fru_id, UUID_SIZE) 23362306a36Sopenharmony_ci __string(fru_text, fru_text) 23462306a36Sopenharmony_ci __field(u8, sev) 23562306a36Sopenharmony_ci __field(u32, len) 23662306a36Sopenharmony_ci __dynamic_array(u8, buf, len) 23762306a36Sopenharmony_ci ), 23862306a36Sopenharmony_ci 23962306a36Sopenharmony_ci TP_fast_assign( 24062306a36Sopenharmony_ci memcpy(__entry->sec_type, sec_type, UUID_SIZE); 24162306a36Sopenharmony_ci memcpy(__entry->fru_id, fru_id, UUID_SIZE); 24262306a36Sopenharmony_ci __assign_str(fru_text, fru_text); 24362306a36Sopenharmony_ci __entry->sev = sev; 24462306a36Sopenharmony_ci __entry->len = len; 24562306a36Sopenharmony_ci memcpy(__get_dynamic_array(buf), err, len); 24662306a36Sopenharmony_ci ), 24762306a36Sopenharmony_ci 24862306a36Sopenharmony_ci TP_printk("severity: %d; sec type:%pU; FRU: %pU %s; data len:%d; raw data:%s", 24962306a36Sopenharmony_ci __entry->sev, __entry->sec_type, 25062306a36Sopenharmony_ci __entry->fru_id, __get_str(fru_text), 25162306a36Sopenharmony_ci __entry->len, 25262306a36Sopenharmony_ci __print_hex(__get_dynamic_array(buf), __entry->len)) 25362306a36Sopenharmony_ci); 25462306a36Sopenharmony_ci 25562306a36Sopenharmony_ci/* 25662306a36Sopenharmony_ci * PCIe AER Trace event 25762306a36Sopenharmony_ci * 25862306a36Sopenharmony_ci * These events are generated when hardware detects a corrected or 25962306a36Sopenharmony_ci * uncorrected event on a PCIe device. The event report has 26062306a36Sopenharmony_ci * the following structure: 26162306a36Sopenharmony_ci * 26262306a36Sopenharmony_ci * char * dev_name - The name of the slot where the device resides 26362306a36Sopenharmony_ci * ([domain:]bus:device.function). 26462306a36Sopenharmony_ci * u32 status - Either the correctable or uncorrectable register 26562306a36Sopenharmony_ci * indicating what error or errors have been seen 26662306a36Sopenharmony_ci * u8 severity - error severity 0:NONFATAL 1:FATAL 2:CORRECTED 26762306a36Sopenharmony_ci */ 26862306a36Sopenharmony_ci 26962306a36Sopenharmony_ci#define aer_correctable_errors \ 27062306a36Sopenharmony_ci {PCI_ERR_COR_RCVR, "Receiver Error"}, \ 27162306a36Sopenharmony_ci {PCI_ERR_COR_BAD_TLP, "Bad TLP"}, \ 27262306a36Sopenharmony_ci {PCI_ERR_COR_BAD_DLLP, "Bad DLLP"}, \ 27362306a36Sopenharmony_ci {PCI_ERR_COR_REP_ROLL, "RELAY_NUM Rollover"}, \ 27462306a36Sopenharmony_ci {PCI_ERR_COR_REP_TIMER, "Replay Timer Timeout"}, \ 27562306a36Sopenharmony_ci {PCI_ERR_COR_ADV_NFAT, "Advisory Non-Fatal Error"}, \ 27662306a36Sopenharmony_ci {PCI_ERR_COR_INTERNAL, "Corrected Internal Error"}, \ 27762306a36Sopenharmony_ci {PCI_ERR_COR_LOG_OVER, "Header Log Overflow"} 27862306a36Sopenharmony_ci 27962306a36Sopenharmony_ci#define aer_uncorrectable_errors \ 28062306a36Sopenharmony_ci {PCI_ERR_UNC_UND, "Undefined"}, \ 28162306a36Sopenharmony_ci {PCI_ERR_UNC_DLP, "Data Link Protocol Error"}, \ 28262306a36Sopenharmony_ci {PCI_ERR_UNC_SURPDN, "Surprise Down Error"}, \ 28362306a36Sopenharmony_ci {PCI_ERR_UNC_POISON_TLP,"Poisoned TLP"}, \ 28462306a36Sopenharmony_ci {PCI_ERR_UNC_FCP, "Flow Control Protocol Error"}, \ 28562306a36Sopenharmony_ci {PCI_ERR_UNC_COMP_TIME, "Completion Timeout"}, \ 28662306a36Sopenharmony_ci {PCI_ERR_UNC_COMP_ABORT,"Completer Abort"}, \ 28762306a36Sopenharmony_ci {PCI_ERR_UNC_UNX_COMP, "Unexpected Completion"}, \ 28862306a36Sopenharmony_ci {PCI_ERR_UNC_RX_OVER, "Receiver Overflow"}, \ 28962306a36Sopenharmony_ci {PCI_ERR_UNC_MALF_TLP, "Malformed TLP"}, \ 29062306a36Sopenharmony_ci {PCI_ERR_UNC_ECRC, "ECRC Error"}, \ 29162306a36Sopenharmony_ci {PCI_ERR_UNC_UNSUP, "Unsupported Request Error"}, \ 29262306a36Sopenharmony_ci {PCI_ERR_UNC_ACSV, "ACS Violation"}, \ 29362306a36Sopenharmony_ci {PCI_ERR_UNC_INTN, "Uncorrectable Internal Error"},\ 29462306a36Sopenharmony_ci {PCI_ERR_UNC_MCBTLP, "MC Blocked TLP"}, \ 29562306a36Sopenharmony_ci {PCI_ERR_UNC_ATOMEG, "AtomicOp Egress Blocked"}, \ 29662306a36Sopenharmony_ci {PCI_ERR_UNC_TLPPRE, "TLP Prefix Blocked Error"} 29762306a36Sopenharmony_ci 29862306a36Sopenharmony_ciTRACE_EVENT(aer_event, 29962306a36Sopenharmony_ci TP_PROTO(const char *dev_name, 30062306a36Sopenharmony_ci const u32 status, 30162306a36Sopenharmony_ci const u8 severity, 30262306a36Sopenharmony_ci const u8 tlp_header_valid, 30362306a36Sopenharmony_ci struct aer_header_log_regs *tlp), 30462306a36Sopenharmony_ci 30562306a36Sopenharmony_ci TP_ARGS(dev_name, status, severity, tlp_header_valid, tlp), 30662306a36Sopenharmony_ci 30762306a36Sopenharmony_ci TP_STRUCT__entry( 30862306a36Sopenharmony_ci __string( dev_name, dev_name ) 30962306a36Sopenharmony_ci __field( u32, status ) 31062306a36Sopenharmony_ci __field( u8, severity ) 31162306a36Sopenharmony_ci __field( u8, tlp_header_valid) 31262306a36Sopenharmony_ci __array( u32, tlp_header, 4 ) 31362306a36Sopenharmony_ci ), 31462306a36Sopenharmony_ci 31562306a36Sopenharmony_ci TP_fast_assign( 31662306a36Sopenharmony_ci __assign_str(dev_name, dev_name); 31762306a36Sopenharmony_ci __entry->status = status; 31862306a36Sopenharmony_ci __entry->severity = severity; 31962306a36Sopenharmony_ci __entry->tlp_header_valid = tlp_header_valid; 32062306a36Sopenharmony_ci if (tlp_header_valid) { 32162306a36Sopenharmony_ci __entry->tlp_header[0] = tlp->dw0; 32262306a36Sopenharmony_ci __entry->tlp_header[1] = tlp->dw1; 32362306a36Sopenharmony_ci __entry->tlp_header[2] = tlp->dw2; 32462306a36Sopenharmony_ci __entry->tlp_header[3] = tlp->dw3; 32562306a36Sopenharmony_ci } 32662306a36Sopenharmony_ci ), 32762306a36Sopenharmony_ci 32862306a36Sopenharmony_ci TP_printk("%s PCIe Bus Error: severity=%s, %s, TLP Header=%s\n", 32962306a36Sopenharmony_ci __get_str(dev_name), 33062306a36Sopenharmony_ci __entry->severity == AER_CORRECTABLE ? "Corrected" : 33162306a36Sopenharmony_ci __entry->severity == AER_FATAL ? 33262306a36Sopenharmony_ci "Fatal" : "Uncorrected, non-fatal", 33362306a36Sopenharmony_ci __entry->severity == AER_CORRECTABLE ? 33462306a36Sopenharmony_ci __print_flags(__entry->status, "|", aer_correctable_errors) : 33562306a36Sopenharmony_ci __print_flags(__entry->status, "|", aer_uncorrectable_errors), 33662306a36Sopenharmony_ci __entry->tlp_header_valid ? 33762306a36Sopenharmony_ci __print_array(__entry->tlp_header, 4, 4) : 33862306a36Sopenharmony_ci "Not available") 33962306a36Sopenharmony_ci); 34062306a36Sopenharmony_ci 34162306a36Sopenharmony_ci/* 34262306a36Sopenharmony_ci * memory-failure recovery action result event 34362306a36Sopenharmony_ci * 34462306a36Sopenharmony_ci * unsigned long pfn - Page Frame Number of the corrupted page 34562306a36Sopenharmony_ci * int type - Page types of the corrupted page 34662306a36Sopenharmony_ci * int result - Result of recovery action 34762306a36Sopenharmony_ci */ 34862306a36Sopenharmony_ci 34962306a36Sopenharmony_ci#ifdef CONFIG_MEMORY_FAILURE 35062306a36Sopenharmony_ci#define MF_ACTION_RESULT \ 35162306a36Sopenharmony_ci EM ( MF_IGNORED, "Ignored" ) \ 35262306a36Sopenharmony_ci EM ( MF_FAILED, "Failed" ) \ 35362306a36Sopenharmony_ci EM ( MF_DELAYED, "Delayed" ) \ 35462306a36Sopenharmony_ci EMe ( MF_RECOVERED, "Recovered" ) 35562306a36Sopenharmony_ci 35662306a36Sopenharmony_ci#define MF_PAGE_TYPE \ 35762306a36Sopenharmony_ci EM ( MF_MSG_KERNEL, "reserved kernel page" ) \ 35862306a36Sopenharmony_ci EM ( MF_MSG_KERNEL_HIGH_ORDER, "high-order kernel page" ) \ 35962306a36Sopenharmony_ci EM ( MF_MSG_SLAB, "kernel slab page" ) \ 36062306a36Sopenharmony_ci EM ( MF_MSG_DIFFERENT_COMPOUND, "different compound page after locking" ) \ 36162306a36Sopenharmony_ci EM ( MF_MSG_HUGE, "huge page" ) \ 36262306a36Sopenharmony_ci EM ( MF_MSG_FREE_HUGE, "free huge page" ) \ 36362306a36Sopenharmony_ci EM ( MF_MSG_UNMAP_FAILED, "unmapping failed page" ) \ 36462306a36Sopenharmony_ci EM ( MF_MSG_DIRTY_SWAPCACHE, "dirty swapcache page" ) \ 36562306a36Sopenharmony_ci EM ( MF_MSG_CLEAN_SWAPCACHE, "clean swapcache page" ) \ 36662306a36Sopenharmony_ci EM ( MF_MSG_DIRTY_MLOCKED_LRU, "dirty mlocked LRU page" ) \ 36762306a36Sopenharmony_ci EM ( MF_MSG_CLEAN_MLOCKED_LRU, "clean mlocked LRU page" ) \ 36862306a36Sopenharmony_ci EM ( MF_MSG_DIRTY_UNEVICTABLE_LRU, "dirty unevictable LRU page" ) \ 36962306a36Sopenharmony_ci EM ( MF_MSG_CLEAN_UNEVICTABLE_LRU, "clean unevictable LRU page" ) \ 37062306a36Sopenharmony_ci EM ( MF_MSG_DIRTY_LRU, "dirty LRU page" ) \ 37162306a36Sopenharmony_ci EM ( MF_MSG_CLEAN_LRU, "clean LRU page" ) \ 37262306a36Sopenharmony_ci EM ( MF_MSG_TRUNCATED_LRU, "already truncated LRU page" ) \ 37362306a36Sopenharmony_ci EM ( MF_MSG_BUDDY, "free buddy page" ) \ 37462306a36Sopenharmony_ci EM ( MF_MSG_DAX, "dax page" ) \ 37562306a36Sopenharmony_ci EM ( MF_MSG_UNSPLIT_THP, "unsplit thp" ) \ 37662306a36Sopenharmony_ci EMe ( MF_MSG_UNKNOWN, "unknown page" ) 37762306a36Sopenharmony_ci 37862306a36Sopenharmony_ci/* 37962306a36Sopenharmony_ci * First define the enums in MM_ACTION_RESULT to be exported to userspace 38062306a36Sopenharmony_ci * via TRACE_DEFINE_ENUM(). 38162306a36Sopenharmony_ci */ 38262306a36Sopenharmony_ci#undef EM 38362306a36Sopenharmony_ci#undef EMe 38462306a36Sopenharmony_ci#define EM(a, b) TRACE_DEFINE_ENUM(a); 38562306a36Sopenharmony_ci#define EMe(a, b) TRACE_DEFINE_ENUM(a); 38662306a36Sopenharmony_ci 38762306a36Sopenharmony_ciMF_ACTION_RESULT 38862306a36Sopenharmony_ciMF_PAGE_TYPE 38962306a36Sopenharmony_ci 39062306a36Sopenharmony_ci/* 39162306a36Sopenharmony_ci * Now redefine the EM() and EMe() macros to map the enums to the strings 39262306a36Sopenharmony_ci * that will be printed in the output. 39362306a36Sopenharmony_ci */ 39462306a36Sopenharmony_ci#undef EM 39562306a36Sopenharmony_ci#undef EMe 39662306a36Sopenharmony_ci#define EM(a, b) { a, b }, 39762306a36Sopenharmony_ci#define EMe(a, b) { a, b } 39862306a36Sopenharmony_ci 39962306a36Sopenharmony_ciTRACE_EVENT(memory_failure_event, 40062306a36Sopenharmony_ci TP_PROTO(unsigned long pfn, 40162306a36Sopenharmony_ci int type, 40262306a36Sopenharmony_ci int result), 40362306a36Sopenharmony_ci 40462306a36Sopenharmony_ci TP_ARGS(pfn, type, result), 40562306a36Sopenharmony_ci 40662306a36Sopenharmony_ci TP_STRUCT__entry( 40762306a36Sopenharmony_ci __field(unsigned long, pfn) 40862306a36Sopenharmony_ci __field(int, type) 40962306a36Sopenharmony_ci __field(int, result) 41062306a36Sopenharmony_ci ), 41162306a36Sopenharmony_ci 41262306a36Sopenharmony_ci TP_fast_assign( 41362306a36Sopenharmony_ci __entry->pfn = pfn; 41462306a36Sopenharmony_ci __entry->type = type; 41562306a36Sopenharmony_ci __entry->result = result; 41662306a36Sopenharmony_ci ), 41762306a36Sopenharmony_ci 41862306a36Sopenharmony_ci TP_printk("pfn %#lx: recovery action for %s: %s", 41962306a36Sopenharmony_ci __entry->pfn, 42062306a36Sopenharmony_ci __print_symbolic(__entry->type, MF_PAGE_TYPE), 42162306a36Sopenharmony_ci __print_symbolic(__entry->result, MF_ACTION_RESULT) 42262306a36Sopenharmony_ci ) 42362306a36Sopenharmony_ci); 42462306a36Sopenharmony_ci#endif /* CONFIG_MEMORY_FAILURE */ 42562306a36Sopenharmony_ci#endif /* _TRACE_HW_EVENT_MC_H */ 42662306a36Sopenharmony_ci 42762306a36Sopenharmony_ci/* This part must be outside protection */ 42862306a36Sopenharmony_ci#include <trace/define_trace.h> 429