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

Configure Feed

Select the types of activity you want to include in your feed.

drm/amdgpu: Program ring for vce instance 1 at its register space

We need program ring buffer on instance 1 register space domain,
when only if instance 1 available, with two instances or instance 0,
and we need only program instance 0 regsiter space domain for ring.

Signed-off-by: Leo Liu <leo.liu@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Cc: stable@vger.kernel.org
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Leo Liu and committed by
Alex Deucher
1410f646 cc28c4ed

+68 -27
+68 -27
drivers/gpu/drm/amd/amdgpu/vce_v3_0.c
··· 77 77 static uint64_t vce_v3_0_ring_get_rptr(struct amdgpu_ring *ring) 78 78 { 79 79 struct amdgpu_device *adev = ring->adev; 80 + u32 v; 81 + 82 + mutex_lock(&adev->grbm_idx_mutex); 83 + if (adev->vce.harvest_config == 0 || 84 + adev->vce.harvest_config == AMDGPU_VCE_HARVEST_VCE1) 85 + WREG32(mmGRBM_GFX_INDEX, GET_VCE_INSTANCE(0)); 86 + else if (adev->vce.harvest_config == AMDGPU_VCE_HARVEST_VCE0) 87 + WREG32(mmGRBM_GFX_INDEX, GET_VCE_INSTANCE(1)); 80 88 81 89 if (ring == &adev->vce.ring[0]) 82 - return RREG32(mmVCE_RB_RPTR); 90 + v = RREG32(mmVCE_RB_RPTR); 83 91 else if (ring == &adev->vce.ring[1]) 84 - return RREG32(mmVCE_RB_RPTR2); 92 + v = RREG32(mmVCE_RB_RPTR2); 85 93 else 86 - return RREG32(mmVCE_RB_RPTR3); 94 + v = RREG32(mmVCE_RB_RPTR3); 95 + 96 + WREG32(mmGRBM_GFX_INDEX, mmGRBM_GFX_INDEX_DEFAULT); 97 + mutex_unlock(&adev->grbm_idx_mutex); 98 + 99 + return v; 87 100 } 88 101 89 102 /** ··· 109 96 static uint64_t vce_v3_0_ring_get_wptr(struct amdgpu_ring *ring) 110 97 { 111 98 struct amdgpu_device *adev = ring->adev; 99 + u32 v; 100 + 101 + mutex_lock(&adev->grbm_idx_mutex); 102 + if (adev->vce.harvest_config == 0 || 103 + adev->vce.harvest_config == AMDGPU_VCE_HARVEST_VCE1) 104 + WREG32(mmGRBM_GFX_INDEX, GET_VCE_INSTANCE(0)); 105 + else if (adev->vce.harvest_config == AMDGPU_VCE_HARVEST_VCE0) 106 + WREG32(mmGRBM_GFX_INDEX, GET_VCE_INSTANCE(1)); 112 107 113 108 if (ring == &adev->vce.ring[0]) 114 - return RREG32(mmVCE_RB_WPTR); 109 + v = RREG32(mmVCE_RB_WPTR); 115 110 else if (ring == &adev->vce.ring[1]) 116 - return RREG32(mmVCE_RB_WPTR2); 111 + v = RREG32(mmVCE_RB_WPTR2); 117 112 else 118 - return RREG32(mmVCE_RB_WPTR3); 113 + v = RREG32(mmVCE_RB_WPTR3); 114 + 115 + WREG32(mmGRBM_GFX_INDEX, mmGRBM_GFX_INDEX_DEFAULT); 116 + mutex_unlock(&adev->grbm_idx_mutex); 117 + 118 + return v; 119 119 } 120 120 121 121 /** ··· 142 116 { 143 117 struct amdgpu_device *adev = ring->adev; 144 118 119 + mutex_lock(&adev->grbm_idx_mutex); 120 + if (adev->vce.harvest_config == 0 || 121 + adev->vce.harvest_config == AMDGPU_VCE_HARVEST_VCE1) 122 + WREG32(mmGRBM_GFX_INDEX, GET_VCE_INSTANCE(0)); 123 + else if (adev->vce.harvest_config == AMDGPU_VCE_HARVEST_VCE0) 124 + WREG32(mmGRBM_GFX_INDEX, GET_VCE_INSTANCE(1)); 125 + 145 126 if (ring == &adev->vce.ring[0]) 146 127 WREG32(mmVCE_RB_WPTR, lower_32_bits(ring->wptr)); 147 128 else if (ring == &adev->vce.ring[1]) 148 129 WREG32(mmVCE_RB_WPTR2, lower_32_bits(ring->wptr)); 149 130 else 150 131 WREG32(mmVCE_RB_WPTR3, lower_32_bits(ring->wptr)); 132 + 133 + WREG32(mmGRBM_GFX_INDEX, mmGRBM_GFX_INDEX_DEFAULT); 134 + mutex_unlock(&adev->grbm_idx_mutex); 151 135 } 152 136 153 137 static void vce_v3_0_override_vce_clock_gating(struct amdgpu_device *adev, bool override) ··· 267 231 struct amdgpu_ring *ring; 268 232 int idx, r; 269 233 270 - ring = &adev->vce.ring[0]; 271 - WREG32(mmVCE_RB_RPTR, lower_32_bits(ring->wptr)); 272 - WREG32(mmVCE_RB_WPTR, lower_32_bits(ring->wptr)); 273 - WREG32(mmVCE_RB_BASE_LO, ring->gpu_addr); 274 - WREG32(mmVCE_RB_BASE_HI, upper_32_bits(ring->gpu_addr)); 275 - WREG32(mmVCE_RB_SIZE, ring->ring_size / 4); 276 - 277 - ring = &adev->vce.ring[1]; 278 - WREG32(mmVCE_RB_RPTR2, lower_32_bits(ring->wptr)); 279 - WREG32(mmVCE_RB_WPTR2, lower_32_bits(ring->wptr)); 280 - WREG32(mmVCE_RB_BASE_LO2, ring->gpu_addr); 281 - WREG32(mmVCE_RB_BASE_HI2, upper_32_bits(ring->gpu_addr)); 282 - WREG32(mmVCE_RB_SIZE2, ring->ring_size / 4); 283 - 284 - ring = &adev->vce.ring[2]; 285 - WREG32(mmVCE_RB_RPTR3, lower_32_bits(ring->wptr)); 286 - WREG32(mmVCE_RB_WPTR3, lower_32_bits(ring->wptr)); 287 - WREG32(mmVCE_RB_BASE_LO3, ring->gpu_addr); 288 - WREG32(mmVCE_RB_BASE_HI3, upper_32_bits(ring->gpu_addr)); 289 - WREG32(mmVCE_RB_SIZE3, ring->ring_size / 4); 290 - 291 234 mutex_lock(&adev->grbm_idx_mutex); 292 235 for (idx = 0; idx < 2; ++idx) { 293 236 if (adev->vce.harvest_config & (1 << idx)) 294 237 continue; 295 238 296 239 WREG32(mmGRBM_GFX_INDEX, GET_VCE_INSTANCE(idx)); 240 + 241 + /* Program instance 0 reg space for two instances or instance 0 case 242 + program instance 1 reg space for only instance 1 available case */ 243 + if (idx != 1 || adev->vce.harvest_config == AMDGPU_VCE_HARVEST_VCE0) { 244 + ring = &adev->vce.ring[0]; 245 + WREG32(mmVCE_RB_RPTR, lower_32_bits(ring->wptr)); 246 + WREG32(mmVCE_RB_WPTR, lower_32_bits(ring->wptr)); 247 + WREG32(mmVCE_RB_BASE_LO, ring->gpu_addr); 248 + WREG32(mmVCE_RB_BASE_HI, upper_32_bits(ring->gpu_addr)); 249 + WREG32(mmVCE_RB_SIZE, ring->ring_size / 4); 250 + 251 + ring = &adev->vce.ring[1]; 252 + WREG32(mmVCE_RB_RPTR2, lower_32_bits(ring->wptr)); 253 + WREG32(mmVCE_RB_WPTR2, lower_32_bits(ring->wptr)); 254 + WREG32(mmVCE_RB_BASE_LO2, ring->gpu_addr); 255 + WREG32(mmVCE_RB_BASE_HI2, upper_32_bits(ring->gpu_addr)); 256 + WREG32(mmVCE_RB_SIZE2, ring->ring_size / 4); 257 + 258 + ring = &adev->vce.ring[2]; 259 + WREG32(mmVCE_RB_RPTR3, lower_32_bits(ring->wptr)); 260 + WREG32(mmVCE_RB_WPTR3, lower_32_bits(ring->wptr)); 261 + WREG32(mmVCE_RB_BASE_LO3, ring->gpu_addr); 262 + WREG32(mmVCE_RB_BASE_HI3, upper_32_bits(ring->gpu_addr)); 263 + WREG32(mmVCE_RB_SIZE3, ring->ring_size / 4); 264 + } 265 + 297 266 vce_v3_0_mc_resume(adev, idx); 298 267 WREG32_FIELD(VCE_STATUS, JOB_BUSY, 1); 299 268