diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/radeon_test.c')
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_test.c | 72 | 
1 files changed, 50 insertions, 22 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_test.c b/drivers/gpu/drm/radeon/radeon_test.c index fda09c9ea68..bbed4af8d0b 100644 --- a/drivers/gpu/drm/radeon/radeon_test.c +++ b/drivers/gpu/drm/radeon/radeon_test.c @@ -252,6 +252,36 @@ void radeon_test_moves(struct radeon_device *rdev)  		radeon_do_test_moves(rdev, RADEON_TEST_COPY_BLIT);  } +static int radeon_test_create_and_emit_fence(struct radeon_device *rdev, +					     struct radeon_ring *ring, +					     struct radeon_fence **fence) +{ +	int r; + +	if (ring->idx == R600_RING_TYPE_UVD_INDEX) { +		r = radeon_uvd_get_create_msg(rdev, ring->idx, 1, NULL); +		if (r) { +			DRM_ERROR("Failed to get dummy create msg\n"); +			return r; +		} + +		r = radeon_uvd_get_destroy_msg(rdev, ring->idx, 1, fence); +		if (r) { +			DRM_ERROR("Failed to get dummy destroy msg\n"); +			return r; +		} +	} else { +		r = radeon_ring_lock(rdev, ring, 64); +		if (r) { +			DRM_ERROR("Failed to lock ring A %d\n", ring->idx); +			return r; +		} +		radeon_fence_emit(rdev, fence, ring->idx); +		radeon_ring_unlock_commit(rdev, ring); +	} +	return 0; +} +  void radeon_test_ring_sync(struct radeon_device *rdev,  			   struct radeon_ring *ringA,  			   struct radeon_ring *ringB) @@ -272,21 +302,24 @@ void radeon_test_ring_sync(struct radeon_device *rdev,  		goto out_cleanup;  	}  	radeon_semaphore_emit_wait(rdev, ringA->idx, semaphore); -	r = radeon_fence_emit(rdev, &fence1, ringA->idx); -	if (r) { -		DRM_ERROR("Failed to emit fence 1\n"); -		radeon_ring_unlock_undo(rdev, ringA); +	radeon_ring_unlock_commit(rdev, ringA); + +	r = radeon_test_create_and_emit_fence(rdev, ringA, &fence1); +	if (r)  		goto out_cleanup; -	} -	radeon_semaphore_emit_wait(rdev, ringA->idx, semaphore); -	r = radeon_fence_emit(rdev, &fence2, ringA->idx); + +	r = radeon_ring_lock(rdev, ringA, 64);  	if (r) { -		DRM_ERROR("Failed to emit fence 2\n"); -		radeon_ring_unlock_undo(rdev, ringA); +		DRM_ERROR("Failed to lock ring A %d\n", ringA->idx);  		goto out_cleanup;  	} +	radeon_semaphore_emit_wait(rdev, ringA->idx, semaphore);  	radeon_ring_unlock_commit(rdev, ringA); +	r = radeon_test_create_and_emit_fence(rdev, ringA, &fence2); +	if (r) +		goto out_cleanup; +  	mdelay(1000);  	if (radeon_fence_signaled(fence1)) { @@ -364,27 +397,22 @@ static void radeon_test_ring_sync2(struct radeon_device *rdev,  		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_ring_unlock_commit(rdev, ringA); +	r = radeon_test_create_and_emit_fence(rdev, ringA, &fenceA); +	if (r) +		goto out_cleanup; +  	r = radeon_ring_lock(rdev, ringB, 64);  	if (r) {  		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_ring_unlock_commit(rdev, ringB); +	r = radeon_test_create_and_emit_fence(rdev, ringB, &fenceB); +	if (r) +		goto out_cleanup;  	mdelay(1000); @@ -393,7 +421,7 @@ static void radeon_test_ring_sync2(struct radeon_device *rdev,  		goto out_cleanup;  	}  	if (radeon_fence_signaled(fenceB)) { -		DRM_ERROR("Fence A signaled without waiting for semaphore.\n"); +		DRM_ERROR("Fence B signaled without waiting for semaphore.\n");  		goto out_cleanup;  	}  |