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