xref: /aosp_15_r20/external/igt-gpu-tools/lib/drmtest.c (revision d83cc019efdc2edc6c4b16e9034a3ceb8d35d77c)
1*d83cc019SAndroid Build Coastguard Worker /*
2*d83cc019SAndroid Build Coastguard Worker  * Copyright © 2007, 2011, 2013 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  *    Daniel Vetter <[email protected]>
26*d83cc019SAndroid Build Coastguard Worker  *
27*d83cc019SAndroid Build Coastguard Worker  */
28*d83cc019SAndroid Build Coastguard Worker 
29*d83cc019SAndroid Build Coastguard Worker #ifdef HAVE_LIBGEN_H
30*d83cc019SAndroid Build Coastguard Worker #include <libgen.h>
31*d83cc019SAndroid Build Coastguard Worker #endif
32*d83cc019SAndroid Build Coastguard Worker #include <stdio.h>
33*d83cc019SAndroid Build Coastguard Worker #include <fcntl.h>
34*d83cc019SAndroid Build Coastguard Worker #include <sys/stat.h>
35*d83cc019SAndroid Build Coastguard Worker #include <sys/ioctl.h>
36*d83cc019SAndroid Build Coastguard Worker #include <string.h>
37*d83cc019SAndroid Build Coastguard Worker #include <sys/mman.h>
38*d83cc019SAndroid Build Coastguard Worker #include <signal.h>
39*d83cc019SAndroid Build Coastguard Worker #include <pciaccess.h>
40*d83cc019SAndroid Build Coastguard Worker #include <stdlib.h>
41*d83cc019SAndroid Build Coastguard Worker #include <unistd.h>
42*d83cc019SAndroid Build Coastguard Worker #include <sys/wait.h>
43*d83cc019SAndroid Build Coastguard Worker #include <sys/types.h>
44*d83cc019SAndroid Build Coastguard Worker #include <sys/syscall.h>
45*d83cc019SAndroid Build Coastguard Worker #include <sys/utsname.h>
46*d83cc019SAndroid Build Coastguard Worker #include <termios.h>
47*d83cc019SAndroid Build Coastguard Worker #include <pthread.h>
48*d83cc019SAndroid Build Coastguard Worker 
49*d83cc019SAndroid Build Coastguard Worker #include "drmtest.h"
50*d83cc019SAndroid Build Coastguard Worker #include "i915_drm.h"
51*d83cc019SAndroid Build Coastguard Worker #include "intel_chipset.h"
52*d83cc019SAndroid Build Coastguard Worker #include "intel_io.h"
53*d83cc019SAndroid Build Coastguard Worker #include "igt_debugfs.h"
54*d83cc019SAndroid Build Coastguard Worker #include "igt_device.h"
55*d83cc019SAndroid Build Coastguard Worker #include "igt_gt.h"
56*d83cc019SAndroid Build Coastguard Worker #include "igt_kmod.h"
57*d83cc019SAndroid Build Coastguard Worker #include "igt_sysfs.h"
58*d83cc019SAndroid Build Coastguard Worker #include "version.h"
59*d83cc019SAndroid Build Coastguard Worker #include "config.h"
60*d83cc019SAndroid Build Coastguard Worker #include "intel_reg.h"
61*d83cc019SAndroid Build Coastguard Worker #include "ioctl_wrappers.h"
62*d83cc019SAndroid Build Coastguard Worker #include "igt_dummyload.h"
63*d83cc019SAndroid Build Coastguard Worker 
64*d83cc019SAndroid Build Coastguard Worker /**
65*d83cc019SAndroid Build Coastguard Worker  * SECTION:drmtest
66*d83cc019SAndroid Build Coastguard Worker  * @short_description: Base library for drm tests and tools
67*d83cc019SAndroid Build Coastguard Worker  * @title: drmtest
68*d83cc019SAndroid Build Coastguard Worker  * @include: igt.h
69*d83cc019SAndroid Build Coastguard Worker  *
70*d83cc019SAndroid Build Coastguard Worker  * This library contains the basic support for writing tests, with the most
71*d83cc019SAndroid Build Coastguard Worker  * important part being the helper function to open drm device nodes.
72*d83cc019SAndroid Build Coastguard Worker  *
73*d83cc019SAndroid Build Coastguard Worker  * But there's also a bit of other assorted stuff here.
74*d83cc019SAndroid Build Coastguard Worker  *
75*d83cc019SAndroid Build Coastguard Worker  * Note that this library's header pulls in the [i-g-t core](igt-gpu-tools-i-g-t-core.html)
76*d83cc019SAndroid Build Coastguard Worker  * and [batchbuffer](igt-gpu-tools-intel-batchbuffer.html) libraries as dependencies.
77*d83cc019SAndroid Build Coastguard Worker  */
78*d83cc019SAndroid Build Coastguard Worker 
__get_drm_device_name(int fd,char * name,int name_size)79*d83cc019SAndroid Build Coastguard Worker static int __get_drm_device_name(int fd, char *name, int name_size)
80*d83cc019SAndroid Build Coastguard Worker {
81*d83cc019SAndroid Build Coastguard Worker 	drm_version_t version;
82*d83cc019SAndroid Build Coastguard Worker 
83*d83cc019SAndroid Build Coastguard Worker 	memset(&version, 0, sizeof(version));
84*d83cc019SAndroid Build Coastguard Worker 	version.name_len = name_size;
85*d83cc019SAndroid Build Coastguard Worker 	version.name = name;
86*d83cc019SAndroid Build Coastguard Worker 
87*d83cc019SAndroid Build Coastguard Worker 	if (!drmIoctl(fd, DRM_IOCTL_VERSION, &version)){
88*d83cc019SAndroid Build Coastguard Worker 		return 0;
89*d83cc019SAndroid Build Coastguard Worker 	}
90*d83cc019SAndroid Build Coastguard Worker 
91*d83cc019SAndroid Build Coastguard Worker 	return -1;
92*d83cc019SAndroid Build Coastguard Worker }
93*d83cc019SAndroid Build Coastguard Worker 
__is_device(int fd,const char * expect)94*d83cc019SAndroid Build Coastguard Worker static bool __is_device(int fd, const char *expect)
95*d83cc019SAndroid Build Coastguard Worker {
96*d83cc019SAndroid Build Coastguard Worker 	char name[12] = "";
97*d83cc019SAndroid Build Coastguard Worker 
98*d83cc019SAndroid Build Coastguard Worker 	if (__get_drm_device_name(fd, name, sizeof(name) - 1))
99*d83cc019SAndroid Build Coastguard Worker 		return false;
100*d83cc019SAndroid Build Coastguard Worker 
101*d83cc019SAndroid Build Coastguard Worker 	return strcmp(expect, name) == 0;
102*d83cc019SAndroid Build Coastguard Worker }
103*d83cc019SAndroid Build Coastguard Worker 
is_amdgpu_device(int fd)104*d83cc019SAndroid Build Coastguard Worker bool is_amdgpu_device(int fd)
105*d83cc019SAndroid Build Coastguard Worker {
106*d83cc019SAndroid Build Coastguard Worker 	return __is_device(fd, "amdgpu");
107*d83cc019SAndroid Build Coastguard Worker }
108*d83cc019SAndroid Build Coastguard Worker 
is_i915_device(int fd)109*d83cc019SAndroid Build Coastguard Worker bool is_i915_device(int fd)
110*d83cc019SAndroid Build Coastguard Worker {
111*d83cc019SAndroid Build Coastguard Worker 	return __is_device(fd, "i915");
112*d83cc019SAndroid Build Coastguard Worker }
113*d83cc019SAndroid Build Coastguard Worker 
is_vc4_device(int fd)114*d83cc019SAndroid Build Coastguard Worker bool is_vc4_device(int fd)
115*d83cc019SAndroid Build Coastguard Worker {
116*d83cc019SAndroid Build Coastguard Worker 	return __is_device(fd, "vc4");
117*d83cc019SAndroid Build Coastguard Worker }
118*d83cc019SAndroid Build Coastguard Worker 
has_known_intel_chipset(int fd)119*d83cc019SAndroid Build Coastguard Worker static bool has_known_intel_chipset(int fd)
120*d83cc019SAndroid Build Coastguard Worker {
121*d83cc019SAndroid Build Coastguard Worker 	struct drm_i915_getparam gp;
122*d83cc019SAndroid Build Coastguard Worker 	int devid = 0;
123*d83cc019SAndroid Build Coastguard Worker 
124*d83cc019SAndroid Build Coastguard Worker 	memset(&gp, 0, sizeof(gp));
125*d83cc019SAndroid Build Coastguard Worker 	gp.param = I915_PARAM_CHIPSET_ID;
126*d83cc019SAndroid Build Coastguard Worker 	gp.value = &devid;
127*d83cc019SAndroid Build Coastguard Worker 
128*d83cc019SAndroid Build Coastguard Worker 	if (ioctl(fd, DRM_IOCTL_I915_GETPARAM, &gp, sizeof(gp)))
129*d83cc019SAndroid Build Coastguard Worker 		return false;
130*d83cc019SAndroid Build Coastguard Worker 
131*d83cc019SAndroid Build Coastguard Worker 	if (!intel_gen(devid))
132*d83cc019SAndroid Build Coastguard Worker 		return false;
133*d83cc019SAndroid Build Coastguard Worker 
134*d83cc019SAndroid Build Coastguard Worker 	return true;
135*d83cc019SAndroid Build Coastguard Worker }
136*d83cc019SAndroid Build Coastguard Worker 
137*d83cc019SAndroid Build Coastguard Worker static char _forced_driver[16] = "";
138*d83cc019SAndroid Build Coastguard Worker 
139*d83cc019SAndroid Build Coastguard Worker /**
140*d83cc019SAndroid Build Coastguard Worker  * __set_forced_driver:
141*d83cc019SAndroid Build Coastguard Worker  * @name: name of driver to forcibly use
142*d83cc019SAndroid Build Coastguard Worker  *
143*d83cc019SAndroid Build Coastguard Worker  * Set the name of a driver to use when calling #drm_open_driver with
144*d83cc019SAndroid Build Coastguard Worker  * the #DRIVER_ANY flag.
145*d83cc019SAndroid Build Coastguard Worker  */
__set_forced_driver(const char * name)146*d83cc019SAndroid Build Coastguard Worker void __set_forced_driver(const char *name)
147*d83cc019SAndroid Build Coastguard Worker {
148*d83cc019SAndroid Build Coastguard Worker 	if (!name) {
149*d83cc019SAndroid Build Coastguard Worker 		igt_warn("No driver specified, keep default behaviour\n");
150*d83cc019SAndroid Build Coastguard Worker 		return;
151*d83cc019SAndroid Build Coastguard Worker 	}
152*d83cc019SAndroid Build Coastguard Worker 
153*d83cc019SAndroid Build Coastguard Worker 	strncpy(_forced_driver, name, sizeof(_forced_driver) - 1);
154*d83cc019SAndroid Build Coastguard Worker }
155*d83cc019SAndroid Build Coastguard Worker 
forced_driver(void)156*d83cc019SAndroid Build Coastguard Worker static const char *forced_driver(void)
157*d83cc019SAndroid Build Coastguard Worker {
158*d83cc019SAndroid Build Coastguard Worker 	if (_forced_driver[0])
159*d83cc019SAndroid Build Coastguard Worker 		return _forced_driver;
160*d83cc019SAndroid Build Coastguard Worker 
161*d83cc019SAndroid Build Coastguard Worker 	return NULL;
162*d83cc019SAndroid Build Coastguard Worker }
163*d83cc019SAndroid Build Coastguard Worker 
164*d83cc019SAndroid Build Coastguard Worker #define LOCAL_I915_EXEC_VEBOX	(4 << 0)
165*d83cc019SAndroid Build Coastguard Worker /**
166*d83cc019SAndroid Build Coastguard Worker  * gem_quiescent_gpu:
167*d83cc019SAndroid Build Coastguard Worker  * @fd: open i915 drm file descriptor
168*d83cc019SAndroid Build Coastguard Worker  *
169*d83cc019SAndroid Build Coastguard Worker  * Ensure the gpu is idle by launching a nop execbuf and stalling for it. This
170*d83cc019SAndroid Build Coastguard Worker  * is automatically run when opening a drm device node and is also installed as
171*d83cc019SAndroid Build Coastguard Worker  * an exit handler to have the best assurance that the test is run in a pristine
172*d83cc019SAndroid Build Coastguard Worker  * and controlled environment.
173*d83cc019SAndroid Build Coastguard Worker  *
174*d83cc019SAndroid Build Coastguard Worker  * This function simply allows tests to make additional calls in-between, if so
175*d83cc019SAndroid Build Coastguard Worker  * desired.
176*d83cc019SAndroid Build Coastguard Worker  */
gem_quiescent_gpu(int fd)177*d83cc019SAndroid Build Coastguard Worker void gem_quiescent_gpu(int fd)
178*d83cc019SAndroid Build Coastguard Worker {
179*d83cc019SAndroid Build Coastguard Worker 	igt_terminate_spins();
180*d83cc019SAndroid Build Coastguard Worker 
181*d83cc019SAndroid Build Coastguard Worker 	igt_drop_caches_set(fd,
182*d83cc019SAndroid Build Coastguard Worker 			    DROP_ACTIVE | DROP_RETIRE | DROP_IDLE | DROP_FREED);
183*d83cc019SAndroid Build Coastguard Worker }
184*d83cc019SAndroid Build Coastguard Worker 
modprobe(const char * driver)185*d83cc019SAndroid Build Coastguard Worker static int modprobe(const char *driver)
186*d83cc019SAndroid Build Coastguard Worker {
187*d83cc019SAndroid Build Coastguard Worker 	return igt_kmod_load(driver, "");
188*d83cc019SAndroid Build Coastguard Worker }
189*d83cc019SAndroid Build Coastguard Worker 
modprobe_i915(const char * name)190*d83cc019SAndroid Build Coastguard Worker static void modprobe_i915(const char *name)
191*d83cc019SAndroid Build Coastguard Worker {
192*d83cc019SAndroid Build Coastguard Worker 	/* When loading i915, we also want to load snd-hda et al */
193*d83cc019SAndroid Build Coastguard Worker 	igt_i915_driver_load(NULL);
194*d83cc019SAndroid Build Coastguard Worker }
195*d83cc019SAndroid Build Coastguard Worker 
196*d83cc019SAndroid Build Coastguard Worker static const struct module {
197*d83cc019SAndroid Build Coastguard Worker 	unsigned int bit;
198*d83cc019SAndroid Build Coastguard Worker 	const char *module;
199*d83cc019SAndroid Build Coastguard Worker 	void (*modprobe)(const char *name);
200*d83cc019SAndroid Build Coastguard Worker } modules[] = {
201*d83cc019SAndroid Build Coastguard Worker 	{ DRIVER_AMDGPU, "amdgpu" },
202*d83cc019SAndroid Build Coastguard Worker 	{ DRIVER_INTEL, "i915", modprobe_i915 },
203*d83cc019SAndroid Build Coastguard Worker 	{ DRIVER_PANFROST, "panfrost" },
204*d83cc019SAndroid Build Coastguard Worker 	{ DRIVER_V3D, "v3d" },
205*d83cc019SAndroid Build Coastguard Worker 	{ DRIVER_VC4, "vc4" },
206*d83cc019SAndroid Build Coastguard Worker 	{ DRIVER_VGEM, "vgem" },
207*d83cc019SAndroid Build Coastguard Worker 	{}
208*d83cc019SAndroid Build Coastguard Worker };
209*d83cc019SAndroid Build Coastguard Worker 
open_device(const char * name,unsigned int chipset)210*d83cc019SAndroid Build Coastguard Worker static int open_device(const char *name, unsigned int chipset)
211*d83cc019SAndroid Build Coastguard Worker {
212*d83cc019SAndroid Build Coastguard Worker 	const char *forced;
213*d83cc019SAndroid Build Coastguard Worker 	char dev_name[16] = "";
214*d83cc019SAndroid Build Coastguard Worker 	int chip = DRIVER_ANY;
215*d83cc019SAndroid Build Coastguard Worker 	int fd;
216*d83cc019SAndroid Build Coastguard Worker 
217*d83cc019SAndroid Build Coastguard Worker 	fd = open(name, O_RDWR);
218*d83cc019SAndroid Build Coastguard Worker 	if (fd == -1)
219*d83cc019SAndroid Build Coastguard Worker 		return -1;
220*d83cc019SAndroid Build Coastguard Worker 
221*d83cc019SAndroid Build Coastguard Worker 	if (__get_drm_device_name(fd, dev_name, sizeof(dev_name) - 1) == -1)
222*d83cc019SAndroid Build Coastguard Worker 		goto err;
223*d83cc019SAndroid Build Coastguard Worker 
224*d83cc019SAndroid Build Coastguard Worker 	forced = forced_driver();
225*d83cc019SAndroid Build Coastguard Worker 	if (forced && chipset == DRIVER_ANY && strcmp(forced, dev_name))
226*d83cc019SAndroid Build Coastguard Worker 		goto err;
227*d83cc019SAndroid Build Coastguard Worker 
228*d83cc019SAndroid Build Coastguard Worker 	for (int start = 0, end = ARRAY_SIZE(modules) - 1; start < end; ){
229*d83cc019SAndroid Build Coastguard Worker 		int mid = start + (end - start) / 2;
230*d83cc019SAndroid Build Coastguard Worker 		int ret = strcmp(modules[mid].module, dev_name);
231*d83cc019SAndroid Build Coastguard Worker 		if (ret < 0) {
232*d83cc019SAndroid Build Coastguard Worker 			start = mid + 1;
233*d83cc019SAndroid Build Coastguard Worker 		} else if (ret > 0) {
234*d83cc019SAndroid Build Coastguard Worker 			end = mid;
235*d83cc019SAndroid Build Coastguard Worker 		} else {
236*d83cc019SAndroid Build Coastguard Worker 			chip = modules[mid].bit;
237*d83cc019SAndroid Build Coastguard Worker 			break;
238*d83cc019SAndroid Build Coastguard Worker 		}
239*d83cc019SAndroid Build Coastguard Worker 	}
240*d83cc019SAndroid Build Coastguard Worker 	if ((chipset & chip) == chip)
241*d83cc019SAndroid Build Coastguard Worker 		return fd;
242*d83cc019SAndroid Build Coastguard Worker 
243*d83cc019SAndroid Build Coastguard Worker err:
244*d83cc019SAndroid Build Coastguard Worker 	close(fd);
245*d83cc019SAndroid Build Coastguard Worker 	return -1;
246*d83cc019SAndroid Build Coastguard Worker }
247*d83cc019SAndroid Build Coastguard Worker 
__search_and_open(const char * base,int offset,unsigned int chipset)248*d83cc019SAndroid Build Coastguard Worker static int __search_and_open(const char *base, int offset, unsigned int chipset)
249*d83cc019SAndroid Build Coastguard Worker {
250*d83cc019SAndroid Build Coastguard Worker 	const char *forced;
251*d83cc019SAndroid Build Coastguard Worker 
252*d83cc019SAndroid Build Coastguard Worker 	forced = forced_driver();
253*d83cc019SAndroid Build Coastguard Worker 	if (forced)
254*d83cc019SAndroid Build Coastguard Worker 		igt_info("Force option used: Using driver %s\n", forced);
255*d83cc019SAndroid Build Coastguard Worker 
256*d83cc019SAndroid Build Coastguard Worker 	for (int i = 0; i < 16; i++) {
257*d83cc019SAndroid Build Coastguard Worker 		char name[80];
258*d83cc019SAndroid Build Coastguard Worker 		int fd;
259*d83cc019SAndroid Build Coastguard Worker 
260*d83cc019SAndroid Build Coastguard Worker 		sprintf(name, "%s%u", base, i + offset);
261*d83cc019SAndroid Build Coastguard Worker 		fd = open_device(name, chipset);
262*d83cc019SAndroid Build Coastguard Worker 		if (fd != -1)
263*d83cc019SAndroid Build Coastguard Worker 			return fd;
264*d83cc019SAndroid Build Coastguard Worker 	}
265*d83cc019SAndroid Build Coastguard Worker 
266*d83cc019SAndroid Build Coastguard Worker 	return -1;
267*d83cc019SAndroid Build Coastguard Worker }
268*d83cc019SAndroid Build Coastguard Worker 
__open_driver(const char * base,int offset,unsigned int chipset)269*d83cc019SAndroid Build Coastguard Worker static int __open_driver(const char *base, int offset, unsigned int chipset)
270*d83cc019SAndroid Build Coastguard Worker {
271*d83cc019SAndroid Build Coastguard Worker 	static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
272*d83cc019SAndroid Build Coastguard Worker 	int fd;
273*d83cc019SAndroid Build Coastguard Worker 
274*d83cc019SAndroid Build Coastguard Worker 	fd = __search_and_open(base, offset, chipset);
275*d83cc019SAndroid Build Coastguard Worker 	if (fd != -1)
276*d83cc019SAndroid Build Coastguard Worker 		return fd;
277*d83cc019SAndroid Build Coastguard Worker 
278*d83cc019SAndroid Build Coastguard Worker 	pthread_mutex_lock(&mutex);
279*d83cc019SAndroid Build Coastguard Worker 	for (const struct module *m = modules; m->module; m++) {
280*d83cc019SAndroid Build Coastguard Worker 		if (chipset & m->bit) {
281*d83cc019SAndroid Build Coastguard Worker 			if (m->modprobe)
282*d83cc019SAndroid Build Coastguard Worker 				m->modprobe(m->module);
283*d83cc019SAndroid Build Coastguard Worker 			else
284*d83cc019SAndroid Build Coastguard Worker 				modprobe(m->module);
285*d83cc019SAndroid Build Coastguard Worker 		}
286*d83cc019SAndroid Build Coastguard Worker 	}
287*d83cc019SAndroid Build Coastguard Worker 	pthread_mutex_unlock(&mutex);
288*d83cc019SAndroid Build Coastguard Worker 
289*d83cc019SAndroid Build Coastguard Worker 	return __search_and_open(base, offset, chipset);
290*d83cc019SAndroid Build Coastguard Worker }
291*d83cc019SAndroid Build Coastguard Worker 
292*d83cc019SAndroid Build Coastguard Worker /**
293*d83cc019SAndroid Build Coastguard Worker  * __drm_open_driver:
294*d83cc019SAndroid Build Coastguard Worker  * @chipset: OR'd flags for each chipset to search, eg. #DRIVER_INTEL
295*d83cc019SAndroid Build Coastguard Worker  *
296*d83cc019SAndroid Build Coastguard Worker  * Open the first DRM device we can find, searching up to 16 device nodes
297*d83cc019SAndroid Build Coastguard Worker  *
298*d83cc019SAndroid Build Coastguard Worker  * Returns:
299*d83cc019SAndroid Build Coastguard Worker  * An open DRM fd or -1 on error
300*d83cc019SAndroid Build Coastguard Worker  */
__drm_open_driver(int chipset)301*d83cc019SAndroid Build Coastguard Worker int __drm_open_driver(int chipset)
302*d83cc019SAndroid Build Coastguard Worker {
303*d83cc019SAndroid Build Coastguard Worker 	return __open_driver("/dev/dri/card", 0, chipset);
304*d83cc019SAndroid Build Coastguard Worker }
305*d83cc019SAndroid Build Coastguard Worker 
__drm_open_driver_render(int chipset)306*d83cc019SAndroid Build Coastguard Worker static int __drm_open_driver_render(int chipset)
307*d83cc019SAndroid Build Coastguard Worker {
308*d83cc019SAndroid Build Coastguard Worker 	return __open_driver("/dev/dri/renderD", 128, chipset);
309*d83cc019SAndroid Build Coastguard Worker }
310*d83cc019SAndroid Build Coastguard Worker 
311*d83cc019SAndroid Build Coastguard Worker static int at_exit_drm_fd = -1;
312*d83cc019SAndroid Build Coastguard Worker static int at_exit_drm_render_fd = -1;
313*d83cc019SAndroid Build Coastguard Worker 
__cancel_work_at_exit(int fd)314*d83cc019SAndroid Build Coastguard Worker static void __cancel_work_at_exit(int fd)
315*d83cc019SAndroid Build Coastguard Worker {
316*d83cc019SAndroid Build Coastguard Worker 	igt_terminate_spins(); /* for older kernels */
317*d83cc019SAndroid Build Coastguard Worker 
318*d83cc019SAndroid Build Coastguard Worker 	igt_sysfs_set_parameter(fd, "reset", "%x", -1u /* any method */);
319*d83cc019SAndroid Build Coastguard Worker 	igt_drop_caches_set(fd,
320*d83cc019SAndroid Build Coastguard Worker 			    /* cancel everything */
321*d83cc019SAndroid Build Coastguard Worker 			    DROP_RESET_ACTIVE | DROP_RESET_SEQNO |
322*d83cc019SAndroid Build Coastguard Worker 			    /* cleanup */
323*d83cc019SAndroid Build Coastguard Worker 			    DROP_ACTIVE | DROP_RETIRE | DROP_IDLE | DROP_FREED);
324*d83cc019SAndroid Build Coastguard Worker }
325*d83cc019SAndroid Build Coastguard Worker 
cancel_work_at_exit(int sig)326*d83cc019SAndroid Build Coastguard Worker static void cancel_work_at_exit(int sig)
327*d83cc019SAndroid Build Coastguard Worker {
328*d83cc019SAndroid Build Coastguard Worker 	if (at_exit_drm_fd < 0)
329*d83cc019SAndroid Build Coastguard Worker 		return;
330*d83cc019SAndroid Build Coastguard Worker 
331*d83cc019SAndroid Build Coastguard Worker 	__cancel_work_at_exit(at_exit_drm_fd);
332*d83cc019SAndroid Build Coastguard Worker 
333*d83cc019SAndroid Build Coastguard Worker 	close(at_exit_drm_fd);
334*d83cc019SAndroid Build Coastguard Worker 	at_exit_drm_fd = -1;
335*d83cc019SAndroid Build Coastguard Worker }
336*d83cc019SAndroid Build Coastguard Worker 
cancel_work_at_exit_render(int sig)337*d83cc019SAndroid Build Coastguard Worker static void cancel_work_at_exit_render(int sig)
338*d83cc019SAndroid Build Coastguard Worker {
339*d83cc019SAndroid Build Coastguard Worker 	if (at_exit_drm_render_fd < 0)
340*d83cc019SAndroid Build Coastguard Worker 		return;
341*d83cc019SAndroid Build Coastguard Worker 
342*d83cc019SAndroid Build Coastguard Worker 	__cancel_work_at_exit(at_exit_drm_render_fd);
343*d83cc019SAndroid Build Coastguard Worker 
344*d83cc019SAndroid Build Coastguard Worker 	close(at_exit_drm_render_fd);
345*d83cc019SAndroid Build Coastguard Worker 	at_exit_drm_render_fd = -1;
346*d83cc019SAndroid Build Coastguard Worker }
347*d83cc019SAndroid Build Coastguard Worker 
chipset_to_str(int chipset)348*d83cc019SAndroid Build Coastguard Worker static const char *chipset_to_str(int chipset)
349*d83cc019SAndroid Build Coastguard Worker {
350*d83cc019SAndroid Build Coastguard Worker 	switch (chipset) {
351*d83cc019SAndroid Build Coastguard Worker 	case DRIVER_INTEL:
352*d83cc019SAndroid Build Coastguard Worker 		return "intel";
353*d83cc019SAndroid Build Coastguard Worker 	case DRIVER_V3D:
354*d83cc019SAndroid Build Coastguard Worker 		return "v3d";
355*d83cc019SAndroid Build Coastguard Worker 	case DRIVER_VC4:
356*d83cc019SAndroid Build Coastguard Worker 		return "vc4";
357*d83cc019SAndroid Build Coastguard Worker 	case DRIVER_VGEM:
358*d83cc019SAndroid Build Coastguard Worker 		return "vgem";
359*d83cc019SAndroid Build Coastguard Worker 	case DRIVER_AMDGPU:
360*d83cc019SAndroid Build Coastguard Worker 		return "amdgpu";
361*d83cc019SAndroid Build Coastguard Worker 	case DRIVER_PANFROST:
362*d83cc019SAndroid Build Coastguard Worker 		return "panfrost";
363*d83cc019SAndroid Build Coastguard Worker 	case DRIVER_ANY:
364*d83cc019SAndroid Build Coastguard Worker 		return "any";
365*d83cc019SAndroid Build Coastguard Worker 	default:
366*d83cc019SAndroid Build Coastguard Worker 		return "other";
367*d83cc019SAndroid Build Coastguard Worker 	}
368*d83cc019SAndroid Build Coastguard Worker }
369*d83cc019SAndroid Build Coastguard Worker 
370*d83cc019SAndroid Build Coastguard Worker /**
371*d83cc019SAndroid Build Coastguard Worker  * drm_open_driver:
372*d83cc019SAndroid Build Coastguard Worker  * @chipset: OR'd flags for each chipset to search, eg. #DRIVER_INTEL
373*d83cc019SAndroid Build Coastguard Worker  *
374*d83cc019SAndroid Build Coastguard Worker  * Open a drm legacy device node. This function always returns a valid
375*d83cc019SAndroid Build Coastguard Worker  * file descriptor.
376*d83cc019SAndroid Build Coastguard Worker  *
377*d83cc019SAndroid Build Coastguard Worker  * Returns: a drm file descriptor
378*d83cc019SAndroid Build Coastguard Worker  */
drm_open_driver(int chipset)379*d83cc019SAndroid Build Coastguard Worker int drm_open_driver(int chipset)
380*d83cc019SAndroid Build Coastguard Worker {
381*d83cc019SAndroid Build Coastguard Worker 	static int open_count;
382*d83cc019SAndroid Build Coastguard Worker 	int fd;
383*d83cc019SAndroid Build Coastguard Worker 
384*d83cc019SAndroid Build Coastguard Worker 	fd = __drm_open_driver(chipset);
385*d83cc019SAndroid Build Coastguard Worker 	igt_skip_on_f(fd<0, "No known gpu found for chipset flags 0x%u (%s)\n",
386*d83cc019SAndroid Build Coastguard Worker 		      chipset, chipset_to_str(chipset));
387*d83cc019SAndroid Build Coastguard Worker 
388*d83cc019SAndroid Build Coastguard Worker 	/* For i915, at least, we ensure that the driver is idle before
389*d83cc019SAndroid Build Coastguard Worker 	 * starting a test and we install an exit handler to wait until
390*d83cc019SAndroid Build Coastguard Worker 	 * idle before quitting.
391*d83cc019SAndroid Build Coastguard Worker 	 */
392*d83cc019SAndroid Build Coastguard Worker 	if (is_i915_device(fd)) {
393*d83cc019SAndroid Build Coastguard Worker 		if (__sync_fetch_and_add(&open_count, 1) == 0) {
394*d83cc019SAndroid Build Coastguard Worker 			gem_quiescent_gpu(fd);
395*d83cc019SAndroid Build Coastguard Worker 
396*d83cc019SAndroid Build Coastguard Worker 			at_exit_drm_fd = __drm_open_driver(chipset);
397*d83cc019SAndroid Build Coastguard Worker 			igt_install_exit_handler(cancel_work_at_exit);
398*d83cc019SAndroid Build Coastguard Worker 		}
399*d83cc019SAndroid Build Coastguard Worker 	}
400*d83cc019SAndroid Build Coastguard Worker 
401*d83cc019SAndroid Build Coastguard Worker 	return fd;
402*d83cc019SAndroid Build Coastguard Worker }
403*d83cc019SAndroid Build Coastguard Worker 
404*d83cc019SAndroid Build Coastguard Worker /**
405*d83cc019SAndroid Build Coastguard Worker  * drm_open_driver_master:
406*d83cc019SAndroid Build Coastguard Worker  * @chipset: OR'd flags for each chipset to search, eg. #DRIVER_INTEL
407*d83cc019SAndroid Build Coastguard Worker  *
408*d83cc019SAndroid Build Coastguard Worker  * Open a drm legacy device node and ensure that it is drm master.
409*d83cc019SAndroid Build Coastguard Worker  *
410*d83cc019SAndroid Build Coastguard Worker  * Returns:
411*d83cc019SAndroid Build Coastguard Worker  * The drm file descriptor or -1 on error
412*d83cc019SAndroid Build Coastguard Worker  */
drm_open_driver_master(int chipset)413*d83cc019SAndroid Build Coastguard Worker int drm_open_driver_master(int chipset)
414*d83cc019SAndroid Build Coastguard Worker {
415*d83cc019SAndroid Build Coastguard Worker 	int fd = drm_open_driver(chipset);
416*d83cc019SAndroid Build Coastguard Worker 
417*d83cc019SAndroid Build Coastguard Worker 	igt_device_set_master(fd);
418*d83cc019SAndroid Build Coastguard Worker 
419*d83cc019SAndroid Build Coastguard Worker 	return fd;
420*d83cc019SAndroid Build Coastguard Worker }
421*d83cc019SAndroid Build Coastguard Worker 
422*d83cc019SAndroid Build Coastguard Worker /**
423*d83cc019SAndroid Build Coastguard Worker  * drm_open_driver_render:
424*d83cc019SAndroid Build Coastguard Worker  * @chipset: OR'd flags for each chipset to search, eg. #DRIVER_INTEL
425*d83cc019SAndroid Build Coastguard Worker  *
426*d83cc019SAndroid Build Coastguard Worker  * Open a drm render device node.
427*d83cc019SAndroid Build Coastguard Worker  *
428*d83cc019SAndroid Build Coastguard Worker  * Returns:
429*d83cc019SAndroid Build Coastguard Worker  * The drm file descriptor or -1 on error
430*d83cc019SAndroid Build Coastguard Worker  */
drm_open_driver_render(int chipset)431*d83cc019SAndroid Build Coastguard Worker int drm_open_driver_render(int chipset)
432*d83cc019SAndroid Build Coastguard Worker {
433*d83cc019SAndroid Build Coastguard Worker 	static int open_count;
434*d83cc019SAndroid Build Coastguard Worker 	int fd = __drm_open_driver_render(chipset);
435*d83cc019SAndroid Build Coastguard Worker 
436*d83cc019SAndroid Build Coastguard Worker 	/* no render nodes, fallback to drm_open_driver() */
437*d83cc019SAndroid Build Coastguard Worker 	if (fd == -1)
438*d83cc019SAndroid Build Coastguard Worker 		return drm_open_driver(chipset);
439*d83cc019SAndroid Build Coastguard Worker 
440*d83cc019SAndroid Build Coastguard Worker 	if (__sync_fetch_and_add(&open_count, 1))
441*d83cc019SAndroid Build Coastguard Worker 		return fd;
442*d83cc019SAndroid Build Coastguard Worker 
443*d83cc019SAndroid Build Coastguard Worker 	at_exit_drm_render_fd = __drm_open_driver(chipset);
444*d83cc019SAndroid Build Coastguard Worker 	if(chipset & DRIVER_INTEL){
445*d83cc019SAndroid Build Coastguard Worker 		gem_quiescent_gpu(fd);
446*d83cc019SAndroid Build Coastguard Worker 		igt_install_exit_handler(cancel_work_at_exit_render);
447*d83cc019SAndroid Build Coastguard Worker 	}
448*d83cc019SAndroid Build Coastguard Worker 
449*d83cc019SAndroid Build Coastguard Worker 	return fd;
450*d83cc019SAndroid Build Coastguard Worker }
451*d83cc019SAndroid Build Coastguard Worker 
igt_require_amdgpu(int fd)452*d83cc019SAndroid Build Coastguard Worker void igt_require_amdgpu(int fd)
453*d83cc019SAndroid Build Coastguard Worker {
454*d83cc019SAndroid Build Coastguard Worker 	igt_require(is_amdgpu_device(fd));
455*d83cc019SAndroid Build Coastguard Worker }
456*d83cc019SAndroid Build Coastguard Worker 
igt_require_intel(int fd)457*d83cc019SAndroid Build Coastguard Worker void igt_require_intel(int fd)
458*d83cc019SAndroid Build Coastguard Worker {
459*d83cc019SAndroid Build Coastguard Worker 	igt_require(is_i915_device(fd) && has_known_intel_chipset(fd));
460*d83cc019SAndroid Build Coastguard Worker }
461*d83cc019SAndroid Build Coastguard Worker 
igt_require_vc4(int fd)462*d83cc019SAndroid Build Coastguard Worker void igt_require_vc4(int fd)
463*d83cc019SAndroid Build Coastguard Worker {
464*d83cc019SAndroid Build Coastguard Worker 	igt_require(is_vc4_device(fd));
465*d83cc019SAndroid Build Coastguard Worker }
466