xref: /aosp_15_r20/external/igt-gpu-tools/tests/i915/i915_pm_rpm.c (revision d83cc019efdc2edc6c4b16e9034a3ceb8d35d77c)
1*d83cc019SAndroid Build Coastguard Worker /*
2*d83cc019SAndroid Build Coastguard Worker  * Copyright © 2013, 2015 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  *    Paulo Zanoni <[email protected]>
25*d83cc019SAndroid Build Coastguard Worker  *
26*d83cc019SAndroid Build Coastguard Worker  */
27*d83cc019SAndroid Build Coastguard Worker 
28*d83cc019SAndroid Build Coastguard Worker #include "config.h"
29*d83cc019SAndroid Build Coastguard Worker 
30*d83cc019SAndroid Build Coastguard Worker #include <stdio.h>
31*d83cc019SAndroid Build Coastguard Worker #include <stdint.h>
32*d83cc019SAndroid Build Coastguard Worker #include <stdbool.h>
33*d83cc019SAndroid Build Coastguard Worker #include <string.h>
34*d83cc019SAndroid Build Coastguard Worker #include <ftw.h>
35*d83cc019SAndroid Build Coastguard Worker 
36*d83cc019SAndroid Build Coastguard Worker #include <unistd.h>
37*d83cc019SAndroid Build Coastguard Worker #include <fcntl.h>
38*d83cc019SAndroid Build Coastguard Worker #include <dirent.h>
39*d83cc019SAndroid Build Coastguard Worker #include <sys/ioctl.h>
40*d83cc019SAndroid Build Coastguard Worker #include <sys/mman.h>
41*d83cc019SAndroid Build Coastguard Worker #include <sys/types.h>
42*d83cc019SAndroid Build Coastguard Worker #include <sys/stat.h>
43*d83cc019SAndroid Build Coastguard Worker #include <linux/i2c.h>
44*d83cc019SAndroid Build Coastguard Worker #include <linux/i2c-dev.h>
45*d83cc019SAndroid Build Coastguard Worker 
46*d83cc019SAndroid Build Coastguard Worker #include <drm.h>
47*d83cc019SAndroid Build Coastguard Worker 
48*d83cc019SAndroid Build Coastguard Worker #include "igt.h"
49*d83cc019SAndroid Build Coastguard Worker #include "igt_kmod.h"
50*d83cc019SAndroid Build Coastguard Worker #include "igt_sysfs.h"
51*d83cc019SAndroid Build Coastguard Worker #include "igt_debugfs.h"
52*d83cc019SAndroid Build Coastguard Worker #include "igt_device.h"
53*d83cc019SAndroid Build Coastguard Worker #include "igt_edid.h"
54*d83cc019SAndroid Build Coastguard Worker 
55*d83cc019SAndroid Build Coastguard Worker #define MSR_PKG_CST_CONFIG_CONTROL	0xE2
56*d83cc019SAndroid Build Coastguard Worker /* HSW/BDW: */
57*d83cc019SAndroid Build Coastguard Worker #define  PKG_CST_LIMIT_MASK		0xF
58*d83cc019SAndroid Build Coastguard Worker #define  PKG_CST_LIMIT_C8		0x6
59*d83cc019SAndroid Build Coastguard Worker 
60*d83cc019SAndroid Build Coastguard Worker #define MSR_PC8_RES	0x630
61*d83cc019SAndroid Build Coastguard Worker #define MSR_PC9_RES	0x631
62*d83cc019SAndroid Build Coastguard Worker #define MSR_PC10_RES	0x632
63*d83cc019SAndroid Build Coastguard Worker 
64*d83cc019SAndroid Build Coastguard Worker #define MAX_CONNECTORS	32
65*d83cc019SAndroid Build Coastguard Worker #define MAX_ENCODERS	32
66*d83cc019SAndroid Build Coastguard Worker #define MAX_CRTCS	16
67*d83cc019SAndroid Build Coastguard Worker 
68*d83cc019SAndroid Build Coastguard Worker enum pc8_status {
69*d83cc019SAndroid Build Coastguard Worker 	PC8_ENABLED,
70*d83cc019SAndroid Build Coastguard Worker 	PC8_DISABLED
71*d83cc019SAndroid Build Coastguard Worker };
72*d83cc019SAndroid Build Coastguard Worker 
73*d83cc019SAndroid Build Coastguard Worker enum screen_type {
74*d83cc019SAndroid Build Coastguard Worker 	SCREEN_TYPE_LPSP,
75*d83cc019SAndroid Build Coastguard Worker 	SCREEN_TYPE_NON_LPSP,
76*d83cc019SAndroid Build Coastguard Worker 	SCREEN_TYPE_ANY,
77*d83cc019SAndroid Build Coastguard Worker };
78*d83cc019SAndroid Build Coastguard Worker 
79*d83cc019SAndroid Build Coastguard Worker enum plane_type {
80*d83cc019SAndroid Build Coastguard Worker 	PLANE_OVERLAY,
81*d83cc019SAndroid Build Coastguard Worker 	PLANE_PRIMARY,
82*d83cc019SAndroid Build Coastguard Worker 	PLANE_CURSOR,
83*d83cc019SAndroid Build Coastguard Worker };
84*d83cc019SAndroid Build Coastguard Worker 
85*d83cc019SAndroid Build Coastguard Worker /* Wait flags */
86*d83cc019SAndroid Build Coastguard Worker #define DONT_WAIT	0
87*d83cc019SAndroid Build Coastguard Worker #define WAIT_STATUS	1
88*d83cc019SAndroid Build Coastguard Worker #define WAIT_PC8_RES	2
89*d83cc019SAndroid Build Coastguard Worker #define WAIT_EXTRA	4
90*d83cc019SAndroid Build Coastguard Worker #define USE_DPMS	8
91*d83cc019SAndroid Build Coastguard Worker 
92*d83cc019SAndroid Build Coastguard Worker int drm_fd, msr_fd, pc8_status_fd;
93*d83cc019SAndroid Build Coastguard Worker int debugfs;
94*d83cc019SAndroid Build Coastguard Worker bool has_runtime_pm, has_pc8;
95*d83cc019SAndroid Build Coastguard Worker struct mode_set_data ms_data;
96*d83cc019SAndroid Build Coastguard Worker 
97*d83cc019SAndroid Build Coastguard Worker /* Stuff used when creating FBs and mode setting. */
98*d83cc019SAndroid Build Coastguard Worker struct mode_set_data {
99*d83cc019SAndroid Build Coastguard Worker 	drmModeResPtr res;
100*d83cc019SAndroid Build Coastguard Worker 	drmModeConnectorPtr connectors[MAX_CONNECTORS];
101*d83cc019SAndroid Build Coastguard Worker 	drmModePropertyBlobPtr edids[MAX_CONNECTORS];
102*d83cc019SAndroid Build Coastguard Worker 
103*d83cc019SAndroid Build Coastguard Worker 	uint32_t devid;
104*d83cc019SAndroid Build Coastguard Worker };
105*d83cc019SAndroid Build Coastguard Worker 
106*d83cc019SAndroid Build Coastguard Worker /* Stuff we query at different times so we can compare. */
107*d83cc019SAndroid Build Coastguard Worker struct compare_data {
108*d83cc019SAndroid Build Coastguard Worker 	drmModeResPtr res;
109*d83cc019SAndroid Build Coastguard Worker 	drmModeEncoderPtr encoders[MAX_ENCODERS];
110*d83cc019SAndroid Build Coastguard Worker 	drmModeConnectorPtr connectors[MAX_CONNECTORS];
111*d83cc019SAndroid Build Coastguard Worker 	drmModeCrtcPtr crtcs[MAX_CRTCS];
112*d83cc019SAndroid Build Coastguard Worker 	drmModePropertyBlobPtr edids[MAX_CONNECTORS];
113*d83cc019SAndroid Build Coastguard Worker };
114*d83cc019SAndroid Build Coastguard Worker 
115*d83cc019SAndroid Build Coastguard Worker struct modeset_params {
116*d83cc019SAndroid Build Coastguard Worker 	uint32_t crtc_id;
117*d83cc019SAndroid Build Coastguard Worker 	uint32_t connector_id;
118*d83cc019SAndroid Build Coastguard Worker 	struct igt_fb fb;
119*d83cc019SAndroid Build Coastguard Worker 	drmModeModeInfoPtr mode;
120*d83cc019SAndroid Build Coastguard Worker };
121*d83cc019SAndroid Build Coastguard Worker 
122*d83cc019SAndroid Build Coastguard Worker struct modeset_params lpsp_mode_params;
123*d83cc019SAndroid Build Coastguard Worker struct modeset_params non_lpsp_mode_params;
124*d83cc019SAndroid Build Coastguard Worker struct modeset_params *default_mode_params;
125*d83cc019SAndroid Build Coastguard Worker 
126*d83cc019SAndroid Build Coastguard Worker static int8_t *pm_data = NULL;
127*d83cc019SAndroid Build Coastguard Worker 
modprobe(const char * driver)128*d83cc019SAndroid Build Coastguard Worker static int modprobe(const char *driver)
129*d83cc019SAndroid Build Coastguard Worker {
130*d83cc019SAndroid Build Coastguard Worker 	return igt_kmod_load(driver, NULL);
131*d83cc019SAndroid Build Coastguard Worker }
132*d83cc019SAndroid Build Coastguard Worker 
133*d83cc019SAndroid Build Coastguard Worker /* If the read fails, then the machine doesn't support PC8+ residencies. */
supports_pc8_plus_residencies(void)134*d83cc019SAndroid Build Coastguard Worker static bool supports_pc8_plus_residencies(void)
135*d83cc019SAndroid Build Coastguard Worker {
136*d83cc019SAndroid Build Coastguard Worker 	int rc;
137*d83cc019SAndroid Build Coastguard Worker 	uint64_t val;
138*d83cc019SAndroid Build Coastguard Worker 
139*d83cc019SAndroid Build Coastguard Worker 	rc = pread(msr_fd, &val, sizeof(uint64_t), MSR_PC8_RES);
140*d83cc019SAndroid Build Coastguard Worker 	if (rc != sizeof(val))
141*d83cc019SAndroid Build Coastguard Worker 		return false;
142*d83cc019SAndroid Build Coastguard Worker 	rc = pread(msr_fd, &val, sizeof(uint64_t), MSR_PC9_RES);
143*d83cc019SAndroid Build Coastguard Worker 	if (rc != sizeof(val))
144*d83cc019SAndroid Build Coastguard Worker 		return false;
145*d83cc019SAndroid Build Coastguard Worker 	rc = pread(msr_fd, &val, sizeof(uint64_t), MSR_PC10_RES);
146*d83cc019SAndroid Build Coastguard Worker 	if (rc != sizeof(val))
147*d83cc019SAndroid Build Coastguard Worker 		return false;
148*d83cc019SAndroid Build Coastguard Worker 
149*d83cc019SAndroid Build Coastguard Worker 	rc = pread(msr_fd, &val, sizeof(uint64_t), MSR_PKG_CST_CONFIG_CONTROL);
150*d83cc019SAndroid Build Coastguard Worker 	if (rc != sizeof(val))
151*d83cc019SAndroid Build Coastguard Worker 		return false;
152*d83cc019SAndroid Build Coastguard Worker 	if ((val & PKG_CST_LIMIT_MASK) < PKG_CST_LIMIT_C8) {
153*d83cc019SAndroid Build Coastguard Worker 		igt_info("PKG C-states limited below PC8 by the BIOS\n");
154*d83cc019SAndroid Build Coastguard Worker 		return false;
155*d83cc019SAndroid Build Coastguard Worker 	}
156*d83cc019SAndroid Build Coastguard Worker 
157*d83cc019SAndroid Build Coastguard Worker 	return true;
158*d83cc019SAndroid Build Coastguard Worker }
159*d83cc019SAndroid Build Coastguard Worker 
get_residency(uint32_t type)160*d83cc019SAndroid Build Coastguard Worker static uint64_t get_residency(uint32_t type)
161*d83cc019SAndroid Build Coastguard Worker {
162*d83cc019SAndroid Build Coastguard Worker 	int rc;
163*d83cc019SAndroid Build Coastguard Worker 	uint64_t ret;
164*d83cc019SAndroid Build Coastguard Worker 
165*d83cc019SAndroid Build Coastguard Worker 	rc = pread(msr_fd, &ret, sizeof(uint64_t), type);
166*d83cc019SAndroid Build Coastguard Worker 	igt_assert(rc == sizeof(ret));
167*d83cc019SAndroid Build Coastguard Worker 
168*d83cc019SAndroid Build Coastguard Worker 	return ret;
169*d83cc019SAndroid Build Coastguard Worker }
170*d83cc019SAndroid Build Coastguard Worker 
pc8_plus_residency_changed(unsigned int timeout_sec)171*d83cc019SAndroid Build Coastguard Worker static bool pc8_plus_residency_changed(unsigned int timeout_sec)
172*d83cc019SAndroid Build Coastguard Worker {
173*d83cc019SAndroid Build Coastguard Worker 	uint64_t res_pc8, res_pc9, res_pc10;
174*d83cc019SAndroid Build Coastguard Worker 
175*d83cc019SAndroid Build Coastguard Worker 	res_pc8 = get_residency(MSR_PC8_RES);
176*d83cc019SAndroid Build Coastguard Worker 	res_pc9 = get_residency(MSR_PC9_RES);
177*d83cc019SAndroid Build Coastguard Worker 	res_pc10 = get_residency(MSR_PC10_RES);
178*d83cc019SAndroid Build Coastguard Worker 
179*d83cc019SAndroid Build Coastguard Worker 	return igt_wait(res_pc8 != get_residency(MSR_PC8_RES) ||
180*d83cc019SAndroid Build Coastguard Worker 			res_pc9 != get_residency(MSR_PC9_RES) ||
181*d83cc019SAndroid Build Coastguard Worker 			res_pc10 != get_residency(MSR_PC10_RES),
182*d83cc019SAndroid Build Coastguard Worker 			timeout_sec * 1000, 100);
183*d83cc019SAndroid Build Coastguard Worker }
184*d83cc019SAndroid Build Coastguard Worker 
get_pc8_status(void)185*d83cc019SAndroid Build Coastguard Worker static enum pc8_status get_pc8_status(void)
186*d83cc019SAndroid Build Coastguard Worker {
187*d83cc019SAndroid Build Coastguard Worker 	ssize_t n_read;
188*d83cc019SAndroid Build Coastguard Worker 	char buf[150]; /* The whole file has less than 100 chars. */
189*d83cc019SAndroid Build Coastguard Worker 
190*d83cc019SAndroid Build Coastguard Worker 	lseek(pc8_status_fd, 0, SEEK_SET);
191*d83cc019SAndroid Build Coastguard Worker 	n_read = read(pc8_status_fd, buf, ARRAY_SIZE(buf));
192*d83cc019SAndroid Build Coastguard Worker 	igt_assert(n_read >= 0);
193*d83cc019SAndroid Build Coastguard Worker 	buf[n_read] = '\0';
194*d83cc019SAndroid Build Coastguard Worker 
195*d83cc019SAndroid Build Coastguard Worker 	if (strstr(buf, "\nEnabled: yes\n"))
196*d83cc019SAndroid Build Coastguard Worker 		return PC8_ENABLED;
197*d83cc019SAndroid Build Coastguard Worker 	else
198*d83cc019SAndroid Build Coastguard Worker 		return PC8_DISABLED;
199*d83cc019SAndroid Build Coastguard Worker }
200*d83cc019SAndroid Build Coastguard Worker 
wait_for_pc8_status(enum pc8_status status)201*d83cc019SAndroid Build Coastguard Worker static bool wait_for_pc8_status(enum pc8_status status)
202*d83cc019SAndroid Build Coastguard Worker {
203*d83cc019SAndroid Build Coastguard Worker 	return igt_wait(get_pc8_status() == status, 10000, 100);
204*d83cc019SAndroid Build Coastguard Worker }
205*d83cc019SAndroid Build Coastguard Worker 
wait_for_suspended(void)206*d83cc019SAndroid Build Coastguard Worker static bool wait_for_suspended(void)
207*d83cc019SAndroid Build Coastguard Worker {
208*d83cc019SAndroid Build Coastguard Worker 	if (has_pc8 && !has_runtime_pm)
209*d83cc019SAndroid Build Coastguard Worker 		return wait_for_pc8_status(PC8_ENABLED);
210*d83cc019SAndroid Build Coastguard Worker 	else
211*d83cc019SAndroid Build Coastguard Worker 		return igt_wait_for_pm_status(IGT_RUNTIME_PM_STATUS_SUSPENDED);
212*d83cc019SAndroid Build Coastguard Worker }
213*d83cc019SAndroid Build Coastguard Worker 
wait_for_active(void)214*d83cc019SAndroid Build Coastguard Worker static bool wait_for_active(void)
215*d83cc019SAndroid Build Coastguard Worker {
216*d83cc019SAndroid Build Coastguard Worker 	if (has_pc8 && !has_runtime_pm)
217*d83cc019SAndroid Build Coastguard Worker 		return wait_for_pc8_status(PC8_DISABLED);
218*d83cc019SAndroid Build Coastguard Worker 	else
219*d83cc019SAndroid Build Coastguard Worker 		return igt_wait_for_pm_status(IGT_RUNTIME_PM_STATUS_ACTIVE);
220*d83cc019SAndroid Build Coastguard Worker }
221*d83cc019SAndroid Build Coastguard Worker 
disable_all_screens_dpms(struct mode_set_data * data)222*d83cc019SAndroid Build Coastguard Worker static void disable_all_screens_dpms(struct mode_set_data *data)
223*d83cc019SAndroid Build Coastguard Worker {
224*d83cc019SAndroid Build Coastguard Worker 	if (!data->res)
225*d83cc019SAndroid Build Coastguard Worker 		return;
226*d83cc019SAndroid Build Coastguard Worker 
227*d83cc019SAndroid Build Coastguard Worker 	for (int i = 0; i < data->res->count_connectors; i++) {
228*d83cc019SAndroid Build Coastguard Worker 		drmModeConnectorPtr c = data->connectors[i];
229*d83cc019SAndroid Build Coastguard Worker 
230*d83cc019SAndroid Build Coastguard Worker 		kmstest_set_connector_dpms(drm_fd, c, DRM_MODE_DPMS_OFF);
231*d83cc019SAndroid Build Coastguard Worker 	}
232*d83cc019SAndroid Build Coastguard Worker }
233*d83cc019SAndroid Build Coastguard Worker 
disable_all_screens(struct mode_set_data * data)234*d83cc019SAndroid Build Coastguard Worker static void disable_all_screens(struct mode_set_data *data)
235*d83cc019SAndroid Build Coastguard Worker {
236*d83cc019SAndroid Build Coastguard Worker 	if (data->res)
237*d83cc019SAndroid Build Coastguard Worker 		kmstest_unset_all_crtcs(drm_fd, data->res);
238*d83cc019SAndroid Build Coastguard Worker }
239*d83cc019SAndroid Build Coastguard Worker 
240*d83cc019SAndroid Build Coastguard Worker #define disable_all_screens_and_wait(data) do { \
241*d83cc019SAndroid Build Coastguard Worker 	disable_all_screens(data); \
242*d83cc019SAndroid Build Coastguard Worker 	igt_assert(wait_for_suspended()); \
243*d83cc019SAndroid Build Coastguard Worker } while (0)
244*d83cc019SAndroid Build Coastguard Worker 
disable_or_dpms_all_screens(struct mode_set_data * data,bool dpms)245*d83cc019SAndroid Build Coastguard Worker static void disable_or_dpms_all_screens(struct mode_set_data *data, bool dpms)
246*d83cc019SAndroid Build Coastguard Worker {
247*d83cc019SAndroid Build Coastguard Worker 	if (dpms)
248*d83cc019SAndroid Build Coastguard Worker 		disable_all_screens_dpms(&ms_data);
249*d83cc019SAndroid Build Coastguard Worker 	else
250*d83cc019SAndroid Build Coastguard Worker 		disable_all_screens(&ms_data);
251*d83cc019SAndroid Build Coastguard Worker }
252*d83cc019SAndroid Build Coastguard Worker 
253*d83cc019SAndroid Build Coastguard Worker #define disable_or_dpms_all_screens_and_wait(data, dpms) do { \
254*d83cc019SAndroid Build Coastguard Worker 	disable_or_dpms_all_screens((data), (dpms)); \
255*d83cc019SAndroid Build Coastguard Worker 	igt_assert(wait_for_suspended()); \
256*d83cc019SAndroid Build Coastguard Worker } while (0)
257*d83cc019SAndroid Build Coastguard Worker 
init_modeset_params_for_type(struct mode_set_data * data,struct modeset_params * params,enum screen_type type)258*d83cc019SAndroid Build Coastguard Worker static bool init_modeset_params_for_type(struct mode_set_data *data,
259*d83cc019SAndroid Build Coastguard Worker 					 struct modeset_params *params,
260*d83cc019SAndroid Build Coastguard Worker 					 enum screen_type type)
261*d83cc019SAndroid Build Coastguard Worker {
262*d83cc019SAndroid Build Coastguard Worker 	drmModeConnectorPtr connector = NULL;
263*d83cc019SAndroid Build Coastguard Worker 	drmModeModeInfoPtr mode = NULL;
264*d83cc019SAndroid Build Coastguard Worker 
265*d83cc019SAndroid Build Coastguard Worker 	if (!data->res)
266*d83cc019SAndroid Build Coastguard Worker 		return false;
267*d83cc019SAndroid Build Coastguard Worker 
268*d83cc019SAndroid Build Coastguard Worker 	for (int i = 0; i < data->res->count_connectors; i++) {
269*d83cc019SAndroid Build Coastguard Worker 		drmModeConnectorPtr c = data->connectors[i];
270*d83cc019SAndroid Build Coastguard Worker 
271*d83cc019SAndroid Build Coastguard Worker 		if (type == SCREEN_TYPE_LPSP &&
272*d83cc019SAndroid Build Coastguard Worker 		    c->connector_type != DRM_MODE_CONNECTOR_eDP)
273*d83cc019SAndroid Build Coastguard Worker 			continue;
274*d83cc019SAndroid Build Coastguard Worker 
275*d83cc019SAndroid Build Coastguard Worker 		if (type == SCREEN_TYPE_NON_LPSP &&
276*d83cc019SAndroid Build Coastguard Worker 		    c->connector_type == DRM_MODE_CONNECTOR_eDP)
277*d83cc019SAndroid Build Coastguard Worker 			continue;
278*d83cc019SAndroid Build Coastguard Worker 
279*d83cc019SAndroid Build Coastguard Worker 		if (c->connection == DRM_MODE_CONNECTED && c->count_modes) {
280*d83cc019SAndroid Build Coastguard Worker 			connector = c;
281*d83cc019SAndroid Build Coastguard Worker 			mode = &c->modes[0];
282*d83cc019SAndroid Build Coastguard Worker 			break;
283*d83cc019SAndroid Build Coastguard Worker 		}
284*d83cc019SAndroid Build Coastguard Worker 	}
285*d83cc019SAndroid Build Coastguard Worker 
286*d83cc019SAndroid Build Coastguard Worker 	if (!connector)
287*d83cc019SAndroid Build Coastguard Worker 		return false;
288*d83cc019SAndroid Build Coastguard Worker 
289*d83cc019SAndroid Build Coastguard Worker 	igt_create_pattern_fb(drm_fd, mode->hdisplay, mode->vdisplay,
290*d83cc019SAndroid Build Coastguard Worker 			      DRM_FORMAT_XRGB8888, LOCAL_DRM_FORMAT_MOD_NONE,
291*d83cc019SAndroid Build Coastguard Worker 			      &params->fb);
292*d83cc019SAndroid Build Coastguard Worker 
293*d83cc019SAndroid Build Coastguard Worker 	params->crtc_id = kmstest_find_crtc_for_connector(drm_fd, data->res,
294*d83cc019SAndroid Build Coastguard Worker 							  connector, 0);
295*d83cc019SAndroid Build Coastguard Worker 	params->connector_id = connector->connector_id;
296*d83cc019SAndroid Build Coastguard Worker 	params->mode = mode;
297*d83cc019SAndroid Build Coastguard Worker 
298*d83cc019SAndroid Build Coastguard Worker 	return true;
299*d83cc019SAndroid Build Coastguard Worker }
300*d83cc019SAndroid Build Coastguard Worker 
init_modeset_cached_params(struct mode_set_data * data)301*d83cc019SAndroid Build Coastguard Worker static void init_modeset_cached_params(struct mode_set_data *data)
302*d83cc019SAndroid Build Coastguard Worker {
303*d83cc019SAndroid Build Coastguard Worker 	bool lpsp, non_lpsp;
304*d83cc019SAndroid Build Coastguard Worker 
305*d83cc019SAndroid Build Coastguard Worker 	lpsp = init_modeset_params_for_type(data, &lpsp_mode_params,
306*d83cc019SAndroid Build Coastguard Worker 					    SCREEN_TYPE_LPSP);
307*d83cc019SAndroid Build Coastguard Worker 	non_lpsp = init_modeset_params_for_type(data, &non_lpsp_mode_params,
308*d83cc019SAndroid Build Coastguard Worker 						SCREEN_TYPE_NON_LPSP);
309*d83cc019SAndroid Build Coastguard Worker 
310*d83cc019SAndroid Build Coastguard Worker 	if (lpsp)
311*d83cc019SAndroid Build Coastguard Worker 		default_mode_params = &lpsp_mode_params;
312*d83cc019SAndroid Build Coastguard Worker 	else if (non_lpsp)
313*d83cc019SAndroid Build Coastguard Worker 		default_mode_params = &non_lpsp_mode_params;
314*d83cc019SAndroid Build Coastguard Worker 	else
315*d83cc019SAndroid Build Coastguard Worker 		default_mode_params = NULL;
316*d83cc019SAndroid Build Coastguard Worker }
317*d83cc019SAndroid Build Coastguard Worker 
set_mode_for_params(struct modeset_params * params)318*d83cc019SAndroid Build Coastguard Worker static bool set_mode_for_params(struct modeset_params *params)
319*d83cc019SAndroid Build Coastguard Worker {
320*d83cc019SAndroid Build Coastguard Worker 	int rc;
321*d83cc019SAndroid Build Coastguard Worker 
322*d83cc019SAndroid Build Coastguard Worker 	rc = drmModeSetCrtc(drm_fd, params->crtc_id, params->fb.fb_id, 0, 0,
323*d83cc019SAndroid Build Coastguard Worker 			    &params->connector_id, 1, params->mode);
324*d83cc019SAndroid Build Coastguard Worker 	return (rc == 0);
325*d83cc019SAndroid Build Coastguard Worker }
326*d83cc019SAndroid Build Coastguard Worker 
327*d83cc019SAndroid Build Coastguard Worker #define set_mode_for_params_and_wait(params) do { \
328*d83cc019SAndroid Build Coastguard Worker 	igt_assert(set_mode_for_params(params)); \
329*d83cc019SAndroid Build Coastguard Worker 	igt_assert(wait_for_active()); \
330*d83cc019SAndroid Build Coastguard Worker } while (0)
331*d83cc019SAndroid Build Coastguard Worker 
enable_one_screen_with_type(struct mode_set_data * data,enum screen_type type)332*d83cc019SAndroid Build Coastguard Worker static bool enable_one_screen_with_type(struct mode_set_data *data,
333*d83cc019SAndroid Build Coastguard Worker 					enum screen_type type)
334*d83cc019SAndroid Build Coastguard Worker {
335*d83cc019SAndroid Build Coastguard Worker 	struct modeset_params *params = NULL;
336*d83cc019SAndroid Build Coastguard Worker 
337*d83cc019SAndroid Build Coastguard Worker 	switch (type) {
338*d83cc019SAndroid Build Coastguard Worker 	case SCREEN_TYPE_ANY:
339*d83cc019SAndroid Build Coastguard Worker 		params = default_mode_params;
340*d83cc019SAndroid Build Coastguard Worker 		break;
341*d83cc019SAndroid Build Coastguard Worker 	case SCREEN_TYPE_LPSP:
342*d83cc019SAndroid Build Coastguard Worker 		params = &lpsp_mode_params;
343*d83cc019SAndroid Build Coastguard Worker 		break;
344*d83cc019SAndroid Build Coastguard Worker 	case SCREEN_TYPE_NON_LPSP:
345*d83cc019SAndroid Build Coastguard Worker 		params = &non_lpsp_mode_params;
346*d83cc019SAndroid Build Coastguard Worker 		break;
347*d83cc019SAndroid Build Coastguard Worker 	default:
348*d83cc019SAndroid Build Coastguard Worker 		igt_assert(0);
349*d83cc019SAndroid Build Coastguard Worker 	}
350*d83cc019SAndroid Build Coastguard Worker 
351*d83cc019SAndroid Build Coastguard Worker 	if (!params)
352*d83cc019SAndroid Build Coastguard Worker 		return false;
353*d83cc019SAndroid Build Coastguard Worker 
354*d83cc019SAndroid Build Coastguard Worker 	return set_mode_for_params(params);
355*d83cc019SAndroid Build Coastguard Worker }
356*d83cc019SAndroid Build Coastguard Worker 
enable_one_screen(struct mode_set_data * data)357*d83cc019SAndroid Build Coastguard Worker static void enable_one_screen(struct mode_set_data *data)
358*d83cc019SAndroid Build Coastguard Worker {
359*d83cc019SAndroid Build Coastguard Worker 	/* SKIP if there are no connected screens. */
360*d83cc019SAndroid Build Coastguard Worker 	igt_require(enable_one_screen_with_type(data, SCREEN_TYPE_ANY));
361*d83cc019SAndroid Build Coastguard Worker }
362*d83cc019SAndroid Build Coastguard Worker 
363*d83cc019SAndroid Build Coastguard Worker #define enable_one_screen_and_wait(data) do { \
364*d83cc019SAndroid Build Coastguard Worker 	enable_one_screen(data); \
365*d83cc019SAndroid Build Coastguard Worker 	igt_assert(wait_for_active()); \
366*d83cc019SAndroid Build Coastguard Worker } while (0)
367*d83cc019SAndroid Build Coastguard Worker 
get_connector_edid(drmModeConnectorPtr connector,int index)368*d83cc019SAndroid Build Coastguard Worker static drmModePropertyBlobPtr get_connector_edid(drmModeConnectorPtr connector,
369*d83cc019SAndroid Build Coastguard Worker 						 int index)
370*d83cc019SAndroid Build Coastguard Worker {
371*d83cc019SAndroid Build Coastguard Worker 	bool found;
372*d83cc019SAndroid Build Coastguard Worker 	uint64_t prop_value;
373*d83cc019SAndroid Build Coastguard Worker 	drmModePropertyPtr prop;
374*d83cc019SAndroid Build Coastguard Worker 	drmModePropertyBlobPtr blob = NULL;
375*d83cc019SAndroid Build Coastguard Worker 
376*d83cc019SAndroid Build Coastguard Worker 	found = kmstest_get_property(drm_fd, connector->connector_id,
377*d83cc019SAndroid Build Coastguard Worker 				     DRM_MODE_OBJECT_CONNECTOR, "EDID",
378*d83cc019SAndroid Build Coastguard Worker 				     NULL, &prop_value, &prop);
379*d83cc019SAndroid Build Coastguard Worker 
380*d83cc019SAndroid Build Coastguard Worker 	if (found) {
381*d83cc019SAndroid Build Coastguard Worker 		igt_assert(prop->flags & DRM_MODE_PROP_BLOB);
382*d83cc019SAndroid Build Coastguard Worker 		igt_assert(prop->count_blobs == 0);
383*d83cc019SAndroid Build Coastguard Worker 
384*d83cc019SAndroid Build Coastguard Worker 		blob = drmModeGetPropertyBlob(drm_fd, prop_value);
385*d83cc019SAndroid Build Coastguard Worker 
386*d83cc019SAndroid Build Coastguard Worker 		drmModeFreeProperty(prop);
387*d83cc019SAndroid Build Coastguard Worker 	}
388*d83cc019SAndroid Build Coastguard Worker 
389*d83cc019SAndroid Build Coastguard Worker 	return blob;
390*d83cc019SAndroid Build Coastguard Worker }
391*d83cc019SAndroid Build Coastguard Worker 
init_mode_set_data(struct mode_set_data * data)392*d83cc019SAndroid Build Coastguard Worker static void init_mode_set_data(struct mode_set_data *data)
393*d83cc019SAndroid Build Coastguard Worker {
394*d83cc019SAndroid Build Coastguard Worker 	data->res = drmModeGetResources(drm_fd);
395*d83cc019SAndroid Build Coastguard Worker 	if (data->res) {
396*d83cc019SAndroid Build Coastguard Worker 		igt_assert(data->res->count_connectors <= MAX_CONNECTORS);
397*d83cc019SAndroid Build Coastguard Worker 		for (int i = 0; i < data->res->count_connectors; i++) {
398*d83cc019SAndroid Build Coastguard Worker 			data->connectors[i] =
399*d83cc019SAndroid Build Coastguard Worker 				drmModeGetConnector(drm_fd,
400*d83cc019SAndroid Build Coastguard Worker 						    data->res->connectors[i]);
401*d83cc019SAndroid Build Coastguard Worker 			data->edids[i] = get_connector_edid(data->connectors[i], i);
402*d83cc019SAndroid Build Coastguard Worker 		}
403*d83cc019SAndroid Build Coastguard Worker 
404*d83cc019SAndroid Build Coastguard Worker 		kmstest_set_vt_graphics_mode();
405*d83cc019SAndroid Build Coastguard Worker 	}
406*d83cc019SAndroid Build Coastguard Worker 
407*d83cc019SAndroid Build Coastguard Worker 	data->devid = intel_get_drm_devid(drm_fd);
408*d83cc019SAndroid Build Coastguard Worker 	init_modeset_cached_params(&ms_data);
409*d83cc019SAndroid Build Coastguard Worker }
410*d83cc019SAndroid Build Coastguard Worker 
fini_mode_set_data(struct mode_set_data * data)411*d83cc019SAndroid Build Coastguard Worker static void fini_mode_set_data(struct mode_set_data *data)
412*d83cc019SAndroid Build Coastguard Worker {
413*d83cc019SAndroid Build Coastguard Worker 	if (data->res) {
414*d83cc019SAndroid Build Coastguard Worker 		for (int i = 0; i < data->res->count_connectors; i++) {
415*d83cc019SAndroid Build Coastguard Worker 			drmModeFreeConnector(data->connectors[i]);
416*d83cc019SAndroid Build Coastguard Worker 			drmModeFreePropertyBlob(data->edids[i]);
417*d83cc019SAndroid Build Coastguard Worker 		}
418*d83cc019SAndroid Build Coastguard Worker 		drmModeFreeResources(data->res);
419*d83cc019SAndroid Build Coastguard Worker 	}
420*d83cc019SAndroid Build Coastguard Worker }
421*d83cc019SAndroid Build Coastguard Worker 
get_drm_info(struct compare_data * data)422*d83cc019SAndroid Build Coastguard Worker static void get_drm_info(struct compare_data *data)
423*d83cc019SAndroid Build Coastguard Worker {
424*d83cc019SAndroid Build Coastguard Worker 	int i;
425*d83cc019SAndroid Build Coastguard Worker 
426*d83cc019SAndroid Build Coastguard Worker 	data->res = drmModeGetResources(drm_fd);
427*d83cc019SAndroid Build Coastguard Worker 	if (!data->res)
428*d83cc019SAndroid Build Coastguard Worker 		return;
429*d83cc019SAndroid Build Coastguard Worker 
430*d83cc019SAndroid Build Coastguard Worker 	igt_assert(data->res->count_connectors <= MAX_CONNECTORS);
431*d83cc019SAndroid Build Coastguard Worker 	igt_assert(data->res->count_encoders <= MAX_ENCODERS);
432*d83cc019SAndroid Build Coastguard Worker 	igt_assert(data->res->count_crtcs <= MAX_CRTCS);
433*d83cc019SAndroid Build Coastguard Worker 
434*d83cc019SAndroid Build Coastguard Worker 	for (i = 0; i < data->res->count_connectors; i++) {
435*d83cc019SAndroid Build Coastguard Worker 		/* Don't use GetConnectorCurrent, we want to force a reprobe
436*d83cc019SAndroid Build Coastguard Worker 		 * here. */
437*d83cc019SAndroid Build Coastguard Worker 		data->connectors[i] = drmModeGetConnector(drm_fd,
438*d83cc019SAndroid Build Coastguard Worker 						data->res->connectors[i]);
439*d83cc019SAndroid Build Coastguard Worker 		data->edids[i] = get_connector_edid(data->connectors[i], i);
440*d83cc019SAndroid Build Coastguard Worker 	}
441*d83cc019SAndroid Build Coastguard Worker 	for (i = 0; i < data->res->count_encoders; i++)
442*d83cc019SAndroid Build Coastguard Worker 		data->encoders[i] = drmModeGetEncoder(drm_fd,
443*d83cc019SAndroid Build Coastguard Worker 						data->res->encoders[i]);
444*d83cc019SAndroid Build Coastguard Worker 	for (i = 0; i < data->res->count_crtcs; i++)
445*d83cc019SAndroid Build Coastguard Worker 		data->crtcs[i] = drmModeGetCrtc(drm_fd, data->res->crtcs[i]);
446*d83cc019SAndroid Build Coastguard Worker }
447*d83cc019SAndroid Build Coastguard Worker 
free_drm_info(struct compare_data * data)448*d83cc019SAndroid Build Coastguard Worker static void free_drm_info(struct compare_data *data)
449*d83cc019SAndroid Build Coastguard Worker {
450*d83cc019SAndroid Build Coastguard Worker 	int i;
451*d83cc019SAndroid Build Coastguard Worker 
452*d83cc019SAndroid Build Coastguard Worker 	if (!data->res)
453*d83cc019SAndroid Build Coastguard Worker 		return;
454*d83cc019SAndroid Build Coastguard Worker 
455*d83cc019SAndroid Build Coastguard Worker 	for (i = 0; i < data->res->count_connectors; i++) {
456*d83cc019SAndroid Build Coastguard Worker 		drmModeFreeConnector(data->connectors[i]);
457*d83cc019SAndroid Build Coastguard Worker 		drmModeFreePropertyBlob(data->edids[i]);
458*d83cc019SAndroid Build Coastguard Worker 	}
459*d83cc019SAndroid Build Coastguard Worker 	for (i = 0; i < data->res->count_encoders; i++)
460*d83cc019SAndroid Build Coastguard Worker 		drmModeFreeEncoder(data->encoders[i]);
461*d83cc019SAndroid Build Coastguard Worker 	for (i = 0; i < data->res->count_crtcs; i++)
462*d83cc019SAndroid Build Coastguard Worker 		drmModeFreeCrtc(data->crtcs[i]);
463*d83cc019SAndroid Build Coastguard Worker 
464*d83cc019SAndroid Build Coastguard Worker 	drmModeFreeResources(data->res);
465*d83cc019SAndroid Build Coastguard Worker }
466*d83cc019SAndroid Build Coastguard Worker 
467*d83cc019SAndroid Build Coastguard Worker #define COMPARE(d1, d2, data) igt_assert_eq(d1->data, d2->data)
468*d83cc019SAndroid Build Coastguard Worker #define COMPARE_ARRAY(d1, d2, size, data) do { \
469*d83cc019SAndroid Build Coastguard Worker 	for (i = 0; i < size; i++) \
470*d83cc019SAndroid Build Coastguard Worker 		igt_assert(d1->data[i] == d2->data[i]); \
471*d83cc019SAndroid Build Coastguard Worker } while (0)
472*d83cc019SAndroid Build Coastguard Worker 
assert_drm_resources_equal(struct compare_data * d1,struct compare_data * d2)473*d83cc019SAndroid Build Coastguard Worker static void assert_drm_resources_equal(struct compare_data *d1,
474*d83cc019SAndroid Build Coastguard Worker 				       struct compare_data *d2)
475*d83cc019SAndroid Build Coastguard Worker {
476*d83cc019SAndroid Build Coastguard Worker 	COMPARE(d1, d2, res->count_connectors);
477*d83cc019SAndroid Build Coastguard Worker 	COMPARE(d1, d2, res->count_encoders);
478*d83cc019SAndroid Build Coastguard Worker 	COMPARE(d1, d2, res->count_crtcs);
479*d83cc019SAndroid Build Coastguard Worker 	COMPARE(d1, d2, res->min_width);
480*d83cc019SAndroid Build Coastguard Worker 	COMPARE(d1, d2, res->max_width);
481*d83cc019SAndroid Build Coastguard Worker 	COMPARE(d1, d2, res->min_height);
482*d83cc019SAndroid Build Coastguard Worker 	COMPARE(d1, d2, res->max_height);
483*d83cc019SAndroid Build Coastguard Worker }
484*d83cc019SAndroid Build Coastguard Worker 
assert_modes_equal(drmModeModeInfoPtr m1,drmModeModeInfoPtr m2)485*d83cc019SAndroid Build Coastguard Worker static void assert_modes_equal(drmModeModeInfoPtr m1, drmModeModeInfoPtr m2)
486*d83cc019SAndroid Build Coastguard Worker {
487*d83cc019SAndroid Build Coastguard Worker 	COMPARE(m1, m2, clock);
488*d83cc019SAndroid Build Coastguard Worker 	COMPARE(m1, m2, hdisplay);
489*d83cc019SAndroid Build Coastguard Worker 	COMPARE(m1, m2, hsync_start);
490*d83cc019SAndroid Build Coastguard Worker 	COMPARE(m1, m2, hsync_end);
491*d83cc019SAndroid Build Coastguard Worker 	COMPARE(m1, m2, htotal);
492*d83cc019SAndroid Build Coastguard Worker 	COMPARE(m1, m2, hskew);
493*d83cc019SAndroid Build Coastguard Worker 	COMPARE(m1, m2, vdisplay);
494*d83cc019SAndroid Build Coastguard Worker 	COMPARE(m1, m2, vsync_start);
495*d83cc019SAndroid Build Coastguard Worker 	COMPARE(m1, m2, vsync_end);
496*d83cc019SAndroid Build Coastguard Worker 	COMPARE(m1, m2, vtotal);
497*d83cc019SAndroid Build Coastguard Worker 	COMPARE(m1, m2, vscan);
498*d83cc019SAndroid Build Coastguard Worker 	COMPARE(m1, m2, vrefresh);
499*d83cc019SAndroid Build Coastguard Worker 	COMPARE(m1, m2, flags);
500*d83cc019SAndroid Build Coastguard Worker 	COMPARE(m1, m2, type);
501*d83cc019SAndroid Build Coastguard Worker 	igt_assert(strcmp(m1->name, m2->name) == 0);
502*d83cc019SAndroid Build Coastguard Worker }
503*d83cc019SAndroid Build Coastguard Worker 
assert_drm_connectors_equal(drmModeConnectorPtr c1,drmModeConnectorPtr c2)504*d83cc019SAndroid Build Coastguard Worker static void assert_drm_connectors_equal(drmModeConnectorPtr c1,
505*d83cc019SAndroid Build Coastguard Worker 					drmModeConnectorPtr c2)
506*d83cc019SAndroid Build Coastguard Worker {
507*d83cc019SAndroid Build Coastguard Worker 	int i;
508*d83cc019SAndroid Build Coastguard Worker 
509*d83cc019SAndroid Build Coastguard Worker 	COMPARE(c1, c2, connector_id);
510*d83cc019SAndroid Build Coastguard Worker 	COMPARE(c1, c2, connector_type);
511*d83cc019SAndroid Build Coastguard Worker 	COMPARE(c1, c2, connector_type_id);
512*d83cc019SAndroid Build Coastguard Worker 	COMPARE(c1, c2, mmWidth);
513*d83cc019SAndroid Build Coastguard Worker 	COMPARE(c1, c2, mmHeight);
514*d83cc019SAndroid Build Coastguard Worker 	COMPARE(c1, c2, count_modes);
515*d83cc019SAndroid Build Coastguard Worker 	COMPARE(c1, c2, count_props);
516*d83cc019SAndroid Build Coastguard Worker 	COMPARE(c1, c2, count_encoders);
517*d83cc019SAndroid Build Coastguard Worker 	COMPARE_ARRAY(c1, c2, c1->count_props, props);
518*d83cc019SAndroid Build Coastguard Worker 	COMPARE_ARRAY(c1, c2, c1->count_encoders, encoders);
519*d83cc019SAndroid Build Coastguard Worker 
520*d83cc019SAndroid Build Coastguard Worker 	for (i = 0; i < c1->count_modes; i++)
521*d83cc019SAndroid Build Coastguard Worker 		assert_modes_equal(&c1->modes[0], &c2->modes[0]);
522*d83cc019SAndroid Build Coastguard Worker }
523*d83cc019SAndroid Build Coastguard Worker 
assert_drm_encoders_equal(drmModeEncoderPtr e1,drmModeEncoderPtr e2)524*d83cc019SAndroid Build Coastguard Worker static void assert_drm_encoders_equal(drmModeEncoderPtr e1,
525*d83cc019SAndroid Build Coastguard Worker 				      drmModeEncoderPtr e2)
526*d83cc019SAndroid Build Coastguard Worker {
527*d83cc019SAndroid Build Coastguard Worker 	COMPARE(e1, e2, encoder_id);
528*d83cc019SAndroid Build Coastguard Worker 	COMPARE(e1, e2, encoder_type);
529*d83cc019SAndroid Build Coastguard Worker 	COMPARE(e1, e2, possible_crtcs);
530*d83cc019SAndroid Build Coastguard Worker 	COMPARE(e1, e2, possible_clones);
531*d83cc019SAndroid Build Coastguard Worker }
532*d83cc019SAndroid Build Coastguard Worker 
assert_drm_crtcs_equal(drmModeCrtcPtr c1,drmModeCrtcPtr c2)533*d83cc019SAndroid Build Coastguard Worker static void assert_drm_crtcs_equal(drmModeCrtcPtr c1, drmModeCrtcPtr c2)
534*d83cc019SAndroid Build Coastguard Worker {
535*d83cc019SAndroid Build Coastguard Worker 	COMPARE(c1, c2, crtc_id);
536*d83cc019SAndroid Build Coastguard Worker }
537*d83cc019SAndroid Build Coastguard Worker 
assert_drm_edids_equal(drmModePropertyBlobPtr e1,drmModePropertyBlobPtr e2)538*d83cc019SAndroid Build Coastguard Worker static void assert_drm_edids_equal(drmModePropertyBlobPtr e1,
539*d83cc019SAndroid Build Coastguard Worker 				   drmModePropertyBlobPtr e2)
540*d83cc019SAndroid Build Coastguard Worker {
541*d83cc019SAndroid Build Coastguard Worker 	if (!e1 && !e2)
542*d83cc019SAndroid Build Coastguard Worker 		return;
543*d83cc019SAndroid Build Coastguard Worker 	igt_assert(e1 && e2);
544*d83cc019SAndroid Build Coastguard Worker 
545*d83cc019SAndroid Build Coastguard Worker 	COMPARE(e1, e2, length);
546*d83cc019SAndroid Build Coastguard Worker 
547*d83cc019SAndroid Build Coastguard Worker 	igt_assert(memcmp(e1->data, e2->data, e1->length) == 0);
548*d83cc019SAndroid Build Coastguard Worker }
549*d83cc019SAndroid Build Coastguard Worker 
assert_drm_infos_equal(struct compare_data * d1,struct compare_data * d2)550*d83cc019SAndroid Build Coastguard Worker static void assert_drm_infos_equal(struct compare_data *d1,
551*d83cc019SAndroid Build Coastguard Worker 				   struct compare_data *d2)
552*d83cc019SAndroid Build Coastguard Worker {
553*d83cc019SAndroid Build Coastguard Worker 	int i;
554*d83cc019SAndroid Build Coastguard Worker 
555*d83cc019SAndroid Build Coastguard Worker 	if (d1->res == d2->res)
556*d83cc019SAndroid Build Coastguard Worker 		return;
557*d83cc019SAndroid Build Coastguard Worker 
558*d83cc019SAndroid Build Coastguard Worker 	igt_assert(d1->res);
559*d83cc019SAndroid Build Coastguard Worker 	igt_assert(d2->res);
560*d83cc019SAndroid Build Coastguard Worker 
561*d83cc019SAndroid Build Coastguard Worker 	assert_drm_resources_equal(d1, d2);
562*d83cc019SAndroid Build Coastguard Worker 
563*d83cc019SAndroid Build Coastguard Worker 	for (i = 0; i < d1->res->count_connectors; i++) {
564*d83cc019SAndroid Build Coastguard Worker 		assert_drm_connectors_equal(d1->connectors[i],
565*d83cc019SAndroid Build Coastguard Worker 					    d2->connectors[i]);
566*d83cc019SAndroid Build Coastguard Worker 		assert_drm_edids_equal(d1->edids[i], d2->edids[i]);
567*d83cc019SAndroid Build Coastguard Worker 	}
568*d83cc019SAndroid Build Coastguard Worker 
569*d83cc019SAndroid Build Coastguard Worker 	for (i = 0; i < d1->res->count_encoders; i++)
570*d83cc019SAndroid Build Coastguard Worker 		assert_drm_encoders_equal(d1->encoders[i], d2->encoders[i]);
571*d83cc019SAndroid Build Coastguard Worker 
572*d83cc019SAndroid Build Coastguard Worker 	for (i = 0; i < d1->res->count_crtcs; i++)
573*d83cc019SAndroid Build Coastguard Worker 		assert_drm_crtcs_equal(d1->crtcs[i], d2->crtcs[i]);
574*d83cc019SAndroid Build Coastguard Worker }
575*d83cc019SAndroid Build Coastguard Worker 
find_i2c_path(const char * connector_name,char * i2c_path)576*d83cc019SAndroid Build Coastguard Worker static bool find_i2c_path(const char *connector_name, char *i2c_path)
577*d83cc019SAndroid Build Coastguard Worker {
578*d83cc019SAndroid Build Coastguard Worker 	struct dirent *dirent;
579*d83cc019SAndroid Build Coastguard Worker 	DIR *dir;
580*d83cc019SAndroid Build Coastguard Worker 	int sysfs_card_fd = igt_sysfs_open(drm_fd);
581*d83cc019SAndroid Build Coastguard Worker 	int connector_fd = -1;
582*d83cc019SAndroid Build Coastguard Worker 	bool found_i2c_file = false;
583*d83cc019SAndroid Build Coastguard Worker 
584*d83cc019SAndroid Build Coastguard Worker 	dir = fdopendir(sysfs_card_fd);
585*d83cc019SAndroid Build Coastguard Worker 	igt_assert(dir);
586*d83cc019SAndroid Build Coastguard Worker 
587*d83cc019SAndroid Build Coastguard Worker 	while ((dirent = readdir(dir))) {
588*d83cc019SAndroid Build Coastguard Worker 		/* Skip "cardx-" prefix */
589*d83cc019SAndroid Build Coastguard Worker 		char *dirname = strchr(dirent->d_name, '-');
590*d83cc019SAndroid Build Coastguard Worker 		if (dirname==NULL)
591*d83cc019SAndroid Build Coastguard Worker 			continue;
592*d83cc019SAndroid Build Coastguard Worker 		++dirname;
593*d83cc019SAndroid Build Coastguard Worker 
594*d83cc019SAndroid Build Coastguard Worker 		if (strcmp(dirname, connector_name) == 0) {
595*d83cc019SAndroid Build Coastguard Worker 			connector_fd = openat(sysfs_card_fd, dirent->d_name, O_RDONLY);
596*d83cc019SAndroid Build Coastguard Worker 			break;
597*d83cc019SAndroid Build Coastguard Worker 		}
598*d83cc019SAndroid Build Coastguard Worker 	}
599*d83cc019SAndroid Build Coastguard Worker 	closedir(dir);
600*d83cc019SAndroid Build Coastguard Worker 
601*d83cc019SAndroid Build Coastguard Worker 	if (connector_fd < 0)
602*d83cc019SAndroid Build Coastguard Worker 		return false;
603*d83cc019SAndroid Build Coastguard Worker 
604*d83cc019SAndroid Build Coastguard Worker 	dir = fdopendir(connector_fd);
605*d83cc019SAndroid Build Coastguard Worker 	igt_assert(dir);
606*d83cc019SAndroid Build Coastguard Worker 
607*d83cc019SAndroid Build Coastguard Worker 	while ((dirent = readdir(dir))) {
608*d83cc019SAndroid Build Coastguard Worker 		if (strncmp(dirent->d_name, "i2c-", 4) == 0) {
609*d83cc019SAndroid Build Coastguard Worker 			sprintf(i2c_path, "/dev/%s", dirent->d_name);
610*d83cc019SAndroid Build Coastguard Worker 			found_i2c_file = true;
611*d83cc019SAndroid Build Coastguard Worker 		}
612*d83cc019SAndroid Build Coastguard Worker 	}
613*d83cc019SAndroid Build Coastguard Worker 	closedir(dir);
614*d83cc019SAndroid Build Coastguard Worker 	return found_i2c_file;
615*d83cc019SAndroid Build Coastguard Worker }
616*d83cc019SAndroid Build Coastguard Worker 
617*d83cc019SAndroid Build Coastguard Worker 
i2c_read_edid(const char * connector_name,unsigned char * edid)618*d83cc019SAndroid Build Coastguard Worker static bool i2c_read_edid(const char *connector_name, unsigned char *edid)
619*d83cc019SAndroid Build Coastguard Worker {
620*d83cc019SAndroid Build Coastguard Worker 	char i2c_path[PATH_MAX];
621*d83cc019SAndroid Build Coastguard Worker 	bool result;
622*d83cc019SAndroid Build Coastguard Worker 	int rc, fd;
623*d83cc019SAndroid Build Coastguard Worker 	struct i2c_msg msgs[] = {
624*d83cc019SAndroid Build Coastguard Worker 		{ /* Start at 0. */
625*d83cc019SAndroid Build Coastguard Worker 			.addr = 0x50,
626*d83cc019SAndroid Build Coastguard Worker 			.flags = 0,
627*d83cc019SAndroid Build Coastguard Worker 			.len = 1,
628*d83cc019SAndroid Build Coastguard Worker 			.buf = edid,
629*d83cc019SAndroid Build Coastguard Worker 		}, { /* Now read the EDID. */
630*d83cc019SAndroid Build Coastguard Worker 			.addr = 0x50,
631*d83cc019SAndroid Build Coastguard Worker 			.flags = I2C_M_RD,
632*d83cc019SAndroid Build Coastguard Worker 			.len = 128,
633*d83cc019SAndroid Build Coastguard Worker 			.buf = edid,
634*d83cc019SAndroid Build Coastguard Worker 		}
635*d83cc019SAndroid Build Coastguard Worker 	};
636*d83cc019SAndroid Build Coastguard Worker 	struct i2c_rdwr_ioctl_data msgset = {
637*d83cc019SAndroid Build Coastguard Worker 		.msgs = msgs,
638*d83cc019SAndroid Build Coastguard Worker 		.nmsgs = 2,
639*d83cc019SAndroid Build Coastguard Worker 	};
640*d83cc019SAndroid Build Coastguard Worker 
641*d83cc019SAndroid Build Coastguard Worker 	result = find_i2c_path(connector_name, i2c_path);
642*d83cc019SAndroid Build Coastguard Worker 	if (!result)
643*d83cc019SAndroid Build Coastguard Worker 		return false;
644*d83cc019SAndroid Build Coastguard Worker 
645*d83cc019SAndroid Build Coastguard Worker 	fd = open(i2c_path, O_RDWR);
646*d83cc019SAndroid Build Coastguard Worker 	igt_assert_neq(fd, -1);
647*d83cc019SAndroid Build Coastguard Worker 
648*d83cc019SAndroid Build Coastguard Worker 	rc = ioctl(fd, I2C_RDWR, &msgset);
649*d83cc019SAndroid Build Coastguard Worker 	if (rc==-1) {
650*d83cc019SAndroid Build Coastguard Worker 		igt_debug("I2C access failed with errno %d, %s\n",
651*d83cc019SAndroid Build Coastguard Worker 				errno, strerror(errno));
652*d83cc019SAndroid Build Coastguard Worker 		errno = 0;
653*d83cc019SAndroid Build Coastguard Worker 	}
654*d83cc019SAndroid Build Coastguard Worker 
655*d83cc019SAndroid Build Coastguard Worker 	close(fd);
656*d83cc019SAndroid Build Coastguard Worker 	return rc >= 0;
657*d83cc019SAndroid Build Coastguard Worker }
658*d83cc019SAndroid Build Coastguard Worker 
format_hex_string(const unsigned char edid[static EDID_BLOCK_SIZE],char buf[static EDID_BLOCK_SIZE * 5+1])659*d83cc019SAndroid Build Coastguard Worker static void format_hex_string(const unsigned char edid[static EDID_BLOCK_SIZE],
660*d83cc019SAndroid Build Coastguard Worker 			      char buf[static EDID_BLOCK_SIZE * 5 + 1])
661*d83cc019SAndroid Build Coastguard Worker {
662*d83cc019SAndroid Build Coastguard Worker 	for (int i = 0; i < EDID_BLOCK_SIZE; ++i)
663*d83cc019SAndroid Build Coastguard Worker 		sprintf(buf+i*5, "0x%02x ", edid[i]);
664*d83cc019SAndroid Build Coastguard Worker }
665*d83cc019SAndroid Build Coastguard Worker 
test_i2c(struct mode_set_data * data)666*d83cc019SAndroid Build Coastguard Worker static void test_i2c(struct mode_set_data *data)
667*d83cc019SAndroid Build Coastguard Worker {
668*d83cc019SAndroid Build Coastguard Worker 	bool edid_mistmach_i2c_vs_drm = false;
669*d83cc019SAndroid Build Coastguard Worker 	igt_display_t display;
670*d83cc019SAndroid Build Coastguard Worker 	igt_display_require(&display, drm_fd);
671*d83cc019SAndroid Build Coastguard Worker 
672*d83cc019SAndroid Build Coastguard Worker 	for (int i = 0; i < data->res->count_connectors; i++) {
673*d83cc019SAndroid Build Coastguard Worker 		unsigned char *drm_edid = data->edids[i] ? data->edids[i]->data : NULL;
674*d83cc019SAndroid Build Coastguard Worker 		unsigned char i2c_edid[EDID_BLOCK_SIZE] = {};
675*d83cc019SAndroid Build Coastguard Worker 
676*d83cc019SAndroid Build Coastguard Worker 		igt_output_t *output = igt_output_from_connector(&display,
677*d83cc019SAndroid Build Coastguard Worker 								 data->connectors[i]);
678*d83cc019SAndroid Build Coastguard Worker 		char *connector_name = (char *) igt_output_name(output);
679*d83cc019SAndroid Build Coastguard Worker 
680*d83cc019SAndroid Build Coastguard Worker 		bool got_i2c_edid = i2c_read_edid(connector_name, i2c_edid);
681*d83cc019SAndroid Build Coastguard Worker 		bool got_drm_edid = drm_edid != NULL;
682*d83cc019SAndroid Build Coastguard Worker 		bool is_vga = data->connectors[i]->connector_type == DRM_MODE_CONNECTOR_VGA;
683*d83cc019SAndroid Build Coastguard Worker 
684*d83cc019SAndroid Build Coastguard Worker 		bool edids_equal;
685*d83cc019SAndroid Build Coastguard Worker 
686*d83cc019SAndroid Build Coastguard Worker 		/* We fail to detect some VGA monitors using our i2c method. If you look
687*d83cc019SAndroid Build Coastguard Worker 		 * at the dmesg of these cases, you'll see the Kernel complaining about
688*d83cc019SAndroid Build Coastguard Worker 		 * the EDID reading mostly FFs and then disabling bit-banging. Since we
689*d83cc019SAndroid Build Coastguard Worker 		 * don't want to reimplement everything the Kernel does, let's just
690*d83cc019SAndroid Build Coastguard Worker 		 * accept the fact that some VGA outputs won't be properly detected. */
691*d83cc019SAndroid Build Coastguard Worker 		if (is_vga)
692*d83cc019SAndroid Build Coastguard Worker 			continue;
693*d83cc019SAndroid Build Coastguard Worker 
694*d83cc019SAndroid Build Coastguard Worker 		if (!got_i2c_edid && !got_drm_edid)
695*d83cc019SAndroid Build Coastguard Worker 			continue;
696*d83cc019SAndroid Build Coastguard Worker 
697*d83cc019SAndroid Build Coastguard Worker 		if (got_i2c_edid && got_drm_edid)
698*d83cc019SAndroid Build Coastguard Worker 			edids_equal = (0 == memcmp(drm_edid, i2c_edid, EDID_BLOCK_SIZE));
699*d83cc019SAndroid Build Coastguard Worker 		else
700*d83cc019SAndroid Build Coastguard Worker 			edids_equal = false;
701*d83cc019SAndroid Build Coastguard Worker 
702*d83cc019SAndroid Build Coastguard Worker 
703*d83cc019SAndroid Build Coastguard Worker 		if (!edids_equal) {
704*d83cc019SAndroid Build Coastguard Worker 			char buf[5 * EDID_BLOCK_SIZE + 1];
705*d83cc019SAndroid Build Coastguard Worker 			igt_critical("Detected EDID mismatch on connector %s\n",
706*d83cc019SAndroid Build Coastguard Worker 				     connector_name);
707*d83cc019SAndroid Build Coastguard Worker 
708*d83cc019SAndroid Build Coastguard Worker 			if(got_i2c_edid)
709*d83cc019SAndroid Build Coastguard Worker 				format_hex_string(i2c_edid, buf);
710*d83cc019SAndroid Build Coastguard Worker 			else
711*d83cc019SAndroid Build Coastguard Worker 				sprintf(buf, "NULL");
712*d83cc019SAndroid Build Coastguard Worker 
713*d83cc019SAndroid Build Coastguard Worker 			igt_critical("i2c: %s\n", buf);
714*d83cc019SAndroid Build Coastguard Worker 
715*d83cc019SAndroid Build Coastguard Worker 			if(got_drm_edid)
716*d83cc019SAndroid Build Coastguard Worker 				format_hex_string(drm_edid, buf);
717*d83cc019SAndroid Build Coastguard Worker 			else
718*d83cc019SAndroid Build Coastguard Worker 				sprintf(buf, "NULL");
719*d83cc019SAndroid Build Coastguard Worker 
720*d83cc019SAndroid Build Coastguard Worker 			igt_critical("drm: %s\n", buf);
721*d83cc019SAndroid Build Coastguard Worker 
722*d83cc019SAndroid Build Coastguard Worker 			edid_mistmach_i2c_vs_drm = true;
723*d83cc019SAndroid Build Coastguard Worker 		}
724*d83cc019SAndroid Build Coastguard Worker 	}
725*d83cc019SAndroid Build Coastguard Worker 	igt_fail_on_f(edid_mistmach_i2c_vs_drm,
726*d83cc019SAndroid Build Coastguard Worker 			"There is an EDID mismatch between i2c and DRM!\n");
727*d83cc019SAndroid Build Coastguard Worker }
728*d83cc019SAndroid Build Coastguard Worker 
setup_pc8(void)729*d83cc019SAndroid Build Coastguard Worker static void setup_pc8(void)
730*d83cc019SAndroid Build Coastguard Worker {
731*d83cc019SAndroid Build Coastguard Worker 	has_pc8 = false;
732*d83cc019SAndroid Build Coastguard Worker 
733*d83cc019SAndroid Build Coastguard Worker 	/* Only Haswell supports the PC8 feature. */
734*d83cc019SAndroid Build Coastguard Worker 	if (!IS_HASWELL(ms_data.devid) && !IS_BROADWELL(ms_data.devid))
735*d83cc019SAndroid Build Coastguard Worker 		return;
736*d83cc019SAndroid Build Coastguard Worker 
737*d83cc019SAndroid Build Coastguard Worker 	/* Make sure our Kernel supports MSR and the module is loaded. */
738*d83cc019SAndroid Build Coastguard Worker 	igt_require(modprobe("msr") == 0);
739*d83cc019SAndroid Build Coastguard Worker 
740*d83cc019SAndroid Build Coastguard Worker 	msr_fd = open("/dev/cpu/0/msr", O_RDONLY);
741*d83cc019SAndroid Build Coastguard Worker 	igt_assert_f(msr_fd >= 0,
742*d83cc019SAndroid Build Coastguard Worker 		     "Can't open /dev/cpu/0/msr.\n");
743*d83cc019SAndroid Build Coastguard Worker 
744*d83cc019SAndroid Build Coastguard Worker 	/* Non-ULT machines don't support PC8+. */
745*d83cc019SAndroid Build Coastguard Worker 	if (!supports_pc8_plus_residencies())
746*d83cc019SAndroid Build Coastguard Worker 		return;
747*d83cc019SAndroid Build Coastguard Worker 
748*d83cc019SAndroid Build Coastguard Worker 	pc8_status_fd = openat(debugfs, "i915_pc8_status", O_RDONLY);
749*d83cc019SAndroid Build Coastguard Worker 	if (pc8_status_fd == -1)
750*d83cc019SAndroid Build Coastguard Worker 		pc8_status_fd = openat(debugfs,
751*d83cc019SAndroid Build Coastguard Worker 				       "i915_runtime_pm_status", O_RDONLY);
752*d83cc019SAndroid Build Coastguard Worker 	igt_assert_f(pc8_status_fd >= 0,
753*d83cc019SAndroid Build Coastguard Worker 		     "Can't open /sys/kernel/debug/dri/0/i915_runtime_pm_status");
754*d83cc019SAndroid Build Coastguard Worker 
755*d83cc019SAndroid Build Coastguard Worker 	has_pc8 = true;
756*d83cc019SAndroid Build Coastguard Worker }
757*d83cc019SAndroid Build Coastguard Worker 
dmc_loaded(void)758*d83cc019SAndroid Build Coastguard Worker static bool dmc_loaded(void)
759*d83cc019SAndroid Build Coastguard Worker {
760*d83cc019SAndroid Build Coastguard Worker 	char buf[15];
761*d83cc019SAndroid Build Coastguard Worker 	int len;
762*d83cc019SAndroid Build Coastguard Worker 
763*d83cc019SAndroid Build Coastguard Worker 	len = igt_sysfs_read(debugfs, "i915_dmc_info", buf, sizeof(buf) - 1);
764*d83cc019SAndroid Build Coastguard Worker 	if (len < 0)
765*d83cc019SAndroid Build Coastguard Worker 	    return true; /* no CSR support, no DMC requirement */
766*d83cc019SAndroid Build Coastguard Worker 
767*d83cc019SAndroid Build Coastguard Worker 	buf[len] = '\0';
768*d83cc019SAndroid Build Coastguard Worker 
769*d83cc019SAndroid Build Coastguard Worker 	igt_info("DMC: %s\n", buf);
770*d83cc019SAndroid Build Coastguard Worker 	return strstr(buf, "fw loaded: yes");
771*d83cc019SAndroid Build Coastguard Worker }
772*d83cc019SAndroid Build Coastguard Worker 
dump_file(int dir,const char * filename)773*d83cc019SAndroid Build Coastguard Worker static void dump_file(int dir, const char *filename)
774*d83cc019SAndroid Build Coastguard Worker {
775*d83cc019SAndroid Build Coastguard Worker 	char *contents;
776*d83cc019SAndroid Build Coastguard Worker 
777*d83cc019SAndroid Build Coastguard Worker 	contents = igt_sysfs_get(dir, filename);
778*d83cc019SAndroid Build Coastguard Worker 	if (!contents)
779*d83cc019SAndroid Build Coastguard Worker 		return;
780*d83cc019SAndroid Build Coastguard Worker 
781*d83cc019SAndroid Build Coastguard Worker 	igt_info("%s:\n%s\n", filename, contents);
782*d83cc019SAndroid Build Coastguard Worker 	free(contents);
783*d83cc019SAndroid Build Coastguard Worker }
784*d83cc019SAndroid Build Coastguard Worker 
setup_environment(void)785*d83cc019SAndroid Build Coastguard Worker static bool setup_environment(void)
786*d83cc019SAndroid Build Coastguard Worker {
787*d83cc019SAndroid Build Coastguard Worker 	if (has_runtime_pm)
788*d83cc019SAndroid Build Coastguard Worker 		goto out;
789*d83cc019SAndroid Build Coastguard Worker 
790*d83cc019SAndroid Build Coastguard Worker 	drm_fd = __drm_open_driver(DRIVER_INTEL);
791*d83cc019SAndroid Build Coastguard Worker 	igt_require(drm_fd != -1);
792*d83cc019SAndroid Build Coastguard Worker 	igt_device_set_master(drm_fd);
793*d83cc019SAndroid Build Coastguard Worker 
794*d83cc019SAndroid Build Coastguard Worker 	debugfs = igt_debugfs_dir(drm_fd);
795*d83cc019SAndroid Build Coastguard Worker 	igt_require(debugfs != -1);
796*d83cc019SAndroid Build Coastguard Worker 
797*d83cc019SAndroid Build Coastguard Worker 	init_mode_set_data(&ms_data);
798*d83cc019SAndroid Build Coastguard Worker 
799*d83cc019SAndroid Build Coastguard Worker 	pm_data = igt_pm_enable_sata_link_power_management();
800*d83cc019SAndroid Build Coastguard Worker 
801*d83cc019SAndroid Build Coastguard Worker 	has_runtime_pm = igt_setup_runtime_pm();
802*d83cc019SAndroid Build Coastguard Worker 	setup_pc8();
803*d83cc019SAndroid Build Coastguard Worker 
804*d83cc019SAndroid Build Coastguard Worker 	igt_info("Runtime PM support: %d\n", has_runtime_pm);
805*d83cc019SAndroid Build Coastguard Worker 	igt_info("PC8 residency support: %d\n", has_pc8);
806*d83cc019SAndroid Build Coastguard Worker 	igt_require(has_runtime_pm);
807*d83cc019SAndroid Build Coastguard Worker 	igt_require(dmc_loaded());
808*d83cc019SAndroid Build Coastguard Worker 
809*d83cc019SAndroid Build Coastguard Worker out:
810*d83cc019SAndroid Build Coastguard Worker 	disable_all_screens(&ms_data);
811*d83cc019SAndroid Build Coastguard Worker 	dump_file(debugfs, "i915_runtime_pm_status");
812*d83cc019SAndroid Build Coastguard Worker 
813*d83cc019SAndroid Build Coastguard Worker 	return wait_for_suspended();
814*d83cc019SAndroid Build Coastguard Worker }
815*d83cc019SAndroid Build Coastguard Worker 
teardown_environment(void)816*d83cc019SAndroid Build Coastguard Worker static void teardown_environment(void)
817*d83cc019SAndroid Build Coastguard Worker {
818*d83cc019SAndroid Build Coastguard Worker 	close(msr_fd);
819*d83cc019SAndroid Build Coastguard Worker 	if (has_pc8)
820*d83cc019SAndroid Build Coastguard Worker 		close(pc8_status_fd);
821*d83cc019SAndroid Build Coastguard Worker 
822*d83cc019SAndroid Build Coastguard Worker 	igt_restore_runtime_pm();
823*d83cc019SAndroid Build Coastguard Worker 
824*d83cc019SAndroid Build Coastguard Worker 	igt_pm_restore_sata_link_power_management(pm_data);
825*d83cc019SAndroid Build Coastguard Worker 	free(pm_data);
826*d83cc019SAndroid Build Coastguard Worker 
827*d83cc019SAndroid Build Coastguard Worker 	fini_mode_set_data(&ms_data);
828*d83cc019SAndroid Build Coastguard Worker 
829*d83cc019SAndroid Build Coastguard Worker 	close(debugfs);
830*d83cc019SAndroid Build Coastguard Worker 	close(drm_fd);
831*d83cc019SAndroid Build Coastguard Worker 
832*d83cc019SAndroid Build Coastguard Worker 	has_runtime_pm = false;
833*d83cc019SAndroid Build Coastguard Worker }
834*d83cc019SAndroid Build Coastguard Worker 
basic_subtest(void)835*d83cc019SAndroid Build Coastguard Worker static void basic_subtest(void)
836*d83cc019SAndroid Build Coastguard Worker {
837*d83cc019SAndroid Build Coastguard Worker 	disable_all_screens_and_wait(&ms_data);
838*d83cc019SAndroid Build Coastguard Worker 
839*d83cc019SAndroid Build Coastguard Worker 	if (ms_data.res)
840*d83cc019SAndroid Build Coastguard Worker 		enable_one_screen_and_wait(&ms_data);
841*d83cc019SAndroid Build Coastguard Worker 
842*d83cc019SAndroid Build Coastguard Worker 	/* XXX Also we can test wake up via exec nop */
843*d83cc019SAndroid Build Coastguard Worker }
844*d83cc019SAndroid Build Coastguard Worker 
pc8_residency_subtest(void)845*d83cc019SAndroid Build Coastguard Worker static void pc8_residency_subtest(void)
846*d83cc019SAndroid Build Coastguard Worker {
847*d83cc019SAndroid Build Coastguard Worker 	igt_require(has_pc8);
848*d83cc019SAndroid Build Coastguard Worker 
849*d83cc019SAndroid Build Coastguard Worker 	/* Make sure PC8+ residencies move! */
850*d83cc019SAndroid Build Coastguard Worker 	disable_all_screens(&ms_data);
851*d83cc019SAndroid Build Coastguard Worker 	igt_assert_f(pc8_plus_residency_changed(30),
852*d83cc019SAndroid Build Coastguard Worker 		     "Machine is not reaching PC8+ states, please check its "
853*d83cc019SAndroid Build Coastguard Worker 		     "configuration.\n");
854*d83cc019SAndroid Build Coastguard Worker 
855*d83cc019SAndroid Build Coastguard Worker 	/* Make sure PC8+ residencies stop! */
856*d83cc019SAndroid Build Coastguard Worker 	enable_one_screen(&ms_data);
857*d83cc019SAndroid Build Coastguard Worker 	igt_assert_f(!pc8_plus_residency_changed(10),
858*d83cc019SAndroid Build Coastguard Worker 		     "PC8+ residency didn't stop with screen enabled.\n");
859*d83cc019SAndroid Build Coastguard Worker }
860*d83cc019SAndroid Build Coastguard Worker 
modeset_subtest(enum screen_type type,int rounds,int wait_flags)861*d83cc019SAndroid Build Coastguard Worker static void modeset_subtest(enum screen_type type, int rounds, int wait_flags)
862*d83cc019SAndroid Build Coastguard Worker {
863*d83cc019SAndroid Build Coastguard Worker 	int i;
864*d83cc019SAndroid Build Coastguard Worker 
865*d83cc019SAndroid Build Coastguard Worker 	if (wait_flags & WAIT_PC8_RES)
866*d83cc019SAndroid Build Coastguard Worker 		igt_require(has_pc8);
867*d83cc019SAndroid Build Coastguard Worker 
868*d83cc019SAndroid Build Coastguard Worker 	if (wait_flags & WAIT_EXTRA)
869*d83cc019SAndroid Build Coastguard Worker 		rounds /= 2;
870*d83cc019SAndroid Build Coastguard Worker 
871*d83cc019SAndroid Build Coastguard Worker 	for (i = 0; i < rounds; i++) {
872*d83cc019SAndroid Build Coastguard Worker 		if (wait_flags & USE_DPMS)
873*d83cc019SAndroid Build Coastguard Worker 			disable_all_screens_dpms(&ms_data);
874*d83cc019SAndroid Build Coastguard Worker 		else
875*d83cc019SAndroid Build Coastguard Worker 			disable_all_screens(&ms_data);
876*d83cc019SAndroid Build Coastguard Worker 
877*d83cc019SAndroid Build Coastguard Worker 		if (wait_flags & WAIT_STATUS)
878*d83cc019SAndroid Build Coastguard Worker 			igt_assert(wait_for_suspended());
879*d83cc019SAndroid Build Coastguard Worker 		if (wait_flags & WAIT_PC8_RES)
880*d83cc019SAndroid Build Coastguard Worker 			igt_assert(pc8_plus_residency_changed(30));
881*d83cc019SAndroid Build Coastguard Worker 		if (wait_flags & WAIT_EXTRA)
882*d83cc019SAndroid Build Coastguard Worker 			sleep(5);
883*d83cc019SAndroid Build Coastguard Worker 
884*d83cc019SAndroid Build Coastguard Worker 		/* If we skip this line it's because the type of screen we want
885*d83cc019SAndroid Build Coastguard Worker 		 * is not connected. */
886*d83cc019SAndroid Build Coastguard Worker 		igt_require(enable_one_screen_with_type(&ms_data, type));
887*d83cc019SAndroid Build Coastguard Worker 		if (wait_flags & WAIT_STATUS)
888*d83cc019SAndroid Build Coastguard Worker 			igt_assert(wait_for_active());
889*d83cc019SAndroid Build Coastguard Worker 		if (wait_flags & WAIT_PC8_RES)
890*d83cc019SAndroid Build Coastguard Worker 			igt_assert(!pc8_plus_residency_changed(5));
891*d83cc019SAndroid Build Coastguard Worker 		if (wait_flags & WAIT_EXTRA)
892*d83cc019SAndroid Build Coastguard Worker 			sleep(5);
893*d83cc019SAndroid Build Coastguard Worker 	}
894*d83cc019SAndroid Build Coastguard Worker }
895*d83cc019SAndroid Build Coastguard Worker 
896*d83cc019SAndroid Build Coastguard Worker /* Test of the DRM resources reported by the IOCTLs are still the same. This
897*d83cc019SAndroid Build Coastguard Worker  * ensures we still see the monitors with the same eyes. We get the EDIDs and
898*d83cc019SAndroid Build Coastguard Worker  * compare them, which ensures we use DP AUX or GMBUS depending on what's
899*d83cc019SAndroid Build Coastguard Worker  * connected. */
drm_resources_equal_subtest(void)900*d83cc019SAndroid Build Coastguard Worker static void drm_resources_equal_subtest(void)
901*d83cc019SAndroid Build Coastguard Worker {
902*d83cc019SAndroid Build Coastguard Worker 	struct compare_data pre_suspend, during_suspend, post_suspend;
903*d83cc019SAndroid Build Coastguard Worker 
904*d83cc019SAndroid Build Coastguard Worker 	enable_one_screen_and_wait(&ms_data);
905*d83cc019SAndroid Build Coastguard Worker 	get_drm_info(&pre_suspend);
906*d83cc019SAndroid Build Coastguard Worker 	igt_assert(wait_for_active());
907*d83cc019SAndroid Build Coastguard Worker 
908*d83cc019SAndroid Build Coastguard Worker 	disable_all_screens_and_wait(&ms_data);
909*d83cc019SAndroid Build Coastguard Worker 	get_drm_info(&during_suspend);
910*d83cc019SAndroid Build Coastguard Worker 	igt_assert(wait_for_suspended());
911*d83cc019SAndroid Build Coastguard Worker 
912*d83cc019SAndroid Build Coastguard Worker 	enable_one_screen_and_wait(&ms_data);
913*d83cc019SAndroid Build Coastguard Worker 	get_drm_info(&post_suspend);
914*d83cc019SAndroid Build Coastguard Worker 	igt_assert(wait_for_active());
915*d83cc019SAndroid Build Coastguard Worker 
916*d83cc019SAndroid Build Coastguard Worker 	assert_drm_infos_equal(&pre_suspend, &during_suspend);
917*d83cc019SAndroid Build Coastguard Worker 	assert_drm_infos_equal(&pre_suspend, &post_suspend);
918*d83cc019SAndroid Build Coastguard Worker 
919*d83cc019SAndroid Build Coastguard Worker 	free_drm_info(&pre_suspend);
920*d83cc019SAndroid Build Coastguard Worker 	free_drm_info(&during_suspend);
921*d83cc019SAndroid Build Coastguard Worker 	free_drm_info(&post_suspend);
922*d83cc019SAndroid Build Coastguard Worker }
923*d83cc019SAndroid Build Coastguard Worker 
i2c_subtest_check_environment(void)924*d83cc019SAndroid Build Coastguard Worker static void i2c_subtest_check_environment(void)
925*d83cc019SAndroid Build Coastguard Worker {
926*d83cc019SAndroid Build Coastguard Worker 	int i2c_dev_files = 0;
927*d83cc019SAndroid Build Coastguard Worker 	DIR *dev_dir;
928*d83cc019SAndroid Build Coastguard Worker 	struct dirent *dirent;
929*d83cc019SAndroid Build Coastguard Worker 
930*d83cc019SAndroid Build Coastguard Worker 	/* Make sure the /dev/i2c-* files exist. */
931*d83cc019SAndroid Build Coastguard Worker 	igt_require(modprobe("i2c-dev") == 0);
932*d83cc019SAndroid Build Coastguard Worker 
933*d83cc019SAndroid Build Coastguard Worker 	dev_dir = opendir("/dev");
934*d83cc019SAndroid Build Coastguard Worker 	igt_assert(dev_dir);
935*d83cc019SAndroid Build Coastguard Worker 	while ((dirent = readdir(dev_dir))) {
936*d83cc019SAndroid Build Coastguard Worker 		if (strncmp(dirent->d_name, "i2c-", 4) == 0)
937*d83cc019SAndroid Build Coastguard Worker 			i2c_dev_files++;
938*d83cc019SAndroid Build Coastguard Worker 	}
939*d83cc019SAndroid Build Coastguard Worker 	closedir(dev_dir);
940*d83cc019SAndroid Build Coastguard Worker 	igt_require(i2c_dev_files);
941*d83cc019SAndroid Build Coastguard Worker }
942*d83cc019SAndroid Build Coastguard Worker 
943*d83cc019SAndroid Build Coastguard Worker /* Try to use raw I2C, which also needs interrupts. */
i2c_subtest(void)944*d83cc019SAndroid Build Coastguard Worker static void i2c_subtest(void)
945*d83cc019SAndroid Build Coastguard Worker {
946*d83cc019SAndroid Build Coastguard Worker 	i2c_subtest_check_environment();
947*d83cc019SAndroid Build Coastguard Worker 
948*d83cc019SAndroid Build Coastguard Worker 	enable_one_screen_and_wait(&ms_data);
949*d83cc019SAndroid Build Coastguard Worker 
950*d83cc019SAndroid Build Coastguard Worker 	disable_all_screens_and_wait(&ms_data);
951*d83cc019SAndroid Build Coastguard Worker 	test_i2c(&ms_data);
952*d83cc019SAndroid Build Coastguard Worker 	igt_assert(wait_for_suspended());
953*d83cc019SAndroid Build Coastguard Worker 
954*d83cc019SAndroid Build Coastguard Worker 	enable_one_screen(&ms_data);
955*d83cc019SAndroid Build Coastguard Worker }
956*d83cc019SAndroid Build Coastguard Worker 
read_entry(const char * filepath,const struct stat * info,const int typeflag,struct FTW * pathinfo)957*d83cc019SAndroid Build Coastguard Worker static int read_entry(const char *filepath,
958*d83cc019SAndroid Build Coastguard Worker 		      const struct stat *info,
959*d83cc019SAndroid Build Coastguard Worker 		      const int typeflag,
960*d83cc019SAndroid Build Coastguard Worker 		      struct FTW *pathinfo)
961*d83cc019SAndroid Build Coastguard Worker {
962*d83cc019SAndroid Build Coastguard Worker 	char buf[4096];
963*d83cc019SAndroid Build Coastguard Worker 	int fd;
964*d83cc019SAndroid Build Coastguard Worker 	int rc;
965*d83cc019SAndroid Build Coastguard Worker 
966*d83cc019SAndroid Build Coastguard Worker 	igt_assert_f(wait_for_suspended(), "Before opening: %s (%s)\n",
967*d83cc019SAndroid Build Coastguard Worker 		     filepath + pathinfo->base, filepath);
968*d83cc019SAndroid Build Coastguard Worker 
969*d83cc019SAndroid Build Coastguard Worker 	fd = open(filepath, O_RDONLY | O_NONBLOCK);
970*d83cc019SAndroid Build Coastguard Worker 	if (fd < 0) {
971*d83cc019SAndroid Build Coastguard Worker 		igt_debug("Failed to open '%s': %m\n", filepath);
972*d83cc019SAndroid Build Coastguard Worker 		return 0;
973*d83cc019SAndroid Build Coastguard Worker 	}
974*d83cc019SAndroid Build Coastguard Worker 
975*d83cc019SAndroid Build Coastguard Worker 	do {
976*d83cc019SAndroid Build Coastguard Worker 		rc = read(fd, buf, sizeof(buf));
977*d83cc019SAndroid Build Coastguard Worker 	} while (rc == sizeof(buf));
978*d83cc019SAndroid Build Coastguard Worker 
979*d83cc019SAndroid Build Coastguard Worker 	close(fd);
980*d83cc019SAndroid Build Coastguard Worker 
981*d83cc019SAndroid Build Coastguard Worker 	igt_assert_f(wait_for_suspended(), "After closing: %s (%s)\n",
982*d83cc019SAndroid Build Coastguard Worker 		     filepath + pathinfo->base, filepath);
983*d83cc019SAndroid Build Coastguard Worker 
984*d83cc019SAndroid Build Coastguard Worker 	return 0;
985*d83cc019SAndroid Build Coastguard Worker }
986*d83cc019SAndroid Build Coastguard Worker 
walk_fs(char * path)987*d83cc019SAndroid Build Coastguard Worker static void walk_fs(char *path)
988*d83cc019SAndroid Build Coastguard Worker {
989*d83cc019SAndroid Build Coastguard Worker 	disable_all_screens_and_wait(&ms_data);
990*d83cc019SAndroid Build Coastguard Worker 	nftw(path, read_entry, 20, FTW_PHYS | FTW_MOUNT);
991*d83cc019SAndroid Build Coastguard Worker }
992*d83cc019SAndroid Build Coastguard Worker 
993*d83cc019SAndroid Build Coastguard Worker /* This test will probably pass, with a small chance of hanging the machine in
994*d83cc019SAndroid Build Coastguard Worker  * case of bugs. Many of the bugs exercised by this patch just result in dmesg
995*d83cc019SAndroid Build Coastguard Worker  * errors, so a "pass" here should be confirmed by a check on dmesg. */
debugfs_read_subtest(void)996*d83cc019SAndroid Build Coastguard Worker static void debugfs_read_subtest(void)
997*d83cc019SAndroid Build Coastguard Worker {
998*d83cc019SAndroid Build Coastguard Worker 	char path[256];
999*d83cc019SAndroid Build Coastguard Worker 
1000*d83cc019SAndroid Build Coastguard Worker 	igt_require_f(igt_debugfs_path(drm_fd, path, sizeof(path)),
1001*d83cc019SAndroid Build Coastguard Worker 		      "Can't find the debugfs directory\n");
1002*d83cc019SAndroid Build Coastguard Worker 	walk_fs(path);
1003*d83cc019SAndroid Build Coastguard Worker }
1004*d83cc019SAndroid Build Coastguard Worker 
1005*d83cc019SAndroid Build Coastguard Worker /* Read the comment on debugfs_read_subtest(). */
sysfs_read_subtest(void)1006*d83cc019SAndroid Build Coastguard Worker static void sysfs_read_subtest(void)
1007*d83cc019SAndroid Build Coastguard Worker {
1008*d83cc019SAndroid Build Coastguard Worker 	char path[80];
1009*d83cc019SAndroid Build Coastguard Worker 
1010*d83cc019SAndroid Build Coastguard Worker 	igt_require_f(igt_sysfs_path(drm_fd, path, sizeof(path)),
1011*d83cc019SAndroid Build Coastguard Worker 		      "Can't find the sysfs directory\n");
1012*d83cc019SAndroid Build Coastguard Worker 	walk_fs(path);
1013*d83cc019SAndroid Build Coastguard Worker }
1014*d83cc019SAndroid Build Coastguard Worker 
1015*d83cc019SAndroid Build Coastguard Worker /* Make sure we don't suspend when we have the i915_forcewake_user file open. */
debugfs_forcewake_user_subtest(void)1016*d83cc019SAndroid Build Coastguard Worker static void debugfs_forcewake_user_subtest(void)
1017*d83cc019SAndroid Build Coastguard Worker {
1018*d83cc019SAndroid Build Coastguard Worker 	int fd, rc;
1019*d83cc019SAndroid Build Coastguard Worker 
1020*d83cc019SAndroid Build Coastguard Worker 	igt_require(intel_gen(ms_data.devid) >= 6);
1021*d83cc019SAndroid Build Coastguard Worker 
1022*d83cc019SAndroid Build Coastguard Worker 	disable_all_screens_and_wait(&ms_data);
1023*d83cc019SAndroid Build Coastguard Worker 
1024*d83cc019SAndroid Build Coastguard Worker 	fd = igt_open_forcewake_handle(drm_fd);
1025*d83cc019SAndroid Build Coastguard Worker 	igt_require(fd >= 0);
1026*d83cc019SAndroid Build Coastguard Worker 
1027*d83cc019SAndroid Build Coastguard Worker 	if (has_runtime_pm) {
1028*d83cc019SAndroid Build Coastguard Worker 		igt_assert(wait_for_active());
1029*d83cc019SAndroid Build Coastguard Worker 		sleep(10);
1030*d83cc019SAndroid Build Coastguard Worker 		igt_assert(wait_for_active());
1031*d83cc019SAndroid Build Coastguard Worker 	} else {
1032*d83cc019SAndroid Build Coastguard Worker 		igt_assert(wait_for_suspended());
1033*d83cc019SAndroid Build Coastguard Worker 	}
1034*d83cc019SAndroid Build Coastguard Worker 
1035*d83cc019SAndroid Build Coastguard Worker 	rc = close(fd);
1036*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(rc, 0);
1037*d83cc019SAndroid Build Coastguard Worker 
1038*d83cc019SAndroid Build Coastguard Worker 	igt_assert(wait_for_suspended());
1039*d83cc019SAndroid Build Coastguard Worker }
1040*d83cc019SAndroid Build Coastguard Worker 
gem_mmap_subtest(bool gtt_mmap)1041*d83cc019SAndroid Build Coastguard Worker static void gem_mmap_subtest(bool gtt_mmap)
1042*d83cc019SAndroid Build Coastguard Worker {
1043*d83cc019SAndroid Build Coastguard Worker 	int i;
1044*d83cc019SAndroid Build Coastguard Worker 	uint32_t handle;
1045*d83cc019SAndroid Build Coastguard Worker 	int buf_size = 8192;
1046*d83cc019SAndroid Build Coastguard Worker 	uint8_t *gem_buf;
1047*d83cc019SAndroid Build Coastguard Worker 
1048*d83cc019SAndroid Build Coastguard Worker 	/* Create, map and set data while the device is active. */
1049*d83cc019SAndroid Build Coastguard Worker 	enable_one_screen_and_wait(&ms_data);
1050*d83cc019SAndroid Build Coastguard Worker 
1051*d83cc019SAndroid Build Coastguard Worker 	handle = gem_create(drm_fd, buf_size);
1052*d83cc019SAndroid Build Coastguard Worker 
1053*d83cc019SAndroid Build Coastguard Worker 	if (gtt_mmap) {
1054*d83cc019SAndroid Build Coastguard Worker 		gem_buf = gem_mmap__gtt(drm_fd, handle, buf_size,
1055*d83cc019SAndroid Build Coastguard Worker 					PROT_READ | PROT_WRITE);
1056*d83cc019SAndroid Build Coastguard Worker 	}
1057*d83cc019SAndroid Build Coastguard Worker 	else {
1058*d83cc019SAndroid Build Coastguard Worker 		gem_buf = gem_mmap__cpu(drm_fd, handle, 0, buf_size, 0);
1059*d83cc019SAndroid Build Coastguard Worker 	}
1060*d83cc019SAndroid Build Coastguard Worker 
1061*d83cc019SAndroid Build Coastguard Worker 
1062*d83cc019SAndroid Build Coastguard Worker 	for (i = 0; i < buf_size; i++)
1063*d83cc019SAndroid Build Coastguard Worker 		gem_buf[i] = i & 0xFF;
1064*d83cc019SAndroid Build Coastguard Worker 
1065*d83cc019SAndroid Build Coastguard Worker 	for (i = 0; i < buf_size; i++)
1066*d83cc019SAndroid Build Coastguard Worker 		igt_assert(gem_buf[i] == (i & 0xFF));
1067*d83cc019SAndroid Build Coastguard Worker 
1068*d83cc019SAndroid Build Coastguard Worker 	/* Now suspend, read and modify. */
1069*d83cc019SAndroid Build Coastguard Worker 	disable_all_screens_and_wait(&ms_data);
1070*d83cc019SAndroid Build Coastguard Worker 
1071*d83cc019SAndroid Build Coastguard Worker 	for (i = 0; i < buf_size; i++)
1072*d83cc019SAndroid Build Coastguard Worker 		igt_assert(gem_buf[i] == (i & 0xFF));
1073*d83cc019SAndroid Build Coastguard Worker 	igt_assert(wait_for_suspended());
1074*d83cc019SAndroid Build Coastguard Worker 
1075*d83cc019SAndroid Build Coastguard Worker 	for (i = 0; i < buf_size; i++)
1076*d83cc019SAndroid Build Coastguard Worker 		gem_buf[i] = (~i & 0xFF);
1077*d83cc019SAndroid Build Coastguard Worker 	igt_assert(wait_for_suspended());
1078*d83cc019SAndroid Build Coastguard Worker 
1079*d83cc019SAndroid Build Coastguard Worker 	/* Now resume and see if it's still there. */
1080*d83cc019SAndroid Build Coastguard Worker 	enable_one_screen_and_wait(&ms_data);
1081*d83cc019SAndroid Build Coastguard Worker 	for (i = 0; i < buf_size; i++)
1082*d83cc019SAndroid Build Coastguard Worker 		igt_assert(gem_buf[i] == (~i & 0xFF));
1083*d83cc019SAndroid Build Coastguard Worker 
1084*d83cc019SAndroid Build Coastguard Worker 	igt_assert(munmap(gem_buf, buf_size) == 0);
1085*d83cc019SAndroid Build Coastguard Worker 
1086*d83cc019SAndroid Build Coastguard Worker 	/* Now the opposite: suspend, and try to create the mmap while
1087*d83cc019SAndroid Build Coastguard Worker 	 * suspended. */
1088*d83cc019SAndroid Build Coastguard Worker 	disable_all_screens_and_wait(&ms_data);
1089*d83cc019SAndroid Build Coastguard Worker 
1090*d83cc019SAndroid Build Coastguard Worker 	if (gtt_mmap) {
1091*d83cc019SAndroid Build Coastguard Worker 		gem_buf = gem_mmap__gtt(drm_fd, handle, buf_size,
1092*d83cc019SAndroid Build Coastguard Worker 					PROT_READ | PROT_WRITE);
1093*d83cc019SAndroid Build Coastguard Worker 	}
1094*d83cc019SAndroid Build Coastguard Worker 	else {
1095*d83cc019SAndroid Build Coastguard Worker 		gem_buf = gem_mmap__cpu(drm_fd, handle, 0, buf_size, 0);
1096*d83cc019SAndroid Build Coastguard Worker 	}
1097*d83cc019SAndroid Build Coastguard Worker 
1098*d83cc019SAndroid Build Coastguard Worker 	igt_assert(wait_for_suspended());
1099*d83cc019SAndroid Build Coastguard Worker 
1100*d83cc019SAndroid Build Coastguard Worker 	for (i = 0; i < buf_size; i++)
1101*d83cc019SAndroid Build Coastguard Worker 		gem_buf[i] = i & 0xFF;
1102*d83cc019SAndroid Build Coastguard Worker 
1103*d83cc019SAndroid Build Coastguard Worker 	for (i = 0; i < buf_size; i++)
1104*d83cc019SAndroid Build Coastguard Worker 		igt_assert(gem_buf[i] == (i & 0xFF));
1105*d83cc019SAndroid Build Coastguard Worker 
1106*d83cc019SAndroid Build Coastguard Worker 	igt_assert(wait_for_suspended());
1107*d83cc019SAndroid Build Coastguard Worker 
1108*d83cc019SAndroid Build Coastguard Worker 	/* Resume and check if it's still there. */
1109*d83cc019SAndroid Build Coastguard Worker 	enable_one_screen_and_wait(&ms_data);
1110*d83cc019SAndroid Build Coastguard Worker 	for (i = 0; i < buf_size; i++)
1111*d83cc019SAndroid Build Coastguard Worker 		igt_assert(gem_buf[i] == (i & 0xFF));
1112*d83cc019SAndroid Build Coastguard Worker 
1113*d83cc019SAndroid Build Coastguard Worker 	igt_assert(munmap(gem_buf, buf_size) == 0);
1114*d83cc019SAndroid Build Coastguard Worker 	gem_close(drm_fd, handle);
1115*d83cc019SAndroid Build Coastguard Worker }
1116*d83cc019SAndroid Build Coastguard Worker 
gem_pread_subtest(void)1117*d83cc019SAndroid Build Coastguard Worker static void gem_pread_subtest(void)
1118*d83cc019SAndroid Build Coastguard Worker {
1119*d83cc019SAndroid Build Coastguard Worker 	int i;
1120*d83cc019SAndroid Build Coastguard Worker 	uint32_t handle;
1121*d83cc019SAndroid Build Coastguard Worker 	int buf_size = 8192;
1122*d83cc019SAndroid Build Coastguard Worker 	uint8_t *cpu_buf, *read_buf;
1123*d83cc019SAndroid Build Coastguard Worker 
1124*d83cc019SAndroid Build Coastguard Worker 	cpu_buf = malloc(buf_size);
1125*d83cc019SAndroid Build Coastguard Worker 	read_buf = malloc(buf_size);
1126*d83cc019SAndroid Build Coastguard Worker 	igt_assert(cpu_buf);
1127*d83cc019SAndroid Build Coastguard Worker 	igt_assert(read_buf);
1128*d83cc019SAndroid Build Coastguard Worker 	memset(cpu_buf, 0, buf_size);
1129*d83cc019SAndroid Build Coastguard Worker 	memset(read_buf, 0, buf_size);
1130*d83cc019SAndroid Build Coastguard Worker 
1131*d83cc019SAndroid Build Coastguard Worker 	/* Create and set data while the device is active. */
1132*d83cc019SAndroid Build Coastguard Worker 	enable_one_screen_and_wait(&ms_data);
1133*d83cc019SAndroid Build Coastguard Worker 
1134*d83cc019SAndroid Build Coastguard Worker 	handle = gem_create(drm_fd, buf_size);
1135*d83cc019SAndroid Build Coastguard Worker 
1136*d83cc019SAndroid Build Coastguard Worker 	for (i = 0; i < buf_size; i++)
1137*d83cc019SAndroid Build Coastguard Worker 		cpu_buf[i] = i & 0xFF;
1138*d83cc019SAndroid Build Coastguard Worker 
1139*d83cc019SAndroid Build Coastguard Worker 	gem_write(drm_fd, handle, 0, cpu_buf, buf_size);
1140*d83cc019SAndroid Build Coastguard Worker 
1141*d83cc019SAndroid Build Coastguard Worker 	gem_read(drm_fd, handle, 0, read_buf, buf_size);
1142*d83cc019SAndroid Build Coastguard Worker 
1143*d83cc019SAndroid Build Coastguard Worker 	for (i = 0; i < buf_size; i++)
1144*d83cc019SAndroid Build Coastguard Worker 		igt_assert(cpu_buf[i] == read_buf[i]);
1145*d83cc019SAndroid Build Coastguard Worker 
1146*d83cc019SAndroid Build Coastguard Worker 	/* Now suspend, read and modify. */
1147*d83cc019SAndroid Build Coastguard Worker 	disable_all_screens_and_wait(&ms_data);
1148*d83cc019SAndroid Build Coastguard Worker 
1149*d83cc019SAndroid Build Coastguard Worker 	memset(read_buf, 0, buf_size);
1150*d83cc019SAndroid Build Coastguard Worker 	gem_read(drm_fd, handle, 0, read_buf, buf_size);
1151*d83cc019SAndroid Build Coastguard Worker 
1152*d83cc019SAndroid Build Coastguard Worker 	for (i = 0; i < buf_size; i++)
1153*d83cc019SAndroid Build Coastguard Worker 		igt_assert(cpu_buf[i] == read_buf[i]);
1154*d83cc019SAndroid Build Coastguard Worker 	igt_assert(wait_for_suspended());
1155*d83cc019SAndroid Build Coastguard Worker 
1156*d83cc019SAndroid Build Coastguard Worker 	for (i = 0; i < buf_size; i++)
1157*d83cc019SAndroid Build Coastguard Worker 		cpu_buf[i] = (~i & 0xFF);
1158*d83cc019SAndroid Build Coastguard Worker 	gem_write(drm_fd, handle, 0, cpu_buf, buf_size);
1159*d83cc019SAndroid Build Coastguard Worker 	igt_assert(wait_for_suspended());
1160*d83cc019SAndroid Build Coastguard Worker 
1161*d83cc019SAndroid Build Coastguard Worker 	/* Now resume and see if it's still there. */
1162*d83cc019SAndroid Build Coastguard Worker 	enable_one_screen_and_wait(&ms_data);
1163*d83cc019SAndroid Build Coastguard Worker 
1164*d83cc019SAndroid Build Coastguard Worker 	memset(read_buf, 0, buf_size);
1165*d83cc019SAndroid Build Coastguard Worker 	gem_read(drm_fd, handle, 0, read_buf, buf_size);
1166*d83cc019SAndroid Build Coastguard Worker 
1167*d83cc019SAndroid Build Coastguard Worker 	for (i = 0; i < buf_size; i++)
1168*d83cc019SAndroid Build Coastguard Worker 		igt_assert(cpu_buf[i] == read_buf[i]);
1169*d83cc019SAndroid Build Coastguard Worker 
1170*d83cc019SAndroid Build Coastguard Worker 	gem_close(drm_fd, handle);
1171*d83cc019SAndroid Build Coastguard Worker 
1172*d83cc019SAndroid Build Coastguard Worker 	free(cpu_buf);
1173*d83cc019SAndroid Build Coastguard Worker 	free(read_buf);
1174*d83cc019SAndroid Build Coastguard Worker }
1175*d83cc019SAndroid Build Coastguard Worker 
1176*d83cc019SAndroid Build Coastguard Worker /* Paints a square of color $color, size $width x $height, at position $x x $y
1177*d83cc019SAndroid Build Coastguard Worker  * of $dst_handle, which contains pitch $pitch. */
submit_blt_cmd(uint32_t dst_handle,uint16_t x,uint16_t y,uint16_t width,uint16_t height,uint32_t pitch,uint32_t color,uint32_t * presumed_dst_offset)1178*d83cc019SAndroid Build Coastguard Worker static void submit_blt_cmd(uint32_t dst_handle, uint16_t x, uint16_t y,
1179*d83cc019SAndroid Build Coastguard Worker 			   uint16_t width, uint16_t height, uint32_t pitch,
1180*d83cc019SAndroid Build Coastguard Worker 			   uint32_t color, uint32_t *presumed_dst_offset)
1181*d83cc019SAndroid Build Coastguard Worker {
1182*d83cc019SAndroid Build Coastguard Worker 	int i, reloc_pos;
1183*d83cc019SAndroid Build Coastguard Worker 	uint32_t batch_handle;
1184*d83cc019SAndroid Build Coastguard Worker 	int batch_size = 8 * sizeof(uint32_t);
1185*d83cc019SAndroid Build Coastguard Worker 	uint32_t batch_buf[batch_size];
1186*d83cc019SAndroid Build Coastguard Worker 	struct drm_i915_gem_execbuffer2 execbuf = {};
1187*d83cc019SAndroid Build Coastguard Worker 	struct drm_i915_gem_exec_object2 objs[2] = {{}, {}};
1188*d83cc019SAndroid Build Coastguard Worker 	struct drm_i915_gem_relocation_entry relocs[1] = {{}};
1189*d83cc019SAndroid Build Coastguard Worker 	struct drm_i915_gem_wait gem_wait;
1190*d83cc019SAndroid Build Coastguard Worker 
1191*d83cc019SAndroid Build Coastguard Worker 	i = 0;
1192*d83cc019SAndroid Build Coastguard Worker 
1193*d83cc019SAndroid Build Coastguard Worker 	if (intel_gen(ms_data.devid) >= 8)
1194*d83cc019SAndroid Build Coastguard Worker 		batch_buf[i++] = XY_COLOR_BLT_CMD_NOLEN |
1195*d83cc019SAndroid Build Coastguard Worker 				 XY_COLOR_BLT_WRITE_ALPHA |
1196*d83cc019SAndroid Build Coastguard Worker 				 XY_COLOR_BLT_WRITE_RGB | 0x5;
1197*d83cc019SAndroid Build Coastguard Worker 	else
1198*d83cc019SAndroid Build Coastguard Worker 		batch_buf[i++] = XY_COLOR_BLT_CMD_NOLEN |
1199*d83cc019SAndroid Build Coastguard Worker 				 XY_COLOR_BLT_WRITE_ALPHA |
1200*d83cc019SAndroid Build Coastguard Worker 				 XY_COLOR_BLT_WRITE_RGB | 0x4;
1201*d83cc019SAndroid Build Coastguard Worker 	batch_buf[i++] = (3 << 24) | (0xF0 << 16) | (pitch);
1202*d83cc019SAndroid Build Coastguard Worker 	batch_buf[i++] = (y << 16) | x;
1203*d83cc019SAndroid Build Coastguard Worker 	batch_buf[i++] = ((y + height) << 16) | (x + width);
1204*d83cc019SAndroid Build Coastguard Worker 	reloc_pos = i;
1205*d83cc019SAndroid Build Coastguard Worker 	batch_buf[i++] = *presumed_dst_offset;
1206*d83cc019SAndroid Build Coastguard Worker 	if (intel_gen(ms_data.devid) >= 8)
1207*d83cc019SAndroid Build Coastguard Worker 		batch_buf[i++] = 0;
1208*d83cc019SAndroid Build Coastguard Worker 	batch_buf[i++] = color;
1209*d83cc019SAndroid Build Coastguard Worker 
1210*d83cc019SAndroid Build Coastguard Worker 	batch_buf[i++] = MI_BATCH_BUFFER_END;
1211*d83cc019SAndroid Build Coastguard Worker 	if (intel_gen(ms_data.devid) < 8)
1212*d83cc019SAndroid Build Coastguard Worker 		batch_buf[i++] = MI_NOOP;
1213*d83cc019SAndroid Build Coastguard Worker 
1214*d83cc019SAndroid Build Coastguard Worker 	igt_assert(i * sizeof(uint32_t) == batch_size);
1215*d83cc019SAndroid Build Coastguard Worker 
1216*d83cc019SAndroid Build Coastguard Worker 	batch_handle = gem_create(drm_fd, batch_size);
1217*d83cc019SAndroid Build Coastguard Worker 	gem_write(drm_fd, batch_handle, 0, batch_buf, batch_size);
1218*d83cc019SAndroid Build Coastguard Worker 
1219*d83cc019SAndroid Build Coastguard Worker 	relocs[0].target_handle = dst_handle;
1220*d83cc019SAndroid Build Coastguard Worker 	relocs[0].delta = 0;
1221*d83cc019SAndroid Build Coastguard Worker 	relocs[0].offset = reloc_pos * sizeof(uint32_t);
1222*d83cc019SAndroid Build Coastguard Worker 	relocs[0].presumed_offset = *presumed_dst_offset;
1223*d83cc019SAndroid Build Coastguard Worker 	relocs[0].read_domains = 0;
1224*d83cc019SAndroid Build Coastguard Worker 	relocs[0].write_domain = I915_GEM_DOMAIN_RENDER;
1225*d83cc019SAndroid Build Coastguard Worker 
1226*d83cc019SAndroid Build Coastguard Worker 	objs[0].handle = dst_handle;
1227*d83cc019SAndroid Build Coastguard Worker 	objs[0].alignment = 64;
1228*d83cc019SAndroid Build Coastguard Worker 
1229*d83cc019SAndroid Build Coastguard Worker 	objs[1].handle = batch_handle;
1230*d83cc019SAndroid Build Coastguard Worker 	objs[1].relocation_count = 1;
1231*d83cc019SAndroid Build Coastguard Worker 	objs[1].relocs_ptr = (uintptr_t)relocs;
1232*d83cc019SAndroid Build Coastguard Worker 
1233*d83cc019SAndroid Build Coastguard Worker 	execbuf.buffers_ptr = (uintptr_t)objs;
1234*d83cc019SAndroid Build Coastguard Worker 	execbuf.buffer_count = 2;
1235*d83cc019SAndroid Build Coastguard Worker 	execbuf.batch_len = batch_size;
1236*d83cc019SAndroid Build Coastguard Worker 	execbuf.flags = I915_EXEC_BLT;
1237*d83cc019SAndroid Build Coastguard Worker 	i915_execbuffer2_set_context_id(execbuf, 0);
1238*d83cc019SAndroid Build Coastguard Worker 
1239*d83cc019SAndroid Build Coastguard Worker 	gem_execbuf(drm_fd, &execbuf);
1240*d83cc019SAndroid Build Coastguard Worker 
1241*d83cc019SAndroid Build Coastguard Worker 	*presumed_dst_offset = relocs[0].presumed_offset;
1242*d83cc019SAndroid Build Coastguard Worker 
1243*d83cc019SAndroid Build Coastguard Worker 	gem_wait.flags = 0;
1244*d83cc019SAndroid Build Coastguard Worker 	gem_wait.timeout_ns = 10000000000LL; /* 10s */
1245*d83cc019SAndroid Build Coastguard Worker 
1246*d83cc019SAndroid Build Coastguard Worker 	gem_wait.bo_handle = batch_handle;
1247*d83cc019SAndroid Build Coastguard Worker 	do_ioctl(drm_fd, DRM_IOCTL_I915_GEM_WAIT, &gem_wait);
1248*d83cc019SAndroid Build Coastguard Worker 
1249*d83cc019SAndroid Build Coastguard Worker 	gem_wait.bo_handle = dst_handle;
1250*d83cc019SAndroid Build Coastguard Worker 	do_ioctl(drm_fd, DRM_IOCTL_I915_GEM_WAIT, &gem_wait);
1251*d83cc019SAndroid Build Coastguard Worker 
1252*d83cc019SAndroid Build Coastguard Worker 	gem_close(drm_fd, batch_handle);
1253*d83cc019SAndroid Build Coastguard Worker }
1254*d83cc019SAndroid Build Coastguard Worker 
1255*d83cc019SAndroid Build Coastguard Worker /* Make sure we can submit a batch buffer and verify its result. */
gem_execbuf_subtest(void)1256*d83cc019SAndroid Build Coastguard Worker static void gem_execbuf_subtest(void)
1257*d83cc019SAndroid Build Coastguard Worker {
1258*d83cc019SAndroid Build Coastguard Worker 	int x, y;
1259*d83cc019SAndroid Build Coastguard Worker 	uint32_t handle;
1260*d83cc019SAndroid Build Coastguard Worker 	int bpp = 4;
1261*d83cc019SAndroid Build Coastguard Worker 	int pitch = 128 * bpp;
1262*d83cc019SAndroid Build Coastguard Worker 	int dst_size = 128 * 128 * bpp; /* 128x128 square */
1263*d83cc019SAndroid Build Coastguard Worker 	uint32_t *cpu_buf;
1264*d83cc019SAndroid Build Coastguard Worker 	uint32_t presumed_offset = 0;
1265*d83cc019SAndroid Build Coastguard Worker 	int sq_x = 5, sq_y = 10, sq_w = 15, sq_h = 20;
1266*d83cc019SAndroid Build Coastguard Worker 	uint32_t color;
1267*d83cc019SAndroid Build Coastguard Worker 
1268*d83cc019SAndroid Build Coastguard Worker 	igt_require_gem(drm_fd);
1269*d83cc019SAndroid Build Coastguard Worker 
1270*d83cc019SAndroid Build Coastguard Worker 	/* Create and set data while the device is active. */
1271*d83cc019SAndroid Build Coastguard Worker 	enable_one_screen_and_wait(&ms_data);
1272*d83cc019SAndroid Build Coastguard Worker 
1273*d83cc019SAndroid Build Coastguard Worker 	handle = gem_create(drm_fd, dst_size);
1274*d83cc019SAndroid Build Coastguard Worker 
1275*d83cc019SAndroid Build Coastguard Worker 	cpu_buf = malloc(dst_size);
1276*d83cc019SAndroid Build Coastguard Worker 	igt_assert(cpu_buf);
1277*d83cc019SAndroid Build Coastguard Worker 	memset(cpu_buf, 0, dst_size);
1278*d83cc019SAndroid Build Coastguard Worker 	gem_write(drm_fd, handle, 0, cpu_buf, dst_size);
1279*d83cc019SAndroid Build Coastguard Worker 
1280*d83cc019SAndroid Build Coastguard Worker 	/* Now suspend and try it. */
1281*d83cc019SAndroid Build Coastguard Worker 	disable_all_screens_and_wait(&ms_data);
1282*d83cc019SAndroid Build Coastguard Worker 
1283*d83cc019SAndroid Build Coastguard Worker 	color = 0x12345678;
1284*d83cc019SAndroid Build Coastguard Worker 	submit_blt_cmd(handle, sq_x, sq_y, sq_w, sq_h, pitch, color,
1285*d83cc019SAndroid Build Coastguard Worker 		       &presumed_offset);
1286*d83cc019SAndroid Build Coastguard Worker 	igt_assert(wait_for_suspended());
1287*d83cc019SAndroid Build Coastguard Worker 
1288*d83cc019SAndroid Build Coastguard Worker 	gem_read(drm_fd, handle, 0, cpu_buf, dst_size);
1289*d83cc019SAndroid Build Coastguard Worker 	igt_assert(wait_for_suspended());
1290*d83cc019SAndroid Build Coastguard Worker 	for (y = 0; y < 128; y++) {
1291*d83cc019SAndroid Build Coastguard Worker 		for (x = 0; x < 128; x++) {
1292*d83cc019SAndroid Build Coastguard Worker 			uint32_t px = cpu_buf[y * 128 + x];
1293*d83cc019SAndroid Build Coastguard Worker 
1294*d83cc019SAndroid Build Coastguard Worker 			if (y >= sq_y && y < (sq_y + sq_h) &&
1295*d83cc019SAndroid Build Coastguard Worker 			    x >= sq_x && x < (sq_x + sq_w))
1296*d83cc019SAndroid Build Coastguard Worker 				igt_assert_eq_u32(px, color);
1297*d83cc019SAndroid Build Coastguard Worker 			else
1298*d83cc019SAndroid Build Coastguard Worker 				igt_assert(px == 0);
1299*d83cc019SAndroid Build Coastguard Worker 		}
1300*d83cc019SAndroid Build Coastguard Worker 	}
1301*d83cc019SAndroid Build Coastguard Worker 
1302*d83cc019SAndroid Build Coastguard Worker 	/* Now resume and check for it again. */
1303*d83cc019SAndroid Build Coastguard Worker 	enable_one_screen_and_wait(&ms_data);
1304*d83cc019SAndroid Build Coastguard Worker 
1305*d83cc019SAndroid Build Coastguard Worker 	memset(cpu_buf, 0, dst_size);
1306*d83cc019SAndroid Build Coastguard Worker 	gem_read(drm_fd, handle, 0, cpu_buf, dst_size);
1307*d83cc019SAndroid Build Coastguard Worker 	for (y = 0; y < 128; y++) {
1308*d83cc019SAndroid Build Coastguard Worker 		for (x = 0; x < 128; x++) {
1309*d83cc019SAndroid Build Coastguard Worker 			uint32_t px = cpu_buf[y * 128 + x];
1310*d83cc019SAndroid Build Coastguard Worker 
1311*d83cc019SAndroid Build Coastguard Worker 			if (y >= sq_y && y < (sq_y + sq_h) &&
1312*d83cc019SAndroid Build Coastguard Worker 			    x >= sq_x && x < (sq_x + sq_w))
1313*d83cc019SAndroid Build Coastguard Worker 				igt_assert_eq_u32(px, color);
1314*d83cc019SAndroid Build Coastguard Worker 			else
1315*d83cc019SAndroid Build Coastguard Worker 				igt_assert(px == 0);
1316*d83cc019SAndroid Build Coastguard Worker 		}
1317*d83cc019SAndroid Build Coastguard Worker 	}
1318*d83cc019SAndroid Build Coastguard Worker 
1319*d83cc019SAndroid Build Coastguard Worker 	/* Now we'll do the opposite: do the blt while active, then read while
1320*d83cc019SAndroid Build Coastguard Worker 	 * suspended. We use the same spot, but a different color. As a bonus,
1321*d83cc019SAndroid Build Coastguard Worker 	 * we're testing the presumed_offset from the previous command. */
1322*d83cc019SAndroid Build Coastguard Worker 	color = 0x87654321;
1323*d83cc019SAndroid Build Coastguard Worker 	submit_blt_cmd(handle, sq_x, sq_y, sq_w, sq_h, pitch, color,
1324*d83cc019SAndroid Build Coastguard Worker 		       &presumed_offset);
1325*d83cc019SAndroid Build Coastguard Worker 
1326*d83cc019SAndroid Build Coastguard Worker 	disable_all_screens_and_wait(&ms_data);
1327*d83cc019SAndroid Build Coastguard Worker 
1328*d83cc019SAndroid Build Coastguard Worker 	memset(cpu_buf, 0, dst_size);
1329*d83cc019SAndroid Build Coastguard Worker 	gem_read(drm_fd, handle, 0, cpu_buf, dst_size);
1330*d83cc019SAndroid Build Coastguard Worker 	for (y = 0; y < 128; y++) {
1331*d83cc019SAndroid Build Coastguard Worker 		for (x = 0; x < 128; x++) {
1332*d83cc019SAndroid Build Coastguard Worker 			uint32_t px = cpu_buf[y * 128 + x];
1333*d83cc019SAndroid Build Coastguard Worker 
1334*d83cc019SAndroid Build Coastguard Worker 			if (y >= sq_y && y < (sq_y + sq_h) &&
1335*d83cc019SAndroid Build Coastguard Worker 			    x >= sq_x && x < (sq_x + sq_w))
1336*d83cc019SAndroid Build Coastguard Worker 				igt_assert_eq_u32(px, color);
1337*d83cc019SAndroid Build Coastguard Worker 			else
1338*d83cc019SAndroid Build Coastguard Worker 				igt_assert(px == 0);
1339*d83cc019SAndroid Build Coastguard Worker 		}
1340*d83cc019SAndroid Build Coastguard Worker 	}
1341*d83cc019SAndroid Build Coastguard Worker 
1342*d83cc019SAndroid Build Coastguard Worker 	gem_close(drm_fd, handle);
1343*d83cc019SAndroid Build Coastguard Worker 
1344*d83cc019SAndroid Build Coastguard Worker 	free(cpu_buf);
1345*d83cc019SAndroid Build Coastguard Worker }
1346*d83cc019SAndroid Build Coastguard Worker 
1347*d83cc019SAndroid Build Coastguard Worker /* Assuming execbuf already works, let's see what happens when we force many
1348*d83cc019SAndroid Build Coastguard Worker  * suspend/resume cycles with commands. */
gem_execbuf_stress_subtest(int rounds,int wait_flags)1349*d83cc019SAndroid Build Coastguard Worker static void gem_execbuf_stress_subtest(int rounds, int wait_flags)
1350*d83cc019SAndroid Build Coastguard Worker {
1351*d83cc019SAndroid Build Coastguard Worker 	int i;
1352*d83cc019SAndroid Build Coastguard Worker 	int batch_size = 4 * sizeof(uint32_t);
1353*d83cc019SAndroid Build Coastguard Worker 	uint32_t batch_buf[batch_size];
1354*d83cc019SAndroid Build Coastguard Worker 	uint32_t handle;
1355*d83cc019SAndroid Build Coastguard Worker 	struct drm_i915_gem_execbuffer2 execbuf = {};
1356*d83cc019SAndroid Build Coastguard Worker 	struct drm_i915_gem_exec_object2 objs[1] = {{}};
1357*d83cc019SAndroid Build Coastguard Worker 
1358*d83cc019SAndroid Build Coastguard Worker 	igt_require_gem(drm_fd);
1359*d83cc019SAndroid Build Coastguard Worker 
1360*d83cc019SAndroid Build Coastguard Worker 	if (wait_flags & WAIT_PC8_RES)
1361*d83cc019SAndroid Build Coastguard Worker 		igt_require(has_pc8);
1362*d83cc019SAndroid Build Coastguard Worker 
1363*d83cc019SAndroid Build Coastguard Worker 	i = 0;
1364*d83cc019SAndroid Build Coastguard Worker 	batch_buf[i++] = MI_NOOP;
1365*d83cc019SAndroid Build Coastguard Worker 	batch_buf[i++] = MI_NOOP;
1366*d83cc019SAndroid Build Coastguard Worker 	batch_buf[i++] = MI_BATCH_BUFFER_END;
1367*d83cc019SAndroid Build Coastguard Worker 	batch_buf[i++] = MI_NOOP;
1368*d83cc019SAndroid Build Coastguard Worker 	igt_assert(i * sizeof(uint32_t) == batch_size);
1369*d83cc019SAndroid Build Coastguard Worker 
1370*d83cc019SAndroid Build Coastguard Worker 	disable_all_screens_and_wait(&ms_data);
1371*d83cc019SAndroid Build Coastguard Worker 
1372*d83cc019SAndroid Build Coastguard Worker 	handle = gem_create(drm_fd, batch_size);
1373*d83cc019SAndroid Build Coastguard Worker 	gem_write(drm_fd, handle, 0, batch_buf, batch_size);
1374*d83cc019SAndroid Build Coastguard Worker 
1375*d83cc019SAndroid Build Coastguard Worker 	objs[0].handle = handle;
1376*d83cc019SAndroid Build Coastguard Worker 
1377*d83cc019SAndroid Build Coastguard Worker 	execbuf.buffers_ptr = (uintptr_t)objs;
1378*d83cc019SAndroid Build Coastguard Worker 	execbuf.buffer_count = 1;
1379*d83cc019SAndroid Build Coastguard Worker 	execbuf.batch_len = batch_size;
1380*d83cc019SAndroid Build Coastguard Worker 	execbuf.flags = I915_EXEC_RENDER;
1381*d83cc019SAndroid Build Coastguard Worker 	i915_execbuffer2_set_context_id(execbuf, 0);
1382*d83cc019SAndroid Build Coastguard Worker 
1383*d83cc019SAndroid Build Coastguard Worker 	for (i = 0; i < rounds; i++) {
1384*d83cc019SAndroid Build Coastguard Worker 		gem_execbuf(drm_fd, &execbuf);
1385*d83cc019SAndroid Build Coastguard Worker 
1386*d83cc019SAndroid Build Coastguard Worker 		if (wait_flags & WAIT_STATUS) {
1387*d83cc019SAndroid Build Coastguard Worker 			/* clean up idle work */
1388*d83cc019SAndroid Build Coastguard Worker 			igt_drop_caches_set(drm_fd, DROP_IDLE);
1389*d83cc019SAndroid Build Coastguard Worker 			igt_assert(wait_for_suspended());
1390*d83cc019SAndroid Build Coastguard Worker 		}
1391*d83cc019SAndroid Build Coastguard Worker 		if (wait_flags & WAIT_PC8_RES)
1392*d83cc019SAndroid Build Coastguard Worker 			igt_assert(pc8_plus_residency_changed(30));
1393*d83cc019SAndroid Build Coastguard Worker 		if (wait_flags & WAIT_EXTRA)
1394*d83cc019SAndroid Build Coastguard Worker 			sleep(5);
1395*d83cc019SAndroid Build Coastguard Worker 	}
1396*d83cc019SAndroid Build Coastguard Worker 
1397*d83cc019SAndroid Build Coastguard Worker 	gem_close(drm_fd, handle);
1398*d83cc019SAndroid Build Coastguard Worker }
1399*d83cc019SAndroid Build Coastguard Worker 
1400*d83cc019SAndroid Build Coastguard Worker /* When this test was written, it triggered WARNs and DRM_ERRORs on dmesg. */
gem_idle_subtest(void)1401*d83cc019SAndroid Build Coastguard Worker static void gem_idle_subtest(void)
1402*d83cc019SAndroid Build Coastguard Worker {
1403*d83cc019SAndroid Build Coastguard Worker 	disable_all_screens_and_wait(&ms_data);
1404*d83cc019SAndroid Build Coastguard Worker 
1405*d83cc019SAndroid Build Coastguard Worker 	sleep(5);
1406*d83cc019SAndroid Build Coastguard Worker 
1407*d83cc019SAndroid Build Coastguard Worker 	gem_test_engine(drm_fd, -1);
1408*d83cc019SAndroid Build Coastguard Worker }
1409*d83cc019SAndroid Build Coastguard Worker 
gem_evict_pwrite_subtest(void)1410*d83cc019SAndroid Build Coastguard Worker static void gem_evict_pwrite_subtest(void)
1411*d83cc019SAndroid Build Coastguard Worker {
1412*d83cc019SAndroid Build Coastguard Worker 	struct {
1413*d83cc019SAndroid Build Coastguard Worker 		uint32_t handle;
1414*d83cc019SAndroid Build Coastguard Worker 		uint32_t *ptr;
1415*d83cc019SAndroid Build Coastguard Worker 	} *trash_bos;
1416*d83cc019SAndroid Build Coastguard Worker 	unsigned int num_trash_bos, n;
1417*d83cc019SAndroid Build Coastguard Worker 	uint32_t buf;
1418*d83cc019SAndroid Build Coastguard Worker 
1419*d83cc019SAndroid Build Coastguard Worker 	num_trash_bos = gem_mappable_aperture_size() / (1024*1024) + 1;
1420*d83cc019SAndroid Build Coastguard Worker 	trash_bos = malloc(num_trash_bos * sizeof(*trash_bos));
1421*d83cc019SAndroid Build Coastguard Worker 	igt_assert(trash_bos);
1422*d83cc019SAndroid Build Coastguard Worker 
1423*d83cc019SAndroid Build Coastguard Worker 	for (n = 0; n < num_trash_bos; n++) {
1424*d83cc019SAndroid Build Coastguard Worker 		trash_bos[n].handle = gem_create(drm_fd, 1024*1024);
1425*d83cc019SAndroid Build Coastguard Worker 		trash_bos[n].ptr = gem_mmap__gtt(drm_fd, trash_bos[n].handle,
1426*d83cc019SAndroid Build Coastguard Worker 						 1024*1024, PROT_WRITE);
1427*d83cc019SAndroid Build Coastguard Worker 		*trash_bos[n].ptr = 0;
1428*d83cc019SAndroid Build Coastguard Worker 	}
1429*d83cc019SAndroid Build Coastguard Worker 
1430*d83cc019SAndroid Build Coastguard Worker 	disable_or_dpms_all_screens_and_wait(&ms_data, true);
1431*d83cc019SAndroid Build Coastguard Worker 	igt_assert(wait_for_suspended());
1432*d83cc019SAndroid Build Coastguard Worker 
1433*d83cc019SAndroid Build Coastguard Worker 	buf = 0;
1434*d83cc019SAndroid Build Coastguard Worker 	for (n = 0; n < num_trash_bos; n++)
1435*d83cc019SAndroid Build Coastguard Worker 		gem_write(drm_fd, trash_bos[n].handle, 0, &buf, sizeof(buf));
1436*d83cc019SAndroid Build Coastguard Worker 
1437*d83cc019SAndroid Build Coastguard Worker 	for (n = 0; n < num_trash_bos; n++) {
1438*d83cc019SAndroid Build Coastguard Worker 		munmap(trash_bos[n].ptr, 1024*1024);
1439*d83cc019SAndroid Build Coastguard Worker 		gem_close(drm_fd, trash_bos[n].handle);
1440*d83cc019SAndroid Build Coastguard Worker 	}
1441*d83cc019SAndroid Build Coastguard Worker 	free(trash_bos);
1442*d83cc019SAndroid Build Coastguard Worker }
1443*d83cc019SAndroid Build Coastguard Worker 
1444*d83cc019SAndroid Build Coastguard Worker /* This also triggered WARNs on dmesg at some point. */
reg_read_ioctl_subtest(void)1445*d83cc019SAndroid Build Coastguard Worker static void reg_read_ioctl_subtest(void)
1446*d83cc019SAndroid Build Coastguard Worker {
1447*d83cc019SAndroid Build Coastguard Worker 	struct drm_i915_reg_read rr = {
1448*d83cc019SAndroid Build Coastguard Worker 		.offset = 0x2358, /* render ring timestamp */
1449*d83cc019SAndroid Build Coastguard Worker 	};
1450*d83cc019SAndroid Build Coastguard Worker 
1451*d83cc019SAndroid Build Coastguard Worker 	disable_all_screens_and_wait(&ms_data);
1452*d83cc019SAndroid Build Coastguard Worker 
1453*d83cc019SAndroid Build Coastguard Worker 	do_ioctl(drm_fd, DRM_IOCTL_I915_REG_READ, &rr);
1454*d83cc019SAndroid Build Coastguard Worker 
1455*d83cc019SAndroid Build Coastguard Worker 	igt_assert(wait_for_suspended());
1456*d83cc019SAndroid Build Coastguard Worker }
1457*d83cc019SAndroid Build Coastguard Worker 
device_in_pci_d3(void)1458*d83cc019SAndroid Build Coastguard Worker static bool device_in_pci_d3(void)
1459*d83cc019SAndroid Build Coastguard Worker {
1460*d83cc019SAndroid Build Coastguard Worker 	uint16_t val;
1461*d83cc019SAndroid Build Coastguard Worker 	int rc;
1462*d83cc019SAndroid Build Coastguard Worker 
1463*d83cc019SAndroid Build Coastguard Worker 	rc = pci_device_cfg_read_u16(intel_get_pci_device(), &val, 0xd4);
1464*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(rc, 0);
1465*d83cc019SAndroid Build Coastguard Worker 
1466*d83cc019SAndroid Build Coastguard Worker 	igt_debug("%s: PCI D3 state=%d\n", __func__, val & 0x3);
1467*d83cc019SAndroid Build Coastguard Worker 	return (val & 0x3) == 0x3;
1468*d83cc019SAndroid Build Coastguard Worker }
1469*d83cc019SAndroid Build Coastguard Worker 
pci_d3_state_subtest(void)1470*d83cc019SAndroid Build Coastguard Worker static void pci_d3_state_subtest(void)
1471*d83cc019SAndroid Build Coastguard Worker {
1472*d83cc019SAndroid Build Coastguard Worker 	igt_require(has_runtime_pm);
1473*d83cc019SAndroid Build Coastguard Worker 
1474*d83cc019SAndroid Build Coastguard Worker 	disable_all_screens_and_wait(&ms_data);
1475*d83cc019SAndroid Build Coastguard Worker 	igt_assert(igt_wait(device_in_pci_d3(), 2000, 100));
1476*d83cc019SAndroid Build Coastguard Worker 
1477*d83cc019SAndroid Build Coastguard Worker 	if (ms_data.res) {
1478*d83cc019SAndroid Build Coastguard Worker 		enable_one_screen_and_wait(&ms_data);
1479*d83cc019SAndroid Build Coastguard Worker 		igt_assert(!device_in_pci_d3());
1480*d83cc019SAndroid Build Coastguard Worker 	}
1481*d83cc019SAndroid Build Coastguard Worker }
1482*d83cc019SAndroid Build Coastguard Worker 
stay_subtest(void)1483*d83cc019SAndroid Build Coastguard Worker static void __attribute__((noreturn)) stay_subtest(void)
1484*d83cc019SAndroid Build Coastguard Worker {
1485*d83cc019SAndroid Build Coastguard Worker 	disable_all_screens_and_wait(&ms_data);
1486*d83cc019SAndroid Build Coastguard Worker 
1487*d83cc019SAndroid Build Coastguard Worker 	while (1)
1488*d83cc019SAndroid Build Coastguard Worker 		sleep(600);
1489*d83cc019SAndroid Build Coastguard Worker }
1490*d83cc019SAndroid Build Coastguard Worker 
system_suspend_subtest(int state,int debug)1491*d83cc019SAndroid Build Coastguard Worker static void system_suspend_subtest(int state, int debug)
1492*d83cc019SAndroid Build Coastguard Worker {
1493*d83cc019SAndroid Build Coastguard Worker 	disable_all_screens_and_wait(&ms_data);
1494*d83cc019SAndroid Build Coastguard Worker 
1495*d83cc019SAndroid Build Coastguard Worker 	igt_system_suspend_autoresume(state, debug);
1496*d83cc019SAndroid Build Coastguard Worker 	igt_assert(wait_for_suspended());
1497*d83cc019SAndroid Build Coastguard Worker }
1498*d83cc019SAndroid Build Coastguard Worker 
system_suspend_execbuf_subtest(void)1499*d83cc019SAndroid Build Coastguard Worker static void system_suspend_execbuf_subtest(void)
1500*d83cc019SAndroid Build Coastguard Worker {
1501*d83cc019SAndroid Build Coastguard Worker 	int i;
1502*d83cc019SAndroid Build Coastguard Worker 	int batch_size = 4 * sizeof(uint32_t);
1503*d83cc019SAndroid Build Coastguard Worker 	uint32_t batch_buf[batch_size];
1504*d83cc019SAndroid Build Coastguard Worker 	uint32_t handle;
1505*d83cc019SAndroid Build Coastguard Worker 	struct drm_i915_gem_execbuffer2 execbuf = {};
1506*d83cc019SAndroid Build Coastguard Worker 	struct drm_i915_gem_exec_object2 objs[1] = {{}};
1507*d83cc019SAndroid Build Coastguard Worker 
1508*d83cc019SAndroid Build Coastguard Worker 	i = 0;
1509*d83cc019SAndroid Build Coastguard Worker 	batch_buf[i++] = MI_NOOP;
1510*d83cc019SAndroid Build Coastguard Worker 	batch_buf[i++] = MI_NOOP;
1511*d83cc019SAndroid Build Coastguard Worker 	batch_buf[i++] = MI_BATCH_BUFFER_END;
1512*d83cc019SAndroid Build Coastguard Worker 	batch_buf[i++] = MI_NOOP;
1513*d83cc019SAndroid Build Coastguard Worker 	igt_assert(i * sizeof(uint32_t) == batch_size);
1514*d83cc019SAndroid Build Coastguard Worker 
1515*d83cc019SAndroid Build Coastguard Worker 	handle = gem_create(drm_fd, batch_size);
1516*d83cc019SAndroid Build Coastguard Worker 	gem_write(drm_fd, handle, 0, batch_buf, batch_size);
1517*d83cc019SAndroid Build Coastguard Worker 
1518*d83cc019SAndroid Build Coastguard Worker 	objs[0].handle = handle;
1519*d83cc019SAndroid Build Coastguard Worker 
1520*d83cc019SAndroid Build Coastguard Worker 	execbuf.buffers_ptr = (uintptr_t)objs;
1521*d83cc019SAndroid Build Coastguard Worker 	execbuf.buffer_count = 1;
1522*d83cc019SAndroid Build Coastguard Worker 	execbuf.batch_len = batch_size;
1523*d83cc019SAndroid Build Coastguard Worker 	execbuf.flags = I915_EXEC_RENDER;
1524*d83cc019SAndroid Build Coastguard Worker 	i915_execbuffer2_set_context_id(execbuf, 0);
1525*d83cc019SAndroid Build Coastguard Worker 
1526*d83cc019SAndroid Build Coastguard Worker 	disable_all_screens_and_wait(&ms_data);
1527*d83cc019SAndroid Build Coastguard Worker 	igt_system_suspend_autoresume(SUSPEND_STATE_MEM, SUSPEND_TEST_NONE);
1528*d83cc019SAndroid Build Coastguard Worker 	igt_assert(wait_for_suspended());
1529*d83cc019SAndroid Build Coastguard Worker 
1530*d83cc019SAndroid Build Coastguard Worker 	for (i = 0; i < 20; i++) {
1531*d83cc019SAndroid Build Coastguard Worker 		gem_execbuf(drm_fd, &execbuf);
1532*d83cc019SAndroid Build Coastguard Worker 		igt_assert(wait_for_suspended());
1533*d83cc019SAndroid Build Coastguard Worker 	}
1534*d83cc019SAndroid Build Coastguard Worker 
1535*d83cc019SAndroid Build Coastguard Worker 	gem_close(drm_fd, handle);
1536*d83cc019SAndroid Build Coastguard Worker }
1537*d83cc019SAndroid Build Coastguard Worker 
system_suspend_modeset_subtest(void)1538*d83cc019SAndroid Build Coastguard Worker static void system_suspend_modeset_subtest(void)
1539*d83cc019SAndroid Build Coastguard Worker {
1540*d83cc019SAndroid Build Coastguard Worker 	disable_all_screens_and_wait(&ms_data);
1541*d83cc019SAndroid Build Coastguard Worker 	igt_system_suspend_autoresume(SUSPEND_STATE_MEM, SUSPEND_TEST_NONE);
1542*d83cc019SAndroid Build Coastguard Worker 	igt_assert(wait_for_suspended());
1543*d83cc019SAndroid Build Coastguard Worker 
1544*d83cc019SAndroid Build Coastguard Worker 	enable_one_screen_and_wait(&ms_data);
1545*d83cc019SAndroid Build Coastguard Worker 	disable_all_screens_and_wait(&ms_data);
1546*d83cc019SAndroid Build Coastguard Worker }
1547*d83cc019SAndroid Build Coastguard Worker 
1548*d83cc019SAndroid Build Coastguard Worker /* Enable a screen, activate DPMS, then do a modeset. At some point our driver
1549*d83cc019SAndroid Build Coastguard Worker  * produced WARNs on this case. */
dpms_mode_unset_subtest(enum screen_type type)1550*d83cc019SAndroid Build Coastguard Worker static void dpms_mode_unset_subtest(enum screen_type type)
1551*d83cc019SAndroid Build Coastguard Worker {
1552*d83cc019SAndroid Build Coastguard Worker 	disable_all_screens_and_wait(&ms_data);
1553*d83cc019SAndroid Build Coastguard Worker 
1554*d83cc019SAndroid Build Coastguard Worker 	igt_require(enable_one_screen_with_type(&ms_data, type));
1555*d83cc019SAndroid Build Coastguard Worker 	igt_assert(wait_for_active());
1556*d83cc019SAndroid Build Coastguard Worker 
1557*d83cc019SAndroid Build Coastguard Worker 	disable_all_screens_dpms(&ms_data);
1558*d83cc019SAndroid Build Coastguard Worker 	igt_assert(wait_for_suspended());
1559*d83cc019SAndroid Build Coastguard Worker 
1560*d83cc019SAndroid Build Coastguard Worker 	disable_all_screens_and_wait(&ms_data);
1561*d83cc019SAndroid Build Coastguard Worker }
1562*d83cc019SAndroid Build Coastguard Worker 
fill_igt_fb(struct igt_fb * fb,uint32_t color)1563*d83cc019SAndroid Build Coastguard Worker static void fill_igt_fb(struct igt_fb *fb, uint32_t color)
1564*d83cc019SAndroid Build Coastguard Worker {
1565*d83cc019SAndroid Build Coastguard Worker 	int i;
1566*d83cc019SAndroid Build Coastguard Worker 	uint32_t *ptr;
1567*d83cc019SAndroid Build Coastguard Worker 
1568*d83cc019SAndroid Build Coastguard Worker 	ptr = gem_mmap__gtt(drm_fd, fb->gem_handle, fb->size, PROT_WRITE);
1569*d83cc019SAndroid Build Coastguard Worker 	for (i = 0; i < fb->size/sizeof(uint32_t); i++)
1570*d83cc019SAndroid Build Coastguard Worker 		ptr[i] = color;
1571*d83cc019SAndroid Build Coastguard Worker 	igt_assert(munmap(ptr, fb->size) == 0);
1572*d83cc019SAndroid Build Coastguard Worker }
1573*d83cc019SAndroid Build Coastguard Worker 
1574*d83cc019SAndroid Build Coastguard Worker /* At some point, this test triggered WARNs in the Kernel. */
cursor_subtest(bool dpms)1575*d83cc019SAndroid Build Coastguard Worker static void cursor_subtest(bool dpms)
1576*d83cc019SAndroid Build Coastguard Worker {
1577*d83cc019SAndroid Build Coastguard Worker 	int rc;
1578*d83cc019SAndroid Build Coastguard Worker 	struct igt_fb cursor_fb1, cursor_fb2, cursor_fb3;
1579*d83cc019SAndroid Build Coastguard Worker 	uint32_t crtc_id;
1580*d83cc019SAndroid Build Coastguard Worker 
1581*d83cc019SAndroid Build Coastguard Worker 	disable_all_screens_and_wait(&ms_data);
1582*d83cc019SAndroid Build Coastguard Worker 
1583*d83cc019SAndroid Build Coastguard Worker 	igt_require(default_mode_params);
1584*d83cc019SAndroid Build Coastguard Worker 	crtc_id = default_mode_params->crtc_id;
1585*d83cc019SAndroid Build Coastguard Worker 
1586*d83cc019SAndroid Build Coastguard Worker 	igt_create_fb(drm_fd, 64, 64, DRM_FORMAT_ARGB8888,
1587*d83cc019SAndroid Build Coastguard Worker 		      LOCAL_DRM_FORMAT_MOD_NONE, &cursor_fb1);
1588*d83cc019SAndroid Build Coastguard Worker 	igt_create_fb(drm_fd, 64, 64, DRM_FORMAT_ARGB8888,
1589*d83cc019SAndroid Build Coastguard Worker 		      LOCAL_DRM_FORMAT_MOD_NONE, &cursor_fb2);
1590*d83cc019SAndroid Build Coastguard Worker 	igt_create_fb(drm_fd, 64, 64, DRM_FORMAT_XRGB8888,
1591*d83cc019SAndroid Build Coastguard Worker 		      LOCAL_I915_FORMAT_MOD_X_TILED, &cursor_fb3);
1592*d83cc019SAndroid Build Coastguard Worker 
1593*d83cc019SAndroid Build Coastguard Worker 	fill_igt_fb(&cursor_fb1, 0xFF00FFFF);
1594*d83cc019SAndroid Build Coastguard Worker 	fill_igt_fb(&cursor_fb2, 0xFF00FF00);
1595*d83cc019SAndroid Build Coastguard Worker 	fill_igt_fb(&cursor_fb3, 0xFFFF0000);
1596*d83cc019SAndroid Build Coastguard Worker 
1597*d83cc019SAndroid Build Coastguard Worker 	set_mode_for_params_and_wait(default_mode_params);
1598*d83cc019SAndroid Build Coastguard Worker 
1599*d83cc019SAndroid Build Coastguard Worker 	rc = drmModeSetCursor(drm_fd, crtc_id, cursor_fb1.gem_handle,
1600*d83cc019SAndroid Build Coastguard Worker 			      cursor_fb1.width, cursor_fb1.height);
1601*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(rc, 0);
1602*d83cc019SAndroid Build Coastguard Worker 	rc = drmModeMoveCursor(drm_fd, crtc_id, 0, 0);
1603*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(rc, 0);
1604*d83cc019SAndroid Build Coastguard Worker 	igt_assert(wait_for_active());
1605*d83cc019SAndroid Build Coastguard Worker 
1606*d83cc019SAndroid Build Coastguard Worker 	disable_or_dpms_all_screens_and_wait(&ms_data, dpms);
1607*d83cc019SAndroid Build Coastguard Worker 
1608*d83cc019SAndroid Build Coastguard Worker 	/* First, just move the cursor. */
1609*d83cc019SAndroid Build Coastguard Worker 	rc = drmModeMoveCursor(drm_fd, crtc_id, 1, 1);
1610*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(rc, 0);
1611*d83cc019SAndroid Build Coastguard Worker 	igt_assert(wait_for_suspended());
1612*d83cc019SAndroid Build Coastguard Worker 
1613*d83cc019SAndroid Build Coastguard Worker 	/* Then unset it, and set a new one. */
1614*d83cc019SAndroid Build Coastguard Worker 	rc = drmModeSetCursor(drm_fd, crtc_id, 0, 0, 0);
1615*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(rc, 0);
1616*d83cc019SAndroid Build Coastguard Worker 	igt_assert(wait_for_suspended());
1617*d83cc019SAndroid Build Coastguard Worker 
1618*d83cc019SAndroid Build Coastguard Worker 	rc = drmModeSetCursor(drm_fd, crtc_id, cursor_fb2.gem_handle,
1619*d83cc019SAndroid Build Coastguard Worker 			      cursor_fb1.width, cursor_fb2.height);
1620*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(rc, 0);
1621*d83cc019SAndroid Build Coastguard Worker 	igt_assert(wait_for_suspended());
1622*d83cc019SAndroid Build Coastguard Worker 
1623*d83cc019SAndroid Build Coastguard Worker 	/* Move the new cursor. */
1624*d83cc019SAndroid Build Coastguard Worker 	rc = drmModeMoveCursor(drm_fd, crtc_id, 2, 2);
1625*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(rc, 0);
1626*d83cc019SAndroid Build Coastguard Worker 	igt_assert(wait_for_suspended());
1627*d83cc019SAndroid Build Coastguard Worker 
1628*d83cc019SAndroid Build Coastguard Worker 	/* Now set a new one without unsetting the previous one. */
1629*d83cc019SAndroid Build Coastguard Worker 	rc = drmModeSetCursor(drm_fd, crtc_id, cursor_fb1.gem_handle,
1630*d83cc019SAndroid Build Coastguard Worker 			      cursor_fb1.width, cursor_fb1.height);
1631*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(rc, 0);
1632*d83cc019SAndroid Build Coastguard Worker 	igt_assert(wait_for_suspended());
1633*d83cc019SAndroid Build Coastguard Worker 
1634*d83cc019SAndroid Build Coastguard Worker 	/* Cursor 3 was created with tiling and painted with a GTT mmap, so
1635*d83cc019SAndroid Build Coastguard Worker 	 * hopefully it has some fences around it. */
1636*d83cc019SAndroid Build Coastguard Worker 	rc = drmModeRmFB(drm_fd, cursor_fb3.fb_id);
1637*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(rc, 0);
1638*d83cc019SAndroid Build Coastguard Worker 	gem_set_tiling(drm_fd, cursor_fb3.gem_handle, false, cursor_fb3.strides[0]);
1639*d83cc019SAndroid Build Coastguard Worker 	igt_assert(wait_for_suspended());
1640*d83cc019SAndroid Build Coastguard Worker 
1641*d83cc019SAndroid Build Coastguard Worker 	rc = drmModeSetCursor(drm_fd, crtc_id, cursor_fb3.gem_handle,
1642*d83cc019SAndroid Build Coastguard Worker 			      cursor_fb3.width, cursor_fb3.height);
1643*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(rc, 0);
1644*d83cc019SAndroid Build Coastguard Worker 	igt_assert(wait_for_suspended());
1645*d83cc019SAndroid Build Coastguard Worker 
1646*d83cc019SAndroid Build Coastguard Worker 	/* Make sure nothing remains for the other tests. */
1647*d83cc019SAndroid Build Coastguard Worker 	rc = drmModeSetCursor(drm_fd, crtc_id, 0, 0, 0);
1648*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(rc, 0);
1649*d83cc019SAndroid Build Coastguard Worker 	igt_assert(wait_for_suspended());
1650*d83cc019SAndroid Build Coastguard Worker }
1651*d83cc019SAndroid Build Coastguard Worker 
get_plane_type(uint32_t plane_id)1652*d83cc019SAndroid Build Coastguard Worker static enum plane_type get_plane_type(uint32_t plane_id)
1653*d83cc019SAndroid Build Coastguard Worker {
1654*d83cc019SAndroid Build Coastguard Worker 	int i;
1655*d83cc019SAndroid Build Coastguard Worker 	bool found;
1656*d83cc019SAndroid Build Coastguard Worker 	uint64_t prop_value;
1657*d83cc019SAndroid Build Coastguard Worker 	drmModePropertyPtr prop;
1658*d83cc019SAndroid Build Coastguard Worker 	const char *enum_name = NULL;
1659*d83cc019SAndroid Build Coastguard Worker 	enum plane_type type;
1660*d83cc019SAndroid Build Coastguard Worker 
1661*d83cc019SAndroid Build Coastguard Worker 	found = kmstest_get_property(drm_fd, plane_id, DRM_MODE_OBJECT_PLANE,
1662*d83cc019SAndroid Build Coastguard Worker 				     "type", NULL, &prop_value, &prop);
1663*d83cc019SAndroid Build Coastguard Worker 	igt_assert(found);
1664*d83cc019SAndroid Build Coastguard Worker 
1665*d83cc019SAndroid Build Coastguard Worker 	igt_assert(prop->flags & DRM_MODE_PROP_ENUM);
1666*d83cc019SAndroid Build Coastguard Worker 	igt_assert(prop_value < prop->count_enums);
1667*d83cc019SAndroid Build Coastguard Worker 
1668*d83cc019SAndroid Build Coastguard Worker 	for (i = 0; i < prop->count_enums; i++) {
1669*d83cc019SAndroid Build Coastguard Worker 		if (prop->enums[i].value == prop_value) {
1670*d83cc019SAndroid Build Coastguard Worker 			enum_name = prop->enums[i].name;
1671*d83cc019SAndroid Build Coastguard Worker 			break;
1672*d83cc019SAndroid Build Coastguard Worker 		}
1673*d83cc019SAndroid Build Coastguard Worker 	}
1674*d83cc019SAndroid Build Coastguard Worker 	igt_assert(enum_name);
1675*d83cc019SAndroid Build Coastguard Worker 
1676*d83cc019SAndroid Build Coastguard Worker 	if (strcmp(enum_name, "Overlay") == 0)
1677*d83cc019SAndroid Build Coastguard Worker 		type = PLANE_OVERLAY;
1678*d83cc019SAndroid Build Coastguard Worker 	else if (strcmp(enum_name, "Primary") == 0)
1679*d83cc019SAndroid Build Coastguard Worker 		type = PLANE_PRIMARY;
1680*d83cc019SAndroid Build Coastguard Worker 	else if (strcmp(enum_name, "Cursor") == 0)
1681*d83cc019SAndroid Build Coastguard Worker 		type = PLANE_CURSOR;
1682*d83cc019SAndroid Build Coastguard Worker 	else
1683*d83cc019SAndroid Build Coastguard Worker 		igt_assert(0);
1684*d83cc019SAndroid Build Coastguard Worker 
1685*d83cc019SAndroid Build Coastguard Worker 	drmModeFreeProperty(prop);
1686*d83cc019SAndroid Build Coastguard Worker 
1687*d83cc019SAndroid Build Coastguard Worker 	return type;
1688*d83cc019SAndroid Build Coastguard Worker }
1689*d83cc019SAndroid Build Coastguard Worker 
test_one_plane(bool dpms,uint32_t plane_id,enum plane_type plane_type)1690*d83cc019SAndroid Build Coastguard Worker static void test_one_plane(bool dpms, uint32_t plane_id,
1691*d83cc019SAndroid Build Coastguard Worker 			   enum plane_type plane_type)
1692*d83cc019SAndroid Build Coastguard Worker {
1693*d83cc019SAndroid Build Coastguard Worker 	int rc;
1694*d83cc019SAndroid Build Coastguard Worker 	uint32_t plane_format, plane_w, plane_h;
1695*d83cc019SAndroid Build Coastguard Worker 	uint32_t crtc_id;
1696*d83cc019SAndroid Build Coastguard Worker 	struct igt_fb plane_fb1, plane_fb2;
1697*d83cc019SAndroid Build Coastguard Worker 	int32_t crtc_x = 0, crtc_y = 0;
1698*d83cc019SAndroid Build Coastguard Worker 	uint64_t tiling;
1699*d83cc019SAndroid Build Coastguard Worker 
1700*d83cc019SAndroid Build Coastguard Worker 	disable_all_screens_and_wait(&ms_data);
1701*d83cc019SAndroid Build Coastguard Worker 
1702*d83cc019SAndroid Build Coastguard Worker 	crtc_id = default_mode_params->crtc_id;
1703*d83cc019SAndroid Build Coastguard Worker 
1704*d83cc019SAndroid Build Coastguard Worker 	switch (plane_type) {
1705*d83cc019SAndroid Build Coastguard Worker 	case PLANE_OVERLAY:
1706*d83cc019SAndroid Build Coastguard Worker 		plane_format = DRM_FORMAT_XRGB8888;
1707*d83cc019SAndroid Build Coastguard Worker 		plane_w = 64;
1708*d83cc019SAndroid Build Coastguard Worker 		plane_h = 64;
1709*d83cc019SAndroid Build Coastguard Worker 		tiling = LOCAL_I915_FORMAT_MOD_X_TILED;
1710*d83cc019SAndroid Build Coastguard Worker 		break;
1711*d83cc019SAndroid Build Coastguard Worker 	case PLANE_PRIMARY:
1712*d83cc019SAndroid Build Coastguard Worker 		plane_format = DRM_FORMAT_XRGB8888;
1713*d83cc019SAndroid Build Coastguard Worker 		plane_w = default_mode_params->mode->hdisplay;
1714*d83cc019SAndroid Build Coastguard Worker 		plane_h = default_mode_params->mode->vdisplay;
1715*d83cc019SAndroid Build Coastguard Worker 		tiling = LOCAL_I915_FORMAT_MOD_X_TILED;
1716*d83cc019SAndroid Build Coastguard Worker 		break;
1717*d83cc019SAndroid Build Coastguard Worker 	case PLANE_CURSOR:
1718*d83cc019SAndroid Build Coastguard Worker 		plane_format = DRM_FORMAT_ARGB8888;
1719*d83cc019SAndroid Build Coastguard Worker 		plane_w = 64;
1720*d83cc019SAndroid Build Coastguard Worker 		plane_h = 64;
1721*d83cc019SAndroid Build Coastguard Worker 		tiling = LOCAL_DRM_FORMAT_MOD_NONE;
1722*d83cc019SAndroid Build Coastguard Worker 		break;
1723*d83cc019SAndroid Build Coastguard Worker 	default:
1724*d83cc019SAndroid Build Coastguard Worker 		igt_assert(0);
1725*d83cc019SAndroid Build Coastguard Worker 		break;
1726*d83cc019SAndroid Build Coastguard Worker 	}
1727*d83cc019SAndroid Build Coastguard Worker 
1728*d83cc019SAndroid Build Coastguard Worker 	igt_create_fb(drm_fd, plane_w, plane_h, plane_format, tiling,
1729*d83cc019SAndroid Build Coastguard Worker 		      &plane_fb1);
1730*d83cc019SAndroid Build Coastguard Worker 	igt_create_fb(drm_fd, plane_w, plane_h, plane_format, tiling,
1731*d83cc019SAndroid Build Coastguard Worker 		      &plane_fb2);
1732*d83cc019SAndroid Build Coastguard Worker 	fill_igt_fb(&plane_fb1, 0xFF00FFFF);
1733*d83cc019SAndroid Build Coastguard Worker 	fill_igt_fb(&plane_fb2, 0xFF00FF00);
1734*d83cc019SAndroid Build Coastguard Worker 
1735*d83cc019SAndroid Build Coastguard Worker 	set_mode_for_params_and_wait(default_mode_params);
1736*d83cc019SAndroid Build Coastguard Worker 
1737*d83cc019SAndroid Build Coastguard Worker 	rc = drmModeSetPlane(drm_fd, plane_id, crtc_id, plane_fb1.fb_id, 0,
1738*d83cc019SAndroid Build Coastguard Worker 			     0, 0, plane_fb1.width, plane_fb1.height,
1739*d83cc019SAndroid Build Coastguard Worker 			     0 << 16, 0 << 16, plane_fb1.width << 16,
1740*d83cc019SAndroid Build Coastguard Worker 			     plane_fb1.height << 16);
1741*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(rc, 0);
1742*d83cc019SAndroid Build Coastguard Worker 
1743*d83cc019SAndroid Build Coastguard Worker 	disable_or_dpms_all_screens_and_wait(&ms_data, dpms);
1744*d83cc019SAndroid Build Coastguard Worker 
1745*d83cc019SAndroid Build Coastguard Worker 	/* Just move the plane around. */
1746*d83cc019SAndroid Build Coastguard Worker 	if (plane_type != PLANE_PRIMARY) {
1747*d83cc019SAndroid Build Coastguard Worker 		crtc_x++;
1748*d83cc019SAndroid Build Coastguard Worker 		crtc_y++;
1749*d83cc019SAndroid Build Coastguard Worker 	}
1750*d83cc019SAndroid Build Coastguard Worker 	rc = drmModeSetPlane(drm_fd, plane_id, crtc_id, plane_fb1.fb_id, 0,
1751*d83cc019SAndroid Build Coastguard Worker 			     crtc_x, crtc_y, plane_fb1.width, plane_fb1.height,
1752*d83cc019SAndroid Build Coastguard Worker 			     0 << 16, 0 << 16, plane_fb1.width << 16,
1753*d83cc019SAndroid Build Coastguard Worker 			     plane_fb1.height << 16);
1754*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(rc, 0);
1755*d83cc019SAndroid Build Coastguard Worker 	igt_assert(wait_for_suspended());
1756*d83cc019SAndroid Build Coastguard Worker 
1757*d83cc019SAndroid Build Coastguard Worker 	/* Unset, then change the plane. */
1758*d83cc019SAndroid Build Coastguard Worker 	rc = drmModeSetPlane(drm_fd, plane_id, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
1759*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(rc, 0);
1760*d83cc019SAndroid Build Coastguard Worker 	igt_assert(wait_for_suspended());
1761*d83cc019SAndroid Build Coastguard Worker 
1762*d83cc019SAndroid Build Coastguard Worker 	rc = drmModeSetPlane(drm_fd, plane_id, crtc_id, plane_fb2.fb_id, 0,
1763*d83cc019SAndroid Build Coastguard Worker 			     crtc_x, crtc_y, plane_fb2.width, plane_fb2.height,
1764*d83cc019SAndroid Build Coastguard Worker 			     0 << 16, 0 << 16, plane_fb2.width << 16,
1765*d83cc019SAndroid Build Coastguard Worker 			     plane_fb2.height << 16);
1766*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(rc, 0);
1767*d83cc019SAndroid Build Coastguard Worker 	igt_assert(wait_for_suspended());
1768*d83cc019SAndroid Build Coastguard Worker 
1769*d83cc019SAndroid Build Coastguard Worker 	/* Now change the plane without unsetting first. */
1770*d83cc019SAndroid Build Coastguard Worker 	rc = drmModeSetPlane(drm_fd, plane_id, crtc_id, plane_fb1.fb_id, 0,
1771*d83cc019SAndroid Build Coastguard Worker 			     crtc_x, crtc_y, plane_fb1.width, plane_fb1.height,
1772*d83cc019SAndroid Build Coastguard Worker 			     0 << 16, 0 << 16, plane_fb1.width << 16,
1773*d83cc019SAndroid Build Coastguard Worker 			     plane_fb1.height << 16);
1774*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(rc, 0);
1775*d83cc019SAndroid Build Coastguard Worker 	igt_assert(wait_for_suspended());
1776*d83cc019SAndroid Build Coastguard Worker 
1777*d83cc019SAndroid Build Coastguard Worker 	/* Make sure nothing remains for the other tests. */
1778*d83cc019SAndroid Build Coastguard Worker 	rc = drmModeSetPlane(drm_fd, plane_id, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
1779*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(rc, 0);
1780*d83cc019SAndroid Build Coastguard Worker 	igt_assert(wait_for_suspended());
1781*d83cc019SAndroid Build Coastguard Worker }
1782*d83cc019SAndroid Build Coastguard Worker 
1783*d83cc019SAndroid Build Coastguard Worker /* This one also triggered WARNs on our driver at some point in time. */
planes_subtest(bool universal,bool dpms)1784*d83cc019SAndroid Build Coastguard Worker static void planes_subtest(bool universal, bool dpms)
1785*d83cc019SAndroid Build Coastguard Worker {
1786*d83cc019SAndroid Build Coastguard Worker 	int i, rc, planes_tested = 0, crtc_idx;
1787*d83cc019SAndroid Build Coastguard Worker 	drmModePlaneResPtr planes;
1788*d83cc019SAndroid Build Coastguard Worker 
1789*d83cc019SAndroid Build Coastguard Worker 	igt_require(default_mode_params);
1790*d83cc019SAndroid Build Coastguard Worker 	crtc_idx = kmstest_get_crtc_idx(ms_data.res,
1791*d83cc019SAndroid Build Coastguard Worker 					default_mode_params->crtc_id);
1792*d83cc019SAndroid Build Coastguard Worker 
1793*d83cc019SAndroid Build Coastguard Worker 	if (universal) {
1794*d83cc019SAndroid Build Coastguard Worker 		rc = drmSetClientCap(drm_fd, DRM_CLIENT_CAP_UNIVERSAL_PLANES,
1795*d83cc019SAndroid Build Coastguard Worker 				     1);
1796*d83cc019SAndroid Build Coastguard Worker 		igt_require(rc == 0);
1797*d83cc019SAndroid Build Coastguard Worker 	}
1798*d83cc019SAndroid Build Coastguard Worker 
1799*d83cc019SAndroid Build Coastguard Worker 	planes = drmModeGetPlaneResources(drm_fd);
1800*d83cc019SAndroid Build Coastguard Worker 	for (i = 0; i < planes->count_planes; i++) {
1801*d83cc019SAndroid Build Coastguard Worker 		drmModePlanePtr plane;
1802*d83cc019SAndroid Build Coastguard Worker 
1803*d83cc019SAndroid Build Coastguard Worker 		plane = drmModeGetPlane(drm_fd, planes->planes[i]);
1804*d83cc019SAndroid Build Coastguard Worker 		igt_assert(plane);
1805*d83cc019SAndroid Build Coastguard Worker 
1806*d83cc019SAndroid Build Coastguard Worker 		if (plane->possible_crtcs & (1 << crtc_idx)) {
1807*d83cc019SAndroid Build Coastguard Worker 			enum plane_type type;
1808*d83cc019SAndroid Build Coastguard Worker 
1809*d83cc019SAndroid Build Coastguard Worker 			type = universal ? get_plane_type(plane->plane_id) :
1810*d83cc019SAndroid Build Coastguard Worker 					   PLANE_OVERLAY;
1811*d83cc019SAndroid Build Coastguard Worker 			test_one_plane(dpms, plane->plane_id, type);
1812*d83cc019SAndroid Build Coastguard Worker 			planes_tested++;
1813*d83cc019SAndroid Build Coastguard Worker 		}
1814*d83cc019SAndroid Build Coastguard Worker 		drmModeFreePlane(plane);
1815*d83cc019SAndroid Build Coastguard Worker 	}
1816*d83cc019SAndroid Build Coastguard Worker 	drmModeFreePlaneResources(planes);
1817*d83cc019SAndroid Build Coastguard Worker 
1818*d83cc019SAndroid Build Coastguard Worker 	if (universal) {
1819*d83cc019SAndroid Build Coastguard Worker 		rc = drmSetClientCap(drm_fd, DRM_CLIENT_CAP_UNIVERSAL_PLANES, 0);
1820*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eq(rc, 0);
1821*d83cc019SAndroid Build Coastguard Worker 
1822*d83cc019SAndroid Build Coastguard Worker 		igt_assert_lte(3, planes_tested);
1823*d83cc019SAndroid Build Coastguard Worker 	} else {
1824*d83cc019SAndroid Build Coastguard Worker 		igt_assert_lte(1, planes_tested);
1825*d83cc019SAndroid Build Coastguard Worker 	}
1826*d83cc019SAndroid Build Coastguard Worker }
1827*d83cc019SAndroid Build Coastguard Worker 
pm_test_tiling(void)1828*d83cc019SAndroid Build Coastguard Worker static void pm_test_tiling(void)
1829*d83cc019SAndroid Build Coastguard Worker {
1830*d83cc019SAndroid Build Coastguard Worker 	uint32_t *handles;
1831*d83cc019SAndroid Build Coastguard Worker 	uint8_t **gem_bufs;
1832*d83cc019SAndroid Build Coastguard Worker 
1833*d83cc019SAndroid Build Coastguard Worker 	int max_gem_objs = 0;
1834*d83cc019SAndroid Build Coastguard Worker 	uint8_t off_bit = 14;
1835*d83cc019SAndroid Build Coastguard Worker 	uint32_t gtt_obj_max_size = (256 * 1024);
1836*d83cc019SAndroid Build Coastguard Worker 
1837*d83cc019SAndroid Build Coastguard Worker 	uint32_t i, j, k, tiling_modes[3] = {
1838*d83cc019SAndroid Build Coastguard Worker 		I915_TILING_NONE,
1839*d83cc019SAndroid Build Coastguard Worker 		I915_TILING_X,
1840*d83cc019SAndroid Build Coastguard Worker 		I915_TILING_Y,
1841*d83cc019SAndroid Build Coastguard Worker 	};
1842*d83cc019SAndroid Build Coastguard Worker 	uint32_t ti, sw;
1843*d83cc019SAndroid Build Coastguard Worker 
1844*d83cc019SAndroid Build Coastguard Worker 	/* default stride value */
1845*d83cc019SAndroid Build Coastguard Worker 	uint32_t stride = 512;
1846*d83cc019SAndroid Build Coastguard Worker 
1847*d83cc019SAndroid Build Coastguard Worker 	/* calculate how many objects we can map */
1848*d83cc019SAndroid Build Coastguard Worker 	for (i = 1 << off_bit; i <= gtt_obj_max_size; i <<= 1, max_gem_objs++)
1849*d83cc019SAndroid Build Coastguard Worker 		;
1850*d83cc019SAndroid Build Coastguard Worker 
1851*d83cc019SAndroid Build Coastguard Worker 	gem_bufs = calloc(max_gem_objs, sizeof(*gem_bufs));
1852*d83cc019SAndroid Build Coastguard Worker 	handles = calloc(max_gem_objs, sizeof(*handles));
1853*d83cc019SAndroid Build Coastguard Worker 
1854*d83cc019SAndroid Build Coastguard Worker 	/* try to set different tiling for each handle */
1855*d83cc019SAndroid Build Coastguard Worker 	for (i = 0; i < ARRAY_SIZE(tiling_modes); i++) {
1856*d83cc019SAndroid Build Coastguard Worker 
1857*d83cc019SAndroid Build Coastguard Worker 		for (j = 0, k = 1 << off_bit;
1858*d83cc019SAndroid Build Coastguard Worker 		     k <= gtt_obj_max_size; k <<= 1, j++) {
1859*d83cc019SAndroid Build Coastguard Worker 			handles[j] = gem_create(drm_fd, k);
1860*d83cc019SAndroid Build Coastguard Worker 			gem_bufs[j] = gem_mmap__gtt(drm_fd, handles[j],
1861*d83cc019SAndroid Build Coastguard Worker 						    k, PROT_WRITE);
1862*d83cc019SAndroid Build Coastguard Worker 			memset(gem_bufs[j], 0x0, k);
1863*d83cc019SAndroid Build Coastguard Worker 		}
1864*d83cc019SAndroid Build Coastguard Worker 
1865*d83cc019SAndroid Build Coastguard Worker 		disable_all_screens_and_wait(&ms_data);
1866*d83cc019SAndroid Build Coastguard Worker 
1867*d83cc019SAndroid Build Coastguard Worker 		for (j = 0; j < max_gem_objs; j++) {
1868*d83cc019SAndroid Build Coastguard Worker 			gem_set_tiling(drm_fd, handles[j],
1869*d83cc019SAndroid Build Coastguard Worker 					tiling_modes[i], stride);
1870*d83cc019SAndroid Build Coastguard Worker 			gem_get_tiling(drm_fd, handles[j], &ti, &sw);
1871*d83cc019SAndroid Build Coastguard Worker 			igt_assert(tiling_modes[i] == ti);
1872*d83cc019SAndroid Build Coastguard Worker 		}
1873*d83cc019SAndroid Build Coastguard Worker 
1874*d83cc019SAndroid Build Coastguard Worker 		enable_one_screen_and_wait(&ms_data);
1875*d83cc019SAndroid Build Coastguard Worker 
1876*d83cc019SAndroid Build Coastguard Worker 		for (j = 0, k = 1 << off_bit;
1877*d83cc019SAndroid Build Coastguard Worker 		     k <= gtt_obj_max_size; k <<= 1, j++) {
1878*d83cc019SAndroid Build Coastguard Worker 			igt_assert(munmap(gem_bufs[j], k) == 0);
1879*d83cc019SAndroid Build Coastguard Worker 			gem_close(drm_fd, handles[j]);
1880*d83cc019SAndroid Build Coastguard Worker 		}
1881*d83cc019SAndroid Build Coastguard Worker 	}
1882*d83cc019SAndroid Build Coastguard Worker 
1883*d83cc019SAndroid Build Coastguard Worker 	free(gem_bufs);
1884*d83cc019SAndroid Build Coastguard Worker 	free(handles);
1885*d83cc019SAndroid Build Coastguard Worker }
1886*d83cc019SAndroid Build Coastguard Worker 
pm_test_caching(void)1887*d83cc019SAndroid Build Coastguard Worker static void pm_test_caching(void)
1888*d83cc019SAndroid Build Coastguard Worker {
1889*d83cc019SAndroid Build Coastguard Worker 	uint32_t handle;
1890*d83cc019SAndroid Build Coastguard Worker 	uint8_t *gem_buf;
1891*d83cc019SAndroid Build Coastguard Worker 
1892*d83cc019SAndroid Build Coastguard Worker 	uint32_t i;
1893*d83cc019SAndroid Build Coastguard Worker 	uint32_t default_cache_level;
1894*d83cc019SAndroid Build Coastguard Worker 	uint32_t gtt_obj_max_size = (16 * 1024);
1895*d83cc019SAndroid Build Coastguard Worker 	uint32_t cache_levels[3] = {
1896*d83cc019SAndroid Build Coastguard Worker 		I915_CACHING_NONE,
1897*d83cc019SAndroid Build Coastguard Worker 		I915_CACHING_CACHED,            /* LLC caching */
1898*d83cc019SAndroid Build Coastguard Worker 		I915_CACHING_DISPLAY,           /* eDRAM caching */
1899*d83cc019SAndroid Build Coastguard Worker 	};
1900*d83cc019SAndroid Build Coastguard Worker 
1901*d83cc019SAndroid Build Coastguard Worker 	disable_all_screens(&ms_data);
1902*d83cc019SAndroid Build Coastguard Worker 
1903*d83cc019SAndroid Build Coastguard Worker 	handle = gem_create(drm_fd, gtt_obj_max_size);
1904*d83cc019SAndroid Build Coastguard Worker 	default_cache_level = gem_get_caching(drm_fd, handle);
1905*d83cc019SAndroid Build Coastguard Worker 	gem_buf = gem_mmap__gtt(drm_fd, handle, gtt_obj_max_size, PROT_WRITE);
1906*d83cc019SAndroid Build Coastguard Worker 
1907*d83cc019SAndroid Build Coastguard Worker 	for (i = 0; i < ARRAY_SIZE(cache_levels); i++) {
1908*d83cc019SAndroid Build Coastguard Worker 		igt_assert(wait_for_suspended());
1909*d83cc019SAndroid Build Coastguard Worker 		gem_set_caching(drm_fd, handle, default_cache_level);
1910*d83cc019SAndroid Build Coastguard Worker 
1911*d83cc019SAndroid Build Coastguard Worker 		/* Ensure we bind the vma into the GGTT */
1912*d83cc019SAndroid Build Coastguard Worker 		memset(gem_buf, 16 << i, gtt_obj_max_size);
1913*d83cc019SAndroid Build Coastguard Worker 
1914*d83cc019SAndroid Build Coastguard Worker 		/* Now try changing the cache-level on the bound object.
1915*d83cc019SAndroid Build Coastguard Worker 		 * This will either unlikely unbind the object from the GGTT,
1916*d83cc019SAndroid Build Coastguard Worker 		 * or more likely just change the PTEs inside the GGTT. Either
1917*d83cc019SAndroid Build Coastguard Worker 		 * way the driver must take the rpm wakelock around the GSM
1918*d83cc019SAndroid Build Coastguard Worker 		 * access.
1919*d83cc019SAndroid Build Coastguard Worker 		 */
1920*d83cc019SAndroid Build Coastguard Worker 		igt_debug("Setting cache level %u\n", cache_levels[i]);
1921*d83cc019SAndroid Build Coastguard Worker 		igt_assert(wait_for_suspended());
1922*d83cc019SAndroid Build Coastguard Worker 		gem_set_caching(drm_fd, handle, cache_levels[i]);
1923*d83cc019SAndroid Build Coastguard Worker 	}
1924*d83cc019SAndroid Build Coastguard Worker 
1925*d83cc019SAndroid Build Coastguard Worker 	igt_assert(munmap(gem_buf, gtt_obj_max_size) == 0);
1926*d83cc019SAndroid Build Coastguard Worker 	gem_close(drm_fd, handle);
1927*d83cc019SAndroid Build Coastguard Worker }
1928*d83cc019SAndroid Build Coastguard Worker 
fences_subtest(bool dpms)1929*d83cc019SAndroid Build Coastguard Worker static void fences_subtest(bool dpms)
1930*d83cc019SAndroid Build Coastguard Worker {
1931*d83cc019SAndroid Build Coastguard Worker 	int i;
1932*d83cc019SAndroid Build Coastguard Worker 	uint32_t *buf_ptr;
1933*d83cc019SAndroid Build Coastguard Worker 	uint32_t tiling = false, swizzle;
1934*d83cc019SAndroid Build Coastguard Worker 	struct modeset_params params;
1935*d83cc019SAndroid Build Coastguard Worker 
1936*d83cc019SAndroid Build Coastguard Worker 	disable_all_screens_and_wait(&ms_data);
1937*d83cc019SAndroid Build Coastguard Worker 
1938*d83cc019SAndroid Build Coastguard Worker 	igt_require(default_mode_params);
1939*d83cc019SAndroid Build Coastguard Worker 	params.crtc_id = default_mode_params->crtc_id;
1940*d83cc019SAndroid Build Coastguard Worker 	params.connector_id = default_mode_params->connector_id;
1941*d83cc019SAndroid Build Coastguard Worker 	params.mode = default_mode_params->mode;
1942*d83cc019SAndroid Build Coastguard Worker 	igt_create_fb(drm_fd, params.mode->hdisplay, params.mode->vdisplay,
1943*d83cc019SAndroid Build Coastguard Worker 		      DRM_FORMAT_XRGB8888, LOCAL_I915_FORMAT_MOD_X_TILED,
1944*d83cc019SAndroid Build Coastguard Worker 		      &params.fb);
1945*d83cc019SAndroid Build Coastguard Worker 
1946*d83cc019SAndroid Build Coastguard Worker 	/* Even though we passed "true" as the tiling argument, double-check
1947*d83cc019SAndroid Build Coastguard Worker 	 * that the fb is really tiled. */
1948*d83cc019SAndroid Build Coastguard Worker 	gem_get_tiling(drm_fd, params.fb.gem_handle, &tiling, &swizzle);
1949*d83cc019SAndroid Build Coastguard Worker 	igt_assert(tiling);
1950*d83cc019SAndroid Build Coastguard Worker 
1951*d83cc019SAndroid Build Coastguard Worker 	buf_ptr = gem_mmap__gtt(drm_fd, params.fb.gem_handle, params.fb.size,
1952*d83cc019SAndroid Build Coastguard Worker 				PROT_WRITE | PROT_READ);
1953*d83cc019SAndroid Build Coastguard Worker 	for (i = 0; i < params.fb.size/sizeof(uint32_t); i++)
1954*d83cc019SAndroid Build Coastguard Worker 		buf_ptr[i] = i;
1955*d83cc019SAndroid Build Coastguard Worker 
1956*d83cc019SAndroid Build Coastguard Worker 	set_mode_for_params_and_wait(&params);
1957*d83cc019SAndroid Build Coastguard Worker 
1958*d83cc019SAndroid Build Coastguard Worker 	disable_or_dpms_all_screens_and_wait(&ms_data, dpms);
1959*d83cc019SAndroid Build Coastguard Worker 
1960*d83cc019SAndroid Build Coastguard Worker 	for (i = 0; i < params.fb.size/sizeof(uint32_t); i++)
1961*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eq(buf_ptr[i], i);
1962*d83cc019SAndroid Build Coastguard Worker 	igt_assert(wait_for_suspended());
1963*d83cc019SAndroid Build Coastguard Worker 
1964*d83cc019SAndroid Build Coastguard Worker 	if (dpms) {
1965*d83cc019SAndroid Build Coastguard Worker 		drmModeConnectorPtr c = NULL;
1966*d83cc019SAndroid Build Coastguard Worker 
1967*d83cc019SAndroid Build Coastguard Worker 		for (i = 0; i < ms_data.res->count_connectors; i++)
1968*d83cc019SAndroid Build Coastguard Worker 			if (ms_data.connectors[i]->connector_id ==
1969*d83cc019SAndroid Build Coastguard Worker 			    params.connector_id)
1970*d83cc019SAndroid Build Coastguard Worker 				c = ms_data.connectors[i];
1971*d83cc019SAndroid Build Coastguard Worker 		igt_assert(c);
1972*d83cc019SAndroid Build Coastguard Worker 
1973*d83cc019SAndroid Build Coastguard Worker 		kmstest_set_connector_dpms(drm_fd, c, DRM_MODE_DPMS_ON);
1974*d83cc019SAndroid Build Coastguard Worker 	} else {
1975*d83cc019SAndroid Build Coastguard Worker 		set_mode_for_params(&params);
1976*d83cc019SAndroid Build Coastguard Worker 	}
1977*d83cc019SAndroid Build Coastguard Worker 	igt_assert(wait_for_active());
1978*d83cc019SAndroid Build Coastguard Worker 
1979*d83cc019SAndroid Build Coastguard Worker 	for (i = 0; i < params.fb.size/sizeof(uint32_t); i++)
1980*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eq(buf_ptr[i], i);
1981*d83cc019SAndroid Build Coastguard Worker 
1982*d83cc019SAndroid Build Coastguard Worker 	igt_assert(munmap(buf_ptr, params.fb.size) == 0);
1983*d83cc019SAndroid Build Coastguard Worker }
1984*d83cc019SAndroid Build Coastguard Worker 
1985*d83cc019SAndroid Build Coastguard Worker int rounds = 10;
1986*d83cc019SAndroid Build Coastguard Worker bool stay = false;
1987*d83cc019SAndroid Build Coastguard Worker 
opt_handler(int opt,int opt_index,void * data)1988*d83cc019SAndroid Build Coastguard Worker static int opt_handler(int opt, int opt_index, void *data)
1989*d83cc019SAndroid Build Coastguard Worker {
1990*d83cc019SAndroid Build Coastguard Worker 	switch (opt) {
1991*d83cc019SAndroid Build Coastguard Worker 	case 'l':
1992*d83cc019SAndroid Build Coastguard Worker 		rounds = 50;
1993*d83cc019SAndroid Build Coastguard Worker 		break;
1994*d83cc019SAndroid Build Coastguard Worker 	case 's':
1995*d83cc019SAndroid Build Coastguard Worker 		stay = true;
1996*d83cc019SAndroid Build Coastguard Worker 		break;
1997*d83cc019SAndroid Build Coastguard Worker 	default:
1998*d83cc019SAndroid Build Coastguard Worker 		return IGT_OPT_HANDLER_ERROR;
1999*d83cc019SAndroid Build Coastguard Worker 	}
2000*d83cc019SAndroid Build Coastguard Worker 
2001*d83cc019SAndroid Build Coastguard Worker 	return IGT_OPT_HANDLER_SUCCESS;
2002*d83cc019SAndroid Build Coastguard Worker }
2003*d83cc019SAndroid Build Coastguard Worker 
2004*d83cc019SAndroid Build Coastguard Worker const char *help_str =
2005*d83cc019SAndroid Build Coastguard Worker 	"  --stress\t\tMake the stress-tests more stressful.\n"
2006*d83cc019SAndroid Build Coastguard Worker 	"  --stay\t\tDisable all screen and try to go into runtime pm. Useful for debugging.";
2007*d83cc019SAndroid Build Coastguard Worker static struct option long_options[] = {
2008*d83cc019SAndroid Build Coastguard Worker 	{"stress", 0, 0, 'l'},
2009*d83cc019SAndroid Build Coastguard Worker 	{"stay", 0, 0, 's'},
2010*d83cc019SAndroid Build Coastguard Worker 	{ 0, 0, 0, 0 }
2011*d83cc019SAndroid Build Coastguard Worker };
2012*d83cc019SAndroid Build Coastguard Worker 
2013*d83cc019SAndroid Build Coastguard Worker igt_main_args("", long_options, help_str, opt_handler, NULL)
2014*d83cc019SAndroid Build Coastguard Worker {
2015*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("basic-rte") {
2016*d83cc019SAndroid Build Coastguard Worker 		igt_assert(setup_environment());
2017*d83cc019SAndroid Build Coastguard Worker 		basic_subtest();
2018*d83cc019SAndroid Build Coastguard Worker 	}
2019*d83cc019SAndroid Build Coastguard Worker 
2020*d83cc019SAndroid Build Coastguard Worker 	/* Skip instead of failing in case the machine is not prepared to reach
2021*d83cc019SAndroid Build Coastguard Worker 	 * PC8+. We don't want bug reports from cases where the machine is just
2022*d83cc019SAndroid Build Coastguard Worker 	 * not properly configured. */
2023*d83cc019SAndroid Build Coastguard Worker 	igt_fixture
2024*d83cc019SAndroid Build Coastguard Worker 		igt_require(setup_environment());
2025*d83cc019SAndroid Build Coastguard Worker 
2026*d83cc019SAndroid Build Coastguard Worker 	if (stay)
2027*d83cc019SAndroid Build Coastguard Worker 		igt_subtest("stay")
2028*d83cc019SAndroid Build Coastguard Worker 			stay_subtest();
2029*d83cc019SAndroid Build Coastguard Worker 
2030*d83cc019SAndroid Build Coastguard Worker 	/* Essential things */
2031*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("drm-resources-equal")
2032*d83cc019SAndroid Build Coastguard Worker 		drm_resources_equal_subtest();
2033*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("basic-pci-d3-state")
2034*d83cc019SAndroid Build Coastguard Worker 		pci_d3_state_subtest();
2035*d83cc019SAndroid Build Coastguard Worker 
2036*d83cc019SAndroid Build Coastguard Worker 	/* Basic modeset */
2037*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("modeset-lpsp")
2038*d83cc019SAndroid Build Coastguard Worker 		modeset_subtest(SCREEN_TYPE_LPSP, 1, WAIT_STATUS);
2039*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("modeset-non-lpsp")
2040*d83cc019SAndroid Build Coastguard Worker 		modeset_subtest(SCREEN_TYPE_NON_LPSP, 1, WAIT_STATUS);
2041*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("dpms-lpsp")
2042*d83cc019SAndroid Build Coastguard Worker 		modeset_subtest(SCREEN_TYPE_LPSP, 1, WAIT_STATUS | USE_DPMS);
2043*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("dpms-non-lpsp")
2044*d83cc019SAndroid Build Coastguard Worker 		modeset_subtest(SCREEN_TYPE_NON_LPSP, 1, WAIT_STATUS | USE_DPMS);
2045*d83cc019SAndroid Build Coastguard Worker 
2046*d83cc019SAndroid Build Coastguard Worker 	/* GEM */
2047*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("gem-mmap-cpu")
2048*d83cc019SAndroid Build Coastguard Worker 		gem_mmap_subtest(false);
2049*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("gem-mmap-gtt")
2050*d83cc019SAndroid Build Coastguard Worker 		gem_mmap_subtest(true);
2051*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("gem-pread")
2052*d83cc019SAndroid Build Coastguard Worker 		gem_pread_subtest();
2053*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("gem-execbuf")
2054*d83cc019SAndroid Build Coastguard Worker 		gem_execbuf_subtest();
2055*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("gem-idle")
2056*d83cc019SAndroid Build Coastguard Worker 		gem_idle_subtest();
2057*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("gem-evict-pwrite")
2058*d83cc019SAndroid Build Coastguard Worker 		gem_evict_pwrite_subtest();
2059*d83cc019SAndroid Build Coastguard Worker 
2060*d83cc019SAndroid Build Coastguard Worker 	/* Planes and cursors */
2061*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("cursor")
2062*d83cc019SAndroid Build Coastguard Worker 		cursor_subtest(false);
2063*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("cursor-dpms")
2064*d83cc019SAndroid Build Coastguard Worker 		cursor_subtest(true);
2065*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("legacy-planes")
2066*d83cc019SAndroid Build Coastguard Worker 		planes_subtest(false, false);
2067*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("legacy-planes-dpms")
2068*d83cc019SAndroid Build Coastguard Worker 		planes_subtest(false, true);
2069*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("universal-planes")
2070*d83cc019SAndroid Build Coastguard Worker 		planes_subtest(true, false);
2071*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("universal-planes-dpms")
2072*d83cc019SAndroid Build Coastguard Worker 		planes_subtest(true, true);
2073*d83cc019SAndroid Build Coastguard Worker 
2074*d83cc019SAndroid Build Coastguard Worker 	/* Misc */
2075*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("reg-read-ioctl")
2076*d83cc019SAndroid Build Coastguard Worker 		reg_read_ioctl_subtest();
2077*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("i2c")
2078*d83cc019SAndroid Build Coastguard Worker 		i2c_subtest();
2079*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("pc8-residency")
2080*d83cc019SAndroid Build Coastguard Worker 		pc8_residency_subtest();
2081*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("debugfs-read")
2082*d83cc019SAndroid Build Coastguard Worker 		debugfs_read_subtest();
2083*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("debugfs-forcewake-user")
2084*d83cc019SAndroid Build Coastguard Worker 		debugfs_forcewake_user_subtest();
2085*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("sysfs-read")
2086*d83cc019SAndroid Build Coastguard Worker 		sysfs_read_subtest();
2087*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("dpms-mode-unset-lpsp")
2088*d83cc019SAndroid Build Coastguard Worker 		dpms_mode_unset_subtest(SCREEN_TYPE_LPSP);
2089*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("dpms-mode-unset-non-lpsp")
2090*d83cc019SAndroid Build Coastguard Worker 		dpms_mode_unset_subtest(SCREEN_TYPE_NON_LPSP);
2091*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("fences")
2092*d83cc019SAndroid Build Coastguard Worker 		fences_subtest(false);
2093*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("fences-dpms")
2094*d83cc019SAndroid Build Coastguard Worker 		fences_subtest(true);
2095*d83cc019SAndroid Build Coastguard Worker 
2096*d83cc019SAndroid Build Coastguard Worker 	/* Modeset stress */
2097*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("modeset-lpsp-stress")
2098*d83cc019SAndroid Build Coastguard Worker 		modeset_subtest(SCREEN_TYPE_LPSP, rounds, WAIT_STATUS);
2099*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("modeset-non-lpsp-stress")
2100*d83cc019SAndroid Build Coastguard Worker 		modeset_subtest(SCREEN_TYPE_NON_LPSP, rounds, WAIT_STATUS);
2101*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("modeset-lpsp-stress-no-wait")
2102*d83cc019SAndroid Build Coastguard Worker 		modeset_subtest(SCREEN_TYPE_LPSP, rounds, DONT_WAIT);
2103*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("modeset-non-lpsp-stress-no-wait")
2104*d83cc019SAndroid Build Coastguard Worker 		modeset_subtest(SCREEN_TYPE_NON_LPSP, rounds, DONT_WAIT);
2105*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("modeset-pc8-residency-stress")
2106*d83cc019SAndroid Build Coastguard Worker 		modeset_subtest(SCREEN_TYPE_ANY, rounds, WAIT_PC8_RES);
2107*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("modeset-stress-extra-wait")
2108*d83cc019SAndroid Build Coastguard Worker 		modeset_subtest(SCREEN_TYPE_ANY, rounds,
2109*d83cc019SAndroid Build Coastguard Worker 				WAIT_STATUS | WAIT_EXTRA);
2110*d83cc019SAndroid Build Coastguard Worker 
2111*d83cc019SAndroid Build Coastguard Worker 	/* System suspend */
2112*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("system-suspend-devices")
2113*d83cc019SAndroid Build Coastguard Worker 		system_suspend_subtest(SUSPEND_STATE_MEM, SUSPEND_TEST_DEVICES);
2114*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("system-suspend")
2115*d83cc019SAndroid Build Coastguard Worker 		system_suspend_subtest(SUSPEND_STATE_MEM, SUSPEND_TEST_NONE);
2116*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("system-suspend-execbuf")
2117*d83cc019SAndroid Build Coastguard Worker 		system_suspend_execbuf_subtest();
2118*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("system-suspend-modeset")
2119*d83cc019SAndroid Build Coastguard Worker 		system_suspend_modeset_subtest();
2120*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("system-hibernate-devices")
2121*d83cc019SAndroid Build Coastguard Worker 		system_suspend_subtest(SUSPEND_STATE_DISK,
2122*d83cc019SAndroid Build Coastguard Worker 				       SUSPEND_TEST_DEVICES);
2123*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("system-hibernate")
2124*d83cc019SAndroid Build Coastguard Worker 		system_suspend_subtest(SUSPEND_STATE_DISK, SUSPEND_TEST_NONE);
2125*d83cc019SAndroid Build Coastguard Worker 
2126*d83cc019SAndroid Build Coastguard Worker 	/* GEM stress */
2127*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("gem-execbuf-stress")
2128*d83cc019SAndroid Build Coastguard Worker 		gem_execbuf_stress_subtest(rounds, WAIT_STATUS);
2129*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("gem-execbuf-stress-pc8")
2130*d83cc019SAndroid Build Coastguard Worker 		gem_execbuf_stress_subtest(rounds, WAIT_PC8_RES);
2131*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("gem-execbuf-stress-extra-wait")
2132*d83cc019SAndroid Build Coastguard Worker 		gem_execbuf_stress_subtest(rounds, WAIT_STATUS | WAIT_EXTRA);
2133*d83cc019SAndroid Build Coastguard Worker 
2134*d83cc019SAndroid Build Coastguard Worker 	/* power-wake reference tests */
2135*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("pm-tiling")
2136*d83cc019SAndroid Build Coastguard Worker 		pm_test_tiling();
2137*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("pm-caching")
2138*d83cc019SAndroid Build Coastguard Worker 		pm_test_caching();
2139*d83cc019SAndroid Build Coastguard Worker 
2140*d83cc019SAndroid Build Coastguard Worker 	igt_fixture
2141*d83cc019SAndroid Build Coastguard Worker 		teardown_environment();
2142*d83cc019SAndroid Build Coastguard Worker 
2143*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("module-reload") {
2144*d83cc019SAndroid Build Coastguard Worker 		igt_debug("Reload w/o display\n");
2145*d83cc019SAndroid Build Coastguard Worker 		igt_i915_driver_unload();
2146*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eq(igt_i915_driver_load("disable_display=1 mmio_debug=-1"), 0);
2147*d83cc019SAndroid Build Coastguard Worker 
2148*d83cc019SAndroid Build Coastguard Worker 		igt_assert(setup_environment());
2149*d83cc019SAndroid Build Coastguard Worker 		igt_assert(igt_wait(device_in_pci_d3(), 2000, 100));
2150*d83cc019SAndroid Build Coastguard Worker 		teardown_environment();
2151*d83cc019SAndroid Build Coastguard Worker 
2152*d83cc019SAndroid Build Coastguard Worker 		igt_debug("Reload as normal\n");
2153*d83cc019SAndroid Build Coastguard Worker 		igt_i915_driver_unload();
2154*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eq(igt_i915_driver_load("mmio_debug=-1"), 0);
2155*d83cc019SAndroid Build Coastguard Worker 
2156*d83cc019SAndroid Build Coastguard Worker 		igt_assert(setup_environment());
2157*d83cc019SAndroid Build Coastguard Worker 		igt_assert(igt_wait(device_in_pci_d3(), 2000, 100));
2158*d83cc019SAndroid Build Coastguard Worker 		if (enable_one_screen_with_type(&ms_data, SCREEN_TYPE_ANY))
2159*d83cc019SAndroid Build Coastguard Worker 			drm_resources_equal_subtest();
2160*d83cc019SAndroid Build Coastguard Worker 		teardown_environment();
2161*d83cc019SAndroid Build Coastguard Worker 
2162*d83cc019SAndroid Build Coastguard Worker 		/* Remove our mmio_debugging module */
2163*d83cc019SAndroid Build Coastguard Worker 		igt_i915_driver_unload();
2164*d83cc019SAndroid Build Coastguard Worker 	}
2165*d83cc019SAndroid Build Coastguard Worker }
2166