xref: /aosp_15_r20/external/igt-gpu-tools/tests/i915/gem_gtt_speed.c (revision d83cc019efdc2edc6c4b16e9034a3ceb8d35d77c)
1*d83cc019SAndroid Build Coastguard Worker /*
2*d83cc019SAndroid Build Coastguard Worker  * Copyright © 2010 Intel Corporation
3*d83cc019SAndroid Build Coastguard Worker  *
4*d83cc019SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a
5*d83cc019SAndroid Build Coastguard Worker  * copy of this software and associated documentation files (the "Software"),
6*d83cc019SAndroid Build Coastguard Worker  * to deal in the Software without restriction, including without limitation
7*d83cc019SAndroid Build Coastguard Worker  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*d83cc019SAndroid Build Coastguard Worker  * and/or sell copies of the Software, and to permit persons to whom the
9*d83cc019SAndroid Build Coastguard Worker  * Software is furnished to do so, subject to the following conditions:
10*d83cc019SAndroid Build Coastguard Worker  *
11*d83cc019SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice (including the next
12*d83cc019SAndroid Build Coastguard Worker  * paragraph) shall be included in all copies or substantial portions of the
13*d83cc019SAndroid Build Coastguard Worker  * Software.
14*d83cc019SAndroid Build Coastguard Worker  *
15*d83cc019SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*d83cc019SAndroid Build Coastguard Worker  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*d83cc019SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18*d83cc019SAndroid Build Coastguard Worker  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19*d83cc019SAndroid Build Coastguard Worker  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20*d83cc019SAndroid Build Coastguard Worker  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21*d83cc019SAndroid Build Coastguard Worker  * IN THE SOFTWARE.
22*d83cc019SAndroid Build Coastguard Worker  *
23*d83cc019SAndroid Build Coastguard Worker  * Authors:
24*d83cc019SAndroid Build Coastguard Worker  *    Eric Anholt <[email protected]>
25*d83cc019SAndroid Build Coastguard Worker  *    Chris Wilson <[email protected]>
26*d83cc019SAndroid Build Coastguard Worker  *
27*d83cc019SAndroid Build Coastguard Worker  */
28*d83cc019SAndroid Build Coastguard Worker 
29*d83cc019SAndroid Build Coastguard Worker #include "igt.h"
30*d83cc019SAndroid Build Coastguard Worker #include "igt_x86.h"
31*d83cc019SAndroid Build Coastguard Worker #include <unistd.h>
32*d83cc019SAndroid Build Coastguard Worker #include <stdlib.h>
33*d83cc019SAndroid Build Coastguard Worker #include <stdint.h>
34*d83cc019SAndroid Build Coastguard Worker #include <stdio.h>
35*d83cc019SAndroid Build Coastguard Worker #include <string.h>
36*d83cc019SAndroid Build Coastguard Worker #include <fcntl.h>
37*d83cc019SAndroid Build Coastguard Worker #include <inttypes.h>
38*d83cc019SAndroid Build Coastguard Worker #include <errno.h>
39*d83cc019SAndroid Build Coastguard Worker #include <sys/stat.h>
40*d83cc019SAndroid Build Coastguard Worker #include <sys/ioctl.h>
41*d83cc019SAndroid Build Coastguard Worker #include <sys/time.h>
42*d83cc019SAndroid Build Coastguard Worker #include "drm.h"
43*d83cc019SAndroid Build Coastguard Worker 
44*d83cc019SAndroid Build Coastguard Worker #define OBJECT_SIZE 16384
45*d83cc019SAndroid Build Coastguard Worker 
elapsed(const struct timeval * start,const struct timeval * end,int loop)46*d83cc019SAndroid Build Coastguard Worker static double elapsed(const struct timeval *start,
47*d83cc019SAndroid Build Coastguard Worker 		      const struct timeval *end,
48*d83cc019SAndroid Build Coastguard Worker 		      int loop)
49*d83cc019SAndroid Build Coastguard Worker {
50*d83cc019SAndroid Build Coastguard Worker 	return (1e6*(end->tv_sec - start->tv_sec) + (end->tv_usec - start->tv_usec))/loop;
51*d83cc019SAndroid Build Coastguard Worker }
52*d83cc019SAndroid Build Coastguard Worker 
53*d83cc019SAndroid Build Coastguard Worker #if defined(__x86_64__) && !defined(__clang__)
54*d83cc019SAndroid Build Coastguard Worker #pragma GCC push_options
55*d83cc019SAndroid Build Coastguard Worker #pragma GCC target("sse4.1")
56*d83cc019SAndroid Build Coastguard Worker #include <smmintrin.h>
57*d83cc019SAndroid Build Coastguard Worker __attribute__((noinline))
streaming_load(void * src,int len)58*d83cc019SAndroid Build Coastguard Worker static void streaming_load(void *src, int len)
59*d83cc019SAndroid Build Coastguard Worker {
60*d83cc019SAndroid Build Coastguard Worker 	__m128i tmp, *s = src;
61*d83cc019SAndroid Build Coastguard Worker 
62*d83cc019SAndroid Build Coastguard Worker 	igt_assert((len & 15) == 0);
63*d83cc019SAndroid Build Coastguard Worker 	igt_assert((((uintptr_t)src) & 15) == 0);
64*d83cc019SAndroid Build Coastguard Worker 
65*d83cc019SAndroid Build Coastguard Worker 	while (len >= 16) {
66*d83cc019SAndroid Build Coastguard Worker 		tmp += _mm_stream_load_si128(s++);
67*d83cc019SAndroid Build Coastguard Worker 		len -= 16;
68*d83cc019SAndroid Build Coastguard Worker 
69*d83cc019SAndroid Build Coastguard Worker 	}
70*d83cc019SAndroid Build Coastguard Worker 
71*d83cc019SAndroid Build Coastguard Worker 	*(volatile __m128i *)src = tmp;
72*d83cc019SAndroid Build Coastguard Worker }
x86_64_features(void)73*d83cc019SAndroid Build Coastguard Worker static inline unsigned x86_64_features(void)
74*d83cc019SAndroid Build Coastguard Worker {
75*d83cc019SAndroid Build Coastguard Worker 	return igt_x86_features();
76*d83cc019SAndroid Build Coastguard Worker }
77*d83cc019SAndroid Build Coastguard Worker #pragma GCC pop_options
78*d83cc019SAndroid Build Coastguard Worker #else
x86_64_features(void)79*d83cc019SAndroid Build Coastguard Worker static inline unsigned x86_64_features(void)
80*d83cc019SAndroid Build Coastguard Worker {
81*d83cc019SAndroid Build Coastguard Worker 	return 0;
82*d83cc019SAndroid Build Coastguard Worker }
streaming_load(void * src,int len)83*d83cc019SAndroid Build Coastguard Worker static void streaming_load(void *src, int len)
84*d83cc019SAndroid Build Coastguard Worker {
85*d83cc019SAndroid Build Coastguard Worker 	igt_assert(!"reached");
86*d83cc019SAndroid Build Coastguard Worker }
87*d83cc019SAndroid Build Coastguard Worker #endif
88*d83cc019SAndroid Build Coastguard Worker 
89*d83cc019SAndroid Build Coastguard Worker int size = OBJECT_SIZE;
90*d83cc019SAndroid Build Coastguard Worker 
opt_handler(int opt,int opt_index,void * data)91*d83cc019SAndroid Build Coastguard Worker static int opt_handler(int opt, int opt_index, void *data)
92*d83cc019SAndroid Build Coastguard Worker {
93*d83cc019SAndroid Build Coastguard Worker 	switch (opt) {
94*d83cc019SAndroid Build Coastguard Worker 	case 's':
95*d83cc019SAndroid Build Coastguard Worker 		size = atoi(optarg);
96*d83cc019SAndroid Build Coastguard Worker 		break;
97*d83cc019SAndroid Build Coastguard Worker 	default:
98*d83cc019SAndroid Build Coastguard Worker 		return IGT_OPT_HANDLER_ERROR;
99*d83cc019SAndroid Build Coastguard Worker 	}
100*d83cc019SAndroid Build Coastguard Worker 
101*d83cc019SAndroid Build Coastguard Worker 	return IGT_OPT_HANDLER_SUCCESS;
102*d83cc019SAndroid Build Coastguard Worker }
103*d83cc019SAndroid Build Coastguard Worker 
104*d83cc019SAndroid Build Coastguard Worker const char *help_str = "  -s\tObject size in bytes\n";
105*d83cc019SAndroid Build Coastguard Worker 
106*d83cc019SAndroid Build Coastguard Worker igt_simple_main_args("s:", NULL, help_str, opt_handler, NULL)
107*d83cc019SAndroid Build Coastguard Worker {
108*d83cc019SAndroid Build Coastguard Worker 	struct timeval start, end;
109*d83cc019SAndroid Build Coastguard Worker 	uint8_t *buf;
110*d83cc019SAndroid Build Coastguard Worker 	uint32_t handle;
111*d83cc019SAndroid Build Coastguard Worker 	unsigned cpu = x86_64_features();
112*d83cc019SAndroid Build Coastguard Worker 	int loop, i, tiling;
113*d83cc019SAndroid Build Coastguard Worker 	int fd;
114*d83cc019SAndroid Build Coastguard Worker 
115*d83cc019SAndroid Build Coastguard Worker 	igt_skip_on_simulation();
116*d83cc019SAndroid Build Coastguard Worker 
117*d83cc019SAndroid Build Coastguard Worker 	igt_assert_f(size != 0, "Invalid object size specified\n");
118*d83cc019SAndroid Build Coastguard Worker 
119*d83cc019SAndroid Build Coastguard Worker 	if (cpu) {
120*d83cc019SAndroid Build Coastguard Worker 		char str[1024];
121*d83cc019SAndroid Build Coastguard Worker 		igt_info("Detected cpu faatures: %s\n",
122*d83cc019SAndroid Build Coastguard Worker 			 igt_x86_features_to_string(cpu, str));
123*d83cc019SAndroid Build Coastguard Worker 	}
124*d83cc019SAndroid Build Coastguard Worker 
125*d83cc019SAndroid Build Coastguard Worker 	buf = malloc(size);
126*d83cc019SAndroid Build Coastguard Worker 	memset(buf, 0, size);
127*d83cc019SAndroid Build Coastguard Worker 	fd = drm_open_driver(DRIVER_INTEL);
128*d83cc019SAndroid Build Coastguard Worker 
129*d83cc019SAndroid Build Coastguard Worker 	handle = gem_create(fd, size);
130*d83cc019SAndroid Build Coastguard Worker 	igt_assert(handle);
131*d83cc019SAndroid Build Coastguard Worker 
132*d83cc019SAndroid Build Coastguard Worker 	for (tiling = I915_TILING_NONE; tiling <= I915_TILING_Y; tiling++) {
133*d83cc019SAndroid Build Coastguard Worker 		if (tiling != I915_TILING_NONE) {
134*d83cc019SAndroid Build Coastguard Worker 			igt_info("\nSetting tiling mode to %s\n",
135*d83cc019SAndroid Build Coastguard Worker 				 tiling == I915_TILING_X ? "X" : "Y");
136*d83cc019SAndroid Build Coastguard Worker 			gem_set_tiling(fd, handle, tiling, 512);
137*d83cc019SAndroid Build Coastguard Worker 		}
138*d83cc019SAndroid Build Coastguard Worker 
139*d83cc019SAndroid Build Coastguard Worker 		if (tiling == I915_TILING_NONE) {
140*d83cc019SAndroid Build Coastguard Worker 			gem_set_domain(fd, handle,
141*d83cc019SAndroid Build Coastguard Worker 				       I915_GEM_DOMAIN_CPU,
142*d83cc019SAndroid Build Coastguard Worker 				       I915_GEM_DOMAIN_CPU);
143*d83cc019SAndroid Build Coastguard Worker 
144*d83cc019SAndroid Build Coastguard Worker 			{
145*d83cc019SAndroid Build Coastguard Worker 				uint32_t *base = gem_mmap__cpu(fd, handle, 0, size, PROT_READ | PROT_WRITE);
146*d83cc019SAndroid Build Coastguard Worker 				volatile uint32_t *ptr = base;
147*d83cc019SAndroid Build Coastguard Worker 				int x = 0;
148*d83cc019SAndroid Build Coastguard Worker 
149*d83cc019SAndroid Build Coastguard Worker 				for (i = 0; i < size/sizeof(*ptr); i++)
150*d83cc019SAndroid Build Coastguard Worker 					x += ptr[i];
151*d83cc019SAndroid Build Coastguard Worker 
152*d83cc019SAndroid Build Coastguard Worker 				/* force overly clever gcc to actually compute x */
153*d83cc019SAndroid Build Coastguard Worker 				ptr[0] = x;
154*d83cc019SAndroid Build Coastguard Worker 
155*d83cc019SAndroid Build Coastguard Worker 				munmap(base, size);
156*d83cc019SAndroid Build Coastguard Worker 
157*d83cc019SAndroid Build Coastguard Worker 				/* mmap read */
158*d83cc019SAndroid Build Coastguard Worker 				gettimeofday(&start, NULL);
159*d83cc019SAndroid Build Coastguard Worker 				for (loop = 0; loop < 1000; loop++) {
160*d83cc019SAndroid Build Coastguard Worker 					base = gem_mmap__cpu(fd, handle, 0,
161*d83cc019SAndroid Build Coastguard Worker 							     size,
162*d83cc019SAndroid Build Coastguard Worker 							     PROT_READ | PROT_WRITE);
163*d83cc019SAndroid Build Coastguard Worker 					ptr = base;
164*d83cc019SAndroid Build Coastguard Worker 					x = 0;
165*d83cc019SAndroid Build Coastguard Worker 
166*d83cc019SAndroid Build Coastguard Worker 					for (i = 0; i < size/sizeof(*ptr); i++)
167*d83cc019SAndroid Build Coastguard Worker 						x += ptr[i];
168*d83cc019SAndroid Build Coastguard Worker 
169*d83cc019SAndroid Build Coastguard Worker 					/* force overly clever gcc to actually compute x */
170*d83cc019SAndroid Build Coastguard Worker 					ptr[0] = x;
171*d83cc019SAndroid Build Coastguard Worker 
172*d83cc019SAndroid Build Coastguard Worker 					munmap(base, size);
173*d83cc019SAndroid Build Coastguard Worker 				}
174*d83cc019SAndroid Build Coastguard Worker 				gettimeofday(&end, NULL);
175*d83cc019SAndroid Build Coastguard Worker 				igt_info("Time to read %dk through a CPU map:		%7.3fµs\n",
176*d83cc019SAndroid Build Coastguard Worker 					 size/1024, elapsed(&start, &end, loop));
177*d83cc019SAndroid Build Coastguard Worker 				{
178*d83cc019SAndroid Build Coastguard Worker 					base = gem_mmap__cpu(fd, handle, 0,
179*d83cc019SAndroid Build Coastguard Worker 							     size,
180*d83cc019SAndroid Build Coastguard Worker 							     PROT_READ | PROT_WRITE);
181*d83cc019SAndroid Build Coastguard Worker 					gettimeofday(&start, NULL);
182*d83cc019SAndroid Build Coastguard Worker 					for (loop = 0; loop < 1000; loop++) {
183*d83cc019SAndroid Build Coastguard Worker 						ptr = base;
184*d83cc019SAndroid Build Coastguard Worker 						x = 0;
185*d83cc019SAndroid Build Coastguard Worker 
186*d83cc019SAndroid Build Coastguard Worker 						for (i = 0; i < size/sizeof(*ptr); i++)
187*d83cc019SAndroid Build Coastguard Worker 							x += ptr[i];
188*d83cc019SAndroid Build Coastguard Worker 
189*d83cc019SAndroid Build Coastguard Worker 						/* force overly clever gcc to actually compute x */
190*d83cc019SAndroid Build Coastguard Worker 						ptr[0] = x;
191*d83cc019SAndroid Build Coastguard Worker 
192*d83cc019SAndroid Build Coastguard Worker 					}
193*d83cc019SAndroid Build Coastguard Worker 					gettimeofday(&end, NULL);
194*d83cc019SAndroid Build Coastguard Worker 					munmap(base, size);
195*d83cc019SAndroid Build Coastguard Worker 					igt_info("Time to read %dk through a cached CPU map:	%7.3fµs\n",
196*d83cc019SAndroid Build Coastguard Worker 						 size/1024, elapsed(&start, &end, loop));
197*d83cc019SAndroid Build Coastguard Worker 				}
198*d83cc019SAndroid Build Coastguard Worker 
199*d83cc019SAndroid Build Coastguard Worker 				/* mmap write */
200*d83cc019SAndroid Build Coastguard Worker 				gettimeofday(&start, NULL);
201*d83cc019SAndroid Build Coastguard Worker 				for (loop = 0; loop < 1000; loop++) {
202*d83cc019SAndroid Build Coastguard Worker 					base = gem_mmap__cpu(fd, handle, 0,
203*d83cc019SAndroid Build Coastguard Worker 							     size,
204*d83cc019SAndroid Build Coastguard Worker 							     PROT_READ | PROT_WRITE);
205*d83cc019SAndroid Build Coastguard Worker 					ptr = base;
206*d83cc019SAndroid Build Coastguard Worker 
207*d83cc019SAndroid Build Coastguard Worker 					for (i = 0; i < size/sizeof(*ptr); i++)
208*d83cc019SAndroid Build Coastguard Worker 						ptr[i] = i;
209*d83cc019SAndroid Build Coastguard Worker 
210*d83cc019SAndroid Build Coastguard Worker 					munmap(base, size);
211*d83cc019SAndroid Build Coastguard Worker 				}
212*d83cc019SAndroid Build Coastguard Worker 				gettimeofday(&end, NULL);
213*d83cc019SAndroid Build Coastguard Worker 				igt_info("Time to write %dk through a CPU map:		%7.3fµs\n",
214*d83cc019SAndroid Build Coastguard Worker 					 size/1024, elapsed(&start, &end, loop));
215*d83cc019SAndroid Build Coastguard Worker 
216*d83cc019SAndroid Build Coastguard Worker 				gettimeofday(&start, NULL);
217*d83cc019SAndroid Build Coastguard Worker 				for (loop = 0; loop < 1000; loop++) {
218*d83cc019SAndroid Build Coastguard Worker 					base = gem_mmap__cpu(fd, handle, 0,
219*d83cc019SAndroid Build Coastguard Worker 							     size,
220*d83cc019SAndroid Build Coastguard Worker 							     PROT_READ | PROT_WRITE);
221*d83cc019SAndroid Build Coastguard Worker 					memset(base, 0, size);
222*d83cc019SAndroid Build Coastguard Worker 					munmap(base, size);
223*d83cc019SAndroid Build Coastguard Worker 				}
224*d83cc019SAndroid Build Coastguard Worker 				gettimeofday(&end, NULL);
225*d83cc019SAndroid Build Coastguard Worker 				igt_info("Time to clear %dk through a CPU map:		%7.3fµs\n",
226*d83cc019SAndroid Build Coastguard Worker 					 size/1024, elapsed(&start, &end, loop));
227*d83cc019SAndroid Build Coastguard Worker 
228*d83cc019SAndroid Build Coastguard Worker 				gettimeofday(&start, NULL);
229*d83cc019SAndroid Build Coastguard Worker 				base = gem_mmap__cpu(fd, handle, 0, size,
230*d83cc019SAndroid Build Coastguard Worker 						     PROT_READ | PROT_WRITE);
231*d83cc019SAndroid Build Coastguard Worker 				for (loop = 0; loop < 1000; loop++)
232*d83cc019SAndroid Build Coastguard Worker 					memset(base, 0, size);
233*d83cc019SAndroid Build Coastguard Worker 				munmap(base, size);
234*d83cc019SAndroid Build Coastguard Worker 				gettimeofday(&end, NULL);
235*d83cc019SAndroid Build Coastguard Worker 				igt_info("Time to clear %dk through a cached CPU map:	%7.3fµs\n",
236*d83cc019SAndroid Build Coastguard Worker 					 size/1024, elapsed(&start, &end, loop));
237*d83cc019SAndroid Build Coastguard Worker 			}
238*d83cc019SAndroid Build Coastguard Worker 
239*d83cc019SAndroid Build Coastguard Worker 			/* CPU pwrite */
240*d83cc019SAndroid Build Coastguard Worker 			gettimeofday(&start, NULL);
241*d83cc019SAndroid Build Coastguard Worker 			for (loop = 0; loop < 1000; loop++)
242*d83cc019SAndroid Build Coastguard Worker 				gem_write(fd, handle, 0, buf, size);
243*d83cc019SAndroid Build Coastguard Worker 			gettimeofday(&end, NULL);
244*d83cc019SAndroid Build Coastguard Worker 			igt_info("Time to pwrite %dk through the CPU:		%7.3fµs\n",
245*d83cc019SAndroid Build Coastguard Worker 				 size/1024, elapsed(&start, &end, loop));
246*d83cc019SAndroid Build Coastguard Worker 
247*d83cc019SAndroid Build Coastguard Worker 			/* CPU pread */
248*d83cc019SAndroid Build Coastguard Worker 			gettimeofday(&start, NULL);
249*d83cc019SAndroid Build Coastguard Worker 			for (loop = 0; loop < 1000; loop++)
250*d83cc019SAndroid Build Coastguard Worker 				gem_read(fd, handle, 0, buf, size);
251*d83cc019SAndroid Build Coastguard Worker 			gettimeofday(&end, NULL);
252*d83cc019SAndroid Build Coastguard Worker 			igt_info("Time to pread %dk through the CPU:		%7.3fµs\n",
253*d83cc019SAndroid Build Coastguard Worker 				 size/1024, elapsed(&start, &end, loop));
254*d83cc019SAndroid Build Coastguard Worker 		}
255*d83cc019SAndroid Build Coastguard Worker 
256*d83cc019SAndroid Build Coastguard Worker 		/* prefault into gtt */
257*d83cc019SAndroid Build Coastguard Worker 		{
258*d83cc019SAndroid Build Coastguard Worker 			uint32_t *base = gem_mmap__gtt(fd, handle, size, PROT_READ | PROT_WRITE);
259*d83cc019SAndroid Build Coastguard Worker 			volatile uint32_t *ptr = base;
260*d83cc019SAndroid Build Coastguard Worker 			int x = 0;
261*d83cc019SAndroid Build Coastguard Worker 
262*d83cc019SAndroid Build Coastguard Worker 			for (i = 0; i < size/sizeof(*ptr); i++)
263*d83cc019SAndroid Build Coastguard Worker 				x += ptr[i];
264*d83cc019SAndroid Build Coastguard Worker 
265*d83cc019SAndroid Build Coastguard Worker 			/* force overly clever gcc to actually compute x */
266*d83cc019SAndroid Build Coastguard Worker 			ptr[0] = x;
267*d83cc019SAndroid Build Coastguard Worker 
268*d83cc019SAndroid Build Coastguard Worker 			munmap(base, size);
269*d83cc019SAndroid Build Coastguard Worker 		}
270*d83cc019SAndroid Build Coastguard Worker 		/* mmap read */
271*d83cc019SAndroid Build Coastguard Worker 		gettimeofday(&start, NULL);
272*d83cc019SAndroid Build Coastguard Worker 		for (loop = 0; loop < 1000; loop++) {
273*d83cc019SAndroid Build Coastguard Worker 			uint32_t *base = gem_mmap__gtt(fd, handle, size, PROT_READ | PROT_WRITE);
274*d83cc019SAndroid Build Coastguard Worker 			volatile uint32_t *ptr = base;
275*d83cc019SAndroid Build Coastguard Worker 			int x = 0;
276*d83cc019SAndroid Build Coastguard Worker 
277*d83cc019SAndroid Build Coastguard Worker 			for (i = 0; i < size/sizeof(*ptr); i++)
278*d83cc019SAndroid Build Coastguard Worker 				x += ptr[i];
279*d83cc019SAndroid Build Coastguard Worker 
280*d83cc019SAndroid Build Coastguard Worker 			/* force overly clever gcc to actually compute x */
281*d83cc019SAndroid Build Coastguard Worker 			ptr[0] = x;
282*d83cc019SAndroid Build Coastguard Worker 
283*d83cc019SAndroid Build Coastguard Worker 			munmap(base, size);
284*d83cc019SAndroid Build Coastguard Worker 		}
285*d83cc019SAndroid Build Coastguard Worker 		gettimeofday(&end, NULL);
286*d83cc019SAndroid Build Coastguard Worker 		igt_info("Time to read %dk through a GTT map:		%7.3fµs\n",
287*d83cc019SAndroid Build Coastguard Worker 			 size/1024, elapsed(&start, &end, loop));
288*d83cc019SAndroid Build Coastguard Worker 
289*d83cc019SAndroid Build Coastguard Worker 		if (gem_mmap__has_wc(fd)) {
290*d83cc019SAndroid Build Coastguard Worker 			gettimeofday(&start, NULL);
291*d83cc019SAndroid Build Coastguard Worker 			for (loop = 0; loop < 1000; loop++) {
292*d83cc019SAndroid Build Coastguard Worker 				uint32_t *base = gem_mmap__wc(fd, handle, 0, size, PROT_READ | PROT_WRITE);
293*d83cc019SAndroid Build Coastguard Worker 				volatile uint32_t *ptr = base;
294*d83cc019SAndroid Build Coastguard Worker 				int x = 0;
295*d83cc019SAndroid Build Coastguard Worker 
296*d83cc019SAndroid Build Coastguard Worker 				for (i = 0; i < size/sizeof(*ptr); i++)
297*d83cc019SAndroid Build Coastguard Worker 					x += ptr[i];
298*d83cc019SAndroid Build Coastguard Worker 
299*d83cc019SAndroid Build Coastguard Worker 				/* force overly clever gcc to actually compute x */
300*d83cc019SAndroid Build Coastguard Worker 				ptr[0] = x;
301*d83cc019SAndroid Build Coastguard Worker 
302*d83cc019SAndroid Build Coastguard Worker 				munmap(base, size);
303*d83cc019SAndroid Build Coastguard Worker 			}
304*d83cc019SAndroid Build Coastguard Worker 			gettimeofday(&end, NULL);
305*d83cc019SAndroid Build Coastguard Worker 			igt_info("Time to read %dk through a WC map:		%7.3fµs\n",
306*d83cc019SAndroid Build Coastguard Worker 					size/1024, elapsed(&start, &end, loop));
307*d83cc019SAndroid Build Coastguard Worker 
308*d83cc019SAndroid Build Coastguard Worker 			{
309*d83cc019SAndroid Build Coastguard Worker 				uint32_t *base = gem_mmap__wc(fd, handle, 0, size, PROT_READ | PROT_WRITE);
310*d83cc019SAndroid Build Coastguard Worker 				gettimeofday(&start, NULL);
311*d83cc019SAndroid Build Coastguard Worker 				for (loop = 0; loop < 1000; loop++) {
312*d83cc019SAndroid Build Coastguard Worker 					volatile uint32_t *ptr = base;
313*d83cc019SAndroid Build Coastguard Worker 					int x = 0;
314*d83cc019SAndroid Build Coastguard Worker 
315*d83cc019SAndroid Build Coastguard Worker 					for (i = 0; i < size/sizeof(*ptr); i++)
316*d83cc019SAndroid Build Coastguard Worker 						x += ptr[i];
317*d83cc019SAndroid Build Coastguard Worker 
318*d83cc019SAndroid Build Coastguard Worker 					/* force overly clever gcc to actually compute x */
319*d83cc019SAndroid Build Coastguard Worker 					ptr[0] = x;
320*d83cc019SAndroid Build Coastguard Worker 
321*d83cc019SAndroid Build Coastguard Worker 				}
322*d83cc019SAndroid Build Coastguard Worker 				gettimeofday(&end, NULL);
323*d83cc019SAndroid Build Coastguard Worker 				munmap(base, size);
324*d83cc019SAndroid Build Coastguard Worker 			}
325*d83cc019SAndroid Build Coastguard Worker 			igt_info("Time to read %dk through a cached WC map:	%7.3fµs\n",
326*d83cc019SAndroid Build Coastguard Worker 				 size/1024, elapsed(&start, &end, loop));
327*d83cc019SAndroid Build Coastguard Worker 
328*d83cc019SAndroid Build Coastguard Worker 			/* Check streaming loads from WC */
329*d83cc019SAndroid Build Coastguard Worker 			if (cpu & SSE4_1) {
330*d83cc019SAndroid Build Coastguard Worker 				gettimeofday(&start, NULL);
331*d83cc019SAndroid Build Coastguard Worker 				for (loop = 0; loop < 1000; loop++) {
332*d83cc019SAndroid Build Coastguard Worker 					uint32_t *base = gem_mmap__wc(fd, handle, 0, size, PROT_READ | PROT_WRITE);
333*d83cc019SAndroid Build Coastguard Worker 					streaming_load(base, size);
334*d83cc019SAndroid Build Coastguard Worker 
335*d83cc019SAndroid Build Coastguard Worker 					munmap(base, size);
336*d83cc019SAndroid Build Coastguard Worker 				}
337*d83cc019SAndroid Build Coastguard Worker 				gettimeofday(&end, NULL);
338*d83cc019SAndroid Build Coastguard Worker 				igt_info("Time to stream %dk from a WC map:		%7.3fµs\n",
339*d83cc019SAndroid Build Coastguard Worker 					 size/1024, elapsed(&start, &end, loop));
340*d83cc019SAndroid Build Coastguard Worker 
341*d83cc019SAndroid Build Coastguard Worker 				{
342*d83cc019SAndroid Build Coastguard Worker 					uint32_t *base = gem_mmap__wc(fd, handle, 0, size, PROT_READ | PROT_WRITE);
343*d83cc019SAndroid Build Coastguard Worker 					gettimeofday(&start, NULL);
344*d83cc019SAndroid Build Coastguard Worker 					for (loop = 0; loop < 1000; loop++)
345*d83cc019SAndroid Build Coastguard Worker 						streaming_load(base, size);
346*d83cc019SAndroid Build Coastguard Worker 					gettimeofday(&end, NULL);
347*d83cc019SAndroid Build Coastguard Worker 					munmap(base, size);
348*d83cc019SAndroid Build Coastguard Worker 				}
349*d83cc019SAndroid Build Coastguard Worker 				igt_info("Time to stream %dk from a cached WC map:	%7.3fµs\n",
350*d83cc019SAndroid Build Coastguard Worker 					 size/1024, elapsed(&start, &end, loop));
351*d83cc019SAndroid Build Coastguard Worker 			}
352*d83cc019SAndroid Build Coastguard Worker 		}
353*d83cc019SAndroid Build Coastguard Worker 
354*d83cc019SAndroid Build Coastguard Worker 
355*d83cc019SAndroid Build Coastguard Worker 		/* mmap write */
356*d83cc019SAndroid Build Coastguard Worker 		gettimeofday(&start, NULL);
357*d83cc019SAndroid Build Coastguard Worker 		for (loop = 0; loop < 1000; loop++) {
358*d83cc019SAndroid Build Coastguard Worker 			uint32_t *base = gem_mmap__gtt(fd, handle, size, PROT_READ | PROT_WRITE);
359*d83cc019SAndroid Build Coastguard Worker 			volatile uint32_t *ptr = base;
360*d83cc019SAndroid Build Coastguard Worker 
361*d83cc019SAndroid Build Coastguard Worker 			for (i = 0; i < size/sizeof(*ptr); i++)
362*d83cc019SAndroid Build Coastguard Worker 				ptr[i] = i;
363*d83cc019SAndroid Build Coastguard Worker 
364*d83cc019SAndroid Build Coastguard Worker 			munmap(base, size);
365*d83cc019SAndroid Build Coastguard Worker 		}
366*d83cc019SAndroid Build Coastguard Worker 		gettimeofday(&end, NULL);
367*d83cc019SAndroid Build Coastguard Worker 		igt_info("Time to write %dk through a GTT map:		%7.3fµs\n",
368*d83cc019SAndroid Build Coastguard Worker 			 size/1024, elapsed(&start, &end, loop));
369*d83cc019SAndroid Build Coastguard Worker 
370*d83cc019SAndroid Build Coastguard Worker 		if (gem_mmap__has_wc(fd)) {
371*d83cc019SAndroid Build Coastguard Worker 			/* mmap write */
372*d83cc019SAndroid Build Coastguard Worker 			gettimeofday(&start, NULL);
373*d83cc019SAndroid Build Coastguard Worker 			for (loop = 0; loop < 1000; loop++) {
374*d83cc019SAndroid Build Coastguard Worker 				uint32_t *base = gem_mmap__wc(fd, handle, 0, size, PROT_READ | PROT_WRITE);
375*d83cc019SAndroid Build Coastguard Worker 				volatile uint32_t *ptr = base;
376*d83cc019SAndroid Build Coastguard Worker 
377*d83cc019SAndroid Build Coastguard Worker 				for (i = 0; i < size/sizeof(*ptr); i++)
378*d83cc019SAndroid Build Coastguard Worker 					ptr[i] = i;
379*d83cc019SAndroid Build Coastguard Worker 
380*d83cc019SAndroid Build Coastguard Worker 				munmap(base, size);
381*d83cc019SAndroid Build Coastguard Worker 			}
382*d83cc019SAndroid Build Coastguard Worker 			gettimeofday(&end, NULL);
383*d83cc019SAndroid Build Coastguard Worker 			igt_info("Time to write %dk through a WC map:		%7.3fµs\n",
384*d83cc019SAndroid Build Coastguard Worker 					size/1024, elapsed(&start, &end, loop));
385*d83cc019SAndroid Build Coastguard Worker 		}
386*d83cc019SAndroid Build Coastguard Worker 
387*d83cc019SAndroid Build Coastguard Worker 		/* mmap clear */
388*d83cc019SAndroid Build Coastguard Worker 		gettimeofday(&start, NULL);
389*d83cc019SAndroid Build Coastguard Worker 		for (loop = 0; loop < 1000; loop++) {
390*d83cc019SAndroid Build Coastguard Worker 			uint32_t *base = gem_mmap__gtt(fd, handle, size, PROT_READ | PROT_WRITE);
391*d83cc019SAndroid Build Coastguard Worker 			memset(base, 0, size);
392*d83cc019SAndroid Build Coastguard Worker 			munmap(base, size);
393*d83cc019SAndroid Build Coastguard Worker 		}
394*d83cc019SAndroid Build Coastguard Worker 		gettimeofday(&end, NULL);
395*d83cc019SAndroid Build Coastguard Worker 		igt_info("Time to clear %dk through a GTT map:		%7.3fµs\n",
396*d83cc019SAndroid Build Coastguard Worker 			 size/1024, elapsed(&start, &end, loop));
397*d83cc019SAndroid Build Coastguard Worker 
398*d83cc019SAndroid Build Coastguard Worker 		if (gem_mmap__has_wc(fd)) {
399*d83cc019SAndroid Build Coastguard Worker 			/* mmap clear */
400*d83cc019SAndroid Build Coastguard Worker 			gettimeofday(&start, NULL);
401*d83cc019SAndroid Build Coastguard Worker 			for (loop = 0; loop < 1000; loop++) {
402*d83cc019SAndroid Build Coastguard Worker 				uint32_t *base = gem_mmap__wc(fd, handle, 0, size, PROT_READ | PROT_WRITE);
403*d83cc019SAndroid Build Coastguard Worker 				memset(base, 0, size);
404*d83cc019SAndroid Build Coastguard Worker 				munmap(base, size);
405*d83cc019SAndroid Build Coastguard Worker 			}
406*d83cc019SAndroid Build Coastguard Worker 			gettimeofday(&end, NULL);
407*d83cc019SAndroid Build Coastguard Worker 			igt_info("Time to clear %dk through a WC map:		%7.3fµs\n",
408*d83cc019SAndroid Build Coastguard Worker 					size/1024, elapsed(&start, &end, loop));
409*d83cc019SAndroid Build Coastguard Worker 		}
410*d83cc019SAndroid Build Coastguard Worker 
411*d83cc019SAndroid Build Coastguard Worker 		gettimeofday(&start, NULL);{
412*d83cc019SAndroid Build Coastguard Worker 			uint32_t *base = gem_mmap__gtt(fd, handle, size, PROT_READ | PROT_WRITE);
413*d83cc019SAndroid Build Coastguard Worker 			for (loop = 0; loop < 1000; loop++)
414*d83cc019SAndroid Build Coastguard Worker 				memset(base, 0, size);
415*d83cc019SAndroid Build Coastguard Worker 			munmap(base, size);
416*d83cc019SAndroid Build Coastguard Worker 		} gettimeofday(&end, NULL);
417*d83cc019SAndroid Build Coastguard Worker 		igt_info("Time to clear %dk through a cached GTT map:	%7.3fµs\n",
418*d83cc019SAndroid Build Coastguard Worker 			 size/1024, elapsed(&start, &end, loop));
419*d83cc019SAndroid Build Coastguard Worker 
420*d83cc019SAndroid Build Coastguard Worker 		if (gem_mmap__has_wc(fd)) {
421*d83cc019SAndroid Build Coastguard Worker 			gettimeofday(&start, NULL);{
422*d83cc019SAndroid Build Coastguard Worker 				uint32_t *base = gem_mmap__wc(fd, handle, 0, size, PROT_READ | PROT_WRITE);
423*d83cc019SAndroid Build Coastguard Worker 				for (loop = 0; loop < 1000; loop++)
424*d83cc019SAndroid Build Coastguard Worker 					memset(base, 0, size);
425*d83cc019SAndroid Build Coastguard Worker 				munmap(base, size);
426*d83cc019SAndroid Build Coastguard Worker 			} gettimeofday(&end, NULL);
427*d83cc019SAndroid Build Coastguard Worker 			igt_info("Time to clear %dk through a cached WC map:	%7.3fµs\n",
428*d83cc019SAndroid Build Coastguard Worker 					size/1024, elapsed(&start, &end, loop));
429*d83cc019SAndroid Build Coastguard Worker 		}
430*d83cc019SAndroid Build Coastguard Worker 
431*d83cc019SAndroid Build Coastguard Worker 		/* mmap read */
432*d83cc019SAndroid Build Coastguard Worker 		gettimeofday(&start, NULL);
433*d83cc019SAndroid Build Coastguard Worker 		for (loop = 0; loop < 1000; loop++) {
434*d83cc019SAndroid Build Coastguard Worker 			uint32_t *base = gem_mmap__gtt(fd, handle, size, PROT_READ | PROT_WRITE);
435*d83cc019SAndroid Build Coastguard Worker 			volatile uint32_t *ptr = base;
436*d83cc019SAndroid Build Coastguard Worker 			int x = 0;
437*d83cc019SAndroid Build Coastguard Worker 
438*d83cc019SAndroid Build Coastguard Worker 			for (i = 0; i < size/sizeof(*ptr); i++)
439*d83cc019SAndroid Build Coastguard Worker 				x += ptr[i];
440*d83cc019SAndroid Build Coastguard Worker 
441*d83cc019SAndroid Build Coastguard Worker 			/* force overly clever gcc to actually compute x */
442*d83cc019SAndroid Build Coastguard Worker 			ptr[0] = x;
443*d83cc019SAndroid Build Coastguard Worker 
444*d83cc019SAndroid Build Coastguard Worker 			munmap(base, size);
445*d83cc019SAndroid Build Coastguard Worker 		}
446*d83cc019SAndroid Build Coastguard Worker 		gettimeofday(&end, NULL);
447*d83cc019SAndroid Build Coastguard Worker 		igt_info("Time to read %dk (again) through a GTT map:	%7.3fµs\n",
448*d83cc019SAndroid Build Coastguard Worker 			 size/1024, elapsed(&start, &end, loop));
449*d83cc019SAndroid Build Coastguard Worker 
450*d83cc019SAndroid Build Coastguard Worker 		if (tiling == I915_TILING_NONE) {
451*d83cc019SAndroid Build Coastguard Worker 			/* GTT pwrite */
452*d83cc019SAndroid Build Coastguard Worker 			gettimeofday(&start, NULL);
453*d83cc019SAndroid Build Coastguard Worker 			for (loop = 0; loop < 1000; loop++)
454*d83cc019SAndroid Build Coastguard Worker 				gem_write(fd, handle, 0, buf, size);
455*d83cc019SAndroid Build Coastguard Worker 			gettimeofday(&end, NULL);
456*d83cc019SAndroid Build Coastguard Worker 			igt_info("Time to pwrite %dk through the GTT:		%7.3fµs\n",
457*d83cc019SAndroid Build Coastguard Worker 				 size/1024, elapsed(&start, &end, loop));
458*d83cc019SAndroid Build Coastguard Worker 
459*d83cc019SAndroid Build Coastguard Worker 			/* GTT pread */
460*d83cc019SAndroid Build Coastguard Worker 			gettimeofday(&start, NULL);
461*d83cc019SAndroid Build Coastguard Worker 			for (loop = 0; loop < 1000; loop++)
462*d83cc019SAndroid Build Coastguard Worker 				gem_read(fd, handle, 0, buf, size);
463*d83cc019SAndroid Build Coastguard Worker 			gettimeofday(&end, NULL);
464*d83cc019SAndroid Build Coastguard Worker 			igt_info("Time to pread %dk through the GTT:		%7.3fµs\n",
465*d83cc019SAndroid Build Coastguard Worker 				 size/1024, elapsed(&start, &end, loop));
466*d83cc019SAndroid Build Coastguard Worker 
467*d83cc019SAndroid Build Coastguard Worker 			/* GTT pwrite, including clflush */
468*d83cc019SAndroid Build Coastguard Worker 			gettimeofday(&start, NULL);
469*d83cc019SAndroid Build Coastguard Worker 			for (loop = 0; loop < 1000; loop++) {
470*d83cc019SAndroid Build Coastguard Worker 				gem_write(fd, handle, 0, buf, size);
471*d83cc019SAndroid Build Coastguard Worker 				gem_sync(fd, handle);
472*d83cc019SAndroid Build Coastguard Worker 			}
473*d83cc019SAndroid Build Coastguard Worker 			gettimeofday(&end, NULL);
474*d83cc019SAndroid Build Coastguard Worker 			igt_info("Time to pwrite %dk through the GTT (clflush):	%7.3fµs\n",
475*d83cc019SAndroid Build Coastguard Worker 				 size/1024, elapsed(&start, &end, loop));
476*d83cc019SAndroid Build Coastguard Worker 
477*d83cc019SAndroid Build Coastguard Worker 			/* GTT pread, including clflush */
478*d83cc019SAndroid Build Coastguard Worker 			gettimeofday(&start, NULL);
479*d83cc019SAndroid Build Coastguard Worker 			for (loop = 0; loop < 1000; loop++) {
480*d83cc019SAndroid Build Coastguard Worker 				gem_sync(fd, handle);
481*d83cc019SAndroid Build Coastguard Worker 				gem_read(fd, handle, 0, buf, size);
482*d83cc019SAndroid Build Coastguard Worker 			}
483*d83cc019SAndroid Build Coastguard Worker 			gettimeofday(&end, NULL);
484*d83cc019SAndroid Build Coastguard Worker 			igt_info("Time to pread %dk through the GTT (clflush):	%7.3fµs\n",
485*d83cc019SAndroid Build Coastguard Worker 				 size/1024, elapsed(&start, &end, loop));
486*d83cc019SAndroid Build Coastguard Worker 
487*d83cc019SAndroid Build Coastguard Worker 			/* partial writes */
488*d83cc019SAndroid Build Coastguard Worker 			igt_info("Now partial writes.\n");
489*d83cc019SAndroid Build Coastguard Worker 			size /= 4;
490*d83cc019SAndroid Build Coastguard Worker 
491*d83cc019SAndroid Build Coastguard Worker 			/* partial GTT pwrite, including clflush */
492*d83cc019SAndroid Build Coastguard Worker 			gettimeofday(&start, NULL);
493*d83cc019SAndroid Build Coastguard Worker 			for (loop = 0; loop < 1000; loop++) {
494*d83cc019SAndroid Build Coastguard Worker 				gem_write(fd, handle, 0, buf, size);
495*d83cc019SAndroid Build Coastguard Worker 				gem_sync(fd, handle);
496*d83cc019SAndroid Build Coastguard Worker 			}
497*d83cc019SAndroid Build Coastguard Worker 			gettimeofday(&end, NULL);
498*d83cc019SAndroid Build Coastguard Worker 			igt_info("Time to pwrite %dk through the GTT (clflush):	%7.3fµs\n",
499*d83cc019SAndroid Build Coastguard Worker 			       size/1024, elapsed(&start, &end, loop));
500*d83cc019SAndroid Build Coastguard Worker 
501*d83cc019SAndroid Build Coastguard Worker 			/* partial GTT pread, including clflush */
502*d83cc019SAndroid Build Coastguard Worker 			gettimeofday(&start, NULL);
503*d83cc019SAndroid Build Coastguard Worker 			for (loop = 0; loop < 1000; loop++) {
504*d83cc019SAndroid Build Coastguard Worker 				gem_sync(fd, handle);
505*d83cc019SAndroid Build Coastguard Worker 				gem_read(fd, handle, 0, buf, size);
506*d83cc019SAndroid Build Coastguard Worker 			}
507*d83cc019SAndroid Build Coastguard Worker 			gettimeofday(&end, NULL);
508*d83cc019SAndroid Build Coastguard Worker 			igt_info("Time to pread %dk through the GTT (clflush):	%7.3fµs\n",
509*d83cc019SAndroid Build Coastguard Worker 			       size/1024, elapsed(&start, &end, loop));
510*d83cc019SAndroid Build Coastguard Worker 
511*d83cc019SAndroid Build Coastguard Worker 			size *= 4;
512*d83cc019SAndroid Build Coastguard Worker 		}
513*d83cc019SAndroid Build Coastguard Worker 	}
514*d83cc019SAndroid Build Coastguard Worker 
515*d83cc019SAndroid Build Coastguard Worker 	gem_close(fd, handle);
516*d83cc019SAndroid Build Coastguard Worker 	close(fd);
517*d83cc019SAndroid Build Coastguard Worker }
518