habanalabs/gaudi: fix debugfs dma channel selection
authorGuy Zadicario <gzadicario@habana.ai>
Tue, 12 Oct 2021 07:30:28 +0000 (10:30 +0300)
committerOded Gabbay <ogabbay@kernel.org>
Sun, 26 Dec 2021 06:59:03 +0000 (08:59 +0200)
Do not use a dma channel for debugfs requested transfer if it's
QM is not idle.

Signed-off-by: Guy Zadicario <gzadicario@habana.ai>
Reviewed-by: Oded Gabbay <ogabbay@kernel.org>
Signed-off-by: Oded Gabbay <ogabbay@kernel.org>
drivers/misc/habanalabs/gaudi/gaudi.c

index d2b7ecb..92d55a0 100644 (file)
@@ -6430,6 +6430,7 @@ static int gaudi_debugfs_read_dma(struct hl_device *hdev, u64 addr, u32 size,
 {
        u32 dma_core_sts0, err_cause, cfg1, size_left, pos, size_to_dma;
        struct gaudi_device *gaudi = hdev->asic_specific;
+       u32 qm_glbl_sts0, qm_cgm_sts;
        u64 dma_offset, qm_offset;
        dma_addr_t dma_addr;
        void *kernel_addr;
@@ -6454,14 +6455,20 @@ static int gaudi_debugfs_read_dma(struct hl_device *hdev, u64 addr, u32 size,
        dma_offset = dma_id * DMA_CORE_OFFSET;
        qm_offset = dma_id * DMA_QMAN_OFFSET;
        dma_core_sts0 = RREG32(mmDMA0_CORE_STS0 + dma_offset);
-       is_eng_idle = IS_DMA_IDLE(dma_core_sts0);
+       qm_glbl_sts0 = RREG32(mmDMA0_QM_GLBL_STS0 + qm_offset);
+       qm_cgm_sts = RREG32(mmDMA0_QM_CGM_STS + qm_offset);
+       is_eng_idle = IS_QM_IDLE(qm_glbl_sts0, qm_cgm_sts) &&
+                     IS_DMA_IDLE(dma_core_sts0);
 
        if (!is_eng_idle) {
                dma_id = gaudi_dma_assignment[GAUDI_PCI_DMA_2];
                dma_offset = dma_id * DMA_CORE_OFFSET;
                qm_offset = dma_id * DMA_QMAN_OFFSET;
                dma_core_sts0 = RREG32(mmDMA0_CORE_STS0 + dma_offset);
-               is_eng_idle = IS_DMA_IDLE(dma_core_sts0);
+               qm_glbl_sts0 = RREG32(mmDMA0_QM_GLBL_STS0 + qm_offset);
+               qm_cgm_sts = RREG32(mmDMA0_QM_CGM_STS + qm_offset);
+               is_eng_idle = IS_QM_IDLE(qm_glbl_sts0, qm_cgm_sts) &&
+                             IS_DMA_IDLE(dma_core_sts0);
 
                if (!is_eng_idle) {
                        dev_err_ratelimited(hdev->dev,