xref: /aosp_15_r20/external/igt-gpu-tools/tests/kms_fbcon_fbt.c (revision d83cc019efdc2edc6c4b16e9034a3ceb8d35d77c)
1*d83cc019SAndroid Build Coastguard Worker /*
2*d83cc019SAndroid Build Coastguard Worker  * Copyright © 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: Paulo Zanoni <[email protected]>
24*d83cc019SAndroid Build Coastguard Worker  *
25*d83cc019SAndroid Build Coastguard Worker  */
26*d83cc019SAndroid Build Coastguard Worker 
27*d83cc019SAndroid Build Coastguard Worker #include "igt.h"
28*d83cc019SAndroid Build Coastguard Worker #include "igt_psr.h"
29*d83cc019SAndroid Build Coastguard Worker #include "igt_sysfs.h"
30*d83cc019SAndroid Build Coastguard Worker #include <sys/types.h>
31*d83cc019SAndroid Build Coastguard Worker #include <sys/stat.h>
32*d83cc019SAndroid Build Coastguard Worker #include <fcntl.h>
33*d83cc019SAndroid Build Coastguard Worker 
34*d83cc019SAndroid Build Coastguard Worker 
35*d83cc019SAndroid Build Coastguard Worker IGT_TEST_DESCRIPTION("Test the relationship between fbcon and the frontbuffer "
36*d83cc019SAndroid Build Coastguard Worker 		     "tracking infrastructure.");
37*d83cc019SAndroid Build Coastguard Worker 
38*d83cc019SAndroid Build Coastguard Worker #define MAX_CONNECTORS 32
39*d83cc019SAndroid Build Coastguard Worker 
40*d83cc019SAndroid Build Coastguard Worker static bool do_wait_user = false;
41*d83cc019SAndroid Build Coastguard Worker 
42*d83cc019SAndroid Build Coastguard Worker struct drm_info {
43*d83cc019SAndroid Build Coastguard Worker 	int fd;
44*d83cc019SAndroid Build Coastguard Worker 	int debugfs_fd;
45*d83cc019SAndroid Build Coastguard Worker 	drmModeResPtr res;
46*d83cc019SAndroid Build Coastguard Worker 	drmModeConnectorPtr connectors[MAX_CONNECTORS];
47*d83cc019SAndroid Build Coastguard Worker };
48*d83cc019SAndroid Build Coastguard Worker 
wait_user(const char * msg)49*d83cc019SAndroid Build Coastguard Worker static void wait_user(const char *msg)
50*d83cc019SAndroid Build Coastguard Worker {
51*d83cc019SAndroid Build Coastguard Worker 	if (!do_wait_user)
52*d83cc019SAndroid Build Coastguard Worker 		return;
53*d83cc019SAndroid Build Coastguard Worker 
54*d83cc019SAndroid Build Coastguard Worker 	igt_info("%s Press enter...\n", msg);
55*d83cc019SAndroid Build Coastguard Worker 	while (getchar() != '\n')
56*d83cc019SAndroid Build Coastguard Worker 		;
57*d83cc019SAndroid Build Coastguard Worker }
58*d83cc019SAndroid Build Coastguard Worker 
setup_drm(struct drm_info * drm)59*d83cc019SAndroid Build Coastguard Worker static void setup_drm(struct drm_info *drm)
60*d83cc019SAndroid Build Coastguard Worker {
61*d83cc019SAndroid Build Coastguard Worker 	int i;
62*d83cc019SAndroid Build Coastguard Worker 
63*d83cc019SAndroid Build Coastguard Worker 	if (drm->fd >= 0)
64*d83cc019SAndroid Build Coastguard Worker 		return;
65*d83cc019SAndroid Build Coastguard Worker 
66*d83cc019SAndroid Build Coastguard Worker 	drm->fd = drm_open_driver_master(DRIVER_INTEL);
67*d83cc019SAndroid Build Coastguard Worker 
68*d83cc019SAndroid Build Coastguard Worker 	drm->res = drmModeGetResources(drm->fd);
69*d83cc019SAndroid Build Coastguard Worker 	igt_require(drm->res);
70*d83cc019SAndroid Build Coastguard Worker 	igt_assert(drm->res->count_connectors <= MAX_CONNECTORS);
71*d83cc019SAndroid Build Coastguard Worker 
72*d83cc019SAndroid Build Coastguard Worker 	for (i = 0; i < drm->res->count_connectors; i++)
73*d83cc019SAndroid Build Coastguard Worker 		drm->connectors[i] = drmModeGetConnectorCurrent(drm->fd,
74*d83cc019SAndroid Build Coastguard Worker 						drm->res->connectors[i]);
75*d83cc019SAndroid Build Coastguard Worker 
76*d83cc019SAndroid Build Coastguard Worker 	kmstest_set_vt_graphics_mode();
77*d83cc019SAndroid Build Coastguard Worker }
78*d83cc019SAndroid Build Coastguard Worker 
teardown_drm(struct drm_info * drm)79*d83cc019SAndroid Build Coastguard Worker static void teardown_drm(struct drm_info *drm)
80*d83cc019SAndroid Build Coastguard Worker {
81*d83cc019SAndroid Build Coastguard Worker 	int i;
82*d83cc019SAndroid Build Coastguard Worker 
83*d83cc019SAndroid Build Coastguard Worker 	kmstest_restore_vt_mode();
84*d83cc019SAndroid Build Coastguard Worker 
85*d83cc019SAndroid Build Coastguard Worker 	for (i = 0; i < drm->res->count_connectors; i++)
86*d83cc019SAndroid Build Coastguard Worker 		drmModeFreeConnector(drm->connectors[i]);
87*d83cc019SAndroid Build Coastguard Worker 
88*d83cc019SAndroid Build Coastguard Worker 	drmModeFreeResources(drm->res);
89*d83cc019SAndroid Build Coastguard Worker 	igt_assert(close(drm->fd) == 0);
90*d83cc019SAndroid Build Coastguard Worker 	drm->fd = -1;
91*d83cc019SAndroid Build Coastguard Worker }
92*d83cc019SAndroid Build Coastguard Worker 
fbc_supported_on_chipset(int debugfs_fd)93*d83cc019SAndroid Build Coastguard Worker static bool fbc_supported_on_chipset(int debugfs_fd)
94*d83cc019SAndroid Build Coastguard Worker {
95*d83cc019SAndroid Build Coastguard Worker 	char buf[128];
96*d83cc019SAndroid Build Coastguard Worker 	int ret;
97*d83cc019SAndroid Build Coastguard Worker 
98*d83cc019SAndroid Build Coastguard Worker 	ret = igt_debugfs_simple_read(debugfs_fd, "i915_fbc_status",
99*d83cc019SAndroid Build Coastguard Worker 				      buf, sizeof(buf));
100*d83cc019SAndroid Build Coastguard Worker 	if (ret < 0)
101*d83cc019SAndroid Build Coastguard Worker 		return false;
102*d83cc019SAndroid Build Coastguard Worker 
103*d83cc019SAndroid Build Coastguard Worker 	return !strstr(buf, "FBC unsupported on this chipset\n");
104*d83cc019SAndroid Build Coastguard Worker }
105*d83cc019SAndroid Build Coastguard Worker 
connector_can_fbc(drmModeConnectorPtr connector)106*d83cc019SAndroid Build Coastguard Worker static bool connector_can_fbc(drmModeConnectorPtr connector)
107*d83cc019SAndroid Build Coastguard Worker {
108*d83cc019SAndroid Build Coastguard Worker 	return true;
109*d83cc019SAndroid Build Coastguard Worker }
110*d83cc019SAndroid Build Coastguard Worker 
fbc_print_status(int debugfs_fd)111*d83cc019SAndroid Build Coastguard Worker static void fbc_print_status(int debugfs_fd)
112*d83cc019SAndroid Build Coastguard Worker {
113*d83cc019SAndroid Build Coastguard Worker 	static char buf[128];
114*d83cc019SAndroid Build Coastguard Worker 
115*d83cc019SAndroid Build Coastguard Worker 	igt_debugfs_simple_read(debugfs_fd, "i915_fbc_status", buf,
116*d83cc019SAndroid Build Coastguard Worker 				sizeof(buf));
117*d83cc019SAndroid Build Coastguard Worker 	igt_debug("FBC status: %s\n", buf);
118*d83cc019SAndroid Build Coastguard Worker }
119*d83cc019SAndroid Build Coastguard Worker 
fbc_is_enabled(int debugfs_fd)120*d83cc019SAndroid Build Coastguard Worker static bool fbc_is_enabled(int debugfs_fd)
121*d83cc019SAndroid Build Coastguard Worker {
122*d83cc019SAndroid Build Coastguard Worker 	char buf[128];
123*d83cc019SAndroid Build Coastguard Worker 
124*d83cc019SAndroid Build Coastguard Worker 	igt_debugfs_simple_read(debugfs_fd, "i915_fbc_status", buf,
125*d83cc019SAndroid Build Coastguard Worker 				sizeof(buf));
126*d83cc019SAndroid Build Coastguard Worker 	return strstr(buf, "FBC enabled\n");
127*d83cc019SAndroid Build Coastguard Worker }
128*d83cc019SAndroid Build Coastguard Worker 
fbc_wait_until_enabled(int debugfs_fd)129*d83cc019SAndroid Build Coastguard Worker static bool fbc_wait_until_enabled(int debugfs_fd)
130*d83cc019SAndroid Build Coastguard Worker {
131*d83cc019SAndroid Build Coastguard Worker 	bool r = igt_wait(fbc_is_enabled(debugfs_fd), 5000, 1);
132*d83cc019SAndroid Build Coastguard Worker 	fbc_print_status(debugfs_fd);
133*d83cc019SAndroid Build Coastguard Worker 	return r;
134*d83cc019SAndroid Build Coastguard Worker }
135*d83cc019SAndroid Build Coastguard Worker 
fbc_wait_until_update(int debugfs)136*d83cc019SAndroid Build Coastguard Worker static bool fbc_wait_until_update(int debugfs)
137*d83cc019SAndroid Build Coastguard Worker {
138*d83cc019SAndroid Build Coastguard Worker 	/*
139*d83cc019SAndroid Build Coastguard Worker 	 * FBC is not expected to be enabled because fbcon do not uses a tiled
140*d83cc019SAndroid Build Coastguard Worker 	 * framebuffer so a fence can not be setup on the framebuffer and FBC
141*d83cc019SAndroid Build Coastguard Worker 	 * code requires a fence to accurate track frontbuffer modifications
142*d83cc019SAndroid Build Coastguard Worker 	 * (what maybe is not necessary anymore as we now have
143*d83cc019SAndroid Build Coastguard Worker 	 * intel_fbc_invalidate()/flush()).
144*d83cc019SAndroid Build Coastguard Worker 	 *
145*d83cc019SAndroid Build Coastguard Worker 	 * If one day fbcon starts to use a tiled framebuffer we would need to
146*d83cc019SAndroid Build Coastguard Worker 	 * check the 'Compressing' status as in each blink it would be disabled.
147*d83cc019SAndroid Build Coastguard Worker 	 */
148*d83cc019SAndroid Build Coastguard Worker 	return !fbc_wait_until_enabled(debugfs);
149*d83cc019SAndroid Build Coastguard Worker }
150*d83cc019SAndroid Build Coastguard Worker 
151*d83cc019SAndroid Build Coastguard Worker typedef bool (*connector_possible_fn)(drmModeConnectorPtr connector);
152*d83cc019SAndroid Build Coastguard Worker 
set_mode_for_one_screen(struct drm_info * drm,struct igt_fb * fb,connector_possible_fn connector_possible)153*d83cc019SAndroid Build Coastguard Worker static void set_mode_for_one_screen(struct drm_info *drm, struct igt_fb *fb,
154*d83cc019SAndroid Build Coastguard Worker 				    connector_possible_fn connector_possible)
155*d83cc019SAndroid Build Coastguard Worker {
156*d83cc019SAndroid Build Coastguard Worker 	int i, rc;
157*d83cc019SAndroid Build Coastguard Worker 	uint32_t crtc_id;
158*d83cc019SAndroid Build Coastguard Worker 	drmModeModeInfoPtr mode;
159*d83cc019SAndroid Build Coastguard Worker 	uint32_t buffer_id;
160*d83cc019SAndroid Build Coastguard Worker 	drmModeConnectorPtr c = NULL;
161*d83cc019SAndroid Build Coastguard Worker 
162*d83cc019SAndroid Build Coastguard Worker 	for (i = 0; i < drm->res->count_connectors; i++) {
163*d83cc019SAndroid Build Coastguard Worker 		c = drm->connectors[i];
164*d83cc019SAndroid Build Coastguard Worker 
165*d83cc019SAndroid Build Coastguard Worker 		if (c->connection == DRM_MODE_CONNECTED && c->count_modes &&
166*d83cc019SAndroid Build Coastguard Worker 		    connector_possible(c)) {
167*d83cc019SAndroid Build Coastguard Worker 			mode = &c->modes[0];
168*d83cc019SAndroid Build Coastguard Worker 			break;
169*d83cc019SAndroid Build Coastguard Worker 		}
170*d83cc019SAndroid Build Coastguard Worker 	}
171*d83cc019SAndroid Build Coastguard Worker 	igt_require_f(i < drm->res->count_connectors,
172*d83cc019SAndroid Build Coastguard Worker 		      "No connector available\n");
173*d83cc019SAndroid Build Coastguard Worker 
174*d83cc019SAndroid Build Coastguard Worker 	crtc_id = kmstest_find_crtc_for_connector(drm->fd, drm->res, c, 0);
175*d83cc019SAndroid Build Coastguard Worker 
176*d83cc019SAndroid Build Coastguard Worker 	buffer_id = igt_create_fb(drm->fd, mode->hdisplay, mode->vdisplay,
177*d83cc019SAndroid Build Coastguard Worker 				  DRM_FORMAT_XRGB8888,
178*d83cc019SAndroid Build Coastguard Worker 				  LOCAL_I915_FORMAT_MOD_X_TILED, fb);
179*d83cc019SAndroid Build Coastguard Worker 	igt_draw_fill_fb(drm->fd, fb, 0xFF);
180*d83cc019SAndroid Build Coastguard Worker 
181*d83cc019SAndroid Build Coastguard Worker 	igt_info("Setting %dx%d mode for %s connector\n",
182*d83cc019SAndroid Build Coastguard Worker 		 mode->hdisplay, mode->vdisplay,
183*d83cc019SAndroid Build Coastguard Worker 		 kmstest_connector_type_str(c->connector_type));
184*d83cc019SAndroid Build Coastguard Worker 
185*d83cc019SAndroid Build Coastguard Worker 	rc = drmModeSetCrtc(drm->fd, crtc_id, buffer_id, 0, 0,
186*d83cc019SAndroid Build Coastguard Worker 			    &c->connector_id, 1, mode);
187*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(rc, 0);
188*d83cc019SAndroid Build Coastguard Worker }
189*d83cc019SAndroid Build Coastguard Worker 
connector_can_psr(drmModeConnectorPtr connector)190*d83cc019SAndroid Build Coastguard Worker static bool connector_can_psr(drmModeConnectorPtr connector)
191*d83cc019SAndroid Build Coastguard Worker {
192*d83cc019SAndroid Build Coastguard Worker 	return (connector->connector_type == DRM_MODE_CONNECTOR_eDP);
193*d83cc019SAndroid Build Coastguard Worker }
194*d83cc019SAndroid Build Coastguard Worker 
psr_print_status(int debugfs_fd)195*d83cc019SAndroid Build Coastguard Worker static void psr_print_status(int debugfs_fd)
196*d83cc019SAndroid Build Coastguard Worker {
197*d83cc019SAndroid Build Coastguard Worker 	static char buf[PSR_STATUS_MAX_LEN];
198*d83cc019SAndroid Build Coastguard Worker 
199*d83cc019SAndroid Build Coastguard Worker 	igt_debugfs_simple_read(debugfs_fd, "i915_edp_psr_status", buf,
200*d83cc019SAndroid Build Coastguard Worker 				sizeof(buf));
201*d83cc019SAndroid Build Coastguard Worker 	igt_debug("PSR status: %s\n", buf);
202*d83cc019SAndroid Build Coastguard Worker }
203*d83cc019SAndroid Build Coastguard Worker 
psr_wait_until_enabled(int debugfs_fd)204*d83cc019SAndroid Build Coastguard Worker static bool psr_wait_until_enabled(int debugfs_fd)
205*d83cc019SAndroid Build Coastguard Worker {
206*d83cc019SAndroid Build Coastguard Worker 	bool r = psr_wait_entry(debugfs_fd, PSR_MODE_1);
207*d83cc019SAndroid Build Coastguard Worker 
208*d83cc019SAndroid Build Coastguard Worker 	psr_print_status(debugfs_fd);
209*d83cc019SAndroid Build Coastguard Worker 	return r;
210*d83cc019SAndroid Build Coastguard Worker }
211*d83cc019SAndroid Build Coastguard Worker 
psr_supported_on_chipset(int debugfs_fd)212*d83cc019SAndroid Build Coastguard Worker static bool psr_supported_on_chipset(int debugfs_fd)
213*d83cc019SAndroid Build Coastguard Worker {
214*d83cc019SAndroid Build Coastguard Worker 	return psr_sink_support(debugfs_fd, PSR_MODE_1);
215*d83cc019SAndroid Build Coastguard Worker }
216*d83cc019SAndroid Build Coastguard Worker 
psr_wait_until_update(int debugfs_fd)217*d83cc019SAndroid Build Coastguard Worker static bool psr_wait_until_update(int debugfs_fd)
218*d83cc019SAndroid Build Coastguard Worker {
219*d83cc019SAndroid Build Coastguard Worker 	return psr_long_wait_update(debugfs_fd, PSR_MODE_1);
220*d83cc019SAndroid Build Coastguard Worker }
221*d83cc019SAndroid Build Coastguard Worker 
disable_features(int debugfs_fd)222*d83cc019SAndroid Build Coastguard Worker static void disable_features(int debugfs_fd)
223*d83cc019SAndroid Build Coastguard Worker {
224*d83cc019SAndroid Build Coastguard Worker 	igt_set_module_param_int("enable_fbc", 0);
225*d83cc019SAndroid Build Coastguard Worker 	psr_disable(debugfs_fd);
226*d83cc019SAndroid Build Coastguard Worker }
227*d83cc019SAndroid Build Coastguard Worker 
fbc_modparam_enable(int debugfs_fd)228*d83cc019SAndroid Build Coastguard Worker static inline void fbc_modparam_enable(int debugfs_fd)
229*d83cc019SAndroid Build Coastguard Worker {
230*d83cc019SAndroid Build Coastguard Worker 	igt_set_module_param_int("enable_fbc", 1);
231*d83cc019SAndroid Build Coastguard Worker }
232*d83cc019SAndroid Build Coastguard Worker 
psr_debugfs_enable(int debugfs_fd)233*d83cc019SAndroid Build Coastguard Worker static inline void psr_debugfs_enable(int debugfs_fd)
234*d83cc019SAndroid Build Coastguard Worker {
235*d83cc019SAndroid Build Coastguard Worker 	psr_enable(debugfs_fd, PSR_MODE_1);
236*d83cc019SAndroid Build Coastguard Worker }
237*d83cc019SAndroid Build Coastguard Worker 
238*d83cc019SAndroid Build Coastguard Worker struct feature {
239*d83cc019SAndroid Build Coastguard Worker 	bool (*supported_on_chipset)(int debugfs_fd);
240*d83cc019SAndroid Build Coastguard Worker 	bool (*wait_until_enabled)(int debugfs_fd);
241*d83cc019SAndroid Build Coastguard Worker 	bool (*wait_until_update)(int debugfs_fd);
242*d83cc019SAndroid Build Coastguard Worker 	bool (*connector_possible_fn)(drmModeConnectorPtr connector);
243*d83cc019SAndroid Build Coastguard Worker 	void (*enable)(int debugfs_fd);
244*d83cc019SAndroid Build Coastguard Worker } fbc = {
245*d83cc019SAndroid Build Coastguard Worker 	.supported_on_chipset = fbc_supported_on_chipset,
246*d83cc019SAndroid Build Coastguard Worker 	.wait_until_enabled = fbc_wait_until_enabled,
247*d83cc019SAndroid Build Coastguard Worker 	.wait_until_update = fbc_wait_until_update,
248*d83cc019SAndroid Build Coastguard Worker 	.connector_possible_fn = connector_can_fbc,
249*d83cc019SAndroid Build Coastguard Worker 	.enable = fbc_modparam_enable,
250*d83cc019SAndroid Build Coastguard Worker }, psr = {
251*d83cc019SAndroid Build Coastguard Worker 	.supported_on_chipset = psr_supported_on_chipset,
252*d83cc019SAndroid Build Coastguard Worker 	.wait_until_enabled = psr_wait_until_enabled,
253*d83cc019SAndroid Build Coastguard Worker 	.wait_until_update = psr_wait_until_update,
254*d83cc019SAndroid Build Coastguard Worker 	.connector_possible_fn = connector_can_psr,
255*d83cc019SAndroid Build Coastguard Worker 	.enable = psr_debugfs_enable,
256*d83cc019SAndroid Build Coastguard Worker };
257*d83cc019SAndroid Build Coastguard Worker 
subtest(struct drm_info * drm,struct feature * feature,bool suspend)258*d83cc019SAndroid Build Coastguard Worker static void subtest(struct drm_info *drm, struct feature *feature, bool suspend)
259*d83cc019SAndroid Build Coastguard Worker {
260*d83cc019SAndroid Build Coastguard Worker 	struct igt_fb fb;
261*d83cc019SAndroid Build Coastguard Worker 
262*d83cc019SAndroid Build Coastguard Worker 	setup_drm(drm);
263*d83cc019SAndroid Build Coastguard Worker 
264*d83cc019SAndroid Build Coastguard Worker 	igt_require(feature->supported_on_chipset(drm->debugfs_fd));
265*d83cc019SAndroid Build Coastguard Worker 
266*d83cc019SAndroid Build Coastguard Worker 	disable_features(drm->debugfs_fd);
267*d83cc019SAndroid Build Coastguard Worker 	feature->enable(drm->debugfs_fd);
268*d83cc019SAndroid Build Coastguard Worker 
269*d83cc019SAndroid Build Coastguard Worker 	kmstest_unset_all_crtcs(drm->fd, drm->res);
270*d83cc019SAndroid Build Coastguard Worker 	wait_user("Modes unset.");
271*d83cc019SAndroid Build Coastguard Worker 	igt_assert(!feature->wait_until_enabled(drm->debugfs_fd));
272*d83cc019SAndroid Build Coastguard Worker 
273*d83cc019SAndroid Build Coastguard Worker 	set_mode_for_one_screen(drm, &fb, feature->connector_possible_fn);
274*d83cc019SAndroid Build Coastguard Worker 	wait_user("Screen set.");
275*d83cc019SAndroid Build Coastguard Worker 	igt_assert(feature->wait_until_enabled(drm->debugfs_fd));
276*d83cc019SAndroid Build Coastguard Worker 
277*d83cc019SAndroid Build Coastguard Worker 	if (suspend) {
278*d83cc019SAndroid Build Coastguard Worker 		igt_system_suspend_autoresume(SUSPEND_STATE_MEM,
279*d83cc019SAndroid Build Coastguard Worker 					      SUSPEND_TEST_NONE);
280*d83cc019SAndroid Build Coastguard Worker 		sleep(5);
281*d83cc019SAndroid Build Coastguard Worker 		igt_assert(feature->wait_until_enabled(drm->debugfs_fd));
282*d83cc019SAndroid Build Coastguard Worker 	}
283*d83cc019SAndroid Build Coastguard Worker 
284*d83cc019SAndroid Build Coastguard Worker 	igt_remove_fb(drm->fd, &fb);
285*d83cc019SAndroid Build Coastguard Worker 	teardown_drm(drm);
286*d83cc019SAndroid Build Coastguard Worker 
287*d83cc019SAndroid Build Coastguard Worker 	/* Wait for fbcon to restore itself. */
288*d83cc019SAndroid Build Coastguard Worker 	sleep(3);
289*d83cc019SAndroid Build Coastguard Worker 
290*d83cc019SAndroid Build Coastguard Worker 	wait_user("Back to fbcon.");
291*d83cc019SAndroid Build Coastguard Worker 	igt_assert(feature->wait_until_update(drm->debugfs_fd));
292*d83cc019SAndroid Build Coastguard Worker 
293*d83cc019SAndroid Build Coastguard Worker 	if (suspend) {
294*d83cc019SAndroid Build Coastguard Worker 		igt_system_suspend_autoresume(SUSPEND_STATE_MEM,
295*d83cc019SAndroid Build Coastguard Worker 					      SUSPEND_TEST_NONE);
296*d83cc019SAndroid Build Coastguard Worker 		sleep(5);
297*d83cc019SAndroid Build Coastguard Worker 		igt_assert(feature->wait_until_update(drm->debugfs_fd));
298*d83cc019SAndroid Build Coastguard Worker 	}
299*d83cc019SAndroid Build Coastguard Worker }
300*d83cc019SAndroid Build Coastguard Worker 
setup_environment(struct drm_info * drm)301*d83cc019SAndroid Build Coastguard Worker static void setup_environment(struct drm_info *drm)
302*d83cc019SAndroid Build Coastguard Worker {
303*d83cc019SAndroid Build Coastguard Worker 	int drm_fd;
304*d83cc019SAndroid Build Coastguard Worker 
305*d83cc019SAndroid Build Coastguard Worker 	drm_fd = drm_open_driver_master(DRIVER_INTEL);
306*d83cc019SAndroid Build Coastguard Worker 	igt_require(drm_fd >= 0);
307*d83cc019SAndroid Build Coastguard Worker 	drm->debugfs_fd = igt_debugfs_dir(drm_fd);
308*d83cc019SAndroid Build Coastguard Worker 	igt_require(drm->debugfs_fd >= 0);
309*d83cc019SAndroid Build Coastguard Worker 	igt_assert(close(drm_fd) == 0);
310*d83cc019SAndroid Build Coastguard Worker 
311*d83cc019SAndroid Build Coastguard Worker 	/*
312*d83cc019SAndroid Build Coastguard Worker 	 * igt_main()->igt_subtest_init_parse_opts()->common_init() disables the
313*d83cc019SAndroid Build Coastguard Worker 	 * fbcon bind, so to test it is necessary enable it again
314*d83cc019SAndroid Build Coastguard Worker 	 */
315*d83cc019SAndroid Build Coastguard Worker 	bind_fbcon(true);
316*d83cc019SAndroid Build Coastguard Worker 	fbcon_blink_enable(true);
317*d83cc019SAndroid Build Coastguard Worker }
318*d83cc019SAndroid Build Coastguard Worker 
teardown_environment(struct drm_info * drm)319*d83cc019SAndroid Build Coastguard Worker static void teardown_environment(struct drm_info *drm)
320*d83cc019SAndroid Build Coastguard Worker {
321*d83cc019SAndroid Build Coastguard Worker 	if (drm->fd >= 0)
322*d83cc019SAndroid Build Coastguard Worker 		teardown_drm(drm);
323*d83cc019SAndroid Build Coastguard Worker 
324*d83cc019SAndroid Build Coastguard Worker 	close(drm->debugfs_fd);
325*d83cc019SAndroid Build Coastguard Worker }
326*d83cc019SAndroid Build Coastguard Worker 
327*d83cc019SAndroid Build Coastguard Worker igt_main
328*d83cc019SAndroid Build Coastguard Worker {
329*d83cc019SAndroid Build Coastguard Worker 	struct drm_info drm = { .fd = -1 };
330*d83cc019SAndroid Build Coastguard Worker 
331*d83cc019SAndroid Build Coastguard Worker 	igt_fixture
332*d83cc019SAndroid Build Coastguard Worker 		setup_environment(&drm);
333*d83cc019SAndroid Build Coastguard Worker 
334*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("fbc")
335*d83cc019SAndroid Build Coastguard Worker 		subtest(&drm, &fbc, false);
336*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("psr")
337*d83cc019SAndroid Build Coastguard Worker 		subtest(&drm, &psr, false);
338*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("fbc-suspend")
339*d83cc019SAndroid Build Coastguard Worker 		subtest(&drm, &fbc, true);
340*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("psr-suspend")
341*d83cc019SAndroid Build Coastguard Worker 		subtest(&drm, &psr, true);
342*d83cc019SAndroid Build Coastguard Worker 
343*d83cc019SAndroid Build Coastguard Worker 	igt_fixture
344*d83cc019SAndroid Build Coastguard Worker 		teardown_environment(&drm);
345*d83cc019SAndroid Build Coastguard Worker }
346