blob: bb1185143589c7072c4d928a9bf10436aae08400 [file] [edit]
/* SPDX-License-Identifier: MIT */
/*
* Copyright © 2026 Intel Corporation
*/
#ifndef _XE_LOG_H_
#define _XE_LOG_H_
#include <linux/cper.h>
#include <linux/err.h>
#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