diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/radeon_test.c')
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_test.c | 95 | 
1 files changed, 37 insertions, 58 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_test.c b/drivers/gpu/drm/radeon/radeon_test.c index efff929ea49..7c16540c10f 100644 --- a/drivers/gpu/drm/radeon/radeon_test.c +++ b/drivers/gpu/drm/radeon/radeon_test.c @@ -106,13 +106,7 @@ void radeon_test_moves(struct radeon_device *rdev)  		radeon_bo_kunmap(gtt_obj[i]); -		r = radeon_fence_create(rdev, &fence, RADEON_RING_TYPE_GFX_INDEX); -		if (r) { -			DRM_ERROR("Failed to create GTT->VRAM fence %d\n", i); -			goto out_cleanup; -		} - -		r = radeon_copy(rdev, gtt_addr, vram_addr, size / RADEON_GPU_PAGE_SIZE, fence); +		r = radeon_copy(rdev, gtt_addr, vram_addr, size / RADEON_GPU_PAGE_SIZE, &fence);  		if (r) {  			DRM_ERROR("Failed GTT->VRAM copy %d\n", i);  			goto out_cleanup; @@ -155,13 +149,7 @@ void radeon_test_moves(struct radeon_device *rdev)  		radeon_bo_kunmap(vram_obj); -		r = radeon_fence_create(rdev, &fence, RADEON_RING_TYPE_GFX_INDEX); -		if (r) { -			DRM_ERROR("Failed to create VRAM->GTT fence %d\n", i); -			goto out_cleanup; -		} - -		r = radeon_copy(rdev, vram_addr, gtt_addr, size / RADEON_GPU_PAGE_SIZE, fence); +		r = radeon_copy(rdev, vram_addr, gtt_addr, size / RADEON_GPU_PAGE_SIZE, &fence);  		if (r) {  			DRM_ERROR("Failed VRAM->GTT copy %d\n", i);  			goto out_cleanup; @@ -241,36 +229,33 @@ void radeon_test_ring_sync(struct radeon_device *rdev,  {  	struct radeon_fence *fence1 = NULL, *fence2 = NULL;  	struct radeon_semaphore *semaphore = NULL; -	int ridxA = radeon_ring_index(rdev, ringA); -	int ridxB = radeon_ring_index(rdev, ringB);  	int r; -	r = radeon_fence_create(rdev, &fence1, ridxA); +	r = radeon_semaphore_create(rdev, &semaphore);  	if (r) { -		DRM_ERROR("Failed to create sync fence 1\n"); +		DRM_ERROR("Failed to create semaphore\n");  		goto out_cleanup;  	} -	r = radeon_fence_create(rdev, &fence2, ridxA); + +	r = radeon_ring_lock(rdev, ringA, 64);  	if (r) { -		DRM_ERROR("Failed to create sync fence 2\n"); +		DRM_ERROR("Failed to lock ring A %d\n", ringA->idx);  		goto out_cleanup;  	} - -	r = radeon_semaphore_create(rdev, &semaphore); +	radeon_semaphore_emit_wait(rdev, ringA->idx, semaphore); +	r = radeon_fence_emit(rdev, &fence1, ringA->idx);  	if (r) { -		DRM_ERROR("Failed to create semaphore\n"); +		DRM_ERROR("Failed to emit fence 1\n"); +		radeon_ring_unlock_undo(rdev, ringA);  		goto out_cleanup;  	} - -	r = radeon_ring_lock(rdev, ringA, 64); +	radeon_semaphore_emit_wait(rdev, ringA->idx, semaphore); +	r = radeon_fence_emit(rdev, &fence2, ringA->idx);  	if (r) { -		DRM_ERROR("Failed to lock ring A %d\n", ridxA); +		DRM_ERROR("Failed to emit fence 2\n"); +		radeon_ring_unlock_undo(rdev, ringA);  		goto out_cleanup;  	} -	radeon_semaphore_emit_wait(rdev, ridxA, semaphore); -	radeon_fence_emit(rdev, fence1); -	radeon_semaphore_emit_wait(rdev, ridxA, semaphore); -	radeon_fence_emit(rdev, fence2);  	radeon_ring_unlock_commit(rdev, ringA);  	mdelay(1000); @@ -285,7 +270,7 @@ void radeon_test_ring_sync(struct radeon_device *rdev,  		DRM_ERROR("Failed to lock ring B %p\n", ringB);  		goto out_cleanup;  	} -	radeon_semaphore_emit_signal(rdev, ridxB, semaphore); +	radeon_semaphore_emit_signal(rdev, ringB->idx, semaphore);  	radeon_ring_unlock_commit(rdev, ringB);  	r = radeon_fence_wait(fence1, false); @@ -306,7 +291,7 @@ void radeon_test_ring_sync(struct radeon_device *rdev,  		DRM_ERROR("Failed to lock ring B %p\n", ringB);  		goto out_cleanup;  	} -	radeon_semaphore_emit_signal(rdev, ridxB, semaphore); +	radeon_semaphore_emit_signal(rdev, ringB->idx, semaphore);  	radeon_ring_unlock_commit(rdev, ringB);  	r = radeon_fence_wait(fence2, false); @@ -316,8 +301,7 @@ void radeon_test_ring_sync(struct radeon_device *rdev,  	}  out_cleanup: -	if (semaphore) -		radeon_semaphore_free(rdev, semaphore, NULL); +	radeon_semaphore_free(rdev, &semaphore, NULL);  	if (fence1)  		radeon_fence_unref(&fence1); @@ -336,23 +320,9 @@ void radeon_test_ring_sync2(struct radeon_device *rdev,  {  	struct radeon_fence *fenceA = NULL, *fenceB = NULL;  	struct radeon_semaphore *semaphore = NULL; -	int ridxA = radeon_ring_index(rdev, ringA); -	int ridxB = radeon_ring_index(rdev, ringB); -	int ridxC = radeon_ring_index(rdev, ringC);  	bool sigA, sigB;  	int i, r; -	r = radeon_fence_create(rdev, &fenceA, ridxA); -	if (r) { -		DRM_ERROR("Failed to create sync fence 1\n"); -		goto out_cleanup; -	} -	r = radeon_fence_create(rdev, &fenceB, ridxB); -	if (r) { -		DRM_ERROR("Failed to create sync fence 2\n"); -		goto out_cleanup; -	} -  	r = radeon_semaphore_create(rdev, &semaphore);  	if (r) {  		DRM_ERROR("Failed to create semaphore\n"); @@ -361,20 +331,30 @@ void radeon_test_ring_sync2(struct radeon_device *rdev,  	r = radeon_ring_lock(rdev, ringA, 64);  	if (r) { -		DRM_ERROR("Failed to lock ring A %d\n", ridxA); +		DRM_ERROR("Failed to lock ring A %d\n", ringA->idx); +		goto out_cleanup; +	} +	radeon_semaphore_emit_wait(rdev, ringA->idx, semaphore); +	r = radeon_fence_emit(rdev, &fenceA, ringA->idx); +	if (r) { +		DRM_ERROR("Failed to emit sync fence 1\n"); +		radeon_ring_unlock_undo(rdev, ringA);  		goto out_cleanup;  	} -	radeon_semaphore_emit_wait(rdev, ridxA, semaphore); -	radeon_fence_emit(rdev, fenceA);  	radeon_ring_unlock_commit(rdev, ringA);  	r = radeon_ring_lock(rdev, ringB, 64);  	if (r) { -		DRM_ERROR("Failed to lock ring B %d\n", ridxB); +		DRM_ERROR("Failed to lock ring B %d\n", ringB->idx); +		goto out_cleanup; +	} +	radeon_semaphore_emit_wait(rdev, ringB->idx, semaphore); +	r = radeon_fence_emit(rdev, &fenceB, ringB->idx); +	if (r) { +		DRM_ERROR("Failed to create sync fence 2\n"); +		radeon_ring_unlock_undo(rdev, ringB);  		goto out_cleanup;  	} -	radeon_semaphore_emit_wait(rdev, ridxB, semaphore); -	radeon_fence_emit(rdev, fenceB);  	radeon_ring_unlock_commit(rdev, ringB);  	mdelay(1000); @@ -393,7 +373,7 @@ void radeon_test_ring_sync2(struct radeon_device *rdev,  		DRM_ERROR("Failed to lock ring B %p\n", ringC);  		goto out_cleanup;  	} -	radeon_semaphore_emit_signal(rdev, ridxC, semaphore); +	radeon_semaphore_emit_signal(rdev, ringC->idx, semaphore);  	radeon_ring_unlock_commit(rdev, ringC);  	for (i = 0; i < 30; ++i) { @@ -419,7 +399,7 @@ void radeon_test_ring_sync2(struct radeon_device *rdev,  		DRM_ERROR("Failed to lock ring B %p\n", ringC);  		goto out_cleanup;  	} -	radeon_semaphore_emit_signal(rdev, ridxC, semaphore); +	radeon_semaphore_emit_signal(rdev, ringC->idx, semaphore);  	radeon_ring_unlock_commit(rdev, ringC);  	mdelay(1000); @@ -436,8 +416,7 @@ void radeon_test_ring_sync2(struct radeon_device *rdev,  	}  out_cleanup: -	if (semaphore) -		radeon_semaphore_free(rdev, semaphore, NULL); +	radeon_semaphore_free(rdev, &semaphore, NULL);  	if (fenceA)  		radeon_fence_unref(&fenceA);  |