Commit d4801c04 authored by Tomer Tayar's avatar Tomer Tayar Committed by Oded Gabbay

accel/habanalabs: fix events mask of decoder abnormal interrupts

The decoder IRQ status register may have several set bits upon an
abnormal interrupt. Therefore, when setting the events mask, need to
check all bits and not using if-else.
Signed-off-by: default avatarTomer Tayar <ttayar@habana.ai>
Reviewed-by: default avatarOded Gabbay <ogabbay@kernel.org>
Signed-off-by: default avatarOded Gabbay <ogabbay@kernel.org>
parent 9cf56f0d
...@@ -47,8 +47,8 @@ static void dec_abnrm_intr_work(struct work_struct *work) ...@@ -47,8 +47,8 @@ static void dec_abnrm_intr_work(struct work_struct *work)
{ {
struct hl_dec *dec = container_of(work, struct hl_dec, abnrm_intr_work); struct hl_dec *dec = container_of(work, struct hl_dec, abnrm_intr_work);
struct hl_device *hdev = dec->hdev; struct hl_device *hdev = dec->hdev;
u32 irq_status, event_mask = 0;
bool reset_required = false; bool reset_required = false;
u32 irq_status, event_mask;
irq_status = RREG32(dec->base_addr + VCMD_IRQ_STATUS_OFFSET); irq_status = RREG32(dec->base_addr + VCMD_IRQ_STATUS_OFFSET);
...@@ -64,17 +64,21 @@ static void dec_abnrm_intr_work(struct work_struct *work) ...@@ -64,17 +64,21 @@ static void dec_abnrm_intr_work(struct work_struct *work)
if (irq_status & VCMD_IRQ_STATUS_TIMEOUT_MASK) { if (irq_status & VCMD_IRQ_STATUS_TIMEOUT_MASK) {
reset_required = true; reset_required = true;
event_mask = HL_NOTIFIER_EVENT_GENERAL_HW_ERR; event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;
} else if (irq_status & VCMD_IRQ_STATUS_CMDERR_MASK) {
event_mask = HL_NOTIFIER_EVENT_UNDEFINED_OPCODE;
} else {
event_mask = HL_NOTIFIER_EVENT_USER_ENGINE_ERR;
} }
if (irq_status & VCMD_IRQ_STATUS_CMDERR_MASK)
event_mask |= HL_NOTIFIER_EVENT_UNDEFINED_OPCODE;
if (irq_status & (VCMD_IRQ_STATUS_ENDCMD_MASK |
VCMD_IRQ_STATUS_BUSERR_MASK |
VCMD_IRQ_STATUS_ABORT_MASK))
event_mask |= HL_NOTIFIER_EVENT_USER_ENGINE_ERR;
if (reset_required) { if (reset_required) {
event_mask |= HL_NOTIFIER_EVENT_DEVICE_RESET; event_mask |= HL_NOTIFIER_EVENT_DEVICE_RESET;
hl_device_cond_reset(hdev, 0, event_mask); hl_device_cond_reset(hdev, 0, event_mask);
} else { } else if (event_mask) {
hl_notifier_event_send_all(hdev, event_mask); hl_notifier_event_send_all(hdev, event_mask);
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment