aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm
diff options
context:
space:
mode:
authorChristian König <deathsimple@vodafone.de>2011-09-27 06:31:00 -0400
committerDave Airlie <airlied@redhat.com>2011-12-20 14:50:19 -0500
commit60a7e3964db8cd698696b27f3c720365c374905a (patch)
tree45bd23e95601c40021cc8cfe2c3981810abfb3c3 /drivers/gpu/drm
parentbf85279958da96cb4b11aac89b34f0424c3c120e (diff)
drm/radeon: Add radeon_test_syncing function v2
Tests syncing between all rings by using semaphores and fences. v2: use radeon_testing as a bit flag rather than on/off switch this allow to test for one thing at a time (bo_move or semaphore test). It kind of break the usage if user wheren't using 1 for bo move test but as it's a test feature i believe it's ok. Signed-off-by: Christian König <deathsimple@vodafone.de> Reviewed-by: Jerome Glisse <jglisse@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'drivers/gpu/drm')
-rw-r--r--drivers/gpu/drm/radeon/radeon.h4
-rw-r--r--drivers/gpu/drm/radeon/radeon_device.c5
-rw-r--r--drivers/gpu/drm/radeon/radeon_test.c88
3 files changed, 96 insertions, 1 deletions
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
index 76c58e9e4778..fbe902bc8c47 100644
--- a/drivers/gpu/drm/radeon/radeon.h
+++ b/drivers/gpu/drm/radeon/radeon.h
@@ -913,6 +913,10 @@ void radeon_benchmark(struct radeon_device *rdev, int test_number);
913 * Testing 913 * Testing
914 */ 914 */
915void radeon_test_moves(struct radeon_device *rdev); 915void radeon_test_moves(struct radeon_device *rdev);
916void radeon_test_ring_sync(struct radeon_device *rdev,
917 struct radeon_cp *cpA,
918 struct radeon_cp *cpB);
919void radeon_test_syncing(struct radeon_device *rdev);
916 920
917 921
918/* 922/*
diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c
index 023c156eddd0..fa36b5368d95 100644
--- a/drivers/gpu/drm/radeon/radeon_device.c
+++ b/drivers/gpu/drm/radeon/radeon_device.c
@@ -823,9 +823,12 @@ int radeon_device_init(struct radeon_device *rdev,
823 if (r) 823 if (r)
824 return r; 824 return r;
825 } 825 }
826 if (radeon_testing) { 826 if ((radeon_testing & 1)) {
827 radeon_test_moves(rdev); 827 radeon_test_moves(rdev);
828 } 828 }
829 if ((radeon_testing & 2)) {
830 radeon_test_syncing(rdev);
831 }
829 if (radeon_benchmarking) { 832 if (radeon_benchmarking) {
830 radeon_benchmark(rdev, radeon_benchmarking); 833 radeon_benchmark(rdev, radeon_benchmarking);
831 } 834 }
diff --git a/drivers/gpu/drm/radeon/radeon_test.c b/drivers/gpu/drm/radeon/radeon_test.c
index 160e7df77551..5f4d31ef3933 100644
--- a/drivers/gpu/drm/radeon/radeon_test.c
+++ b/drivers/gpu/drm/radeon/radeon_test.c
@@ -234,3 +234,91 @@ out_cleanup:
234 printk(KERN_WARNING "Error while testing BO move.\n"); 234 printk(KERN_WARNING "Error while testing BO move.\n");
235 } 235 }
236} 236}
237
238void radeon_test_ring_sync(struct radeon_device *rdev,
239 struct radeon_cp *cpA,
240 struct radeon_cp *cpB)
241{
242 struct radeon_fence *fence = NULL;
243 struct radeon_semaphore *semaphore = NULL;
244 int ringA = radeon_ring_index(rdev, cpA);
245 int ringB = radeon_ring_index(rdev, cpB);
246 int r;
247
248 r = radeon_fence_create(rdev, &fence, ringA);
249 if (r) {
250 DRM_ERROR("Failed to create sync fence\n");
251 goto out_cleanup;
252 }
253
254 r = radeon_semaphore_create(rdev, &semaphore);
255 if (r) {
256 DRM_ERROR("Failed to create semaphore\n");
257 goto out_cleanup;
258 }
259
260 r = radeon_ring_lock(rdev, cpA, 64);
261 if (r) {
262 DRM_ERROR("Failed to lock ring %d\n", ringA);
263 goto out_cleanup;
264 }
265 radeon_semaphore_emit_wait(rdev, ringA, semaphore);
266 radeon_fence_emit(rdev, fence);
267 radeon_ring_unlock_commit(rdev, cpA);
268
269 mdelay(1000);
270
271 if (radeon_fence_signaled(fence)) {
272 DRM_ERROR("Fence signaled without waiting for semaphore.\n");
273 goto out_cleanup;
274 }
275
276 r = radeon_ring_lock(rdev, cpB, 64);
277 if (r) {
278 DRM_ERROR("Failed to lock ring %d\n", ringB);
279 goto out_cleanup;
280 }
281 radeon_semaphore_emit_signal(rdev, ringB, semaphore);
282 radeon_ring_unlock_commit(rdev, cpB);
283
284 r = radeon_fence_wait(fence, false);
285 if (r) {
286 DRM_ERROR("Failed to wait for sync fence\n");
287 goto out_cleanup;
288 }
289
290 DRM_INFO("Syncing between rings %d and %d seems to work.\n", ringA, ringB);
291
292out_cleanup:
293 if (semaphore)
294 radeon_semaphore_free(rdev, semaphore);
295
296 if (fence)
297 radeon_fence_unref(&fence);
298
299 if (r)
300 printk(KERN_WARNING "Error while testing ring sync (%d).\n", r);
301}
302
303void radeon_test_syncing(struct radeon_device *rdev)
304{
305 int i, j;
306
307 for (i = 1; i < RADEON_NUM_RINGS; ++i) {
308 struct radeon_cp *cpA = &rdev->cp[i];
309 if (!cpA->ready)
310 continue;
311
312 for (j = 0; j < i; ++j) {
313 struct radeon_cp *cpB = &rdev->cp[j];
314 if (!cpB->ready)
315 continue;
316
317 DRM_INFO("Testing syncing between rings %d and %d\n", i, j);
318 radeon_test_ring_sync(rdev, cpA, cpB);
319
320 DRM_INFO("Testing syncing between rings %d and %d\n", j, i);
321 radeon_test_ring_sync(rdev, cpB, cpA);
322 }
323 }
324}