diff options
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/vce_v3_0.c | 95 |
1 files changed, 68 insertions, 27 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c b/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c index fb0819359909..90332f55cfba 100644 --- a/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c +++ b/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c | |||
| @@ -77,13 +77,26 @@ static int vce_v3_0_set_clockgating_state(void *handle, | |||
| 77 | static uint64_t vce_v3_0_ring_get_rptr(struct amdgpu_ring *ring) | 77 | static uint64_t vce_v3_0_ring_get_rptr(struct amdgpu_ring *ring) |
| 78 | { | 78 | { |
| 79 | struct amdgpu_device *adev = ring->adev; | 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 | if (ring == &adev->vce.ring[0]) | 89 | if (ring == &adev->vce.ring[0]) |
| 82 | return RREG32(mmVCE_RB_RPTR); | 90 | v = RREG32(mmVCE_RB_RPTR); |
| 83 | else if (ring == &adev->vce.ring[1]) | 91 | else if (ring == &adev->vce.ring[1]) |
| 84 | return RREG32(mmVCE_RB_RPTR2); | 92 | v = RREG32(mmVCE_RB_RPTR2); |
| 85 | else | 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 | /** |
| @@ -96,13 +109,26 @@ static uint64_t vce_v3_0_ring_get_rptr(struct amdgpu_ring *ring) | |||
| 96 | static uint64_t vce_v3_0_ring_get_wptr(struct amdgpu_ring *ring) | 109 | static uint64_t vce_v3_0_ring_get_wptr(struct amdgpu_ring *ring) |
| 97 | { | 110 | { |
| 98 | struct amdgpu_device *adev = ring->adev; | 111 | struct amdgpu_device *adev = ring->adev; |
| 112 | u32 v; | ||
| 113 | |||
| 114 | mutex_lock(&adev->grbm_idx_mutex); | ||
| 115 | if (adev->vce.harvest_config == 0 || | ||
| 116 | adev->vce.harvest_config == AMDGPU_VCE_HARVEST_VCE1) | ||
| 117 | WREG32(mmGRBM_GFX_INDEX, GET_VCE_INSTANCE(0)); | ||
| 118 | else if (adev->vce.harvest_config == AMDGPU_VCE_HARVEST_VCE0) | ||
| 119 | WREG32(mmGRBM_GFX_INDEX, GET_VCE_INSTANCE(1)); | ||
| 99 | 120 | ||
| 100 | if (ring == &adev->vce.ring[0]) | 121 | if (ring == &adev->vce.ring[0]) |
| 101 | return RREG32(mmVCE_RB_WPTR); | 122 | v = RREG32(mmVCE_RB_WPTR); |
| 102 | else if (ring == &adev->vce.ring[1]) | 123 | else if (ring == &adev->vce.ring[1]) |
| 103 | return RREG32(mmVCE_RB_WPTR2); | 124 | v = RREG32(mmVCE_RB_WPTR2); |
| 104 | else | 125 | else |
| 105 | return RREG32(mmVCE_RB_WPTR3); | 126 | v = RREG32(mmVCE_RB_WPTR3); |
| 127 | |||
| 128 | WREG32(mmGRBM_GFX_INDEX, mmGRBM_GFX_INDEX_DEFAULT); | ||
| 129 | mutex_unlock(&adev->grbm_idx_mutex); | ||
| 130 | |||
| 131 | return v; | ||
| 106 | } | 132 | } |
| 107 | 133 | ||
| 108 | /** | 134 | /** |
| @@ -116,12 +142,22 @@ static void vce_v3_0_ring_set_wptr(struct amdgpu_ring *ring) | |||
| 116 | { | 142 | { |
| 117 | struct amdgpu_device *adev = ring->adev; | 143 | struct amdgpu_device *adev = ring->adev; |
| 118 | 144 | ||
| 145 | mutex_lock(&adev->grbm_idx_mutex); | ||
| 146 | if (adev->vce.harvest_config == 0 || | ||
| 147 | adev->vce.harvest_config == AMDGPU_VCE_HARVEST_VCE1) | ||
| 148 | WREG32(mmGRBM_GFX_INDEX, GET_VCE_INSTANCE(0)); | ||
| 149 | else if (adev->vce.harvest_config == AMDGPU_VCE_HARVEST_VCE0) | ||
| 150 | WREG32(mmGRBM_GFX_INDEX, GET_VCE_INSTANCE(1)); | ||
| 151 | |||
| 119 | if (ring == &adev->vce.ring[0]) | 152 | if (ring == &adev->vce.ring[0]) |
| 120 | WREG32(mmVCE_RB_WPTR, lower_32_bits(ring->wptr)); | 153 | WREG32(mmVCE_RB_WPTR, lower_32_bits(ring->wptr)); |
| 121 | else if (ring == &adev->vce.ring[1]) | 154 | else if (ring == &adev->vce.ring[1]) |
| 122 | WREG32(mmVCE_RB_WPTR2, lower_32_bits(ring->wptr)); | 155 | WREG32(mmVCE_RB_WPTR2, lower_32_bits(ring->wptr)); |
| 123 | else | 156 | else |
| 124 | WREG32(mmVCE_RB_WPTR3, lower_32_bits(ring->wptr)); | 157 | WREG32(mmVCE_RB_WPTR3, lower_32_bits(ring->wptr)); |
| 158 | |||
| 159 | WREG32(mmGRBM_GFX_INDEX, mmGRBM_GFX_INDEX_DEFAULT); | ||
| 160 | mutex_unlock(&adev->grbm_idx_mutex); | ||
| 125 | } | 161 | } |
| 126 | 162 | ||
| 127 | static void vce_v3_0_override_vce_clock_gating(struct amdgpu_device *adev, bool override) | 163 | static void vce_v3_0_override_vce_clock_gating(struct amdgpu_device *adev, bool override) |
| @@ -231,33 +267,38 @@ static int vce_v3_0_start(struct amdgpu_device *adev) | |||
| 231 | struct amdgpu_ring *ring; | 267 | struct amdgpu_ring *ring; |
| 232 | int idx, r; | 268 | int idx, r; |
| 233 | 269 | ||
| 234 | ring = &adev->vce.ring[0]; | ||
| 235 | WREG32(mmVCE_RB_RPTR, lower_32_bits(ring->wptr)); | ||
| 236 | WREG32(mmVCE_RB_WPTR, lower_32_bits(ring->wptr)); | ||
| 237 | WREG32(mmVCE_RB_BASE_LO, ring->gpu_addr); | ||
| 238 | WREG32(mmVCE_RB_BASE_HI, upper_32_bits(ring->gpu_addr)); | ||
| 239 | WREG32(mmVCE_RB_SIZE, ring->ring_size / 4); | ||
| 240 | |||
| 241 | ring = &adev->vce.ring[1]; | ||
| 242 | WREG32(mmVCE_RB_RPTR2, lower_32_bits(ring->wptr)); | ||
| 243 | WREG32(mmVCE_RB_WPTR2, lower_32_bits(ring->wptr)); | ||
| 244 | WREG32(mmVCE_RB_BASE_LO2, ring->gpu_addr); | ||
| 245 | WREG32(mmVCE_RB_BASE_HI2, upper_32_bits(ring->gpu_addr)); | ||
| 246 | WREG32(mmVCE_RB_SIZE2, ring->ring_size / 4); | ||
| 247 | |||
| 248 | ring = &adev->vce.ring[2]; | ||
| 249 | WREG32(mmVCE_RB_RPTR3, lower_32_bits(ring->wptr)); | ||
| 250 | WREG32(mmVCE_RB_WPTR3, lower_32_bits(ring->wptr)); | ||
| 251 | WREG32(mmVCE_RB_BASE_LO3, ring->gpu_addr); | ||
| 252 | WREG32(mmVCE_RB_BASE_HI3, upper_32_bits(ring->gpu_addr)); | ||
| 253 | WREG32(mmVCE_RB_SIZE3, ring->ring_size / 4); | ||
| 254 | |||
| 255 | mutex_lock(&adev->grbm_idx_mutex); | 270 | mutex_lock(&adev->grbm_idx_mutex); |
| 256 | for (idx = 0; idx < 2; ++idx) { | 271 | for (idx = 0; idx < 2; ++idx) { |
| 257 | if (adev->vce.harvest_config & (1 << idx)) | 272 | if (adev->vce.harvest_config & (1 << idx)) |
| 258 | continue; | 273 | continue; |
| 259 | 274 | ||
| 260 | WREG32(mmGRBM_GFX_INDEX, GET_VCE_INSTANCE(idx)); | 275 | WREG32(mmGRBM_GFX_INDEX, GET_VCE_INSTANCE(idx)); |
| 276 | |||
| 277 | /* Program instance 0 reg space for two instances or instance 0 case | ||
| 278 | program instance 1 reg space for only instance 1 available case */ | ||
| 279 | if (idx != 1 || adev->vce.harvest_config == AMDGPU_VCE_HARVEST_VCE0) { | ||
| 280 | ring = &adev->vce.ring[0]; | ||
| 281 | WREG32(mmVCE_RB_RPTR, lower_32_bits(ring->wptr)); | ||
| 282 | WREG32(mmVCE_RB_WPTR, lower_32_bits(ring->wptr)); | ||
| 283 | WREG32(mmVCE_RB_BASE_LO, ring->gpu_addr); | ||
| 284 | WREG32(mmVCE_RB_BASE_HI, upper_32_bits(ring->gpu_addr)); | ||
| 285 | WREG32(mmVCE_RB_SIZE, ring->ring_size / 4); | ||
| 286 | |||
| 287 | ring = &adev->vce.ring[1]; | ||
| 288 | WREG32(mmVCE_RB_RPTR2, lower_32_bits(ring->wptr)); | ||
| 289 | WREG32(mmVCE_RB_WPTR2, lower_32_bits(ring->wptr)); | ||
| 290 | WREG32(mmVCE_RB_BASE_LO2, ring->gpu_addr); | ||
| 291 | WREG32(mmVCE_RB_BASE_HI2, upper_32_bits(ring->gpu_addr)); | ||
| 292 | WREG32(mmVCE_RB_SIZE2, ring->ring_size / 4); | ||
| 293 | |||
| 294 | ring = &adev->vce.ring[2]; | ||
| 295 | WREG32(mmVCE_RB_RPTR3, lower_32_bits(ring->wptr)); | ||
| 296 | WREG32(mmVCE_RB_WPTR3, lower_32_bits(ring->wptr)); | ||
| 297 | WREG32(mmVCE_RB_BASE_LO3, ring->gpu_addr); | ||
| 298 | WREG32(mmVCE_RB_BASE_HI3, upper_32_bits(ring->gpu_addr)); | ||
| 299 | WREG32(mmVCE_RB_SIZE3, ring->ring_size / 4); | ||
| 300 | } | ||
| 301 | |||
| 261 | vce_v3_0_mc_resume(adev, idx); | 302 | vce_v3_0_mc_resume(adev, idx); |
| 262 | WREG32_FIELD(VCE_STATUS, JOB_BUSY, 1); | 303 | WREG32_FIELD(VCE_STATUS, JOB_BUSY, 1); |
| 263 | 304 | ||
