diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_benchmark.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_benchmark.c | 244 | 
1 files changed, 130 insertions, 114 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_benchmark.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_benchmark.c index 313517f7cf10..edc6377ec5ff 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_benchmark.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_benchmark.c @@ -29,14 +29,13 @@  #define AMDGPU_BENCHMARK_COMMON_MODES_N 17  static int amdgpu_benchmark_do_move(struct amdgpu_device *adev, unsigned size, -				    uint64_t saddr, uint64_t daddr, int n) +				    uint64_t saddr, uint64_t daddr, int n, s64 *time_ms)  { -	unsigned long start_jiffies; -	unsigned long end_jiffies; +	ktime_t stime, etime;  	struct dma_fence *fence;  	int i, r; -	start_jiffies = jiffies; +	stime = ktime_get();  	for (i = 0; i < n; i++) {  		struct amdgpu_ring *ring = adev->mman.buffer_funcs_ring;  		r = amdgpu_copy_buffer(ring, saddr, daddr, size, NULL, &fence, @@ -48,120 +47,81 @@ static int amdgpu_benchmark_do_move(struct amdgpu_device *adev, unsigned size,  		if (r)  			goto exit_do_move;  	} -	end_jiffies = jiffies; -	r = jiffies_to_msecs(end_jiffies - start_jiffies);  exit_do_move: +	etime = ktime_get(); +	*time_ms = ktime_ms_delta(etime, stime); +  	return r;  } -static void amdgpu_benchmark_log_results(int n, unsigned size, -					 unsigned int time, +static void amdgpu_benchmark_log_results(struct amdgpu_device *adev, +					 int n, unsigned size, +					 s64 time_ms,  					 unsigned sdomain, unsigned ddomain,  					 char *kind)  { -	unsigned int throughput = (n * (size >> 10)) / time; -	DRM_INFO("amdgpu: %s %u bo moves of %u kB from" -		 " %d to %d in %u ms, throughput: %u Mb/s or %u MB/s\n", -		 kind, n, size >> 10, sdomain, ddomain, time, +	s64 throughput = (n * (size >> 10)); + +	throughput = div64_s64(throughput, time_ms); + +	dev_info(adev->dev, "amdgpu: %s %u bo moves of %u kB from" +		 " %d to %d in %lld ms, throughput: %lld Mb/s or %lld MB/s\n", +		 kind, n, size >> 10, sdomain, ddomain, time_ms,  		 throughput * 8, throughput);  } -static void amdgpu_benchmark_move(struct amdgpu_device *adev, unsigned size, -				  unsigned sdomain, unsigned ddomain) +static int amdgpu_benchmark_move(struct amdgpu_device *adev, unsigned size, +				 unsigned sdomain, unsigned ddomain)  {  	struct amdgpu_bo *dobj = NULL;  	struct amdgpu_bo *sobj = NULL; -	struct amdgpu_bo_param bp;  	uint64_t saddr, daddr; +	s64 time_ms;  	int r, n; -	int time; - -	memset(&bp, 0, sizeof(bp)); -	bp.size = size; -	bp.byte_align = PAGE_SIZE; -	bp.domain = sdomain; -	bp.flags = 0; -	bp.type = ttm_bo_type_kernel; -	bp.resv = NULL; -	bp.bo_ptr_size = sizeof(struct amdgpu_bo);  	n = AMDGPU_BENCHMARK_ITERATIONS; -	r = amdgpu_bo_create(adev, &bp, &sobj); -	if (r) { -		goto out_cleanup; -	} -	r = amdgpu_bo_reserve(sobj, false); -	if (unlikely(r != 0)) -		goto out_cleanup; -	r = amdgpu_bo_pin(sobj, sdomain); -	if (r) { -		amdgpu_bo_unreserve(sobj); -		goto out_cleanup; -	} -	r = amdgpu_ttm_alloc_gart(&sobj->tbo); -	amdgpu_bo_unreserve(sobj); -	if (r) { -		goto out_cleanup; -	} -	saddr = amdgpu_bo_gpu_offset(sobj); -	bp.domain = ddomain; -	r = amdgpu_bo_create(adev, &bp, &dobj); -	if (r) { -		goto out_cleanup; -	} -	r = amdgpu_bo_reserve(dobj, false); -	if (unlikely(r != 0)) -		goto out_cleanup; -	r = amdgpu_bo_pin(dobj, ddomain); -	if (r) { -		amdgpu_bo_unreserve(sobj); + +	r = amdgpu_bo_create_kernel(adev, size, +				    PAGE_SIZE, sdomain, +				    &sobj, +				    &saddr, +				    NULL); +	if (r)  		goto out_cleanup; -	} -	r = amdgpu_ttm_alloc_gart(&dobj->tbo); -	amdgpu_bo_unreserve(dobj); -	if (r) { +	r = amdgpu_bo_create_kernel(adev, size, +				    PAGE_SIZE, ddomain, +				    &dobj, +				    &daddr, +				    NULL); +	if (r)  		goto out_cleanup; -	} -	daddr = amdgpu_bo_gpu_offset(dobj);  	if (adev->mman.buffer_funcs) { -		time = amdgpu_benchmark_do_move(adev, size, saddr, daddr, n); -		if (time < 0) +		r = amdgpu_benchmark_do_move(adev, size, saddr, daddr, n, &time_ms); +		if (r)  			goto out_cleanup; -		if (time > 0) -			amdgpu_benchmark_log_results(n, size, time, +		else +			amdgpu_benchmark_log_results(adev, n, size, time_ms,  						     sdomain, ddomain, "dma");  	}  out_cleanup:  	/* Check error value now. The value can be overwritten when clean up.*/ -	if (r) { -		DRM_ERROR("Error while benchmarking BO move.\n"); -	} +	if (r < 0) +		dev_info(adev->dev, "Error while benchmarking BO move.\n"); -	if (sobj) { -		r = amdgpu_bo_reserve(sobj, true); -		if (likely(r == 0)) { -			amdgpu_bo_unpin(sobj); -			amdgpu_bo_unreserve(sobj); -		} -		amdgpu_bo_unref(&sobj); -	} -	if (dobj) { -		r = amdgpu_bo_reserve(dobj, true); -		if (likely(r == 0)) { -			amdgpu_bo_unpin(dobj); -			amdgpu_bo_unreserve(dobj); -		} -		amdgpu_bo_unref(&dobj); -	} +	if (sobj) +		amdgpu_bo_free_kernel(&sobj, &saddr, NULL); +	if (dobj) +		amdgpu_bo_free_kernel(&dobj, &daddr, NULL); +	return r;  } -void amdgpu_benchmark(struct amdgpu_device *adev, int test_number) +int amdgpu_benchmark(struct amdgpu_device *adev, int test_number)  { -	int i; +	int i, r;  	static const int common_modes[AMDGPU_BENCHMARK_COMMON_MODES_N] = {  		640 * 480 * 4,  		720 * 480 * 4, @@ -182,63 +142,119 @@ void amdgpu_benchmark(struct amdgpu_device *adev, int test_number)  		1920 * 1200 * 4  	}; +	mutex_lock(&adev->benchmark_mutex);  	switch (test_number) {  	case 1: +		dev_info(adev->dev, +			 "benchmark test: %d (simple test, VRAM to GTT and GTT to VRAM)\n", +			 test_number);  		/* simple test, VRAM to GTT and GTT to VRAM */ -		amdgpu_benchmark_move(adev, 1024*1024, AMDGPU_GEM_DOMAIN_GTT, -				      AMDGPU_GEM_DOMAIN_VRAM); -		amdgpu_benchmark_move(adev, 1024*1024, AMDGPU_GEM_DOMAIN_VRAM, -				      AMDGPU_GEM_DOMAIN_GTT); +		r = amdgpu_benchmark_move(adev, 1024*1024, AMDGPU_GEM_DOMAIN_GTT, +					  AMDGPU_GEM_DOMAIN_VRAM); +		if (r) +			goto done; +		r = amdgpu_benchmark_move(adev, 1024*1024, AMDGPU_GEM_DOMAIN_VRAM, +					  AMDGPU_GEM_DOMAIN_GTT); +		if (r) +			goto done;  		break;  	case 2: +		dev_info(adev->dev, +			 "benchmark test: %d (simple test, VRAM to VRAM)\n", +			 test_number);  		/* simple test, VRAM to VRAM */ -		amdgpu_benchmark_move(adev, 1024*1024, AMDGPU_GEM_DOMAIN_VRAM, -				      AMDGPU_GEM_DOMAIN_VRAM); +		r = amdgpu_benchmark_move(adev, 1024*1024, AMDGPU_GEM_DOMAIN_VRAM, +					  AMDGPU_GEM_DOMAIN_VRAM); +		if (r) +			goto done;  		break;  	case 3: +		dev_info(adev->dev, +			 "benchmark test: %d (GTT to VRAM, buffer size sweep, powers of 2)\n", +			 test_number);  		/* GTT to VRAM, buffer size sweep, powers of 2 */ -		for (i = 1; i <= 16384; i <<= 1) -			amdgpu_benchmark_move(adev, i * AMDGPU_GPU_PAGE_SIZE, -					      AMDGPU_GEM_DOMAIN_GTT, -					      AMDGPU_GEM_DOMAIN_VRAM); +		for (i = 1; i <= 16384; i <<= 1) { +			r = amdgpu_benchmark_move(adev, i * AMDGPU_GPU_PAGE_SIZE, +						  AMDGPU_GEM_DOMAIN_GTT, +						  AMDGPU_GEM_DOMAIN_VRAM); +			if (r) +				goto done; +		}  		break;  	case 4: +		dev_info(adev->dev, +			 "benchmark test: %d (VRAM to GTT, buffer size sweep, powers of 2)\n", +			 test_number);  		/* VRAM to GTT, buffer size sweep, powers of 2 */ -		for (i = 1; i <= 16384; i <<= 1) -			amdgpu_benchmark_move(adev, i * AMDGPU_GPU_PAGE_SIZE, -					      AMDGPU_GEM_DOMAIN_VRAM, -					      AMDGPU_GEM_DOMAIN_GTT); +		for (i = 1; i <= 16384; i <<= 1) { +			r = amdgpu_benchmark_move(adev, i * AMDGPU_GPU_PAGE_SIZE, +						  AMDGPU_GEM_DOMAIN_VRAM, +						  AMDGPU_GEM_DOMAIN_GTT); +			if (r) +				goto done; +		}  		break;  	case 5: +		dev_info(adev->dev, +			 "benchmark test: %d (VRAM to VRAM, buffer size sweep, powers of 2)\n", +			 test_number);  		/* VRAM to VRAM, buffer size sweep, powers of 2 */ -		for (i = 1; i <= 16384; i <<= 1) -			amdgpu_benchmark_move(adev, i * AMDGPU_GPU_PAGE_SIZE, -					      AMDGPU_GEM_DOMAIN_VRAM, -					      AMDGPU_GEM_DOMAIN_VRAM); +		for (i = 1; i <= 16384; i <<= 1) { +			r = amdgpu_benchmark_move(adev, i * AMDGPU_GPU_PAGE_SIZE, +						  AMDGPU_GEM_DOMAIN_VRAM, +						  AMDGPU_GEM_DOMAIN_VRAM); +			if (r) +				goto done; +		}  		break;  	case 6: +		dev_info(adev->dev, +			 "benchmark test: %d (GTT to VRAM, buffer size sweep, common modes)\n", +			 test_number);  		/* GTT to VRAM, buffer size sweep, common modes */ -		for (i = 0; i < AMDGPU_BENCHMARK_COMMON_MODES_N; i++) -			amdgpu_benchmark_move(adev, common_modes[i], -					      AMDGPU_GEM_DOMAIN_GTT, -					      AMDGPU_GEM_DOMAIN_VRAM); +		for (i = 0; i < AMDGPU_BENCHMARK_COMMON_MODES_N; i++) { +			r = amdgpu_benchmark_move(adev, common_modes[i], +						  AMDGPU_GEM_DOMAIN_GTT, +						  AMDGPU_GEM_DOMAIN_VRAM); +			if (r) +				goto done; +		}  		break;  	case 7: +		dev_info(adev->dev, +			 "benchmark test: %d (VRAM to GTT, buffer size sweep, common modes)\n", +			 test_number);  		/* VRAM to GTT, buffer size sweep, common modes */ -		for (i = 0; i < AMDGPU_BENCHMARK_COMMON_MODES_N; i++) -			amdgpu_benchmark_move(adev, common_modes[i], -					      AMDGPU_GEM_DOMAIN_VRAM, -					      AMDGPU_GEM_DOMAIN_GTT); +		for (i = 0; i < AMDGPU_BENCHMARK_COMMON_MODES_N; i++) { +			r = amdgpu_benchmark_move(adev, common_modes[i], +						  AMDGPU_GEM_DOMAIN_VRAM, +						  AMDGPU_GEM_DOMAIN_GTT); +			if (r) +				goto done; +		}  		break;  	case 8: +		dev_info(adev->dev, +			 "benchmark test: %d (VRAM to VRAM, buffer size sweep, common modes)\n", +			 test_number);  		/* VRAM to VRAM, buffer size sweep, common modes */ -		for (i = 0; i < AMDGPU_BENCHMARK_COMMON_MODES_N; i++) -			amdgpu_benchmark_move(adev, common_modes[i], +		for (i = 0; i < AMDGPU_BENCHMARK_COMMON_MODES_N; i++) { +			r = amdgpu_benchmark_move(adev, common_modes[i],  					      AMDGPU_GEM_DOMAIN_VRAM,  					      AMDGPU_GEM_DOMAIN_VRAM); +			if (r) +				goto done; +		}  		break;  	default: -		DRM_ERROR("Unknown benchmark\n"); +		dev_info(adev->dev, "Unknown benchmark %d\n", test_number); +		r = -EINVAL; +		break;  	} + +done: +	mutex_unlock(&adev->benchmark_mutex); + +	return r;  } |