diff options
| author | Mukul Joshi <mukul.joshi@amd.com> | 2025-07-23 22:34:11 -0400 |
|---|---|---|
| committer | Alex Deucher <alexander.deucher@amd.com> | 2026-01-05 16:26:15 -0500 |
| commit | 44fc86f2a338e6c202565611b9725c9428ae7481 (patch) | |
| tree | 3a3dba32439f92645c6a1d63cca4b167bf312527 /drivers/gpu | |
| parent | d3336c935ecebb0185cce50848d9fdea665085f2 (diff) | |
drm/amdgpu: Program IH_VMID_LUT_INDEX register on GFX 12.1
For querying VMID <-> PASID mapping on GFX 12.1, we need to first
program the IH_VMID_LUT_INDEX before fetching the LUT mapping. Without
this TLB flush may not work.
Signed-off-by: Mukul Joshi <mukul.joshi@amd.com>
Reviewed-by: Michael Chen <michael.chen@amd.com>
Reviewed-by: Alex Sierra <alex.sierra@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gmc_v12_1.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v12_1.c b/drivers/gpu/drm/amd/amdgpu/gmc_v12_1.c index 061d1be72340..d68e5a2377b6 100644 --- a/drivers/gpu/drm/amd/amdgpu/gmc_v12_1.c +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v12_1.c @@ -230,8 +230,18 @@ static int gmc_v12_1_process_interrupt(struct amdgpu_device *adev, } static bool gmc_v12_1_get_vmid_pasid_mapping_info(struct amdgpu_device *adev, - uint8_t vmid, uint16_t *p_pasid) + uint8_t vmid, uint8_t inst, + uint16_t *p_pasid) { + uint16_t index; + + if (inst/4) + index = 0xA + inst%4; + else + index = 0x2 + inst%4; + + WREG32(SOC15_REG_OFFSET(OSSSYS, 0, regIH_VMID_LUT_INDEX), index); + *p_pasid = RREG32(SOC15_REG_OFFSET(OSSSYS, 0, regIH_VMID_0_LUT) + vmid) & 0xffff; return !!(*p_pasid); @@ -350,7 +360,7 @@ static void gmc_v12_1_flush_gpu_tlb_pasid(struct amdgpu_device *adev, for (vmid = 1; vmid < 16; vmid++) { bool valid; - valid = gmc_v12_1_get_vmid_pasid_mapping_info(adev, vmid, + valid = gmc_v12_1_get_vmid_pasid_mapping_info(adev, vmid, inst, &queried); if (!valid || queried != pasid) continue; |
