xref: /aosp_15_r20/external/igt-gpu-tools/lib/igt_debugfs.c (revision d83cc019efdc2edc6c4b16e9034a3ceb8d35d77c)
1*d83cc019SAndroid Build Coastguard Worker /*
2*d83cc019SAndroid Build Coastguard Worker  * Copyright © 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  */
24*d83cc019SAndroid Build Coastguard Worker 
25*d83cc019SAndroid Build Coastguard Worker #include <inttypes.h>
26*d83cc019SAndroid Build Coastguard Worker #include <sys/stat.h>
27*d83cc019SAndroid Build Coastguard Worker #include <sys/mount.h>
28*d83cc019SAndroid Build Coastguard Worker #include <sys/sysmacros.h>
29*d83cc019SAndroid Build Coastguard Worker #include <dirent.h>
30*d83cc019SAndroid Build Coastguard Worker #include <errno.h>
31*d83cc019SAndroid Build Coastguard Worker #include <stdio.h>
32*d83cc019SAndroid Build Coastguard Worker #include <stdlib.h>
33*d83cc019SAndroid Build Coastguard Worker #include <limits.h>
34*d83cc019SAndroid Build Coastguard Worker #include <string.h>
35*d83cc019SAndroid Build Coastguard Worker #include <fcntl.h>
36*d83cc019SAndroid Build Coastguard Worker #include <unistd.h>
37*d83cc019SAndroid Build Coastguard Worker #include <i915_drm.h>
38*d83cc019SAndroid Build Coastguard Worker #include <poll.h>
39*d83cc019SAndroid Build Coastguard Worker 
40*d83cc019SAndroid Build Coastguard Worker #include "drmtest.h"
41*d83cc019SAndroid Build Coastguard Worker #include "igt_aux.h"
42*d83cc019SAndroid Build Coastguard Worker #include "igt_kms.h"
43*d83cc019SAndroid Build Coastguard Worker #include "igt_debugfs.h"
44*d83cc019SAndroid Build Coastguard Worker #include "igt_sysfs.h"
45*d83cc019SAndroid Build Coastguard Worker 
46*d83cc019SAndroid Build Coastguard Worker /**
47*d83cc019SAndroid Build Coastguard Worker  * SECTION:igt_debugfs
48*d83cc019SAndroid Build Coastguard Worker  * @short_description: Support code for debugfs features
49*d83cc019SAndroid Build Coastguard Worker  * @title: debugfs
50*d83cc019SAndroid Build Coastguard Worker  * @include: igt.h
51*d83cc019SAndroid Build Coastguard Worker  *
52*d83cc019SAndroid Build Coastguard Worker  * This library provides helpers to access debugfs features. On top of some
53*d83cc019SAndroid Build Coastguard Worker  * basic functions to access debugfs files with e.g. igt_debugfs_open() it also
54*d83cc019SAndroid Build Coastguard Worker  * provides higher-level wrappers for some debugfs features.
55*d83cc019SAndroid Build Coastguard Worker  *
56*d83cc019SAndroid Build Coastguard Worker  * # Pipe CRC Support
57*d83cc019SAndroid Build Coastguard Worker  *
58*d83cc019SAndroid Build Coastguard Worker  * This library wraps up the kernel's support for capturing pipe CRCs into a
59*d83cc019SAndroid Build Coastguard Worker  * neat and tidy package. For the detailed usage see all the functions which
60*d83cc019SAndroid Build Coastguard Worker  * work on #igt_pipe_crc_t. This is supported on all platforms and outputs.
61*d83cc019SAndroid Build Coastguard Worker  *
62*d83cc019SAndroid Build Coastguard Worker  * Actually using pipe CRCs to write modeset tests is a bit tricky though, so
63*d83cc019SAndroid Build Coastguard Worker  * there is no way to directly check a CRC: Both the details of the plane
64*d83cc019SAndroid Build Coastguard Worker  * blending, color correction and other hardware and how exactly the CRC is
65*d83cc019SAndroid Build Coastguard Worker  * computed at each tap point vary by hardware generation and are not disclosed.
66*d83cc019SAndroid Build Coastguard Worker  *
67*d83cc019SAndroid Build Coastguard Worker  * The only way to use #igt_crc_t CRCs therefore is to compare CRCs among each
68*d83cc019SAndroid Build Coastguard Worker  * another either for equality or difference. Otherwise CRCs must be treated as
69*d83cc019SAndroid Build Coastguard Worker  * completely opaque values. Note that not even CRCs from different pipes or tap
70*d83cc019SAndroid Build Coastguard Worker  * points on the same platform can be compared. Hence only use
71*d83cc019SAndroid Build Coastguard Worker  * igt_assert_crc_equal() to inspect CRC values captured by the same
72*d83cc019SAndroid Build Coastguard Worker  * #igt_pipe_crc_t object.
73*d83cc019SAndroid Build Coastguard Worker  *
74*d83cc019SAndroid Build Coastguard Worker  * # Other debugfs interface wrappers
75*d83cc019SAndroid Build Coastguard Worker  *
76*d83cc019SAndroid Build Coastguard Worker  * This covers the miscellaneous debugfs interface wrappers:
77*d83cc019SAndroid Build Coastguard Worker  *
78*d83cc019SAndroid Build Coastguard Worker  * - drm/i915 supports interfaces to evict certain classes of gem buffer
79*d83cc019SAndroid Build Coastguard Worker  *   objects, see igt_drop_caches_set().
80*d83cc019SAndroid Build Coastguard Worker  *
81*d83cc019SAndroid Build Coastguard Worker  * - drm/i915 supports an interface to disable prefaulting, useful to test
82*d83cc019SAndroid Build Coastguard Worker  *   slow paths in ioctls. See igt_disable_prefault().
83*d83cc019SAndroid Build Coastguard Worker  */
84*d83cc019SAndroid Build Coastguard Worker 
85*d83cc019SAndroid Build Coastguard Worker /*
86*d83cc019SAndroid Build Coastguard Worker  * General debugfs helpers
87*d83cc019SAndroid Build Coastguard Worker  */
88*d83cc019SAndroid Build Coastguard Worker 
is_mountpoint(const char * path)89*d83cc019SAndroid Build Coastguard Worker static bool is_mountpoint(const char *path)
90*d83cc019SAndroid Build Coastguard Worker {
91*d83cc019SAndroid Build Coastguard Worker 	char buf[strlen(path) + 4];
92*d83cc019SAndroid Build Coastguard Worker 	struct stat st;
93*d83cc019SAndroid Build Coastguard Worker 	dev_t dev;
94*d83cc019SAndroid Build Coastguard Worker 
95*d83cc019SAndroid Build Coastguard Worker 	igt_assert_lt(snprintf(buf, sizeof(buf), "%s/.", path), sizeof(buf));
96*d83cc019SAndroid Build Coastguard Worker 	if (stat(buf, &st))
97*d83cc019SAndroid Build Coastguard Worker 		return false;
98*d83cc019SAndroid Build Coastguard Worker 
99*d83cc019SAndroid Build Coastguard Worker 	if (!S_ISDIR(st.st_mode))
100*d83cc019SAndroid Build Coastguard Worker 		return false;
101*d83cc019SAndroid Build Coastguard Worker 
102*d83cc019SAndroid Build Coastguard Worker 	dev = st.st_dev;
103*d83cc019SAndroid Build Coastguard Worker 
104*d83cc019SAndroid Build Coastguard Worker 	igt_assert_lt(snprintf(buf, sizeof(buf), "%s/..", path), sizeof(buf));
105*d83cc019SAndroid Build Coastguard Worker 	if (stat(buf, &st))
106*d83cc019SAndroid Build Coastguard Worker 		return false;
107*d83cc019SAndroid Build Coastguard Worker 
108*d83cc019SAndroid Build Coastguard Worker 	if (!S_ISDIR(st.st_mode))
109*d83cc019SAndroid Build Coastguard Worker 		return false;
110*d83cc019SAndroid Build Coastguard Worker 
111*d83cc019SAndroid Build Coastguard Worker 	return dev != st.st_dev;
112*d83cc019SAndroid Build Coastguard Worker }
113*d83cc019SAndroid Build Coastguard Worker 
__igt_debugfs_mount(void)114*d83cc019SAndroid Build Coastguard Worker static const char *__igt_debugfs_mount(void)
115*d83cc019SAndroid Build Coastguard Worker {
116*d83cc019SAndroid Build Coastguard Worker 	if (is_mountpoint("/sys/kernel/debug"))
117*d83cc019SAndroid Build Coastguard Worker 		return "/sys/kernel/debug";
118*d83cc019SAndroid Build Coastguard Worker 
119*d83cc019SAndroid Build Coastguard Worker 	if (is_mountpoint("/debug"))
120*d83cc019SAndroid Build Coastguard Worker 		return "/debug";
121*d83cc019SAndroid Build Coastguard Worker 
122*d83cc019SAndroid Build Coastguard Worker 	if (mount("debug", "/sys/kernel/debug", "debugfs", 0, 0))
123*d83cc019SAndroid Build Coastguard Worker 		return NULL;
124*d83cc019SAndroid Build Coastguard Worker 
125*d83cc019SAndroid Build Coastguard Worker 	return "/sys/kernel/debug";
126*d83cc019SAndroid Build Coastguard Worker }
127*d83cc019SAndroid Build Coastguard Worker 
128*d83cc019SAndroid Build Coastguard Worker /**
129*d83cc019SAndroid Build Coastguard Worker  * igt_debugfs_mount:
130*d83cc019SAndroid Build Coastguard Worker  *
131*d83cc019SAndroid Build Coastguard Worker  * This attempts to locate where debugfs is mounted on the filesystem,
132*d83cc019SAndroid Build Coastguard Worker  * and if not found, will then try to mount debugfs at /sys/kernel/debug.
133*d83cc019SAndroid Build Coastguard Worker  *
134*d83cc019SAndroid Build Coastguard Worker  * Returns:
135*d83cc019SAndroid Build Coastguard Worker  * The path to the debugfs mount point (e.g. /sys/kernel/debug)
136*d83cc019SAndroid Build Coastguard Worker  */
igt_debugfs_mount(void)137*d83cc019SAndroid Build Coastguard Worker const char *igt_debugfs_mount(void)
138*d83cc019SAndroid Build Coastguard Worker {
139*d83cc019SAndroid Build Coastguard Worker 	static const char *path;
140*d83cc019SAndroid Build Coastguard Worker 
141*d83cc019SAndroid Build Coastguard Worker 	if (!path)
142*d83cc019SAndroid Build Coastguard Worker 		path = __igt_debugfs_mount();
143*d83cc019SAndroid Build Coastguard Worker 
144*d83cc019SAndroid Build Coastguard Worker 	return path;
145*d83cc019SAndroid Build Coastguard Worker }
146*d83cc019SAndroid Build Coastguard Worker 
147*d83cc019SAndroid Build Coastguard Worker /**
148*d83cc019SAndroid Build Coastguard Worker  * igt_debugfs_path:
149*d83cc019SAndroid Build Coastguard Worker  * @device: fd of the device
150*d83cc019SAndroid Build Coastguard Worker  * @path: buffer to store path
151*d83cc019SAndroid Build Coastguard Worker  * @pathlen: len of @path buffer.
152*d83cc019SAndroid Build Coastguard Worker  *
153*d83cc019SAndroid Build Coastguard Worker  * This finds the debugfs directory corresponding to @device.
154*d83cc019SAndroid Build Coastguard Worker  *
155*d83cc019SAndroid Build Coastguard Worker  * Returns:
156*d83cc019SAndroid Build Coastguard Worker  * The directory path, or NULL on failure.
157*d83cc019SAndroid Build Coastguard Worker  */
igt_debugfs_path(int device,char * path,int pathlen)158*d83cc019SAndroid Build Coastguard Worker char *igt_debugfs_path(int device, char *path, int pathlen)
159*d83cc019SAndroid Build Coastguard Worker {
160*d83cc019SAndroid Build Coastguard Worker 	struct stat st;
161*d83cc019SAndroid Build Coastguard Worker 	const char *debugfs_root;
162*d83cc019SAndroid Build Coastguard Worker 	int idx;
163*d83cc019SAndroid Build Coastguard Worker 
164*d83cc019SAndroid Build Coastguard Worker 	debugfs_root = igt_debugfs_mount();
165*d83cc019SAndroid Build Coastguard Worker 	igt_assert(debugfs_root);
166*d83cc019SAndroid Build Coastguard Worker 
167*d83cc019SAndroid Build Coastguard Worker 	memset(&st, 0, sizeof(st));
168*d83cc019SAndroid Build Coastguard Worker 	if (device != -1) { /* if no fd, we presume we want dri/0 */
169*d83cc019SAndroid Build Coastguard Worker 		if (fstat(device, &st)) {
170*d83cc019SAndroid Build Coastguard Worker 			igt_debug("Couldn't stat FD for DRM device: %m\n");
171*d83cc019SAndroid Build Coastguard Worker 			return NULL;
172*d83cc019SAndroid Build Coastguard Worker 		}
173*d83cc019SAndroid Build Coastguard Worker 
174*d83cc019SAndroid Build Coastguard Worker 		if (!S_ISCHR(st.st_mode)) {
175*d83cc019SAndroid Build Coastguard Worker 			igt_debug("FD for DRM device not a char device!\n");
176*d83cc019SAndroid Build Coastguard Worker 			return NULL;
177*d83cc019SAndroid Build Coastguard Worker 		}
178*d83cc019SAndroid Build Coastguard Worker 	}
179*d83cc019SAndroid Build Coastguard Worker 
180*d83cc019SAndroid Build Coastguard Worker 	idx = minor(st.st_rdev);
181*d83cc019SAndroid Build Coastguard Worker 	snprintf(path, pathlen, "%s/dri/%d/name", debugfs_root, idx);
182*d83cc019SAndroid Build Coastguard Worker 	if (stat(path, &st))
183*d83cc019SAndroid Build Coastguard Worker 		return NULL;
184*d83cc019SAndroid Build Coastguard Worker 
185*d83cc019SAndroid Build Coastguard Worker 	if (idx >= 64) {
186*d83cc019SAndroid Build Coastguard Worker 		int file, name_len, cmp_len;
187*d83cc019SAndroid Build Coastguard Worker 		char name[100], cmp[100];
188*d83cc019SAndroid Build Coastguard Worker 
189*d83cc019SAndroid Build Coastguard Worker 		file = open(path, O_RDONLY);
190*d83cc019SAndroid Build Coastguard Worker 		if (file < 0)
191*d83cc019SAndroid Build Coastguard Worker 			return NULL;
192*d83cc019SAndroid Build Coastguard Worker 
193*d83cc019SAndroid Build Coastguard Worker 		name_len = read(file, name, sizeof(name));
194*d83cc019SAndroid Build Coastguard Worker 		close(file);
195*d83cc019SAndroid Build Coastguard Worker 
196*d83cc019SAndroid Build Coastguard Worker 		for (idx = 0; idx < 16; idx++) {
197*d83cc019SAndroid Build Coastguard Worker 			snprintf(path, pathlen, "%s/dri/%d/name",
198*d83cc019SAndroid Build Coastguard Worker 				 debugfs_root, idx);
199*d83cc019SAndroid Build Coastguard Worker 			file = open(path, O_RDONLY);
200*d83cc019SAndroid Build Coastguard Worker 			if (file < 0)
201*d83cc019SAndroid Build Coastguard Worker 				return NULL;
202*d83cc019SAndroid Build Coastguard Worker 
203*d83cc019SAndroid Build Coastguard Worker 			cmp_len = read(file, cmp, sizeof(cmp));
204*d83cc019SAndroid Build Coastguard Worker 			close(file);
205*d83cc019SAndroid Build Coastguard Worker 
206*d83cc019SAndroid Build Coastguard Worker 			if (cmp_len == name_len && !memcmp(cmp, name, name_len))
207*d83cc019SAndroid Build Coastguard Worker 				break;
208*d83cc019SAndroid Build Coastguard Worker 		}
209*d83cc019SAndroid Build Coastguard Worker 
210*d83cc019SAndroid Build Coastguard Worker 		if (idx == 16)
211*d83cc019SAndroid Build Coastguard Worker 			return NULL;
212*d83cc019SAndroid Build Coastguard Worker 	}
213*d83cc019SAndroid Build Coastguard Worker 
214*d83cc019SAndroid Build Coastguard Worker 	snprintf(path, pathlen, "%s/dri/%d", debugfs_root, idx);
215*d83cc019SAndroid Build Coastguard Worker 	return path;
216*d83cc019SAndroid Build Coastguard Worker }
217*d83cc019SAndroid Build Coastguard Worker 
218*d83cc019SAndroid Build Coastguard Worker /**
219*d83cc019SAndroid Build Coastguard Worker  * igt_debugfs_dir:
220*d83cc019SAndroid Build Coastguard Worker  * @device: fd of the device
221*d83cc019SAndroid Build Coastguard Worker  *
222*d83cc019SAndroid Build Coastguard Worker  * This opens the debugfs directory corresponding to device for use
223*d83cc019SAndroid Build Coastguard Worker  * with igt_sysfs_get() and related functions.
224*d83cc019SAndroid Build Coastguard Worker  *
225*d83cc019SAndroid Build Coastguard Worker  * Returns:
226*d83cc019SAndroid Build Coastguard Worker  * The directory fd, or -1 on failure.
227*d83cc019SAndroid Build Coastguard Worker  */
igt_debugfs_dir(int device)228*d83cc019SAndroid Build Coastguard Worker int igt_debugfs_dir(int device)
229*d83cc019SAndroid Build Coastguard Worker {
230*d83cc019SAndroid Build Coastguard Worker 	char path[200];
231*d83cc019SAndroid Build Coastguard Worker 
232*d83cc019SAndroid Build Coastguard Worker 	if (!igt_debugfs_path(device, path, sizeof(path)))
233*d83cc019SAndroid Build Coastguard Worker 		return -1;
234*d83cc019SAndroid Build Coastguard Worker 
235*d83cc019SAndroid Build Coastguard Worker 	igt_debug("Opening debugfs directory '%s'\n", path);
236*d83cc019SAndroid Build Coastguard Worker 	return open(path, O_RDONLY);
237*d83cc019SAndroid Build Coastguard Worker }
238*d83cc019SAndroid Build Coastguard Worker 
239*d83cc019SAndroid Build Coastguard Worker /**
240*d83cc019SAndroid Build Coastguard Worker  * igt_debugfs_connector_dir:
241*d83cc019SAndroid Build Coastguard Worker  * @device: fd of the device
242*d83cc019SAndroid Build Coastguard Worker  * @conn_name: conenctor name
243*d83cc019SAndroid Build Coastguard Worker  * @mode: mode bits as used by open()
244*d83cc019SAndroid Build Coastguard Worker  *
245*d83cc019SAndroid Build Coastguard Worker  * This opens the debugfs directory corresponding to connector on the device
246*d83cc019SAndroid Build Coastguard Worker  * for use with igt_sysfs_get() and related functions.
247*d83cc019SAndroid Build Coastguard Worker  *
248*d83cc019SAndroid Build Coastguard Worker  * Returns:
249*d83cc019SAndroid Build Coastguard Worker  * The directory fd, or -1 on failure.
250*d83cc019SAndroid Build Coastguard Worker  */
igt_debugfs_connector_dir(int device,char * conn_name,int mode)251*d83cc019SAndroid Build Coastguard Worker int igt_debugfs_connector_dir(int device, char *conn_name, int mode)
252*d83cc019SAndroid Build Coastguard Worker {
253*d83cc019SAndroid Build Coastguard Worker 	int dir, ret;
254*d83cc019SAndroid Build Coastguard Worker 
255*d83cc019SAndroid Build Coastguard Worker 	dir = igt_debugfs_dir(device);
256*d83cc019SAndroid Build Coastguard Worker 	if (dir < 0)
257*d83cc019SAndroid Build Coastguard Worker 		return dir;
258*d83cc019SAndroid Build Coastguard Worker 
259*d83cc019SAndroid Build Coastguard Worker 	ret = openat(dir, conn_name, mode);
260*d83cc019SAndroid Build Coastguard Worker 
261*d83cc019SAndroid Build Coastguard Worker 	close(dir);
262*d83cc019SAndroid Build Coastguard Worker 
263*d83cc019SAndroid Build Coastguard Worker 	return ret;
264*d83cc019SAndroid Build Coastguard Worker }
265*d83cc019SAndroid Build Coastguard Worker 
266*d83cc019SAndroid Build Coastguard Worker /**
267*d83cc019SAndroid Build Coastguard Worker  * igt_debugfs_open:
268*d83cc019SAndroid Build Coastguard Worker  * @filename: name of the debugfs node to open
269*d83cc019SAndroid Build Coastguard Worker  * @mode: mode bits as used by open()
270*d83cc019SAndroid Build Coastguard Worker  *
271*d83cc019SAndroid Build Coastguard Worker  * This opens a debugfs file as a Unix file descriptor. The filename should be
272*d83cc019SAndroid Build Coastguard Worker  * relative to the drm device's root, i.e. without "drm/$minor".
273*d83cc019SAndroid Build Coastguard Worker  *
274*d83cc019SAndroid Build Coastguard Worker  * Returns:
275*d83cc019SAndroid Build Coastguard Worker  * The Unix file descriptor for the debugfs file or -1 if that didn't work out.
276*d83cc019SAndroid Build Coastguard Worker  */
igt_debugfs_open(int device,const char * filename,int mode)277*d83cc019SAndroid Build Coastguard Worker int igt_debugfs_open(int device, const char *filename, int mode)
278*d83cc019SAndroid Build Coastguard Worker {
279*d83cc019SAndroid Build Coastguard Worker 	int dir, ret;
280*d83cc019SAndroid Build Coastguard Worker 
281*d83cc019SAndroid Build Coastguard Worker 	dir = igt_debugfs_dir(device);
282*d83cc019SAndroid Build Coastguard Worker 	if (dir < 0)
283*d83cc019SAndroid Build Coastguard Worker 		return dir;
284*d83cc019SAndroid Build Coastguard Worker 
285*d83cc019SAndroid Build Coastguard Worker 	ret = openat(dir, filename, mode);
286*d83cc019SAndroid Build Coastguard Worker 
287*d83cc019SAndroid Build Coastguard Worker 	close(dir);
288*d83cc019SAndroid Build Coastguard Worker 
289*d83cc019SAndroid Build Coastguard Worker 	return ret;
290*d83cc019SAndroid Build Coastguard Worker }
291*d83cc019SAndroid Build Coastguard Worker 
292*d83cc019SAndroid Build Coastguard Worker /**
293*d83cc019SAndroid Build Coastguard Worker  * igt_debugfs_simple_read:
294*d83cc019SAndroid Build Coastguard Worker  * @filename: file name
295*d83cc019SAndroid Build Coastguard Worker  * @buf: buffer where the contents will be stored, allocated by the caller
296*d83cc019SAndroid Build Coastguard Worker  * @size: size of the buffer
297*d83cc019SAndroid Build Coastguard Worker  *
298*d83cc019SAndroid Build Coastguard Worker  * This function is similar to __igt_debugfs_read, the difference is that it
299*d83cc019SAndroid Build Coastguard Worker  * expects the debugfs directory to be open and it's descriptor passed as the
300*d83cc019SAndroid Build Coastguard Worker  * first argument.
301*d83cc019SAndroid Build Coastguard Worker  *
302*d83cc019SAndroid Build Coastguard Worker  * Returns:
303*d83cc019SAndroid Build Coastguard Worker  * -errorno on failure or bytes read on success
304*d83cc019SAndroid Build Coastguard Worker  */
igt_debugfs_simple_read(int dir,const char * filename,char * buf,int size)305*d83cc019SAndroid Build Coastguard Worker int igt_debugfs_simple_read(int dir, const char *filename, char *buf, int size)
306*d83cc019SAndroid Build Coastguard Worker {
307*d83cc019SAndroid Build Coastguard Worker 	int len;
308*d83cc019SAndroid Build Coastguard Worker 
309*d83cc019SAndroid Build Coastguard Worker 	len = igt_sysfs_read(dir, filename, buf, size - 1);
310*d83cc019SAndroid Build Coastguard Worker 	if (len < 0)
311*d83cc019SAndroid Build Coastguard Worker 		buf[0] = '\0';
312*d83cc019SAndroid Build Coastguard Worker 	else
313*d83cc019SAndroid Build Coastguard Worker 		buf[len] = '\0';
314*d83cc019SAndroid Build Coastguard Worker 
315*d83cc019SAndroid Build Coastguard Worker 	return len;
316*d83cc019SAndroid Build Coastguard Worker }
317*d83cc019SAndroid Build Coastguard Worker 
318*d83cc019SAndroid Build Coastguard Worker /**
319*d83cc019SAndroid Build Coastguard Worker  * __igt_debugfs_read:
320*d83cc019SAndroid Build Coastguard Worker  * @filename: file name
321*d83cc019SAndroid Build Coastguard Worker  * @buf: buffer where the contents will be stored, allocated by the caller
322*d83cc019SAndroid Build Coastguard Worker  * @size: size of the buffer
323*d83cc019SAndroid Build Coastguard Worker  *
324*d83cc019SAndroid Build Coastguard Worker  * This function opens the debugfs file, reads it, stores the content in the
325*d83cc019SAndroid Build Coastguard Worker  * provided buffer, then closes the file. Users should make sure that the buffer
326*d83cc019SAndroid Build Coastguard Worker  * provided is big enough to fit the whole file, plus one byte.
327*d83cc019SAndroid Build Coastguard Worker  */
__igt_debugfs_read(int fd,const char * filename,char * buf,int size)328*d83cc019SAndroid Build Coastguard Worker void __igt_debugfs_read(int fd, const char *filename, char *buf, int size)
329*d83cc019SAndroid Build Coastguard Worker {
330*d83cc019SAndroid Build Coastguard Worker 	int dir = igt_debugfs_dir(fd);
331*d83cc019SAndroid Build Coastguard Worker 
332*d83cc019SAndroid Build Coastguard Worker 	igt_debugfs_simple_read(dir, filename, buf, size);
333*d83cc019SAndroid Build Coastguard Worker 	close(dir);
334*d83cc019SAndroid Build Coastguard Worker }
335*d83cc019SAndroid Build Coastguard Worker 
336*d83cc019SAndroid Build Coastguard Worker /**
337*d83cc019SAndroid Build Coastguard Worker  * igt_debugfs_search:
338*d83cc019SAndroid Build Coastguard Worker  * @filename: file name
339*d83cc019SAndroid Build Coastguard Worker  * @substring: string to search for in @filename
340*d83cc019SAndroid Build Coastguard Worker  *
341*d83cc019SAndroid Build Coastguard Worker  * Searches each line in @filename for the substring specified in @substring.
342*d83cc019SAndroid Build Coastguard Worker  *
343*d83cc019SAndroid Build Coastguard Worker  * Returns: True if the @substring is found to occur in @filename
344*d83cc019SAndroid Build Coastguard Worker  */
igt_debugfs_search(int device,const char * filename,const char * substring)345*d83cc019SAndroid Build Coastguard Worker bool igt_debugfs_search(int device, const char *filename, const char *substring)
346*d83cc019SAndroid Build Coastguard Worker {
347*d83cc019SAndroid Build Coastguard Worker 	FILE *file;
348*d83cc019SAndroid Build Coastguard Worker 	size_t n = 0;
349*d83cc019SAndroid Build Coastguard Worker 	char *line = NULL;
350*d83cc019SAndroid Build Coastguard Worker 	bool matched = false;
351*d83cc019SAndroid Build Coastguard Worker 	int fd;
352*d83cc019SAndroid Build Coastguard Worker 
353*d83cc019SAndroid Build Coastguard Worker 	fd = igt_debugfs_open(device, filename, O_RDONLY);
354*d83cc019SAndroid Build Coastguard Worker 	file = fdopen(fd, "r");
355*d83cc019SAndroid Build Coastguard Worker 	igt_assert(file);
356*d83cc019SAndroid Build Coastguard Worker 
357*d83cc019SAndroid Build Coastguard Worker 	while (getline(&line, &n, file) >= 0) {
358*d83cc019SAndroid Build Coastguard Worker 		matched = strstr(line, substring) != NULL;
359*d83cc019SAndroid Build Coastguard Worker 		if (matched)
360*d83cc019SAndroid Build Coastguard Worker 			break;
361*d83cc019SAndroid Build Coastguard Worker 	}
362*d83cc019SAndroid Build Coastguard Worker 
363*d83cc019SAndroid Build Coastguard Worker 	free(line);
364*d83cc019SAndroid Build Coastguard Worker 	fclose(file);
365*d83cc019SAndroid Build Coastguard Worker 	close(fd);
366*d83cc019SAndroid Build Coastguard Worker 
367*d83cc019SAndroid Build Coastguard Worker 	return matched;
368*d83cc019SAndroid Build Coastguard Worker }
369*d83cc019SAndroid Build Coastguard Worker 
370*d83cc019SAndroid Build Coastguard Worker /*
371*d83cc019SAndroid Build Coastguard Worker  * Pipe CRC
372*d83cc019SAndroid Build Coastguard Worker  */
373*d83cc019SAndroid Build Coastguard Worker 
igt_find_crc_mismatch(const igt_crc_t * a,const igt_crc_t * b,int * index)374*d83cc019SAndroid Build Coastguard Worker static bool igt_find_crc_mismatch(const igt_crc_t *a, const igt_crc_t *b,
375*d83cc019SAndroid Build Coastguard Worker 				  int *index)
376*d83cc019SAndroid Build Coastguard Worker {
377*d83cc019SAndroid Build Coastguard Worker 	int nwords = min(a->n_words, b->n_words);
378*d83cc019SAndroid Build Coastguard Worker 	int i;
379*d83cc019SAndroid Build Coastguard Worker 
380*d83cc019SAndroid Build Coastguard Worker 	for (i = 0; i < nwords; i++) {
381*d83cc019SAndroid Build Coastguard Worker 		if (a->crc[i] != b->crc[i]) {
382*d83cc019SAndroid Build Coastguard Worker 			if (index)
383*d83cc019SAndroid Build Coastguard Worker 				*index = i;
384*d83cc019SAndroid Build Coastguard Worker 
385*d83cc019SAndroid Build Coastguard Worker 			return true;
386*d83cc019SAndroid Build Coastguard Worker 		}
387*d83cc019SAndroid Build Coastguard Worker 	}
388*d83cc019SAndroid Build Coastguard Worker 
389*d83cc019SAndroid Build Coastguard Worker 	if (a->n_words != b->n_words) {
390*d83cc019SAndroid Build Coastguard Worker 		if (index)
391*d83cc019SAndroid Build Coastguard Worker 			*index = i;
392*d83cc019SAndroid Build Coastguard Worker 		return true;
393*d83cc019SAndroid Build Coastguard Worker 	}
394*d83cc019SAndroid Build Coastguard Worker 
395*d83cc019SAndroid Build Coastguard Worker 	return false;
396*d83cc019SAndroid Build Coastguard Worker }
397*d83cc019SAndroid Build Coastguard Worker 
398*d83cc019SAndroid Build Coastguard Worker /**
399*d83cc019SAndroid Build Coastguard Worker  * igt_assert_crc_equal:
400*d83cc019SAndroid Build Coastguard Worker  * @a: first pipe CRC value
401*d83cc019SAndroid Build Coastguard Worker  * @b: second pipe CRC value
402*d83cc019SAndroid Build Coastguard Worker  *
403*d83cc019SAndroid Build Coastguard Worker  * Compares two CRC values and fails the testcase if they don't match with
404*d83cc019SAndroid Build Coastguard Worker  * igt_fail(). Note that due to CRC collisions CRC based testcase can only
405*d83cc019SAndroid Build Coastguard Worker  * assert that CRCs match, never that they are different. Otherwise there might
406*d83cc019SAndroid Build Coastguard Worker  * be random testcase failures when different screen contents end up with the
407*d83cc019SAndroid Build Coastguard Worker  * same CRC by chance.
408*d83cc019SAndroid Build Coastguard Worker  *
409*d83cc019SAndroid Build Coastguard Worker  * Passing --skip-crc-compare on the command line will force this function
410*d83cc019SAndroid Build Coastguard Worker  * to always pass, which can be useful in interactive debugging where you
411*d83cc019SAndroid Build Coastguard Worker  * might know the test will fail, but still want the test to keep going as if
412*d83cc019SAndroid Build Coastguard Worker  * it had succeeded so that you can see the on-screen behavior.
413*d83cc019SAndroid Build Coastguard Worker  *
414*d83cc019SAndroid Build Coastguard Worker  */
igt_assert_crc_equal(const igt_crc_t * a,const igt_crc_t * b)415*d83cc019SAndroid Build Coastguard Worker void igt_assert_crc_equal(const igt_crc_t *a, const igt_crc_t *b)
416*d83cc019SAndroid Build Coastguard Worker {
417*d83cc019SAndroid Build Coastguard Worker 	int index;
418*d83cc019SAndroid Build Coastguard Worker 	bool mismatch;
419*d83cc019SAndroid Build Coastguard Worker 
420*d83cc019SAndroid Build Coastguard Worker 	mismatch = igt_find_crc_mismatch(a, b, &index);
421*d83cc019SAndroid Build Coastguard Worker 	if (mismatch)
422*d83cc019SAndroid Build Coastguard Worker 		igt_debug("CRC mismatch%s at index %d: 0x%x != 0x%x\n",
423*d83cc019SAndroid Build Coastguard Worker 			  igt_skip_crc_compare ? " (ignored)" : "",
424*d83cc019SAndroid Build Coastguard Worker 			  index, a->crc[index], b->crc[index]);
425*d83cc019SAndroid Build Coastguard Worker 
426*d83cc019SAndroid Build Coastguard Worker 	igt_assert(!mismatch || igt_skip_crc_compare);
427*d83cc019SAndroid Build Coastguard Worker }
428*d83cc019SAndroid Build Coastguard Worker 
429*d83cc019SAndroid Build Coastguard Worker /**
430*d83cc019SAndroid Build Coastguard Worker  * igt_check_crc_equal:
431*d83cc019SAndroid Build Coastguard Worker  * @a: first pipe CRC value
432*d83cc019SAndroid Build Coastguard Worker  * @b: second pipe CRC value
433*d83cc019SAndroid Build Coastguard Worker  *
434*d83cc019SAndroid Build Coastguard Worker  * Compares two CRC values and return whether they match.
435*d83cc019SAndroid Build Coastguard Worker  *
436*d83cc019SAndroid Build Coastguard Worker  * Returns: A boolean indicating whether the CRC values match
437*d83cc019SAndroid Build Coastguard Worker  */
igt_check_crc_equal(const igt_crc_t * a,const igt_crc_t * b)438*d83cc019SAndroid Build Coastguard Worker bool igt_check_crc_equal(const igt_crc_t *a, const igt_crc_t *b)
439*d83cc019SAndroid Build Coastguard Worker {
440*d83cc019SAndroid Build Coastguard Worker 	int index;
441*d83cc019SAndroid Build Coastguard Worker 	bool mismatch;
442*d83cc019SAndroid Build Coastguard Worker 
443*d83cc019SAndroid Build Coastguard Worker 	mismatch = igt_find_crc_mismatch(a, b, &index);
444*d83cc019SAndroid Build Coastguard Worker 	if (mismatch)
445*d83cc019SAndroid Build Coastguard Worker 		igt_debug("CRC mismatch at index %d: 0x%x != 0x%x\n", index,
446*d83cc019SAndroid Build Coastguard Worker 			  a->crc[index], b->crc[index]);
447*d83cc019SAndroid Build Coastguard Worker 
448*d83cc019SAndroid Build Coastguard Worker 	return !mismatch;
449*d83cc019SAndroid Build Coastguard Worker }
450*d83cc019SAndroid Build Coastguard Worker 
451*d83cc019SAndroid Build Coastguard Worker /**
452*d83cc019SAndroid Build Coastguard Worker  * igt_crc_to_string_extended:
453*d83cc019SAndroid Build Coastguard Worker  * @crc: pipe CRC value to print
454*d83cc019SAndroid Build Coastguard Worker  * @delimiter: The delimiter to use between crc words
455*d83cc019SAndroid Build Coastguard Worker  * @crc_size: the number of bytes to print per crc word (between 1 and 4)
456*d83cc019SAndroid Build Coastguard Worker  *
457*d83cc019SAndroid Build Coastguard Worker  * This function allocates a string and formats @crc into it, depending on
458*d83cc019SAndroid Build Coastguard Worker  * @delimiter and @crc_size.
459*d83cc019SAndroid Build Coastguard Worker  * The caller is responsible for freeing the string.
460*d83cc019SAndroid Build Coastguard Worker  *
461*d83cc019SAndroid Build Coastguard Worker  * This should only ever be used for diagnostic debug output.
462*d83cc019SAndroid Build Coastguard Worker  */
igt_crc_to_string_extended(igt_crc_t * crc,char delimiter,int crc_size)463*d83cc019SAndroid Build Coastguard Worker char *igt_crc_to_string_extended(igt_crc_t *crc, char delimiter, int crc_size)
464*d83cc019SAndroid Build Coastguard Worker {
465*d83cc019SAndroid Build Coastguard Worker 	int i;
466*d83cc019SAndroid Build Coastguard Worker 	int len = 0;
467*d83cc019SAndroid Build Coastguard Worker 	int field_width = 2 * crc_size; /* Two chars per byte. */
468*d83cc019SAndroid Build Coastguard Worker 	char *buf = malloc((field_width+1) * crc->n_words);
469*d83cc019SAndroid Build Coastguard Worker 
470*d83cc019SAndroid Build Coastguard Worker 	if (!buf)
471*d83cc019SAndroid Build Coastguard Worker 		return NULL;
472*d83cc019SAndroid Build Coastguard Worker 
473*d83cc019SAndroid Build Coastguard Worker 	for (i = 0; i < crc->n_words - 1; i++)
474*d83cc019SAndroid Build Coastguard Worker 		len += sprintf(buf + len, "%0*x%c", field_width,
475*d83cc019SAndroid Build Coastguard Worker 			       crc->crc[i], delimiter);
476*d83cc019SAndroid Build Coastguard Worker 
477*d83cc019SAndroid Build Coastguard Worker 	sprintf(buf + len, "%0*x", field_width, crc->crc[i]);
478*d83cc019SAndroid Build Coastguard Worker 
479*d83cc019SAndroid Build Coastguard Worker 	return buf;
480*d83cc019SAndroid Build Coastguard Worker }
481*d83cc019SAndroid Build Coastguard Worker 
482*d83cc019SAndroid Build Coastguard Worker /**
483*d83cc019SAndroid Build Coastguard Worker  * igt_crc_to_string:
484*d83cc019SAndroid Build Coastguard Worker  * @crc: pipe CRC value to print
485*d83cc019SAndroid Build Coastguard Worker  *
486*d83cc019SAndroid Build Coastguard Worker  * This function allocates a string and formats @crc into it.
487*d83cc019SAndroid Build Coastguard Worker  * The caller is responsible for freeing the string.
488*d83cc019SAndroid Build Coastguard Worker  *
489*d83cc019SAndroid Build Coastguard Worker  * This should only ever be used for diagnostic debug output.
490*d83cc019SAndroid Build Coastguard Worker  */
igt_crc_to_string(igt_crc_t * crc)491*d83cc019SAndroid Build Coastguard Worker char *igt_crc_to_string(igt_crc_t *crc)
492*d83cc019SAndroid Build Coastguard Worker {
493*d83cc019SAndroid Build Coastguard Worker 	return igt_crc_to_string_extended(crc, ' ', 4);
494*d83cc019SAndroid Build Coastguard Worker }
495*d83cc019SAndroid Build Coastguard Worker 
496*d83cc019SAndroid Build Coastguard Worker #define MAX_CRC_ENTRIES 10
497*d83cc019SAndroid Build Coastguard Worker #define MAX_LINE_LEN (10 + 11 * MAX_CRC_ENTRIES + 1)
498*d83cc019SAndroid Build Coastguard Worker 
499*d83cc019SAndroid Build Coastguard Worker struct _igt_pipe_crc {
500*d83cc019SAndroid Build Coastguard Worker 	int fd;
501*d83cc019SAndroid Build Coastguard Worker 	int dir;
502*d83cc019SAndroid Build Coastguard Worker 	int ctl_fd;
503*d83cc019SAndroid Build Coastguard Worker 	int crc_fd;
504*d83cc019SAndroid Build Coastguard Worker 	int flags;
505*d83cc019SAndroid Build Coastguard Worker 
506*d83cc019SAndroid Build Coastguard Worker 	enum pipe pipe;
507*d83cc019SAndroid Build Coastguard Worker 	char *source;
508*d83cc019SAndroid Build Coastguard Worker };
509*d83cc019SAndroid Build Coastguard Worker 
510*d83cc019SAndroid Build Coastguard Worker /**
511*d83cc019SAndroid Build Coastguard Worker  * igt_require_pipe_crc:
512*d83cc019SAndroid Build Coastguard Worker  *
513*d83cc019SAndroid Build Coastguard Worker  * Convenience helper to check whether pipe CRC capturing is supported by the
514*d83cc019SAndroid Build Coastguard Worker  * kernel. Uses igt_skip to automatically skip the test/subtest if this isn't
515*d83cc019SAndroid Build Coastguard Worker  * the case.
516*d83cc019SAndroid Build Coastguard Worker  */
igt_require_pipe_crc(int fd)517*d83cc019SAndroid Build Coastguard Worker void igt_require_pipe_crc(int fd)
518*d83cc019SAndroid Build Coastguard Worker {
519*d83cc019SAndroid Build Coastguard Worker 	int dir;
520*d83cc019SAndroid Build Coastguard Worker 	struct stat stat;
521*d83cc019SAndroid Build Coastguard Worker 
522*d83cc019SAndroid Build Coastguard Worker 	dir = igt_debugfs_dir(fd);
523*d83cc019SAndroid Build Coastguard Worker 	igt_require_f(dir >= 0, "Could not open debugfs directory\n");
524*d83cc019SAndroid Build Coastguard Worker 	igt_require_f(fstatat(dir, "crtc-0/crc/control", &stat, 0) == 0,
525*d83cc019SAndroid Build Coastguard Worker 		      "CRCs not supported on this platform\n");
526*d83cc019SAndroid Build Coastguard Worker 
527*d83cc019SAndroid Build Coastguard Worker 	close(dir);
528*d83cc019SAndroid Build Coastguard Worker }
529*d83cc019SAndroid Build Coastguard Worker 
igt_hpd_storm_exit_handler(int sig)530*d83cc019SAndroid Build Coastguard Worker static void igt_hpd_storm_exit_handler(int sig)
531*d83cc019SAndroid Build Coastguard Worker {
532*d83cc019SAndroid Build Coastguard Worker 	int fd = drm_open_driver(DRIVER_INTEL);
533*d83cc019SAndroid Build Coastguard Worker 
534*d83cc019SAndroid Build Coastguard Worker 	/* Here we assume that only one i915 device will be ever present */
535*d83cc019SAndroid Build Coastguard Worker 	igt_hpd_storm_reset(fd);
536*d83cc019SAndroid Build Coastguard Worker 
537*d83cc019SAndroid Build Coastguard Worker 	close(fd);
538*d83cc019SAndroid Build Coastguard Worker }
539*d83cc019SAndroid Build Coastguard Worker 
540*d83cc019SAndroid Build Coastguard Worker /**
541*d83cc019SAndroid Build Coastguard Worker  * igt_hpd_storm_set_threshold:
542*d83cc019SAndroid Build Coastguard Worker  * @threshold: How many hotplugs per second required to trigger an HPD storm,
543*d83cc019SAndroid Build Coastguard Worker  * or 0 to disable storm detection.
544*d83cc019SAndroid Build Coastguard Worker  *
545*d83cc019SAndroid Build Coastguard Worker  * Convienence helper to configure the HPD storm detection threshold for i915
546*d83cc019SAndroid Build Coastguard Worker  * through debugfs. Useful for hotplugging tests where HPD storm detection
547*d83cc019SAndroid Build Coastguard Worker  * might get in the way and slow things down.
548*d83cc019SAndroid Build Coastguard Worker  *
549*d83cc019SAndroid Build Coastguard Worker  * If the system does not support HPD storm detection, this function does
550*d83cc019SAndroid Build Coastguard Worker  * nothing.
551*d83cc019SAndroid Build Coastguard Worker  *
552*d83cc019SAndroid Build Coastguard Worker  * See: https://01.org/linuxgraphics/gfx-docs/drm/gpu/i915.html#hotplug
553*d83cc019SAndroid Build Coastguard Worker  */
igt_hpd_storm_set_threshold(int drm_fd,unsigned int threshold)554*d83cc019SAndroid Build Coastguard Worker void igt_hpd_storm_set_threshold(int drm_fd, unsigned int threshold)
555*d83cc019SAndroid Build Coastguard Worker {
556*d83cc019SAndroid Build Coastguard Worker 	int fd = igt_debugfs_open(drm_fd, "i915_hpd_storm_ctl", O_WRONLY);
557*d83cc019SAndroid Build Coastguard Worker 	char buf[16];
558*d83cc019SAndroid Build Coastguard Worker 
559*d83cc019SAndroid Build Coastguard Worker 	if (fd < 0)
560*d83cc019SAndroid Build Coastguard Worker 		return;
561*d83cc019SAndroid Build Coastguard Worker 
562*d83cc019SAndroid Build Coastguard Worker 	igt_debug("Setting HPD storm threshold to %d\n", threshold);
563*d83cc019SAndroid Build Coastguard Worker 	snprintf(buf, sizeof(buf), "%d", threshold);
564*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(write(fd, buf, strlen(buf)), strlen(buf));
565*d83cc019SAndroid Build Coastguard Worker 
566*d83cc019SAndroid Build Coastguard Worker 	close(fd);
567*d83cc019SAndroid Build Coastguard Worker 	igt_install_exit_handler(igt_hpd_storm_exit_handler);
568*d83cc019SAndroid Build Coastguard Worker }
569*d83cc019SAndroid Build Coastguard Worker 
570*d83cc019SAndroid Build Coastguard Worker /**
571*d83cc019SAndroid Build Coastguard Worker  * igt_hpd_storm_reset:
572*d83cc019SAndroid Build Coastguard Worker  *
573*d83cc019SAndroid Build Coastguard Worker  * Convienence helper to reset HPD storm detection to it's default settings.
574*d83cc019SAndroid Build Coastguard Worker  * If hotplug detection was disabled on any ports due to an HPD storm, it will
575*d83cc019SAndroid Build Coastguard Worker  * be immediately re-enabled. Always called on exit if the HPD storm detection
576*d83cc019SAndroid Build Coastguard Worker  * threshold was modified during any tests.
577*d83cc019SAndroid Build Coastguard Worker  *
578*d83cc019SAndroid Build Coastguard Worker  * If the system does not support HPD storm detection, this function does
579*d83cc019SAndroid Build Coastguard Worker  * nothing.
580*d83cc019SAndroid Build Coastguard Worker  *
581*d83cc019SAndroid Build Coastguard Worker  * See: https://01.org/linuxgraphics/gfx-docs/drm/gpu/i915.html#hotplug
582*d83cc019SAndroid Build Coastguard Worker  */
igt_hpd_storm_reset(int drm_fd)583*d83cc019SAndroid Build Coastguard Worker void igt_hpd_storm_reset(int drm_fd)
584*d83cc019SAndroid Build Coastguard Worker {
585*d83cc019SAndroid Build Coastguard Worker 	int fd = igt_debugfs_open(drm_fd, "i915_hpd_storm_ctl", O_WRONLY);
586*d83cc019SAndroid Build Coastguard Worker 	const char *buf = "reset";
587*d83cc019SAndroid Build Coastguard Worker 
588*d83cc019SAndroid Build Coastguard Worker 	if (fd < 0)
589*d83cc019SAndroid Build Coastguard Worker 		return;
590*d83cc019SAndroid Build Coastguard Worker 
591*d83cc019SAndroid Build Coastguard Worker 	igt_debug("Resetting HPD storm threshold\n");
592*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(write(fd, buf, strlen(buf)), strlen(buf));
593*d83cc019SAndroid Build Coastguard Worker 
594*d83cc019SAndroid Build Coastguard Worker 	close(fd);
595*d83cc019SAndroid Build Coastguard Worker }
596*d83cc019SAndroid Build Coastguard Worker 
597*d83cc019SAndroid Build Coastguard Worker /**
598*d83cc019SAndroid Build Coastguard Worker  * igt_hpd_storm_detected:
599*d83cc019SAndroid Build Coastguard Worker  *
600*d83cc019SAndroid Build Coastguard Worker  * Checks whether or not i915 has detected an HPD interrupt storm on any of the
601*d83cc019SAndroid Build Coastguard Worker  * system's ports.
602*d83cc019SAndroid Build Coastguard Worker  *
603*d83cc019SAndroid Build Coastguard Worker  * This function always returns false on systems that do not support HPD storm
604*d83cc019SAndroid Build Coastguard Worker  * detection.
605*d83cc019SAndroid Build Coastguard Worker  *
606*d83cc019SAndroid Build Coastguard Worker  * See: https://01.org/linuxgraphics/gfx-docs/drm/gpu/i915.html#hotplug
607*d83cc019SAndroid Build Coastguard Worker  *
608*d83cc019SAndroid Build Coastguard Worker  * Returns: Whether or not an HPD storm has been detected.
609*d83cc019SAndroid Build Coastguard Worker  */
igt_hpd_storm_detected(int drm_fd)610*d83cc019SAndroid Build Coastguard Worker bool igt_hpd_storm_detected(int drm_fd)
611*d83cc019SAndroid Build Coastguard Worker {
612*d83cc019SAndroid Build Coastguard Worker 	int fd = igt_debugfs_open(drm_fd, "i915_hpd_storm_ctl", O_RDONLY);
613*d83cc019SAndroid Build Coastguard Worker 	char *start_loc;
614*d83cc019SAndroid Build Coastguard Worker 	char buf[32] = {0}, detected_str[4];
615*d83cc019SAndroid Build Coastguard Worker 	bool ret;
616*d83cc019SAndroid Build Coastguard Worker 
617*d83cc019SAndroid Build Coastguard Worker 	if (fd < 0)
618*d83cc019SAndroid Build Coastguard Worker 		return false;
619*d83cc019SAndroid Build Coastguard Worker 
620*d83cc019SAndroid Build Coastguard Worker 	igt_assert_lt(0, read(fd, buf, sizeof(buf) - 1));
621*d83cc019SAndroid Build Coastguard Worker 	igt_assert(start_loc = strstr(buf, "Detected: "));
622*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(sscanf(start_loc, "Detected: %s\n", detected_str), 1);
623*d83cc019SAndroid Build Coastguard Worker 
624*d83cc019SAndroid Build Coastguard Worker 	if (strcmp(detected_str, "yes") == 0)
625*d83cc019SAndroid Build Coastguard Worker 		ret = true;
626*d83cc019SAndroid Build Coastguard Worker 	else if (strcmp(detected_str, "no") == 0)
627*d83cc019SAndroid Build Coastguard Worker 		ret = false;
628*d83cc019SAndroid Build Coastguard Worker 	else
629*d83cc019SAndroid Build Coastguard Worker 		igt_fail_on_f(true, "Unknown hpd storm detection status '%s'\n",
630*d83cc019SAndroid Build Coastguard Worker 			      detected_str);
631*d83cc019SAndroid Build Coastguard Worker 
632*d83cc019SAndroid Build Coastguard Worker 	close(fd);
633*d83cc019SAndroid Build Coastguard Worker 	return ret;
634*d83cc019SAndroid Build Coastguard Worker }
635*d83cc019SAndroid Build Coastguard Worker 
636*d83cc019SAndroid Build Coastguard Worker /**
637*d83cc019SAndroid Build Coastguard Worker  * igt_require_hpd_storm_ctl:
638*d83cc019SAndroid Build Coastguard Worker  *
639*d83cc019SAndroid Build Coastguard Worker  * Skips the current test if the system does not have HPD storm detection.
640*d83cc019SAndroid Build Coastguard Worker  *
641*d83cc019SAndroid Build Coastguard Worker  * See: https://01.org/linuxgraphics/gfx-docs/drm/gpu/i915.html#hotplug
642*d83cc019SAndroid Build Coastguard Worker  */
igt_require_hpd_storm_ctl(int drm_fd)643*d83cc019SAndroid Build Coastguard Worker void igt_require_hpd_storm_ctl(int drm_fd)
644*d83cc019SAndroid Build Coastguard Worker {
645*d83cc019SAndroid Build Coastguard Worker 	int fd = igt_debugfs_open(drm_fd, "i915_hpd_storm_ctl", O_RDONLY);
646*d83cc019SAndroid Build Coastguard Worker 
647*d83cc019SAndroid Build Coastguard Worker 	igt_require_f(fd > 0, "No i915_hpd_storm_ctl found in debugfs\n");
648*d83cc019SAndroid Build Coastguard Worker 	close(fd);
649*d83cc019SAndroid Build Coastguard Worker }
650*d83cc019SAndroid Build Coastguard Worker 
651*d83cc019SAndroid Build Coastguard Worker static igt_pipe_crc_t *
pipe_crc_new(int fd,enum pipe pipe,const char * source,int flags)652*d83cc019SAndroid Build Coastguard Worker pipe_crc_new(int fd, enum pipe pipe, const char *source, int flags)
653*d83cc019SAndroid Build Coastguard Worker {
654*d83cc019SAndroid Build Coastguard Worker 	igt_pipe_crc_t *pipe_crc;
655*d83cc019SAndroid Build Coastguard Worker 	char buf[128];
656*d83cc019SAndroid Build Coastguard Worker 	int debugfs;
657*d83cc019SAndroid Build Coastguard Worker 
658*d83cc019SAndroid Build Coastguard Worker 	igt_assert(source);
659*d83cc019SAndroid Build Coastguard Worker 
660*d83cc019SAndroid Build Coastguard Worker 	debugfs = igt_debugfs_dir(fd);
661*d83cc019SAndroid Build Coastguard Worker 	igt_assert(debugfs != -1);
662*d83cc019SAndroid Build Coastguard Worker 
663*d83cc019SAndroid Build Coastguard Worker 	pipe_crc = calloc(1, sizeof(struct _igt_pipe_crc));
664*d83cc019SAndroid Build Coastguard Worker 
665*d83cc019SAndroid Build Coastguard Worker 	sprintf(buf, "crtc-%d/crc/control", pipe);
666*d83cc019SAndroid Build Coastguard Worker 	pipe_crc->ctl_fd = openat(debugfs, buf, O_WRONLY);
667*d83cc019SAndroid Build Coastguard Worker 	igt_assert(pipe_crc->ctl_fd != -1);
668*d83cc019SAndroid Build Coastguard Worker 
669*d83cc019SAndroid Build Coastguard Worker 	pipe_crc->crc_fd = -1;
670*d83cc019SAndroid Build Coastguard Worker 	pipe_crc->fd = fd;
671*d83cc019SAndroid Build Coastguard Worker 	pipe_crc->dir = debugfs;
672*d83cc019SAndroid Build Coastguard Worker 	pipe_crc->pipe = pipe;
673*d83cc019SAndroid Build Coastguard Worker 	pipe_crc->source = strdup(source);
674*d83cc019SAndroid Build Coastguard Worker 	igt_assert(pipe_crc->source);
675*d83cc019SAndroid Build Coastguard Worker 	pipe_crc->flags = flags;
676*d83cc019SAndroid Build Coastguard Worker 
677*d83cc019SAndroid Build Coastguard Worker 	return pipe_crc;
678*d83cc019SAndroid Build Coastguard Worker }
679*d83cc019SAndroid Build Coastguard Worker 
680*d83cc019SAndroid Build Coastguard Worker /**
681*d83cc019SAndroid Build Coastguard Worker  * igt_pipe_crc_new:
682*d83cc019SAndroid Build Coastguard Worker  * @pipe: display pipe to use as source
683*d83cc019SAndroid Build Coastguard Worker  * @source: CRC tap point to use as source
684*d83cc019SAndroid Build Coastguard Worker  *
685*d83cc019SAndroid Build Coastguard Worker  * This sets up a new pipe CRC capture object for the given @pipe and @source
686*d83cc019SAndroid Build Coastguard Worker  * in blocking mode.
687*d83cc019SAndroid Build Coastguard Worker  *
688*d83cc019SAndroid Build Coastguard Worker  * Returns: A pipe CRC object for the given @pipe and @source. The library
689*d83cc019SAndroid Build Coastguard Worker  * assumes that the source is always available since recent kernels support at
690*d83cc019SAndroid Build Coastguard Worker  * least INTEL_PIPE_CRC_SOURCE_AUTO everywhere.
691*d83cc019SAndroid Build Coastguard Worker  */
692*d83cc019SAndroid Build Coastguard Worker igt_pipe_crc_t *
igt_pipe_crc_new(int fd,enum pipe pipe,const char * source)693*d83cc019SAndroid Build Coastguard Worker igt_pipe_crc_new(int fd, enum pipe pipe, const char *source)
694*d83cc019SAndroid Build Coastguard Worker {
695*d83cc019SAndroid Build Coastguard Worker 	return pipe_crc_new(fd, pipe, source, O_RDONLY);
696*d83cc019SAndroid Build Coastguard Worker }
697*d83cc019SAndroid Build Coastguard Worker 
698*d83cc019SAndroid Build Coastguard Worker /**
699*d83cc019SAndroid Build Coastguard Worker  * igt_pipe_crc_new_nonblock:
700*d83cc019SAndroid Build Coastguard Worker  * @pipe: display pipe to use as source
701*d83cc019SAndroid Build Coastguard Worker  * @source: CRC tap point to use as source
702*d83cc019SAndroid Build Coastguard Worker  *
703*d83cc019SAndroid Build Coastguard Worker  * This sets up a new pipe CRC capture object for the given @pipe and @source
704*d83cc019SAndroid Build Coastguard Worker  * in nonblocking mode.
705*d83cc019SAndroid Build Coastguard Worker  *
706*d83cc019SAndroid Build Coastguard Worker  * Returns: A pipe CRC object for the given @pipe and @source. The library
707*d83cc019SAndroid Build Coastguard Worker  * assumes that the source is always available since recent kernels support at
708*d83cc019SAndroid Build Coastguard Worker  * least INTEL_PIPE_CRC_SOURCE_AUTO everywhere.
709*d83cc019SAndroid Build Coastguard Worker  */
710*d83cc019SAndroid Build Coastguard Worker igt_pipe_crc_t *
igt_pipe_crc_new_nonblock(int fd,enum pipe pipe,const char * source)711*d83cc019SAndroid Build Coastguard Worker igt_pipe_crc_new_nonblock(int fd, enum pipe pipe, const char *source)
712*d83cc019SAndroid Build Coastguard Worker {
713*d83cc019SAndroid Build Coastguard Worker 	return pipe_crc_new(fd, pipe, source, O_RDONLY | O_NONBLOCK);
714*d83cc019SAndroid Build Coastguard Worker }
715*d83cc019SAndroid Build Coastguard Worker 
716*d83cc019SAndroid Build Coastguard Worker /**
717*d83cc019SAndroid Build Coastguard Worker  * igt_pipe_crc_free:
718*d83cc019SAndroid Build Coastguard Worker  * @pipe_crc: pipe CRC object
719*d83cc019SAndroid Build Coastguard Worker  *
720*d83cc019SAndroid Build Coastguard Worker  * Frees all resources associated with @pipe_crc.
721*d83cc019SAndroid Build Coastguard Worker  */
igt_pipe_crc_free(igt_pipe_crc_t * pipe_crc)722*d83cc019SAndroid Build Coastguard Worker void igt_pipe_crc_free(igt_pipe_crc_t *pipe_crc)
723*d83cc019SAndroid Build Coastguard Worker {
724*d83cc019SAndroid Build Coastguard Worker 	if (!pipe_crc)
725*d83cc019SAndroid Build Coastguard Worker 		return;
726*d83cc019SAndroid Build Coastguard Worker 
727*d83cc019SAndroid Build Coastguard Worker 	close(pipe_crc->ctl_fd);
728*d83cc019SAndroid Build Coastguard Worker 	close(pipe_crc->crc_fd);
729*d83cc019SAndroid Build Coastguard Worker 	close(pipe_crc->dir);
730*d83cc019SAndroid Build Coastguard Worker 	free(pipe_crc->source);
731*d83cc019SAndroid Build Coastguard Worker 	free(pipe_crc);
732*d83cc019SAndroid Build Coastguard Worker }
733*d83cc019SAndroid Build Coastguard Worker 
pipe_crc_init_from_string(igt_pipe_crc_t * pipe_crc,igt_crc_t * crc,const char * line)734*d83cc019SAndroid Build Coastguard Worker static bool pipe_crc_init_from_string(igt_pipe_crc_t *pipe_crc, igt_crc_t *crc,
735*d83cc019SAndroid Build Coastguard Worker 				      const char *line)
736*d83cc019SAndroid Build Coastguard Worker {
737*d83cc019SAndroid Build Coastguard Worker 	int i;
738*d83cc019SAndroid Build Coastguard Worker 	const char *buf;
739*d83cc019SAndroid Build Coastguard Worker 
740*d83cc019SAndroid Build Coastguard Worker 	if (strncmp(line, "XXXXXXXXXX", 10) == 0)
741*d83cc019SAndroid Build Coastguard Worker 		crc->has_valid_frame = false;
742*d83cc019SAndroid Build Coastguard Worker 	else {
743*d83cc019SAndroid Build Coastguard Worker 		crc->has_valid_frame = true;
744*d83cc019SAndroid Build Coastguard Worker 		crc->frame = strtoul(line, NULL, 16);
745*d83cc019SAndroid Build Coastguard Worker 	}
746*d83cc019SAndroid Build Coastguard Worker 
747*d83cc019SAndroid Build Coastguard Worker 	buf = line + 10;
748*d83cc019SAndroid Build Coastguard Worker 	for (i = 0; *buf != '\n'; i++, buf += 11)
749*d83cc019SAndroid Build Coastguard Worker 		crc->crc[i] = strtoul(buf, NULL, 16);
750*d83cc019SAndroid Build Coastguard Worker 
751*d83cc019SAndroid Build Coastguard Worker 	crc->n_words = i;
752*d83cc019SAndroid Build Coastguard Worker 
753*d83cc019SAndroid Build Coastguard Worker 	return true;
754*d83cc019SAndroid Build Coastguard Worker }
755*d83cc019SAndroid Build Coastguard Worker 
read_crc(igt_pipe_crc_t * pipe_crc,igt_crc_t * out)756*d83cc019SAndroid Build Coastguard Worker static int read_crc(igt_pipe_crc_t *pipe_crc, igt_crc_t *out)
757*d83cc019SAndroid Build Coastguard Worker {
758*d83cc019SAndroid Build Coastguard Worker 	ssize_t bytes_read;
759*d83cc019SAndroid Build Coastguard Worker 	char buf[MAX_LINE_LEN + 1];
760*d83cc019SAndroid Build Coastguard Worker 
761*d83cc019SAndroid Build Coastguard Worker 	igt_set_timeout(5, "CRC reading");
762*d83cc019SAndroid Build Coastguard Worker 	bytes_read = read(pipe_crc->crc_fd, &buf, MAX_LINE_LEN);
763*d83cc019SAndroid Build Coastguard Worker 	igt_reset_timeout();
764*d83cc019SAndroid Build Coastguard Worker 
765*d83cc019SAndroid Build Coastguard Worker 	if (bytes_read < 0)
766*d83cc019SAndroid Build Coastguard Worker 		bytes_read = -errno;
767*d83cc019SAndroid Build Coastguard Worker 	else
768*d83cc019SAndroid Build Coastguard Worker 		buf[bytes_read] = '\0';
769*d83cc019SAndroid Build Coastguard Worker 
770*d83cc019SAndroid Build Coastguard Worker 	if (bytes_read > 0 && !pipe_crc_init_from_string(pipe_crc, out, buf))
771*d83cc019SAndroid Build Coastguard Worker 		return -EINVAL;
772*d83cc019SAndroid Build Coastguard Worker 
773*d83cc019SAndroid Build Coastguard Worker 	return bytes_read;
774*d83cc019SAndroid Build Coastguard Worker }
775*d83cc019SAndroid Build Coastguard Worker 
read_one_crc(igt_pipe_crc_t * pipe_crc,igt_crc_t * out)776*d83cc019SAndroid Build Coastguard Worker static void read_one_crc(igt_pipe_crc_t *pipe_crc, igt_crc_t *out)
777*d83cc019SAndroid Build Coastguard Worker {
778*d83cc019SAndroid Build Coastguard Worker 	int ret;
779*d83cc019SAndroid Build Coastguard Worker 
780*d83cc019SAndroid Build Coastguard Worker 	fcntl(pipe_crc->crc_fd, F_SETFL, pipe_crc->flags & ~O_NONBLOCK);
781*d83cc019SAndroid Build Coastguard Worker 
782*d83cc019SAndroid Build Coastguard Worker 	do {
783*d83cc019SAndroid Build Coastguard Worker 		ret = read_crc(pipe_crc, out);
784*d83cc019SAndroid Build Coastguard Worker 	} while (ret == -EINTR);
785*d83cc019SAndroid Build Coastguard Worker 
786*d83cc019SAndroid Build Coastguard Worker 	fcntl(pipe_crc->crc_fd, F_SETFL, pipe_crc->flags);
787*d83cc019SAndroid Build Coastguard Worker }
788*d83cc019SAndroid Build Coastguard Worker 
789*d83cc019SAndroid Build Coastguard Worker /**
790*d83cc019SAndroid Build Coastguard Worker  * igt_pipe_crc_start:
791*d83cc019SAndroid Build Coastguard Worker  * @pipe_crc: pipe CRC object
792*d83cc019SAndroid Build Coastguard Worker  *
793*d83cc019SAndroid Build Coastguard Worker  * Starts the CRC capture process on @pipe_crc.
794*d83cc019SAndroid Build Coastguard Worker  */
igt_pipe_crc_start(igt_pipe_crc_t * pipe_crc)795*d83cc019SAndroid Build Coastguard Worker void igt_pipe_crc_start(igt_pipe_crc_t *pipe_crc)
796*d83cc019SAndroid Build Coastguard Worker {
797*d83cc019SAndroid Build Coastguard Worker 	const char *src = pipe_crc->source;
798*d83cc019SAndroid Build Coastguard Worker 	struct pollfd pfd;
799*d83cc019SAndroid Build Coastguard Worker 	char buf[32];
800*d83cc019SAndroid Build Coastguard Worker 
801*d83cc019SAndroid Build Coastguard Worker 	/* Stop first just to make sure we don't have lingering state left. */
802*d83cc019SAndroid Build Coastguard Worker 	igt_pipe_crc_stop(pipe_crc);
803*d83cc019SAndroid Build Coastguard Worker 
804*d83cc019SAndroid Build Coastguard Worker 	igt_reset_fifo_underrun_reporting(pipe_crc->fd);
805*d83cc019SAndroid Build Coastguard Worker 
806*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(write(pipe_crc->ctl_fd, src, strlen(src)), strlen(src));
807*d83cc019SAndroid Build Coastguard Worker 
808*d83cc019SAndroid Build Coastguard Worker 	sprintf(buf, "crtc-%d/crc/data", pipe_crc->pipe);
809*d83cc019SAndroid Build Coastguard Worker 
810*d83cc019SAndroid Build Coastguard Worker 	igt_set_timeout(10, "Opening crc fd, and poll for first CRC.");
811*d83cc019SAndroid Build Coastguard Worker 	pipe_crc->crc_fd = openat(pipe_crc->dir, buf, pipe_crc->flags);
812*d83cc019SAndroid Build Coastguard Worker 	igt_assert(pipe_crc->crc_fd != -1);
813*d83cc019SAndroid Build Coastguard Worker 
814*d83cc019SAndroid Build Coastguard Worker 	pfd.fd = pipe_crc->crc_fd;
815*d83cc019SAndroid Build Coastguard Worker 	pfd.events = POLLIN;
816*d83cc019SAndroid Build Coastguard Worker 	poll(&pfd, 1, -1);
817*d83cc019SAndroid Build Coastguard Worker 
818*d83cc019SAndroid Build Coastguard Worker 	igt_reset_timeout();
819*d83cc019SAndroid Build Coastguard Worker 
820*d83cc019SAndroid Build Coastguard Worker 	errno = 0;
821*d83cc019SAndroid Build Coastguard Worker }
822*d83cc019SAndroid Build Coastguard Worker 
823*d83cc019SAndroid Build Coastguard Worker /**
824*d83cc019SAndroid Build Coastguard Worker  * igt_pipe_crc_stop:
825*d83cc019SAndroid Build Coastguard Worker  * @pipe_crc: pipe CRC object
826*d83cc019SAndroid Build Coastguard Worker  *
827*d83cc019SAndroid Build Coastguard Worker  * Stops the CRC capture process on @pipe_crc.
828*d83cc019SAndroid Build Coastguard Worker  */
igt_pipe_crc_stop(igt_pipe_crc_t * pipe_crc)829*d83cc019SAndroid Build Coastguard Worker void igt_pipe_crc_stop(igt_pipe_crc_t *pipe_crc)
830*d83cc019SAndroid Build Coastguard Worker {
831*d83cc019SAndroid Build Coastguard Worker 	close(pipe_crc->crc_fd);
832*d83cc019SAndroid Build Coastguard Worker 	pipe_crc->crc_fd = -1;
833*d83cc019SAndroid Build Coastguard Worker }
834*d83cc019SAndroid Build Coastguard Worker 
835*d83cc019SAndroid Build Coastguard Worker /**
836*d83cc019SAndroid Build Coastguard Worker  * igt_pipe_crc_get_crcs:
837*d83cc019SAndroid Build Coastguard Worker  * @pipe_crc: pipe CRC object
838*d83cc019SAndroid Build Coastguard Worker  * @n_crcs: number of CRCs to capture
839*d83cc019SAndroid Build Coastguard Worker  * @out_crcs: buffer pointer for the captured CRC values
840*d83cc019SAndroid Build Coastguard Worker  *
841*d83cc019SAndroid Build Coastguard Worker  * Read up to @n_crcs from @pipe_crc. This function does not block, and will
842*d83cc019SAndroid Build Coastguard Worker  * return early if not enough CRCs can be captured, if @pipe_crc has been
843*d83cc019SAndroid Build Coastguard Worker  * opened using igt_pipe_crc_new_nonblock(). It will block until @n_crcs are
844*d83cc019SAndroid Build Coastguard Worker  * retrieved if @pipe_crc has been opened using igt_pipe_crc_new(). @out_crcs is
845*d83cc019SAndroid Build Coastguard Worker  * alloced by this function and must be released with free() by the caller.
846*d83cc019SAndroid Build Coastguard Worker  *
847*d83cc019SAndroid Build Coastguard Worker  * Callers must start and stop the capturing themselves by calling
848*d83cc019SAndroid Build Coastguard Worker  * igt_pipe_crc_start() and igt_pipe_crc_stop(). For one-shot CRC collecting
849*d83cc019SAndroid Build Coastguard Worker  * look at igt_pipe_crc_collect_crc().
850*d83cc019SAndroid Build Coastguard Worker  *
851*d83cc019SAndroid Build Coastguard Worker  * Returns:
852*d83cc019SAndroid Build Coastguard Worker  * The number of CRCs captured. Should be equal to @n_crcs in blocking mode, but
853*d83cc019SAndroid Build Coastguard Worker  * can be less (even zero) in non-blocking mode.
854*d83cc019SAndroid Build Coastguard Worker  */
855*d83cc019SAndroid Build Coastguard Worker int
igt_pipe_crc_get_crcs(igt_pipe_crc_t * pipe_crc,int n_crcs,igt_crc_t ** out_crcs)856*d83cc019SAndroid Build Coastguard Worker igt_pipe_crc_get_crcs(igt_pipe_crc_t *pipe_crc, int n_crcs,
857*d83cc019SAndroid Build Coastguard Worker 		      igt_crc_t **out_crcs)
858*d83cc019SAndroid Build Coastguard Worker {
859*d83cc019SAndroid Build Coastguard Worker 	igt_crc_t *crcs;
860*d83cc019SAndroid Build Coastguard Worker 	int n = 0;
861*d83cc019SAndroid Build Coastguard Worker 
862*d83cc019SAndroid Build Coastguard Worker 	crcs = calloc(n_crcs, sizeof(igt_crc_t));
863*d83cc019SAndroid Build Coastguard Worker 
864*d83cc019SAndroid Build Coastguard Worker 	do {
865*d83cc019SAndroid Build Coastguard Worker 		igt_crc_t *crc = &crcs[n];
866*d83cc019SAndroid Build Coastguard Worker 		int ret;
867*d83cc019SAndroid Build Coastguard Worker 
868*d83cc019SAndroid Build Coastguard Worker 		ret = read_crc(pipe_crc, crc);
869*d83cc019SAndroid Build Coastguard Worker 		if (ret == -EAGAIN)
870*d83cc019SAndroid Build Coastguard Worker 			break;
871*d83cc019SAndroid Build Coastguard Worker 
872*d83cc019SAndroid Build Coastguard Worker 		if (ret < 0)
873*d83cc019SAndroid Build Coastguard Worker 			continue;
874*d83cc019SAndroid Build Coastguard Worker 
875*d83cc019SAndroid Build Coastguard Worker 		n++;
876*d83cc019SAndroid Build Coastguard Worker 	} while (n < n_crcs);
877*d83cc019SAndroid Build Coastguard Worker 
878*d83cc019SAndroid Build Coastguard Worker 	*out_crcs = crcs;
879*d83cc019SAndroid Build Coastguard Worker 	return n;
880*d83cc019SAndroid Build Coastguard Worker }
881*d83cc019SAndroid Build Coastguard Worker 
crc_sanity_checks(igt_pipe_crc_t * pipe_crc,igt_crc_t * crc)882*d83cc019SAndroid Build Coastguard Worker static void crc_sanity_checks(igt_pipe_crc_t *pipe_crc, igt_crc_t *crc)
883*d83cc019SAndroid Build Coastguard Worker {
884*d83cc019SAndroid Build Coastguard Worker 	int i;
885*d83cc019SAndroid Build Coastguard Worker 	bool all_zero = true;
886*d83cc019SAndroid Build Coastguard Worker 
887*d83cc019SAndroid Build Coastguard Worker 	/* Any CRC value can be considered valid on amdgpu hardware. */
888*d83cc019SAndroid Build Coastguard Worker 	if (is_amdgpu_device(pipe_crc->fd))
889*d83cc019SAndroid Build Coastguard Worker 		return;
890*d83cc019SAndroid Build Coastguard Worker 
891*d83cc019SAndroid Build Coastguard Worker 	for (i = 0; i < crc->n_words; i++) {
892*d83cc019SAndroid Build Coastguard Worker 		igt_warn_on_f(crc->crc[i] == 0xffffffff,
893*d83cc019SAndroid Build Coastguard Worker 			      "Suspicious CRC: it looks like the CRC "
894*d83cc019SAndroid Build Coastguard Worker 			      "read back was from a register in a powered "
895*d83cc019SAndroid Build Coastguard Worker 			      "down well\n");
896*d83cc019SAndroid Build Coastguard Worker 		if (crc->crc[i])
897*d83cc019SAndroid Build Coastguard Worker 			all_zero = false;
898*d83cc019SAndroid Build Coastguard Worker 	}
899*d83cc019SAndroid Build Coastguard Worker 
900*d83cc019SAndroid Build Coastguard Worker 	igt_warn_on_f(all_zero, "Suspicious CRC: All values are 0.\n");
901*d83cc019SAndroid Build Coastguard Worker }
902*d83cc019SAndroid Build Coastguard Worker 
903*d83cc019SAndroid Build Coastguard Worker /**
904*d83cc019SAndroid Build Coastguard Worker  * igt_pipe_crc_drain:
905*d83cc019SAndroid Build Coastguard Worker  * @pipe_crc: pipe CRC object
906*d83cc019SAndroid Build Coastguard Worker  *
907*d83cc019SAndroid Build Coastguard Worker  * Discards all currently queued CRC values from @pipe_crc. This function does
908*d83cc019SAndroid Build Coastguard Worker  * not block, and is useful to flush @pipe_crc. Afterwards you can get a fresh
909*d83cc019SAndroid Build Coastguard Worker  * CRC with igt_pipe_crc_get_single().
910*d83cc019SAndroid Build Coastguard Worker  */
igt_pipe_crc_drain(igt_pipe_crc_t * pipe_crc)911*d83cc019SAndroid Build Coastguard Worker void igt_pipe_crc_drain(igt_pipe_crc_t *pipe_crc)
912*d83cc019SAndroid Build Coastguard Worker {
913*d83cc019SAndroid Build Coastguard Worker 	int ret;
914*d83cc019SAndroid Build Coastguard Worker 	igt_crc_t crc;
915*d83cc019SAndroid Build Coastguard Worker 
916*d83cc019SAndroid Build Coastguard Worker 	fcntl(pipe_crc->crc_fd, F_SETFL, pipe_crc->flags | O_NONBLOCK);
917*d83cc019SAndroid Build Coastguard Worker 
918*d83cc019SAndroid Build Coastguard Worker 	do {
919*d83cc019SAndroid Build Coastguard Worker 		ret = read_crc(pipe_crc, &crc);
920*d83cc019SAndroid Build Coastguard Worker 	} while (ret > 0 || ret == -EINVAL);
921*d83cc019SAndroid Build Coastguard Worker 
922*d83cc019SAndroid Build Coastguard Worker 	fcntl(pipe_crc->crc_fd, F_SETFL, pipe_crc->flags);
923*d83cc019SAndroid Build Coastguard Worker }
924*d83cc019SAndroid Build Coastguard Worker 
925*d83cc019SAndroid Build Coastguard Worker /**
926*d83cc019SAndroid Build Coastguard Worker  * igt_pipe_crc_get_single:
927*d83cc019SAndroid Build Coastguard Worker  * @pipe_crc: pipe CRC object
928*d83cc019SAndroid Build Coastguard Worker  * @crc: buffer pointer for the captured CRC value
929*d83cc019SAndroid Build Coastguard Worker  *
930*d83cc019SAndroid Build Coastguard Worker  * Read a single @crc from @pipe_crc. This function blocks even
931*d83cc019SAndroid Build Coastguard Worker  * when nonblocking CRC is requested.
932*d83cc019SAndroid Build Coastguard Worker  *
933*d83cc019SAndroid Build Coastguard Worker  * Callers must start and stop the capturing themselves by calling
934*d83cc019SAndroid Build Coastguard Worker  * igt_pipe_crc_start() and igt_pipe_crc_stop(). For one-shot CRC collecting
935*d83cc019SAndroid Build Coastguard Worker  * look at igt_pipe_crc_collect_crc().
936*d83cc019SAndroid Build Coastguard Worker  *
937*d83cc019SAndroid Build Coastguard Worker  * If capturing has been going on for a while and a fresh crc is required,
938*d83cc019SAndroid Build Coastguard Worker  * you should use igt_pipe_crc_get_current() instead.
939*d83cc019SAndroid Build Coastguard Worker  */
igt_pipe_crc_get_single(igt_pipe_crc_t * pipe_crc,igt_crc_t * crc)940*d83cc019SAndroid Build Coastguard Worker void igt_pipe_crc_get_single(igt_pipe_crc_t *pipe_crc, igt_crc_t *crc)
941*d83cc019SAndroid Build Coastguard Worker {
942*d83cc019SAndroid Build Coastguard Worker 	read_one_crc(pipe_crc, crc);
943*d83cc019SAndroid Build Coastguard Worker 
944*d83cc019SAndroid Build Coastguard Worker 	crc_sanity_checks(pipe_crc, crc);
945*d83cc019SAndroid Build Coastguard Worker }
946*d83cc019SAndroid Build Coastguard Worker 
947*d83cc019SAndroid Build Coastguard Worker /**
948*d83cc019SAndroid Build Coastguard Worker  * igt_pipe_crc_get_current:
949*d83cc019SAndroid Build Coastguard Worker  * @drm_fd: Pointer to drm fd for vblank counter
950*d83cc019SAndroid Build Coastguard Worker  * @pipe_crc: pipe CRC object
951*d83cc019SAndroid Build Coastguard Worker  * @crc: buffer pointer for the captured CRC value
952*d83cc019SAndroid Build Coastguard Worker  *
953*d83cc019SAndroid Build Coastguard Worker  * Same as igt_pipe_crc_get_single(), but will wait until a new CRC can be captured.
954*d83cc019SAndroid Build Coastguard Worker  * This is useful for retrieving the current CRC in a more race free way than
955*d83cc019SAndroid Build Coastguard Worker  * igt_pipe_crc_drain() + igt_pipe_crc_get_single().
956*d83cc019SAndroid Build Coastguard Worker  */
957*d83cc019SAndroid Build Coastguard Worker void
igt_pipe_crc_get_current(int drm_fd,igt_pipe_crc_t * pipe_crc,igt_crc_t * crc)958*d83cc019SAndroid Build Coastguard Worker igt_pipe_crc_get_current(int drm_fd, igt_pipe_crc_t *pipe_crc, igt_crc_t *crc)
959*d83cc019SAndroid Build Coastguard Worker {
960*d83cc019SAndroid Build Coastguard Worker 	unsigned vblank = kmstest_get_vblank(drm_fd, pipe_crc->pipe, 0);
961*d83cc019SAndroid Build Coastguard Worker 
962*d83cc019SAndroid Build Coastguard Worker 	do {
963*d83cc019SAndroid Build Coastguard Worker 		read_one_crc(pipe_crc, crc);
964*d83cc019SAndroid Build Coastguard Worker 
965*d83cc019SAndroid Build Coastguard Worker 		/* Only works with valid frame counter */
966*d83cc019SAndroid Build Coastguard Worker 		if (!crc->has_valid_frame) {
967*d83cc019SAndroid Build Coastguard Worker 			igt_pipe_crc_drain(pipe_crc);
968*d83cc019SAndroid Build Coastguard Worker 			igt_pipe_crc_get_single(pipe_crc, crc);
969*d83cc019SAndroid Build Coastguard Worker 			return;
970*d83cc019SAndroid Build Coastguard Worker 		}
971*d83cc019SAndroid Build Coastguard Worker 	} while (igt_vblank_before_eq(crc->frame, vblank));
972*d83cc019SAndroid Build Coastguard Worker 
973*d83cc019SAndroid Build Coastguard Worker 	crc_sanity_checks(pipe_crc, crc);
974*d83cc019SAndroid Build Coastguard Worker }
975*d83cc019SAndroid Build Coastguard Worker 
976*d83cc019SAndroid Build Coastguard Worker /**
977*d83cc019SAndroid Build Coastguard Worker  * igt_pipe_crc_collect_crc:
978*d83cc019SAndroid Build Coastguard Worker  * @pipe_crc: pipe CRC object
979*d83cc019SAndroid Build Coastguard Worker  * @out_crc: buffer for the captured CRC values
980*d83cc019SAndroid Build Coastguard Worker  *
981*d83cc019SAndroid Build Coastguard Worker  * Read a single CRC from @pipe_crc. This function blocks until the CRC is
982*d83cc019SAndroid Build Coastguard Worker  * retrieved, irrespective of whether @pipe_crc has been opened with
983*d83cc019SAndroid Build Coastguard Worker  * igt_pipe_crc_new() or igt_pipe_crc_new_nonblock().  @out_crc must be
984*d83cc019SAndroid Build Coastguard Worker  * allocated by the caller.
985*d83cc019SAndroid Build Coastguard Worker  *
986*d83cc019SAndroid Build Coastguard Worker  * This function takes care of the pipe_crc book-keeping, it will start/stop
987*d83cc019SAndroid Build Coastguard Worker  * the collection of the CRC.
988*d83cc019SAndroid Build Coastguard Worker  *
989*d83cc019SAndroid Build Coastguard Worker  * This function also calls the interactive debug with the "crc" domain, so you
990*d83cc019SAndroid Build Coastguard Worker  * can make use of this feature to actually see the screen that is being CRC'd.
991*d83cc019SAndroid Build Coastguard Worker  *
992*d83cc019SAndroid Build Coastguard Worker  * For continuous CRC collection look at igt_pipe_crc_start(),
993*d83cc019SAndroid Build Coastguard Worker  * igt_pipe_crc_get_crcs() and igt_pipe_crc_stop().
994*d83cc019SAndroid Build Coastguard Worker  */
igt_pipe_crc_collect_crc(igt_pipe_crc_t * pipe_crc,igt_crc_t * out_crc)995*d83cc019SAndroid Build Coastguard Worker void igt_pipe_crc_collect_crc(igt_pipe_crc_t *pipe_crc, igt_crc_t *out_crc)
996*d83cc019SAndroid Build Coastguard Worker {
997*d83cc019SAndroid Build Coastguard Worker 	igt_debug_wait_for_keypress("crc");
998*d83cc019SAndroid Build Coastguard Worker 
999*d83cc019SAndroid Build Coastguard Worker 	igt_pipe_crc_start(pipe_crc);
1000*d83cc019SAndroid Build Coastguard Worker 	igt_pipe_crc_get_single(pipe_crc, out_crc);
1001*d83cc019SAndroid Build Coastguard Worker 	igt_pipe_crc_stop(pipe_crc);
1002*d83cc019SAndroid Build Coastguard Worker }
1003*d83cc019SAndroid Build Coastguard Worker 
1004*d83cc019SAndroid Build Coastguard Worker /**
1005*d83cc019SAndroid Build Coastguard Worker  * igt_reset_fifo_underrun_reporting:
1006*d83cc019SAndroid Build Coastguard Worker  * @drm_fd: drm device file descriptor
1007*d83cc019SAndroid Build Coastguard Worker  *
1008*d83cc019SAndroid Build Coastguard Worker  * Resets fifo underrun reporting, if supported by the device. Useful since fifo
1009*d83cc019SAndroid Build Coastguard Worker  * underrun reporting tends to be one-shot, so good to reset it before the
1010*d83cc019SAndroid Build Coastguard Worker  * actual functional test again in case there's been a separate issue happening
1011*d83cc019SAndroid Build Coastguard Worker  * while preparing the test setup.
1012*d83cc019SAndroid Build Coastguard Worker  */
igt_reset_fifo_underrun_reporting(int drm_fd)1013*d83cc019SAndroid Build Coastguard Worker void igt_reset_fifo_underrun_reporting(int drm_fd)
1014*d83cc019SAndroid Build Coastguard Worker {
1015*d83cc019SAndroid Build Coastguard Worker 	int fd = igt_debugfs_open(drm_fd, "i915_fifo_underrun_reset", O_WRONLY);
1016*d83cc019SAndroid Build Coastguard Worker 	if (fd >= 0) {
1017*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eq(write(fd, "y", 1), 1);
1018*d83cc019SAndroid Build Coastguard Worker 
1019*d83cc019SAndroid Build Coastguard Worker 		close(fd);
1020*d83cc019SAndroid Build Coastguard Worker 	}
1021*d83cc019SAndroid Build Coastguard Worker }
1022*d83cc019SAndroid Build Coastguard Worker 
1023*d83cc019SAndroid Build Coastguard Worker /*
1024*d83cc019SAndroid Build Coastguard Worker  * Drop caches
1025*d83cc019SAndroid Build Coastguard Worker  */
1026*d83cc019SAndroid Build Coastguard Worker 
1027*d83cc019SAndroid Build Coastguard Worker /**
1028*d83cc019SAndroid Build Coastguard Worker  * igt_drop_caches_has:
1029*d83cc019SAndroid Build Coastguard Worker  * @val: bitmask for DROP_* values
1030*d83cc019SAndroid Build Coastguard Worker  *
1031*d83cc019SAndroid Build Coastguard Worker  * This queries the debugfs to see if it supports the full set of desired
1032*d83cc019SAndroid Build Coastguard Worker  * operations.
1033*d83cc019SAndroid Build Coastguard Worker  */
igt_drop_caches_has(int drm_fd,uint64_t val)1034*d83cc019SAndroid Build Coastguard Worker bool igt_drop_caches_has(int drm_fd, uint64_t val)
1035*d83cc019SAndroid Build Coastguard Worker {
1036*d83cc019SAndroid Build Coastguard Worker 	uint64_t mask;
1037*d83cc019SAndroid Build Coastguard Worker 	int dir;
1038*d83cc019SAndroid Build Coastguard Worker 
1039*d83cc019SAndroid Build Coastguard Worker 	mask = 0;
1040*d83cc019SAndroid Build Coastguard Worker 	dir = igt_debugfs_dir(drm_fd);
1041*d83cc019SAndroid Build Coastguard Worker 	igt_sysfs_scanf(dir, "i915_gem_drop_caches", "0x%" PRIx64, &mask);
1042*d83cc019SAndroid Build Coastguard Worker 	close(dir);
1043*d83cc019SAndroid Build Coastguard Worker 
1044*d83cc019SAndroid Build Coastguard Worker 	return (val & mask) == val;
1045*d83cc019SAndroid Build Coastguard Worker }
1046*d83cc019SAndroid Build Coastguard Worker 
1047*d83cc019SAndroid Build Coastguard Worker /**
1048*d83cc019SAndroid Build Coastguard Worker  * igt_drop_caches_set:
1049*d83cc019SAndroid Build Coastguard Worker  * @val: bitmask for DROP_* values
1050*d83cc019SAndroid Build Coastguard Worker  *
1051*d83cc019SAndroid Build Coastguard Worker  * This calls the debugfs interface the drm/i915 GEM driver exposes to drop or
1052*d83cc019SAndroid Build Coastguard Worker  * evict certain classes of gem buffer objects.
1053*d83cc019SAndroid Build Coastguard Worker  */
igt_drop_caches_set(int drm_fd,uint64_t val)1054*d83cc019SAndroid Build Coastguard Worker void igt_drop_caches_set(int drm_fd, uint64_t val)
1055*d83cc019SAndroid Build Coastguard Worker {
1056*d83cc019SAndroid Build Coastguard Worker 	int dir;
1057*d83cc019SAndroid Build Coastguard Worker 
1058*d83cc019SAndroid Build Coastguard Worker 	dir = igt_debugfs_dir(drm_fd);
1059*d83cc019SAndroid Build Coastguard Worker 	igt_assert(igt_sysfs_printf(dir, "i915_gem_drop_caches",
1060*d83cc019SAndroid Build Coastguard Worker 				    "0x%" PRIx64, val) > 0);
1061*d83cc019SAndroid Build Coastguard Worker 	close(dir);
1062*d83cc019SAndroid Build Coastguard Worker }
1063*d83cc019SAndroid Build Coastguard Worker 
1064*d83cc019SAndroid Build Coastguard Worker /*
1065*d83cc019SAndroid Build Coastguard Worker  * Prefault control
1066*d83cc019SAndroid Build Coastguard Worker  */
1067*d83cc019SAndroid Build Coastguard Worker 
1068*d83cc019SAndroid Build Coastguard Worker #define PREFAULT_DEBUGFS "/sys/module/i915/parameters/prefault_disable"
igt_prefault_control(bool enable)1069*d83cc019SAndroid Build Coastguard Worker static void igt_prefault_control(bool enable)
1070*d83cc019SAndroid Build Coastguard Worker {
1071*d83cc019SAndroid Build Coastguard Worker 	const char *name = PREFAULT_DEBUGFS;
1072*d83cc019SAndroid Build Coastguard Worker 	int fd;
1073*d83cc019SAndroid Build Coastguard Worker 	char buf[2] = {'Y', 'N'};
1074*d83cc019SAndroid Build Coastguard Worker 	int index;
1075*d83cc019SAndroid Build Coastguard Worker 
1076*d83cc019SAndroid Build Coastguard Worker 	fd = open(name, O_RDWR);
1077*d83cc019SAndroid Build Coastguard Worker 	igt_require(fd >= 0);
1078*d83cc019SAndroid Build Coastguard Worker 
1079*d83cc019SAndroid Build Coastguard Worker 	if (enable)
1080*d83cc019SAndroid Build Coastguard Worker 		index = 1;
1081*d83cc019SAndroid Build Coastguard Worker 	else
1082*d83cc019SAndroid Build Coastguard Worker 		index = 0;
1083*d83cc019SAndroid Build Coastguard Worker 
1084*d83cc019SAndroid Build Coastguard Worker 	igt_require(write(fd, &buf[index], 1) == 1);
1085*d83cc019SAndroid Build Coastguard Worker 
1086*d83cc019SAndroid Build Coastguard Worker 	close(fd);
1087*d83cc019SAndroid Build Coastguard Worker }
1088*d83cc019SAndroid Build Coastguard Worker 
enable_prefault_at_exit(int sig)1089*d83cc019SAndroid Build Coastguard Worker static void enable_prefault_at_exit(int sig)
1090*d83cc019SAndroid Build Coastguard Worker {
1091*d83cc019SAndroid Build Coastguard Worker 	igt_enable_prefault();
1092*d83cc019SAndroid Build Coastguard Worker }
1093*d83cc019SAndroid Build Coastguard Worker 
1094*d83cc019SAndroid Build Coastguard Worker /**
1095*d83cc019SAndroid Build Coastguard Worker  * igt_disable_prefault:
1096*d83cc019SAndroid Build Coastguard Worker  *
1097*d83cc019SAndroid Build Coastguard Worker  * Disable prefaulting in certain gem ioctls through the debugfs interface. As
1098*d83cc019SAndroid Build Coastguard Worker  * usual this installs an exit handler to clean up and re-enable prefaulting
1099*d83cc019SAndroid Build Coastguard Worker  * even when the test exited abnormally.
1100*d83cc019SAndroid Build Coastguard Worker  *
1101*d83cc019SAndroid Build Coastguard Worker  * igt_enable_prefault() will enable normale operation again.
1102*d83cc019SAndroid Build Coastguard Worker  */
igt_disable_prefault(void)1103*d83cc019SAndroid Build Coastguard Worker void igt_disable_prefault(void)
1104*d83cc019SAndroid Build Coastguard Worker {
1105*d83cc019SAndroid Build Coastguard Worker 	igt_prefault_control(false);
1106*d83cc019SAndroid Build Coastguard Worker 
1107*d83cc019SAndroid Build Coastguard Worker 	igt_install_exit_handler(enable_prefault_at_exit);
1108*d83cc019SAndroid Build Coastguard Worker }
1109*d83cc019SAndroid Build Coastguard Worker 
1110*d83cc019SAndroid Build Coastguard Worker /**
1111*d83cc019SAndroid Build Coastguard Worker  * igt_enable_prefault:
1112*d83cc019SAndroid Build Coastguard Worker  *
1113*d83cc019SAndroid Build Coastguard Worker  * Enable prefault (again) through the debugfs interface.
1114*d83cc019SAndroid Build Coastguard Worker  */
igt_enable_prefault(void)1115*d83cc019SAndroid Build Coastguard Worker void igt_enable_prefault(void)
1116*d83cc019SAndroid Build Coastguard Worker {
1117*d83cc019SAndroid Build Coastguard Worker 	igt_prefault_control(true);
1118*d83cc019SAndroid Build Coastguard Worker }
1119*d83cc019SAndroid Build Coastguard Worker 
get_object_count(int fd)1120*d83cc019SAndroid Build Coastguard Worker static int get_object_count(int fd)
1121*d83cc019SAndroid Build Coastguard Worker {
1122*d83cc019SAndroid Build Coastguard Worker 	int dir, ret, scanned;
1123*d83cc019SAndroid Build Coastguard Worker 
1124*d83cc019SAndroid Build Coastguard Worker 	igt_drop_caches_set(fd,
1125*d83cc019SAndroid Build Coastguard Worker 			    DROP_RETIRE | DROP_ACTIVE | DROP_IDLE | DROP_FREED);
1126*d83cc019SAndroid Build Coastguard Worker 
1127*d83cc019SAndroid Build Coastguard Worker 	dir = igt_debugfs_dir(fd);
1128*d83cc019SAndroid Build Coastguard Worker 	scanned = igt_sysfs_scanf(dir, "i915_gem_objects",
1129*d83cc019SAndroid Build Coastguard Worker 				  "%i objects", &ret);
1130*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(scanned, 1);
1131*d83cc019SAndroid Build Coastguard Worker 	close(dir);
1132*d83cc019SAndroid Build Coastguard Worker 
1133*d83cc019SAndroid Build Coastguard Worker 	return ret;
1134*d83cc019SAndroid Build Coastguard Worker }
1135*d83cc019SAndroid Build Coastguard Worker 
1136*d83cc019SAndroid Build Coastguard Worker /**
1137*d83cc019SAndroid Build Coastguard Worker  * igt_get_stable_obj_count:
1138*d83cc019SAndroid Build Coastguard Worker  * @driver: fd to drm/i915 GEM driver
1139*d83cc019SAndroid Build Coastguard Worker  *
1140*d83cc019SAndroid Build Coastguard Worker  * This puts the driver into a stable (quiescent) state and then returns the
1141*d83cc019SAndroid Build Coastguard Worker  * current number of gem buffer objects as reported in the i915_gem_objects
1142*d83cc019SAndroid Build Coastguard Worker  * debugFS interface.
1143*d83cc019SAndroid Build Coastguard Worker  */
igt_get_stable_obj_count(int driver)1144*d83cc019SAndroid Build Coastguard Worker int igt_get_stable_obj_count(int driver)
1145*d83cc019SAndroid Build Coastguard Worker {
1146*d83cc019SAndroid Build Coastguard Worker 	int obj_count;
1147*d83cc019SAndroid Build Coastguard Worker 	gem_quiescent_gpu(driver);
1148*d83cc019SAndroid Build Coastguard Worker 	obj_count = get_object_count(driver);
1149*d83cc019SAndroid Build Coastguard Worker 	/* The test relies on the system being in the same state before and
1150*d83cc019SAndroid Build Coastguard Worker 	 * after the test so any difference in the object count is a result of
1151*d83cc019SAndroid Build Coastguard Worker 	 * leaks during the test. */
1152*d83cc019SAndroid Build Coastguard Worker 	return obj_count;
1153*d83cc019SAndroid Build Coastguard Worker }
1154*d83cc019SAndroid Build Coastguard Worker 
__igt_debugfs_dump(int device,const char * filename,int level)1155*d83cc019SAndroid Build Coastguard Worker void __igt_debugfs_dump(int device, const char *filename, int level)
1156*d83cc019SAndroid Build Coastguard Worker {
1157*d83cc019SAndroid Build Coastguard Worker 	char *contents;
1158*d83cc019SAndroid Build Coastguard Worker 	int dir;
1159*d83cc019SAndroid Build Coastguard Worker 
1160*d83cc019SAndroid Build Coastguard Worker 	dir = igt_debugfs_dir(device);
1161*d83cc019SAndroid Build Coastguard Worker 	contents = igt_sysfs_get(dir, filename);
1162*d83cc019SAndroid Build Coastguard Worker 	close(dir);
1163*d83cc019SAndroid Build Coastguard Worker 
1164*d83cc019SAndroid Build Coastguard Worker 	igt_log(IGT_LOG_DOMAIN, level, "%s:\n%s\n", filename, contents);
1165*d83cc019SAndroid Build Coastguard Worker 	free(contents);
1166*d83cc019SAndroid Build Coastguard Worker }
1167