1 | // SPDX-License-Identifier: GPL-2.0+ |
2 | /* |
3 | * Copyright (C) 2023 Loongson Technology Corporation Limited |
4 | */ |
5 | |
6 | #include <drm/drm_debugfs.h> |
7 | |
8 | #include "lsdc_benchmark.h" |
9 | #include "lsdc_drv.h" |
10 | #include "lsdc_gem.h" |
11 | #include "lsdc_ttm.h" |
12 | |
13 | typedef void (*lsdc_copy_proc_t)(struct lsdc_bo *src_bo, |
14 | struct lsdc_bo *dst_bo, |
15 | unsigned int size, |
16 | int n); |
17 | |
18 | static void lsdc_copy_gtt_to_vram_cpu(struct lsdc_bo *src_bo, |
19 | struct lsdc_bo *dst_bo, |
20 | unsigned int size, |
21 | int n) |
22 | { |
23 | lsdc_bo_kmap(lbo: src_bo); |
24 | lsdc_bo_kmap(lbo: dst_bo); |
25 | |
26 | while (n--) |
27 | memcpy_toio(dst_bo->kptr, src_bo->kptr, size); |
28 | |
29 | lsdc_bo_kunmap(lbo: src_bo); |
30 | lsdc_bo_kunmap(lbo: dst_bo); |
31 | } |
32 | |
33 | static void lsdc_copy_vram_to_gtt_cpu(struct lsdc_bo *src_bo, |
34 | struct lsdc_bo *dst_bo, |
35 | unsigned int size, |
36 | int n) |
37 | { |
38 | lsdc_bo_kmap(lbo: src_bo); |
39 | lsdc_bo_kmap(lbo: dst_bo); |
40 | |
41 | while (n--) |
42 | memcpy_fromio(dst_bo->kptr, src_bo->kptr, size); |
43 | |
44 | lsdc_bo_kunmap(lbo: src_bo); |
45 | lsdc_bo_kunmap(lbo: dst_bo); |
46 | } |
47 | |
48 | static void lsdc_copy_gtt_to_gtt_cpu(struct lsdc_bo *src_bo, |
49 | struct lsdc_bo *dst_bo, |
50 | unsigned int size, |
51 | int n) |
52 | { |
53 | lsdc_bo_kmap(lbo: src_bo); |
54 | lsdc_bo_kmap(lbo: dst_bo); |
55 | |
56 | while (n--) |
57 | memcpy(dst_bo->kptr, src_bo->kptr, size); |
58 | |
59 | lsdc_bo_kunmap(lbo: src_bo); |
60 | lsdc_bo_kunmap(lbo: dst_bo); |
61 | } |
62 | |
63 | static void lsdc_benchmark_copy(struct lsdc_device *ldev, |
64 | unsigned int size, |
65 | unsigned int n, |
66 | u32 src_domain, |
67 | u32 dst_domain, |
68 | lsdc_copy_proc_t copy_proc, |
69 | struct drm_printer *p) |
70 | { |
71 | struct drm_device *ddev = &ldev->base; |
72 | struct lsdc_bo *src_bo; |
73 | struct lsdc_bo *dst_bo; |
74 | unsigned long start_jiffies; |
75 | unsigned long end_jiffies; |
76 | unsigned int throughput; |
77 | unsigned int time; |
78 | |
79 | src_bo = lsdc_bo_create_kernel_pinned(ddev, domain: src_domain, size); |
80 | dst_bo = lsdc_bo_create_kernel_pinned(ddev, domain: dst_domain, size); |
81 | |
82 | start_jiffies = jiffies; |
83 | |
84 | copy_proc(src_bo, dst_bo, size, n); |
85 | |
86 | end_jiffies = jiffies; |
87 | |
88 | lsdc_bo_free_kernel_pinned(lbo: src_bo); |
89 | lsdc_bo_free_kernel_pinned(lbo: dst_bo); |
90 | |
91 | time = jiffies_to_msecs(j: end_jiffies - start_jiffies); |
92 | |
93 | throughput = (n * (size >> 10)) / time; |
94 | |
95 | drm_printf(p, |
96 | f: "Copy bo of %uKiB %u times from %s to %s in %ums: %uMB/s\n" , |
97 | size >> 10, n, |
98 | lsdc_domain_to_str(domain: src_domain), |
99 | lsdc_domain_to_str(domain: dst_domain), |
100 | time, throughput); |
101 | } |
102 | |
103 | int lsdc_show_benchmark_copy(struct lsdc_device *ldev, struct drm_printer *p) |
104 | { |
105 | unsigned int buffer_size = 1920 * 1080 * 4; |
106 | unsigned int iteration = 60; |
107 | |
108 | lsdc_benchmark_copy(ldev, |
109 | size: buffer_size, |
110 | n: iteration, |
111 | LSDC_GEM_DOMAIN_GTT, |
112 | LSDC_GEM_DOMAIN_GTT, |
113 | copy_proc: lsdc_copy_gtt_to_gtt_cpu, |
114 | p); |
115 | |
116 | lsdc_benchmark_copy(ldev, |
117 | size: buffer_size, |
118 | n: iteration, |
119 | LSDC_GEM_DOMAIN_GTT, |
120 | LSDC_GEM_DOMAIN_VRAM, |
121 | copy_proc: lsdc_copy_gtt_to_vram_cpu, |
122 | p); |
123 | |
124 | lsdc_benchmark_copy(ldev, |
125 | size: buffer_size, |
126 | n: iteration, |
127 | LSDC_GEM_DOMAIN_VRAM, |
128 | LSDC_GEM_DOMAIN_GTT, |
129 | copy_proc: lsdc_copy_vram_to_gtt_cpu, |
130 | p); |
131 | |
132 | return 0; |
133 | } |
134 | |