Skip to content

Commit 1fd984f

Browse files
committed
habanalabs/gaudi: minimize number of register reads
Because the register reads might be trapped by the hypervisor in certain deployments, minimize the number of reads during runtime by moving static initializations to functions that occur during device initialization instead of context open. Signed-off-by: Oded Gabbay <[email protected]>
1 parent 09ae430 commit 1fd984f

File tree

2 files changed

+11
-9
lines changed

2 files changed

+11
-9
lines changed

drivers/misc/habanalabs/gaudi/gaudi.c

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1595,6 +1595,11 @@ static int gaudi_late_init(struct hl_device *hdev)
15951595
goto disable_pci_access;
15961596
}
15971597

1598+
/* We only support a single ASID for the user, so for the sake of optimization, just
1599+
* initialize the ASID one time during device initialization with the fixed value of 1
1600+
*/
1601+
gaudi_mmu_prepare(hdev, 1);
1602+
15981603
return 0;
15991604

16001605
disable_pci_access:
@@ -6792,6 +6797,9 @@ static void gaudi_mmu_prepare(struct hl_device *hdev, u32 asid)
67926797
asid);
67936798
}
67946799

6800+
gaudi_mmu_prepare_reg(hdev, mmPSOC_GLOBAL_CONF_TRACE_ARUSER, asid);
6801+
gaudi_mmu_prepare_reg(hdev, mmPSOC_GLOBAL_CONF_TRACE_AWUSER, asid);
6802+
67956803
hdev->asic_funcs->set_clock_gating(hdev);
67966804

67976805
mutex_unlock(&gaudi->clk_gate_mutex);
@@ -6841,7 +6849,8 @@ static int gaudi_send_job_on_qman0(struct hl_device *hdev,
68416849

68426850
dma_offset = gaudi_dma_assignment[GAUDI_PCI_DMA_1] * DMA_CORE_OFFSET;
68436851

6844-
WREG32_OR(mmDMA0_CORE_PROT + dma_offset, BIT(DMA0_CORE_PROT_VAL_SHIFT));
6852+
WREG32(mmDMA0_CORE_PROT + dma_offset,
6853+
BIT(DMA0_CORE_PROT_ERR_VAL_SHIFT) | BIT(DMA0_CORE_PROT_VAL_SHIFT));
68456854

68466855
rc = hl_hw_queue_send_cb_no_cmpl(hdev, GAUDI_QUEUE_ID_DMA_0_0,
68476856
job->job_cb_size, cb->bus_address);
@@ -6862,8 +6871,7 @@ static int gaudi_send_job_on_qman0(struct hl_device *hdev,
68626871
}
68636872

68646873
free_fence_ptr:
6865-
WREG32_AND(mmDMA0_CORE_PROT + dma_offset,
6866-
~BIT(DMA0_CORE_PROT_VAL_SHIFT));
6874+
WREG32(mmDMA0_CORE_PROT + dma_offset, BIT(DMA0_CORE_PROT_ERR_VAL_SHIFT));
68676875

68686876
hdev->asic_funcs->asic_dma_pool_free(hdev, (void *) fence_ptr,
68696877
fence_dma_addr);
@@ -8652,7 +8660,6 @@ static int gaudi_ctx_init(struct hl_ctx *ctx)
86528660
if (ctx->asid == HL_KERNEL_ASID_ID)
86538661
return 0;
86548662

8655-
gaudi_mmu_prepare(ctx->hdev, ctx->asid);
86568663
return gaudi_internal_cb_pool_init(ctx->hdev, ctx);
86578664
}
86588665

drivers/misc/habanalabs/gaudi/gaudi_coresight.c

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -622,11 +622,6 @@ static int gaudi_config_etr(struct hl_device *hdev,
622622
return -EINVAL;
623623
}
624624

625-
gaudi_mmu_prepare_reg(hdev, mmPSOC_GLOBAL_CONF_TRACE_ARUSER,
626-
hdev->compute_ctx->asid);
627-
gaudi_mmu_prepare_reg(hdev, mmPSOC_GLOBAL_CONF_TRACE_AWUSER,
628-
hdev->compute_ctx->asid);
629-
630625
msb = upper_32_bits(input->buffer_address) >> 8;
631626
msb &= PSOC_GLOBAL_CONF_TRACE_ADDR_MSB_MASK;
632627
WREG32(mmPSOC_GLOBAL_CONF_TRACE_ADDR, msb);

0 commit comments

Comments
 (0)