Will be used for TLB invalidation.
Signed-off-by: Alex Deucher <[email protected]>
---
drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c | 49 ++++++++++++++++++++++++++
1 file changed, 49 insertions(+)
diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c
b/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c
index e112e3e2ed26b..e6a5dcc1f4c9f 100644
--- a/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c
+++ b/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c
@@ -2053,6 +2053,52 @@ static void sdma_v5_2_emit_fill_buffer(struct amdgpu_ib
*ib,
ib->ptr[ib->length_dw++] = byte_count - 1;
}
+/**
+ * sdma_v5_2_emit_tlb_inv - Invalidate TLB using the sDMA engine
+ *
+ * @adev: amdgpu device structure
+ * @ib: indirect buffer to fill
+ * @vmid: vmid to target
+ * @vmhub: vmhub to target
+ * @eng: invalidation engine to use
+ * @flush_type: type of flush (lightweight, heavyweight)
+ * @xcc_inst: XCC to target
+ *
+ * Invalidate TLB using the DMA engine.
+ */
+static void sdma_v5_2_emit_tlb_inv(struct amdgpu_device *adev,
+ struct amdgpu_ib *ib,
+ unsigned int vmid,
+ u32 vmhub,
+ u32 eng,
+ u32 flush_type,
+ u32 xcc_inst)
+{
+ struct amdgpu_vmhub *hub = &adev->vmhub[vmhub];
+ u32 inv_req = hub->vmhub_funcs->get_invalidate_req(vmid, flush_type);
+ u32 mmhub_eng, gfxhub_eng;
+
+ if (AMDGPU_IS_GFXHUB(vmhub)) {
+ mmhub_eng = 0x1f;
+ gfxhub_eng = eng;
+ } else {
+ mmhub_eng = eng;
+ gfxhub_eng = 0x1f;
+ }
+
+ /* Trigger invalidation. */
+ ib->ptr[ib->length_dw++] =
+ (SDMA_PKT_VM_INVALIDATION_HEADER_OP(SDMA_OP_POLL_REGMEM) |
+
SDMA_PKT_VM_INVALIDATION_HEADER_SUB_OP(SDMA_SUBOP_VM_INVALIDATION) |
+ SDMA_PKT_VM_INVALIDATION_HEADER_GFX_ENG_ID(gfxhub_eng) |
+ SDMA_PKT_VM_INVALIDATION_HEADER_MM_ENG_ID(mmhub_eng));
+ ib->ptr[ib->length_dw++] = inv_req;
+ ib->ptr[ib->length_dw++] = 0xFFFFFFFF;
+ ib->ptr[ib->length_dw++] =
+ (SDMA_PKT_VM_INVALIDATION_ADDRESSRANGEHI_INVALIDATEACK(1 <<
vmid) |
+ SDMA_PKT_VM_INVALIDATION_ADDRESSRANGEHI_ADDRESSRANGEHI(0x1F));
+}
+
static const struct amdgpu_buffer_funcs sdma_v5_2_buffer_funcs = {
.copy_max_bytes = 1 << 30,
.copy_num_dw = 7,
@@ -2061,6 +2107,9 @@ static const struct amdgpu_buffer_funcs
sdma_v5_2_buffer_funcs = {
.fill_max_bytes = 1 << 30, /* HW supports 1 << 30, but PAL uses 1 << 22
*/
.fill_num_dw = 5,
.emit_fill_buffer = sdma_v5_2_emit_fill_buffer,
+
+ .tlb_inv_num_dw = 4,
+ .emit_tlb_inv = sdma_v5_2_emit_tlb_inv,
};
static void sdma_v5_2_set_buffer_funcs(struct amdgpu_device *adev)
--
2.55.0