[PATCH 11/30] drm/amdgpu/sdma5.0: add tlb invalidation buffer func callback
Alex Deucher <[email protected]>
| Newsgroups | org.freedesktop.lists.amd-gfx |
|---|---|
| Message-ID | <[email protected]> |
Will be used for TLB invalidation. Signed-off-by: Alex Deucher <[email protected]> --- drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c | 49 ++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c b/drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c index 97fee70dc2f64..8cb579ecf522e 100644 --- a/drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c @@ -2030,6 +2030,52 @@ static void sdma_v5_0_emit_fill_buffer(struct amdgpu_ib *ib, ib->ptr[ib->length_dw++] = byte_count - 1; } +/** + * sdma_v5_0_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_0_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_0_buffer_funcs = { .copy_max_bytes = 0x400000, .copy_num_dw = 7, @@ -2038,6 +2084,9 @@ static const struct amdgpu_buffer_funcs sdma_v5_0_buffer_funcs = { .fill_max_bytes = 0x400000, .fill_num_dw = 5, .emit_fill_buffer = sdma_v5_0_emit_fill_buffer, + + .tlb_inv_num_dw = 4, + .emit_tlb_inv = sdma_v5_0_emit_tlb_inv, }; static void sdma_v5_0_set_buffer_funcs(struct amdgpu_device *adev) -- 2.55.0