diff options
author | Dave Airlie <airlied@redhat.com> | 2017-05-31 22:07:18 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2017-05-31 22:07:18 -0400 |
commit | 8ef6fcc8eebbea8c90735ef362b96bf1cafcd45f (patch) | |
tree | 0dabb137dff929cb82de6fdd81f0d5f5cfd1063a | |
parent | 58b58f6ef582426710724a2b01ac230a0d542b5f (diff) | |
parent | 45cc6586b7a73e84a8806881122b6ec306cdc9e7 (diff) |
Merge branch 'drm-fixes-4.12' of git://people.freedesktop.org/~agd5f/linux into drm-fixes
* 'drm-fixes-4.12' of git://people.freedesktop.org/~agd5f/linux:
drm/amdgpu: Program ring for vce instance 1 at its register space
-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 | ||