hw_err
struct hw_err_info *info = &hdev->captured_err_info.hw_err;
struct hw_err_info hw_err;
info = &hdev->captured_err_info.hw_err;
struct qm_hw_err *err, *tmp, *hw_err;
hw_err = kzalloc_obj(*hw_err);
if (!hw_err)
hw_err->timestamp = jiffies;
if ((hw_err->timestamp - err->timestamp) / HZ >
list_add(&hw_err->list, &isolate->qm_hw_errs);
#define ERR_STAT_GT_VECTOR_REG(hw_err, x) (hw_err == HARDWARE_ERROR_CORRECTABLE ? \
#define SOC_LOCAL_ERR_STAT_REG(base, hw_err) XE_REG(hw_err == HARDWARE_ERROR_CORRECTABLE ? \
#define PVC_MASTER_LOCAL_REG_INFO(hw_err) ((hw_err == HARDWARE_ERROR_FATAL) ? \
static void csc_hw_error_handler(struct xe_tile *tile, const enum hardware_error hw_err)
const enum drm_xe_ras_error_severity severity = hw_err_to_severity(hw_err);
#define PVC_ERROR_MASK_SET(hw_err, err_bit) ((hw_err == HARDWARE_ERROR_CORRECTABLE) ? \
static void gt_hw_error_handler(struct xe_tile *tile, const enum hardware_error hw_err,
const enum drm_xe_ras_error_severity severity = hw_err_to_severity(hw_err);
if (hw_err == HARDWARE_ERROR_NONFATAL) {
for (i = 0; i < PVC_GT_VECTOR_LEN(hw_err); i++) {
vector = xe_mmio_read32(mmio, ERR_STAT_GT_VECTOR_REG(hw_err, i));
err_stat = xe_mmio_read32(mmio, ERR_STAT_GT_REG(hw_err));
if (PVC_ERROR_MASK_SET(hw_err, errbit))
xe_mmio_write32(mmio, ERR_STAT_GT_REG(hw_err), err_stat);
xe_mmio_write32(mmio, ERR_STAT_GT_VECTOR_REG(hw_err, i), vector);
static void soc_slave_ieh_handler(struct xe_tile *tile, const enum hardware_error hw_err, u32 error_id)
const enum drm_xe_ras_error_severity severity = hw_err_to_severity(hw_err);
slave_global_errstat = xe_mmio_read32(mmio, SOC_GLOBAL_ERR_STAT_REG(slave, hw_err));
slave_local_errstat = xe_mmio_read32(mmio, SOC_LOCAL_ERR_STAT_REG(slave, hw_err));
if (hw_err == HARDWARE_ERROR_FATAL) {
xe_mmio_write32(mmio, SOC_LOCAL_ERR_STAT_REG(slave, hw_err),
xe_mmio_write32(mmio, SOC_GLOBAL_ERR_STAT_REG(slave, hw_err), slave_global_errstat);
static void soc_hw_error_handler(struct xe_tile *tile, const enum hardware_error hw_err,
const enum drm_xe_ras_error_severity severity = hw_err_to_severity(hw_err);
xe_mmio_write32(mmio, SOC_GSYSEVTCTL_REG(master, slave, i), ~REG_BIT(hw_err));
if (hw_err == HARDWARE_ERROR_CORRECTABLE) {
xe_mmio_write32(mmio, SOC_GLOBAL_ERR_STAT_REG(master, hw_err), REG_GENMASK(31, 0));
xe_mmio_write32(mmio, SOC_LOCAL_ERR_STAT_REG(master, hw_err), REG_GENMASK(31, 0));
xe_mmio_write32(mmio, SOC_GLOBAL_ERR_STAT_REG(slave, hw_err), REG_GENMASK(31, 0));
xe_mmio_write32(mmio, SOC_LOCAL_ERR_STAT_REG(slave, hw_err), REG_GENMASK(31, 0));
master_global_errstat = xe_mmio_read32(mmio, SOC_GLOBAL_ERR_STAT_REG(master, hw_err));
soc_slave_ieh_handler(tile, hw_err, error_id);
master_local_errstat = xe_mmio_read32(mmio, SOC_LOCAL_ERR_STAT_REG(master, hw_err));
log_soc_error(tile, PVC_MASTER_LOCAL_REG_INFO(hw_err), severity, regbit, error_id);
xe_mmio_write32(mmio, SOC_LOCAL_ERR_STAT_REG(master, hw_err), master_local_errstat);
xe_mmio_write32(mmio, SOC_GLOBAL_ERR_STAT_REG(master, hw_err), master_global_errstat);
static void hw_error_source_handler(struct xe_tile *tile, const enum hardware_error hw_err)
const enum drm_xe_ras_error_severity severity = hw_err_to_severity(hw_err);
err_src = xe_mmio_read32(&tile->mmio, DEV_ERR_STAT_REG(hw_err));
csc_hw_error_handler(tile, hw_err);
gt_hw_error_handler(tile, hw_err, error_id);
soc_hw_error_handler(tile, hw_err, error_id);
xe_mmio_write32(&tile->mmio, DEV_ERR_STAT_REG(hw_err), err_src);
enum hardware_error hw_err;
#define PVC_GT_VECTOR_LEN(hw_err) ((hw_err == HARDWARE_ERROR_CORRECTABLE) ? \
for (hw_err = 0; hw_err < HARDWARE_ERROR_MAX; hw_err++) {
if (master_ctl & ERROR_IRQ(hw_err))
hw_error_source_handler(tile, hw_err);
static enum drm_xe_ras_error_severity hw_err_to_severity(const enum hardware_error hw_err)
if (hw_err == HARDWARE_ERROR_CORRECTABLE)
ctx->hw_err = false;
ctx->hw_err = false;
ctx->hw_err = false;
ctx->hw_err = true;
ctx->hw_err = true;
ctx->hw_err = true;
ctx->hw_err = true;
ctx->hw_err = true;
ctx->hw_err = true;
ctx->hw_err = true;
ctx->hw_err = true;
ctx->hw_err = true;
ctx->hw_err = true;
ret = ctx->hw_err ? -EFAULT : 0;
ctx->encode_errors += ctx->hw_err ? 1 : 0;
bool hw_err;
hw_err(hw, "eeprom read at offset %d failed\n", data_offset);
hw_err(hw, "eeprom read at offset %d failed\n", offset);
hw_err(hw, "eeprom read at offset %d failed\n",
hw_err(hw, "eeprom read at offset %d failed\n",
hw_err(hw, "eeprom read at offset %d failed\n", offset);
hw_err(hw, "eeprom read at offset %d failed\n", offset);
hw_err(hw, "eeprom read at offset %d failed\n",
hw_err(hw, "eeprom read at offset %d failed\n", data_offset);
hw_err(hw, "eeprom read at %d failed\n",
hw_err(hw, "eeprom read at offset %d failed\n", *list_offset);
hw_err(hw, "port expander access failed with %d\n", status);
hw_err(hw, "port expander access failed with %d\n", status);
hw_err(hw, "CS4227 reset did not complete\n");
hw_err(hw, "CS4227 EEPROM did not load successfully\n");
hw_err(hw, "semaphore failed with %d\n", status);
hw_err(hw, "semaphore failed with %d\n", status);
hw_err(hw, "CS4227 reset failed: %d", status);
hw_err(hw, "semaphore failed with %d", status);
hw_err(hw, "ixgbe_fc_rx_pause not valid in strict IEEE mode\n");
hw_err(hw, "Flow control param set incorrectly\n");
hw_err(hw, "Flow control autoneg is disabled");
hw_err(hw, "The link is down");
hw_err(hw, "ixgbe_fc_rx_pause not valid in strict IEEE mode\n");
hw_err(hw, "Flow control param set incorrectly\n");
hw_err(hw, "rx_pause not valid in strict IEEE mode\n");
static const u8 hw_err[] = { HCI_EV_HARDWARE_ERROR, 0x01, 0x00 };
skb_put_data(skb, hw_err, 3);