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