1*d83cc019SAndroid Build Coastguard Worker /*
2*d83cc019SAndroid Build Coastguard Worker * Copyright © 2014 Intel Corporation
3*d83cc019SAndroid Build Coastguard Worker *
4*d83cc019SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a
5*d83cc019SAndroid Build Coastguard Worker * copy of this software and associated documentation files (the "Software"),
6*d83cc019SAndroid Build Coastguard Worker * to deal in the Software without restriction, including without limitation
7*d83cc019SAndroid Build Coastguard Worker * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*d83cc019SAndroid Build Coastguard Worker * and/or sell copies of the Software, and to permit persons to whom the
9*d83cc019SAndroid Build Coastguard Worker * Software is furnished to do so, subject to the following conditions:
10*d83cc019SAndroid Build Coastguard Worker *
11*d83cc019SAndroid Build Coastguard Worker * The above copyright notice and this permission notice (including the next
12*d83cc019SAndroid Build Coastguard Worker * paragraph) shall be included in all copies or substantial portions of the
13*d83cc019SAndroid Build Coastguard Worker * Software.
14*d83cc019SAndroid Build Coastguard Worker *
15*d83cc019SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*d83cc019SAndroid Build Coastguard Worker * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*d83cc019SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18*d83cc019SAndroid Build Coastguard Worker * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19*d83cc019SAndroid Build Coastguard Worker * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20*d83cc019SAndroid Build Coastguard Worker * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21*d83cc019SAndroid Build Coastguard Worker * IN THE SOFTWARE.
22*d83cc019SAndroid Build Coastguard Worker */
23*d83cc019SAndroid Build Coastguard Worker
24*d83cc019SAndroid Build Coastguard Worker #include "igt.h"
25*d83cc019SAndroid Build Coastguard Worker #include <errno.h>
26*d83cc019SAndroid Build Coastguard Worker #include <stdbool.h>
27*d83cc019SAndroid Build Coastguard Worker #include <stdio.h>
28*d83cc019SAndroid Build Coastguard Worker #include <string.h>
29*d83cc019SAndroid Build Coastguard Worker #include <fcntl.h>
30*d83cc019SAndroid Build Coastguard Worker
31*d83cc019SAndroid Build Coastguard Worker
32*d83cc019SAndroid Build Coastguard Worker typedef struct {
33*d83cc019SAndroid Build Coastguard Worker int drm_fd;
34*d83cc019SAndroid Build Coastguard Worker igt_display_t display;
35*d83cc019SAndroid Build Coastguard Worker int gen;
36*d83cc019SAndroid Build Coastguard Worker } data_t;
37*d83cc019SAndroid Build Coastguard Worker
38*d83cc019SAndroid Build Coastguard Worker typedef struct {
39*d83cc019SAndroid Build Coastguard Worker data_t *data;
40*d83cc019SAndroid Build Coastguard Worker igt_pipe_crc_t *pipe_crc;
41*d83cc019SAndroid Build Coastguard Worker igt_crc_t crc_1, crc_2, crc_3, crc_4, crc_5, crc_6, crc_7, crc_8,
42*d83cc019SAndroid Build Coastguard Worker crc_9, crc_10;
43*d83cc019SAndroid Build Coastguard Worker struct igt_fb red_fb, blue_fb, black_fb, yellow_fb;
44*d83cc019SAndroid Build Coastguard Worker drmModeModeInfo *mode;
45*d83cc019SAndroid Build Coastguard Worker } functional_test_t;
46*d83cc019SAndroid Build Coastguard Worker
47*d83cc019SAndroid Build Coastguard Worker typedef struct {
48*d83cc019SAndroid Build Coastguard Worker data_t *data;
49*d83cc019SAndroid Build Coastguard Worker drmModeResPtr moderes;
50*d83cc019SAndroid Build Coastguard Worker struct igt_fb blue_fb, oversized_fb, undersized_fb;
51*d83cc019SAndroid Build Coastguard Worker } sanity_test_t;
52*d83cc019SAndroid Build Coastguard Worker
53*d83cc019SAndroid Build Coastguard Worker typedef struct {
54*d83cc019SAndroid Build Coastguard Worker data_t *data;
55*d83cc019SAndroid Build Coastguard Worker struct igt_fb red_fb, blue_fb;
56*d83cc019SAndroid Build Coastguard Worker } pageflip_test_t;
57*d83cc019SAndroid Build Coastguard Worker
58*d83cc019SAndroid Build Coastguard Worker typedef struct {
59*d83cc019SAndroid Build Coastguard Worker data_t *data;
60*d83cc019SAndroid Build Coastguard Worker int x, y;
61*d83cc019SAndroid Build Coastguard Worker int w, h;
62*d83cc019SAndroid Build Coastguard Worker struct igt_fb biggreen_fb, smallred_fb, smallblue_fb;
63*d83cc019SAndroid Build Coastguard Worker } gen9_test_t;
64*d83cc019SAndroid Build Coastguard Worker
65*d83cc019SAndroid Build Coastguard Worker static void
functional_test_init(functional_test_t * test,igt_output_t * output,enum pipe pipe)66*d83cc019SAndroid Build Coastguard Worker functional_test_init(functional_test_t *test, igt_output_t *output, enum pipe pipe)
67*d83cc019SAndroid Build Coastguard Worker {
68*d83cc019SAndroid Build Coastguard Worker data_t *data = test->data;
69*d83cc019SAndroid Build Coastguard Worker drmModeModeInfo *mode;
70*d83cc019SAndroid Build Coastguard Worker
71*d83cc019SAndroid Build Coastguard Worker test->pipe_crc = igt_pipe_crc_new(data->drm_fd, pipe, INTEL_PIPE_CRC_SOURCE_AUTO);
72*d83cc019SAndroid Build Coastguard Worker
73*d83cc019SAndroid Build Coastguard Worker igt_output_set_pipe(output, pipe);
74*d83cc019SAndroid Build Coastguard Worker
75*d83cc019SAndroid Build Coastguard Worker mode = igt_output_get_mode(output);
76*d83cc019SAndroid Build Coastguard Worker igt_create_color_fb(data->drm_fd, mode->hdisplay, mode->vdisplay,
77*d83cc019SAndroid Build Coastguard Worker DRM_FORMAT_XRGB8888,
78*d83cc019SAndroid Build Coastguard Worker LOCAL_DRM_FORMAT_MOD_NONE,
79*d83cc019SAndroid Build Coastguard Worker 0.0, 0.0, 0.0,
80*d83cc019SAndroid Build Coastguard Worker &test->black_fb);
81*d83cc019SAndroid Build Coastguard Worker igt_create_color_fb(data->drm_fd, mode->hdisplay, mode->vdisplay,
82*d83cc019SAndroid Build Coastguard Worker DRM_FORMAT_XRGB8888,
83*d83cc019SAndroid Build Coastguard Worker LOCAL_DRM_FORMAT_MOD_NONE,
84*d83cc019SAndroid Build Coastguard Worker 0.0, 0.0, 1.0,
85*d83cc019SAndroid Build Coastguard Worker &test->blue_fb);
86*d83cc019SAndroid Build Coastguard Worker igt_create_color_fb(data->drm_fd, mode->hdisplay, mode->vdisplay,
87*d83cc019SAndroid Build Coastguard Worker DRM_FORMAT_XRGB8888,
88*d83cc019SAndroid Build Coastguard Worker LOCAL_DRM_FORMAT_MOD_NONE,
89*d83cc019SAndroid Build Coastguard Worker 1.0, 1.0, 0.0,
90*d83cc019SAndroid Build Coastguard Worker &test->yellow_fb);
91*d83cc019SAndroid Build Coastguard Worker igt_create_color_fb(data->drm_fd, 100, 100,
92*d83cc019SAndroid Build Coastguard Worker DRM_FORMAT_XRGB8888,
93*d83cc019SAndroid Build Coastguard Worker LOCAL_DRM_FORMAT_MOD_NONE,
94*d83cc019SAndroid Build Coastguard Worker 1.0, 0.0, 0.0,
95*d83cc019SAndroid Build Coastguard Worker &test->red_fb);
96*d83cc019SAndroid Build Coastguard Worker
97*d83cc019SAndroid Build Coastguard Worker test->mode = mode;
98*d83cc019SAndroid Build Coastguard Worker }
99*d83cc019SAndroid Build Coastguard Worker
100*d83cc019SAndroid Build Coastguard Worker static void
functional_test_fini(functional_test_t * test,igt_output_t * output)101*d83cc019SAndroid Build Coastguard Worker functional_test_fini(functional_test_t *test, igt_output_t *output)
102*d83cc019SAndroid Build Coastguard Worker {
103*d83cc019SAndroid Build Coastguard Worker igt_pipe_crc_free(test->pipe_crc);
104*d83cc019SAndroid Build Coastguard Worker
105*d83cc019SAndroid Build Coastguard Worker igt_remove_fb(test->data->drm_fd, &test->black_fb);
106*d83cc019SAndroid Build Coastguard Worker igt_remove_fb(test->data->drm_fd, &test->blue_fb);
107*d83cc019SAndroid Build Coastguard Worker igt_remove_fb(test->data->drm_fd, &test->red_fb);
108*d83cc019SAndroid Build Coastguard Worker igt_remove_fb(test->data->drm_fd, &test->yellow_fb);
109*d83cc019SAndroid Build Coastguard Worker
110*d83cc019SAndroid Build Coastguard Worker igt_output_set_pipe(output, PIPE_ANY);
111*d83cc019SAndroid Build Coastguard Worker igt_display_commit2(&test->data->display, COMMIT_LEGACY);
112*d83cc019SAndroid Build Coastguard Worker }
113*d83cc019SAndroid Build Coastguard Worker
114*d83cc019SAndroid Build Coastguard Worker /*
115*d83cc019SAndroid Build Coastguard Worker * Universal plane functional testing.
116*d83cc019SAndroid Build Coastguard Worker * - Black primary plane via traditional interfaces, red sprite, grab CRC:1.
117*d83cc019SAndroid Build Coastguard Worker * - Blue primary plane via traditional interfaces, red sprite, grab CRC:2.
118*d83cc019SAndroid Build Coastguard Worker * - Yellow primary via traditional interfaces
119*d83cc019SAndroid Build Coastguard Worker * - Blue primary plane, red sprite via universal planes, grab CRC:3 and compare
120*d83cc019SAndroid Build Coastguard Worker * with CRC:2 (should be the same)
121*d83cc019SAndroid Build Coastguard Worker * - Disable primary plane, grab CRC:4 (should be same as CRC:1)
122*d83cc019SAndroid Build Coastguard Worker * - Reenable primary, grab CRC:5 (should be same as CRC:2 and CRC:3)
123*d83cc019SAndroid Build Coastguard Worker * - Yellow primary, no sprite
124*d83cc019SAndroid Build Coastguard Worker * - Disable CRTC
125*d83cc019SAndroid Build Coastguard Worker * - Program red sprite (while CRTC off)
126*d83cc019SAndroid Build Coastguard Worker * - Program blue primary (while CRTC off)
127*d83cc019SAndroid Build Coastguard Worker * - Enable CRTC, grab CRC:6 (should be same as CRC:2)
128*d83cc019SAndroid Build Coastguard Worker */
129*d83cc019SAndroid Build Coastguard Worker static void
functional_test_pipe(data_t * data,enum pipe pipe,igt_output_t * output)130*d83cc019SAndroid Build Coastguard Worker functional_test_pipe(data_t *data, enum pipe pipe, igt_output_t *output)
131*d83cc019SAndroid Build Coastguard Worker {
132*d83cc019SAndroid Build Coastguard Worker functional_test_t test = { .data = data };
133*d83cc019SAndroid Build Coastguard Worker igt_display_t *display = &data->display;
134*d83cc019SAndroid Build Coastguard Worker igt_plane_t *primary, *sprite;
135*d83cc019SAndroid Build Coastguard Worker int num_primary = 0, num_cursor = 0;
136*d83cc019SAndroid Build Coastguard Worker int i;
137*d83cc019SAndroid Build Coastguard Worker
138*d83cc019SAndroid Build Coastguard Worker igt_skip_on(pipe >= display->n_pipes);
139*d83cc019SAndroid Build Coastguard Worker
140*d83cc019SAndroid Build Coastguard Worker igt_info("Testing connector %s using pipe %s\n", igt_output_name(output),
141*d83cc019SAndroid Build Coastguard Worker kmstest_pipe_name(pipe));
142*d83cc019SAndroid Build Coastguard Worker
143*d83cc019SAndroid Build Coastguard Worker functional_test_init(&test, output, pipe);
144*d83cc019SAndroid Build Coastguard Worker
145*d83cc019SAndroid Build Coastguard Worker /*
146*d83cc019SAndroid Build Coastguard Worker * Make sure we have no more than one primary or cursor plane per crtc.
147*d83cc019SAndroid Build Coastguard Worker * If the kernel accidentally calls drm_plane_init() rather than
148*d83cc019SAndroid Build Coastguard Worker * drm_universal_plane_init(), the type enum can get interpreted as a
149*d83cc019SAndroid Build Coastguard Worker * boolean and show up in userspace as the wrong type.
150*d83cc019SAndroid Build Coastguard Worker */
151*d83cc019SAndroid Build Coastguard Worker for (i = 0; i < display->pipes[pipe].n_planes; i++)
152*d83cc019SAndroid Build Coastguard Worker if (display->pipes[pipe].planes[i].type == DRM_PLANE_TYPE_PRIMARY)
153*d83cc019SAndroid Build Coastguard Worker num_primary++;
154*d83cc019SAndroid Build Coastguard Worker else if (display->pipes[pipe].planes[i].type == DRM_PLANE_TYPE_CURSOR)
155*d83cc019SAndroid Build Coastguard Worker num_cursor++;
156*d83cc019SAndroid Build Coastguard Worker
157*d83cc019SAndroid Build Coastguard Worker igt_assert_eq(num_primary, 1);
158*d83cc019SAndroid Build Coastguard Worker igt_assert_lte(num_cursor, 1);
159*d83cc019SAndroid Build Coastguard Worker
160*d83cc019SAndroid Build Coastguard Worker primary = igt_output_get_plane_type(output, DRM_PLANE_TYPE_PRIMARY);
161*d83cc019SAndroid Build Coastguard Worker sprite = igt_output_get_plane_type(output, DRM_PLANE_TYPE_OVERLAY);
162*d83cc019SAndroid Build Coastguard Worker if (!sprite) {
163*d83cc019SAndroid Build Coastguard Worker functional_test_fini(&test, output);
164*d83cc019SAndroid Build Coastguard Worker igt_skip("No sprite plane available\n");
165*d83cc019SAndroid Build Coastguard Worker }
166*d83cc019SAndroid Build Coastguard Worker
167*d83cc019SAndroid Build Coastguard Worker igt_plane_set_position(sprite, 100, 100);
168*d83cc019SAndroid Build Coastguard Worker
169*d83cc019SAndroid Build Coastguard Worker /* Step 1: Legacy API's, black primary, red sprite (CRC 1) */
170*d83cc019SAndroid Build Coastguard Worker igt_plane_set_fb(primary, &test.black_fb);
171*d83cc019SAndroid Build Coastguard Worker igt_plane_set_fb(sprite, &test.red_fb);
172*d83cc019SAndroid Build Coastguard Worker igt_display_commit2(display, COMMIT_LEGACY);
173*d83cc019SAndroid Build Coastguard Worker igt_pipe_crc_collect_crc(test.pipe_crc, &test.crc_1);
174*d83cc019SAndroid Build Coastguard Worker
175*d83cc019SAndroid Build Coastguard Worker /* Step 2: Legacy API', blue primary, red sprite (CRC 2) */
176*d83cc019SAndroid Build Coastguard Worker igt_plane_set_fb(primary, &test.blue_fb);
177*d83cc019SAndroid Build Coastguard Worker igt_plane_set_fb(sprite, &test.red_fb);
178*d83cc019SAndroid Build Coastguard Worker igt_display_commit2(display, COMMIT_LEGACY);
179*d83cc019SAndroid Build Coastguard Worker igt_pipe_crc_collect_crc(test.pipe_crc, &test.crc_2);
180*d83cc019SAndroid Build Coastguard Worker
181*d83cc019SAndroid Build Coastguard Worker /* Step 3: Legacy API's, yellow primary (CRC 3) */
182*d83cc019SAndroid Build Coastguard Worker igt_plane_set_fb(primary, &test.yellow_fb);
183*d83cc019SAndroid Build Coastguard Worker igt_display_commit2(display, COMMIT_LEGACY);
184*d83cc019SAndroid Build Coastguard Worker igt_pipe_crc_collect_crc(test.pipe_crc, &test.crc_3);
185*d83cc019SAndroid Build Coastguard Worker
186*d83cc019SAndroid Build Coastguard Worker /* Step 4: Universal API's, blue primary, red sprite (CRC 4) */
187*d83cc019SAndroid Build Coastguard Worker igt_plane_set_fb(primary, &test.blue_fb);
188*d83cc019SAndroid Build Coastguard Worker igt_plane_set_fb(sprite, &test.red_fb);
189*d83cc019SAndroid Build Coastguard Worker igt_display_commit2(display, COMMIT_UNIVERSAL);
190*d83cc019SAndroid Build Coastguard Worker igt_pipe_crc_collect_crc(test.pipe_crc, &test.crc_4);
191*d83cc019SAndroid Build Coastguard Worker
192*d83cc019SAndroid Build Coastguard Worker /* Step 5: Universal API's, disable primary plane (CRC 5) */
193*d83cc019SAndroid Build Coastguard Worker igt_plane_set_fb(primary, NULL);
194*d83cc019SAndroid Build Coastguard Worker igt_display_commit2(display, COMMIT_UNIVERSAL);
195*d83cc019SAndroid Build Coastguard Worker igt_pipe_crc_collect_crc(test.pipe_crc, &test.crc_5);
196*d83cc019SAndroid Build Coastguard Worker
197*d83cc019SAndroid Build Coastguard Worker /* Step 6: Universal API's, re-enable primary with blue (CRC 6) */
198*d83cc019SAndroid Build Coastguard Worker igt_plane_set_fb(primary, &test.blue_fb);
199*d83cc019SAndroid Build Coastguard Worker igt_display_commit2(display, COMMIT_UNIVERSAL);
200*d83cc019SAndroid Build Coastguard Worker igt_pipe_crc_collect_crc(test.pipe_crc, &test.crc_6);
201*d83cc019SAndroid Build Coastguard Worker
202*d83cc019SAndroid Build Coastguard Worker /* Step 7: Legacy API's, yellow primary, no sprite */
203*d83cc019SAndroid Build Coastguard Worker igt_plane_set_fb(primary, &test.yellow_fb);
204*d83cc019SAndroid Build Coastguard Worker igt_plane_set_fb(sprite, NULL);
205*d83cc019SAndroid Build Coastguard Worker igt_display_commit2(display, COMMIT_LEGACY);
206*d83cc019SAndroid Build Coastguard Worker
207*d83cc019SAndroid Build Coastguard Worker /* Step 8: Disable CRTC */
208*d83cc019SAndroid Build Coastguard Worker igt_plane_set_fb(primary, NULL);
209*d83cc019SAndroid Build Coastguard Worker igt_display_commit2(display, COMMIT_LEGACY);
210*d83cc019SAndroid Build Coastguard Worker
211*d83cc019SAndroid Build Coastguard Worker /* Step 9: Universal API's with crtc off:
212*d83cc019SAndroid Build Coastguard Worker * - red sprite
213*d83cc019SAndroid Build Coastguard Worker * - multiple primary fb's, ending in blue
214*d83cc019SAndroid Build Coastguard Worker */
215*d83cc019SAndroid Build Coastguard Worker igt_plane_set_fb(sprite, &test.red_fb);
216*d83cc019SAndroid Build Coastguard Worker igt_display_commit2(display, COMMIT_UNIVERSAL);
217*d83cc019SAndroid Build Coastguard Worker igt_plane_set_fb(primary, &test.yellow_fb);
218*d83cc019SAndroid Build Coastguard Worker igt_display_commit2(display, COMMIT_UNIVERSAL);
219*d83cc019SAndroid Build Coastguard Worker igt_plane_set_fb(primary, &test.black_fb);
220*d83cc019SAndroid Build Coastguard Worker igt_display_commit2(display, COMMIT_UNIVERSAL);
221*d83cc019SAndroid Build Coastguard Worker igt_plane_set_fb(primary, &test.blue_fb);
222*d83cc019SAndroid Build Coastguard Worker igt_display_commit2(display, COMMIT_UNIVERSAL);
223*d83cc019SAndroid Build Coastguard Worker
224*d83cc019SAndroid Build Coastguard Worker /* Step 10: Enable crtc (fb = -1), take CRC (CRC 7) */
225*d83cc019SAndroid Build Coastguard Worker igt_assert(drmModeSetCrtc(data->drm_fd, output->config.crtc->crtc_id, -1,
226*d83cc019SAndroid Build Coastguard Worker 0, 0, &output->config.connector->connector_id,
227*d83cc019SAndroid Build Coastguard Worker 1, test.mode) == 0);
228*d83cc019SAndroid Build Coastguard Worker igt_pipe_crc_collect_crc(test.pipe_crc, &test.crc_7);
229*d83cc019SAndroid Build Coastguard Worker
230*d83cc019SAndroid Build Coastguard Worker /* Step 11: Disable primary plane */
231*d83cc019SAndroid Build Coastguard Worker igt_plane_set_fb(primary, NULL);
232*d83cc019SAndroid Build Coastguard Worker igt_display_commit2(display, COMMIT_UNIVERSAL);
233*d83cc019SAndroid Build Coastguard Worker
234*d83cc019SAndroid Build Coastguard Worker /* Step 12: Legacy modeset to yellow FB (CRC 8) */
235*d83cc019SAndroid Build Coastguard Worker igt_plane_set_fb(primary, &test.yellow_fb);
236*d83cc019SAndroid Build Coastguard Worker igt_display_commit2(display, COMMIT_LEGACY);
237*d83cc019SAndroid Build Coastguard Worker igt_pipe_crc_collect_crc(test.pipe_crc, &test.crc_8);
238*d83cc019SAndroid Build Coastguard Worker
239*d83cc019SAndroid Build Coastguard Worker /* Step 13: Legacy API', blue primary, red sprite */
240*d83cc019SAndroid Build Coastguard Worker igt_plane_set_fb(primary, &test.blue_fb);
241*d83cc019SAndroid Build Coastguard Worker igt_plane_set_fb(sprite, &test.red_fb);
242*d83cc019SAndroid Build Coastguard Worker igt_display_commit2(display, COMMIT_LEGACY);
243*d83cc019SAndroid Build Coastguard Worker
244*d83cc019SAndroid Build Coastguard Worker /* Step 14: Universal API, set primary completely offscreen (CRC 9) */
245*d83cc019SAndroid Build Coastguard Worker igt_assert(drmModeSetPlane(data->drm_fd, primary->drm_plane->plane_id,
246*d83cc019SAndroid Build Coastguard Worker output->config.crtc->crtc_id,
247*d83cc019SAndroid Build Coastguard Worker test.blue_fb.fb_id, 0,
248*d83cc019SAndroid Build Coastguard Worker 9000, 9000,
249*d83cc019SAndroid Build Coastguard Worker test.mode->hdisplay,
250*d83cc019SAndroid Build Coastguard Worker test.mode->vdisplay,
251*d83cc019SAndroid Build Coastguard Worker IGT_FIXED(0,0), IGT_FIXED(0,0),
252*d83cc019SAndroid Build Coastguard Worker IGT_FIXED(test.mode->hdisplay,0),
253*d83cc019SAndroid Build Coastguard Worker IGT_FIXED(test.mode->vdisplay,0)) == 0);
254*d83cc019SAndroid Build Coastguard Worker igt_pipe_crc_collect_crc(test.pipe_crc, &test.crc_9);
255*d83cc019SAndroid Build Coastguard Worker
256*d83cc019SAndroid Build Coastguard Worker /*
257*d83cc019SAndroid Build Coastguard Worker * Step 15: Explicitly disable primary after it's already been
258*d83cc019SAndroid Build Coastguard Worker * implicitly disabled (CRC 10).
259*d83cc019SAndroid Build Coastguard Worker */
260*d83cc019SAndroid Build Coastguard Worker igt_plane_set_fb(primary, NULL);
261*d83cc019SAndroid Build Coastguard Worker igt_display_commit2(display, COMMIT_UNIVERSAL);
262*d83cc019SAndroid Build Coastguard Worker igt_pipe_crc_collect_crc(test.pipe_crc, &test.crc_10);
263*d83cc019SAndroid Build Coastguard Worker
264*d83cc019SAndroid Build Coastguard Worker /* Step 16: Legacy API's, blue primary, red sprite */
265*d83cc019SAndroid Build Coastguard Worker igt_plane_set_fb(primary, &test.blue_fb);
266*d83cc019SAndroid Build Coastguard Worker igt_plane_set_fb(sprite, &test.red_fb);
267*d83cc019SAndroid Build Coastguard Worker igt_display_commit2(display, COMMIT_LEGACY);
268*d83cc019SAndroid Build Coastguard Worker
269*d83cc019SAndroid Build Coastguard Worker /* Blue bg + red sprite should be same under both types of API's */
270*d83cc019SAndroid Build Coastguard Worker igt_assert_crc_equal(&test.crc_2, &test.crc_4);
271*d83cc019SAndroid Build Coastguard Worker
272*d83cc019SAndroid Build Coastguard Worker /* Disabling primary plane should be same as black primary */
273*d83cc019SAndroid Build Coastguard Worker igt_assert_crc_equal(&test.crc_1, &test.crc_5);
274*d83cc019SAndroid Build Coastguard Worker
275*d83cc019SAndroid Build Coastguard Worker /* Re-enabling primary should return to blue properly */
276*d83cc019SAndroid Build Coastguard Worker igt_assert_crc_equal(&test.crc_2, &test.crc_6);
277*d83cc019SAndroid Build Coastguard Worker
278*d83cc019SAndroid Build Coastguard Worker /*
279*d83cc019SAndroid Build Coastguard Worker * We should be able to setup plane FB's while CRTC is disabled and
280*d83cc019SAndroid Build Coastguard Worker * then have them pop up correctly when the CRTC is re-enabled.
281*d83cc019SAndroid Build Coastguard Worker */
282*d83cc019SAndroid Build Coastguard Worker igt_assert_crc_equal(&test.crc_2, &test.crc_7);
283*d83cc019SAndroid Build Coastguard Worker
284*d83cc019SAndroid Build Coastguard Worker /*
285*d83cc019SAndroid Build Coastguard Worker * We should be able to modeset with the primary plane off
286*d83cc019SAndroid Build Coastguard Worker * successfully
287*d83cc019SAndroid Build Coastguard Worker */
288*d83cc019SAndroid Build Coastguard Worker igt_assert_crc_equal(&test.crc_3, &test.crc_8);
289*d83cc019SAndroid Build Coastguard Worker
290*d83cc019SAndroid Build Coastguard Worker /*
291*d83cc019SAndroid Build Coastguard Worker * We should be able to move the primary plane completely offscreen
292*d83cc019SAndroid Build Coastguard Worker * and have it disable successfully.
293*d83cc019SAndroid Build Coastguard Worker */
294*d83cc019SAndroid Build Coastguard Worker igt_assert_crc_equal(&test.crc_5, &test.crc_9);
295*d83cc019SAndroid Build Coastguard Worker
296*d83cc019SAndroid Build Coastguard Worker /*
297*d83cc019SAndroid Build Coastguard Worker * We should be able to explicitly disable an already
298*d83cc019SAndroid Build Coastguard Worker * implicitly-disabled primary plane
299*d83cc019SAndroid Build Coastguard Worker */
300*d83cc019SAndroid Build Coastguard Worker igt_assert_crc_equal(&test.crc_5, &test.crc_10);
301*d83cc019SAndroid Build Coastguard Worker
302*d83cc019SAndroid Build Coastguard Worker igt_plane_set_fb(primary, NULL);
303*d83cc019SAndroid Build Coastguard Worker igt_plane_set_fb(sprite, NULL);
304*d83cc019SAndroid Build Coastguard Worker
305*d83cc019SAndroid Build Coastguard Worker functional_test_fini(&test, output);
306*d83cc019SAndroid Build Coastguard Worker }
307*d83cc019SAndroid Build Coastguard Worker
308*d83cc019SAndroid Build Coastguard Worker static void
sanity_test_init(sanity_test_t * test,igt_output_t * output,enum pipe pipe)309*d83cc019SAndroid Build Coastguard Worker sanity_test_init(sanity_test_t *test, igt_output_t *output, enum pipe pipe)
310*d83cc019SAndroid Build Coastguard Worker {
311*d83cc019SAndroid Build Coastguard Worker data_t *data = test->data;
312*d83cc019SAndroid Build Coastguard Worker drmModeModeInfo *mode;
313*d83cc019SAndroid Build Coastguard Worker
314*d83cc019SAndroid Build Coastguard Worker igt_output_set_pipe(output, pipe);
315*d83cc019SAndroid Build Coastguard Worker
316*d83cc019SAndroid Build Coastguard Worker mode = igt_output_get_mode(output);
317*d83cc019SAndroid Build Coastguard Worker igt_create_color_fb(data->drm_fd, mode->hdisplay, mode->vdisplay,
318*d83cc019SAndroid Build Coastguard Worker DRM_FORMAT_XRGB8888,
319*d83cc019SAndroid Build Coastguard Worker LOCAL_DRM_FORMAT_MOD_NONE,
320*d83cc019SAndroid Build Coastguard Worker 0.0, 0.0, 1.0,
321*d83cc019SAndroid Build Coastguard Worker &test->blue_fb);
322*d83cc019SAndroid Build Coastguard Worker igt_create_color_fb(data->drm_fd,
323*d83cc019SAndroid Build Coastguard Worker mode->hdisplay + 100, mode->vdisplay + 100,
324*d83cc019SAndroid Build Coastguard Worker DRM_FORMAT_XRGB8888,
325*d83cc019SAndroid Build Coastguard Worker LOCAL_DRM_FORMAT_MOD_NONE,
326*d83cc019SAndroid Build Coastguard Worker 0.0, 0.0, 1.0,
327*d83cc019SAndroid Build Coastguard Worker &test->oversized_fb);
328*d83cc019SAndroid Build Coastguard Worker igt_create_color_fb(data->drm_fd,
329*d83cc019SAndroid Build Coastguard Worker mode->hdisplay - 100, mode->vdisplay - 100,
330*d83cc019SAndroid Build Coastguard Worker DRM_FORMAT_XRGB8888,
331*d83cc019SAndroid Build Coastguard Worker LOCAL_DRM_FORMAT_MOD_NONE,
332*d83cc019SAndroid Build Coastguard Worker 0.0, 0.0, 1.0,
333*d83cc019SAndroid Build Coastguard Worker &test->undersized_fb);
334*d83cc019SAndroid Build Coastguard Worker
335*d83cc019SAndroid Build Coastguard Worker test->moderes = drmModeGetResources(data->drm_fd);
336*d83cc019SAndroid Build Coastguard Worker igt_assert(test->moderes);
337*d83cc019SAndroid Build Coastguard Worker }
338*d83cc019SAndroid Build Coastguard Worker
339*d83cc019SAndroid Build Coastguard Worker static void
sanity_test_fini(sanity_test_t * test,igt_output_t * output)340*d83cc019SAndroid Build Coastguard Worker sanity_test_fini(sanity_test_t *test, igt_output_t *output)
341*d83cc019SAndroid Build Coastguard Worker {
342*d83cc019SAndroid Build Coastguard Worker drmModeFreeResources(test->moderes);
343*d83cc019SAndroid Build Coastguard Worker
344*d83cc019SAndroid Build Coastguard Worker igt_remove_fb(test->data->drm_fd, &test->oversized_fb);
345*d83cc019SAndroid Build Coastguard Worker igt_remove_fb(test->data->drm_fd, &test->undersized_fb);
346*d83cc019SAndroid Build Coastguard Worker igt_remove_fb(test->data->drm_fd, &test->blue_fb);
347*d83cc019SAndroid Build Coastguard Worker
348*d83cc019SAndroid Build Coastguard Worker igt_output_set_pipe(output, PIPE_ANY);
349*d83cc019SAndroid Build Coastguard Worker igt_display_commit2(&test->data->display, COMMIT_LEGACY);
350*d83cc019SAndroid Build Coastguard Worker }
351*d83cc019SAndroid Build Coastguard Worker
352*d83cc019SAndroid Build Coastguard Worker /*
353*d83cc019SAndroid Build Coastguard Worker * Universal plane sanity testing.
354*d83cc019SAndroid Build Coastguard Worker * - Primary doesn't cover CRTC
355*d83cc019SAndroid Build Coastguard Worker * - Primary plane tries to scale down
356*d83cc019SAndroid Build Coastguard Worker * - Primary plane tries to scale up
357*d83cc019SAndroid Build Coastguard Worker */
358*d83cc019SAndroid Build Coastguard Worker static void
sanity_test_pipe(data_t * data,enum pipe pipe,igt_output_t * output)359*d83cc019SAndroid Build Coastguard Worker sanity_test_pipe(data_t *data, enum pipe pipe, igt_output_t *output)
360*d83cc019SAndroid Build Coastguard Worker {
361*d83cc019SAndroid Build Coastguard Worker sanity_test_t test = { .data = data };
362*d83cc019SAndroid Build Coastguard Worker igt_plane_t *primary;
363*d83cc019SAndroid Build Coastguard Worker drmModeModeInfo *mode;
364*d83cc019SAndroid Build Coastguard Worker int i;
365*d83cc019SAndroid Build Coastguard Worker int expect;
366*d83cc019SAndroid Build Coastguard Worker
367*d83cc019SAndroid Build Coastguard Worker igt_skip_on(pipe >= data->display.n_pipes);
368*d83cc019SAndroid Build Coastguard Worker
369*d83cc019SAndroid Build Coastguard Worker igt_output_set_pipe(output, pipe);
370*d83cc019SAndroid Build Coastguard Worker mode = igt_output_get_mode(output);
371*d83cc019SAndroid Build Coastguard Worker
372*d83cc019SAndroid Build Coastguard Worker sanity_test_init(&test, output, pipe);
373*d83cc019SAndroid Build Coastguard Worker
374*d83cc019SAndroid Build Coastguard Worker primary = igt_output_get_plane_type(output, DRM_PLANE_TYPE_PRIMARY);
375*d83cc019SAndroid Build Coastguard Worker
376*d83cc019SAndroid Build Coastguard Worker /* Use legacy API to set a mode with a blue FB */
377*d83cc019SAndroid Build Coastguard Worker igt_plane_set_fb(primary, &test.blue_fb);
378*d83cc019SAndroid Build Coastguard Worker igt_display_commit2(&data->display, COMMIT_LEGACY);
379*d83cc019SAndroid Build Coastguard Worker
380*d83cc019SAndroid Build Coastguard Worker /*
381*d83cc019SAndroid Build Coastguard Worker * Try to use universal plane API to set primary plane that
382*d83cc019SAndroid Build Coastguard Worker * doesn't cover CRTC (should fail on pre-gen9 and succeed on
383*d83cc019SAndroid Build Coastguard Worker * gen9+).
384*d83cc019SAndroid Build Coastguard Worker */
385*d83cc019SAndroid Build Coastguard Worker igt_plane_set_fb(primary, &test.undersized_fb);
386*d83cc019SAndroid Build Coastguard Worker expect = (data->gen < 9) ? -EINVAL : 0;
387*d83cc019SAndroid Build Coastguard Worker igt_assert(igt_display_try_commit2(&data->display, COMMIT_UNIVERSAL) == expect);
388*d83cc019SAndroid Build Coastguard Worker
389*d83cc019SAndroid Build Coastguard Worker /* Same as above, but different plane positioning. */
390*d83cc019SAndroid Build Coastguard Worker igt_plane_set_position(primary, 100, 100);
391*d83cc019SAndroid Build Coastguard Worker igt_assert(igt_display_try_commit2(&data->display, COMMIT_UNIVERSAL) == expect);
392*d83cc019SAndroid Build Coastguard Worker
393*d83cc019SAndroid Build Coastguard Worker igt_plane_set_position(primary, 0, 0);
394*d83cc019SAndroid Build Coastguard Worker
395*d83cc019SAndroid Build Coastguard Worker /* Try to use universal plane API to scale down (should fail on pre-gen9) */
396*d83cc019SAndroid Build Coastguard Worker expect = (data->gen < 9) ? -ERANGE : 0;
397*d83cc019SAndroid Build Coastguard Worker igt_assert(drmModeSetPlane(data->drm_fd, primary->drm_plane->plane_id,
398*d83cc019SAndroid Build Coastguard Worker output->config.crtc->crtc_id,
399*d83cc019SAndroid Build Coastguard Worker test.oversized_fb.fb_id, 0,
400*d83cc019SAndroid Build Coastguard Worker 0, 0,
401*d83cc019SAndroid Build Coastguard Worker mode->hdisplay + 100,
402*d83cc019SAndroid Build Coastguard Worker mode->vdisplay + 100,
403*d83cc019SAndroid Build Coastguard Worker IGT_FIXED(0,0), IGT_FIXED(0,0),
404*d83cc019SAndroid Build Coastguard Worker IGT_FIXED(mode->hdisplay,0),
405*d83cc019SAndroid Build Coastguard Worker IGT_FIXED(mode->vdisplay,0)) == expect);
406*d83cc019SAndroid Build Coastguard Worker
407*d83cc019SAndroid Build Coastguard Worker /* Try to use universal plane API to scale up (should fail on pre-gen9) */
408*d83cc019SAndroid Build Coastguard Worker igt_assert(drmModeSetPlane(data->drm_fd, primary->drm_plane->plane_id,
409*d83cc019SAndroid Build Coastguard Worker output->config.crtc->crtc_id,
410*d83cc019SAndroid Build Coastguard Worker test.oversized_fb.fb_id, 0,
411*d83cc019SAndroid Build Coastguard Worker 0, 0,
412*d83cc019SAndroid Build Coastguard Worker mode->hdisplay,
413*d83cc019SAndroid Build Coastguard Worker mode->vdisplay,
414*d83cc019SAndroid Build Coastguard Worker IGT_FIXED(0,0), IGT_FIXED(0,0),
415*d83cc019SAndroid Build Coastguard Worker IGT_FIXED(mode->hdisplay - 100,0),
416*d83cc019SAndroid Build Coastguard Worker IGT_FIXED(mode->vdisplay - 100,0)) == expect);
417*d83cc019SAndroid Build Coastguard Worker
418*d83cc019SAndroid Build Coastguard Worker /* Find other crtcs and try to program our primary plane on them */
419*d83cc019SAndroid Build Coastguard Worker for (i = 0; i < test.moderes->count_crtcs; i++)
420*d83cc019SAndroid Build Coastguard Worker if (test.moderes->crtcs[i] != output->config.crtc->crtc_id) {
421*d83cc019SAndroid Build Coastguard Worker igt_assert(drmModeSetPlane(data->drm_fd,
422*d83cc019SAndroid Build Coastguard Worker primary->drm_plane->plane_id,
423*d83cc019SAndroid Build Coastguard Worker test.moderes->crtcs[i],
424*d83cc019SAndroid Build Coastguard Worker test.blue_fb.fb_id, 0,
425*d83cc019SAndroid Build Coastguard Worker 0, 0,
426*d83cc019SAndroid Build Coastguard Worker mode->hdisplay,
427*d83cc019SAndroid Build Coastguard Worker mode->vdisplay,
428*d83cc019SAndroid Build Coastguard Worker IGT_FIXED(0,0), IGT_FIXED(0,0),
429*d83cc019SAndroid Build Coastguard Worker IGT_FIXED(mode->hdisplay,0),
430*d83cc019SAndroid Build Coastguard Worker IGT_FIXED(mode->vdisplay,0)) == -EINVAL);
431*d83cc019SAndroid Build Coastguard Worker }
432*d83cc019SAndroid Build Coastguard Worker
433*d83cc019SAndroid Build Coastguard Worker igt_plane_set_fb(primary, NULL);
434*d83cc019SAndroid Build Coastguard Worker sanity_test_fini(&test, output);
435*d83cc019SAndroid Build Coastguard Worker }
436*d83cc019SAndroid Build Coastguard Worker
437*d83cc019SAndroid Build Coastguard Worker static void
pageflip_test_init(pageflip_test_t * test,igt_output_t * output,enum pipe pipe)438*d83cc019SAndroid Build Coastguard Worker pageflip_test_init(pageflip_test_t *test, igt_output_t *output, enum pipe pipe)
439*d83cc019SAndroid Build Coastguard Worker {
440*d83cc019SAndroid Build Coastguard Worker data_t *data = test->data;
441*d83cc019SAndroid Build Coastguard Worker drmModeModeInfo *mode;
442*d83cc019SAndroid Build Coastguard Worker
443*d83cc019SAndroid Build Coastguard Worker igt_output_set_pipe(output, pipe);
444*d83cc019SAndroid Build Coastguard Worker
445*d83cc019SAndroid Build Coastguard Worker mode = igt_output_get_mode(output);
446*d83cc019SAndroid Build Coastguard Worker igt_create_color_fb(data->drm_fd, mode->hdisplay, mode->vdisplay,
447*d83cc019SAndroid Build Coastguard Worker DRM_FORMAT_XRGB8888,
448*d83cc019SAndroid Build Coastguard Worker LOCAL_DRM_FORMAT_MOD_NONE,
449*d83cc019SAndroid Build Coastguard Worker 1.0, 0.0, 0.0,
450*d83cc019SAndroid Build Coastguard Worker &test->red_fb);
451*d83cc019SAndroid Build Coastguard Worker igt_create_color_fb(data->drm_fd, mode->hdisplay, mode->vdisplay,
452*d83cc019SAndroid Build Coastguard Worker DRM_FORMAT_XRGB8888,
453*d83cc019SAndroid Build Coastguard Worker LOCAL_DRM_FORMAT_MOD_NONE,
454*d83cc019SAndroid Build Coastguard Worker 0.0, 0.0, 1.0,
455*d83cc019SAndroid Build Coastguard Worker &test->blue_fb);
456*d83cc019SAndroid Build Coastguard Worker }
457*d83cc019SAndroid Build Coastguard Worker
458*d83cc019SAndroid Build Coastguard Worker static void
pageflip_test_fini(pageflip_test_t * test,igt_output_t * output)459*d83cc019SAndroid Build Coastguard Worker pageflip_test_fini(pageflip_test_t *test, igt_output_t *output)
460*d83cc019SAndroid Build Coastguard Worker {
461*d83cc019SAndroid Build Coastguard Worker igt_remove_fb(test->data->drm_fd, &test->red_fb);
462*d83cc019SAndroid Build Coastguard Worker igt_remove_fb(test->data->drm_fd, &test->blue_fb);
463*d83cc019SAndroid Build Coastguard Worker
464*d83cc019SAndroid Build Coastguard Worker igt_output_set_pipe(output, PIPE_ANY);
465*d83cc019SAndroid Build Coastguard Worker igt_display_commit2(&test->data->display, COMMIT_LEGACY);
466*d83cc019SAndroid Build Coastguard Worker }
467*d83cc019SAndroid Build Coastguard Worker
468*d83cc019SAndroid Build Coastguard Worker static void
pageflip_test_pipe(data_t * data,enum pipe pipe,igt_output_t * output)469*d83cc019SAndroid Build Coastguard Worker pageflip_test_pipe(data_t *data, enum pipe pipe, igt_output_t *output)
470*d83cc019SAndroid Build Coastguard Worker {
471*d83cc019SAndroid Build Coastguard Worker pageflip_test_t test = { .data = data };
472*d83cc019SAndroid Build Coastguard Worker igt_plane_t *primary;
473*d83cc019SAndroid Build Coastguard Worker struct timeval timeout = { .tv_sec = 0, .tv_usec = 500 };
474*d83cc019SAndroid Build Coastguard Worker drmEventContext evctx = { .version = 2 };
475*d83cc019SAndroid Build Coastguard Worker
476*d83cc019SAndroid Build Coastguard Worker fd_set fds;
477*d83cc019SAndroid Build Coastguard Worker int ret = 0;
478*d83cc019SAndroid Build Coastguard Worker
479*d83cc019SAndroid Build Coastguard Worker igt_skip_on(pipe >= data->display.n_pipes);
480*d83cc019SAndroid Build Coastguard Worker
481*d83cc019SAndroid Build Coastguard Worker igt_output_set_pipe(output, pipe);
482*d83cc019SAndroid Build Coastguard Worker
483*d83cc019SAndroid Build Coastguard Worker pageflip_test_init(&test, output, pipe);
484*d83cc019SAndroid Build Coastguard Worker
485*d83cc019SAndroid Build Coastguard Worker primary = igt_output_get_plane_type(output, DRM_PLANE_TYPE_PRIMARY);
486*d83cc019SAndroid Build Coastguard Worker
487*d83cc019SAndroid Build Coastguard Worker /* Use legacy API to set a mode with a blue FB */
488*d83cc019SAndroid Build Coastguard Worker igt_plane_set_fb(primary, &test.blue_fb);
489*d83cc019SAndroid Build Coastguard Worker igt_display_commit2(&data->display, COMMIT_LEGACY);
490*d83cc019SAndroid Build Coastguard Worker
491*d83cc019SAndroid Build Coastguard Worker /* Disable the primary plane */
492*d83cc019SAndroid Build Coastguard Worker igt_plane_set_fb(primary, NULL);
493*d83cc019SAndroid Build Coastguard Worker igt_display_commit2(&data->display, COMMIT_UNIVERSAL);
494*d83cc019SAndroid Build Coastguard Worker
495*d83cc019SAndroid Build Coastguard Worker /*
496*d83cc019SAndroid Build Coastguard Worker * Issue a pageflip to red FB
497*d83cc019SAndroid Build Coastguard Worker *
498*d83cc019SAndroid Build Coastguard Worker * Note that crtc->primary->fb = NULL causes flip to return EBUSY for
499*d83cc019SAndroid Build Coastguard Worker * historical reasons...
500*d83cc019SAndroid Build Coastguard Worker */
501*d83cc019SAndroid Build Coastguard Worker igt_assert(drmModePageFlip(data->drm_fd, output->config.crtc->crtc_id,
502*d83cc019SAndroid Build Coastguard Worker test.red_fb.fb_id, 0, NULL) == -EBUSY);
503*d83cc019SAndroid Build Coastguard Worker
504*d83cc019SAndroid Build Coastguard Worker /* Turn primary plane back on */
505*d83cc019SAndroid Build Coastguard Worker igt_plane_set_fb(primary, &test.blue_fb);
506*d83cc019SAndroid Build Coastguard Worker igt_display_commit2(&data->display, COMMIT_UNIVERSAL);
507*d83cc019SAndroid Build Coastguard Worker
508*d83cc019SAndroid Build Coastguard Worker /*
509*d83cc019SAndroid Build Coastguard Worker * Issue a pageflip to red, then immediately try to disable the primary
510*d83cc019SAndroid Build Coastguard Worker * plane, hopefully before the pageflip has a chance to complete. The
511*d83cc019SAndroid Build Coastguard Worker * plane disable operation should wind up blocking while the pageflip
512*d83cc019SAndroid Build Coastguard Worker * completes, which we don't have a good way to specifically test for,
513*d83cc019SAndroid Build Coastguard Worker * but at least we can make sure that nothing blows up.
514*d83cc019SAndroid Build Coastguard Worker */
515*d83cc019SAndroid Build Coastguard Worker igt_assert(drmModePageFlip(data->drm_fd, output->config.crtc->crtc_id,
516*d83cc019SAndroid Build Coastguard Worker test.red_fb.fb_id, DRM_MODE_PAGE_FLIP_EVENT,
517*d83cc019SAndroid Build Coastguard Worker &test) == 0);
518*d83cc019SAndroid Build Coastguard Worker igt_plane_set_fb(primary, NULL);
519*d83cc019SAndroid Build Coastguard Worker igt_display_commit2(&data->display, COMMIT_UNIVERSAL);
520*d83cc019SAndroid Build Coastguard Worker
521*d83cc019SAndroid Build Coastguard Worker /* Wait for pageflip completion, then consume event on fd */
522*d83cc019SAndroid Build Coastguard Worker FD_ZERO(&fds);
523*d83cc019SAndroid Build Coastguard Worker FD_SET(data->drm_fd, &fds);
524*d83cc019SAndroid Build Coastguard Worker do {
525*d83cc019SAndroid Build Coastguard Worker ret = select(data->drm_fd + 1, &fds, NULL, NULL, &timeout);
526*d83cc019SAndroid Build Coastguard Worker } while (ret < 0 && errno == EINTR);
527*d83cc019SAndroid Build Coastguard Worker igt_assert_eq(ret, 1);
528*d83cc019SAndroid Build Coastguard Worker igt_assert(drmHandleEvent(data->drm_fd, &evctx) == 0);
529*d83cc019SAndroid Build Coastguard Worker
530*d83cc019SAndroid Build Coastguard Worker igt_plane_set_fb(primary, NULL);
531*d83cc019SAndroid Build Coastguard Worker pageflip_test_fini(&test, output);
532*d83cc019SAndroid Build Coastguard Worker }
533*d83cc019SAndroid Build Coastguard Worker
534*d83cc019SAndroid Build Coastguard Worker static void
cursor_leak_test_fini(data_t * data,igt_output_t * output,struct igt_fb * bg,struct igt_fb * curs)535*d83cc019SAndroid Build Coastguard Worker cursor_leak_test_fini(data_t *data,
536*d83cc019SAndroid Build Coastguard Worker igt_output_t *output,
537*d83cc019SAndroid Build Coastguard Worker struct igt_fb *bg,
538*d83cc019SAndroid Build Coastguard Worker struct igt_fb *curs)
539*d83cc019SAndroid Build Coastguard Worker {
540*d83cc019SAndroid Build Coastguard Worker int i;
541*d83cc019SAndroid Build Coastguard Worker
542*d83cc019SAndroid Build Coastguard Worker igt_remove_fb(data->drm_fd, bg);
543*d83cc019SAndroid Build Coastguard Worker for (i = 0; i < 10; i++)
544*d83cc019SAndroid Build Coastguard Worker igt_remove_fb(data->drm_fd, &curs[i]);
545*d83cc019SAndroid Build Coastguard Worker
546*d83cc019SAndroid Build Coastguard Worker igt_output_set_pipe(output, PIPE_ANY);
547*d83cc019SAndroid Build Coastguard Worker }
548*d83cc019SAndroid Build Coastguard Worker
549*d83cc019SAndroid Build Coastguard Worker static int
i915_gem_fb_count(data_t * data)550*d83cc019SAndroid Build Coastguard Worker i915_gem_fb_count(data_t *data)
551*d83cc019SAndroid Build Coastguard Worker {
552*d83cc019SAndroid Build Coastguard Worker char buf[1024];
553*d83cc019SAndroid Build Coastguard Worker FILE *fp;
554*d83cc019SAndroid Build Coastguard Worker int fd;
555*d83cc019SAndroid Build Coastguard Worker int count = 0;
556*d83cc019SAndroid Build Coastguard Worker
557*d83cc019SAndroid Build Coastguard Worker fd = igt_debugfs_open(data->drm_fd, "i915_gem_framebuffer", O_RDONLY);
558*d83cc019SAndroid Build Coastguard Worker fp = fdopen(fd, "r");
559*d83cc019SAndroid Build Coastguard Worker igt_require(fp);
560*d83cc019SAndroid Build Coastguard Worker while (fgets(buf, sizeof(buf), fp) != NULL)
561*d83cc019SAndroid Build Coastguard Worker count++;
562*d83cc019SAndroid Build Coastguard Worker fclose(fp);
563*d83cc019SAndroid Build Coastguard Worker close(fd);
564*d83cc019SAndroid Build Coastguard Worker
565*d83cc019SAndroid Build Coastguard Worker return count;
566*d83cc019SAndroid Build Coastguard Worker }
567*d83cc019SAndroid Build Coastguard Worker
568*d83cc019SAndroid Build Coastguard Worker static void
cursor_leak_test_pipe(data_t * data,enum pipe pipe,igt_output_t * output)569*d83cc019SAndroid Build Coastguard Worker cursor_leak_test_pipe(data_t *data, enum pipe pipe, igt_output_t *output)
570*d83cc019SAndroid Build Coastguard Worker {
571*d83cc019SAndroid Build Coastguard Worker igt_display_t *display = &data->display;
572*d83cc019SAndroid Build Coastguard Worker igt_plane_t *primary, *cursor;
573*d83cc019SAndroid Build Coastguard Worker drmModeModeInfo *mode;
574*d83cc019SAndroid Build Coastguard Worker struct igt_fb background_fb;
575*d83cc019SAndroid Build Coastguard Worker struct igt_fb cursor_fb[10];
576*d83cc019SAndroid Build Coastguard Worker int i;
577*d83cc019SAndroid Build Coastguard Worker int r, g, b;
578*d83cc019SAndroid Build Coastguard Worker int count1, count2;
579*d83cc019SAndroid Build Coastguard Worker
580*d83cc019SAndroid Build Coastguard Worker igt_skip_on(pipe >= display->n_pipes);
581*d83cc019SAndroid Build Coastguard Worker igt_require(display->has_cursor_plane);
582*d83cc019SAndroid Build Coastguard Worker
583*d83cc019SAndroid Build Coastguard Worker igt_output_set_pipe(output, pipe);
584*d83cc019SAndroid Build Coastguard Worker mode = igt_output_get_mode(output);
585*d83cc019SAndroid Build Coastguard Worker
586*d83cc019SAndroid Build Coastguard Worker /* Count GEM framebuffers before creating our cursor FB's */
587*d83cc019SAndroid Build Coastguard Worker count1 = i915_gem_fb_count(data);
588*d83cc019SAndroid Build Coastguard Worker
589*d83cc019SAndroid Build Coastguard Worker /* Black background FB */
590*d83cc019SAndroid Build Coastguard Worker igt_create_color_fb(data->drm_fd, mode->hdisplay, mode->vdisplay,
591*d83cc019SAndroid Build Coastguard Worker DRM_FORMAT_XRGB8888,
592*d83cc019SAndroid Build Coastguard Worker false,
593*d83cc019SAndroid Build Coastguard Worker 0.0, 0.0, 0.0,
594*d83cc019SAndroid Build Coastguard Worker &background_fb);
595*d83cc019SAndroid Build Coastguard Worker
596*d83cc019SAndroid Build Coastguard Worker /* Random color cursors */
597*d83cc019SAndroid Build Coastguard Worker for (i = 0; i < 10; i++) {
598*d83cc019SAndroid Build Coastguard Worker r = rand() % 0xFF;
599*d83cc019SAndroid Build Coastguard Worker g = rand() % 0xFF;
600*d83cc019SAndroid Build Coastguard Worker b = rand() % 0xFF;
601*d83cc019SAndroid Build Coastguard Worker igt_create_color_fb(data->drm_fd, 64, 64,
602*d83cc019SAndroid Build Coastguard Worker DRM_FORMAT_ARGB8888,
603*d83cc019SAndroid Build Coastguard Worker false,
604*d83cc019SAndroid Build Coastguard Worker (double)r / 0xFF,
605*d83cc019SAndroid Build Coastguard Worker (double)g / 0xFF,
606*d83cc019SAndroid Build Coastguard Worker (double)b / 0xFF,
607*d83cc019SAndroid Build Coastguard Worker &cursor_fb[i]);
608*d83cc019SAndroid Build Coastguard Worker }
609*d83cc019SAndroid Build Coastguard Worker
610*d83cc019SAndroid Build Coastguard Worker primary = igt_output_get_plane_type(output, DRM_PLANE_TYPE_PRIMARY);
611*d83cc019SAndroid Build Coastguard Worker cursor = igt_output_get_plane_type(output, DRM_PLANE_TYPE_CURSOR);
612*d83cc019SAndroid Build Coastguard Worker if (!primary || !cursor) {
613*d83cc019SAndroid Build Coastguard Worker cursor_leak_test_fini(data, output, &background_fb, cursor_fb);
614*d83cc019SAndroid Build Coastguard Worker igt_skip("Primary and/or cursor are unavailable\n");
615*d83cc019SAndroid Build Coastguard Worker }
616*d83cc019SAndroid Build Coastguard Worker
617*d83cc019SAndroid Build Coastguard Worker
618*d83cc019SAndroid Build Coastguard Worker igt_plane_set_fb(primary, &background_fb);
619*d83cc019SAndroid Build Coastguard Worker igt_display_commit2(display, COMMIT_LEGACY);
620*d83cc019SAndroid Build Coastguard Worker
621*d83cc019SAndroid Build Coastguard Worker igt_plane_set_position(cursor, 100, 100);
622*d83cc019SAndroid Build Coastguard Worker
623*d83cc019SAndroid Build Coastguard Worker /*
624*d83cc019SAndroid Build Coastguard Worker * Exercise both legacy and universal code paths. Note that legacy
625*d83cc019SAndroid Build Coastguard Worker * handling in the kernel redirects through universal codepaths
626*d83cc019SAndroid Build Coastguard Worker * internally, so that redirection is where we're most worried about
627*d83cc019SAndroid Build Coastguard Worker * leaking.
628*d83cc019SAndroid Build Coastguard Worker */
629*d83cc019SAndroid Build Coastguard Worker for (i = 0; i < 10; i++) {
630*d83cc019SAndroid Build Coastguard Worker igt_plane_set_fb(cursor, &cursor_fb[i]);
631*d83cc019SAndroid Build Coastguard Worker igt_display_commit2(display, COMMIT_UNIVERSAL);
632*d83cc019SAndroid Build Coastguard Worker }
633*d83cc019SAndroid Build Coastguard Worker for (i = 0; i < 10; i++) {
634*d83cc019SAndroid Build Coastguard Worker igt_plane_set_fb(cursor, &cursor_fb[i]);
635*d83cc019SAndroid Build Coastguard Worker igt_display_commit2(display, COMMIT_LEGACY);
636*d83cc019SAndroid Build Coastguard Worker }
637*d83cc019SAndroid Build Coastguard Worker
638*d83cc019SAndroid Build Coastguard Worker /* Release our framebuffer handles before we take a second count */
639*d83cc019SAndroid Build Coastguard Worker igt_plane_set_fb(primary, NULL);
640*d83cc019SAndroid Build Coastguard Worker igt_plane_set_fb(cursor, NULL);
641*d83cc019SAndroid Build Coastguard Worker igt_display_commit2(display, COMMIT_LEGACY);
642*d83cc019SAndroid Build Coastguard Worker cursor_leak_test_fini(data, output, &background_fb, cursor_fb);
643*d83cc019SAndroid Build Coastguard Worker
644*d83cc019SAndroid Build Coastguard Worker /* We should be back to the same framebuffer count as when we started */
645*d83cc019SAndroid Build Coastguard Worker count2 = i915_gem_fb_count(data);
646*d83cc019SAndroid Build Coastguard Worker
647*d83cc019SAndroid Build Coastguard Worker igt_assert_eq(count1, count2);
648*d83cc019SAndroid Build Coastguard Worker }
649*d83cc019SAndroid Build Coastguard Worker
650*d83cc019SAndroid Build Coastguard Worker static void
gen9_test_init(gen9_test_t * test,igt_output_t * output,enum pipe pipe)651*d83cc019SAndroid Build Coastguard Worker gen9_test_init(gen9_test_t *test, igt_output_t *output, enum pipe pipe)
652*d83cc019SAndroid Build Coastguard Worker {
653*d83cc019SAndroid Build Coastguard Worker data_t *data = test->data;
654*d83cc019SAndroid Build Coastguard Worker drmModeModeInfo *mode;
655*d83cc019SAndroid Build Coastguard Worker
656*d83cc019SAndroid Build Coastguard Worker igt_output_set_pipe(output, pipe);
657*d83cc019SAndroid Build Coastguard Worker
658*d83cc019SAndroid Build Coastguard Worker mode = igt_output_get_mode(output);
659*d83cc019SAndroid Build Coastguard Worker test->w = mode->hdisplay / 2;
660*d83cc019SAndroid Build Coastguard Worker test->h = mode->vdisplay / 2;
661*d83cc019SAndroid Build Coastguard Worker test->x = mode->hdisplay / 4;
662*d83cc019SAndroid Build Coastguard Worker test->y = mode->vdisplay / 4;
663*d83cc019SAndroid Build Coastguard Worker
664*d83cc019SAndroid Build Coastguard Worker /* Initial framebuffer of full CRTC size */
665*d83cc019SAndroid Build Coastguard Worker igt_create_color_fb(data->drm_fd, mode->hdisplay, mode->vdisplay,
666*d83cc019SAndroid Build Coastguard Worker DRM_FORMAT_XRGB8888,
667*d83cc019SAndroid Build Coastguard Worker LOCAL_DRM_FORMAT_MOD_NONE,
668*d83cc019SAndroid Build Coastguard Worker 0.0, 1.0, 0.0,
669*d83cc019SAndroid Build Coastguard Worker &test->biggreen_fb);
670*d83cc019SAndroid Build Coastguard Worker
671*d83cc019SAndroid Build Coastguard Worker /* Framebuffers that only cover a quarter of the CRTC size */
672*d83cc019SAndroid Build Coastguard Worker igt_create_color_fb(data->drm_fd, test->w, test->h,
673*d83cc019SAndroid Build Coastguard Worker DRM_FORMAT_XRGB8888,
674*d83cc019SAndroid Build Coastguard Worker LOCAL_DRM_FORMAT_MOD_NONE,
675*d83cc019SAndroid Build Coastguard Worker 1.0, 0.0, 0.0,
676*d83cc019SAndroid Build Coastguard Worker &test->smallred_fb);
677*d83cc019SAndroid Build Coastguard Worker igt_create_color_fb(data->drm_fd, test->w, test->h,
678*d83cc019SAndroid Build Coastguard Worker DRM_FORMAT_XRGB8888,
679*d83cc019SAndroid Build Coastguard Worker LOCAL_DRM_FORMAT_MOD_NONE,
680*d83cc019SAndroid Build Coastguard Worker 0.0, 0.0, 1.0,
681*d83cc019SAndroid Build Coastguard Worker &test->smallblue_fb);
682*d83cc019SAndroid Build Coastguard Worker }
683*d83cc019SAndroid Build Coastguard Worker
684*d83cc019SAndroid Build Coastguard Worker static void
gen9_test_fini(gen9_test_t * test,igt_output_t * output)685*d83cc019SAndroid Build Coastguard Worker gen9_test_fini(gen9_test_t *test, igt_output_t *output)
686*d83cc019SAndroid Build Coastguard Worker {
687*d83cc019SAndroid Build Coastguard Worker igt_remove_fb(test->data->drm_fd, &test->biggreen_fb);
688*d83cc019SAndroid Build Coastguard Worker igt_remove_fb(test->data->drm_fd, &test->smallred_fb);
689*d83cc019SAndroid Build Coastguard Worker igt_remove_fb(test->data->drm_fd, &test->smallblue_fb);
690*d83cc019SAndroid Build Coastguard Worker
691*d83cc019SAndroid Build Coastguard Worker igt_output_set_pipe(output, PIPE_ANY);
692*d83cc019SAndroid Build Coastguard Worker igt_display_commit2(&test->data->display, COMMIT_LEGACY);
693*d83cc019SAndroid Build Coastguard Worker }
694*d83cc019SAndroid Build Coastguard Worker
695*d83cc019SAndroid Build Coastguard Worker /*
696*d83cc019SAndroid Build Coastguard Worker * Test features specific to gen9+ platforms (i.e., primary plane
697*d83cc019SAndroid Build Coastguard Worker * windowing)
698*d83cc019SAndroid Build Coastguard Worker */
699*d83cc019SAndroid Build Coastguard Worker static void
gen9_test_pipe(data_t * data,enum pipe pipe,igt_output_t * output)700*d83cc019SAndroid Build Coastguard Worker gen9_test_pipe(data_t *data, enum pipe pipe, igt_output_t *output)
701*d83cc019SAndroid Build Coastguard Worker {
702*d83cc019SAndroid Build Coastguard Worker gen9_test_t test = { .data = data };
703*d83cc019SAndroid Build Coastguard Worker igt_plane_t *primary;
704*d83cc019SAndroid Build Coastguard Worker
705*d83cc019SAndroid Build Coastguard Worker int ret = 0;
706*d83cc019SAndroid Build Coastguard Worker
707*d83cc019SAndroid Build Coastguard Worker igt_skip_on(data->gen < 9);
708*d83cc019SAndroid Build Coastguard Worker igt_skip_on(pipe >= data->display.n_pipes);
709*d83cc019SAndroid Build Coastguard Worker
710*d83cc019SAndroid Build Coastguard Worker igt_output_set_pipe(output, pipe);
711*d83cc019SAndroid Build Coastguard Worker
712*d83cc019SAndroid Build Coastguard Worker gen9_test_init(&test, output, pipe);
713*d83cc019SAndroid Build Coastguard Worker
714*d83cc019SAndroid Build Coastguard Worker primary = igt_output_get_plane_type(output, DRM_PLANE_TYPE_PRIMARY);
715*d83cc019SAndroid Build Coastguard Worker
716*d83cc019SAndroid Build Coastguard Worker /* Start with a full-screen primary plane */
717*d83cc019SAndroid Build Coastguard Worker igt_plane_set_fb(primary, &test.biggreen_fb);
718*d83cc019SAndroid Build Coastguard Worker igt_display_commit2(&data->display, COMMIT_LEGACY);
719*d83cc019SAndroid Build Coastguard Worker
720*d83cc019SAndroid Build Coastguard Worker /* Set primary to windowed size/position */
721*d83cc019SAndroid Build Coastguard Worker igt_plane_set_fb(primary, &test.smallblue_fb);
722*d83cc019SAndroid Build Coastguard Worker igt_plane_set_position(primary, test.x, test.y);
723*d83cc019SAndroid Build Coastguard Worker igt_plane_set_size(primary, test.w, test.h);
724*d83cc019SAndroid Build Coastguard Worker igt_display_commit2(&data->display, COMMIT_UNIVERSAL);
725*d83cc019SAndroid Build Coastguard Worker
726*d83cc019SAndroid Build Coastguard Worker /*
727*d83cc019SAndroid Build Coastguard Worker * SetPlane update to another framebuffer of the same size
728*d83cc019SAndroid Build Coastguard Worker * should succeed
729*d83cc019SAndroid Build Coastguard Worker */
730*d83cc019SAndroid Build Coastguard Worker igt_plane_set_fb(primary, &test.smallred_fb);
731*d83cc019SAndroid Build Coastguard Worker igt_plane_set_position(primary, test.x, test.y);
732*d83cc019SAndroid Build Coastguard Worker igt_plane_set_size(primary, test.w, test.h);
733*d83cc019SAndroid Build Coastguard Worker igt_display_commit2(&data->display, COMMIT_UNIVERSAL);
734*d83cc019SAndroid Build Coastguard Worker
735*d83cc019SAndroid Build Coastguard Worker /* PageFlip should also succeed */
736*d83cc019SAndroid Build Coastguard Worker ret = drmModePageFlip(data->drm_fd, output->config.crtc->crtc_id,
737*d83cc019SAndroid Build Coastguard Worker test.smallblue_fb.fb_id, 0, NULL);
738*d83cc019SAndroid Build Coastguard Worker igt_assert_eq(ret, 0);
739*d83cc019SAndroid Build Coastguard Worker
740*d83cc019SAndroid Build Coastguard Worker igt_plane_set_fb(primary, NULL);
741*d83cc019SAndroid Build Coastguard Worker igt_plane_set_position(primary, 0, 0);
742*d83cc019SAndroid Build Coastguard Worker gen9_test_fini(&test, output);
743*d83cc019SAndroid Build Coastguard Worker }
744*d83cc019SAndroid Build Coastguard Worker
745*d83cc019SAndroid Build Coastguard Worker static void
run_tests_for_pipe(data_t * data,enum pipe pipe)746*d83cc019SAndroid Build Coastguard Worker run_tests_for_pipe(data_t *data, enum pipe pipe)
747*d83cc019SAndroid Build Coastguard Worker {
748*d83cc019SAndroid Build Coastguard Worker igt_output_t *output;
749*d83cc019SAndroid Build Coastguard Worker
750*d83cc019SAndroid Build Coastguard Worker igt_fixture {
751*d83cc019SAndroid Build Coastguard Worker int valid_tests = 0;
752*d83cc019SAndroid Build Coastguard Worker
753*d83cc019SAndroid Build Coastguard Worker igt_skip_on(pipe >= data->display.n_pipes);
754*d83cc019SAndroid Build Coastguard Worker
755*d83cc019SAndroid Build Coastguard Worker for_each_valid_output_on_pipe(&data->display, pipe, output)
756*d83cc019SAndroid Build Coastguard Worker valid_tests++;
757*d83cc019SAndroid Build Coastguard Worker
758*d83cc019SAndroid Build Coastguard Worker igt_require_f(valid_tests, "no valid crtc/connector combinations found\n");
759*d83cc019SAndroid Build Coastguard Worker }
760*d83cc019SAndroid Build Coastguard Worker
761*d83cc019SAndroid Build Coastguard Worker igt_subtest_f("universal-plane-pipe-%s-functional",
762*d83cc019SAndroid Build Coastguard Worker kmstest_pipe_name(pipe))
763*d83cc019SAndroid Build Coastguard Worker for_each_valid_output_on_pipe(&data->display, pipe, output)
764*d83cc019SAndroid Build Coastguard Worker functional_test_pipe(data, pipe, output);
765*d83cc019SAndroid Build Coastguard Worker
766*d83cc019SAndroid Build Coastguard Worker igt_subtest_f("universal-plane-pipe-%s-sanity",
767*d83cc019SAndroid Build Coastguard Worker kmstest_pipe_name(pipe))
768*d83cc019SAndroid Build Coastguard Worker for_each_valid_output_on_pipe(&data->display, pipe, output)
769*d83cc019SAndroid Build Coastguard Worker sanity_test_pipe(data, pipe, output);
770*d83cc019SAndroid Build Coastguard Worker
771*d83cc019SAndroid Build Coastguard Worker igt_subtest_f("disable-primary-vs-flip-pipe-%s",
772*d83cc019SAndroid Build Coastguard Worker kmstest_pipe_name(pipe))
773*d83cc019SAndroid Build Coastguard Worker for_each_valid_output_on_pipe(&data->display, pipe, output)
774*d83cc019SAndroid Build Coastguard Worker pageflip_test_pipe(data, pipe, output);
775*d83cc019SAndroid Build Coastguard Worker
776*d83cc019SAndroid Build Coastguard Worker igt_subtest_f("cursor-fb-leak-pipe-%s",
777*d83cc019SAndroid Build Coastguard Worker kmstest_pipe_name(pipe))
778*d83cc019SAndroid Build Coastguard Worker for_each_valid_output_on_pipe(&data->display, pipe, output)
779*d83cc019SAndroid Build Coastguard Worker cursor_leak_test_pipe(data, pipe, output);
780*d83cc019SAndroid Build Coastguard Worker
781*d83cc019SAndroid Build Coastguard Worker igt_subtest_f("universal-plane-gen9-features-pipe-%s",
782*d83cc019SAndroid Build Coastguard Worker kmstest_pipe_name(pipe))
783*d83cc019SAndroid Build Coastguard Worker for_each_valid_output_on_pipe(&data->display, pipe, output)
784*d83cc019SAndroid Build Coastguard Worker gen9_test_pipe(data, pipe, output);
785*d83cc019SAndroid Build Coastguard Worker }
786*d83cc019SAndroid Build Coastguard Worker
787*d83cc019SAndroid Build Coastguard Worker static data_t data;
788*d83cc019SAndroid Build Coastguard Worker
789*d83cc019SAndroid Build Coastguard Worker igt_main
790*d83cc019SAndroid Build Coastguard Worker {
791*d83cc019SAndroid Build Coastguard Worker enum pipe pipe;
792*d83cc019SAndroid Build Coastguard Worker
793*d83cc019SAndroid Build Coastguard Worker igt_skip_on_simulation();
794*d83cc019SAndroid Build Coastguard Worker
795*d83cc019SAndroid Build Coastguard Worker igt_fixture {
796*d83cc019SAndroid Build Coastguard Worker data.drm_fd = drm_open_driver_master(DRIVER_INTEL);
797*d83cc019SAndroid Build Coastguard Worker data.gen = intel_gen(intel_get_drm_devid(data.drm_fd));
798*d83cc019SAndroid Build Coastguard Worker
799*d83cc019SAndroid Build Coastguard Worker kmstest_set_vt_graphics_mode();
800*d83cc019SAndroid Build Coastguard Worker
801*d83cc019SAndroid Build Coastguard Worker igt_require_pipe_crc(data.drm_fd);
802*d83cc019SAndroid Build Coastguard Worker igt_display_require(&data.display, data.drm_fd);
803*d83cc019SAndroid Build Coastguard Worker }
804*d83cc019SAndroid Build Coastguard Worker
for_each_pipe_static(pipe)805*d83cc019SAndroid Build Coastguard Worker for_each_pipe_static(pipe) {
806*d83cc019SAndroid Build Coastguard Worker igt_subtest_group
807*d83cc019SAndroid Build Coastguard Worker run_tests_for_pipe(&data, pipe);
808*d83cc019SAndroid Build Coastguard Worker }
809*d83cc019SAndroid Build Coastguard Worker
810*d83cc019SAndroid Build Coastguard Worker igt_fixture {
811*d83cc019SAndroid Build Coastguard Worker igt_display_fini(&data.display);
812*d83cc019SAndroid Build Coastguard Worker }
813*d83cc019SAndroid Build Coastguard Worker }
814