accel/ivpu: Reorder Doorbell Unregister and Command Queue Destruction
authorKarol Wachowski <karol.wachowski@intel.com>
Thu, 15 May 2025 09:41:24 +0000 (11:41 +0200)
committerJacek Lawrynowicz <jacek.lawrynowicz@linux.intel.com>
Wed, 28 May 2025 09:49:29 +0000 (11:49 +0200)
Refactor ivpu_cmdq_unregister() to ensure the doorbell is unregistered
before destroying the command queue. The NPU firmware requires doorbells
to be unregistered prior to command queue destruction.

If doorbell remains registered when command queue destroy command is sent
firmware will automatically unregister the doorbell, making subsequent
unregister attempts no-operations (NOPs).

Ensure compliance with firmware expectations by moving the doorbell
unregister call ahead of the command queue destruction logic,
thus preventing unnecessary NOP operation.

Fixes: 465a3914b254 ("accel/ivpu: Add API for command queue create/destroy/submit")
Signed-off-by: Karol Wachowski <karol.wachowski@intel.com>
Reviewed-by: Jeff Hugo <jeff.hugo@oss.qualcomm.com>
Signed-off-by: Jacek Lawrynowicz <jacek.lawrynowicz@linux.intel.com>
Link: https://lore.kernel.org/r/20250515094124.255141-1-jacek.lawrynowicz@linux.intel.com
drivers/accel/ivpu/ivpu_job.c

index b28da35c30b6758b22fb7228481da13ead15bc07..1c8e283ad985427cf66a6018c5a112b05ed8950d 100644 (file)
@@ -247,6 +247,10 @@ static int ivpu_cmdq_unregister(struct ivpu_file_priv *file_priv, struct ivpu_cm
        if (!cmdq->db_id)
                return 0;
 
+       ret = ivpu_jsm_unregister_db(vdev, cmdq->db_id);
+       if (!ret)
+               ivpu_dbg(vdev, JOB, "DB %d unregistered\n", cmdq->db_id);
+
        if (vdev->fw->sched_mode == VPU_SCHEDULING_MODE_HW) {
                ret = ivpu_jsm_hws_destroy_cmdq(vdev, file_priv->ctx.id, cmdq->id);
                if (!ret)
@@ -254,10 +258,6 @@ static int ivpu_cmdq_unregister(struct ivpu_file_priv *file_priv, struct ivpu_cm
                                 cmdq->id, file_priv->ctx.id);
        }
 
-       ret = ivpu_jsm_unregister_db(vdev, cmdq->db_id);
-       if (!ret)
-               ivpu_dbg(vdev, JOB, "DB %d unregistered\n", cmdq->db_id);
-
        xa_erase(&file_priv->vdev->db_xa, cmdq->db_id);
        cmdq->db_id = 0;