]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
accel/habanalabs: fix events mask of decoder abnormal interrupts
authorTomer Tayar <ttayar@habana.ai>
Sun, 26 Mar 2023 21:08:45 +0000 (00:08 +0300)
committerOded Gabbay <ogabbay@kernel.org>
Sat, 8 Apr 2023 07:39:34 +0000 (10:39 +0300)
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: Tomer Tayar <ttayar@habana.ai>
Reviewed-by: Oded Gabbay <ogabbay@kernel.org>
Signed-off-by: Oded Gabbay <ogabbay@kernel.org>
drivers/accel/habanalabs/common/decoder.c

index 59a1ecb20c0433ce485241a48e1b73b4ab90d6c4..c03a6da45d002e6d8747dd3633fbff03c932c217 100644 (file)
@@ -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_device *hdev = dec->hdev;
+       u32 irq_status, event_mask = 0;
        bool reset_required = false;
-       u32 irq_status, event_mask;
 
        irq_status = RREG32(dec->base_addr + VCMD_IRQ_STATUS_OFFSET);
 
@@ -64,17 +64,21 @@ static void dec_abnrm_intr_work(struct work_struct *work)
 
        if (irq_status & VCMD_IRQ_STATUS_TIMEOUT_MASK) {
                reset_required = true;
-               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;
+               event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_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) {
                event_mask |= HL_NOTIFIER_EVENT_DEVICE_RESET;
                hl_device_cond_reset(hdev, 0, event_mask);
-       } else {
+       } else if (event_mask) {
                hl_notifier_event_send_all(hdev, event_mask);
        }
 }