diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/radeon_test.c')
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_test.c | 43 | 
1 files changed, 39 insertions, 4 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_test.c b/drivers/gpu/drm/radeon/radeon_test.c index f4d6bcee900..3a13e0d1055 100644 --- a/drivers/gpu/drm/radeon/radeon_test.c +++ b/drivers/gpu/drm/radeon/radeon_test.c @@ -36,8 +36,8 @@ static void radeon_do_test_moves(struct radeon_device *rdev, int flag)  	struct radeon_bo *vram_obj = NULL;  	struct radeon_bo **gtt_obj = NULL;  	uint64_t gtt_addr, vram_addr; -	unsigned i, n, size; -	int r, ring; +	unsigned n, size; +	int i, r, ring;  	switch (flag) {  	case RADEON_TEST_COPY_DMA: @@ -257,20 +257,36 @@ static int radeon_test_create_and_emit_fence(struct radeon_device *rdev,  					     struct radeon_ring *ring,  					     struct radeon_fence **fence)  { +	uint32_t handle = ring->idx ^ 0xdeafbeef;  	int r;  	if (ring->idx == R600_RING_TYPE_UVD_INDEX) { -		r = radeon_uvd_get_create_msg(rdev, ring->idx, 1, NULL); +		r = radeon_uvd_get_create_msg(rdev, ring->idx, handle, 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); +		r = radeon_uvd_get_destroy_msg(rdev, ring->idx, handle, fence);  		if (r) {  			DRM_ERROR("Failed to get dummy destroy msg\n");  			return r;  		} + +	} else if (ring->idx == TN_RING_TYPE_VCE1_INDEX || +		   ring->idx == TN_RING_TYPE_VCE2_INDEX) { +		r = radeon_vce_get_create_msg(rdev, ring->idx, handle, NULL); +		if (r) { +			DRM_ERROR("Failed to get dummy create msg\n"); +			return r; +		} + +		r = radeon_vce_get_destroy_msg(rdev, ring->idx, handle, fence); +		if (r) { +			DRM_ERROR("Failed to get dummy destroy msg\n"); +			return r; +		} +  	} else {  		r = radeon_ring_lock(rdev, ring, 64);  		if (r) { @@ -486,6 +502,16 @@ out_cleanup:  		printk(KERN_WARNING "Error while testing ring sync (%d).\n", r);  } +static bool radeon_test_sync_possible(struct radeon_ring *ringA, +				      struct radeon_ring *ringB) +{ +	if (ringA->idx == TN_RING_TYPE_VCE2_INDEX && +	    ringB->idx == TN_RING_TYPE_VCE1_INDEX) +		return false; + +	return true; +} +  void radeon_test_syncing(struct radeon_device *rdev)  {  	int i, j, k; @@ -500,6 +526,9 @@ void radeon_test_syncing(struct radeon_device *rdev)  			if (!ringB->ready)  				continue; +			if (!radeon_test_sync_possible(ringA, ringB)) +				continue; +  			DRM_INFO("Testing syncing between rings %d and %d...\n", i, j);  			radeon_test_ring_sync(rdev, ringA, ringB); @@ -511,6 +540,12 @@ void radeon_test_syncing(struct radeon_device *rdev)  				if (!ringC->ready)  					continue; +				if (!radeon_test_sync_possible(ringA, ringC)) +					continue; + +				if (!radeon_test_sync_possible(ringB, ringC)) +					continue; +  				DRM_INFO("Testing syncing between rings %d, %d and %d...\n", i, j, k);  				radeon_test_ring_sync2(rdev, ringA, ringB, ringC);  | 
