aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJames Zhu <James.Zhu@amd.com>2017-09-29 16:40:12 -0400
committerAlex Deucher <alexander.deucher@amd.com>2017-10-06 17:44:07 -0400
commit2a91f272e34c721bbb8f148c5f15a0a454dac2fd (patch)
tree038cb469bc46039188a1440c8c41353e216f8318
parentc259ee6e3058f2a1b30aac1e77d2c6e8699eccd9 (diff)
drm/amdgpu: add uvd enc ring test
Add UVD encode ring test functions. And enable UVD encode ring test during UVD encode hardware initialization. Signed-off-by: James Zhu <James.Zhu@amd.com> Reviewed-and-Tested-by: Leo Liu <leo.liu@amd.com> Reviewed-by: Christian König <christian.koenig@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r--drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c55
1 files changed, 54 insertions, 1 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c b/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c
index 5f9e9ec53b89..019aed1e6b73 100644
--- a/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c
@@ -155,6 +155,46 @@ static void uvd_v6_0_enc_ring_set_wptr(struct amdgpu_ring *ring)
155 lower_32_bits(ring->wptr)); 155 lower_32_bits(ring->wptr));
156} 156}
157 157
158/**
159 * uvd_v6_0_enc_ring_test_ring - test if UVD ENC ring is working
160 *
161 * @ring: the engine to test on
162 *
163 */
164static int uvd_v6_0_enc_ring_test_ring(struct amdgpu_ring *ring)
165{
166 struct amdgpu_device *adev = ring->adev;
167 uint32_t rptr = amdgpu_ring_get_rptr(ring);
168 unsigned i;
169 int r;
170
171 r = amdgpu_ring_alloc(ring, 16);
172 if (r) {
173 DRM_ERROR("amdgpu: uvd enc failed to lock ring %d (%d).\n",
174 ring->idx, r);
175 return r;
176 }
177 amdgpu_ring_write(ring, HEVC_ENC_CMD_END);
178 amdgpu_ring_commit(ring);
179
180 for (i = 0; i < adev->usec_timeout; i++) {
181 if (amdgpu_ring_get_rptr(ring) != rptr)
182 break;
183 DRM_UDELAY(1);
184 }
185
186 if (i < adev->usec_timeout) {
187 DRM_INFO("ring test on %d succeeded in %d usecs\n",
188 ring->idx, i);
189 } else {
190 DRM_ERROR("amdgpu: ring %d test failed\n",
191 ring->idx);
192 r = -ETIMEDOUT;
193 }
194
195 return r;
196}
197
158static int uvd_v6_0_early_init(void *handle) 198static int uvd_v6_0_early_init(void *handle)
159{ 199{
160 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 200 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
@@ -252,7 +292,7 @@ static int uvd_v6_0_hw_init(void *handle)
252 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 292 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
253 struct amdgpu_ring *ring = &adev->uvd.ring; 293 struct amdgpu_ring *ring = &adev->uvd.ring;
254 uint32_t tmp; 294 uint32_t tmp;
255 int r; 295 int i, r;
256 296
257 amdgpu_asic_set_uvd_clocks(adev, 10000, 10000); 297 amdgpu_asic_set_uvd_clocks(adev, 10000, 10000);
258 uvd_v6_0_set_clockgating_state(adev, AMD_CG_STATE_UNGATE); 298 uvd_v6_0_set_clockgating_state(adev, AMD_CG_STATE_UNGATE);
@@ -292,6 +332,18 @@ static int uvd_v6_0_hw_init(void *handle)
292 332
293 amdgpu_ring_commit(ring); 333 amdgpu_ring_commit(ring);
294 334
335 if (uvd_v6_0_enc_support(adev)) {
336 for (i = 0; i < adev->uvd.num_enc_rings; ++i) {
337 ring = &adev->uvd.ring_enc[i];
338 ring->ready = true;
339 r = amdgpu_ring_test_ring(ring);
340 if (r) {
341 ring->ready = false;
342 goto done;
343 }
344 }
345 }
346
295done: 347done:
296 if (!r) { 348 if (!r) {
297 if (uvd_v6_0_enc_support(adev)) 349 if (uvd_v6_0_enc_support(adev))
@@ -1359,6 +1411,7 @@ static const struct amdgpu_ring_funcs uvd_v6_0_enc_ring_vm_funcs = {
1359 .emit_fence = uvd_v6_0_enc_ring_emit_fence, 1411 .emit_fence = uvd_v6_0_enc_ring_emit_fence,
1360 .emit_vm_flush = uvd_v6_0_enc_ring_emit_vm_flush, 1412 .emit_vm_flush = uvd_v6_0_enc_ring_emit_vm_flush,
1361 .emit_pipeline_sync = uvd_v6_0_enc_ring_emit_pipeline_sync, 1413 .emit_pipeline_sync = uvd_v6_0_enc_ring_emit_pipeline_sync,
1414 .test_ring = uvd_v6_0_enc_ring_test_ring,
1362 .insert_nop = amdgpu_ring_insert_nop, 1415 .insert_nop = amdgpu_ring_insert_nop,
1363 .insert_end = uvd_v6_0_enc_ring_insert_end, 1416 .insert_end = uvd_v6_0_enc_ring_insert_end,
1364 .pad_ib = amdgpu_ring_generic_pad_ib, 1417 .pad_ib = amdgpu_ring_generic_pad_ib,