Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/amdgpu: Program GC registers through RLCG interface in gfx_v11/gmc_v11

[Why]
L1 blocks most of GC registers accessing by MMIO.

[How]
Use RLCG interface to program GC registers under SRIOV VF in full access time.

Signed-off-by: Yifan Zha <Yifan.Zha@amd.com>
Reviewed-by: Hawking Zhang <Hawking.Zhang@amd.com>
Acked-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Yifan Zha and committed by
Alex Deucher
97a3d609 e688ba3e

+13 -9
+1 -1
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v11.c
··· 111 111 112 112 lock_srbm(adev, mec, pipe, 0, 0); 113 113 114 - WREG32(SOC15_REG_OFFSET(GC, 0, regCPC_INT_CNTL), 114 + WREG32_SOC15(GC, 0, regCPC_INT_CNTL, 115 115 CP_INT_CNTL_RING0__TIME_STAMP_INT_ENABLE_MASK | 116 116 CP_INT_CNTL_RING0__OPCODE_ERROR_INT_ENABLE_MASK); 117 117
+1 -1
drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c
··· 1571 1571 WREG32_SOC15(GC, 0, regSH_MEM_BASES, sh_mem_bases); 1572 1572 1573 1573 /* Enable trap for each kfd vmid. */ 1574 - data = RREG32(SOC15_REG_OFFSET(GC, 0, regSPI_GDBG_PER_VMID_CNTL)); 1574 + data = RREG32_SOC15(GC, 0, regSPI_GDBG_PER_VMID_CNTL); 1575 1575 data = REG_SET_FIELD(data, SPI_GDBG_PER_VMID_CNTL, TRAP_EN, 1); 1576 1576 } 1577 1577 soc21_grbm_select(adev, 0, 0, 0, 0);
+11 -7
drivers/gpu/drm/amd/amdgpu/gmc_v11_0.c
··· 186 186 /* Use register 17 for GART */ 187 187 const unsigned eng = 17; 188 188 unsigned int i; 189 + unsigned char hub_ip = 0; 190 + 191 + hub_ip = (vmhub == AMDGPU_GFXHUB_0) ? 192 + GC_HWIP : MMHUB_HWIP; 189 193 190 194 spin_lock(&adev->gmc.invalidate_lock); 191 195 /* ··· 203 199 if (use_semaphore) { 204 200 for (i = 0; i < adev->usec_timeout; i++) { 205 201 /* a read return value of 1 means semaphore acuqire */ 206 - tmp = RREG32_NO_KIQ(hub->vm_inv_eng0_sem + 207 - hub->eng_distance * eng); 202 + tmp = RREG32_RLC_NO_KIQ(hub->vm_inv_eng0_sem + 203 + hub->eng_distance * eng, hub_ip); 208 204 if (tmp & 0x1) 209 205 break; 210 206 udelay(1); ··· 214 210 DRM_ERROR("Timeout waiting for sem acquire in VM flush!\n"); 215 211 } 216 212 217 - WREG32_NO_KIQ(hub->vm_inv_eng0_req + hub->eng_distance * eng, inv_req); 213 + WREG32_RLC_NO_KIQ(hub->vm_inv_eng0_req + hub->eng_distance * eng, inv_req, hub_ip); 218 214 219 215 /* Wait for ACK with a delay.*/ 220 216 for (i = 0; i < adev->usec_timeout; i++) { 221 - tmp = RREG32_NO_KIQ(hub->vm_inv_eng0_ack + 222 - hub->eng_distance * eng); 217 + tmp = RREG32_RLC_NO_KIQ(hub->vm_inv_eng0_ack + 218 + hub->eng_distance * eng, hub_ip); 223 219 tmp &= 1 << vmid; 224 220 if (tmp) 225 221 break; ··· 233 229 * add semaphore release after invalidation, 234 230 * write with 0 means semaphore release 235 231 */ 236 - WREG32_NO_KIQ(hub->vm_inv_eng0_sem + 237 - hub->eng_distance * eng, 0); 232 + WREG32_RLC_NO_KIQ(hub->vm_inv_eng0_sem + 233 + hub->eng_distance * eng, 0, hub_ip); 238 234 239 235 /* Issue additional private vm invalidation to MMHUB */ 240 236 if ((vmhub != AMDGPU_GFXHUB_0) &&