Add the amdgpu buffer object move speed metrics. Signed-off-by: Prike Liang <Prike.Liang@xxxxxxx> --- drivers/gpu/drm/amd/amdgpu/amdgpu.h | 2 +- drivers/gpu/drm/amd/amdgpu/amdgpu_benchmark.c | 78 ++++++++++++++----- drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c | 2 +- 3 files changed, 61 insertions(+), 21 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h index 163d221b3bbd..2840f1536b51 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h @@ -502,7 +502,7 @@ void amdgpu_device_wb_free(struct amdgpu_device *adev, u32 wb); /* * Benchmarking */ -int amdgpu_benchmark(struct amdgpu_device *adev, int test_number); +int amdgpu_benchmark(struct amdgpu_device *adev, int test_number, struct seq_file *m); int amdgpu_benchmark_dump(struct amdgpu_device *adev, struct seq_file *m); /* diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_benchmark.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_benchmark.c index f6848b574dea..fcd186ca088a 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_benchmark.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_benchmark.c @@ -65,20 +65,27 @@ static void amdgpu_benchmark_log_results(struct amdgpu_device *adev, int n, unsigned size, s64 time_ms, unsigned sdomain, unsigned ddomain, - char *kind) + char *kind, struct seq_file *m) { 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); + if (m) { + seq_printf(m, "\tamdgpu: %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); + } else { + 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 int amdgpu_benchmark_move(struct amdgpu_device *adev, unsigned size, - unsigned sdomain, unsigned ddomain) + unsigned sdomain, unsigned ddomain, struct seq_file *m) { struct amdgpu_bo *dobj = NULL; struct amdgpu_bo *sobj = NULL; @@ -109,7 +116,7 @@ static int amdgpu_benchmark_move(struct amdgpu_device *adev, unsigned size, goto out_cleanup; else amdgpu_benchmark_log_results(adev, n, size, time_ms, - sdomain, ddomain, "dma"); + sdomain, ddomain, "dma", m); } out_cleanup: @@ -124,7 +131,7 @@ static int amdgpu_benchmark_move(struct amdgpu_device *adev, unsigned size, return r; } -int amdgpu_benchmark(struct amdgpu_device *adev, int test_number) +int amdgpu_benchmark(struct amdgpu_device *adev, int test_number, struct seq_file *m) { int i, r; static const int common_modes[AMDGPU_BENCHMARK_COMMON_MODES_N] = { @@ -153,13 +160,16 @@ int amdgpu_benchmark(struct amdgpu_device *adev, int test_number) dev_info(adev->dev, "benchmark test: %d (simple test, VRAM to GTT and GTT to VRAM)\n", test_number); + if (m) + seq_printf(m, "\tbenchmark test: %d (simple test, VRAM to GTT and GTT to VRAM)\n", + test_number); /* simple test, VRAM to GTT and GTT to VRAM */ r = amdgpu_benchmark_move(adev, 1024*1024, AMDGPU_GEM_DOMAIN_GTT, - AMDGPU_GEM_DOMAIN_VRAM); + AMDGPU_GEM_DOMAIN_VRAM, m); if (r) goto done; r = amdgpu_benchmark_move(adev, 1024*1024, AMDGPU_GEM_DOMAIN_VRAM, - AMDGPU_GEM_DOMAIN_GTT); + AMDGPU_GEM_DOMAIN_GTT, m); if (r) goto done; break; @@ -167,9 +177,13 @@ int amdgpu_benchmark(struct amdgpu_device *adev, int test_number) dev_info(adev->dev, "benchmark test: %d (simple test, VRAM to VRAM)\n", test_number); + if (m) + seq_printf(m, "\tbenchmark test: %d (simple test, VRAM to VRAM)\n", + test_number); + /* simple test, VRAM to VRAM */ r = amdgpu_benchmark_move(adev, 1024*1024, AMDGPU_GEM_DOMAIN_VRAM, - AMDGPU_GEM_DOMAIN_VRAM); + AMDGPU_GEM_DOMAIN_VRAM, m); if (r) goto done; break; @@ -177,11 +191,15 @@ int amdgpu_benchmark(struct amdgpu_device *adev, int test_number) dev_info(adev->dev, "benchmark test: %d (GTT to VRAM, buffer size sweep, powers of 2)\n", test_number); + if (m) + seq_printf(m, "\tbenchmark 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) { r = amdgpu_benchmark_move(adev, i * AMDGPU_GPU_PAGE_SIZE, AMDGPU_GEM_DOMAIN_GTT, - AMDGPU_GEM_DOMAIN_VRAM); + AMDGPU_GEM_DOMAIN_VRAM, m); if (r) goto done; } @@ -190,11 +208,14 @@ int amdgpu_benchmark(struct amdgpu_device *adev, int test_number) dev_info(adev->dev, "benchmark test: %d (VRAM to GTT, buffer size sweep, powers of 2)\n", test_number); + if (m) + seq_printf(m,"\tbenchmark 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) { r = amdgpu_benchmark_move(adev, i * AMDGPU_GPU_PAGE_SIZE, AMDGPU_GEM_DOMAIN_VRAM, - AMDGPU_GEM_DOMAIN_GTT); + AMDGPU_GEM_DOMAIN_GTT, m); if (r) goto done; } @@ -203,11 +224,14 @@ int amdgpu_benchmark(struct amdgpu_device *adev, int test_number) dev_info(adev->dev, "benchmark test: %d (VRAM to VRAM, buffer size sweep, powers of 2)\n", test_number); + if (m) + seq_printf(m, "\tbenchmark 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) { r = amdgpu_benchmark_move(adev, i * AMDGPU_GPU_PAGE_SIZE, AMDGPU_GEM_DOMAIN_VRAM, - AMDGPU_GEM_DOMAIN_VRAM); + AMDGPU_GEM_DOMAIN_VRAM, m); if (r) goto done; } @@ -216,11 +240,14 @@ int amdgpu_benchmark(struct amdgpu_device *adev, int test_number) dev_info(adev->dev, "benchmark test: %d (GTT to VRAM, buffer size sweep, common modes)\n", test_number); + if (m) + seq_printf(m,"\tbenchmark 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++) { r = amdgpu_benchmark_move(adev, common_modes[i], AMDGPU_GEM_DOMAIN_GTT, - AMDGPU_GEM_DOMAIN_VRAM); + AMDGPU_GEM_DOMAIN_VRAM, m); if (r) goto done; } @@ -229,11 +256,14 @@ int amdgpu_benchmark(struct amdgpu_device *adev, int test_number) dev_info(adev->dev, "benchmark test: %d (VRAM to GTT, buffer size sweep, common modes)\n", test_number); + if (m) + seq_printf(m,"\tbenchmark 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++) { r = amdgpu_benchmark_move(adev, common_modes[i], AMDGPU_GEM_DOMAIN_VRAM, - AMDGPU_GEM_DOMAIN_GTT); + AMDGPU_GEM_DOMAIN_GTT, m); if (r) goto done; } @@ -241,12 +271,15 @@ int amdgpu_benchmark(struct amdgpu_device *adev, int test_number) case 8: dev_info(adev->dev, "benchmark test: %d (VRAM to VRAM, buffer size sweep, common modes)\n", - test_number); + test_number); + if (m) + seq_printf(m,"\tbenchmark 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++) { r = amdgpu_benchmark_move(adev, common_modes[i], AMDGPU_GEM_DOMAIN_VRAM, - AMDGPU_GEM_DOMAIN_VRAM); + AMDGPU_GEM_DOMAIN_VRAM, m); if (r) goto done; } @@ -449,7 +482,7 @@ static void amdgpu_benchmark_mem_metrics_dump(struct amdgpu_device *adev, struct &adev->mman.gtt_mgr.manager; struct ttm_resource_manager *vram_man = &adev->mman.vram_mgr.manager; - uint32_t l1_cache_size; + uint32_t l1_cache_size, j; seq_puts(m, "amdgpu benchmark mem metrics dump:\n"); @@ -483,6 +516,13 @@ static void amdgpu_benchmark_mem_metrics_dump(struct amdgpu_device *adev, struct atomic64_read(&adev->gart_pin_size)); seq_printf(m, "\tGTT heap usage size:%lld KB\n", ttm_resource_manager_usage(gtt_man)); + seq_printf(m, "\t--------amdgpu buffer object move speed test begin--------\n"); + for (j = 1; j < 8; j++) { + /*TODO: Add the cases of gfx and CPU move cases.*/ + amdgpu_benchmark(adev, j, m); + } + seq_printf(m, "\t--------amdgpu buffer object move speed test end--------\n"); + seq_printf(m, "\n"); } diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c index 7e935b9736c1..4d710c5f8465 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c @@ -1760,7 +1760,7 @@ static int amdgpu_debugfs_benchmark(void *data, u64 val) return r; } - r = amdgpu_benchmark(adev, val); + r = amdgpu_benchmark(adev, val, NULL); pm_runtime_mark_last_busy(dev->dev); pm_runtime_put_autosuspend(dev->dev); -- 2.34.1