/* SPDX-License-Identifier: MIT */ /* * Copyright © 2026 Intel Corporation */ #ifndef _XE_LOG_H_ #define _XE_LOG_H_ #include #include #include "abi/xe_log_abi.h" #include "abi/xe_sigid_abi.h" #include "xe_any.h" struct pci_dev; __printf(8, 9) void __xe_log_emit(struct pci_dev *pdev, int cper_sev, enum xe_sigid sigid, u32 component, u32 location, const void *data, size_t len, const char *fmt, ...); #define __xe_log_const_sev_to_level(sev) \ (__builtin_constant_p(sev) ? (sev) == CPER_SEV_INFORMATIONAL ? KERN_INFO : KERN_ERR : NULL) #define __xe_log_emit_printk_index(level, fmt) \ dev_printk_index_emit(level, "%s SIGID=%u %s" fmt); #define xe_log_emit(pdev, sev, sig, comp, loc, data, len, fmt, args...) do { \ __xe_log_emit_printk_index(__xe_log_const_sev_to_level(sev), fmt); \ __xe_log_emit((pdev), (sev), (sig), (comp), (loc), (data), (len), fmt, ##args); \ } while (0) #define xe_log_emit_fatal(pdev, sig, comp, loc, data, len, fmt, args...) \ xe_log_emit((pdev), CPER_SEV_FATAL, (sig), (comp), (loc), \ (data), (len), fmt, ##args) #define xe_log_emit_recoverable(pdev, sig, comp, loc, data, len, fmt, args...) \ xe_log_emit((pdev), CPER_SEV_RECOVERABLE, (sig), (comp), (loc), \ (data), (len), fmt, ##args) #define xe_log_emit_corrected(pdev, sig, comp, loc, data, len, fmt, args...) \ xe_log_emit((pdev), CPER_SEV_CORRECTED, (sig), (comp), (loc), \ (data), (len), fmt, ##args) #define xe_log_emit_info(pdev, sig, comp, loc, data, len, fmt, args...) \ xe_log_emit((pdev), CPER_SEV_INFORMATIONAL, (sig), (comp), (loc), \ (data), (len), fmt, ##args) #define xe_log_location_type(any) \ _Generic((any), \ struct xe_gt * : XE_LOG_LOCATION_TYPE_GT, \ const struct xe_gt * : XE_LOG_LOCATION_TYPE_GT, \ struct xe_tile * : XE_LOG_LOCATION_TYPE_TILE, \ const struct xe_tile * : XE_LOG_LOCATION_TYPE_TILE, \ struct xe_device * : XE_LOG_LOCATION_TYPE_DEVICE, \ const struct xe_device * : XE_LOG_LOCATION_TYPE_DEVICE, \ struct pci_dev * : XE_LOG_LOCATION_TYPE_DEVICE, \ struct device * : XE_LOG_LOCATION_TYPE_DEVICE) #define xe_log_location(any) \ PREP_XE_LOG_LOCATION(xe_log_location_type(any), xe_any_id(any)) /** * xe_log_from() - Emit a structured SIGID log entry using @any pointer as location. * @any: the &xe_device or &xe_tile or &xe_gt pointer this report relates to * @cper_sev: CPER severity (CPER_SEV_FATAL, CPER_SEV_RECOVERABLE, ...) * @sigid: signature identifier, see &enum xe_sigid * @component: component identifer * @data: pointer to the additional details, or ERR_PTR, or NULL if not applicable * @len: length of the @data in bytes, or 0 if not applicable * @fmt: printf-style format string * @args: arguments for the @fmt format string * * The location used to emit SIGID entry will be based on the @any pointer type. * See xe_log_emit() for more details. */ #define xe_log_from(any, cper_sev, sigid, component, data, len, fmt, args...) do { \ typeof(any) ___any = (any); \ xe_log_emit(xe_any_to_pdev(___any), (cper_sev), (sigid), (component), \ xe_log_location(___any), (data), (len), fmt, ##args); \ } while (0) #define xe_log_from_fatal(any, sig, comp, data, len, fmt, args...) \ xe_log_from((any), CPER_SEV_FATAL, (sig), (comp), \ (data), (len), fmt, ##args) #define xe_log_from_recoverable(any, sig, comp, data, len, fmt, args...) \ xe_log_from((any), CPER_SEV_RECOVERABLE, (sig), (comp), \ (data), (len), fmt, ##args) #define xe_log_from_corrected(any, sig, comp, data, len, fmt, args...) \ xe_log_from((any), CPER_SEV_CORRECTED, (sig), (comp), \ (data), (len), fmt, ##args) #define xe_log_from_info(any, sig, comp, data, len, fmt, args...) \ xe_log_from((any), CPER_SEV_INFORMATIONAL, (sig), (comp), \ (data), (len), fmt, ##args) /** * xe_log_comp() - Emit a structured SIGID log entry on the component behalf. * @any: the &xe_device or &xe_tile or &xe_gt pointer this report relates to * @cper_sev: CPER severity (CPER_SEV_FATAL, CPER_SEV_RECOVERABLE, ...) * @TAG: the component tag to use * @data: pointer to the additional details, or ERR_PTR, or NULL if not applicable * @len: length of the @data in bytes, or 0 if not applicable * @fmt: printf-style free text format string (not a stable interface) * @args: arguments for the @fmt format string * * The SIGID will be determined from the component's @TAG. * The component identifier will be determined from the component's @TAG. * The location used to emit SIGID entry will be based on the @any pointer type. */ #define xe_log_comp(any, cper_sev, TAG, data, len, fmt, args...) \ xe_log_from((any), (cper_sev), (int)XE_LOG_COMPONENT_##TAG##_SIGID, \ XE_LOG_COMPONENT_##TAG, (data), (len), fmt, ##args) #define xe_log_comp_fatal(any, TAG, data, len, fmt, args...) \ xe_log_comp((any), CPER_SEV_FATAL, TAG, (data), (len), fmt, ##args) #define xe_log_comp_recoverable(any, TAG, data, len, fmt, args...) \ xe_log_comp((any), CPER_SEV_RECOVERABLE, TAG, (data), (len), fmt, ##args) #define xe_log_comp_corrected(any, TAG, data, len, fmt, args...) \ xe_log_comp((any), CPER_SEV_CORRECTED, TAG, (data), (len), fmt, ##args) #define xe_log_comp_info(any, TAG, data, len, fmt, args...) \ xe_log_comp((any), CPER_SEV_INFORMATIONAL, TAG, (data), (len), fmt, ##args) /** * xe_log_err() - Emit a structured SIGID error log entry on the component behalf. * @any: the &xe_device or &xe_tile or &xe_gt pointer this report relates to * @TAG: the component tag to use * @err: negative errno for the failing operation, or 0 if not applicable * @fmt: printf-style free text format string (not a stable interface) * @args: arguments for the @fmt format string * * The log entry will be emitted with @CPER_SEV_RECOVERABLE severity. */ #define xe_log_err(any, TAG, err, fmt, args...) \ xe_log_comp_recoverable((any), TAG, ERR_PTR(err), 0, fmt, ##args) /** * xe_log_err_fatal() - Emit a structured SIGID error log entry on the component behalf. * @any: the &xe_device or &xe_tile or &xe_gt pointer this report relates to * @TAG: the component tag to use * @err: negative errno for the failing operation, or 0 if not applicable * @fmt: printf-style free text format string (not a stable interface) * @args: arguments for the @fmt format string * * The log entry will be emitted with @CPER_SEV_FATAL severity. */ #define xe_log_err_fatal(any, TAG, err, fmt, args...) \ xe_log_comp_fatal((any), TAG, ERR_PTR(err), 0, fmt, ##args) /** * xe_log_err_corrected() - Emit a structured SIGID error log entry on the component behalf. * @any: the &xe_device or &xe_tile or &xe_gt pointer this report relates to * @TAG: the component tag to use * @err: negative errno for the failing operation, or 0 if not applicable * @fmt: printf-style free text format string (not a stable interface) * @args: arguments for the @fmt format string * * The log entry will be emitted with @CPER_SEV_CORRECTED severity. */ #define xe_log_err_corrected(any, TAG, err, fmt, args...) \ xe_log_comp_corrected((any), TAG, ERR_PTR(err), 0, fmt, ##args) /** * xe_log_err_info() - Emit a structured SIGID error log entry on the component behalf. * @any: the &xe_device or &xe_tile or &xe_gt pointer this report relates to * @TAG: the component tag to use * @err: negative errno for the failing operation, or 0 if not applicable * @fmt: printf-style free text format string (not a stable interface) * @args: arguments for the @fmt format string * * The log entry will be emitted with @CPER_SEV_INFORMATIONAL severity. */ #define xe_log_err_info(any, TAG, err, fmt, args...) \ xe_log_comp_info((any), TAG, ERR_PTR(err), 0, fmt, ##args) /** * xe_log_info() - Emit a structured SIGID information log entry on the component behalf. * @any: the &xe_device or &xe_tile or &xe_gt pointer this report relates to * @TAG: the component tag to use * @fmt: printf-style free text format string (not a stable interface) * @args: arguments for the @fmt format string * * The log entry will be emitted with @CPER_SEV_INFORMATIONAL severity. */ #define xe_log_info(any, TAG, fmt, args...) \ xe_log_err_info((any), TAG, 0, fmt, ##args) #endif