]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
accel/habanalabs: dump the EQ entries headers on EQ heartbeat failure
authorTomer Tayar <ttayar@habana.ai>
Tue, 16 Apr 2024 16:01:42 +0000 (19:01 +0300)
committerOfir Bitton <obitton@habana.ai>
Sun, 23 Jun 2024 06:53:32 +0000 (09:53 +0300)
Add a dump of the EQ entries headers upon a EQ heartbeat failure.

Signed-off-by: Tomer Tayar <ttayar@habana.ai>
Reviewed-by: Ofir Bitton <obitton@habana.ai>
Signed-off-by: Ofir Bitton <obitton@habana.ai>
drivers/accel/habanalabs/common/device.c
drivers/accel/habanalabs/common/habanalabs.h
drivers/accel/habanalabs/common/irq.c
include/linux/habanalabs/cpucp_if.h

index 3efc26dd9497127fd51339534d679fdbd4bc905d..7bd7c2eb5dd2a12eaebb45a2a9fa4a31578a1b85 100644 (file)
@@ -1082,6 +1082,8 @@ static bool hl_device_eq_heartbeat_received(struct hl_device *hdev)
                        atomic_read(&hdev->kernel_queues[cpu_q_id].ci),
                        atomic_read(&hdev->kernel_queues[cpu_q_id].ci) & pq_pi_mask);
 
+               hl_eq_dump(hdev, &hdev->event_queue);
+
                return false;
        }
 
index f4ac5e9b197450de1b9d95b9e177e106394310b2..ce78b331e2447c7bc397ae23977d12fc5d791279 100644 (file)
@@ -3754,6 +3754,7 @@ int hl_eq_init(struct hl_device *hdev, struct hl_eq *q);
 void hl_eq_fini(struct hl_device *hdev, struct hl_eq *q);
 void hl_cq_reset(struct hl_device *hdev, struct hl_cq *q);
 void hl_eq_reset(struct hl_device *hdev, struct hl_eq *q);
+void hl_eq_dump(struct hl_device *hdev, struct hl_eq *q);
 irqreturn_t hl_irq_handler_cq(int irq, void *arg);
 irqreturn_t hl_irq_handler_eq(int irq, void *arg);
 irqreturn_t hl_irq_handler_dec_abnrm(int irq, void *arg);
index 2caf2df4de08bec0296ce1a6e171a21e7d9a0326..7c9f2f6a2870a0132bdd53a7ab1ad3e080b7da9e 100644 (file)
@@ -697,3 +697,28 @@ void hl_eq_reset(struct hl_device *hdev, struct hl_eq *q)
 
        memset(q->kernel_address, 0, q->size);
 }
+
+void hl_eq_dump(struct hl_device *hdev, struct hl_eq *q)
+{
+       u32 eq_length, eqe_size, ctl, ready, mode, type, index;
+       struct hl_eq_header *hdr;
+       u8 *ptr;
+       int i;
+
+       eq_length = HL_EQ_LENGTH;
+       eqe_size = q->size / HL_EQ_LENGTH;
+
+       dev_info(hdev->dev, "Contents of EQ entries headers:\n");
+
+       for (i = 0, ptr = q->kernel_address ; i < eq_length ; ++i, ptr += eqe_size) {
+               hdr = (struct hl_eq_header *) ptr;
+               ctl = le32_to_cpu(hdr->ctl);
+               ready = FIELD_GET(EQ_CTL_READY_MASK, ctl);
+               mode = FIELD_GET(EQ_CTL_EVENT_MODE_MASK, ctl);
+               type = FIELD_GET(EQ_CTL_EVENT_TYPE_MASK, ctl);
+               index = FIELD_GET(EQ_CTL_INDEX_MASK, ctl);
+
+               dev_info(hdev->dev, "%02u: %#010x [ready: %u, mode %u, type %04u, index %05u]\n",
+                               i, ctl, ready, mode, type, index);
+       }
+}
index 1ed17887f1a884a709250af78d020eef56dae184..7ed3fdd55dda531efa5d9607560e320b78eeaa34 100644 (file)
@@ -397,6 +397,9 @@ struct hl_eq_entry {
 #define EQ_CTL_READY_SHIFT             31
 #define EQ_CTL_READY_MASK              0x80000000
 
+#define EQ_CTL_EVENT_MODE_SHIFT                28
+#define EQ_CTL_EVENT_MODE_MASK         0x70000000
+
 #define EQ_CTL_EVENT_TYPE_SHIFT                16
 #define EQ_CTL_EVENT_TYPE_MASK         0x0FFF0000