Add the amdgpu buffer object move speed metrics.

Signed-off-by: Prike Liang <prike.li...@amd.com>
---
 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

Reply via email to