diff options
author | Christian König <deathsimple@vodafone.de> | 2011-09-27 06:31:00 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2011-12-20 14:50:19 -0500 |
commit | 60a7e3964db8cd698696b27f3c720365c374905a (patch) | |
tree | 45bd23e95601c40021cc8cfe2c3981810abfb3c3 /drivers/gpu/drm | |
parent | bf85279958da96cb4b11aac89b34f0424c3c120e (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.h | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_device.c | 5 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_test.c | 88 |
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 | */ |
915 | void radeon_test_moves(struct radeon_device *rdev); | 915 | void radeon_test_moves(struct radeon_device *rdev); |
916 | void radeon_test_ring_sync(struct radeon_device *rdev, | ||
917 | struct radeon_cp *cpA, | ||
918 | struct radeon_cp *cpB); | ||
919 | void 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 | |||
238 | void 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 | |||
292 | out_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 | |||
303 | void 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 | } | ||