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_sysfs.h"
29*d83cc019SAndroid Build Coastguard Worker #include "igt_psr.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 #include <poll.h>
34*d83cc019SAndroid Build Coastguard Worker #include <pthread.h>
35*d83cc019SAndroid Build Coastguard Worker
36*d83cc019SAndroid Build Coastguard Worker
37*d83cc019SAndroid Build Coastguard Worker IGT_TEST_DESCRIPTION("Test the Kernel's frontbuffer tracking mechanism and "
38*d83cc019SAndroid Build Coastguard Worker "its related features: FBC, PSR and DRRS");
39*d83cc019SAndroid Build Coastguard Worker
40*d83cc019SAndroid Build Coastguard Worker /*
41*d83cc019SAndroid Build Coastguard Worker * One of the aspects of this test is that, for every subtest, we try different
42*d83cc019SAndroid Build Coastguard Worker * combinations of the parameters defined by the struct below. Because of this,
43*d83cc019SAndroid Build Coastguard Worker * a single addition of a new parameter or subtest function can lead to hundreds
44*d83cc019SAndroid Build Coastguard Worker * of new subtests.
45*d83cc019SAndroid Build Coastguard Worker *
46*d83cc019SAndroid Build Coastguard Worker * In order to reduce the number combinations we cut the cases that don't make
47*d83cc019SAndroid Build Coastguard Worker * sense, such as writing on the secondary screen when there is only a single
48*d83cc019SAndroid Build Coastguard Worker * pipe, or flipping when the target is the offscreen buffer. We also hide some
49*d83cc019SAndroid Build Coastguard Worker * combinations that are somewhat redundant and don't add much value to the
50*d83cc019SAndroid Build Coastguard Worker * test. For example, since we already do the offscreen testing with a single
51*d83cc019SAndroid Build Coastguard Worker * pipe enabled, there's no much value in doing it again with dual pipes. If you
52*d83cc019SAndroid Build Coastguard Worker * still want to try these redundant tests, you need to use the --show-hidden
53*d83cc019SAndroid Build Coastguard Worker * option.
54*d83cc019SAndroid Build Coastguard Worker *
55*d83cc019SAndroid Build Coastguard Worker * The most important hidden thing is the FEATURE_NONE set of tests. Whenever
56*d83cc019SAndroid Build Coastguard Worker * you get a failure on any test, it is important to check whether the same test
57*d83cc019SAndroid Build Coastguard Worker * fails with FEATURE_NONE - replace the feature name for "nop". If the nop test
58*d83cc019SAndroid Build Coastguard Worker * also fails, then it's likely the problem will be on the IGT side instead of
59*d83cc019SAndroid Build Coastguard Worker * the Kernel side. We don't expose this set of tests by default because (i)
60*d83cc019SAndroid Build Coastguard Worker * they take a long time to test; and (ii) if the feature tests work, then it's
61*d83cc019SAndroid Build Coastguard Worker * very likely that the nop tests will also work.
62*d83cc019SAndroid Build Coastguard Worker */
63*d83cc019SAndroid Build Coastguard Worker struct test_mode {
64*d83cc019SAndroid Build Coastguard Worker /* Are we going to enable just one monitor, or are we going to setup a
65*d83cc019SAndroid Build Coastguard Worker * dual screen environment for the test? */
66*d83cc019SAndroid Build Coastguard Worker enum {
67*d83cc019SAndroid Build Coastguard Worker PIPE_SINGLE = 0,
68*d83cc019SAndroid Build Coastguard Worker PIPE_DUAL,
69*d83cc019SAndroid Build Coastguard Worker PIPE_COUNT,
70*d83cc019SAndroid Build Coastguard Worker } pipes;
71*d83cc019SAndroid Build Coastguard Worker
72*d83cc019SAndroid Build Coastguard Worker /* The primary screen is the one that's supposed to have the "feature"
73*d83cc019SAndroid Build Coastguard Worker * enabled on, but we have the option to draw on the secondary screen or
74*d83cc019SAndroid Build Coastguard Worker * on some offscreen buffer. We also only theck the CRC of the primary
75*d83cc019SAndroid Build Coastguard Worker * screen. */
76*d83cc019SAndroid Build Coastguard Worker enum {
77*d83cc019SAndroid Build Coastguard Worker SCREEN_PRIM = 0,
78*d83cc019SAndroid Build Coastguard Worker SCREEN_SCND,
79*d83cc019SAndroid Build Coastguard Worker SCREEN_OFFSCREEN,
80*d83cc019SAndroid Build Coastguard Worker SCREEN_COUNT,
81*d83cc019SAndroid Build Coastguard Worker } screen;
82*d83cc019SAndroid Build Coastguard Worker
83*d83cc019SAndroid Build Coastguard Worker /* When we draw, we can draw directly on the primary plane, on the
84*d83cc019SAndroid Build Coastguard Worker * cursor or on the sprite plane. */
85*d83cc019SAndroid Build Coastguard Worker enum {
86*d83cc019SAndroid Build Coastguard Worker PLANE_PRI = 0,
87*d83cc019SAndroid Build Coastguard Worker PLANE_CUR,
88*d83cc019SAndroid Build Coastguard Worker PLANE_SPR,
89*d83cc019SAndroid Build Coastguard Worker PLANE_COUNT,
90*d83cc019SAndroid Build Coastguard Worker } plane;
91*d83cc019SAndroid Build Coastguard Worker
92*d83cc019SAndroid Build Coastguard Worker /* We can organize the screens in a way that each screen has its own
93*d83cc019SAndroid Build Coastguard Worker * framebuffer, or in a way that all screens point to the same
94*d83cc019SAndroid Build Coastguard Worker * framebuffer, but on different places. This includes the offscreen
95*d83cc019SAndroid Build Coastguard Worker * screen. */
96*d83cc019SAndroid Build Coastguard Worker enum {
97*d83cc019SAndroid Build Coastguard Worker FBS_INDIVIDUAL = 0,
98*d83cc019SAndroid Build Coastguard Worker FBS_SHARED,
99*d83cc019SAndroid Build Coastguard Worker FBS_COUNT,
100*d83cc019SAndroid Build Coastguard Worker } fbs;
101*d83cc019SAndroid Build Coastguard Worker
102*d83cc019SAndroid Build Coastguard Worker /* Which features are we going to test now? This is a mask!
103*d83cc019SAndroid Build Coastguard Worker * FEATURE_DEFAULT is a special value which instruct the test to just
104*d83cc019SAndroid Build Coastguard Worker * keep what's already enabled by default in the Kernel. */
105*d83cc019SAndroid Build Coastguard Worker enum {
106*d83cc019SAndroid Build Coastguard Worker FEATURE_NONE = 0,
107*d83cc019SAndroid Build Coastguard Worker FEATURE_FBC = 1,
108*d83cc019SAndroid Build Coastguard Worker FEATURE_PSR = 2,
109*d83cc019SAndroid Build Coastguard Worker FEATURE_DRRS = 4,
110*d83cc019SAndroid Build Coastguard Worker FEATURE_COUNT = 8,
111*d83cc019SAndroid Build Coastguard Worker FEATURE_DEFAULT = 8,
112*d83cc019SAndroid Build Coastguard Worker } feature;
113*d83cc019SAndroid Build Coastguard Worker
114*d83cc019SAndroid Build Coastguard Worker /* Possible pixel formats. We just use FORMAT_DEFAULT for most tests and
115*d83cc019SAndroid Build Coastguard Worker * only test a few things on the other formats. */
116*d83cc019SAndroid Build Coastguard Worker enum pixel_format {
117*d83cc019SAndroid Build Coastguard Worker FORMAT_RGB888 = 0,
118*d83cc019SAndroid Build Coastguard Worker FORMAT_RGB565,
119*d83cc019SAndroid Build Coastguard Worker FORMAT_RGB101010,
120*d83cc019SAndroid Build Coastguard Worker FORMAT_COUNT,
121*d83cc019SAndroid Build Coastguard Worker FORMAT_DEFAULT = FORMAT_RGB888,
122*d83cc019SAndroid Build Coastguard Worker } format;
123*d83cc019SAndroid Build Coastguard Worker
124*d83cc019SAndroid Build Coastguard Worker /* There are multiple APIs where we can do the equivalent of a page flip
125*d83cc019SAndroid Build Coastguard Worker * and they exercise slightly different codepaths inside the Kernel. */
126*d83cc019SAndroid Build Coastguard Worker enum flip_type {
127*d83cc019SAndroid Build Coastguard Worker FLIP_PAGEFLIP,
128*d83cc019SAndroid Build Coastguard Worker FLIP_MODESET,
129*d83cc019SAndroid Build Coastguard Worker FLIP_PLANES,
130*d83cc019SAndroid Build Coastguard Worker FLIP_COUNT,
131*d83cc019SAndroid Build Coastguard Worker } flip;
132*d83cc019SAndroid Build Coastguard Worker
133*d83cc019SAndroid Build Coastguard Worker enum igt_draw_method method;
134*d83cc019SAndroid Build Coastguard Worker };
135*d83cc019SAndroid Build Coastguard Worker
136*d83cc019SAndroid Build Coastguard Worker enum color {
137*d83cc019SAndroid Build Coastguard Worker COLOR_RED,
138*d83cc019SAndroid Build Coastguard Worker COLOR_GREEN,
139*d83cc019SAndroid Build Coastguard Worker COLOR_BLUE,
140*d83cc019SAndroid Build Coastguard Worker COLOR_MAGENTA,
141*d83cc019SAndroid Build Coastguard Worker COLOR_CYAN,
142*d83cc019SAndroid Build Coastguard Worker COLOR_SCND_BG,
143*d83cc019SAndroid Build Coastguard Worker COLOR_PRIM_BG = COLOR_BLUE,
144*d83cc019SAndroid Build Coastguard Worker COLOR_OFFSCREEN_BG = COLOR_SCND_BG,
145*d83cc019SAndroid Build Coastguard Worker };
146*d83cc019SAndroid Build Coastguard Worker
147*d83cc019SAndroid Build Coastguard Worker struct rect {
148*d83cc019SAndroid Build Coastguard Worker int x;
149*d83cc019SAndroid Build Coastguard Worker int y;
150*d83cc019SAndroid Build Coastguard Worker int w;
151*d83cc019SAndroid Build Coastguard Worker int h;
152*d83cc019SAndroid Build Coastguard Worker uint32_t color;
153*d83cc019SAndroid Build Coastguard Worker };
154*d83cc019SAndroid Build Coastguard Worker
155*d83cc019SAndroid Build Coastguard Worker struct {
156*d83cc019SAndroid Build Coastguard Worker int fd;
157*d83cc019SAndroid Build Coastguard Worker int debugfs;
158*d83cc019SAndroid Build Coastguard Worker igt_display_t display;
159*d83cc019SAndroid Build Coastguard Worker
160*d83cc019SAndroid Build Coastguard Worker drm_intel_bufmgr *bufmgr;
161*d83cc019SAndroid Build Coastguard Worker } drm;
162*d83cc019SAndroid Build Coastguard Worker
163*d83cc019SAndroid Build Coastguard Worker struct {
164*d83cc019SAndroid Build Coastguard Worker bool can_test;
165*d83cc019SAndroid Build Coastguard Worker
166*d83cc019SAndroid Build Coastguard Worker bool supports_last_action;
167*d83cc019SAndroid Build Coastguard Worker
168*d83cc019SAndroid Build Coastguard Worker struct timespec last_action;
169*d83cc019SAndroid Build Coastguard Worker } fbc = {
170*d83cc019SAndroid Build Coastguard Worker .can_test = false,
171*d83cc019SAndroid Build Coastguard Worker .supports_last_action = false,
172*d83cc019SAndroid Build Coastguard Worker };
173*d83cc019SAndroid Build Coastguard Worker
174*d83cc019SAndroid Build Coastguard Worker struct {
175*d83cc019SAndroid Build Coastguard Worker bool can_test;
176*d83cc019SAndroid Build Coastguard Worker } psr = {
177*d83cc019SAndroid Build Coastguard Worker .can_test = false,
178*d83cc019SAndroid Build Coastguard Worker };
179*d83cc019SAndroid Build Coastguard Worker
180*d83cc019SAndroid Build Coastguard Worker #define MAX_DRRS_STATUS_BUF_LEN 256
181*d83cc019SAndroid Build Coastguard Worker
182*d83cc019SAndroid Build Coastguard Worker struct {
183*d83cc019SAndroid Build Coastguard Worker bool can_test;
184*d83cc019SAndroid Build Coastguard Worker } drrs = {
185*d83cc019SAndroid Build Coastguard Worker .can_test = false,
186*d83cc019SAndroid Build Coastguard Worker };
187*d83cc019SAndroid Build Coastguard Worker
188*d83cc019SAndroid Build Coastguard Worker igt_pipe_crc_t *pipe_crc;
189*d83cc019SAndroid Build Coastguard Worker igt_crc_t *wanted_crc;
190*d83cc019SAndroid Build Coastguard Worker struct {
191*d83cc019SAndroid Build Coastguard Worker bool initialized;
192*d83cc019SAndroid Build Coastguard Worker igt_crc_t crc;
193*d83cc019SAndroid Build Coastguard Worker } blue_crcs[FORMAT_COUNT];
194*d83cc019SAndroid Build Coastguard Worker
195*d83cc019SAndroid Build Coastguard Worker /* The goal of this structure is to easily allow us to deal with cases where we
196*d83cc019SAndroid Build Coastguard Worker * have a big framebuffer and the CRTC is just displaying a subregion of this
197*d83cc019SAndroid Build Coastguard Worker * big FB. */
198*d83cc019SAndroid Build Coastguard Worker struct fb_region {
199*d83cc019SAndroid Build Coastguard Worker igt_plane_t *plane;
200*d83cc019SAndroid Build Coastguard Worker struct igt_fb *fb;
201*d83cc019SAndroid Build Coastguard Worker int x;
202*d83cc019SAndroid Build Coastguard Worker int y;
203*d83cc019SAndroid Build Coastguard Worker int w;
204*d83cc019SAndroid Build Coastguard Worker int h;
205*d83cc019SAndroid Build Coastguard Worker };
206*d83cc019SAndroid Build Coastguard Worker
207*d83cc019SAndroid Build Coastguard Worker struct draw_pattern_info {
208*d83cc019SAndroid Build Coastguard Worker bool frames_stack;
209*d83cc019SAndroid Build Coastguard Worker int n_rects;
210*d83cc019SAndroid Build Coastguard Worker struct rect (*get_rect)(struct fb_region *fb, int r);
211*d83cc019SAndroid Build Coastguard Worker
212*d83cc019SAndroid Build Coastguard Worker bool initialized[FORMAT_COUNT];
213*d83cc019SAndroid Build Coastguard Worker igt_crc_t *crcs[FORMAT_COUNT];
214*d83cc019SAndroid Build Coastguard Worker };
215*d83cc019SAndroid Build Coastguard Worker
216*d83cc019SAndroid Build Coastguard Worker /* Draw big rectangles on the screen. */
217*d83cc019SAndroid Build Coastguard Worker struct draw_pattern_info pattern1;
218*d83cc019SAndroid Build Coastguard Worker /* 64x64 rectangles at x:0,y:0, just so we can draw on the cursor and sprite. */
219*d83cc019SAndroid Build Coastguard Worker struct draw_pattern_info pattern2;
220*d83cc019SAndroid Build Coastguard Worker /* 64x64 rectangles at different positions, same color, for the move test. */
221*d83cc019SAndroid Build Coastguard Worker struct draw_pattern_info pattern3;
222*d83cc019SAndroid Build Coastguard Worker /* Just a fullscreen green square. */
223*d83cc019SAndroid Build Coastguard Worker struct draw_pattern_info pattern4;
224*d83cc019SAndroid Build Coastguard Worker
225*d83cc019SAndroid Build Coastguard Worker /* Command line parameters. */
226*d83cc019SAndroid Build Coastguard Worker struct {
227*d83cc019SAndroid Build Coastguard Worker bool check_status;
228*d83cc019SAndroid Build Coastguard Worker bool check_crc;
229*d83cc019SAndroid Build Coastguard Worker bool fbc_check_compression;
230*d83cc019SAndroid Build Coastguard Worker bool fbc_check_last_action;
231*d83cc019SAndroid Build Coastguard Worker bool no_edp;
232*d83cc019SAndroid Build Coastguard Worker bool small_modes;
233*d83cc019SAndroid Build Coastguard Worker bool show_hidden;
234*d83cc019SAndroid Build Coastguard Worker int step;
235*d83cc019SAndroid Build Coastguard Worker int only_pipes;
236*d83cc019SAndroid Build Coastguard Worker int shared_fb_x_offset;
237*d83cc019SAndroid Build Coastguard Worker int shared_fb_y_offset;
238*d83cc019SAndroid Build Coastguard Worker uint64_t tiling;
239*d83cc019SAndroid Build Coastguard Worker } opt = {
240*d83cc019SAndroid Build Coastguard Worker .check_status = true,
241*d83cc019SAndroid Build Coastguard Worker .check_crc = true,
242*d83cc019SAndroid Build Coastguard Worker .fbc_check_compression = true,
243*d83cc019SAndroid Build Coastguard Worker .fbc_check_last_action = true,
244*d83cc019SAndroid Build Coastguard Worker .no_edp = false,
245*d83cc019SAndroid Build Coastguard Worker .small_modes = false,
246*d83cc019SAndroid Build Coastguard Worker .show_hidden= false,
247*d83cc019SAndroid Build Coastguard Worker .step = 0,
248*d83cc019SAndroid Build Coastguard Worker .only_pipes = PIPE_COUNT,
249*d83cc019SAndroid Build Coastguard Worker .shared_fb_x_offset = 248,
250*d83cc019SAndroid Build Coastguard Worker .shared_fb_y_offset = 500,
251*d83cc019SAndroid Build Coastguard Worker .tiling = LOCAL_I915_FORMAT_MOD_X_TILED,
252*d83cc019SAndroid Build Coastguard Worker };
253*d83cc019SAndroid Build Coastguard Worker
254*d83cc019SAndroid Build Coastguard Worker struct modeset_params {
255*d83cc019SAndroid Build Coastguard Worker enum pipe pipe;
256*d83cc019SAndroid Build Coastguard Worker igt_output_t *output;
257*d83cc019SAndroid Build Coastguard Worker drmModeModeInfo mode_copy, *mode;
258*d83cc019SAndroid Build Coastguard Worker
259*d83cc019SAndroid Build Coastguard Worker struct fb_region primary;
260*d83cc019SAndroid Build Coastguard Worker struct fb_region cursor;
261*d83cc019SAndroid Build Coastguard Worker struct fb_region sprite;
262*d83cc019SAndroid Build Coastguard Worker };
263*d83cc019SAndroid Build Coastguard Worker
264*d83cc019SAndroid Build Coastguard Worker struct modeset_params prim_mode_params;
265*d83cc019SAndroid Build Coastguard Worker struct modeset_params scnd_mode_params;
266*d83cc019SAndroid Build Coastguard Worker
267*d83cc019SAndroid Build Coastguard Worker struct fb_region offscreen_fb;
268*d83cc019SAndroid Build Coastguard Worker struct screen_fbs {
269*d83cc019SAndroid Build Coastguard Worker bool initialized;
270*d83cc019SAndroid Build Coastguard Worker
271*d83cc019SAndroid Build Coastguard Worker struct igt_fb prim_pri;
272*d83cc019SAndroid Build Coastguard Worker struct igt_fb prim_cur;
273*d83cc019SAndroid Build Coastguard Worker struct igt_fb prim_spr;
274*d83cc019SAndroid Build Coastguard Worker
275*d83cc019SAndroid Build Coastguard Worker struct igt_fb scnd_pri;
276*d83cc019SAndroid Build Coastguard Worker struct igt_fb scnd_cur;
277*d83cc019SAndroid Build Coastguard Worker struct igt_fb scnd_spr;
278*d83cc019SAndroid Build Coastguard Worker
279*d83cc019SAndroid Build Coastguard Worker struct igt_fb offscreen;
280*d83cc019SAndroid Build Coastguard Worker struct igt_fb big;
281*d83cc019SAndroid Build Coastguard Worker } fbs[FORMAT_COUNT];
282*d83cc019SAndroid Build Coastguard Worker
283*d83cc019SAndroid Build Coastguard Worker struct {
284*d83cc019SAndroid Build Coastguard Worker pthread_t thread;
285*d83cc019SAndroid Build Coastguard Worker bool stop;
286*d83cc019SAndroid Build Coastguard Worker
287*d83cc019SAndroid Build Coastguard Worker uint32_t handle;
288*d83cc019SAndroid Build Coastguard Worker uint32_t size;
289*d83cc019SAndroid Build Coastguard Worker uint32_t stride;
290*d83cc019SAndroid Build Coastguard Worker int width;
291*d83cc019SAndroid Build Coastguard Worker int height;
292*d83cc019SAndroid Build Coastguard Worker uint32_t color;
293*d83cc019SAndroid Build Coastguard Worker int bpp;
294*d83cc019SAndroid Build Coastguard Worker } busy_thread = {
295*d83cc019SAndroid Build Coastguard Worker .stop = true,
296*d83cc019SAndroid Build Coastguard Worker };
297*d83cc019SAndroid Build Coastguard Worker
get_connector_smallest_mode(igt_output_t * output)298*d83cc019SAndroid Build Coastguard Worker static const drmModeModeInfo *get_connector_smallest_mode(igt_output_t *output)
299*d83cc019SAndroid Build Coastguard Worker {
300*d83cc019SAndroid Build Coastguard Worker drmModeConnector *c = output->config.connector;
301*d83cc019SAndroid Build Coastguard Worker const drmModeModeInfo *smallest = NULL;
302*d83cc019SAndroid Build Coastguard Worker int i;
303*d83cc019SAndroid Build Coastguard Worker
304*d83cc019SAndroid Build Coastguard Worker for (i = 0; i < c->count_modes; i++) {
305*d83cc019SAndroid Build Coastguard Worker drmModeModeInfo *mode = &c->modes[i];
306*d83cc019SAndroid Build Coastguard Worker
307*d83cc019SAndroid Build Coastguard Worker if (!smallest)
308*d83cc019SAndroid Build Coastguard Worker smallest = mode;
309*d83cc019SAndroid Build Coastguard Worker
310*d83cc019SAndroid Build Coastguard Worker if (mode->hdisplay * mode->vdisplay <
311*d83cc019SAndroid Build Coastguard Worker smallest->hdisplay * smallest->vdisplay)
312*d83cc019SAndroid Build Coastguard Worker smallest = mode;
313*d83cc019SAndroid Build Coastguard Worker }
314*d83cc019SAndroid Build Coastguard Worker
315*d83cc019SAndroid Build Coastguard Worker if (c->connector_type == DRM_MODE_CONNECTOR_eDP)
316*d83cc019SAndroid Build Coastguard Worker smallest = igt_std_1024_mode_get();
317*d83cc019SAndroid Build Coastguard Worker
318*d83cc019SAndroid Build Coastguard Worker return smallest;
319*d83cc019SAndroid Build Coastguard Worker }
320*d83cc019SAndroid Build Coastguard Worker
connector_get_mode(igt_output_t * output)321*d83cc019SAndroid Build Coastguard Worker static const drmModeModeInfo *connector_get_mode(igt_output_t *output)
322*d83cc019SAndroid Build Coastguard Worker {
323*d83cc019SAndroid Build Coastguard Worker const drmModeModeInfo *mode = NULL;
324*d83cc019SAndroid Build Coastguard Worker
325*d83cc019SAndroid Build Coastguard Worker if (opt.small_modes)
326*d83cc019SAndroid Build Coastguard Worker mode = get_connector_smallest_mode(output);
327*d83cc019SAndroid Build Coastguard Worker else
328*d83cc019SAndroid Build Coastguard Worker mode = &output->config.default_mode;
329*d83cc019SAndroid Build Coastguard Worker
330*d83cc019SAndroid Build Coastguard Worker /* On HSW the CRC WA is so awful that it makes you think everything is
331*d83cc019SAndroid Build Coastguard Worker * bugged. */
332*d83cc019SAndroid Build Coastguard Worker if (IS_HASWELL(intel_get_drm_devid(drm.fd)) &&
333*d83cc019SAndroid Build Coastguard Worker output->config.connector->connector_type == DRM_MODE_CONNECTOR_eDP)
334*d83cc019SAndroid Build Coastguard Worker mode = igt_std_1024_mode_get();
335*d83cc019SAndroid Build Coastguard Worker
336*d83cc019SAndroid Build Coastguard Worker return mode;
337*d83cc019SAndroid Build Coastguard Worker }
338*d83cc019SAndroid Build Coastguard Worker
init_mode_params(struct modeset_params * params,igt_output_t * output,enum pipe pipe)339*d83cc019SAndroid Build Coastguard Worker static void init_mode_params(struct modeset_params *params,
340*d83cc019SAndroid Build Coastguard Worker igt_output_t *output, enum pipe pipe)
341*d83cc019SAndroid Build Coastguard Worker {
342*d83cc019SAndroid Build Coastguard Worker const drmModeModeInfo *mode;
343*d83cc019SAndroid Build Coastguard Worker
344*d83cc019SAndroid Build Coastguard Worker igt_output_override_mode(output, NULL);
345*d83cc019SAndroid Build Coastguard Worker mode = connector_get_mode(output);
346*d83cc019SAndroid Build Coastguard Worker
347*d83cc019SAndroid Build Coastguard Worker params->pipe = pipe;
348*d83cc019SAndroid Build Coastguard Worker params->output = output;
349*d83cc019SAndroid Build Coastguard Worker params->mode_copy = *mode;
350*d83cc019SAndroid Build Coastguard Worker params->mode = ¶ms->mode_copy;
351*d83cc019SAndroid Build Coastguard Worker
352*d83cc019SAndroid Build Coastguard Worker params->primary.plane = igt_pipe_get_plane_type(&drm.display.pipes[pipe], DRM_PLANE_TYPE_PRIMARY);
353*d83cc019SAndroid Build Coastguard Worker params->primary.fb = NULL;
354*d83cc019SAndroid Build Coastguard Worker params->primary.x = 0;
355*d83cc019SAndroid Build Coastguard Worker params->primary.y = 0;
356*d83cc019SAndroid Build Coastguard Worker params->primary.w = mode->hdisplay;
357*d83cc019SAndroid Build Coastguard Worker params->primary.h = mode->vdisplay;
358*d83cc019SAndroid Build Coastguard Worker
359*d83cc019SAndroid Build Coastguard Worker params->cursor.plane = igt_pipe_get_plane_type(&drm.display.pipes[pipe], DRM_PLANE_TYPE_CURSOR);
360*d83cc019SAndroid Build Coastguard Worker params->cursor.fb = NULL;
361*d83cc019SAndroid Build Coastguard Worker params->cursor.x = 0;
362*d83cc019SAndroid Build Coastguard Worker params->cursor.y = 0;
363*d83cc019SAndroid Build Coastguard Worker params->cursor.w = 64;
364*d83cc019SAndroid Build Coastguard Worker params->cursor.h = 64;
365*d83cc019SAndroid Build Coastguard Worker
366*d83cc019SAndroid Build Coastguard Worker params->sprite.plane = igt_pipe_get_plane_type(&drm.display.pipes[pipe], DRM_PLANE_TYPE_OVERLAY);
367*d83cc019SAndroid Build Coastguard Worker igt_require(params->sprite.plane);
368*d83cc019SAndroid Build Coastguard Worker params->sprite.fb = NULL;
369*d83cc019SAndroid Build Coastguard Worker params->sprite.x = 0;
370*d83cc019SAndroid Build Coastguard Worker params->sprite.y = 0;
371*d83cc019SAndroid Build Coastguard Worker params->sprite.w = 64;
372*d83cc019SAndroid Build Coastguard Worker params->sprite.h = 64;
373*d83cc019SAndroid Build Coastguard Worker }
374*d83cc019SAndroid Build Coastguard Worker
find_connector(bool edp_only,bool pipe_a,igt_output_t * forbidden_output,enum pipe forbidden_pipe,igt_output_t ** ret_output,enum pipe * ret_pipe)375*d83cc019SAndroid Build Coastguard Worker static bool find_connector(bool edp_only, bool pipe_a,
376*d83cc019SAndroid Build Coastguard Worker igt_output_t *forbidden_output,
377*d83cc019SAndroid Build Coastguard Worker enum pipe forbidden_pipe,
378*d83cc019SAndroid Build Coastguard Worker igt_output_t **ret_output,
379*d83cc019SAndroid Build Coastguard Worker enum pipe *ret_pipe)
380*d83cc019SAndroid Build Coastguard Worker {
381*d83cc019SAndroid Build Coastguard Worker igt_output_t *output;
382*d83cc019SAndroid Build Coastguard Worker enum pipe pipe;
383*d83cc019SAndroid Build Coastguard Worker
384*d83cc019SAndroid Build Coastguard Worker for_each_pipe_with_valid_output(&drm.display, pipe, output) {
385*d83cc019SAndroid Build Coastguard Worker drmModeConnectorPtr c = output->config.connector;
386*d83cc019SAndroid Build Coastguard Worker
387*d83cc019SAndroid Build Coastguard Worker if (edp_only && c->connector_type != DRM_MODE_CONNECTOR_eDP)
388*d83cc019SAndroid Build Coastguard Worker continue;
389*d83cc019SAndroid Build Coastguard Worker
390*d83cc019SAndroid Build Coastguard Worker if (pipe_a && pipe != PIPE_A)
391*d83cc019SAndroid Build Coastguard Worker continue;
392*d83cc019SAndroid Build Coastguard Worker
393*d83cc019SAndroid Build Coastguard Worker if (output == forbidden_output || pipe == forbidden_pipe)
394*d83cc019SAndroid Build Coastguard Worker continue;
395*d83cc019SAndroid Build Coastguard Worker
396*d83cc019SAndroid Build Coastguard Worker if (c->connector_type == DRM_MODE_CONNECTOR_eDP && opt.no_edp)
397*d83cc019SAndroid Build Coastguard Worker continue;
398*d83cc019SAndroid Build Coastguard Worker
399*d83cc019SAndroid Build Coastguard Worker *ret_output = output;
400*d83cc019SAndroid Build Coastguard Worker *ret_pipe = pipe;
401*d83cc019SAndroid Build Coastguard Worker return true;
402*d83cc019SAndroid Build Coastguard Worker }
403*d83cc019SAndroid Build Coastguard Worker
404*d83cc019SAndroid Build Coastguard Worker return false;
405*d83cc019SAndroid Build Coastguard Worker }
406*d83cc019SAndroid Build Coastguard Worker
init_modeset_cached_params(void)407*d83cc019SAndroid Build Coastguard Worker static bool init_modeset_cached_params(void)
408*d83cc019SAndroid Build Coastguard Worker {
409*d83cc019SAndroid Build Coastguard Worker igt_output_t *prim_output = NULL, *scnd_output = NULL;
410*d83cc019SAndroid Build Coastguard Worker enum pipe prim_pipe, scnd_pipe;
411*d83cc019SAndroid Build Coastguard Worker
412*d83cc019SAndroid Build Coastguard Worker /*
413*d83cc019SAndroid Build Coastguard Worker * We have this problem where PSR is only present on eDP monitors and
414*d83cc019SAndroid Build Coastguard Worker * FBC is only present on pipe A for some platforms. So we search first
415*d83cc019SAndroid Build Coastguard Worker * for the ideal case of eDP supporting pipe A, and try the less optimal
416*d83cc019SAndroid Build Coastguard Worker * configs later, sacrificing one of the features.
417*d83cc019SAndroid Build Coastguard Worker * TODO: refactor the code in a way that allows us to have different
418*d83cc019SAndroid Build Coastguard Worker * sets of prim/scnd structs for different features.
419*d83cc019SAndroid Build Coastguard Worker */
420*d83cc019SAndroid Build Coastguard Worker find_connector(true, true, NULL, PIPE_NONE, &prim_output, &prim_pipe);
421*d83cc019SAndroid Build Coastguard Worker if (!prim_output)
422*d83cc019SAndroid Build Coastguard Worker find_connector(true, false, NULL, PIPE_NONE, &prim_output, &prim_pipe);
423*d83cc019SAndroid Build Coastguard Worker if (!prim_output)
424*d83cc019SAndroid Build Coastguard Worker find_connector(false, true, NULL, PIPE_NONE, &prim_output, &prim_pipe);
425*d83cc019SAndroid Build Coastguard Worker if (!prim_output)
426*d83cc019SAndroid Build Coastguard Worker find_connector(false, false, NULL, PIPE_NONE, &prim_output, &prim_pipe);
427*d83cc019SAndroid Build Coastguard Worker
428*d83cc019SAndroid Build Coastguard Worker if (!prim_output)
429*d83cc019SAndroid Build Coastguard Worker return false;
430*d83cc019SAndroid Build Coastguard Worker
431*d83cc019SAndroid Build Coastguard Worker find_connector(false, false, prim_output, prim_pipe,
432*d83cc019SAndroid Build Coastguard Worker &scnd_output, &scnd_pipe);
433*d83cc019SAndroid Build Coastguard Worker
434*d83cc019SAndroid Build Coastguard Worker init_mode_params(&prim_mode_params, prim_output, prim_pipe);
435*d83cc019SAndroid Build Coastguard Worker
436*d83cc019SAndroid Build Coastguard Worker if (!scnd_output) {
437*d83cc019SAndroid Build Coastguard Worker scnd_mode_params.pipe = PIPE_NONE;
438*d83cc019SAndroid Build Coastguard Worker scnd_mode_params.output = NULL;
439*d83cc019SAndroid Build Coastguard Worker return true;
440*d83cc019SAndroid Build Coastguard Worker }
441*d83cc019SAndroid Build Coastguard Worker
442*d83cc019SAndroid Build Coastguard Worker init_mode_params(&scnd_mode_params, scnd_output, scnd_pipe);
443*d83cc019SAndroid Build Coastguard Worker return true;
444*d83cc019SAndroid Build Coastguard Worker }
445*d83cc019SAndroid Build Coastguard Worker
create_fb(enum pixel_format pformat,int width,int height,uint64_t tiling,int plane,struct igt_fb * fb)446*d83cc019SAndroid Build Coastguard Worker static void create_fb(enum pixel_format pformat, int width, int height,
447*d83cc019SAndroid Build Coastguard Worker uint64_t tiling, int plane, struct igt_fb *fb)
448*d83cc019SAndroid Build Coastguard Worker {
449*d83cc019SAndroid Build Coastguard Worker uint32_t format;
450*d83cc019SAndroid Build Coastguard Worker uint64_t size;
451*d83cc019SAndroid Build Coastguard Worker unsigned int stride;
452*d83cc019SAndroid Build Coastguard Worker uint64_t tiling_for_size;
453*d83cc019SAndroid Build Coastguard Worker
454*d83cc019SAndroid Build Coastguard Worker switch (pformat) {
455*d83cc019SAndroid Build Coastguard Worker case FORMAT_RGB888:
456*d83cc019SAndroid Build Coastguard Worker if (plane == PLANE_CUR)
457*d83cc019SAndroid Build Coastguard Worker format = DRM_FORMAT_ARGB8888;
458*d83cc019SAndroid Build Coastguard Worker else
459*d83cc019SAndroid Build Coastguard Worker format = DRM_FORMAT_XRGB8888;
460*d83cc019SAndroid Build Coastguard Worker break;
461*d83cc019SAndroid Build Coastguard Worker case FORMAT_RGB565:
462*d83cc019SAndroid Build Coastguard Worker /* Only the primary plane supports 16bpp! */
463*d83cc019SAndroid Build Coastguard Worker if (plane == PLANE_PRI)
464*d83cc019SAndroid Build Coastguard Worker format = DRM_FORMAT_RGB565;
465*d83cc019SAndroid Build Coastguard Worker else if (plane == PLANE_CUR)
466*d83cc019SAndroid Build Coastguard Worker format = DRM_FORMAT_ARGB8888;
467*d83cc019SAndroid Build Coastguard Worker else
468*d83cc019SAndroid Build Coastguard Worker format = DRM_FORMAT_XRGB8888;
469*d83cc019SAndroid Build Coastguard Worker break;
470*d83cc019SAndroid Build Coastguard Worker case FORMAT_RGB101010:
471*d83cc019SAndroid Build Coastguard Worker if (plane == PLANE_PRI)
472*d83cc019SAndroid Build Coastguard Worker format = DRM_FORMAT_XRGB2101010;
473*d83cc019SAndroid Build Coastguard Worker else if (plane == PLANE_CUR)
474*d83cc019SAndroid Build Coastguard Worker format = DRM_FORMAT_ARGB8888;
475*d83cc019SAndroid Build Coastguard Worker else
476*d83cc019SAndroid Build Coastguard Worker format = DRM_FORMAT_XRGB8888;
477*d83cc019SAndroid Build Coastguard Worker break;
478*d83cc019SAndroid Build Coastguard Worker default:
479*d83cc019SAndroid Build Coastguard Worker igt_assert(false);
480*d83cc019SAndroid Build Coastguard Worker }
481*d83cc019SAndroid Build Coastguard Worker
482*d83cc019SAndroid Build Coastguard Worker /* We want all frontbuffers with the same width/height/format to have
483*d83cc019SAndroid Build Coastguard Worker * the same size regardless of tiling since we want to properly exercise
484*d83cc019SAndroid Build Coastguard Worker * the Kernel's specific tiling-checking code paths without accidentally
485*d83cc019SAndroid Build Coastguard Worker * hitting size-checking ones first. */
486*d83cc019SAndroid Build Coastguard Worker if (plane == PLANE_CUR)
487*d83cc019SAndroid Build Coastguard Worker tiling_for_size = LOCAL_DRM_FORMAT_MOD_NONE;
488*d83cc019SAndroid Build Coastguard Worker else
489*d83cc019SAndroid Build Coastguard Worker tiling_for_size = opt.tiling;
490*d83cc019SAndroid Build Coastguard Worker
491*d83cc019SAndroid Build Coastguard Worker igt_calc_fb_size(drm.fd, width, height, format, tiling_for_size, &size,
492*d83cc019SAndroid Build Coastguard Worker &stride);
493*d83cc019SAndroid Build Coastguard Worker
494*d83cc019SAndroid Build Coastguard Worker igt_create_fb_with_bo_size(drm.fd, width, height, format, tiling,
495*d83cc019SAndroid Build Coastguard Worker IGT_COLOR_YCBCR_BT709,
496*d83cc019SAndroid Build Coastguard Worker IGT_COLOR_YCBCR_LIMITED_RANGE,
497*d83cc019SAndroid Build Coastguard Worker fb, size, stride);
498*d83cc019SAndroid Build Coastguard Worker }
499*d83cc019SAndroid Build Coastguard Worker
pick_color(struct igt_fb * fb,enum color ecolor)500*d83cc019SAndroid Build Coastguard Worker static uint32_t pick_color(struct igt_fb *fb, enum color ecolor)
501*d83cc019SAndroid Build Coastguard Worker {
502*d83cc019SAndroid Build Coastguard Worker uint32_t color, r, g, b, b2, a;
503*d83cc019SAndroid Build Coastguard Worker bool alpha = false;
504*d83cc019SAndroid Build Coastguard Worker
505*d83cc019SAndroid Build Coastguard Worker switch (fb->drm_format) {
506*d83cc019SAndroid Build Coastguard Worker case DRM_FORMAT_RGB565:
507*d83cc019SAndroid Build Coastguard Worker a = 0x0;
508*d83cc019SAndroid Build Coastguard Worker r = 0x1F << 11;
509*d83cc019SAndroid Build Coastguard Worker g = 0x3F << 5;
510*d83cc019SAndroid Build Coastguard Worker b = 0x1F;
511*d83cc019SAndroid Build Coastguard Worker b2 = 0x10;
512*d83cc019SAndroid Build Coastguard Worker break;
513*d83cc019SAndroid Build Coastguard Worker case DRM_FORMAT_ARGB8888:
514*d83cc019SAndroid Build Coastguard Worker alpha = true;
515*d83cc019SAndroid Build Coastguard Worker case DRM_FORMAT_XRGB8888:
516*d83cc019SAndroid Build Coastguard Worker a = 0xFF << 24;
517*d83cc019SAndroid Build Coastguard Worker r = 0xFF << 16;
518*d83cc019SAndroid Build Coastguard Worker g = 0xFF << 8;
519*d83cc019SAndroid Build Coastguard Worker b = 0xFF;
520*d83cc019SAndroid Build Coastguard Worker b2 = 0x80;
521*d83cc019SAndroid Build Coastguard Worker break;
522*d83cc019SAndroid Build Coastguard Worker case DRM_FORMAT_ARGB2101010:
523*d83cc019SAndroid Build Coastguard Worker alpha = true;
524*d83cc019SAndroid Build Coastguard Worker case DRM_FORMAT_XRGB2101010:
525*d83cc019SAndroid Build Coastguard Worker a = 0x3 << 30;
526*d83cc019SAndroid Build Coastguard Worker r = 0x3FF << 20;
527*d83cc019SAndroid Build Coastguard Worker g = 0x3FF << 10;
528*d83cc019SAndroid Build Coastguard Worker b = 0x3FF;
529*d83cc019SAndroid Build Coastguard Worker b2 = 0x200;
530*d83cc019SAndroid Build Coastguard Worker break;
531*d83cc019SAndroid Build Coastguard Worker default:
532*d83cc019SAndroid Build Coastguard Worker igt_assert(false);
533*d83cc019SAndroid Build Coastguard Worker }
534*d83cc019SAndroid Build Coastguard Worker
535*d83cc019SAndroid Build Coastguard Worker switch (ecolor) {
536*d83cc019SAndroid Build Coastguard Worker case COLOR_RED:
537*d83cc019SAndroid Build Coastguard Worker color = r;
538*d83cc019SAndroid Build Coastguard Worker break;
539*d83cc019SAndroid Build Coastguard Worker case COLOR_GREEN:
540*d83cc019SAndroid Build Coastguard Worker color = g;
541*d83cc019SAndroid Build Coastguard Worker break;
542*d83cc019SAndroid Build Coastguard Worker case COLOR_BLUE:
543*d83cc019SAndroid Build Coastguard Worker color = b;
544*d83cc019SAndroid Build Coastguard Worker break;
545*d83cc019SAndroid Build Coastguard Worker case COLOR_MAGENTA:
546*d83cc019SAndroid Build Coastguard Worker color = r | b;
547*d83cc019SAndroid Build Coastguard Worker break;
548*d83cc019SAndroid Build Coastguard Worker case COLOR_CYAN:
549*d83cc019SAndroid Build Coastguard Worker color = g | b;
550*d83cc019SAndroid Build Coastguard Worker break;
551*d83cc019SAndroid Build Coastguard Worker case COLOR_SCND_BG:
552*d83cc019SAndroid Build Coastguard Worker color = b2;
553*d83cc019SAndroid Build Coastguard Worker break;
554*d83cc019SAndroid Build Coastguard Worker default:
555*d83cc019SAndroid Build Coastguard Worker igt_assert(false);
556*d83cc019SAndroid Build Coastguard Worker }
557*d83cc019SAndroid Build Coastguard Worker
558*d83cc019SAndroid Build Coastguard Worker if (alpha)
559*d83cc019SAndroid Build Coastguard Worker color |= a;
560*d83cc019SAndroid Build Coastguard Worker
561*d83cc019SAndroid Build Coastguard Worker return color;
562*d83cc019SAndroid Build Coastguard Worker }
563*d83cc019SAndroid Build Coastguard Worker
fill_fb(struct igt_fb * fb,enum color ecolor)564*d83cc019SAndroid Build Coastguard Worker static void fill_fb(struct igt_fb *fb, enum color ecolor)
565*d83cc019SAndroid Build Coastguard Worker {
566*d83cc019SAndroid Build Coastguard Worker igt_draw_fill_fb(drm.fd, fb, pick_color(fb, ecolor));
567*d83cc019SAndroid Build Coastguard Worker }
568*d83cc019SAndroid Build Coastguard Worker
569*d83cc019SAndroid Build Coastguard Worker /*
570*d83cc019SAndroid Build Coastguard Worker * This is how the prim, scnd and offscreen FBs should be positioned inside the
571*d83cc019SAndroid Build Coastguard Worker * shared FB. The prim buffer starts at the X and Y offsets defined by
572*d83cc019SAndroid Build Coastguard Worker * opt.shared_fb_{x,y}_offset, then scnd starts at the same X pixel offset,
573*d83cc019SAndroid Build Coastguard Worker * right after prim ends on the Y axis, then the offscreen fb starts after scnd
574*d83cc019SAndroid Build Coastguard Worker * ends. Just like the picture:
575*d83cc019SAndroid Build Coastguard Worker *
576*d83cc019SAndroid Build Coastguard Worker * +-------------------------+
577*d83cc019SAndroid Build Coastguard Worker * | shared fb |
578*d83cc019SAndroid Build Coastguard Worker * | +------------------+ |
579*d83cc019SAndroid Build Coastguard Worker * | | prim | |
580*d83cc019SAndroid Build Coastguard Worker * | | | |
581*d83cc019SAndroid Build Coastguard Worker * | | | |
582*d83cc019SAndroid Build Coastguard Worker * | | | |
583*d83cc019SAndroid Build Coastguard Worker * | +------------------+--+
584*d83cc019SAndroid Build Coastguard Worker * | | scnd |
585*d83cc019SAndroid Build Coastguard Worker * | | |
586*d83cc019SAndroid Build Coastguard Worker * | | |
587*d83cc019SAndroid Build Coastguard Worker * | +---------------+-----+
588*d83cc019SAndroid Build Coastguard Worker * | | offscreen | |
589*d83cc019SAndroid Build Coastguard Worker * | | | |
590*d83cc019SAndroid Build Coastguard Worker * | | | |
591*d83cc019SAndroid Build Coastguard Worker * +---+---------------+-----+
592*d83cc019SAndroid Build Coastguard Worker *
593*d83cc019SAndroid Build Coastguard Worker * We do it vertically instead of the more common horizontal case in order to
594*d83cc019SAndroid Build Coastguard Worker * avoid super huge strides not supported by FBC.
595*d83cc019SAndroid Build Coastguard Worker */
create_shared_fb(enum pixel_format format)596*d83cc019SAndroid Build Coastguard Worker static void create_shared_fb(enum pixel_format format)
597*d83cc019SAndroid Build Coastguard Worker {
598*d83cc019SAndroid Build Coastguard Worker int prim_w, prim_h, scnd_w, scnd_h, offs_w, offs_h, big_w, big_h;
599*d83cc019SAndroid Build Coastguard Worker struct screen_fbs *s = &fbs[format];
600*d83cc019SAndroid Build Coastguard Worker
601*d83cc019SAndroid Build Coastguard Worker prim_w = prim_mode_params.mode->hdisplay;
602*d83cc019SAndroid Build Coastguard Worker prim_h = prim_mode_params.mode->vdisplay;
603*d83cc019SAndroid Build Coastguard Worker
604*d83cc019SAndroid Build Coastguard Worker if (scnd_mode_params.output) {
605*d83cc019SAndroid Build Coastguard Worker scnd_w = scnd_mode_params.mode->hdisplay;
606*d83cc019SAndroid Build Coastguard Worker scnd_h = scnd_mode_params.mode->vdisplay;
607*d83cc019SAndroid Build Coastguard Worker } else {
608*d83cc019SAndroid Build Coastguard Worker scnd_w = 0;
609*d83cc019SAndroid Build Coastguard Worker scnd_h = 0;
610*d83cc019SAndroid Build Coastguard Worker }
611*d83cc019SAndroid Build Coastguard Worker offs_w = offscreen_fb.w;
612*d83cc019SAndroid Build Coastguard Worker offs_h = offscreen_fb.h;
613*d83cc019SAndroid Build Coastguard Worker
614*d83cc019SAndroid Build Coastguard Worker big_w = prim_w;
615*d83cc019SAndroid Build Coastguard Worker if (scnd_w > big_w)
616*d83cc019SAndroid Build Coastguard Worker big_w = scnd_w;
617*d83cc019SAndroid Build Coastguard Worker if (offs_w > big_w)
618*d83cc019SAndroid Build Coastguard Worker big_w = offs_w;
619*d83cc019SAndroid Build Coastguard Worker big_w += opt.shared_fb_x_offset;
620*d83cc019SAndroid Build Coastguard Worker
621*d83cc019SAndroid Build Coastguard Worker big_h = prim_h + scnd_h + offs_h + opt.shared_fb_y_offset;
622*d83cc019SAndroid Build Coastguard Worker
623*d83cc019SAndroid Build Coastguard Worker create_fb(format, big_w, big_h, opt.tiling, PLANE_PRI, &s->big);
624*d83cc019SAndroid Build Coastguard Worker }
625*d83cc019SAndroid Build Coastguard Worker
destroy_fbs(enum pixel_format format)626*d83cc019SAndroid Build Coastguard Worker static void destroy_fbs(enum pixel_format format)
627*d83cc019SAndroid Build Coastguard Worker {
628*d83cc019SAndroid Build Coastguard Worker struct screen_fbs *s = &fbs[format];
629*d83cc019SAndroid Build Coastguard Worker
630*d83cc019SAndroid Build Coastguard Worker if (!s->initialized)
631*d83cc019SAndroid Build Coastguard Worker return;
632*d83cc019SAndroid Build Coastguard Worker
633*d83cc019SAndroid Build Coastguard Worker if (scnd_mode_params.output) {
634*d83cc019SAndroid Build Coastguard Worker igt_remove_fb(drm.fd, &s->scnd_pri);
635*d83cc019SAndroid Build Coastguard Worker igt_remove_fb(drm.fd, &s->scnd_cur);
636*d83cc019SAndroid Build Coastguard Worker igt_remove_fb(drm.fd, &s->scnd_spr);
637*d83cc019SAndroid Build Coastguard Worker }
638*d83cc019SAndroid Build Coastguard Worker igt_remove_fb(drm.fd, &s->prim_pri);
639*d83cc019SAndroid Build Coastguard Worker igt_remove_fb(drm.fd, &s->prim_cur);
640*d83cc019SAndroid Build Coastguard Worker igt_remove_fb(drm.fd, &s->prim_spr);
641*d83cc019SAndroid Build Coastguard Worker igt_remove_fb(drm.fd, &s->offscreen);
642*d83cc019SAndroid Build Coastguard Worker igt_remove_fb(drm.fd, &s->big);
643*d83cc019SAndroid Build Coastguard Worker }
644*d83cc019SAndroid Build Coastguard Worker
create_fbs(enum pixel_format format)645*d83cc019SAndroid Build Coastguard Worker static void create_fbs(enum pixel_format format)
646*d83cc019SAndroid Build Coastguard Worker {
647*d83cc019SAndroid Build Coastguard Worker struct screen_fbs *s = &fbs[format];
648*d83cc019SAndroid Build Coastguard Worker
649*d83cc019SAndroid Build Coastguard Worker if (s->initialized)
650*d83cc019SAndroid Build Coastguard Worker destroy_fbs(format);
651*d83cc019SAndroid Build Coastguard Worker
652*d83cc019SAndroid Build Coastguard Worker s->initialized = true;
653*d83cc019SAndroid Build Coastguard Worker
654*d83cc019SAndroid Build Coastguard Worker create_fb(format, prim_mode_params.mode->hdisplay,
655*d83cc019SAndroid Build Coastguard Worker prim_mode_params.mode->vdisplay, opt.tiling, PLANE_PRI,
656*d83cc019SAndroid Build Coastguard Worker &s->prim_pri);
657*d83cc019SAndroid Build Coastguard Worker create_fb(format, prim_mode_params.cursor.w,
658*d83cc019SAndroid Build Coastguard Worker prim_mode_params.cursor.h, LOCAL_DRM_FORMAT_MOD_NONE,
659*d83cc019SAndroid Build Coastguard Worker PLANE_CUR, &s->prim_cur);
660*d83cc019SAndroid Build Coastguard Worker create_fb(format, prim_mode_params.sprite.w,
661*d83cc019SAndroid Build Coastguard Worker prim_mode_params.sprite.h, opt.tiling, PLANE_SPR,
662*d83cc019SAndroid Build Coastguard Worker &s->prim_spr);
663*d83cc019SAndroid Build Coastguard Worker
664*d83cc019SAndroid Build Coastguard Worker create_fb(format, offscreen_fb.w, offscreen_fb.h, opt.tiling, PLANE_PRI,
665*d83cc019SAndroid Build Coastguard Worker &s->offscreen);
666*d83cc019SAndroid Build Coastguard Worker
667*d83cc019SAndroid Build Coastguard Worker create_shared_fb(format);
668*d83cc019SAndroid Build Coastguard Worker
669*d83cc019SAndroid Build Coastguard Worker if (!scnd_mode_params.output)
670*d83cc019SAndroid Build Coastguard Worker return;
671*d83cc019SAndroid Build Coastguard Worker
672*d83cc019SAndroid Build Coastguard Worker create_fb(format, scnd_mode_params.mode->hdisplay,
673*d83cc019SAndroid Build Coastguard Worker scnd_mode_params.mode->vdisplay, opt.tiling, PLANE_PRI,
674*d83cc019SAndroid Build Coastguard Worker &s->scnd_pri);
675*d83cc019SAndroid Build Coastguard Worker create_fb(format, scnd_mode_params.cursor.w, scnd_mode_params.cursor.h,
676*d83cc019SAndroid Build Coastguard Worker LOCAL_DRM_FORMAT_MOD_NONE, PLANE_CUR, &s->scnd_cur);
677*d83cc019SAndroid Build Coastguard Worker create_fb(format, scnd_mode_params.sprite.w, scnd_mode_params.sprite.h,
678*d83cc019SAndroid Build Coastguard Worker opt.tiling, PLANE_SPR, &s->scnd_spr);
679*d83cc019SAndroid Build Coastguard Worker }
680*d83cc019SAndroid Build Coastguard Worker
__set_prim_plane_for_params(struct modeset_params * params)681*d83cc019SAndroid Build Coastguard Worker static void __set_prim_plane_for_params(struct modeset_params *params)
682*d83cc019SAndroid Build Coastguard Worker {
683*d83cc019SAndroid Build Coastguard Worker igt_plane_set_fb(params->primary.plane, params->primary.fb);
684*d83cc019SAndroid Build Coastguard Worker igt_plane_set_position(params->primary.plane, 0, 0);
685*d83cc019SAndroid Build Coastguard Worker igt_plane_set_size(params->primary.plane, params->mode->hdisplay, params->mode->vdisplay);
686*d83cc019SAndroid Build Coastguard Worker igt_fb_set_position(params->primary.fb, params->primary.plane,
687*d83cc019SAndroid Build Coastguard Worker params->primary.x, params->primary.y);
688*d83cc019SAndroid Build Coastguard Worker igt_fb_set_size(params->primary.fb, params->primary.plane,
689*d83cc019SAndroid Build Coastguard Worker params->mode->hdisplay, params->mode->vdisplay);
690*d83cc019SAndroid Build Coastguard Worker }
691*d83cc019SAndroid Build Coastguard Worker
__set_mode_for_params(struct modeset_params * params)692*d83cc019SAndroid Build Coastguard Worker static void __set_mode_for_params(struct modeset_params *params)
693*d83cc019SAndroid Build Coastguard Worker {
694*d83cc019SAndroid Build Coastguard Worker igt_output_override_mode(params->output, params->mode);
695*d83cc019SAndroid Build Coastguard Worker igt_output_set_pipe(params->output, params->pipe);
696*d83cc019SAndroid Build Coastguard Worker
697*d83cc019SAndroid Build Coastguard Worker __set_prim_plane_for_params(params);
698*d83cc019SAndroid Build Coastguard Worker }
699*d83cc019SAndroid Build Coastguard Worker
set_mode_for_params(struct modeset_params * params)700*d83cc019SAndroid Build Coastguard Worker static void set_mode_for_params(struct modeset_params *params)
701*d83cc019SAndroid Build Coastguard Worker {
702*d83cc019SAndroid Build Coastguard Worker __set_mode_for_params(params);
703*d83cc019SAndroid Build Coastguard Worker igt_display_commit(&drm.display);
704*d83cc019SAndroid Build Coastguard Worker }
705*d83cc019SAndroid Build Coastguard Worker
__debugfs_read(const char * param,char * buf,int len)706*d83cc019SAndroid Build Coastguard Worker static void __debugfs_read(const char *param, char *buf, int len)
707*d83cc019SAndroid Build Coastguard Worker {
708*d83cc019SAndroid Build Coastguard Worker len = igt_debugfs_simple_read(drm.debugfs, param, buf, len);
709*d83cc019SAndroid Build Coastguard Worker if (len < 0)
710*d83cc019SAndroid Build Coastguard Worker igt_assert_eq(len, -ENODEV);
711*d83cc019SAndroid Build Coastguard Worker }
712*d83cc019SAndroid Build Coastguard Worker
__debugfs_write(const char * param,char * buf,int len)713*d83cc019SAndroid Build Coastguard Worker static int __debugfs_write(const char *param, char *buf, int len)
714*d83cc019SAndroid Build Coastguard Worker {
715*d83cc019SAndroid Build Coastguard Worker return igt_sysfs_write(drm.debugfs, param, buf, len - 1);
716*d83cc019SAndroid Build Coastguard Worker }
717*d83cc019SAndroid Build Coastguard Worker
718*d83cc019SAndroid Build Coastguard Worker #define debugfs_read(p, arr) __debugfs_read(p, arr, sizeof(arr))
719*d83cc019SAndroid Build Coastguard Worker #define debugfs_write(p, arr) __debugfs_write(p, arr, sizeof(arr))
720*d83cc019SAndroid Build Coastguard Worker
721*d83cc019SAndroid Build Coastguard Worker static char last_fbc_buf[128];
722*d83cc019SAndroid Build Coastguard Worker
fbc_is_enabled(int lvl)723*d83cc019SAndroid Build Coastguard Worker static bool fbc_is_enabled(int lvl)
724*d83cc019SAndroid Build Coastguard Worker {
725*d83cc019SAndroid Build Coastguard Worker char buf[128];
726*d83cc019SAndroid Build Coastguard Worker bool print = true;
727*d83cc019SAndroid Build Coastguard Worker
728*d83cc019SAndroid Build Coastguard Worker debugfs_read("i915_fbc_status", buf);
729*d83cc019SAndroid Build Coastguard Worker if (lvl != IGT_LOG_DEBUG)
730*d83cc019SAndroid Build Coastguard Worker last_fbc_buf[0] = '\0';
731*d83cc019SAndroid Build Coastguard Worker else if (strcmp(last_fbc_buf, buf))
732*d83cc019SAndroid Build Coastguard Worker strcpy(last_fbc_buf, buf);
733*d83cc019SAndroid Build Coastguard Worker else
734*d83cc019SAndroid Build Coastguard Worker print = false;
735*d83cc019SAndroid Build Coastguard Worker
736*d83cc019SAndroid Build Coastguard Worker if (print)
737*d83cc019SAndroid Build Coastguard Worker igt_log(IGT_LOG_DOMAIN, lvl, "fbc_is_enabled()?\n%s", buf);
738*d83cc019SAndroid Build Coastguard Worker
739*d83cc019SAndroid Build Coastguard Worker return strstr(buf, "FBC enabled\n");
740*d83cc019SAndroid Build Coastguard Worker }
741*d83cc019SAndroid Build Coastguard Worker
drrs_set(unsigned int val)742*d83cc019SAndroid Build Coastguard Worker static void drrs_set(unsigned int val)
743*d83cc019SAndroid Build Coastguard Worker {
744*d83cc019SAndroid Build Coastguard Worker char buf[2];
745*d83cc019SAndroid Build Coastguard Worker int ret;
746*d83cc019SAndroid Build Coastguard Worker
747*d83cc019SAndroid Build Coastguard Worker igt_debug("Manually %sabling DRRS. %u\n", val ? "en" : "dis", val);
748*d83cc019SAndroid Build Coastguard Worker snprintf(buf, sizeof(buf), "%d", val);
749*d83cc019SAndroid Build Coastguard Worker ret = debugfs_write("i915_drrs_ctl", buf);
750*d83cc019SAndroid Build Coastguard Worker
751*d83cc019SAndroid Build Coastguard Worker /*
752*d83cc019SAndroid Build Coastguard Worker * drrs_enable() is called on DRRS capable platform only,
753*d83cc019SAndroid Build Coastguard Worker * whereas drrs_disable() is called on all platforms.
754*d83cc019SAndroid Build Coastguard Worker * So handle the failure of debugfs_write only for drrs_enable().
755*d83cc019SAndroid Build Coastguard Worker */
756*d83cc019SAndroid Build Coastguard Worker if (val)
757*d83cc019SAndroid Build Coastguard Worker igt_assert_f(ret == (sizeof(buf) - 1), "debugfs_write failed");
758*d83cc019SAndroid Build Coastguard Worker }
759*d83cc019SAndroid Build Coastguard Worker
is_drrs_high(void)760*d83cc019SAndroid Build Coastguard Worker static bool is_drrs_high(void)
761*d83cc019SAndroid Build Coastguard Worker {
762*d83cc019SAndroid Build Coastguard Worker char buf[MAX_DRRS_STATUS_BUF_LEN];
763*d83cc019SAndroid Build Coastguard Worker
764*d83cc019SAndroid Build Coastguard Worker debugfs_read("i915_drrs_status", buf);
765*d83cc019SAndroid Build Coastguard Worker return strstr(buf, "DRRS_HIGH_RR");
766*d83cc019SAndroid Build Coastguard Worker }
767*d83cc019SAndroid Build Coastguard Worker
is_drrs_low(void)768*d83cc019SAndroid Build Coastguard Worker static bool is_drrs_low(void)
769*d83cc019SAndroid Build Coastguard Worker {
770*d83cc019SAndroid Build Coastguard Worker char buf[MAX_DRRS_STATUS_BUF_LEN];
771*d83cc019SAndroid Build Coastguard Worker
772*d83cc019SAndroid Build Coastguard Worker debugfs_read("i915_drrs_status", buf);
773*d83cc019SAndroid Build Coastguard Worker return strstr(buf, "DRRS_LOW_RR");
774*d83cc019SAndroid Build Coastguard Worker }
775*d83cc019SAndroid Build Coastguard Worker
is_drrs_supported(void)776*d83cc019SAndroid Build Coastguard Worker static bool is_drrs_supported(void)
777*d83cc019SAndroid Build Coastguard Worker {
778*d83cc019SAndroid Build Coastguard Worker char buf[MAX_DRRS_STATUS_BUF_LEN];
779*d83cc019SAndroid Build Coastguard Worker
780*d83cc019SAndroid Build Coastguard Worker debugfs_read("i915_drrs_status", buf);
781*d83cc019SAndroid Build Coastguard Worker return strstr(buf, "DRRS Supported: Yes");
782*d83cc019SAndroid Build Coastguard Worker }
783*d83cc019SAndroid Build Coastguard Worker
is_drrs_inactive(void)784*d83cc019SAndroid Build Coastguard Worker static bool is_drrs_inactive(void)
785*d83cc019SAndroid Build Coastguard Worker {
786*d83cc019SAndroid Build Coastguard Worker char buf[MAX_DRRS_STATUS_BUF_LEN];
787*d83cc019SAndroid Build Coastguard Worker
788*d83cc019SAndroid Build Coastguard Worker debugfs_read("i915_drrs_status", buf);
789*d83cc019SAndroid Build Coastguard Worker
790*d83cc019SAndroid Build Coastguard Worker if (strstr(buf, "DRRS_State: "))
791*d83cc019SAndroid Build Coastguard Worker return false;
792*d83cc019SAndroid Build Coastguard Worker
793*d83cc019SAndroid Build Coastguard Worker return true;
794*d83cc019SAndroid Build Coastguard Worker }
795*d83cc019SAndroid Build Coastguard Worker
drrs_print_status(void)796*d83cc019SAndroid Build Coastguard Worker static void drrs_print_status(void)
797*d83cc019SAndroid Build Coastguard Worker {
798*d83cc019SAndroid Build Coastguard Worker char buf[MAX_DRRS_STATUS_BUF_LEN];
799*d83cc019SAndroid Build Coastguard Worker
800*d83cc019SAndroid Build Coastguard Worker debugfs_read("i915_drrs_status", buf);
801*d83cc019SAndroid Build Coastguard Worker igt_info("DRRS STATUS :\n%s\n", buf);
802*d83cc019SAndroid Build Coastguard Worker }
803*d83cc019SAndroid Build Coastguard Worker
fbc_get_last_action(void)804*d83cc019SAndroid Build Coastguard Worker static struct timespec fbc_get_last_action(void)
805*d83cc019SAndroid Build Coastguard Worker {
806*d83cc019SAndroid Build Coastguard Worker struct timespec ret = { 0, 0 };
807*d83cc019SAndroid Build Coastguard Worker char buf[128];
808*d83cc019SAndroid Build Coastguard Worker char *action;
809*d83cc019SAndroid Build Coastguard Worker ssize_t n_read;
810*d83cc019SAndroid Build Coastguard Worker
811*d83cc019SAndroid Build Coastguard Worker debugfs_read("i915_fbc_status", buf);
812*d83cc019SAndroid Build Coastguard Worker
813*d83cc019SAndroid Build Coastguard Worker action = strstr(buf, "\nLast action:");
814*d83cc019SAndroid Build Coastguard Worker igt_assert(action);
815*d83cc019SAndroid Build Coastguard Worker
816*d83cc019SAndroid Build Coastguard Worker n_read = sscanf(action, "Last action: %ld.%ld",
817*d83cc019SAndroid Build Coastguard Worker &ret.tv_sec, &ret.tv_nsec);
818*d83cc019SAndroid Build Coastguard Worker igt_assert(n_read == 2);
819*d83cc019SAndroid Build Coastguard Worker
820*d83cc019SAndroid Build Coastguard Worker return ret;
821*d83cc019SAndroid Build Coastguard Worker }
822*d83cc019SAndroid Build Coastguard Worker
fbc_last_action_changed(void)823*d83cc019SAndroid Build Coastguard Worker static bool fbc_last_action_changed(void)
824*d83cc019SAndroid Build Coastguard Worker {
825*d83cc019SAndroid Build Coastguard Worker struct timespec t_new, t_old;
826*d83cc019SAndroid Build Coastguard Worker
827*d83cc019SAndroid Build Coastguard Worker t_old = fbc.last_action;
828*d83cc019SAndroid Build Coastguard Worker t_new = fbc_get_last_action();
829*d83cc019SAndroid Build Coastguard Worker
830*d83cc019SAndroid Build Coastguard Worker fbc.last_action = t_new;
831*d83cc019SAndroid Build Coastguard Worker
832*d83cc019SAndroid Build Coastguard Worker #if 0
833*d83cc019SAndroid Build Coastguard Worker igt_info("old: %ld.%ld\n", t_old.tv_sec, t_old.tv_nsec);
834*d83cc019SAndroid Build Coastguard Worker igt_info("new: %ld.%ld\n", t_new.tv_sec, t_new.tv_nsec);
835*d83cc019SAndroid Build Coastguard Worker #endif
836*d83cc019SAndroid Build Coastguard Worker
837*d83cc019SAndroid Build Coastguard Worker return t_old.tv_sec != t_new.tv_sec ||
838*d83cc019SAndroid Build Coastguard Worker t_old.tv_nsec != t_new.tv_nsec;
839*d83cc019SAndroid Build Coastguard Worker }
840*d83cc019SAndroid Build Coastguard Worker
fbc_update_last_action(void)841*d83cc019SAndroid Build Coastguard Worker static void fbc_update_last_action(void)
842*d83cc019SAndroid Build Coastguard Worker {
843*d83cc019SAndroid Build Coastguard Worker if (!fbc.supports_last_action)
844*d83cc019SAndroid Build Coastguard Worker return;
845*d83cc019SAndroid Build Coastguard Worker
846*d83cc019SAndroid Build Coastguard Worker fbc.last_action = fbc_get_last_action();
847*d83cc019SAndroid Build Coastguard Worker
848*d83cc019SAndroid Build Coastguard Worker #if 0
849*d83cc019SAndroid Build Coastguard Worker igt_info("Last action: %ld.%ld\n",
850*d83cc019SAndroid Build Coastguard Worker fbc.last_action.tv_sec, fbc.last_action.tv_nsec);
851*d83cc019SAndroid Build Coastguard Worker #endif
852*d83cc019SAndroid Build Coastguard Worker }
853*d83cc019SAndroid Build Coastguard Worker
fbc_setup_last_action(void)854*d83cc019SAndroid Build Coastguard Worker static void fbc_setup_last_action(void)
855*d83cc019SAndroid Build Coastguard Worker {
856*d83cc019SAndroid Build Coastguard Worker ssize_t n_read;
857*d83cc019SAndroid Build Coastguard Worker char buf[128];
858*d83cc019SAndroid Build Coastguard Worker char *action;
859*d83cc019SAndroid Build Coastguard Worker
860*d83cc019SAndroid Build Coastguard Worker debugfs_read("i915_fbc_status", buf);
861*d83cc019SAndroid Build Coastguard Worker
862*d83cc019SAndroid Build Coastguard Worker action = strstr(buf, "\nLast action:");
863*d83cc019SAndroid Build Coastguard Worker if (!action) {
864*d83cc019SAndroid Build Coastguard Worker igt_info("FBC last action not supported\n");
865*d83cc019SAndroid Build Coastguard Worker return;
866*d83cc019SAndroid Build Coastguard Worker }
867*d83cc019SAndroid Build Coastguard Worker
868*d83cc019SAndroid Build Coastguard Worker fbc.supports_last_action = true;
869*d83cc019SAndroid Build Coastguard Worker
870*d83cc019SAndroid Build Coastguard Worker n_read = sscanf(action, "Last action: %ld.%ld",
871*d83cc019SAndroid Build Coastguard Worker &fbc.last_action.tv_sec, &fbc.last_action.tv_nsec);
872*d83cc019SAndroid Build Coastguard Worker igt_assert(n_read == 2);
873*d83cc019SAndroid Build Coastguard Worker }
874*d83cc019SAndroid Build Coastguard Worker
fbc_is_compressing(void)875*d83cc019SAndroid Build Coastguard Worker static bool fbc_is_compressing(void)
876*d83cc019SAndroid Build Coastguard Worker {
877*d83cc019SAndroid Build Coastguard Worker char buf[128];
878*d83cc019SAndroid Build Coastguard Worker
879*d83cc019SAndroid Build Coastguard Worker debugfs_read("i915_fbc_status", buf);
880*d83cc019SAndroid Build Coastguard Worker return strstr(buf, "\nCompressing: yes\n") != NULL;
881*d83cc019SAndroid Build Coastguard Worker }
882*d83cc019SAndroid Build Coastguard Worker
fbc_wait_for_compression(void)883*d83cc019SAndroid Build Coastguard Worker static bool fbc_wait_for_compression(void)
884*d83cc019SAndroid Build Coastguard Worker {
885*d83cc019SAndroid Build Coastguard Worker return igt_wait(fbc_is_compressing(), 2000, 1);
886*d83cc019SAndroid Build Coastguard Worker }
887*d83cc019SAndroid Build Coastguard Worker
fbc_not_enough_stolen(void)888*d83cc019SAndroid Build Coastguard Worker static bool fbc_not_enough_stolen(void)
889*d83cc019SAndroid Build Coastguard Worker {
890*d83cc019SAndroid Build Coastguard Worker char buf[128];
891*d83cc019SAndroid Build Coastguard Worker
892*d83cc019SAndroid Build Coastguard Worker debugfs_read("i915_fbc_status", buf);
893*d83cc019SAndroid Build Coastguard Worker return strstr(buf, "FBC disabled: not enough stolen memory\n");
894*d83cc019SAndroid Build Coastguard Worker }
895*d83cc019SAndroid Build Coastguard Worker
fbc_stride_not_supported(void)896*d83cc019SAndroid Build Coastguard Worker static bool fbc_stride_not_supported(void)
897*d83cc019SAndroid Build Coastguard Worker {
898*d83cc019SAndroid Build Coastguard Worker char buf[128];
899*d83cc019SAndroid Build Coastguard Worker
900*d83cc019SAndroid Build Coastguard Worker debugfs_read("i915_fbc_status", buf);
901*d83cc019SAndroid Build Coastguard Worker return strstr(buf, "FBC disabled: framebuffer stride not supported\n");
902*d83cc019SAndroid Build Coastguard Worker }
903*d83cc019SAndroid Build Coastguard Worker
fbc_mode_too_large(void)904*d83cc019SAndroid Build Coastguard Worker static bool fbc_mode_too_large(void)
905*d83cc019SAndroid Build Coastguard Worker {
906*d83cc019SAndroid Build Coastguard Worker char buf[128];
907*d83cc019SAndroid Build Coastguard Worker
908*d83cc019SAndroid Build Coastguard Worker debugfs_read("i915_fbc_status", buf);
909*d83cc019SAndroid Build Coastguard Worker return strstr(buf, "FBC disabled: mode too large for compression\n");
910*d83cc019SAndroid Build Coastguard Worker }
911*d83cc019SAndroid Build Coastguard Worker
fbc_wait_until_enabled(void)912*d83cc019SAndroid Build Coastguard Worker static bool fbc_wait_until_enabled(void)
913*d83cc019SAndroid Build Coastguard Worker {
914*d83cc019SAndroid Build Coastguard Worker last_fbc_buf[0] = '\0';
915*d83cc019SAndroid Build Coastguard Worker
916*d83cc019SAndroid Build Coastguard Worker return igt_wait(fbc_is_enabled(IGT_LOG_DEBUG), 2000, 1);
917*d83cc019SAndroid Build Coastguard Worker }
918*d83cc019SAndroid Build Coastguard Worker
drrs_wait_until_rr_switch_to_low(void)919*d83cc019SAndroid Build Coastguard Worker static bool drrs_wait_until_rr_switch_to_low(void)
920*d83cc019SAndroid Build Coastguard Worker {
921*d83cc019SAndroid Build Coastguard Worker return igt_wait(is_drrs_low(), 5000, 1);
922*d83cc019SAndroid Build Coastguard Worker }
923*d83cc019SAndroid Build Coastguard Worker
924*d83cc019SAndroid Build Coastguard Worker #define fbc_enable() igt_set_module_param_int("enable_fbc", 1)
925*d83cc019SAndroid Build Coastguard Worker #define fbc_disable() igt_set_module_param_int("enable_fbc", 0)
926*d83cc019SAndroid Build Coastguard Worker #define drrs_enable() drrs_set(1)
927*d83cc019SAndroid Build Coastguard Worker #define drrs_disable() drrs_set(0)
928*d83cc019SAndroid Build Coastguard Worker
pat1_get_rect(struct fb_region * fb,int r)929*d83cc019SAndroid Build Coastguard Worker static struct rect pat1_get_rect(struct fb_region *fb, int r)
930*d83cc019SAndroid Build Coastguard Worker {
931*d83cc019SAndroid Build Coastguard Worker struct rect rect;
932*d83cc019SAndroid Build Coastguard Worker
933*d83cc019SAndroid Build Coastguard Worker switch (r) {
934*d83cc019SAndroid Build Coastguard Worker case 0:
935*d83cc019SAndroid Build Coastguard Worker rect.x = 0;
936*d83cc019SAndroid Build Coastguard Worker rect.y = 0;
937*d83cc019SAndroid Build Coastguard Worker rect.w = fb->w / 8;
938*d83cc019SAndroid Build Coastguard Worker rect.h = fb->h / 8;
939*d83cc019SAndroid Build Coastguard Worker rect.color = pick_color(fb->fb, COLOR_GREEN);
940*d83cc019SAndroid Build Coastguard Worker break;
941*d83cc019SAndroid Build Coastguard Worker case 1:
942*d83cc019SAndroid Build Coastguard Worker rect.x = fb->w / 8 * 4;
943*d83cc019SAndroid Build Coastguard Worker rect.y = fb->h / 8 * 4;
944*d83cc019SAndroid Build Coastguard Worker rect.w = fb->w / 8 * 2;
945*d83cc019SAndroid Build Coastguard Worker rect.h = fb->h / 8 * 2;
946*d83cc019SAndroid Build Coastguard Worker rect.color = pick_color(fb->fb, COLOR_RED);
947*d83cc019SAndroid Build Coastguard Worker break;
948*d83cc019SAndroid Build Coastguard Worker case 2:
949*d83cc019SAndroid Build Coastguard Worker rect.x = fb->w / 16 + 1;
950*d83cc019SAndroid Build Coastguard Worker rect.y = fb->h / 16 + 1;
951*d83cc019SAndroid Build Coastguard Worker rect.w = fb->w / 8 + 1;
952*d83cc019SAndroid Build Coastguard Worker rect.h = fb->h / 8 + 1;
953*d83cc019SAndroid Build Coastguard Worker rect.color = pick_color(fb->fb, COLOR_MAGENTA);
954*d83cc019SAndroid Build Coastguard Worker break;
955*d83cc019SAndroid Build Coastguard Worker case 3:
956*d83cc019SAndroid Build Coastguard Worker rect.x = fb->w - 1;
957*d83cc019SAndroid Build Coastguard Worker rect.y = fb->h - 1;
958*d83cc019SAndroid Build Coastguard Worker rect.w = 1;
959*d83cc019SAndroid Build Coastguard Worker rect.h = 1;
960*d83cc019SAndroid Build Coastguard Worker rect.color = pick_color(fb->fb, COLOR_CYAN);
961*d83cc019SAndroid Build Coastguard Worker break;
962*d83cc019SAndroid Build Coastguard Worker default:
963*d83cc019SAndroid Build Coastguard Worker igt_assert(false);
964*d83cc019SAndroid Build Coastguard Worker }
965*d83cc019SAndroid Build Coastguard Worker
966*d83cc019SAndroid Build Coastguard Worker return rect;
967*d83cc019SAndroid Build Coastguard Worker }
968*d83cc019SAndroid Build Coastguard Worker
pat2_get_rect(struct fb_region * fb,int r)969*d83cc019SAndroid Build Coastguard Worker static struct rect pat2_get_rect(struct fb_region *fb, int r)
970*d83cc019SAndroid Build Coastguard Worker {
971*d83cc019SAndroid Build Coastguard Worker struct rect rect;
972*d83cc019SAndroid Build Coastguard Worker
973*d83cc019SAndroid Build Coastguard Worker rect.x = 0;
974*d83cc019SAndroid Build Coastguard Worker rect.y = 0;
975*d83cc019SAndroid Build Coastguard Worker rect.w = 64;
976*d83cc019SAndroid Build Coastguard Worker rect.h = 64;
977*d83cc019SAndroid Build Coastguard Worker
978*d83cc019SAndroid Build Coastguard Worker switch (r) {
979*d83cc019SAndroid Build Coastguard Worker case 0:
980*d83cc019SAndroid Build Coastguard Worker rect.color = pick_color(fb->fb, COLOR_GREEN);
981*d83cc019SAndroid Build Coastguard Worker break;
982*d83cc019SAndroid Build Coastguard Worker case 1:
983*d83cc019SAndroid Build Coastguard Worker rect.x = 31;
984*d83cc019SAndroid Build Coastguard Worker rect.y = 31;
985*d83cc019SAndroid Build Coastguard Worker rect.w = 31;
986*d83cc019SAndroid Build Coastguard Worker rect.h = 31;
987*d83cc019SAndroid Build Coastguard Worker rect.color = pick_color(fb->fb, COLOR_RED);
988*d83cc019SAndroid Build Coastguard Worker break;
989*d83cc019SAndroid Build Coastguard Worker case 2:
990*d83cc019SAndroid Build Coastguard Worker rect.x = 16;
991*d83cc019SAndroid Build Coastguard Worker rect.y = 16;
992*d83cc019SAndroid Build Coastguard Worker rect.w = 32;
993*d83cc019SAndroid Build Coastguard Worker rect.h = 32;
994*d83cc019SAndroid Build Coastguard Worker rect.color = pick_color(fb->fb, COLOR_MAGENTA);
995*d83cc019SAndroid Build Coastguard Worker break;
996*d83cc019SAndroid Build Coastguard Worker case 3:
997*d83cc019SAndroid Build Coastguard Worker rect.color = pick_color(fb->fb, COLOR_CYAN);
998*d83cc019SAndroid Build Coastguard Worker break;
999*d83cc019SAndroid Build Coastguard Worker default:
1000*d83cc019SAndroid Build Coastguard Worker igt_assert(false);
1001*d83cc019SAndroid Build Coastguard Worker }
1002*d83cc019SAndroid Build Coastguard Worker
1003*d83cc019SAndroid Build Coastguard Worker return rect;
1004*d83cc019SAndroid Build Coastguard Worker }
1005*d83cc019SAndroid Build Coastguard Worker
pat3_get_rect(struct fb_region * fb,int r)1006*d83cc019SAndroid Build Coastguard Worker static struct rect pat3_get_rect(struct fb_region *fb, int r)
1007*d83cc019SAndroid Build Coastguard Worker {
1008*d83cc019SAndroid Build Coastguard Worker struct rect rect;
1009*d83cc019SAndroid Build Coastguard Worker
1010*d83cc019SAndroid Build Coastguard Worker rect.w = 64;
1011*d83cc019SAndroid Build Coastguard Worker rect.h = 64;
1012*d83cc019SAndroid Build Coastguard Worker rect.color = pick_color(fb->fb, COLOR_GREEN);
1013*d83cc019SAndroid Build Coastguard Worker
1014*d83cc019SAndroid Build Coastguard Worker switch (r) {
1015*d83cc019SAndroid Build Coastguard Worker case 0:
1016*d83cc019SAndroid Build Coastguard Worker rect.x = 0;
1017*d83cc019SAndroid Build Coastguard Worker rect.y = 0;
1018*d83cc019SAndroid Build Coastguard Worker break;
1019*d83cc019SAndroid Build Coastguard Worker case 1:
1020*d83cc019SAndroid Build Coastguard Worker rect.x = 64;
1021*d83cc019SAndroid Build Coastguard Worker rect.y = 64;
1022*d83cc019SAndroid Build Coastguard Worker break;
1023*d83cc019SAndroid Build Coastguard Worker case 2:
1024*d83cc019SAndroid Build Coastguard Worker rect.x = 1;
1025*d83cc019SAndroid Build Coastguard Worker rect.y = 1;
1026*d83cc019SAndroid Build Coastguard Worker break;
1027*d83cc019SAndroid Build Coastguard Worker case 3:
1028*d83cc019SAndroid Build Coastguard Worker rect.x = fb->w - 64;
1029*d83cc019SAndroid Build Coastguard Worker rect.y = fb->h - 64;
1030*d83cc019SAndroid Build Coastguard Worker break;
1031*d83cc019SAndroid Build Coastguard Worker case 4:
1032*d83cc019SAndroid Build Coastguard Worker rect.x = fb->w / 2 - 32;
1033*d83cc019SAndroid Build Coastguard Worker rect.y = fb->h / 2 - 32;
1034*d83cc019SAndroid Build Coastguard Worker break;
1035*d83cc019SAndroid Build Coastguard Worker default:
1036*d83cc019SAndroid Build Coastguard Worker igt_assert(false);
1037*d83cc019SAndroid Build Coastguard Worker }
1038*d83cc019SAndroid Build Coastguard Worker
1039*d83cc019SAndroid Build Coastguard Worker return rect;
1040*d83cc019SAndroid Build Coastguard Worker }
1041*d83cc019SAndroid Build Coastguard Worker
pat4_get_rect(struct fb_region * fb,int r)1042*d83cc019SAndroid Build Coastguard Worker static struct rect pat4_get_rect(struct fb_region *fb, int r)
1043*d83cc019SAndroid Build Coastguard Worker {
1044*d83cc019SAndroid Build Coastguard Worker struct rect rect;
1045*d83cc019SAndroid Build Coastguard Worker
1046*d83cc019SAndroid Build Coastguard Worker igt_assert_eq(r, 0);
1047*d83cc019SAndroid Build Coastguard Worker
1048*d83cc019SAndroid Build Coastguard Worker rect.x = 0;
1049*d83cc019SAndroid Build Coastguard Worker rect.y = 0;
1050*d83cc019SAndroid Build Coastguard Worker rect.w = fb->w;
1051*d83cc019SAndroid Build Coastguard Worker rect.h = fb->h;
1052*d83cc019SAndroid Build Coastguard Worker rect.color = pick_color(fb->fb, COLOR_GREEN);
1053*d83cc019SAndroid Build Coastguard Worker
1054*d83cc019SAndroid Build Coastguard Worker return rect;
1055*d83cc019SAndroid Build Coastguard Worker }
1056*d83cc019SAndroid Build Coastguard Worker
fb_dirty_ioctl(struct fb_region * fb,struct rect * rect)1057*d83cc019SAndroid Build Coastguard Worker static void fb_dirty_ioctl(struct fb_region *fb, struct rect *rect)
1058*d83cc019SAndroid Build Coastguard Worker {
1059*d83cc019SAndroid Build Coastguard Worker int rc;
1060*d83cc019SAndroid Build Coastguard Worker drmModeClip clip = {
1061*d83cc019SAndroid Build Coastguard Worker .x1 = rect->x,
1062*d83cc019SAndroid Build Coastguard Worker .x2 = rect->x + rect->w,
1063*d83cc019SAndroid Build Coastguard Worker .y1 = rect->y,
1064*d83cc019SAndroid Build Coastguard Worker .y2 = rect->y + rect->h,
1065*d83cc019SAndroid Build Coastguard Worker };
1066*d83cc019SAndroid Build Coastguard Worker
1067*d83cc019SAndroid Build Coastguard Worker rc = drmModeDirtyFB(drm.fd, fb->fb->fb_id, &clip, 1);
1068*d83cc019SAndroid Build Coastguard Worker
1069*d83cc019SAndroid Build Coastguard Worker igt_assert(rc == 0 || rc == -ENOSYS);
1070*d83cc019SAndroid Build Coastguard Worker }
1071*d83cc019SAndroid Build Coastguard Worker
draw_rect(struct draw_pattern_info * pattern,struct fb_region * fb,enum igt_draw_method method,int r)1072*d83cc019SAndroid Build Coastguard Worker static void draw_rect(struct draw_pattern_info *pattern, struct fb_region *fb,
1073*d83cc019SAndroid Build Coastguard Worker enum igt_draw_method method, int r)
1074*d83cc019SAndroid Build Coastguard Worker {
1075*d83cc019SAndroid Build Coastguard Worker struct rect rect = pattern->get_rect(fb, r);
1076*d83cc019SAndroid Build Coastguard Worker
1077*d83cc019SAndroid Build Coastguard Worker igt_draw_rect_fb(drm.fd, drm.bufmgr, NULL, fb->fb, method,
1078*d83cc019SAndroid Build Coastguard Worker fb->x + rect.x, fb->y + rect.y,
1079*d83cc019SAndroid Build Coastguard Worker rect.w, rect.h, rect.color);
1080*d83cc019SAndroid Build Coastguard Worker
1081*d83cc019SAndroid Build Coastguard Worker fb_dirty_ioctl(fb, &rect);
1082*d83cc019SAndroid Build Coastguard Worker }
1083*d83cc019SAndroid Build Coastguard Worker
draw_rect_igt_fb(struct draw_pattern_info * pattern,struct igt_fb * fb,enum igt_draw_method method,int r)1084*d83cc019SAndroid Build Coastguard Worker static void draw_rect_igt_fb(struct draw_pattern_info *pattern,
1085*d83cc019SAndroid Build Coastguard Worker struct igt_fb *fb, enum igt_draw_method method,
1086*d83cc019SAndroid Build Coastguard Worker int r)
1087*d83cc019SAndroid Build Coastguard Worker {
1088*d83cc019SAndroid Build Coastguard Worker struct fb_region region = {
1089*d83cc019SAndroid Build Coastguard Worker .fb = fb,
1090*d83cc019SAndroid Build Coastguard Worker .x = 0,
1091*d83cc019SAndroid Build Coastguard Worker .y = 0,
1092*d83cc019SAndroid Build Coastguard Worker .w = fb->width,
1093*d83cc019SAndroid Build Coastguard Worker .h = fb->height,
1094*d83cc019SAndroid Build Coastguard Worker };
1095*d83cc019SAndroid Build Coastguard Worker
1096*d83cc019SAndroid Build Coastguard Worker draw_rect(pattern, ®ion, method, r);
1097*d83cc019SAndroid Build Coastguard Worker }
1098*d83cc019SAndroid Build Coastguard Worker
fill_fb_region(struct fb_region * region,enum color ecolor)1099*d83cc019SAndroid Build Coastguard Worker static void fill_fb_region(struct fb_region *region, enum color ecolor)
1100*d83cc019SAndroid Build Coastguard Worker {
1101*d83cc019SAndroid Build Coastguard Worker uint32_t color = pick_color(region->fb, ecolor);
1102*d83cc019SAndroid Build Coastguard Worker
1103*d83cc019SAndroid Build Coastguard Worker igt_draw_rect_fb(drm.fd, drm.bufmgr, NULL, region->fb, IGT_DRAW_BLT,
1104*d83cc019SAndroid Build Coastguard Worker region->x, region->y, region->w, region->h,
1105*d83cc019SAndroid Build Coastguard Worker color);
1106*d83cc019SAndroid Build Coastguard Worker }
1107*d83cc019SAndroid Build Coastguard Worker
unset_all_crtcs(void)1108*d83cc019SAndroid Build Coastguard Worker static void unset_all_crtcs(void)
1109*d83cc019SAndroid Build Coastguard Worker {
1110*d83cc019SAndroid Build Coastguard Worker igt_display_reset(&drm.display);
1111*d83cc019SAndroid Build Coastguard Worker igt_display_commit(&drm.display);
1112*d83cc019SAndroid Build Coastguard Worker }
1113*d83cc019SAndroid Build Coastguard Worker
disable_features(const struct test_mode * t)1114*d83cc019SAndroid Build Coastguard Worker static bool disable_features(const struct test_mode *t)
1115*d83cc019SAndroid Build Coastguard Worker {
1116*d83cc019SAndroid Build Coastguard Worker if (t->feature == FEATURE_DEFAULT)
1117*d83cc019SAndroid Build Coastguard Worker return false;
1118*d83cc019SAndroid Build Coastguard Worker
1119*d83cc019SAndroid Build Coastguard Worker fbc_disable();
1120*d83cc019SAndroid Build Coastguard Worker drrs_disable();
1121*d83cc019SAndroid Build Coastguard Worker return psr.can_test ? psr_disable(drm.debugfs) : false;
1122*d83cc019SAndroid Build Coastguard Worker }
1123*d83cc019SAndroid Build Coastguard Worker
busy_thread_func(void * data)1124*d83cc019SAndroid Build Coastguard Worker static void *busy_thread_func(void *data)
1125*d83cc019SAndroid Build Coastguard Worker {
1126*d83cc019SAndroid Build Coastguard Worker while (!busy_thread.stop)
1127*d83cc019SAndroid Build Coastguard Worker igt_draw_rect(drm.fd, drm.bufmgr, NULL, busy_thread.handle,
1128*d83cc019SAndroid Build Coastguard Worker busy_thread.size, busy_thread.stride,
1129*d83cc019SAndroid Build Coastguard Worker IGT_DRAW_BLT, 0, 0, busy_thread.width,
1130*d83cc019SAndroid Build Coastguard Worker busy_thread.height, busy_thread.color,
1131*d83cc019SAndroid Build Coastguard Worker busy_thread.bpp);
1132*d83cc019SAndroid Build Coastguard Worker
1133*d83cc019SAndroid Build Coastguard Worker pthread_exit(0);
1134*d83cc019SAndroid Build Coastguard Worker }
1135*d83cc019SAndroid Build Coastguard Worker
start_busy_thread(struct igt_fb * fb)1136*d83cc019SAndroid Build Coastguard Worker static void start_busy_thread(struct igt_fb *fb)
1137*d83cc019SAndroid Build Coastguard Worker {
1138*d83cc019SAndroid Build Coastguard Worker int rc;
1139*d83cc019SAndroid Build Coastguard Worker
1140*d83cc019SAndroid Build Coastguard Worker igt_assert(busy_thread.stop == true);
1141*d83cc019SAndroid Build Coastguard Worker busy_thread.stop = false;
1142*d83cc019SAndroid Build Coastguard Worker busy_thread.handle = fb->gem_handle;
1143*d83cc019SAndroid Build Coastguard Worker busy_thread.size = fb->size;
1144*d83cc019SAndroid Build Coastguard Worker busy_thread.stride = fb->strides[0];
1145*d83cc019SAndroid Build Coastguard Worker busy_thread.width = fb->width;
1146*d83cc019SAndroid Build Coastguard Worker busy_thread.height = fb->height;
1147*d83cc019SAndroid Build Coastguard Worker busy_thread.color = pick_color(fb, COLOR_PRIM_BG);
1148*d83cc019SAndroid Build Coastguard Worker busy_thread.bpp = igt_drm_format_to_bpp(fb->drm_format);
1149*d83cc019SAndroid Build Coastguard Worker
1150*d83cc019SAndroid Build Coastguard Worker rc = pthread_create(&busy_thread.thread, NULL, busy_thread_func, NULL);
1151*d83cc019SAndroid Build Coastguard Worker igt_assert_eq(rc, 0);
1152*d83cc019SAndroid Build Coastguard Worker }
1153*d83cc019SAndroid Build Coastguard Worker
stop_busy_thread(void)1154*d83cc019SAndroid Build Coastguard Worker static void stop_busy_thread(void)
1155*d83cc019SAndroid Build Coastguard Worker {
1156*d83cc019SAndroid Build Coastguard Worker if (!busy_thread.stop) {
1157*d83cc019SAndroid Build Coastguard Worker busy_thread.stop = true;
1158*d83cc019SAndroid Build Coastguard Worker igt_assert(pthread_join(busy_thread.thread, NULL) == 0);
1159*d83cc019SAndroid Build Coastguard Worker }
1160*d83cc019SAndroid Build Coastguard Worker }
1161*d83cc019SAndroid Build Coastguard Worker
print_crc(const char * str,igt_crc_t * crc)1162*d83cc019SAndroid Build Coastguard Worker static void print_crc(const char *str, igt_crc_t *crc)
1163*d83cc019SAndroid Build Coastguard Worker {
1164*d83cc019SAndroid Build Coastguard Worker char *pipe_str;
1165*d83cc019SAndroid Build Coastguard Worker
1166*d83cc019SAndroid Build Coastguard Worker pipe_str = igt_crc_to_string(crc);
1167*d83cc019SAndroid Build Coastguard Worker
1168*d83cc019SAndroid Build Coastguard Worker igt_debug("%s pipe:[%s]\n", str, pipe_str);
1169*d83cc019SAndroid Build Coastguard Worker
1170*d83cc019SAndroid Build Coastguard Worker free(pipe_str);
1171*d83cc019SAndroid Build Coastguard Worker }
1172*d83cc019SAndroid Build Coastguard Worker
collect_crc(igt_crc_t * crc)1173*d83cc019SAndroid Build Coastguard Worker static void collect_crc(igt_crc_t *crc)
1174*d83cc019SAndroid Build Coastguard Worker {
1175*d83cc019SAndroid Build Coastguard Worker igt_pipe_crc_collect_crc(pipe_crc, crc);
1176*d83cc019SAndroid Build Coastguard Worker }
1177*d83cc019SAndroid Build Coastguard Worker
init_blue_crc(enum pixel_format format)1178*d83cc019SAndroid Build Coastguard Worker static void init_blue_crc(enum pixel_format format)
1179*d83cc019SAndroid Build Coastguard Worker {
1180*d83cc019SAndroid Build Coastguard Worker struct igt_fb blue;
1181*d83cc019SAndroid Build Coastguard Worker
1182*d83cc019SAndroid Build Coastguard Worker if (blue_crcs[format].initialized)
1183*d83cc019SAndroid Build Coastguard Worker return;
1184*d83cc019SAndroid Build Coastguard Worker
1185*d83cc019SAndroid Build Coastguard Worker create_fb(format, prim_mode_params.mode->hdisplay,
1186*d83cc019SAndroid Build Coastguard Worker prim_mode_params.mode->vdisplay, opt.tiling, PLANE_PRI,
1187*d83cc019SAndroid Build Coastguard Worker &blue);
1188*d83cc019SAndroid Build Coastguard Worker
1189*d83cc019SAndroid Build Coastguard Worker fill_fb(&blue, COLOR_PRIM_BG);
1190*d83cc019SAndroid Build Coastguard Worker
1191*d83cc019SAndroid Build Coastguard Worker igt_output_set_pipe(prim_mode_params.output, prim_mode_params.pipe);
1192*d83cc019SAndroid Build Coastguard Worker igt_output_override_mode(prim_mode_params.output, prim_mode_params.mode);
1193*d83cc019SAndroid Build Coastguard Worker igt_plane_set_fb(prim_mode_params.primary.plane, &blue);
1194*d83cc019SAndroid Build Coastguard Worker igt_display_commit(&drm.display);
1195*d83cc019SAndroid Build Coastguard Worker
1196*d83cc019SAndroid Build Coastguard Worker if (!pipe_crc) {
1197*d83cc019SAndroid Build Coastguard Worker pipe_crc = igt_pipe_crc_new(drm.fd, prim_mode_params.pipe, INTEL_PIPE_CRC_SOURCE_AUTO);
1198*d83cc019SAndroid Build Coastguard Worker igt_assert(pipe_crc);
1199*d83cc019SAndroid Build Coastguard Worker }
1200*d83cc019SAndroid Build Coastguard Worker
1201*d83cc019SAndroid Build Coastguard Worker collect_crc(&blue_crcs[format].crc);
1202*d83cc019SAndroid Build Coastguard Worker
1203*d83cc019SAndroid Build Coastguard Worker print_crc("Blue CRC: ", &blue_crcs[format].crc);
1204*d83cc019SAndroid Build Coastguard Worker
1205*d83cc019SAndroid Build Coastguard Worker igt_display_reset(&drm.display);
1206*d83cc019SAndroid Build Coastguard Worker
1207*d83cc019SAndroid Build Coastguard Worker igt_remove_fb(drm.fd, &blue);
1208*d83cc019SAndroid Build Coastguard Worker
1209*d83cc019SAndroid Build Coastguard Worker blue_crcs[format].initialized = true;
1210*d83cc019SAndroid Build Coastguard Worker }
1211*d83cc019SAndroid Build Coastguard Worker
init_crcs(enum pixel_format format,struct draw_pattern_info * pattern)1212*d83cc019SAndroid Build Coastguard Worker static void init_crcs(enum pixel_format format,
1213*d83cc019SAndroid Build Coastguard Worker struct draw_pattern_info *pattern)
1214*d83cc019SAndroid Build Coastguard Worker {
1215*d83cc019SAndroid Build Coastguard Worker int r, r_;
1216*d83cc019SAndroid Build Coastguard Worker struct igt_fb tmp_fbs[pattern->n_rects];
1217*d83cc019SAndroid Build Coastguard Worker
1218*d83cc019SAndroid Build Coastguard Worker if (pattern->initialized[format])
1219*d83cc019SAndroid Build Coastguard Worker return;
1220*d83cc019SAndroid Build Coastguard Worker
1221*d83cc019SAndroid Build Coastguard Worker pattern->crcs[format] = calloc(pattern->n_rects,
1222*d83cc019SAndroid Build Coastguard Worker sizeof(*(pattern->crcs[format])));
1223*d83cc019SAndroid Build Coastguard Worker
1224*d83cc019SAndroid Build Coastguard Worker for (r = 0; r < pattern->n_rects; r++)
1225*d83cc019SAndroid Build Coastguard Worker create_fb(format, prim_mode_params.mode->hdisplay,
1226*d83cc019SAndroid Build Coastguard Worker prim_mode_params.mode->vdisplay, opt.tiling,
1227*d83cc019SAndroid Build Coastguard Worker PLANE_PRI, &tmp_fbs[r]);
1228*d83cc019SAndroid Build Coastguard Worker
1229*d83cc019SAndroid Build Coastguard Worker for (r = 0; r < pattern->n_rects; r++)
1230*d83cc019SAndroid Build Coastguard Worker fill_fb(&tmp_fbs[r], COLOR_PRIM_BG);
1231*d83cc019SAndroid Build Coastguard Worker
1232*d83cc019SAndroid Build Coastguard Worker if (pattern->frames_stack) {
1233*d83cc019SAndroid Build Coastguard Worker for (r = 0; r < pattern->n_rects; r++)
1234*d83cc019SAndroid Build Coastguard Worker for (r_ = 0; r_ <= r; r_++)
1235*d83cc019SAndroid Build Coastguard Worker draw_rect_igt_fb(pattern, &tmp_fbs[r],
1236*d83cc019SAndroid Build Coastguard Worker IGT_DRAW_PWRITE, r_);
1237*d83cc019SAndroid Build Coastguard Worker } else {
1238*d83cc019SAndroid Build Coastguard Worker for (r = 0; r < pattern->n_rects; r++)
1239*d83cc019SAndroid Build Coastguard Worker draw_rect_igt_fb(pattern, &tmp_fbs[r], IGT_DRAW_PWRITE,
1240*d83cc019SAndroid Build Coastguard Worker r);
1241*d83cc019SAndroid Build Coastguard Worker }
1242*d83cc019SAndroid Build Coastguard Worker
1243*d83cc019SAndroid Build Coastguard Worker igt_output_set_pipe(prim_mode_params.output, prim_mode_params.pipe);
1244*d83cc019SAndroid Build Coastguard Worker igt_output_override_mode(prim_mode_params.output, prim_mode_params.mode);
1245*d83cc019SAndroid Build Coastguard Worker for (r = 0; r < pattern->n_rects; r++) {
1246*d83cc019SAndroid Build Coastguard Worker igt_plane_set_fb(prim_mode_params.primary.plane, &tmp_fbs[r]);
1247*d83cc019SAndroid Build Coastguard Worker igt_display_commit(&drm.display);
1248*d83cc019SAndroid Build Coastguard Worker
1249*d83cc019SAndroid Build Coastguard Worker collect_crc(&pattern->crcs[format][r]);
1250*d83cc019SAndroid Build Coastguard Worker }
1251*d83cc019SAndroid Build Coastguard Worker
1252*d83cc019SAndroid Build Coastguard Worker for (r = 0; r < pattern->n_rects; r++) {
1253*d83cc019SAndroid Build Coastguard Worker igt_debug("Rect %d CRC:", r);
1254*d83cc019SAndroid Build Coastguard Worker print_crc("", &pattern->crcs[format][r]);
1255*d83cc019SAndroid Build Coastguard Worker }
1256*d83cc019SAndroid Build Coastguard Worker
1257*d83cc019SAndroid Build Coastguard Worker igt_display_reset(&drm.display);
1258*d83cc019SAndroid Build Coastguard Worker
1259*d83cc019SAndroid Build Coastguard Worker for (r = 0; r < pattern->n_rects; r++)
1260*d83cc019SAndroid Build Coastguard Worker igt_remove_fb(drm.fd, &tmp_fbs[r]);
1261*d83cc019SAndroid Build Coastguard Worker
1262*d83cc019SAndroid Build Coastguard Worker pattern->initialized[format] = true;
1263*d83cc019SAndroid Build Coastguard Worker }
1264*d83cc019SAndroid Build Coastguard Worker
setup_drm(void)1265*d83cc019SAndroid Build Coastguard Worker static void setup_drm(void)
1266*d83cc019SAndroid Build Coastguard Worker {
1267*d83cc019SAndroid Build Coastguard Worker drm.fd = drm_open_driver_master(DRIVER_INTEL);
1268*d83cc019SAndroid Build Coastguard Worker drm.debugfs = igt_debugfs_dir(drm.fd);
1269*d83cc019SAndroid Build Coastguard Worker
1270*d83cc019SAndroid Build Coastguard Worker kmstest_set_vt_graphics_mode();
1271*d83cc019SAndroid Build Coastguard Worker igt_display_require(&drm.display, drm.fd);
1272*d83cc019SAndroid Build Coastguard Worker
1273*d83cc019SAndroid Build Coastguard Worker drm.bufmgr = drm_intel_bufmgr_gem_init(drm.fd, 4096);
1274*d83cc019SAndroid Build Coastguard Worker igt_assert(drm.bufmgr);
1275*d83cc019SAndroid Build Coastguard Worker drm_intel_bufmgr_gem_enable_reuse(drm.bufmgr);
1276*d83cc019SAndroid Build Coastguard Worker }
1277*d83cc019SAndroid Build Coastguard Worker
teardown_drm(void)1278*d83cc019SAndroid Build Coastguard Worker static void teardown_drm(void)
1279*d83cc019SAndroid Build Coastguard Worker {
1280*d83cc019SAndroid Build Coastguard Worker drm_intel_bufmgr_destroy(drm.bufmgr);
1281*d83cc019SAndroid Build Coastguard Worker igt_display_fini(&drm.display);
1282*d83cc019SAndroid Build Coastguard Worker close(drm.fd);
1283*d83cc019SAndroid Build Coastguard Worker }
1284*d83cc019SAndroid Build Coastguard Worker
setup_modeset(void)1285*d83cc019SAndroid Build Coastguard Worker static void setup_modeset(void)
1286*d83cc019SAndroid Build Coastguard Worker {
1287*d83cc019SAndroid Build Coastguard Worker igt_require(init_modeset_cached_params());
1288*d83cc019SAndroid Build Coastguard Worker offscreen_fb.fb = NULL;
1289*d83cc019SAndroid Build Coastguard Worker offscreen_fb.w = 1024;
1290*d83cc019SAndroid Build Coastguard Worker offscreen_fb.h = 1024;
1291*d83cc019SAndroid Build Coastguard Worker create_fbs(FORMAT_DEFAULT);
1292*d83cc019SAndroid Build Coastguard Worker }
1293*d83cc019SAndroid Build Coastguard Worker
teardown_modeset(void)1294*d83cc019SAndroid Build Coastguard Worker static void teardown_modeset(void)
1295*d83cc019SAndroid Build Coastguard Worker {
1296*d83cc019SAndroid Build Coastguard Worker enum pixel_format f;
1297*d83cc019SAndroid Build Coastguard Worker
1298*d83cc019SAndroid Build Coastguard Worker for (f = 0; f < FORMAT_COUNT; f++)
1299*d83cc019SAndroid Build Coastguard Worker destroy_fbs(f);
1300*d83cc019SAndroid Build Coastguard Worker }
1301*d83cc019SAndroid Build Coastguard Worker
setup_crcs(void)1302*d83cc019SAndroid Build Coastguard Worker static void setup_crcs(void)
1303*d83cc019SAndroid Build Coastguard Worker {
1304*d83cc019SAndroid Build Coastguard Worker enum pixel_format f;
1305*d83cc019SAndroid Build Coastguard Worker
1306*d83cc019SAndroid Build Coastguard Worker for (f = 0; f < FORMAT_COUNT; f++)
1307*d83cc019SAndroid Build Coastguard Worker blue_crcs[f].initialized = false;
1308*d83cc019SAndroid Build Coastguard Worker
1309*d83cc019SAndroid Build Coastguard Worker pattern1.frames_stack = true;
1310*d83cc019SAndroid Build Coastguard Worker pattern1.n_rects = 4;
1311*d83cc019SAndroid Build Coastguard Worker pattern1.get_rect = pat1_get_rect;
1312*d83cc019SAndroid Build Coastguard Worker for (f = 0; f < FORMAT_COUNT; f++) {
1313*d83cc019SAndroid Build Coastguard Worker pattern1.initialized[f] = false;
1314*d83cc019SAndroid Build Coastguard Worker pattern1.crcs[f] = NULL;
1315*d83cc019SAndroid Build Coastguard Worker }
1316*d83cc019SAndroid Build Coastguard Worker
1317*d83cc019SAndroid Build Coastguard Worker pattern2.frames_stack = true;
1318*d83cc019SAndroid Build Coastguard Worker pattern2.n_rects = 4;
1319*d83cc019SAndroid Build Coastguard Worker pattern2.get_rect = pat2_get_rect;
1320*d83cc019SAndroid Build Coastguard Worker for (f = 0; f < FORMAT_COUNT; f++) {
1321*d83cc019SAndroid Build Coastguard Worker pattern2.initialized[f] = false;
1322*d83cc019SAndroid Build Coastguard Worker pattern2.crcs[f] = NULL;
1323*d83cc019SAndroid Build Coastguard Worker }
1324*d83cc019SAndroid Build Coastguard Worker
1325*d83cc019SAndroid Build Coastguard Worker pattern3.frames_stack = false;
1326*d83cc019SAndroid Build Coastguard Worker pattern3.n_rects = 5;
1327*d83cc019SAndroid Build Coastguard Worker pattern3.get_rect = pat3_get_rect;
1328*d83cc019SAndroid Build Coastguard Worker for (f = 0; f < FORMAT_COUNT; f++) {
1329*d83cc019SAndroid Build Coastguard Worker pattern3.initialized[f] = false;
1330*d83cc019SAndroid Build Coastguard Worker pattern3.crcs[f] = NULL;
1331*d83cc019SAndroid Build Coastguard Worker }
1332*d83cc019SAndroid Build Coastguard Worker
1333*d83cc019SAndroid Build Coastguard Worker pattern4.frames_stack = false;
1334*d83cc019SAndroid Build Coastguard Worker pattern4.n_rects = 1;
1335*d83cc019SAndroid Build Coastguard Worker pattern4.get_rect = pat4_get_rect;
1336*d83cc019SAndroid Build Coastguard Worker for (f = 0; f < FORMAT_COUNT; f++) {
1337*d83cc019SAndroid Build Coastguard Worker pattern4.initialized[f] = false;
1338*d83cc019SAndroid Build Coastguard Worker pattern4.crcs[f] = NULL;
1339*d83cc019SAndroid Build Coastguard Worker }
1340*d83cc019SAndroid Build Coastguard Worker }
1341*d83cc019SAndroid Build Coastguard Worker
teardown_crcs(void)1342*d83cc019SAndroid Build Coastguard Worker static void teardown_crcs(void)
1343*d83cc019SAndroid Build Coastguard Worker {
1344*d83cc019SAndroid Build Coastguard Worker enum pixel_format f;
1345*d83cc019SAndroid Build Coastguard Worker
1346*d83cc019SAndroid Build Coastguard Worker for (f = 0; f < FORMAT_COUNT; f++) {
1347*d83cc019SAndroid Build Coastguard Worker if (pattern1.crcs[f])
1348*d83cc019SAndroid Build Coastguard Worker free(pattern1.crcs[f]);
1349*d83cc019SAndroid Build Coastguard Worker if (pattern2.crcs[f])
1350*d83cc019SAndroid Build Coastguard Worker free(pattern2.crcs[f]);
1351*d83cc019SAndroid Build Coastguard Worker if (pattern3.crcs[f])
1352*d83cc019SAndroid Build Coastguard Worker free(pattern3.crcs[f]);
1353*d83cc019SAndroid Build Coastguard Worker if (pattern4.crcs[f])
1354*d83cc019SAndroid Build Coastguard Worker free(pattern4.crcs[f]);
1355*d83cc019SAndroid Build Coastguard Worker }
1356*d83cc019SAndroid Build Coastguard Worker
1357*d83cc019SAndroid Build Coastguard Worker igt_pipe_crc_free(pipe_crc);
1358*d83cc019SAndroid Build Coastguard Worker }
1359*d83cc019SAndroid Build Coastguard Worker
fbc_supported_on_chipset(void)1360*d83cc019SAndroid Build Coastguard Worker static bool fbc_supported_on_chipset(void)
1361*d83cc019SAndroid Build Coastguard Worker {
1362*d83cc019SAndroid Build Coastguard Worker char buf[128];
1363*d83cc019SAndroid Build Coastguard Worker
1364*d83cc019SAndroid Build Coastguard Worker debugfs_read("i915_fbc_status", buf);
1365*d83cc019SAndroid Build Coastguard Worker if (*buf == '\0')
1366*d83cc019SAndroid Build Coastguard Worker return false;
1367*d83cc019SAndroid Build Coastguard Worker
1368*d83cc019SAndroid Build Coastguard Worker return !strstr(buf, "FBC unsupported on this chipset\n");
1369*d83cc019SAndroid Build Coastguard Worker }
1370*d83cc019SAndroid Build Coastguard Worker
setup_fbc(void)1371*d83cc019SAndroid Build Coastguard Worker static void setup_fbc(void)
1372*d83cc019SAndroid Build Coastguard Worker {
1373*d83cc019SAndroid Build Coastguard Worker int devid = intel_get_drm_devid(drm.fd);
1374*d83cc019SAndroid Build Coastguard Worker
1375*d83cc019SAndroid Build Coastguard Worker if (!fbc_supported_on_chipset()) {
1376*d83cc019SAndroid Build Coastguard Worker igt_info("Can't test FBC: not supported on this chipset\n");
1377*d83cc019SAndroid Build Coastguard Worker return;
1378*d83cc019SAndroid Build Coastguard Worker }
1379*d83cc019SAndroid Build Coastguard Worker
1380*d83cc019SAndroid Build Coastguard Worker /*
1381*d83cc019SAndroid Build Coastguard Worker * While some platforms do allow FBC on pipes B/C, this test suite
1382*d83cc019SAndroid Build Coastguard Worker * is not prepared for that yet.
1383*d83cc019SAndroid Build Coastguard Worker * TODO: solve this.
1384*d83cc019SAndroid Build Coastguard Worker */
1385*d83cc019SAndroid Build Coastguard Worker if (prim_mode_params.pipe != PIPE_A) {
1386*d83cc019SAndroid Build Coastguard Worker igt_info("Can't test FBC: primary connector doesn't support "
1387*d83cc019SAndroid Build Coastguard Worker "pipe A\n");
1388*d83cc019SAndroid Build Coastguard Worker return;
1389*d83cc019SAndroid Build Coastguard Worker }
1390*d83cc019SAndroid Build Coastguard Worker
1391*d83cc019SAndroid Build Coastguard Worker /* Early Generations are not able to report compression status. */
1392*d83cc019SAndroid Build Coastguard Worker if (!AT_LEAST_GEN(devid, 7))
1393*d83cc019SAndroid Build Coastguard Worker opt.fbc_check_compression = false;
1394*d83cc019SAndroid Build Coastguard Worker
1395*d83cc019SAndroid Build Coastguard Worker fbc.can_test = true;
1396*d83cc019SAndroid Build Coastguard Worker
1397*d83cc019SAndroid Build Coastguard Worker fbc_setup_last_action();
1398*d83cc019SAndroid Build Coastguard Worker }
1399*d83cc019SAndroid Build Coastguard Worker
teardown_fbc(void)1400*d83cc019SAndroid Build Coastguard Worker static void teardown_fbc(void)
1401*d83cc019SAndroid Build Coastguard Worker {
1402*d83cc019SAndroid Build Coastguard Worker }
1403*d83cc019SAndroid Build Coastguard Worker
setup_psr(void)1404*d83cc019SAndroid Build Coastguard Worker static void setup_psr(void)
1405*d83cc019SAndroid Build Coastguard Worker {
1406*d83cc019SAndroid Build Coastguard Worker if (prim_mode_params.output->config.connector->connector_type !=
1407*d83cc019SAndroid Build Coastguard Worker DRM_MODE_CONNECTOR_eDP) {
1408*d83cc019SAndroid Build Coastguard Worker igt_info("Can't test PSR: no usable eDP screen.\n");
1409*d83cc019SAndroid Build Coastguard Worker return;
1410*d83cc019SAndroid Build Coastguard Worker }
1411*d83cc019SAndroid Build Coastguard Worker
1412*d83cc019SAndroid Build Coastguard Worker if (!psr_sink_support(drm.debugfs, PSR_MODE_1)) {
1413*d83cc019SAndroid Build Coastguard Worker igt_info("Can't test PSR: not supported by sink.\n");
1414*d83cc019SAndroid Build Coastguard Worker return;
1415*d83cc019SAndroid Build Coastguard Worker }
1416*d83cc019SAndroid Build Coastguard Worker psr.can_test = true;
1417*d83cc019SAndroid Build Coastguard Worker }
1418*d83cc019SAndroid Build Coastguard Worker
teardown_psr(void)1419*d83cc019SAndroid Build Coastguard Worker static void teardown_psr(void)
1420*d83cc019SAndroid Build Coastguard Worker {
1421*d83cc019SAndroid Build Coastguard Worker }
1422*d83cc019SAndroid Build Coastguard Worker
setup_drrs(void)1423*d83cc019SAndroid Build Coastguard Worker static void setup_drrs(void)
1424*d83cc019SAndroid Build Coastguard Worker {
1425*d83cc019SAndroid Build Coastguard Worker if (prim_mode_params.output->config.connector->connector_type !=
1426*d83cc019SAndroid Build Coastguard Worker DRM_MODE_CONNECTOR_eDP) {
1427*d83cc019SAndroid Build Coastguard Worker igt_info("Can't test DRRS: no usable eDP screen.\n");
1428*d83cc019SAndroid Build Coastguard Worker return;
1429*d83cc019SAndroid Build Coastguard Worker }
1430*d83cc019SAndroid Build Coastguard Worker
1431*d83cc019SAndroid Build Coastguard Worker if (!is_drrs_supported()) {
1432*d83cc019SAndroid Build Coastguard Worker igt_info("Can't test DRRS: Not supported.\n");
1433*d83cc019SAndroid Build Coastguard Worker return;
1434*d83cc019SAndroid Build Coastguard Worker }
1435*d83cc019SAndroid Build Coastguard Worker
1436*d83cc019SAndroid Build Coastguard Worker drrs.can_test = true;
1437*d83cc019SAndroid Build Coastguard Worker }
1438*d83cc019SAndroid Build Coastguard Worker
setup_environment(void)1439*d83cc019SAndroid Build Coastguard Worker static void setup_environment(void)
1440*d83cc019SAndroid Build Coastguard Worker {
1441*d83cc019SAndroid Build Coastguard Worker setup_drm();
1442*d83cc019SAndroid Build Coastguard Worker setup_modeset();
1443*d83cc019SAndroid Build Coastguard Worker
1444*d83cc019SAndroid Build Coastguard Worker setup_fbc();
1445*d83cc019SAndroid Build Coastguard Worker setup_psr();
1446*d83cc019SAndroid Build Coastguard Worker setup_drrs();
1447*d83cc019SAndroid Build Coastguard Worker
1448*d83cc019SAndroid Build Coastguard Worker setup_crcs();
1449*d83cc019SAndroid Build Coastguard Worker }
1450*d83cc019SAndroid Build Coastguard Worker
teardown_environment(void)1451*d83cc019SAndroid Build Coastguard Worker static void teardown_environment(void)
1452*d83cc019SAndroid Build Coastguard Worker {
1453*d83cc019SAndroid Build Coastguard Worker stop_busy_thread();
1454*d83cc019SAndroid Build Coastguard Worker
1455*d83cc019SAndroid Build Coastguard Worker teardown_crcs();
1456*d83cc019SAndroid Build Coastguard Worker teardown_psr();
1457*d83cc019SAndroid Build Coastguard Worker teardown_fbc();
1458*d83cc019SAndroid Build Coastguard Worker teardown_modeset();
1459*d83cc019SAndroid Build Coastguard Worker teardown_drm();
1460*d83cc019SAndroid Build Coastguard Worker }
1461*d83cc019SAndroid Build Coastguard Worker
wait_user(int step,const char * msg)1462*d83cc019SAndroid Build Coastguard Worker static void wait_user(int step, const char *msg)
1463*d83cc019SAndroid Build Coastguard Worker {
1464*d83cc019SAndroid Build Coastguard Worker if (opt.step < step)
1465*d83cc019SAndroid Build Coastguard Worker return;
1466*d83cc019SAndroid Build Coastguard Worker
1467*d83cc019SAndroid Build Coastguard Worker igt_info("%s Press enter...\n", msg);
1468*d83cc019SAndroid Build Coastguard Worker while (getchar() != '\n')
1469*d83cc019SAndroid Build Coastguard Worker ;
1470*d83cc019SAndroid Build Coastguard Worker }
1471*d83cc019SAndroid Build Coastguard Worker
pick_params(const struct test_mode * t)1472*d83cc019SAndroid Build Coastguard Worker static struct modeset_params *pick_params(const struct test_mode *t)
1473*d83cc019SAndroid Build Coastguard Worker {
1474*d83cc019SAndroid Build Coastguard Worker switch (t->screen) {
1475*d83cc019SAndroid Build Coastguard Worker case SCREEN_PRIM:
1476*d83cc019SAndroid Build Coastguard Worker return &prim_mode_params;
1477*d83cc019SAndroid Build Coastguard Worker case SCREEN_SCND:
1478*d83cc019SAndroid Build Coastguard Worker return &scnd_mode_params;
1479*d83cc019SAndroid Build Coastguard Worker case SCREEN_OFFSCREEN:
1480*d83cc019SAndroid Build Coastguard Worker return NULL;
1481*d83cc019SAndroid Build Coastguard Worker default:
1482*d83cc019SAndroid Build Coastguard Worker igt_assert(false);
1483*d83cc019SAndroid Build Coastguard Worker }
1484*d83cc019SAndroid Build Coastguard Worker }
1485*d83cc019SAndroid Build Coastguard Worker
pick_target(const struct test_mode * t,struct modeset_params * params)1486*d83cc019SAndroid Build Coastguard Worker static struct fb_region *pick_target(const struct test_mode *t,
1487*d83cc019SAndroid Build Coastguard Worker struct modeset_params *params)
1488*d83cc019SAndroid Build Coastguard Worker {
1489*d83cc019SAndroid Build Coastguard Worker if (!params)
1490*d83cc019SAndroid Build Coastguard Worker return &offscreen_fb;
1491*d83cc019SAndroid Build Coastguard Worker
1492*d83cc019SAndroid Build Coastguard Worker switch (t->plane) {
1493*d83cc019SAndroid Build Coastguard Worker case PLANE_PRI:
1494*d83cc019SAndroid Build Coastguard Worker return ¶ms->primary;
1495*d83cc019SAndroid Build Coastguard Worker case PLANE_CUR:
1496*d83cc019SAndroid Build Coastguard Worker return ¶ms->cursor;
1497*d83cc019SAndroid Build Coastguard Worker case PLANE_SPR:
1498*d83cc019SAndroid Build Coastguard Worker return ¶ms->sprite;
1499*d83cc019SAndroid Build Coastguard Worker default:
1500*d83cc019SAndroid Build Coastguard Worker igt_assert(false);
1501*d83cc019SAndroid Build Coastguard Worker }
1502*d83cc019SAndroid Build Coastguard Worker }
1503*d83cc019SAndroid Build Coastguard Worker
do_flush(const struct test_mode * t)1504*d83cc019SAndroid Build Coastguard Worker static void do_flush(const struct test_mode *t)
1505*d83cc019SAndroid Build Coastguard Worker {
1506*d83cc019SAndroid Build Coastguard Worker struct modeset_params *params = pick_params(t);
1507*d83cc019SAndroid Build Coastguard Worker struct fb_region *target = pick_target(t, params);
1508*d83cc019SAndroid Build Coastguard Worker
1509*d83cc019SAndroid Build Coastguard Worker gem_set_domain(drm.fd, target->fb->gem_handle, I915_GEM_DOMAIN_GTT, 0);
1510*d83cc019SAndroid Build Coastguard Worker }
1511*d83cc019SAndroid Build Coastguard Worker
1512*d83cc019SAndroid Build Coastguard Worker #define DONT_ASSERT_CRC (1 << 0)
1513*d83cc019SAndroid Build Coastguard Worker #define DONT_ASSERT_FEATURE_STATUS (1 << 1)
1514*d83cc019SAndroid Build Coastguard Worker #define DONT_ASSERT_FBC_STATUS (1 << 12)
1515*d83cc019SAndroid Build Coastguard Worker
1516*d83cc019SAndroid Build Coastguard Worker #define FBC_ASSERT_FLAGS (0xF << 2)
1517*d83cc019SAndroid Build Coastguard Worker #define ASSERT_FBC_ENABLED (1 << 2)
1518*d83cc019SAndroid Build Coastguard Worker #define ASSERT_FBC_DISABLED (1 << 3)
1519*d83cc019SAndroid Build Coastguard Worker #define ASSERT_LAST_ACTION_CHANGED (1 << 4)
1520*d83cc019SAndroid Build Coastguard Worker #define ASSERT_NO_ACTION_CHANGE (1 << 5)
1521*d83cc019SAndroid Build Coastguard Worker
1522*d83cc019SAndroid Build Coastguard Worker #define PSR_ASSERT_FLAGS (3 << 6)
1523*d83cc019SAndroid Build Coastguard Worker #define ASSERT_PSR_ENABLED (1 << 6)
1524*d83cc019SAndroid Build Coastguard Worker #define ASSERT_PSR_DISABLED (1 << 7)
1525*d83cc019SAndroid Build Coastguard Worker
1526*d83cc019SAndroid Build Coastguard Worker #define DRRS_ASSERT_FLAGS (7 << 8)
1527*d83cc019SAndroid Build Coastguard Worker #define ASSERT_DRRS_HIGH (1 << 8)
1528*d83cc019SAndroid Build Coastguard Worker #define ASSERT_DRRS_LOW (1 << 9)
1529*d83cc019SAndroid Build Coastguard Worker #define ASSERT_DRRS_INACTIVE (1 << 10)
1530*d83cc019SAndroid Build Coastguard Worker
1531*d83cc019SAndroid Build Coastguard Worker #define ASSERT_NO_IDLE_GPU (1 << 11)
1532*d83cc019SAndroid Build Coastguard Worker
adjust_assertion_flags(const struct test_mode * t,int flags)1533*d83cc019SAndroid Build Coastguard Worker static int adjust_assertion_flags(const struct test_mode *t, int flags)
1534*d83cc019SAndroid Build Coastguard Worker {
1535*d83cc019SAndroid Build Coastguard Worker if (!(flags & DONT_ASSERT_FEATURE_STATUS)) {
1536*d83cc019SAndroid Build Coastguard Worker if (!(flags & ASSERT_FBC_DISABLED))
1537*d83cc019SAndroid Build Coastguard Worker flags |= ASSERT_FBC_ENABLED;
1538*d83cc019SAndroid Build Coastguard Worker if (!(flags & ASSERT_PSR_DISABLED))
1539*d83cc019SAndroid Build Coastguard Worker flags |= ASSERT_PSR_ENABLED;
1540*d83cc019SAndroid Build Coastguard Worker if (!((flags & ASSERT_DRRS_LOW) ||
1541*d83cc019SAndroid Build Coastguard Worker (flags & ASSERT_DRRS_INACTIVE)))
1542*d83cc019SAndroid Build Coastguard Worker flags |= ASSERT_DRRS_HIGH;
1543*d83cc019SAndroid Build Coastguard Worker }
1544*d83cc019SAndroid Build Coastguard Worker
1545*d83cc019SAndroid Build Coastguard Worker if ((t->feature & FEATURE_FBC) == 0 || (flags & DONT_ASSERT_FBC_STATUS))
1546*d83cc019SAndroid Build Coastguard Worker flags &= ~FBC_ASSERT_FLAGS;
1547*d83cc019SAndroid Build Coastguard Worker if ((t->feature & FEATURE_PSR) == 0)
1548*d83cc019SAndroid Build Coastguard Worker flags &= ~PSR_ASSERT_FLAGS;
1549*d83cc019SAndroid Build Coastguard Worker if ((t->feature & FEATURE_DRRS) == 0)
1550*d83cc019SAndroid Build Coastguard Worker flags &= ~DRRS_ASSERT_FLAGS;
1551*d83cc019SAndroid Build Coastguard Worker
1552*d83cc019SAndroid Build Coastguard Worker return flags;
1553*d83cc019SAndroid Build Coastguard Worker }
1554*d83cc019SAndroid Build Coastguard Worker
do_crc_assertions(int flags)1555*d83cc019SAndroid Build Coastguard Worker static void do_crc_assertions(int flags)
1556*d83cc019SAndroid Build Coastguard Worker {
1557*d83cc019SAndroid Build Coastguard Worker igt_crc_t crc;
1558*d83cc019SAndroid Build Coastguard Worker
1559*d83cc019SAndroid Build Coastguard Worker if (!opt.check_crc || (flags & DONT_ASSERT_CRC))
1560*d83cc019SAndroid Build Coastguard Worker return;
1561*d83cc019SAndroid Build Coastguard Worker
1562*d83cc019SAndroid Build Coastguard Worker collect_crc(&crc);
1563*d83cc019SAndroid Build Coastguard Worker print_crc("Calculated CRC:", &crc);
1564*d83cc019SAndroid Build Coastguard Worker
1565*d83cc019SAndroid Build Coastguard Worker igt_assert(wanted_crc);
1566*d83cc019SAndroid Build Coastguard Worker igt_assert_crc_equal(&crc, wanted_crc);
1567*d83cc019SAndroid Build Coastguard Worker }
1568*d83cc019SAndroid Build Coastguard Worker
do_status_assertions(int flags)1569*d83cc019SAndroid Build Coastguard Worker static void do_status_assertions(int flags)
1570*d83cc019SAndroid Build Coastguard Worker {
1571*d83cc019SAndroid Build Coastguard Worker if (!opt.check_status) {
1572*d83cc019SAndroid Build Coastguard Worker /* Make sure we settle before continuing. */
1573*d83cc019SAndroid Build Coastguard Worker sleep(1);
1574*d83cc019SAndroid Build Coastguard Worker return;
1575*d83cc019SAndroid Build Coastguard Worker }
1576*d83cc019SAndroid Build Coastguard Worker
1577*d83cc019SAndroid Build Coastguard Worker if (flags & ASSERT_DRRS_HIGH) {
1578*d83cc019SAndroid Build Coastguard Worker if (!is_drrs_high()) {
1579*d83cc019SAndroid Build Coastguard Worker drrs_print_status();
1580*d83cc019SAndroid Build Coastguard Worker igt_assert_f(false, "DRRS HIGH\n");
1581*d83cc019SAndroid Build Coastguard Worker }
1582*d83cc019SAndroid Build Coastguard Worker } else if (flags & ASSERT_DRRS_LOW) {
1583*d83cc019SAndroid Build Coastguard Worker if (!drrs_wait_until_rr_switch_to_low()) {
1584*d83cc019SAndroid Build Coastguard Worker drrs_print_status();
1585*d83cc019SAndroid Build Coastguard Worker igt_assert_f(false, "DRRS LOW\n");
1586*d83cc019SAndroid Build Coastguard Worker }
1587*d83cc019SAndroid Build Coastguard Worker } else if (flags & ASSERT_DRRS_INACTIVE) {
1588*d83cc019SAndroid Build Coastguard Worker if (!is_drrs_inactive()) {
1589*d83cc019SAndroid Build Coastguard Worker drrs_print_status();
1590*d83cc019SAndroid Build Coastguard Worker igt_assert_f(false, "DRRS INACTIVE\n");
1591*d83cc019SAndroid Build Coastguard Worker }
1592*d83cc019SAndroid Build Coastguard Worker }
1593*d83cc019SAndroid Build Coastguard Worker
1594*d83cc019SAndroid Build Coastguard Worker if (flags & ASSERT_FBC_ENABLED) {
1595*d83cc019SAndroid Build Coastguard Worker igt_require(!fbc_not_enough_stolen());
1596*d83cc019SAndroid Build Coastguard Worker igt_require(!fbc_stride_not_supported());
1597*d83cc019SAndroid Build Coastguard Worker igt_require(!fbc_mode_too_large());
1598*d83cc019SAndroid Build Coastguard Worker if (!fbc_wait_until_enabled()) {
1599*d83cc019SAndroid Build Coastguard Worker igt_assert_f(fbc_is_enabled(IGT_LOG_WARN),
1600*d83cc019SAndroid Build Coastguard Worker "FBC disabled\n");
1601*d83cc019SAndroid Build Coastguard Worker }
1602*d83cc019SAndroid Build Coastguard Worker
1603*d83cc019SAndroid Build Coastguard Worker if (opt.fbc_check_compression)
1604*d83cc019SAndroid Build Coastguard Worker igt_assert(fbc_wait_for_compression());
1605*d83cc019SAndroid Build Coastguard Worker } else if (flags & ASSERT_FBC_DISABLED) {
1606*d83cc019SAndroid Build Coastguard Worker igt_assert(!fbc_wait_until_enabled());
1607*d83cc019SAndroid Build Coastguard Worker }
1608*d83cc019SAndroid Build Coastguard Worker
1609*d83cc019SAndroid Build Coastguard Worker if (flags & ASSERT_PSR_ENABLED)
1610*d83cc019SAndroid Build Coastguard Worker igt_assert_f(psr_wait_entry(drm.debugfs, PSR_MODE_1),
1611*d83cc019SAndroid Build Coastguard Worker "PSR still disabled\n");
1612*d83cc019SAndroid Build Coastguard Worker else if (flags & ASSERT_PSR_DISABLED)
1613*d83cc019SAndroid Build Coastguard Worker igt_assert_f(psr_wait_update(drm.debugfs, PSR_MODE_1),
1614*d83cc019SAndroid Build Coastguard Worker "PSR still enabled\n");
1615*d83cc019SAndroid Build Coastguard Worker }
1616*d83cc019SAndroid Build Coastguard Worker
__do_assertions(const struct test_mode * t,int flags,int line)1617*d83cc019SAndroid Build Coastguard Worker static void __do_assertions(const struct test_mode *t, int flags,
1618*d83cc019SAndroid Build Coastguard Worker int line)
1619*d83cc019SAndroid Build Coastguard Worker {
1620*d83cc019SAndroid Build Coastguard Worker flags = adjust_assertion_flags(t, flags);
1621*d83cc019SAndroid Build Coastguard Worker
1622*d83cc019SAndroid Build Coastguard Worker /* Make sure any submitted rendering is now idle. */
1623*d83cc019SAndroid Build Coastguard Worker if (!(flags & ASSERT_NO_IDLE_GPU))
1624*d83cc019SAndroid Build Coastguard Worker gem_quiescent_gpu(drm.fd);
1625*d83cc019SAndroid Build Coastguard Worker
1626*d83cc019SAndroid Build Coastguard Worker igt_debug("checking asserts in line %i\n", line);
1627*d83cc019SAndroid Build Coastguard Worker
1628*d83cc019SAndroid Build Coastguard Worker wait_user(2, "Paused before assertions.");
1629*d83cc019SAndroid Build Coastguard Worker
1630*d83cc019SAndroid Build Coastguard Worker /* Check the CRC to make sure the drawing operations work
1631*d83cc019SAndroid Build Coastguard Worker * immediately, independently of the features being enabled. */
1632*d83cc019SAndroid Build Coastguard Worker do_crc_assertions(flags);
1633*d83cc019SAndroid Build Coastguard Worker
1634*d83cc019SAndroid Build Coastguard Worker /* Now we can flush things to make the test faster. */
1635*d83cc019SAndroid Build Coastguard Worker do_flush(t);
1636*d83cc019SAndroid Build Coastguard Worker
1637*d83cc019SAndroid Build Coastguard Worker do_status_assertions(flags);
1638*d83cc019SAndroid Build Coastguard Worker
1639*d83cc019SAndroid Build Coastguard Worker /* Check CRC again to make sure the compressed screen is ok,
1640*d83cc019SAndroid Build Coastguard Worker * except if we're not drawing on the primary screen. On this
1641*d83cc019SAndroid Build Coastguard Worker * case, the first check should be enough and a new CRC check
1642*d83cc019SAndroid Build Coastguard Worker * would only delay the test suite while adding no value to the
1643*d83cc019SAndroid Build Coastguard Worker * test suite. */
1644*d83cc019SAndroid Build Coastguard Worker if (t->screen == SCREEN_PRIM)
1645*d83cc019SAndroid Build Coastguard Worker do_crc_assertions(flags);
1646*d83cc019SAndroid Build Coastguard Worker
1647*d83cc019SAndroid Build Coastguard Worker if (fbc.supports_last_action && opt.fbc_check_last_action) {
1648*d83cc019SAndroid Build Coastguard Worker if (flags & ASSERT_LAST_ACTION_CHANGED)
1649*d83cc019SAndroid Build Coastguard Worker igt_assert(fbc_last_action_changed());
1650*d83cc019SAndroid Build Coastguard Worker else if (flags & ASSERT_NO_ACTION_CHANGE)
1651*d83cc019SAndroid Build Coastguard Worker igt_assert(!fbc_last_action_changed());
1652*d83cc019SAndroid Build Coastguard Worker }
1653*d83cc019SAndroid Build Coastguard Worker
1654*d83cc019SAndroid Build Coastguard Worker wait_user(1, "Paused after assertions.");
1655*d83cc019SAndroid Build Coastguard Worker }
1656*d83cc019SAndroid Build Coastguard Worker
1657*d83cc019SAndroid Build Coastguard Worker #define do_assertions(__flags) __do_assertions(t, (__flags), __LINE__)
1658*d83cc019SAndroid Build Coastguard Worker
enable_prim_screen_and_wait(const struct test_mode * t)1659*d83cc019SAndroid Build Coastguard Worker static void enable_prim_screen_and_wait(const struct test_mode *t)
1660*d83cc019SAndroid Build Coastguard Worker {
1661*d83cc019SAndroid Build Coastguard Worker fill_fb_region(&prim_mode_params.primary, COLOR_PRIM_BG);
1662*d83cc019SAndroid Build Coastguard Worker set_mode_for_params(&prim_mode_params);
1663*d83cc019SAndroid Build Coastguard Worker
1664*d83cc019SAndroid Build Coastguard Worker wanted_crc = &blue_crcs[t->format].crc;
1665*d83cc019SAndroid Build Coastguard Worker fbc_update_last_action();
1666*d83cc019SAndroid Build Coastguard Worker
1667*d83cc019SAndroid Build Coastguard Worker do_assertions(ASSERT_NO_ACTION_CHANGE);
1668*d83cc019SAndroid Build Coastguard Worker }
1669*d83cc019SAndroid Build Coastguard Worker
enable_both_screens_and_wait(const struct test_mode * t)1670*d83cc019SAndroid Build Coastguard Worker static void enable_both_screens_and_wait(const struct test_mode *t)
1671*d83cc019SAndroid Build Coastguard Worker {
1672*d83cc019SAndroid Build Coastguard Worker fill_fb_region(&prim_mode_params.primary, COLOR_PRIM_BG);
1673*d83cc019SAndroid Build Coastguard Worker fill_fb_region(&scnd_mode_params.primary, COLOR_SCND_BG);
1674*d83cc019SAndroid Build Coastguard Worker
1675*d83cc019SAndroid Build Coastguard Worker __set_mode_for_params(&prim_mode_params);
1676*d83cc019SAndroid Build Coastguard Worker __set_mode_for_params(&scnd_mode_params);
1677*d83cc019SAndroid Build Coastguard Worker
1678*d83cc019SAndroid Build Coastguard Worker igt_display_commit2(&drm.display, drm.display.is_atomic ? COMMIT_ATOMIC : COMMIT_LEGACY);
1679*d83cc019SAndroid Build Coastguard Worker
1680*d83cc019SAndroid Build Coastguard Worker wanted_crc = &blue_crcs[t->format].crc;
1681*d83cc019SAndroid Build Coastguard Worker fbc_update_last_action();
1682*d83cc019SAndroid Build Coastguard Worker
1683*d83cc019SAndroid Build Coastguard Worker do_assertions(ASSERT_NO_ACTION_CHANGE);
1684*d83cc019SAndroid Build Coastguard Worker }
1685*d83cc019SAndroid Build Coastguard Worker
set_region_for_test(const struct test_mode * t,struct fb_region * reg)1686*d83cc019SAndroid Build Coastguard Worker static void set_region_for_test(const struct test_mode *t,
1687*d83cc019SAndroid Build Coastguard Worker struct fb_region *reg)
1688*d83cc019SAndroid Build Coastguard Worker {
1689*d83cc019SAndroid Build Coastguard Worker fill_fb_region(reg, COLOR_PRIM_BG);
1690*d83cc019SAndroid Build Coastguard Worker
1691*d83cc019SAndroid Build Coastguard Worker igt_plane_set_fb(reg->plane, reg->fb);
1692*d83cc019SAndroid Build Coastguard Worker igt_plane_set_position(reg->plane, 0, 0);
1693*d83cc019SAndroid Build Coastguard Worker igt_plane_set_size(reg->plane, reg->w, reg->h);
1694*d83cc019SAndroid Build Coastguard Worker igt_fb_set_size(reg->fb, reg->plane, reg->w, reg->h);
1695*d83cc019SAndroid Build Coastguard Worker
1696*d83cc019SAndroid Build Coastguard Worker igt_display_commit(&drm.display);
1697*d83cc019SAndroid Build Coastguard Worker do_assertions(ASSERT_NO_ACTION_CHANGE);
1698*d83cc019SAndroid Build Coastguard Worker }
1699*d83cc019SAndroid Build Coastguard Worker
enable_features_for_test(const struct test_mode * t)1700*d83cc019SAndroid Build Coastguard Worker static bool enable_features_for_test(const struct test_mode *t)
1701*d83cc019SAndroid Build Coastguard Worker {
1702*d83cc019SAndroid Build Coastguard Worker bool ret = false;
1703*d83cc019SAndroid Build Coastguard Worker
1704*d83cc019SAndroid Build Coastguard Worker if (t->feature == FEATURE_DEFAULT)
1705*d83cc019SAndroid Build Coastguard Worker return false;
1706*d83cc019SAndroid Build Coastguard Worker
1707*d83cc019SAndroid Build Coastguard Worker if (t->feature & FEATURE_FBC)
1708*d83cc019SAndroid Build Coastguard Worker fbc_enable();
1709*d83cc019SAndroid Build Coastguard Worker if (t->feature & FEATURE_PSR)
1710*d83cc019SAndroid Build Coastguard Worker ret = psr_enable(drm.debugfs, PSR_MODE_1);
1711*d83cc019SAndroid Build Coastguard Worker if (t->feature & FEATURE_DRRS)
1712*d83cc019SAndroid Build Coastguard Worker drrs_enable();
1713*d83cc019SAndroid Build Coastguard Worker
1714*d83cc019SAndroid Build Coastguard Worker return ret;
1715*d83cc019SAndroid Build Coastguard Worker }
1716*d83cc019SAndroid Build Coastguard Worker
check_test_requirements(const struct test_mode * t)1717*d83cc019SAndroid Build Coastguard Worker static void check_test_requirements(const struct test_mode *t)
1718*d83cc019SAndroid Build Coastguard Worker {
1719*d83cc019SAndroid Build Coastguard Worker if (t->pipes == PIPE_DUAL)
1720*d83cc019SAndroid Build Coastguard Worker igt_require_f(scnd_mode_params.output,
1721*d83cc019SAndroid Build Coastguard Worker "Can't test dual pipes with the current outputs\n");
1722*d83cc019SAndroid Build Coastguard Worker
1723*d83cc019SAndroid Build Coastguard Worker if (t->feature & FEATURE_FBC)
1724*d83cc019SAndroid Build Coastguard Worker igt_require_f(fbc.can_test,
1725*d83cc019SAndroid Build Coastguard Worker "Can't test FBC with this chipset\n");
1726*d83cc019SAndroid Build Coastguard Worker
1727*d83cc019SAndroid Build Coastguard Worker if (t->feature & FEATURE_PSR) {
1728*d83cc019SAndroid Build Coastguard Worker igt_require_f(psr.can_test,
1729*d83cc019SAndroid Build Coastguard Worker "Can't test PSR with the current outputs\n");
1730*d83cc019SAndroid Build Coastguard Worker }
1731*d83cc019SAndroid Build Coastguard Worker
1732*d83cc019SAndroid Build Coastguard Worker if (t->feature & FEATURE_DRRS)
1733*d83cc019SAndroid Build Coastguard Worker igt_require_f(drrs.can_test,
1734*d83cc019SAndroid Build Coastguard Worker "Can't test DRRS with the current outputs\n");
1735*d83cc019SAndroid Build Coastguard Worker
1736*d83cc019SAndroid Build Coastguard Worker /*
1737*d83cc019SAndroid Build Coastguard Worker * In kernel, When PSR is enabled, DRRS will be disabled. So If a test
1738*d83cc019SAndroid Build Coastguard Worker * case needs DRRS + PSR enabled, that will be skipped.
1739*d83cc019SAndroid Build Coastguard Worker */
1740*d83cc019SAndroid Build Coastguard Worker igt_require_f(!((t->feature & FEATURE_PSR) &&
1741*d83cc019SAndroid Build Coastguard Worker (t->feature & FEATURE_DRRS)),
1742*d83cc019SAndroid Build Coastguard Worker "Can't test PSR and DRRS together\n");
1743*d83cc019SAndroid Build Coastguard Worker
1744*d83cc019SAndroid Build Coastguard Worker if (opt.only_pipes != PIPE_COUNT)
1745*d83cc019SAndroid Build Coastguard Worker igt_require(t->pipes == opt.only_pipes);
1746*d83cc019SAndroid Build Coastguard Worker }
1747*d83cc019SAndroid Build Coastguard Worker
set_crtc_fbs(const struct test_mode * t)1748*d83cc019SAndroid Build Coastguard Worker static void set_crtc_fbs(const struct test_mode *t)
1749*d83cc019SAndroid Build Coastguard Worker {
1750*d83cc019SAndroid Build Coastguard Worker struct screen_fbs *s = &fbs[t->format];
1751*d83cc019SAndroid Build Coastguard Worker
1752*d83cc019SAndroid Build Coastguard Worker create_fbs(t->format);
1753*d83cc019SAndroid Build Coastguard Worker
1754*d83cc019SAndroid Build Coastguard Worker switch (t->fbs) {
1755*d83cc019SAndroid Build Coastguard Worker case FBS_INDIVIDUAL:
1756*d83cc019SAndroid Build Coastguard Worker prim_mode_params.primary.fb = &s->prim_pri;
1757*d83cc019SAndroid Build Coastguard Worker scnd_mode_params.primary.fb = &s->scnd_pri;
1758*d83cc019SAndroid Build Coastguard Worker offscreen_fb.fb = &s->offscreen;
1759*d83cc019SAndroid Build Coastguard Worker
1760*d83cc019SAndroid Build Coastguard Worker prim_mode_params.primary.x = 0;
1761*d83cc019SAndroid Build Coastguard Worker scnd_mode_params.primary.x = 0;
1762*d83cc019SAndroid Build Coastguard Worker offscreen_fb.x = 0;
1763*d83cc019SAndroid Build Coastguard Worker
1764*d83cc019SAndroid Build Coastguard Worker prim_mode_params.primary.y = 0;
1765*d83cc019SAndroid Build Coastguard Worker scnd_mode_params.primary.y = 0;
1766*d83cc019SAndroid Build Coastguard Worker offscreen_fb.y = 0;
1767*d83cc019SAndroid Build Coastguard Worker break;
1768*d83cc019SAndroid Build Coastguard Worker case FBS_SHARED:
1769*d83cc019SAndroid Build Coastguard Worker /* Please see the comment at the top of create_shared_fb(). */
1770*d83cc019SAndroid Build Coastguard Worker prim_mode_params.primary.fb = &s->big;
1771*d83cc019SAndroid Build Coastguard Worker scnd_mode_params.primary.fb = &s->big;
1772*d83cc019SAndroid Build Coastguard Worker offscreen_fb.fb = &s->big;
1773*d83cc019SAndroid Build Coastguard Worker
1774*d83cc019SAndroid Build Coastguard Worker prim_mode_params.primary.x = opt.shared_fb_x_offset;
1775*d83cc019SAndroid Build Coastguard Worker scnd_mode_params.primary.x = opt.shared_fb_x_offset;
1776*d83cc019SAndroid Build Coastguard Worker offscreen_fb.x = opt.shared_fb_x_offset;
1777*d83cc019SAndroid Build Coastguard Worker
1778*d83cc019SAndroid Build Coastguard Worker prim_mode_params.primary.y = opt.shared_fb_y_offset;
1779*d83cc019SAndroid Build Coastguard Worker scnd_mode_params.primary.y = prim_mode_params.primary.y +
1780*d83cc019SAndroid Build Coastguard Worker prim_mode_params.primary.h;
1781*d83cc019SAndroid Build Coastguard Worker offscreen_fb.y = scnd_mode_params.primary.y + scnd_mode_params.primary.h;
1782*d83cc019SAndroid Build Coastguard Worker break;
1783*d83cc019SAndroid Build Coastguard Worker default:
1784*d83cc019SAndroid Build Coastguard Worker igt_assert(false);
1785*d83cc019SAndroid Build Coastguard Worker }
1786*d83cc019SAndroid Build Coastguard Worker
1787*d83cc019SAndroid Build Coastguard Worker prim_mode_params.cursor.fb = &s->prim_cur;
1788*d83cc019SAndroid Build Coastguard Worker prim_mode_params.sprite.fb = &s->prim_spr;
1789*d83cc019SAndroid Build Coastguard Worker scnd_mode_params.cursor.fb = &s->scnd_cur;
1790*d83cc019SAndroid Build Coastguard Worker scnd_mode_params.sprite.fb = &s->scnd_spr;
1791*d83cc019SAndroid Build Coastguard Worker }
1792*d83cc019SAndroid Build Coastguard Worker
prepare_subtest_data(const struct test_mode * t,struct draw_pattern_info * pattern)1793*d83cc019SAndroid Build Coastguard Worker static void prepare_subtest_data(const struct test_mode *t,
1794*d83cc019SAndroid Build Coastguard Worker struct draw_pattern_info *pattern)
1795*d83cc019SAndroid Build Coastguard Worker {
1796*d83cc019SAndroid Build Coastguard Worker bool need_modeset;
1797*d83cc019SAndroid Build Coastguard Worker
1798*d83cc019SAndroid Build Coastguard Worker check_test_requirements(t);
1799*d83cc019SAndroid Build Coastguard Worker
1800*d83cc019SAndroid Build Coastguard Worker stop_busy_thread();
1801*d83cc019SAndroid Build Coastguard Worker
1802*d83cc019SAndroid Build Coastguard Worker need_modeset = disable_features(t);
1803*d83cc019SAndroid Build Coastguard Worker set_crtc_fbs(t);
1804*d83cc019SAndroid Build Coastguard Worker
1805*d83cc019SAndroid Build Coastguard Worker if (t->screen == SCREEN_OFFSCREEN)
1806*d83cc019SAndroid Build Coastguard Worker fill_fb_region(&offscreen_fb, COLOR_OFFSCREEN_BG);
1807*d83cc019SAndroid Build Coastguard Worker
1808*d83cc019SAndroid Build Coastguard Worker igt_display_reset(&drm.display);
1809*d83cc019SAndroid Build Coastguard Worker if (need_modeset)
1810*d83cc019SAndroid Build Coastguard Worker igt_display_commit(&drm.display);
1811*d83cc019SAndroid Build Coastguard Worker
1812*d83cc019SAndroid Build Coastguard Worker init_blue_crc(t->format);
1813*d83cc019SAndroid Build Coastguard Worker if (pattern)
1814*d83cc019SAndroid Build Coastguard Worker init_crcs(t->format, pattern);
1815*d83cc019SAndroid Build Coastguard Worker
1816*d83cc019SAndroid Build Coastguard Worker need_modeset = enable_features_for_test(t);
1817*d83cc019SAndroid Build Coastguard Worker if (need_modeset)
1818*d83cc019SAndroid Build Coastguard Worker igt_display_commit(&drm.display);
1819*d83cc019SAndroid Build Coastguard Worker }
1820*d83cc019SAndroid Build Coastguard Worker
prepare_subtest_screens(const struct test_mode * t)1821*d83cc019SAndroid Build Coastguard Worker static void prepare_subtest_screens(const struct test_mode *t)
1822*d83cc019SAndroid Build Coastguard Worker {
1823*d83cc019SAndroid Build Coastguard Worker if (t->pipes == PIPE_DUAL)
1824*d83cc019SAndroid Build Coastguard Worker enable_both_screens_and_wait(t);
1825*d83cc019SAndroid Build Coastguard Worker else
1826*d83cc019SAndroid Build Coastguard Worker enable_prim_screen_and_wait(t);
1827*d83cc019SAndroid Build Coastguard Worker
1828*d83cc019SAndroid Build Coastguard Worker if (t->screen == SCREEN_PRIM) {
1829*d83cc019SAndroid Build Coastguard Worker if (t->plane == PLANE_CUR)
1830*d83cc019SAndroid Build Coastguard Worker set_region_for_test(t, &prim_mode_params.cursor);
1831*d83cc019SAndroid Build Coastguard Worker if (t->plane == PLANE_SPR)
1832*d83cc019SAndroid Build Coastguard Worker set_region_for_test(t, &prim_mode_params.sprite);
1833*d83cc019SAndroid Build Coastguard Worker }
1834*d83cc019SAndroid Build Coastguard Worker
1835*d83cc019SAndroid Build Coastguard Worker if (t->pipes == PIPE_DUAL && t->screen == SCREEN_SCND) {
1836*d83cc019SAndroid Build Coastguard Worker if (t->plane == PLANE_CUR)
1837*d83cc019SAndroid Build Coastguard Worker set_region_for_test(t, &scnd_mode_params.cursor);
1838*d83cc019SAndroid Build Coastguard Worker if (t->plane == PLANE_SPR)
1839*d83cc019SAndroid Build Coastguard Worker set_region_for_test(t, &scnd_mode_params.sprite);
1840*d83cc019SAndroid Build Coastguard Worker }
1841*d83cc019SAndroid Build Coastguard Worker }
1842*d83cc019SAndroid Build Coastguard Worker
prepare_subtest(const struct test_mode * t,struct draw_pattern_info * pattern)1843*d83cc019SAndroid Build Coastguard Worker static void prepare_subtest(const struct test_mode *t,
1844*d83cc019SAndroid Build Coastguard Worker struct draw_pattern_info *pattern)
1845*d83cc019SAndroid Build Coastguard Worker {
1846*d83cc019SAndroid Build Coastguard Worker prepare_subtest_data(t, pattern);
1847*d83cc019SAndroid Build Coastguard Worker prepare_subtest_screens(t);
1848*d83cc019SAndroid Build Coastguard Worker }
1849*d83cc019SAndroid Build Coastguard Worker
1850*d83cc019SAndroid Build Coastguard Worker /*
1851*d83cc019SAndroid Build Coastguard Worker * rte - the basic sanity test
1852*d83cc019SAndroid Build Coastguard Worker *
1853*d83cc019SAndroid Build Coastguard Worker * METHOD
1854*d83cc019SAndroid Build Coastguard Worker * Just disable all screens, assert everything is disabled, then enable all
1855*d83cc019SAndroid Build Coastguard Worker * screens - including primary, cursor and sprite planes - and assert that
1856*d83cc019SAndroid Build Coastguard Worker * the tested feature is enabled.
1857*d83cc019SAndroid Build Coastguard Worker *
1858*d83cc019SAndroid Build Coastguard Worker * EXPECTED RESULTS
1859*d83cc019SAndroid Build Coastguard Worker * Blue screens and t->feature enabled.
1860*d83cc019SAndroid Build Coastguard Worker *
1861*d83cc019SAndroid Build Coastguard Worker * FAILURES
1862*d83cc019SAndroid Build Coastguard Worker * A failure here means that every other subtest will probably fail too. It
1863*d83cc019SAndroid Build Coastguard Worker * probably means that the Kernel is just not enabling the feature we want.
1864*d83cc019SAndroid Build Coastguard Worker */
rte_subtest(const struct test_mode * t)1865*d83cc019SAndroid Build Coastguard Worker static void rte_subtest(const struct test_mode *t)
1866*d83cc019SAndroid Build Coastguard Worker {
1867*d83cc019SAndroid Build Coastguard Worker prepare_subtest_data(t, NULL);
1868*d83cc019SAndroid Build Coastguard Worker
1869*d83cc019SAndroid Build Coastguard Worker unset_all_crtcs();
1870*d83cc019SAndroid Build Coastguard Worker do_assertions(ASSERT_FBC_DISABLED | ASSERT_PSR_DISABLED |
1871*d83cc019SAndroid Build Coastguard Worker DONT_ASSERT_CRC | ASSERT_DRRS_INACTIVE);
1872*d83cc019SAndroid Build Coastguard Worker
1873*d83cc019SAndroid Build Coastguard Worker if (t->pipes == PIPE_SINGLE)
1874*d83cc019SAndroid Build Coastguard Worker enable_prim_screen_and_wait(t);
1875*d83cc019SAndroid Build Coastguard Worker else
1876*d83cc019SAndroid Build Coastguard Worker enable_both_screens_and_wait(t);
1877*d83cc019SAndroid Build Coastguard Worker
1878*d83cc019SAndroid Build Coastguard Worker set_region_for_test(t, &prim_mode_params.cursor);
1879*d83cc019SAndroid Build Coastguard Worker set_region_for_test(t, &prim_mode_params.sprite);
1880*d83cc019SAndroid Build Coastguard Worker
1881*d83cc019SAndroid Build Coastguard Worker if (t->pipes == PIPE_DUAL) {
1882*d83cc019SAndroid Build Coastguard Worker set_region_for_test(t, &scnd_mode_params.cursor);
1883*d83cc019SAndroid Build Coastguard Worker set_region_for_test(t, &scnd_mode_params.sprite);
1884*d83cc019SAndroid Build Coastguard Worker }
1885*d83cc019SAndroid Build Coastguard Worker }
1886*d83cc019SAndroid Build Coastguard Worker
update_wanted_crc(const struct test_mode * t,igt_crc_t * crc)1887*d83cc019SAndroid Build Coastguard Worker static void update_wanted_crc(const struct test_mode *t, igt_crc_t *crc)
1888*d83cc019SAndroid Build Coastguard Worker {
1889*d83cc019SAndroid Build Coastguard Worker if (t->screen == SCREEN_PRIM)
1890*d83cc019SAndroid Build Coastguard Worker wanted_crc = crc;
1891*d83cc019SAndroid Build Coastguard Worker }
1892*d83cc019SAndroid Build Coastguard Worker
op_disables_psr(const struct test_mode * t,enum igt_draw_method method)1893*d83cc019SAndroid Build Coastguard Worker static bool op_disables_psr(const struct test_mode *t,
1894*d83cc019SAndroid Build Coastguard Worker enum igt_draw_method method)
1895*d83cc019SAndroid Build Coastguard Worker {
1896*d83cc019SAndroid Build Coastguard Worker if (method != IGT_DRAW_MMAP_GTT)
1897*d83cc019SAndroid Build Coastguard Worker return false;
1898*d83cc019SAndroid Build Coastguard Worker if (t->screen == SCREEN_PRIM)
1899*d83cc019SAndroid Build Coastguard Worker return true;
1900*d83cc019SAndroid Build Coastguard Worker /* On FBS_SHARED, even if the target is not the PSR screen
1901*d83cc019SAndroid Build Coastguard Worker * (SCREEN_PRIM), all primary planes share the same frontbuffer, so a
1902*d83cc019SAndroid Build Coastguard Worker * write to the second screen primary plane - or offscreen plane - will
1903*d83cc019SAndroid Build Coastguard Worker * touch the framebuffer that's also used by the primary screen. */
1904*d83cc019SAndroid Build Coastguard Worker if (t->fbs == FBS_SHARED && t->plane == PLANE_PRI)
1905*d83cc019SAndroid Build Coastguard Worker return true;
1906*d83cc019SAndroid Build Coastguard Worker
1907*d83cc019SAndroid Build Coastguard Worker return false;
1908*d83cc019SAndroid Build Coastguard Worker }
1909*d83cc019SAndroid Build Coastguard Worker
1910*d83cc019SAndroid Build Coastguard Worker /*
1911*d83cc019SAndroid Build Coastguard Worker * draw - draw a set of rectangles on the screen using the provided method
1912*d83cc019SAndroid Build Coastguard Worker *
1913*d83cc019SAndroid Build Coastguard Worker * METHOD
1914*d83cc019SAndroid Build Coastguard Worker * Just set the screens as appropriate and then start drawing a series of
1915*d83cc019SAndroid Build Coastguard Worker * rectangles on the target screen. The important guy here is the drawing
1916*d83cc019SAndroid Build Coastguard Worker * method used.
1917*d83cc019SAndroid Build Coastguard Worker *
1918*d83cc019SAndroid Build Coastguard Worker * EXPECTED RESULTS
1919*d83cc019SAndroid Build Coastguard Worker * The feature either stays enabled or gets reenabled after the oprations. You
1920*d83cc019SAndroid Build Coastguard Worker * will also see the rectangles on the target screen.
1921*d83cc019SAndroid Build Coastguard Worker *
1922*d83cc019SAndroid Build Coastguard Worker * FAILURES
1923*d83cc019SAndroid Build Coastguard Worker * A failure here indicates a problem somewhere between the Kernel's
1924*d83cc019SAndroid Build Coastguard Worker * frontbuffer tracking infrastructure or the feature itself. You need to pay
1925*d83cc019SAndroid Build Coastguard Worker * attention to which drawing method is being used.
1926*d83cc019SAndroid Build Coastguard Worker */
draw_subtest(const struct test_mode * t)1927*d83cc019SAndroid Build Coastguard Worker static void draw_subtest(const struct test_mode *t)
1928*d83cc019SAndroid Build Coastguard Worker {
1929*d83cc019SAndroid Build Coastguard Worker int r;
1930*d83cc019SAndroid Build Coastguard Worker int assertions = 0;
1931*d83cc019SAndroid Build Coastguard Worker struct draw_pattern_info *pattern;
1932*d83cc019SAndroid Build Coastguard Worker struct modeset_params *params = pick_params(t);
1933*d83cc019SAndroid Build Coastguard Worker struct fb_region *target;
1934*d83cc019SAndroid Build Coastguard Worker
1935*d83cc019SAndroid Build Coastguard Worker switch (t->screen) {
1936*d83cc019SAndroid Build Coastguard Worker case SCREEN_PRIM:
1937*d83cc019SAndroid Build Coastguard Worker if (t->method != IGT_DRAW_MMAP_GTT && t->plane == PLANE_PRI)
1938*d83cc019SAndroid Build Coastguard Worker assertions |= ASSERT_LAST_ACTION_CHANGED;
1939*d83cc019SAndroid Build Coastguard Worker else
1940*d83cc019SAndroid Build Coastguard Worker assertions |= ASSERT_NO_ACTION_CHANGE;
1941*d83cc019SAndroid Build Coastguard Worker break;
1942*d83cc019SAndroid Build Coastguard Worker case SCREEN_SCND:
1943*d83cc019SAndroid Build Coastguard Worker case SCREEN_OFFSCREEN:
1944*d83cc019SAndroid Build Coastguard Worker assertions |= ASSERT_NO_ACTION_CHANGE;
1945*d83cc019SAndroid Build Coastguard Worker break;
1946*d83cc019SAndroid Build Coastguard Worker default:
1947*d83cc019SAndroid Build Coastguard Worker igt_assert(false);
1948*d83cc019SAndroid Build Coastguard Worker }
1949*d83cc019SAndroid Build Coastguard Worker
1950*d83cc019SAndroid Build Coastguard Worker switch (t->plane) {
1951*d83cc019SAndroid Build Coastguard Worker case PLANE_PRI:
1952*d83cc019SAndroid Build Coastguard Worker pattern = &pattern1;
1953*d83cc019SAndroid Build Coastguard Worker break;
1954*d83cc019SAndroid Build Coastguard Worker case PLANE_CUR:
1955*d83cc019SAndroid Build Coastguard Worker case PLANE_SPR:
1956*d83cc019SAndroid Build Coastguard Worker pattern = &pattern2;
1957*d83cc019SAndroid Build Coastguard Worker break;
1958*d83cc019SAndroid Build Coastguard Worker default:
1959*d83cc019SAndroid Build Coastguard Worker igt_assert(false);
1960*d83cc019SAndroid Build Coastguard Worker }
1961*d83cc019SAndroid Build Coastguard Worker
1962*d83cc019SAndroid Build Coastguard Worker if (op_disables_psr(t, t->method))
1963*d83cc019SAndroid Build Coastguard Worker assertions |= ASSERT_PSR_DISABLED;
1964*d83cc019SAndroid Build Coastguard Worker
1965*d83cc019SAndroid Build Coastguard Worker /*
1966*d83cc019SAndroid Build Coastguard Worker * On FBS_INDIVIDUAL, write to offscreen plane will not touch the
1967*d83cc019SAndroid Build Coastguard Worker * current frambuffer. Hence assert for DRRS_LOW.
1968*d83cc019SAndroid Build Coastguard Worker */
1969*d83cc019SAndroid Build Coastguard Worker if ((t->fbs == FBS_INDIVIDUAL) && (t->screen == SCREEN_OFFSCREEN))
1970*d83cc019SAndroid Build Coastguard Worker assertions |= ASSERT_DRRS_LOW;
1971*d83cc019SAndroid Build Coastguard Worker
1972*d83cc019SAndroid Build Coastguard Worker prepare_subtest(t, pattern);
1973*d83cc019SAndroid Build Coastguard Worker target = pick_target(t, params);
1974*d83cc019SAndroid Build Coastguard Worker
1975*d83cc019SAndroid Build Coastguard Worker for (r = 0; r < pattern->n_rects; r++) {
1976*d83cc019SAndroid Build Coastguard Worker igt_debug("Drawing rect %d\n", r);
1977*d83cc019SAndroid Build Coastguard Worker draw_rect(pattern, target, t->method, r);
1978*d83cc019SAndroid Build Coastguard Worker update_wanted_crc(t, &pattern->crcs[t->format][r]);
1979*d83cc019SAndroid Build Coastguard Worker do_assertions(assertions);
1980*d83cc019SAndroid Build Coastguard Worker }
1981*d83cc019SAndroid Build Coastguard Worker }
1982*d83cc019SAndroid Build Coastguard Worker
1983*d83cc019SAndroid Build Coastguard Worker /*
1984*d83cc019SAndroid Build Coastguard Worker * multidraw - draw a set of rectangles on the screen using alternated drawing
1985*d83cc019SAndroid Build Coastguard Worker * methods
1986*d83cc019SAndroid Build Coastguard Worker *
1987*d83cc019SAndroid Build Coastguard Worker * METHOD
1988*d83cc019SAndroid Build Coastguard Worker * This is just like the draw subtest, but now we keep alternating between two
1989*d83cc019SAndroid Build Coastguard Worker * drawing methods. Each time we run multidraw_subtest we will test all the
1990*d83cc019SAndroid Build Coastguard Worker * possible pairs of drawing methods.
1991*d83cc019SAndroid Build Coastguard Worker *
1992*d83cc019SAndroid Build Coastguard Worker * EXPECTED RESULTS
1993*d83cc019SAndroid Build Coastguard Worker * The same as the draw subtest.
1994*d83cc019SAndroid Build Coastguard Worker *
1995*d83cc019SAndroid Build Coastguard Worker * FAILURES
1996*d83cc019SAndroid Build Coastguard Worker * If you get a failure here, first you need to check whether you also get
1997*d83cc019SAndroid Build Coastguard Worker * failures on the individual draw subtests. If yes, then go fix every single
1998*d83cc019SAndroid Build Coastguard Worker * draw subtest first. If all the draw subtests pass but this one fails, then
1999*d83cc019SAndroid Build Coastguard Worker * you have to study how one drawing method is stopping the other from
2000*d83cc019SAndroid Build Coastguard Worker * properly working.
2001*d83cc019SAndroid Build Coastguard Worker */
multidraw_subtest(const struct test_mode * t)2002*d83cc019SAndroid Build Coastguard Worker static void multidraw_subtest(const struct test_mode *t)
2003*d83cc019SAndroid Build Coastguard Worker {
2004*d83cc019SAndroid Build Coastguard Worker int r;
2005*d83cc019SAndroid Build Coastguard Worker int assertions = 0;
2006*d83cc019SAndroid Build Coastguard Worker struct draw_pattern_info *pattern;
2007*d83cc019SAndroid Build Coastguard Worker struct modeset_params *params = pick_params(t);
2008*d83cc019SAndroid Build Coastguard Worker struct fb_region *target;
2009*d83cc019SAndroid Build Coastguard Worker enum igt_draw_method m1, m2, used_method;
2010*d83cc019SAndroid Build Coastguard Worker bool wc_used = false;
2011*d83cc019SAndroid Build Coastguard Worker
2012*d83cc019SAndroid Build Coastguard Worker switch (t->plane) {
2013*d83cc019SAndroid Build Coastguard Worker case PLANE_PRI:
2014*d83cc019SAndroid Build Coastguard Worker pattern = &pattern1;
2015*d83cc019SAndroid Build Coastguard Worker break;
2016*d83cc019SAndroid Build Coastguard Worker case PLANE_CUR:
2017*d83cc019SAndroid Build Coastguard Worker case PLANE_SPR:
2018*d83cc019SAndroid Build Coastguard Worker pattern = &pattern2;
2019*d83cc019SAndroid Build Coastguard Worker break;
2020*d83cc019SAndroid Build Coastguard Worker default:
2021*d83cc019SAndroid Build Coastguard Worker igt_assert(false);
2022*d83cc019SAndroid Build Coastguard Worker }
2023*d83cc019SAndroid Build Coastguard Worker
2024*d83cc019SAndroid Build Coastguard Worker prepare_subtest(t, pattern);
2025*d83cc019SAndroid Build Coastguard Worker target = pick_target(t, params);
2026*d83cc019SAndroid Build Coastguard Worker
2027*d83cc019SAndroid Build Coastguard Worker for (m1 = 0; m1 < IGT_DRAW_METHOD_COUNT; m1++) {
2028*d83cc019SAndroid Build Coastguard Worker for (m2 = m1 + 1; m2 < IGT_DRAW_METHOD_COUNT; m2++) {
2029*d83cc019SAndroid Build Coastguard Worker
2030*d83cc019SAndroid Build Coastguard Worker igt_debug("Methods %s and %s\n",
2031*d83cc019SAndroid Build Coastguard Worker igt_draw_get_method_name(m1),
2032*d83cc019SAndroid Build Coastguard Worker igt_draw_get_method_name(m2));
2033*d83cc019SAndroid Build Coastguard Worker for (r = 0; r < pattern->n_rects; r++) {
2034*d83cc019SAndroid Build Coastguard Worker used_method = (r % 2 == 0) ? m1 : m2;
2035*d83cc019SAndroid Build Coastguard Worker
2036*d83cc019SAndroid Build Coastguard Worker igt_debug("Used method %s\n",
2037*d83cc019SAndroid Build Coastguard Worker igt_draw_get_method_name(used_method));
2038*d83cc019SAndroid Build Coastguard Worker
2039*d83cc019SAndroid Build Coastguard Worker draw_rect(pattern, target, used_method, r);
2040*d83cc019SAndroid Build Coastguard Worker
2041*d83cc019SAndroid Build Coastguard Worker if (used_method == IGT_DRAW_MMAP_WC ||
2042*d83cc019SAndroid Build Coastguard Worker used_method == IGT_DRAW_MMAP_GTT)
2043*d83cc019SAndroid Build Coastguard Worker wc_used = true;
2044*d83cc019SAndroid Build Coastguard Worker
2045*d83cc019SAndroid Build Coastguard Worker update_wanted_crc(t,
2046*d83cc019SAndroid Build Coastguard Worker &pattern->crcs[t->format][r]);
2047*d83cc019SAndroid Build Coastguard Worker
2048*d83cc019SAndroid Build Coastguard Worker assertions = used_method != IGT_DRAW_MMAP_GTT ?
2049*d83cc019SAndroid Build Coastguard Worker ASSERT_LAST_ACTION_CHANGED :
2050*d83cc019SAndroid Build Coastguard Worker ASSERT_NO_ACTION_CHANGE;
2051*d83cc019SAndroid Build Coastguard Worker if (op_disables_psr(t, used_method) &&
2052*d83cc019SAndroid Build Coastguard Worker !wc_used)
2053*d83cc019SAndroid Build Coastguard Worker assertions |= ASSERT_PSR_DISABLED;
2054*d83cc019SAndroid Build Coastguard Worker
2055*d83cc019SAndroid Build Coastguard Worker do_assertions(assertions);
2056*d83cc019SAndroid Build Coastguard Worker }
2057*d83cc019SAndroid Build Coastguard Worker
2058*d83cc019SAndroid Build Coastguard Worker fill_fb_region(target, COLOR_PRIM_BG);
2059*d83cc019SAndroid Build Coastguard Worker
2060*d83cc019SAndroid Build Coastguard Worker update_wanted_crc(t, &blue_crcs[t->format].crc);
2061*d83cc019SAndroid Build Coastguard Worker do_assertions(ASSERT_NO_ACTION_CHANGE);
2062*d83cc019SAndroid Build Coastguard Worker }
2063*d83cc019SAndroid Build Coastguard Worker }
2064*d83cc019SAndroid Build Coastguard Worker }
2065*d83cc019SAndroid Build Coastguard Worker
format_is_valid(int feature_flags,enum pixel_format format)2066*d83cc019SAndroid Build Coastguard Worker static bool format_is_valid(int feature_flags,
2067*d83cc019SAndroid Build Coastguard Worker enum pixel_format format)
2068*d83cc019SAndroid Build Coastguard Worker {
2069*d83cc019SAndroid Build Coastguard Worker int devid = intel_get_drm_devid(drm.fd);
2070*d83cc019SAndroid Build Coastguard Worker
2071*d83cc019SAndroid Build Coastguard Worker if (!(feature_flags & FEATURE_FBC))
2072*d83cc019SAndroid Build Coastguard Worker return true;
2073*d83cc019SAndroid Build Coastguard Worker
2074*d83cc019SAndroid Build Coastguard Worker switch (format) {
2075*d83cc019SAndroid Build Coastguard Worker case FORMAT_RGB888:
2076*d83cc019SAndroid Build Coastguard Worker return true;
2077*d83cc019SAndroid Build Coastguard Worker case FORMAT_RGB565:
2078*d83cc019SAndroid Build Coastguard Worker if (IS_GEN2(devid) || IS_G4X(devid))
2079*d83cc019SAndroid Build Coastguard Worker return false;
2080*d83cc019SAndroid Build Coastguard Worker return true;
2081*d83cc019SAndroid Build Coastguard Worker case FORMAT_RGB101010:
2082*d83cc019SAndroid Build Coastguard Worker return false;
2083*d83cc019SAndroid Build Coastguard Worker default:
2084*d83cc019SAndroid Build Coastguard Worker igt_assert(false);
2085*d83cc019SAndroid Build Coastguard Worker }
2086*d83cc019SAndroid Build Coastguard Worker }
2087*d83cc019SAndroid Build Coastguard Worker
2088*d83cc019SAndroid Build Coastguard Worker /*
2089*d83cc019SAndroid Build Coastguard Worker * badformat - test pixel formats that are not supported by at least one feature
2090*d83cc019SAndroid Build Coastguard Worker *
2091*d83cc019SAndroid Build Coastguard Worker * METHOD
2092*d83cc019SAndroid Build Coastguard Worker * We just do a modeset on a buffer with the given pixel format and check the
2093*d83cc019SAndroid Build Coastguard Worker * status of the relevant features.
2094*d83cc019SAndroid Build Coastguard Worker *
2095*d83cc019SAndroid Build Coastguard Worker * EXPECTED RESULTS
2096*d83cc019SAndroid Build Coastguard Worker * No assertion failures :)
2097*d83cc019SAndroid Build Coastguard Worker *
2098*d83cc019SAndroid Build Coastguard Worker * FAILURES
2099*d83cc019SAndroid Build Coastguard Worker * If you get a feature enabled/disabled assertion failure, then you should
2100*d83cc019SAndroid Build Coastguard Worker * probably check the Kernel code for the feature that checks the pixel
2101*d83cc019SAndroid Build Coastguard Worker * formats. If you get a CRC assertion failure, then you should use the
2102*d83cc019SAndroid Build Coastguard Worker * appropriate command line arguments that will allow you to look at the
2103*d83cc019SAndroid Build Coastguard Worker * screen, then judge what to do based on what you see.
2104*d83cc019SAndroid Build Coastguard Worker */
badformat_subtest(const struct test_mode * t)2105*d83cc019SAndroid Build Coastguard Worker static void badformat_subtest(const struct test_mode *t)
2106*d83cc019SAndroid Build Coastguard Worker {
2107*d83cc019SAndroid Build Coastguard Worker bool fbc_valid = format_is_valid(FEATURE_FBC, t->format);
2108*d83cc019SAndroid Build Coastguard Worker bool psr_valid = format_is_valid(FEATURE_PSR, t->format);
2109*d83cc019SAndroid Build Coastguard Worker int assertions = ASSERT_NO_ACTION_CHANGE;
2110*d83cc019SAndroid Build Coastguard Worker
2111*d83cc019SAndroid Build Coastguard Worker prepare_subtest_data(t, NULL);
2112*d83cc019SAndroid Build Coastguard Worker
2113*d83cc019SAndroid Build Coastguard Worker fill_fb_region(&prim_mode_params.primary, COLOR_PRIM_BG);
2114*d83cc019SAndroid Build Coastguard Worker set_mode_for_params(&prim_mode_params);
2115*d83cc019SAndroid Build Coastguard Worker
2116*d83cc019SAndroid Build Coastguard Worker wanted_crc = &blue_crcs[t->format].crc;
2117*d83cc019SAndroid Build Coastguard Worker
2118*d83cc019SAndroid Build Coastguard Worker if (!fbc_valid)
2119*d83cc019SAndroid Build Coastguard Worker assertions |= ASSERT_FBC_DISABLED;
2120*d83cc019SAndroid Build Coastguard Worker if (!psr_valid)
2121*d83cc019SAndroid Build Coastguard Worker assertions |= ASSERT_PSR_DISABLED;
2122*d83cc019SAndroid Build Coastguard Worker do_assertions(assertions);
2123*d83cc019SAndroid Build Coastguard Worker }
2124*d83cc019SAndroid Build Coastguard Worker
2125*d83cc019SAndroid Build Coastguard Worker /*
2126*d83cc019SAndroid Build Coastguard Worker * format_draw - test pixel formats that are not FORMAT_DEFAULT
2127*d83cc019SAndroid Build Coastguard Worker *
2128*d83cc019SAndroid Build Coastguard Worker * METHOD
2129*d83cc019SAndroid Build Coastguard Worker * The real subtest to be executed depends on whether the pixel format is
2130*d83cc019SAndroid Build Coastguard Worker * supported by the features being tested or not. Check the documentation of
2131*d83cc019SAndroid Build Coastguard Worker * each subtest.
2132*d83cc019SAndroid Build Coastguard Worker *
2133*d83cc019SAndroid Build Coastguard Worker * EXPECTED RESULTS
2134*d83cc019SAndroid Build Coastguard Worker * See the documentation for each subtest.
2135*d83cc019SAndroid Build Coastguard Worker *
2136*d83cc019SAndroid Build Coastguard Worker * FAILURES
2137*d83cc019SAndroid Build Coastguard Worker * See the documentation for each subtest.
2138*d83cc019SAndroid Build Coastguard Worker */
format_draw_subtest(const struct test_mode * t)2139*d83cc019SAndroid Build Coastguard Worker static void format_draw_subtest(const struct test_mode *t)
2140*d83cc019SAndroid Build Coastguard Worker {
2141*d83cc019SAndroid Build Coastguard Worker if (format_is_valid(t->feature, t->format))
2142*d83cc019SAndroid Build Coastguard Worker draw_subtest(t);
2143*d83cc019SAndroid Build Coastguard Worker else
2144*d83cc019SAndroid Build Coastguard Worker badformat_subtest(t);
2145*d83cc019SAndroid Build Coastguard Worker }
2146*d83cc019SAndroid Build Coastguard Worker
2147*d83cc019SAndroid Build Coastguard Worker /*
2148*d83cc019SAndroid Build Coastguard Worker * slow_draw - sleep a little bit between drawing operations
2149*d83cc019SAndroid Build Coastguard Worker *
2150*d83cc019SAndroid Build Coastguard Worker * METHOD
2151*d83cc019SAndroid Build Coastguard Worker * This test is basically the same as the draw subtest, except that we sleep a
2152*d83cc019SAndroid Build Coastguard Worker * little bit after each drawing operation. The goal is to detect problems
2153*d83cc019SAndroid Build Coastguard Worker * that can happen in case a drawing operation is done while the machine is in
2154*d83cc019SAndroid Build Coastguard Worker * some deep sleep states.
2155*d83cc019SAndroid Build Coastguard Worker *
2156*d83cc019SAndroid Build Coastguard Worker * EXPECTED RESULTS
2157*d83cc019SAndroid Build Coastguard Worker * The pattern appears on the screen as expected.
2158*d83cc019SAndroid Build Coastguard Worker *
2159*d83cc019SAndroid Build Coastguard Worker * FAILURES
2160*d83cc019SAndroid Build Coastguard Worker * I've seen this happen in a SKL machine and still haven't investigated it.
2161*d83cc019SAndroid Build Coastguard Worker * My guess would be that preventing deep sleep states fixes the problem.
2162*d83cc019SAndroid Build Coastguard Worker */
slow_draw_subtest(const struct test_mode * t)2163*d83cc019SAndroid Build Coastguard Worker static void slow_draw_subtest(const struct test_mode *t)
2164*d83cc019SAndroid Build Coastguard Worker {
2165*d83cc019SAndroid Build Coastguard Worker int r;
2166*d83cc019SAndroid Build Coastguard Worker struct draw_pattern_info *pattern = &pattern1;
2167*d83cc019SAndroid Build Coastguard Worker struct modeset_params *params = pick_params(t);
2168*d83cc019SAndroid Build Coastguard Worker struct fb_region *target;
2169*d83cc019SAndroid Build Coastguard Worker
2170*d83cc019SAndroid Build Coastguard Worker prepare_subtest(t, pattern);
2171*d83cc019SAndroid Build Coastguard Worker sleep(2);
2172*d83cc019SAndroid Build Coastguard Worker target = pick_target(t, params);
2173*d83cc019SAndroid Build Coastguard Worker
2174*d83cc019SAndroid Build Coastguard Worker for (r = 0; r < pattern->n_rects; r++) {
2175*d83cc019SAndroid Build Coastguard Worker sleep(2);
2176*d83cc019SAndroid Build Coastguard Worker draw_rect(pattern, target, t->method, r);
2177*d83cc019SAndroid Build Coastguard Worker sleep(2);
2178*d83cc019SAndroid Build Coastguard Worker
2179*d83cc019SAndroid Build Coastguard Worker update_wanted_crc(t, &pattern->crcs[t->format][r]);
2180*d83cc019SAndroid Build Coastguard Worker
2181*d83cc019SAndroid Build Coastguard Worker if (t->feature & FEATURE_DRRS)
2182*d83cc019SAndroid Build Coastguard Worker do_assertions(ASSERT_DRRS_LOW);
2183*d83cc019SAndroid Build Coastguard Worker else
2184*d83cc019SAndroid Build Coastguard Worker do_assertions(0);
2185*d83cc019SAndroid Build Coastguard Worker }
2186*d83cc019SAndroid Build Coastguard Worker }
2187*d83cc019SAndroid Build Coastguard Worker
flip_handler(int fd,unsigned int sequence,unsigned int tv_sec,unsigned int tv_usec,void * data)2188*d83cc019SAndroid Build Coastguard Worker static void flip_handler(int fd, unsigned int sequence, unsigned int tv_sec,
2189*d83cc019SAndroid Build Coastguard Worker unsigned int tv_usec, void *data)
2190*d83cc019SAndroid Build Coastguard Worker {
2191*d83cc019SAndroid Build Coastguard Worker igt_debug("Flip event received.\n");
2192*d83cc019SAndroid Build Coastguard Worker }
2193*d83cc019SAndroid Build Coastguard Worker
wait_flip_event(void)2194*d83cc019SAndroid Build Coastguard Worker static void wait_flip_event(void)
2195*d83cc019SAndroid Build Coastguard Worker {
2196*d83cc019SAndroid Build Coastguard Worker int rc;
2197*d83cc019SAndroid Build Coastguard Worker drmEventContext evctx;
2198*d83cc019SAndroid Build Coastguard Worker struct pollfd pfd;
2199*d83cc019SAndroid Build Coastguard Worker
2200*d83cc019SAndroid Build Coastguard Worker evctx.version = 2;
2201*d83cc019SAndroid Build Coastguard Worker evctx.vblank_handler = NULL;
2202*d83cc019SAndroid Build Coastguard Worker evctx.page_flip_handler = flip_handler;
2203*d83cc019SAndroid Build Coastguard Worker
2204*d83cc019SAndroid Build Coastguard Worker pfd.fd = drm.fd;
2205*d83cc019SAndroid Build Coastguard Worker pfd.events = POLLIN;
2206*d83cc019SAndroid Build Coastguard Worker pfd.revents = 0;
2207*d83cc019SAndroid Build Coastguard Worker
2208*d83cc019SAndroid Build Coastguard Worker rc = poll(&pfd, 1, 1000);
2209*d83cc019SAndroid Build Coastguard Worker switch (rc) {
2210*d83cc019SAndroid Build Coastguard Worker case 0:
2211*d83cc019SAndroid Build Coastguard Worker igt_assert_f(false, "Poll timeout\n");
2212*d83cc019SAndroid Build Coastguard Worker break;
2213*d83cc019SAndroid Build Coastguard Worker case 1:
2214*d83cc019SAndroid Build Coastguard Worker rc = drmHandleEvent(drm.fd, &evctx);
2215*d83cc019SAndroid Build Coastguard Worker igt_assert_eq(rc, 0);
2216*d83cc019SAndroid Build Coastguard Worker break;
2217*d83cc019SAndroid Build Coastguard Worker default:
2218*d83cc019SAndroid Build Coastguard Worker igt_assert_f(false, "Unexpected poll rc %d\n", rc);
2219*d83cc019SAndroid Build Coastguard Worker break;
2220*d83cc019SAndroid Build Coastguard Worker }
2221*d83cc019SAndroid Build Coastguard Worker }
2222*d83cc019SAndroid Build Coastguard Worker
set_prim_plane_for_params(struct modeset_params * params)2223*d83cc019SAndroid Build Coastguard Worker static void set_prim_plane_for_params(struct modeset_params *params)
2224*d83cc019SAndroid Build Coastguard Worker {
2225*d83cc019SAndroid Build Coastguard Worker __set_prim_plane_for_params(params);
2226*d83cc019SAndroid Build Coastguard Worker igt_display_commit2(&drm.display, COMMIT_UNIVERSAL);
2227*d83cc019SAndroid Build Coastguard Worker }
2228*d83cc019SAndroid Build Coastguard Worker
page_flip_for_params(struct modeset_params * params,enum flip_type type)2229*d83cc019SAndroid Build Coastguard Worker static void page_flip_for_params(struct modeset_params *params,
2230*d83cc019SAndroid Build Coastguard Worker enum flip_type type)
2231*d83cc019SAndroid Build Coastguard Worker {
2232*d83cc019SAndroid Build Coastguard Worker int rc;
2233*d83cc019SAndroid Build Coastguard Worker
2234*d83cc019SAndroid Build Coastguard Worker switch (type) {
2235*d83cc019SAndroid Build Coastguard Worker case FLIP_PAGEFLIP:
2236*d83cc019SAndroid Build Coastguard Worker rc = drmModePageFlip(drm.fd, drm.display.pipes[params->pipe].crtc_id,
2237*d83cc019SAndroid Build Coastguard Worker params->primary.fb->fb_id,
2238*d83cc019SAndroid Build Coastguard Worker DRM_MODE_PAGE_FLIP_EVENT, NULL);
2239*d83cc019SAndroid Build Coastguard Worker igt_assert_eq(rc, 0);
2240*d83cc019SAndroid Build Coastguard Worker wait_flip_event();
2241*d83cc019SAndroid Build Coastguard Worker break;
2242*d83cc019SAndroid Build Coastguard Worker case FLIP_MODESET:
2243*d83cc019SAndroid Build Coastguard Worker set_mode_for_params(params);
2244*d83cc019SAndroid Build Coastguard Worker break;
2245*d83cc019SAndroid Build Coastguard Worker case FLIP_PLANES:
2246*d83cc019SAndroid Build Coastguard Worker set_prim_plane_for_params(params);
2247*d83cc019SAndroid Build Coastguard Worker break;
2248*d83cc019SAndroid Build Coastguard Worker default:
2249*d83cc019SAndroid Build Coastguard Worker igt_assert(false);
2250*d83cc019SAndroid Build Coastguard Worker }
2251*d83cc019SAndroid Build Coastguard Worker }
2252*d83cc019SAndroid Build Coastguard Worker
2253*d83cc019SAndroid Build Coastguard Worker /*
2254*d83cc019SAndroid Build Coastguard Worker * flip - just exercise page flips with the patterns we have
2255*d83cc019SAndroid Build Coastguard Worker *
2256*d83cc019SAndroid Build Coastguard Worker * METHOD
2257*d83cc019SAndroid Build Coastguard Worker * We draw the pattern on a backbuffer using the provided method, then we
2258*d83cc019SAndroid Build Coastguard Worker * flip, making this the frontbuffer. We can flip both using the dedicated
2259*d83cc019SAndroid Build Coastguard Worker * pageflip IOCTL or the modeset IOCTL.
2260*d83cc019SAndroid Build Coastguard Worker *
2261*d83cc019SAndroid Build Coastguard Worker * EXPECTED RESULTS
2262*d83cc019SAndroid Build Coastguard Worker * Everything works as expected, screen contents are properly updated.
2263*d83cc019SAndroid Build Coastguard Worker *
2264*d83cc019SAndroid Build Coastguard Worker * FAILURES
2265*d83cc019SAndroid Build Coastguard Worker * On a failure here you need to go directly to the Kernel's flip code and see
2266*d83cc019SAndroid Build Coastguard Worker * how it interacts with the feature being tested.
2267*d83cc019SAndroid Build Coastguard Worker */
flip_subtest(const struct test_mode * t)2268*d83cc019SAndroid Build Coastguard Worker static void flip_subtest(const struct test_mode *t)
2269*d83cc019SAndroid Build Coastguard Worker {
2270*d83cc019SAndroid Build Coastguard Worker int r;
2271*d83cc019SAndroid Build Coastguard Worker int assertions = 0;
2272*d83cc019SAndroid Build Coastguard Worker struct igt_fb fb2, *orig_fb;
2273*d83cc019SAndroid Build Coastguard Worker struct modeset_params *params = pick_params(t);
2274*d83cc019SAndroid Build Coastguard Worker struct draw_pattern_info *pattern = &pattern1;
2275*d83cc019SAndroid Build Coastguard Worker enum color bg_color;
2276*d83cc019SAndroid Build Coastguard Worker
2277*d83cc019SAndroid Build Coastguard Worker switch (t->screen) {
2278*d83cc019SAndroid Build Coastguard Worker case SCREEN_PRIM:
2279*d83cc019SAndroid Build Coastguard Worker assertions |= ASSERT_LAST_ACTION_CHANGED;
2280*d83cc019SAndroid Build Coastguard Worker bg_color = COLOR_PRIM_BG;
2281*d83cc019SAndroid Build Coastguard Worker break;
2282*d83cc019SAndroid Build Coastguard Worker case SCREEN_SCND:
2283*d83cc019SAndroid Build Coastguard Worker assertions |= ASSERT_NO_ACTION_CHANGE;
2284*d83cc019SAndroid Build Coastguard Worker bg_color = COLOR_SCND_BG;
2285*d83cc019SAndroid Build Coastguard Worker break;
2286*d83cc019SAndroid Build Coastguard Worker default:
2287*d83cc019SAndroid Build Coastguard Worker igt_assert(false);
2288*d83cc019SAndroid Build Coastguard Worker }
2289*d83cc019SAndroid Build Coastguard Worker
2290*d83cc019SAndroid Build Coastguard Worker prepare_subtest(t, pattern);
2291*d83cc019SAndroid Build Coastguard Worker
2292*d83cc019SAndroid Build Coastguard Worker create_fb(t->format, params->primary.fb->width, params->primary.fb->height,
2293*d83cc019SAndroid Build Coastguard Worker opt.tiling, t->plane, &fb2);
2294*d83cc019SAndroid Build Coastguard Worker fill_fb(&fb2, bg_color);
2295*d83cc019SAndroid Build Coastguard Worker orig_fb = params->primary.fb;
2296*d83cc019SAndroid Build Coastguard Worker
2297*d83cc019SAndroid Build Coastguard Worker for (r = 0; r < pattern->n_rects; r++) {
2298*d83cc019SAndroid Build Coastguard Worker params->primary.fb = (r % 2 == 0) ? &fb2 : orig_fb;
2299*d83cc019SAndroid Build Coastguard Worker
2300*d83cc019SAndroid Build Coastguard Worker if (r != 0)
2301*d83cc019SAndroid Build Coastguard Worker draw_rect(pattern, ¶ms->primary, t->method, r - 1);
2302*d83cc019SAndroid Build Coastguard Worker draw_rect(pattern, ¶ms->primary, t->method, r);
2303*d83cc019SAndroid Build Coastguard Worker update_wanted_crc(t, &pattern->crcs[t->format][r]);
2304*d83cc019SAndroid Build Coastguard Worker
2305*d83cc019SAndroid Build Coastguard Worker page_flip_for_params(params, t->flip);
2306*d83cc019SAndroid Build Coastguard Worker
2307*d83cc019SAndroid Build Coastguard Worker do_assertions(assertions);
2308*d83cc019SAndroid Build Coastguard Worker }
2309*d83cc019SAndroid Build Coastguard Worker
2310*d83cc019SAndroid Build Coastguard Worker igt_remove_fb(drm.fd, &fb2);
2311*d83cc019SAndroid Build Coastguard Worker }
2312*d83cc019SAndroid Build Coastguard Worker
2313*d83cc019SAndroid Build Coastguard Worker /*
2314*d83cc019SAndroid Build Coastguard Worker * fliptrack - check if the hardware tracking works after page flips
2315*d83cc019SAndroid Build Coastguard Worker *
2316*d83cc019SAndroid Build Coastguard Worker * METHOD
2317*d83cc019SAndroid Build Coastguard Worker * Flip to a new buffer, then draw on it using MMAP_GTT and check the CRC to
2318*d83cc019SAndroid Build Coastguard Worker * make sure the hardware tracking detected the write.
2319*d83cc019SAndroid Build Coastguard Worker *
2320*d83cc019SAndroid Build Coastguard Worker * EXPECTED RESULTS
2321*d83cc019SAndroid Build Coastguard Worker * Everything works as expected, screen contents are properly updated.
2322*d83cc019SAndroid Build Coastguard Worker *
2323*d83cc019SAndroid Build Coastguard Worker * FAILURES
2324*d83cc019SAndroid Build Coastguard Worker * First you need to check if the draw and flip subtests pass. Only after both
2325*d83cc019SAndroid Build Coastguard Worker * are passing this test can be useful. If we're failing only on this subtest,
2326*d83cc019SAndroid Build Coastguard Worker * then maybe we are not properly updating the hardware tracking registers
2327*d83cc019SAndroid Build Coastguard Worker * during the flip operations.
2328*d83cc019SAndroid Build Coastguard Worker */
fliptrack_subtest(const struct test_mode * t,enum flip_type type)2329*d83cc019SAndroid Build Coastguard Worker static void fliptrack_subtest(const struct test_mode *t, enum flip_type type)
2330*d83cc019SAndroid Build Coastguard Worker {
2331*d83cc019SAndroid Build Coastguard Worker int r;
2332*d83cc019SAndroid Build Coastguard Worker struct igt_fb fb2, *orig_fb;
2333*d83cc019SAndroid Build Coastguard Worker struct modeset_params *params = pick_params(t);
2334*d83cc019SAndroid Build Coastguard Worker struct draw_pattern_info *pattern = &pattern1;
2335*d83cc019SAndroid Build Coastguard Worker
2336*d83cc019SAndroid Build Coastguard Worker prepare_subtest(t, pattern);
2337*d83cc019SAndroid Build Coastguard Worker
2338*d83cc019SAndroid Build Coastguard Worker create_fb(t->format, params->primary.fb->width, params->primary.fb->height,
2339*d83cc019SAndroid Build Coastguard Worker opt.tiling, t->plane, &fb2);
2340*d83cc019SAndroid Build Coastguard Worker fill_fb(&fb2, COLOR_PRIM_BG);
2341*d83cc019SAndroid Build Coastguard Worker orig_fb = params->primary.fb;
2342*d83cc019SAndroid Build Coastguard Worker
2343*d83cc019SAndroid Build Coastguard Worker for (r = 0; r < pattern->n_rects; r++) {
2344*d83cc019SAndroid Build Coastguard Worker params->primary.fb = (r % 2 == 0) ? &fb2 : orig_fb;
2345*d83cc019SAndroid Build Coastguard Worker
2346*d83cc019SAndroid Build Coastguard Worker if (r != 0)
2347*d83cc019SAndroid Build Coastguard Worker draw_rect(pattern, ¶ms->primary, t->method, r - 1);
2348*d83cc019SAndroid Build Coastguard Worker
2349*d83cc019SAndroid Build Coastguard Worker page_flip_for_params(params, type);
2350*d83cc019SAndroid Build Coastguard Worker do_assertions(0);
2351*d83cc019SAndroid Build Coastguard Worker
2352*d83cc019SAndroid Build Coastguard Worker draw_rect(pattern, ¶ms->primary, t->method, r);
2353*d83cc019SAndroid Build Coastguard Worker update_wanted_crc(t, &pattern->crcs[t->format][r]);
2354*d83cc019SAndroid Build Coastguard Worker
2355*d83cc019SAndroid Build Coastguard Worker do_assertions(ASSERT_PSR_DISABLED);
2356*d83cc019SAndroid Build Coastguard Worker }
2357*d83cc019SAndroid Build Coastguard Worker
2358*d83cc019SAndroid Build Coastguard Worker igt_remove_fb(drm.fd, &fb2);
2359*d83cc019SAndroid Build Coastguard Worker }
2360*d83cc019SAndroid Build Coastguard Worker
2361*d83cc019SAndroid Build Coastguard Worker /*
2362*d83cc019SAndroid Build Coastguard Worker * move - just move the sprite or cursor around
2363*d83cc019SAndroid Build Coastguard Worker *
2364*d83cc019SAndroid Build Coastguard Worker * METHOD
2365*d83cc019SAndroid Build Coastguard Worker * Move the surface around, following the defined pattern.
2366*d83cc019SAndroid Build Coastguard Worker *
2367*d83cc019SAndroid Build Coastguard Worker * EXPECTED RESULTS
2368*d83cc019SAndroid Build Coastguard Worker * The move operations are properly detected by the Kernel, and the screen is
2369*d83cc019SAndroid Build Coastguard Worker * properly updated every time.
2370*d83cc019SAndroid Build Coastguard Worker *
2371*d83cc019SAndroid Build Coastguard Worker * FAILURES
2372*d83cc019SAndroid Build Coastguard Worker * If you get a failure here, check how the Kernel is enabling or disabling
2373*d83cc019SAndroid Build Coastguard Worker * your feature when it moves the planes around.
2374*d83cc019SAndroid Build Coastguard Worker */
move_subtest(const struct test_mode * t)2375*d83cc019SAndroid Build Coastguard Worker static void move_subtest(const struct test_mode *t)
2376*d83cc019SAndroid Build Coastguard Worker {
2377*d83cc019SAndroid Build Coastguard Worker int r;
2378*d83cc019SAndroid Build Coastguard Worker int assertions = ASSERT_NO_ACTION_CHANGE;
2379*d83cc019SAndroid Build Coastguard Worker struct modeset_params *params = pick_params(t);
2380*d83cc019SAndroid Build Coastguard Worker struct draw_pattern_info *pattern = &pattern3;
2381*d83cc019SAndroid Build Coastguard Worker struct fb_region *reg = pick_target(t, params);
2382*d83cc019SAndroid Build Coastguard Worker bool repeat = false;
2383*d83cc019SAndroid Build Coastguard Worker
2384*d83cc019SAndroid Build Coastguard Worker prepare_subtest(t, pattern);
2385*d83cc019SAndroid Build Coastguard Worker
2386*d83cc019SAndroid Build Coastguard Worker /* Just paint the right color since we start at 0x0. */
2387*d83cc019SAndroid Build Coastguard Worker draw_rect(pattern, reg, t->method, 0);
2388*d83cc019SAndroid Build Coastguard Worker update_wanted_crc(t, &pattern->crcs[t->format][0]);
2389*d83cc019SAndroid Build Coastguard Worker
2390*d83cc019SAndroid Build Coastguard Worker do_assertions(assertions);
2391*d83cc019SAndroid Build Coastguard Worker
2392*d83cc019SAndroid Build Coastguard Worker for (r = 1; r < pattern->n_rects; r++) {
2393*d83cc019SAndroid Build Coastguard Worker struct rect rect = pattern->get_rect(¶ms->primary, r);
2394*d83cc019SAndroid Build Coastguard Worker
2395*d83cc019SAndroid Build Coastguard Worker igt_plane_set_fb(reg->plane, reg->fb);
2396*d83cc019SAndroid Build Coastguard Worker igt_plane_set_position(reg->plane, rect.x, rect.y);
2397*d83cc019SAndroid Build Coastguard Worker igt_plane_set_size(reg->plane, rect.w, rect.h);
2398*d83cc019SAndroid Build Coastguard Worker igt_fb_set_size(reg->fb, reg->plane, rect.w, rect.h);
2399*d83cc019SAndroid Build Coastguard Worker igt_display_commit2(&drm.display, COMMIT_UNIVERSAL);
2400*d83cc019SAndroid Build Coastguard Worker
2401*d83cc019SAndroid Build Coastguard Worker update_wanted_crc(t, &pattern->crcs[t->format][r]);
2402*d83cc019SAndroid Build Coastguard Worker
2403*d83cc019SAndroid Build Coastguard Worker do_assertions(assertions);
2404*d83cc019SAndroid Build Coastguard Worker
2405*d83cc019SAndroid Build Coastguard Worker /* "Move" the last rect to the same position just to make sure
2406*d83cc019SAndroid Build Coastguard Worker * this works too. */
2407*d83cc019SAndroid Build Coastguard Worker if (r+1 == pattern->n_rects && !repeat) {
2408*d83cc019SAndroid Build Coastguard Worker repeat = true;
2409*d83cc019SAndroid Build Coastguard Worker r--;
2410*d83cc019SAndroid Build Coastguard Worker }
2411*d83cc019SAndroid Build Coastguard Worker }
2412*d83cc019SAndroid Build Coastguard Worker }
2413*d83cc019SAndroid Build Coastguard Worker
2414*d83cc019SAndroid Build Coastguard Worker /*
2415*d83cc019SAndroid Build Coastguard Worker * onoff - just enable and disable the sprite or cursor plane a few times
2416*d83cc019SAndroid Build Coastguard Worker *
2417*d83cc019SAndroid Build Coastguard Worker * METHOD
2418*d83cc019SAndroid Build Coastguard Worker * Just enable and disable the desired plane a few times.
2419*d83cc019SAndroid Build Coastguard Worker *
2420*d83cc019SAndroid Build Coastguard Worker * EXPECTED RESULTS
2421*d83cc019SAndroid Build Coastguard Worker * Everything is properly detected by the Kernel and the screen contents are
2422*d83cc019SAndroid Build Coastguard Worker * accurate.
2423*d83cc019SAndroid Build Coastguard Worker *
2424*d83cc019SAndroid Build Coastguard Worker * FAILURES
2425*d83cc019SAndroid Build Coastguard Worker * As usual, if you get a failure here you need to check how the feature is
2426*d83cc019SAndroid Build Coastguard Worker * being handled when the planes are enabled or disabled.
2427*d83cc019SAndroid Build Coastguard Worker */
onoff_subtest(const struct test_mode * t)2428*d83cc019SAndroid Build Coastguard Worker static void onoff_subtest(const struct test_mode *t)
2429*d83cc019SAndroid Build Coastguard Worker {
2430*d83cc019SAndroid Build Coastguard Worker int r;
2431*d83cc019SAndroid Build Coastguard Worker int assertions = ASSERT_NO_ACTION_CHANGE;
2432*d83cc019SAndroid Build Coastguard Worker struct modeset_params *params = pick_params(t);
2433*d83cc019SAndroid Build Coastguard Worker struct draw_pattern_info *pattern = &pattern3;
2434*d83cc019SAndroid Build Coastguard Worker
2435*d83cc019SAndroid Build Coastguard Worker prepare_subtest(t, pattern);
2436*d83cc019SAndroid Build Coastguard Worker
2437*d83cc019SAndroid Build Coastguard Worker /* Just paint the right color since we start at 0x0. */
2438*d83cc019SAndroid Build Coastguard Worker draw_rect(pattern, pick_target(t, params), t->method, 0);
2439*d83cc019SAndroid Build Coastguard Worker update_wanted_crc(t, &pattern->crcs[t->format][0]);
2440*d83cc019SAndroid Build Coastguard Worker do_assertions(assertions);
2441*d83cc019SAndroid Build Coastguard Worker
2442*d83cc019SAndroid Build Coastguard Worker for (r = 0; r < 4; r++) {
2443*d83cc019SAndroid Build Coastguard Worker struct fb_region *reg = pick_target(t, params);
2444*d83cc019SAndroid Build Coastguard Worker
2445*d83cc019SAndroid Build Coastguard Worker if (r % 2 == 0) {
2446*d83cc019SAndroid Build Coastguard Worker igt_plane_set_fb(reg->plane, NULL);
2447*d83cc019SAndroid Build Coastguard Worker igt_display_commit(&drm.display);
2448*d83cc019SAndroid Build Coastguard Worker
2449*d83cc019SAndroid Build Coastguard Worker update_wanted_crc(t, &blue_crcs[t->format].crc);
2450*d83cc019SAndroid Build Coastguard Worker
2451*d83cc019SAndroid Build Coastguard Worker } else {
2452*d83cc019SAndroid Build Coastguard Worker igt_plane_set_fb(reg->plane, reg->fb);
2453*d83cc019SAndroid Build Coastguard Worker igt_plane_set_size(reg->plane, reg->w, reg->h);
2454*d83cc019SAndroid Build Coastguard Worker igt_fb_set_size(reg->fb, reg->plane, reg->w, reg->h);
2455*d83cc019SAndroid Build Coastguard Worker igt_display_commit(&drm.display);
2456*d83cc019SAndroid Build Coastguard Worker
2457*d83cc019SAndroid Build Coastguard Worker update_wanted_crc(t, &pattern->crcs[t->format][0]);
2458*d83cc019SAndroid Build Coastguard Worker }
2459*d83cc019SAndroid Build Coastguard Worker
2460*d83cc019SAndroid Build Coastguard Worker do_assertions(assertions);
2461*d83cc019SAndroid Build Coastguard Worker }
2462*d83cc019SAndroid Build Coastguard Worker }
2463*d83cc019SAndroid Build Coastguard Worker
prim_plane_disabled(void)2464*d83cc019SAndroid Build Coastguard Worker static bool prim_plane_disabled(void)
2465*d83cc019SAndroid Build Coastguard Worker {
2466*d83cc019SAndroid Build Coastguard Worker /*
2467*d83cc019SAndroid Build Coastguard Worker * Cannot use igt_plane_get_prop here to retrieve fb_id,
2468*d83cc019SAndroid Build Coastguard Worker * the testsuite doesn't require ATOMIC.
2469*d83cc019SAndroid Build Coastguard Worker */
2470*d83cc019SAndroid Build Coastguard Worker return !prim_mode_params.primary.plane->values[IGT_PLANE_FB_ID];
2471*d83cc019SAndroid Build Coastguard Worker }
2472*d83cc019SAndroid Build Coastguard Worker
2473*d83cc019SAndroid Build Coastguard Worker /*
2474*d83cc019SAndroid Build Coastguard Worker * fullscreen_plane - put a fullscreen plane covering the whole screen
2475*d83cc019SAndroid Build Coastguard Worker *
2476*d83cc019SAndroid Build Coastguard Worker * METHOD
2477*d83cc019SAndroid Build Coastguard Worker * As simple as the description above.
2478*d83cc019SAndroid Build Coastguard Worker *
2479*d83cc019SAndroid Build Coastguard Worker * EXPECTED RESULTS
2480*d83cc019SAndroid Build Coastguard Worker * It depends on the feature being tested. FBC gets disabled, but PSR doesn't.
2481*d83cc019SAndroid Build Coastguard Worker *
2482*d83cc019SAndroid Build Coastguard Worker * FAILURES
2483*d83cc019SAndroid Build Coastguard Worker * Again, if you get failures here you need to dig into the Kernel code, see
2484*d83cc019SAndroid Build Coastguard Worker * how it is handling your feature on this specific case.
2485*d83cc019SAndroid Build Coastguard Worker */
fullscreen_plane_subtest(const struct test_mode * t)2486*d83cc019SAndroid Build Coastguard Worker static void fullscreen_plane_subtest(const struct test_mode *t)
2487*d83cc019SAndroid Build Coastguard Worker {
2488*d83cc019SAndroid Build Coastguard Worker struct draw_pattern_info *pattern = &pattern4;
2489*d83cc019SAndroid Build Coastguard Worker struct igt_fb fullscreen_fb;
2490*d83cc019SAndroid Build Coastguard Worker struct rect rect;
2491*d83cc019SAndroid Build Coastguard Worker struct modeset_params *params = pick_params(t);
2492*d83cc019SAndroid Build Coastguard Worker int assertions;
2493*d83cc019SAndroid Build Coastguard Worker
2494*d83cc019SAndroid Build Coastguard Worker prepare_subtest(t, pattern);
2495*d83cc019SAndroid Build Coastguard Worker
2496*d83cc019SAndroid Build Coastguard Worker rect = pattern->get_rect(¶ms->primary, 0);
2497*d83cc019SAndroid Build Coastguard Worker create_fb(t->format, rect.w, rect.h, opt.tiling, t->plane,
2498*d83cc019SAndroid Build Coastguard Worker &fullscreen_fb);
2499*d83cc019SAndroid Build Coastguard Worker /* Call pick_color() again since PRI and SPR may not support the same
2500*d83cc019SAndroid Build Coastguard Worker * pixel formats. */
2501*d83cc019SAndroid Build Coastguard Worker rect.color = pick_color(&fullscreen_fb, COLOR_GREEN);
2502*d83cc019SAndroid Build Coastguard Worker igt_draw_fill_fb(drm.fd, &fullscreen_fb, rect.color);
2503*d83cc019SAndroid Build Coastguard Worker
2504*d83cc019SAndroid Build Coastguard Worker igt_plane_set_fb(params->sprite.plane, &fullscreen_fb);
2505*d83cc019SAndroid Build Coastguard Worker igt_display_commit(&drm.display);
2506*d83cc019SAndroid Build Coastguard Worker update_wanted_crc(t, &pattern->crcs[t->format][0]);
2507*d83cc019SAndroid Build Coastguard Worker
2508*d83cc019SAndroid Build Coastguard Worker switch (t->screen) {
2509*d83cc019SAndroid Build Coastguard Worker case SCREEN_PRIM:
2510*d83cc019SAndroid Build Coastguard Worker assertions = ASSERT_LAST_ACTION_CHANGED;
2511*d83cc019SAndroid Build Coastguard Worker
2512*d83cc019SAndroid Build Coastguard Worker if (prim_plane_disabled())
2513*d83cc019SAndroid Build Coastguard Worker assertions |= ASSERT_FBC_DISABLED;
2514*d83cc019SAndroid Build Coastguard Worker break;
2515*d83cc019SAndroid Build Coastguard Worker case SCREEN_SCND:
2516*d83cc019SAndroid Build Coastguard Worker assertions = ASSERT_NO_ACTION_CHANGE;
2517*d83cc019SAndroid Build Coastguard Worker break;
2518*d83cc019SAndroid Build Coastguard Worker default:
2519*d83cc019SAndroid Build Coastguard Worker igt_assert(false);
2520*d83cc019SAndroid Build Coastguard Worker }
2521*d83cc019SAndroid Build Coastguard Worker do_assertions(assertions);
2522*d83cc019SAndroid Build Coastguard Worker
2523*d83cc019SAndroid Build Coastguard Worker igt_plane_set_fb(params->sprite.plane, NULL);
2524*d83cc019SAndroid Build Coastguard Worker igt_display_commit(&drm.display);
2525*d83cc019SAndroid Build Coastguard Worker
2526*d83cc019SAndroid Build Coastguard Worker if (t->screen == SCREEN_PRIM)
2527*d83cc019SAndroid Build Coastguard Worker assertions = ASSERT_LAST_ACTION_CHANGED;
2528*d83cc019SAndroid Build Coastguard Worker update_wanted_crc(t, &blue_crcs[t->format].crc);
2529*d83cc019SAndroid Build Coastguard Worker do_assertions(assertions);
2530*d83cc019SAndroid Build Coastguard Worker
2531*d83cc019SAndroid Build Coastguard Worker igt_remove_fb(drm.fd, &fullscreen_fb);
2532*d83cc019SAndroid Build Coastguard Worker }
2533*d83cc019SAndroid Build Coastguard Worker
2534*d83cc019SAndroid Build Coastguard Worker /*
2535*d83cc019SAndroid Build Coastguard Worker * scaledprimary - try different primary plane scaling strategies
2536*d83cc019SAndroid Build Coastguard Worker *
2537*d83cc019SAndroid Build Coastguard Worker * METHOD
2538*d83cc019SAndroid Build Coastguard Worker * Enable the primary plane, use drmModeSetPlane to force scaling in
2539*d83cc019SAndroid Build Coastguard Worker * different ways.
2540*d83cc019SAndroid Build Coastguard Worker *
2541*d83cc019SAndroid Build Coastguard Worker * EXPECTED RESULTS
2542*d83cc019SAndroid Build Coastguard Worker * SKIP on platforms that don't support primary plane scaling. Success on all
2543*d83cc019SAndroid Build Coastguard Worker * others.
2544*d83cc019SAndroid Build Coastguard Worker *
2545*d83cc019SAndroid Build Coastguard Worker * FAILURES
2546*d83cc019SAndroid Build Coastguard Worker * TODO: although we're exercising the code here, we're not really doing
2547*d83cc019SAndroid Build Coastguard Worker * assertions in order to check if things are working properly. The biggest
2548*d83cc019SAndroid Build Coastguard Worker * issue this code would be able to find would be an incorrectly calculated
2549*d83cc019SAndroid Build Coastguard Worker * CFB size, and today we don't have means to assert this. One day we might
2550*d83cc019SAndroid Build Coastguard Worker * implement some sort of stolen memory checking mechanism, then we'll be able
2551*d83cc019SAndroid Build Coastguard Worker * to force it to run after every drmModeSetPlane call here, so we'll be
2552*d83cc019SAndroid Build Coastguard Worker * checking if the expected CFB size is actually what we think it is.
2553*d83cc019SAndroid Build Coastguard Worker */
scaledprimary_subtest(const struct test_mode * t)2554*d83cc019SAndroid Build Coastguard Worker static void scaledprimary_subtest(const struct test_mode *t)
2555*d83cc019SAndroid Build Coastguard Worker {
2556*d83cc019SAndroid Build Coastguard Worker struct igt_fb new_fb, *old_fb;
2557*d83cc019SAndroid Build Coastguard Worker struct modeset_params *params = pick_params(t);
2558*d83cc019SAndroid Build Coastguard Worker struct fb_region *reg = ¶ms->primary;
2559*d83cc019SAndroid Build Coastguard Worker int gen = intel_gen(intel_get_drm_devid(drm.fd));
2560*d83cc019SAndroid Build Coastguard Worker int src_y_upscale = ALIGN(reg->h / 4, 4);
2561*d83cc019SAndroid Build Coastguard Worker
2562*d83cc019SAndroid Build Coastguard Worker igt_require_f(gen >= 9,
2563*d83cc019SAndroid Build Coastguard Worker "Can't test primary plane scaling before gen 9\n");
2564*d83cc019SAndroid Build Coastguard Worker
2565*d83cc019SAndroid Build Coastguard Worker prepare_subtest(t, NULL);
2566*d83cc019SAndroid Build Coastguard Worker
2567*d83cc019SAndroid Build Coastguard Worker old_fb = reg->fb;
2568*d83cc019SAndroid Build Coastguard Worker
2569*d83cc019SAndroid Build Coastguard Worker create_fb(t->format, reg->fb->width, reg->fb->height,
2570*d83cc019SAndroid Build Coastguard Worker opt.tiling, t->plane, &new_fb);
2571*d83cc019SAndroid Build Coastguard Worker fill_fb(&new_fb, COLOR_BLUE);
2572*d83cc019SAndroid Build Coastguard Worker
2573*d83cc019SAndroid Build Coastguard Worker igt_draw_rect_fb(drm.fd, drm.bufmgr, NULL, &new_fb, t->method,
2574*d83cc019SAndroid Build Coastguard Worker reg->x, reg->y, reg->w / 2, reg->h / 2,
2575*d83cc019SAndroid Build Coastguard Worker pick_color(&new_fb, COLOR_GREEN));
2576*d83cc019SAndroid Build Coastguard Worker igt_draw_rect_fb(drm.fd, drm.bufmgr, NULL, &new_fb, t->method,
2577*d83cc019SAndroid Build Coastguard Worker reg->x + reg->w / 2, reg->y + reg->h / 2,
2578*d83cc019SAndroid Build Coastguard Worker reg->w / 2, reg->h / 2,
2579*d83cc019SAndroid Build Coastguard Worker pick_color(&new_fb, COLOR_RED));
2580*d83cc019SAndroid Build Coastguard Worker igt_draw_rect_fb(drm.fd, drm.bufmgr, NULL, &new_fb, t->method,
2581*d83cc019SAndroid Build Coastguard Worker reg->x + reg->w / 2, reg->y + reg->h / 2,
2582*d83cc019SAndroid Build Coastguard Worker reg->w / 4, reg->h / 4,
2583*d83cc019SAndroid Build Coastguard Worker pick_color(&new_fb, COLOR_MAGENTA));
2584*d83cc019SAndroid Build Coastguard Worker
2585*d83cc019SAndroid Build Coastguard Worker /* No scaling. */
2586*d83cc019SAndroid Build Coastguard Worker igt_plane_set_fb(reg->plane, &new_fb);
2587*d83cc019SAndroid Build Coastguard Worker igt_fb_set_position(&new_fb, reg->plane, reg->x, reg->y);
2588*d83cc019SAndroid Build Coastguard Worker igt_fb_set_size(&new_fb, reg->plane, reg->w, reg->h);
2589*d83cc019SAndroid Build Coastguard Worker igt_plane_set_size(reg->plane, params->mode->hdisplay, params->mode->vdisplay);
2590*d83cc019SAndroid Build Coastguard Worker igt_display_commit2(&drm.display, COMMIT_UNIVERSAL);
2591*d83cc019SAndroid Build Coastguard Worker do_assertions(DONT_ASSERT_CRC);
2592*d83cc019SAndroid Build Coastguard Worker
2593*d83cc019SAndroid Build Coastguard Worker /* Source upscaling. */
2594*d83cc019SAndroid Build Coastguard Worker igt_fb_set_size(&new_fb, reg->plane, reg->w / 2, reg->h / 2);
2595*d83cc019SAndroid Build Coastguard Worker igt_display_commit2(&drm.display, COMMIT_UNIVERSAL);
2596*d83cc019SAndroid Build Coastguard Worker do_assertions(DONT_ASSERT_CRC);
2597*d83cc019SAndroid Build Coastguard Worker
2598*d83cc019SAndroid Build Coastguard Worker /* Destination doesn't fill the entire CRTC, no scaling. */
2599*d83cc019SAndroid Build Coastguard Worker igt_fb_set_size(&new_fb, reg->plane, reg->w / 2, reg->h / 2);
2600*d83cc019SAndroid Build Coastguard Worker igt_plane_set_position(reg->plane,
2601*d83cc019SAndroid Build Coastguard Worker params->mode->hdisplay / 4,
2602*d83cc019SAndroid Build Coastguard Worker params->mode->vdisplay / 4);
2603*d83cc019SAndroid Build Coastguard Worker igt_plane_set_size(reg->plane,
2604*d83cc019SAndroid Build Coastguard Worker params->mode->hdisplay / 2,
2605*d83cc019SAndroid Build Coastguard Worker params->mode->vdisplay / 2);
2606*d83cc019SAndroid Build Coastguard Worker igt_display_commit2(&drm.display, COMMIT_UNIVERSAL);
2607*d83cc019SAndroid Build Coastguard Worker do_assertions(DONT_ASSERT_CRC);
2608*d83cc019SAndroid Build Coastguard Worker
2609*d83cc019SAndroid Build Coastguard Worker /* Destination doesn't fill the entire CRTC, upscaling. */
2610*d83cc019SAndroid Build Coastguard Worker igt_fb_set_position(&new_fb, reg->plane,
2611*d83cc019SAndroid Build Coastguard Worker reg->x + reg->w / 4, reg->y + src_y_upscale);
2612*d83cc019SAndroid Build Coastguard Worker igt_fb_set_size(&new_fb, reg->plane, reg->w / 2, reg->h / 2);
2613*d83cc019SAndroid Build Coastguard Worker igt_display_commit2(&drm.display, COMMIT_UNIVERSAL);
2614*d83cc019SAndroid Build Coastguard Worker do_assertions(DONT_ASSERT_CRC);
2615*d83cc019SAndroid Build Coastguard Worker
2616*d83cc019SAndroid Build Coastguard Worker /*
2617*d83cc019SAndroid Build Coastguard Worker * On gen <= 10 HW, FBC is not enabled on a plane with a Y offset
2618*d83cc019SAndroid Build Coastguard Worker * that isn't divisible by 4, because it causes FIFO underruns.
2619*d83cc019SAndroid Build Coastguard Worker *
2620*d83cc019SAndroid Build Coastguard Worker * Check that FBC is disabled.
2621*d83cc019SAndroid Build Coastguard Worker */
2622*d83cc019SAndroid Build Coastguard Worker igt_fb_set_position(&new_fb, reg->plane,
2623*d83cc019SAndroid Build Coastguard Worker reg->x + reg->w / 4, reg->y + src_y_upscale + 3);
2624*d83cc019SAndroid Build Coastguard Worker igt_fb_set_size(&new_fb, reg->plane, reg->w / 2, reg->h / 2);
2625*d83cc019SAndroid Build Coastguard Worker igt_display_commit2(&drm.display, COMMIT_UNIVERSAL);
2626*d83cc019SAndroid Build Coastguard Worker do_assertions(DONT_ASSERT_CRC | (gen <= 10 ? ASSERT_FBC_DISABLED : 0));
2627*d83cc019SAndroid Build Coastguard Worker
2628*d83cc019SAndroid Build Coastguard Worker /* Back to the good and old blue fb. */
2629*d83cc019SAndroid Build Coastguard Worker igt_plane_set_fb(reg->plane, old_fb);
2630*d83cc019SAndroid Build Coastguard Worker igt_plane_set_position(params->primary.plane, 0, 0);
2631*d83cc019SAndroid Build Coastguard Worker igt_plane_set_size(reg->plane, params->mode->hdisplay, params->mode->vdisplay);
2632*d83cc019SAndroid Build Coastguard Worker igt_fb_set_position(reg->fb, reg->plane, reg->x, reg->y);
2633*d83cc019SAndroid Build Coastguard Worker igt_fb_set_size(reg->fb, reg->plane, reg->w, reg->h);
2634*d83cc019SAndroid Build Coastguard Worker igt_display_commit2(&drm.display, COMMIT_UNIVERSAL);
2635*d83cc019SAndroid Build Coastguard Worker do_assertions(0);
2636*d83cc019SAndroid Build Coastguard Worker
2637*d83cc019SAndroid Build Coastguard Worker igt_remove_fb(drm.fd, &new_fb);
2638*d83cc019SAndroid Build Coastguard Worker }
2639*d83cc019SAndroid Build Coastguard Worker /**
2640*d83cc019SAndroid Build Coastguard Worker * modesetfrombusy - modeset from a busy buffer to a non-busy buffer
2641*d83cc019SAndroid Build Coastguard Worker *
2642*d83cc019SAndroid Build Coastguard Worker * METHOD
2643*d83cc019SAndroid Build Coastguard Worker * Set a mode, make the frontbuffer busy using BLT writes, do a modeset to a
2644*d83cc019SAndroid Build Coastguard Worker * non-busy buffer, then check if the features are enabled. The goal of this
2645*d83cc019SAndroid Build Coastguard Worker * test is to exercise a bug we had on the frontbuffer tracking infrastructure
2646*d83cc019SAndroid Build Coastguard Worker * code.
2647*d83cc019SAndroid Build Coastguard Worker *
2648*d83cc019SAndroid Build Coastguard Worker * EXPECTED RESULTS
2649*d83cc019SAndroid Build Coastguard Worker * No assertions fail.
2650*d83cc019SAndroid Build Coastguard Worker *
2651*d83cc019SAndroid Build Coastguard Worker * FAILURES
2652*d83cc019SAndroid Build Coastguard Worker * If you're failing this test, then you probably need "drm/i915: Clear
2653*d83cc019SAndroid Build Coastguard Worker * fb_tracking.busy_bits also for synchronous flips" or any other patch that
2654*d83cc019SAndroid Build Coastguard Worker * properly updates dev_priv->fb_tracking.busy_bits when we're alternating
2655*d83cc019SAndroid Build Coastguard Worker * between buffers with different busyness.
2656*d83cc019SAndroid Build Coastguard Worker */
modesetfrombusy_subtest(const struct test_mode * t)2657*d83cc019SAndroid Build Coastguard Worker static void modesetfrombusy_subtest(const struct test_mode *t)
2658*d83cc019SAndroid Build Coastguard Worker {
2659*d83cc019SAndroid Build Coastguard Worker struct modeset_params *params = pick_params(t);
2660*d83cc019SAndroid Build Coastguard Worker struct igt_fb fb2;
2661*d83cc019SAndroid Build Coastguard Worker
2662*d83cc019SAndroid Build Coastguard Worker prepare_subtest(t, NULL);
2663*d83cc019SAndroid Build Coastguard Worker
2664*d83cc019SAndroid Build Coastguard Worker create_fb(t->format, params->primary.fb->width, params->primary.fb->height,
2665*d83cc019SAndroid Build Coastguard Worker opt.tiling, t->plane, &fb2);
2666*d83cc019SAndroid Build Coastguard Worker fill_fb(&fb2, COLOR_PRIM_BG);
2667*d83cc019SAndroid Build Coastguard Worker
2668*d83cc019SAndroid Build Coastguard Worker start_busy_thread(params->primary.fb);
2669*d83cc019SAndroid Build Coastguard Worker usleep(10000);
2670*d83cc019SAndroid Build Coastguard Worker
2671*d83cc019SAndroid Build Coastguard Worker unset_all_crtcs();
2672*d83cc019SAndroid Build Coastguard Worker params->primary.fb = &fb2;
2673*d83cc019SAndroid Build Coastguard Worker set_mode_for_params(params);
2674*d83cc019SAndroid Build Coastguard Worker
2675*d83cc019SAndroid Build Coastguard Worker do_assertions(ASSERT_NO_IDLE_GPU);
2676*d83cc019SAndroid Build Coastguard Worker
2677*d83cc019SAndroid Build Coastguard Worker stop_busy_thread();
2678*d83cc019SAndroid Build Coastguard Worker
2679*d83cc019SAndroid Build Coastguard Worker igt_remove_fb(drm.fd, &fb2);
2680*d83cc019SAndroid Build Coastguard Worker }
2681*d83cc019SAndroid Build Coastguard Worker
2682*d83cc019SAndroid Build Coastguard Worker /**
2683*d83cc019SAndroid Build Coastguard Worker * suspend - make sure suspend/resume keeps us on the same state
2684*d83cc019SAndroid Build Coastguard Worker *
2685*d83cc019SAndroid Build Coastguard Worker * METHOD
2686*d83cc019SAndroid Build Coastguard Worker * Set a mode, assert FBC is there, suspend, resume, assert FBC is still
2687*d83cc019SAndroid Build Coastguard Worker * there. Unset modes, assert FBC is disabled, resuspend, resume, assert FBC
2688*d83cc019SAndroid Build Coastguard Worker * is still disabled.
2689*d83cc019SAndroid Build Coastguard Worker *
2690*d83cc019SAndroid Build Coastguard Worker * EXPECTED RESULTS
2691*d83cc019SAndroid Build Coastguard Worker * Suspend/resume doesn't affect the FBC state.
2692*d83cc019SAndroid Build Coastguard Worker *
2693*d83cc019SAndroid Build Coastguard Worker * FAILURES
2694*d83cc019SAndroid Build Coastguard Worker * A lot of different things could lead to a bug here, you'll have to check
2695*d83cc019SAndroid Build Coastguard Worker * the Kernel code.
2696*d83cc019SAndroid Build Coastguard Worker */
suspend_subtest(const struct test_mode * t)2697*d83cc019SAndroid Build Coastguard Worker static void suspend_subtest(const struct test_mode *t)
2698*d83cc019SAndroid Build Coastguard Worker {
2699*d83cc019SAndroid Build Coastguard Worker struct modeset_params *params = pick_params(t);
2700*d83cc019SAndroid Build Coastguard Worker
2701*d83cc019SAndroid Build Coastguard Worker prepare_subtest(t, NULL);
2702*d83cc019SAndroid Build Coastguard Worker igt_system_suspend_autoresume(SUSPEND_STATE_MEM, SUSPEND_TEST_NONE);
2703*d83cc019SAndroid Build Coastguard Worker do_assertions(ASSERT_DRRS_LOW);
2704*d83cc019SAndroid Build Coastguard Worker
2705*d83cc019SAndroid Build Coastguard Worker unset_all_crtcs();
2706*d83cc019SAndroid Build Coastguard Worker igt_system_suspend_autoresume(SUSPEND_STATE_MEM, SUSPEND_TEST_NONE);
2707*d83cc019SAndroid Build Coastguard Worker do_assertions(ASSERT_FBC_DISABLED | ASSERT_PSR_DISABLED |
2708*d83cc019SAndroid Build Coastguard Worker DONT_ASSERT_CRC | ASSERT_DRRS_INACTIVE);
2709*d83cc019SAndroid Build Coastguard Worker
2710*d83cc019SAndroid Build Coastguard Worker set_mode_for_params(params);
2711*d83cc019SAndroid Build Coastguard Worker do_assertions(0);
2712*d83cc019SAndroid Build Coastguard Worker }
2713*d83cc019SAndroid Build Coastguard Worker
2714*d83cc019SAndroid Build Coastguard Worker /**
2715*d83cc019SAndroid Build Coastguard Worker * farfromfence - test drawing as far from the fence start as possible
2716*d83cc019SAndroid Build Coastguard Worker *
2717*d83cc019SAndroid Build Coastguard Worker * METHOD
2718*d83cc019SAndroid Build Coastguard Worker * One of the possible problems with FBC is that if the mode being displayed
2719*d83cc019SAndroid Build Coastguard Worker * is very far away from the fence we might setup the hardware frontbuffer
2720*d83cc019SAndroid Build Coastguard Worker * tracking in the wrong way. So this test tries to set a really tall FB,
2721*d83cc019SAndroid Build Coastguard Worker * makes the CRTC point to the bottom of that FB, then it tries to exercise
2722*d83cc019SAndroid Build Coastguard Worker * the hardware frontbuffer tracking through GTT mmap operations.
2723*d83cc019SAndroid Build Coastguard Worker *
2724*d83cc019SAndroid Build Coastguard Worker * EXPECTED RESULTS
2725*d83cc019SAndroid Build Coastguard Worker * Everything succeeds.
2726*d83cc019SAndroid Build Coastguard Worker *
2727*d83cc019SAndroid Build Coastguard Worker * FAILURES
2728*d83cc019SAndroid Build Coastguard Worker * If you're getting wrong CRC calulations, then the hardware tracking might
2729*d83cc019SAndroid Build Coastguard Worker * be misconfigured and needs to be checked. If we're failing because FBC is
2730*d83cc019SAndroid Build Coastguard Worker * disabled and the reason is that there's not enough stolen memory, then the
2731*d83cc019SAndroid Build Coastguard Worker * Kernel might be calculating the amount of stolen memory needed based on the
2732*d83cc019SAndroid Build Coastguard Worker * whole framebuffer size, and not just on the needed size: in this case, you
2733*d83cc019SAndroid Build Coastguard Worker * need a newer Kernel.
2734*d83cc019SAndroid Build Coastguard Worker */
farfromfence_subtest(const struct test_mode * t)2735*d83cc019SAndroid Build Coastguard Worker static void farfromfence_subtest(const struct test_mode *t)
2736*d83cc019SAndroid Build Coastguard Worker {
2737*d83cc019SAndroid Build Coastguard Worker int r;
2738*d83cc019SAndroid Build Coastguard Worker struct igt_fb tall_fb;
2739*d83cc019SAndroid Build Coastguard Worker struct modeset_params *params = pick_params(t);
2740*d83cc019SAndroid Build Coastguard Worker struct draw_pattern_info *pattern = &pattern1;
2741*d83cc019SAndroid Build Coastguard Worker struct fb_region *target;
2742*d83cc019SAndroid Build Coastguard Worker int max_height, assertions = 0;
2743*d83cc019SAndroid Build Coastguard Worker int gen = intel_gen(intel_get_drm_devid(drm.fd));
2744*d83cc019SAndroid Build Coastguard Worker
2745*d83cc019SAndroid Build Coastguard Worker switch (gen) {
2746*d83cc019SAndroid Build Coastguard Worker case 2:
2747*d83cc019SAndroid Build Coastguard Worker max_height = 2048;
2748*d83cc019SAndroid Build Coastguard Worker break;
2749*d83cc019SAndroid Build Coastguard Worker case 3:
2750*d83cc019SAndroid Build Coastguard Worker max_height = 4096;
2751*d83cc019SAndroid Build Coastguard Worker break;
2752*d83cc019SAndroid Build Coastguard Worker default:
2753*d83cc019SAndroid Build Coastguard Worker max_height = 8192;
2754*d83cc019SAndroid Build Coastguard Worker break;
2755*d83cc019SAndroid Build Coastguard Worker }
2756*d83cc019SAndroid Build Coastguard Worker
2757*d83cc019SAndroid Build Coastguard Worker /* Gen 9 doesn't do the same dspaddr_offset magic as the older
2758*d83cc019SAndroid Build Coastguard Worker * gens, so FBC may not be enabled there. */
2759*d83cc019SAndroid Build Coastguard Worker if (gen >= 9)
2760*d83cc019SAndroid Build Coastguard Worker assertions |= DONT_ASSERT_FEATURE_STATUS;
2761*d83cc019SAndroid Build Coastguard Worker
2762*d83cc019SAndroid Build Coastguard Worker prepare_subtest(t, pattern);
2763*d83cc019SAndroid Build Coastguard Worker target = pick_target(t, params);
2764*d83cc019SAndroid Build Coastguard Worker
2765*d83cc019SAndroid Build Coastguard Worker create_fb(t->format, params->mode->hdisplay, max_height, opt.tiling,
2766*d83cc019SAndroid Build Coastguard Worker t->plane, &tall_fb);
2767*d83cc019SAndroid Build Coastguard Worker
2768*d83cc019SAndroid Build Coastguard Worker fill_fb(&tall_fb, COLOR_PRIM_BG);
2769*d83cc019SAndroid Build Coastguard Worker
2770*d83cc019SAndroid Build Coastguard Worker params->primary.fb = &tall_fb;
2771*d83cc019SAndroid Build Coastguard Worker params->primary.x = 0;
2772*d83cc019SAndroid Build Coastguard Worker params->primary.y = max_height - params->mode->vdisplay;
2773*d83cc019SAndroid Build Coastguard Worker set_mode_for_params(params);
2774*d83cc019SAndroid Build Coastguard Worker do_assertions(assertions);
2775*d83cc019SAndroid Build Coastguard Worker
2776*d83cc019SAndroid Build Coastguard Worker for (r = 0; r < pattern->n_rects; r++) {
2777*d83cc019SAndroid Build Coastguard Worker draw_rect(pattern, target, t->method, r);
2778*d83cc019SAndroid Build Coastguard Worker update_wanted_crc(t, &pattern->crcs[t->format][r]);
2779*d83cc019SAndroid Build Coastguard Worker
2780*d83cc019SAndroid Build Coastguard Worker /* GTT draws disable PSR. */
2781*d83cc019SAndroid Build Coastguard Worker do_assertions(assertions | ASSERT_PSR_DISABLED);
2782*d83cc019SAndroid Build Coastguard Worker }
2783*d83cc019SAndroid Build Coastguard Worker
2784*d83cc019SAndroid Build Coastguard Worker igt_remove_fb(drm.fd, &tall_fb);
2785*d83cc019SAndroid Build Coastguard Worker }
2786*d83cc019SAndroid Build Coastguard Worker
try_invalid_strides(void)2787*d83cc019SAndroid Build Coastguard Worker static void try_invalid_strides(void)
2788*d83cc019SAndroid Build Coastguard Worker {
2789*d83cc019SAndroid Build Coastguard Worker uint32_t gem_handle;
2790*d83cc019SAndroid Build Coastguard Worker int rc;
2791*d83cc019SAndroid Build Coastguard Worker
2792*d83cc019SAndroid Build Coastguard Worker /* Sizes that the Kernel shouldn't even allow for tiled */
2793*d83cc019SAndroid Build Coastguard Worker gem_handle = gem_create(drm.fd, 2048);
2794*d83cc019SAndroid Build Coastguard Worker
2795*d83cc019SAndroid Build Coastguard Worker /* Smaller than 512, yet still 64-byte aligned. */
2796*d83cc019SAndroid Build Coastguard Worker rc = __gem_set_tiling(drm.fd, gem_handle, I915_TILING_X, 448);
2797*d83cc019SAndroid Build Coastguard Worker igt_assert_eq(rc, -EINVAL);
2798*d83cc019SAndroid Build Coastguard Worker
2799*d83cc019SAndroid Build Coastguard Worker /* Bigger than 512, but not 64-byte aligned. */
2800*d83cc019SAndroid Build Coastguard Worker rc = __gem_set_tiling(drm.fd, gem_handle, I915_TILING_X, 1022);
2801*d83cc019SAndroid Build Coastguard Worker igt_assert_eq(rc, -EINVAL);
2802*d83cc019SAndroid Build Coastguard Worker
2803*d83cc019SAndroid Build Coastguard Worker /* Just make sure something actually works. */
2804*d83cc019SAndroid Build Coastguard Worker rc = __gem_set_tiling(drm.fd, gem_handle, I915_TILING_X, 1024);
2805*d83cc019SAndroid Build Coastguard Worker igt_assert_eq(rc, 0);
2806*d83cc019SAndroid Build Coastguard Worker
2807*d83cc019SAndroid Build Coastguard Worker gem_close(drm.fd, gem_handle);
2808*d83cc019SAndroid Build Coastguard Worker }
2809*d83cc019SAndroid Build Coastguard Worker
2810*d83cc019SAndroid Build Coastguard Worker /**
2811*d83cc019SAndroid Build Coastguard Worker * badstride - try to use buffers with strides that are not supported
2812*d83cc019SAndroid Build Coastguard Worker *
2813*d83cc019SAndroid Build Coastguard Worker * METHOD
2814*d83cc019SAndroid Build Coastguard Worker * First we try to create buffers with strides that are not allowed for tiled
2815*d83cc019SAndroid Build Coastguard Worker * surfaces and assert the Kernel rejects them. Then we create buffers with
2816*d83cc019SAndroid Build Coastguard Worker * strides that are allowed by the Kernel, but that are incompatible with FBC
2817*d83cc019SAndroid Build Coastguard Worker * and we assert that FBC stays disabled after we set a mode on those buffers.
2818*d83cc019SAndroid Build Coastguard Worker *
2819*d83cc019SAndroid Build Coastguard Worker * EXPECTED RESULTS
2820*d83cc019SAndroid Build Coastguard Worker * The invalid strides are rejected, and the valid strides that are
2821*d83cc019SAndroid Build Coastguard Worker * incompatible with FBC result in FBC disabled.
2822*d83cc019SAndroid Build Coastguard Worker *
2823*d83cc019SAndroid Build Coastguard Worker * FAILURES
2824*d83cc019SAndroid Build Coastguard Worker * There are two possible places where the Kernel can be broken: either the
2825*d83cc019SAndroid Build Coastguard Worker * code that checks valid strides for tiled buffers or the code that checks
2826*d83cc019SAndroid Build Coastguard Worker * the valid strides for FBC.
2827*d83cc019SAndroid Build Coastguard Worker */
badstride_subtest(const struct test_mode * t)2828*d83cc019SAndroid Build Coastguard Worker static void badstride_subtest(const struct test_mode *t)
2829*d83cc019SAndroid Build Coastguard Worker {
2830*d83cc019SAndroid Build Coastguard Worker struct igt_fb wide_fb, *old_fb;
2831*d83cc019SAndroid Build Coastguard Worker struct modeset_params *params = pick_params(t);
2832*d83cc019SAndroid Build Coastguard Worker int rc;
2833*d83cc019SAndroid Build Coastguard Worker
2834*d83cc019SAndroid Build Coastguard Worker try_invalid_strides();
2835*d83cc019SAndroid Build Coastguard Worker
2836*d83cc019SAndroid Build Coastguard Worker prepare_subtest(t, NULL);
2837*d83cc019SAndroid Build Coastguard Worker
2838*d83cc019SAndroid Build Coastguard Worker old_fb = params->primary.fb;
2839*d83cc019SAndroid Build Coastguard Worker
2840*d83cc019SAndroid Build Coastguard Worker create_fb(t->format, params->primary.fb->width + 4096, params->primary.fb->height,
2841*d83cc019SAndroid Build Coastguard Worker opt.tiling, t->plane, &wide_fb);
2842*d83cc019SAndroid Build Coastguard Worker igt_assert(wide_fb.strides[0] > 16384);
2843*d83cc019SAndroid Build Coastguard Worker
2844*d83cc019SAndroid Build Coastguard Worker fill_fb(&wide_fb, COLOR_PRIM_BG);
2845*d83cc019SAndroid Build Coastguard Worker
2846*d83cc019SAndroid Build Coastguard Worker /* Try a simple modeset with the new fb. */
2847*d83cc019SAndroid Build Coastguard Worker params->primary.fb = &wide_fb;
2848*d83cc019SAndroid Build Coastguard Worker set_mode_for_params(params);
2849*d83cc019SAndroid Build Coastguard Worker do_assertions(ASSERT_FBC_DISABLED);
2850*d83cc019SAndroid Build Coastguard Worker
2851*d83cc019SAndroid Build Coastguard Worker /* Go back to the old fb so FBC works again. */
2852*d83cc019SAndroid Build Coastguard Worker params->primary.fb = old_fb;
2853*d83cc019SAndroid Build Coastguard Worker set_mode_for_params(params);
2854*d83cc019SAndroid Build Coastguard Worker do_assertions(0);
2855*d83cc019SAndroid Build Coastguard Worker
2856*d83cc019SAndroid Build Coastguard Worker /* We're doing the equivalent of a modeset, but with the planes API. */
2857*d83cc019SAndroid Build Coastguard Worker params->primary.fb = &wide_fb;
2858*d83cc019SAndroid Build Coastguard Worker set_prim_plane_for_params(params);
2859*d83cc019SAndroid Build Coastguard Worker do_assertions(ASSERT_FBC_DISABLED);
2860*d83cc019SAndroid Build Coastguard Worker
2861*d83cc019SAndroid Build Coastguard Worker params->primary.fb = old_fb;
2862*d83cc019SAndroid Build Coastguard Worker set_mode_for_params(params);
2863*d83cc019SAndroid Build Coastguard Worker do_assertions(0);
2864*d83cc019SAndroid Build Coastguard Worker
2865*d83cc019SAndroid Build Coastguard Worker /*
2866*d83cc019SAndroid Build Coastguard Worker * We previously couldn't use the page flip IOCTL to flip to a buffer
2867*d83cc019SAndroid Build Coastguard Worker * with a different stride. With the atomic page flip helper we can,
2868*d83cc019SAndroid Build Coastguard Worker * so allow page flip to fail and succeed.
2869*d83cc019SAndroid Build Coastguard Worker */
2870*d83cc019SAndroid Build Coastguard Worker rc = drmModePageFlip(drm.fd, drm.display.pipes[params->pipe].crtc_id, wide_fb.fb_id, 0, NULL);
2871*d83cc019SAndroid Build Coastguard Worker igt_assert(rc == -EINVAL || rc == 0);
2872*d83cc019SAndroid Build Coastguard Worker do_assertions(rc == 0 ? ASSERT_FBC_DISABLED : 0);
2873*d83cc019SAndroid Build Coastguard Worker
2874*d83cc019SAndroid Build Coastguard Worker igt_remove_fb(drm.fd, &wide_fb);
2875*d83cc019SAndroid Build Coastguard Worker }
2876*d83cc019SAndroid Build Coastguard Worker
2877*d83cc019SAndroid Build Coastguard Worker /**
2878*d83cc019SAndroid Build Coastguard Worker * stridechange - change the frontbuffer stride by doing a modeset
2879*d83cc019SAndroid Build Coastguard Worker *
2880*d83cc019SAndroid Build Coastguard Worker * METHOD
2881*d83cc019SAndroid Build Coastguard Worker * This test sets a mode on a CRTC, then creates a buffer with a different
2882*d83cc019SAndroid Build Coastguard Worker * stride - still compatible with FBC -, and sets the mode on it. The Kernel
2883*d83cc019SAndroid Build Coastguard Worker * currently shortcuts the modeset path for this case, so it won't trigger
2884*d83cc019SAndroid Build Coastguard Worker * calls to xx_crtc_enable or xx_crtc_disable, and that could lead to
2885*d83cc019SAndroid Build Coastguard Worker * problems, so test the case.
2886*d83cc019SAndroid Build Coastguard Worker *
2887*d83cc019SAndroid Build Coastguard Worker * EXPECTED RESULTS
2888*d83cc019SAndroid Build Coastguard Worker * With the current Kernel, FBC may or may not remain enabled on this case,
2889*d83cc019SAndroid Build Coastguard Worker * but we can still check the CRC values.
2890*d83cc019SAndroid Build Coastguard Worker *
2891*d83cc019SAndroid Build Coastguard Worker * FAILURES
2892*d83cc019SAndroid Build Coastguard Worker * A bad Kernel may just not resize the CFB while keeping FBC enabled, and
2893*d83cc019SAndroid Build Coastguard Worker * this can lead to underruns or stolen memory corruption. Underruns usually
2894*d83cc019SAndroid Build Coastguard Worker * lead to CRC check errors, and stolen memory corruption can't be easily
2895*d83cc019SAndroid Build Coastguard Worker * checked currently. A bad Kernel may also just throw some WARNs on dmesg.
2896*d83cc019SAndroid Build Coastguard Worker */
stridechange_subtest(const struct test_mode * t)2897*d83cc019SAndroid Build Coastguard Worker static void stridechange_subtest(const struct test_mode *t)
2898*d83cc019SAndroid Build Coastguard Worker {
2899*d83cc019SAndroid Build Coastguard Worker struct igt_fb *new_fb, *old_fb;
2900*d83cc019SAndroid Build Coastguard Worker struct modeset_params *params = pick_params(t);
2901*d83cc019SAndroid Build Coastguard Worker int rc;
2902*d83cc019SAndroid Build Coastguard Worker
2903*d83cc019SAndroid Build Coastguard Worker prepare_subtest(t, NULL);
2904*d83cc019SAndroid Build Coastguard Worker
2905*d83cc019SAndroid Build Coastguard Worker old_fb = params->primary.fb;
2906*d83cc019SAndroid Build Coastguard Worker
2907*d83cc019SAndroid Build Coastguard Worker /* We can't assert that FBC will be enabled since there may not be
2908*d83cc019SAndroid Build Coastguard Worker * enough space for the CFB, but we can check the CRC. */
2909*d83cc019SAndroid Build Coastguard Worker new_fb = &fbs[t->format].big;
2910*d83cc019SAndroid Build Coastguard Worker igt_assert(old_fb->strides[0] != new_fb->strides[0]);
2911*d83cc019SAndroid Build Coastguard Worker
2912*d83cc019SAndroid Build Coastguard Worker params->primary.fb = new_fb;
2913*d83cc019SAndroid Build Coastguard Worker fill_fb_region(¶ms->primary, COLOR_PRIM_BG);
2914*d83cc019SAndroid Build Coastguard Worker
2915*d83cc019SAndroid Build Coastguard Worker set_mode_for_params(params);
2916*d83cc019SAndroid Build Coastguard Worker do_assertions(DONT_ASSERT_FBC_STATUS);
2917*d83cc019SAndroid Build Coastguard Worker
2918*d83cc019SAndroid Build Coastguard Worker /* Go back to the fb that can have FBC. */
2919*d83cc019SAndroid Build Coastguard Worker params->primary.fb = old_fb;
2920*d83cc019SAndroid Build Coastguard Worker set_mode_for_params(params);
2921*d83cc019SAndroid Build Coastguard Worker do_assertions(0);
2922*d83cc019SAndroid Build Coastguard Worker
2923*d83cc019SAndroid Build Coastguard Worker /* This operation is the same as above, but with the planes API. */
2924*d83cc019SAndroid Build Coastguard Worker params->primary.fb = new_fb;
2925*d83cc019SAndroid Build Coastguard Worker set_prim_plane_for_params(params);
2926*d83cc019SAndroid Build Coastguard Worker do_assertions(DONT_ASSERT_FBC_STATUS);
2927*d83cc019SAndroid Build Coastguard Worker
2928*d83cc019SAndroid Build Coastguard Worker params->primary.fb = old_fb;
2929*d83cc019SAndroid Build Coastguard Worker set_prim_plane_for_params(params);
2930*d83cc019SAndroid Build Coastguard Worker do_assertions(0);
2931*d83cc019SAndroid Build Coastguard Worker
2932*d83cc019SAndroid Build Coastguard Worker /*
2933*d83cc019SAndroid Build Coastguard Worker * Try to set a new stride. with the page flip api. This is allowed
2934*d83cc019SAndroid Build Coastguard Worker * with the atomic page flip helper, but not with the legacy page flip.
2935*d83cc019SAndroid Build Coastguard Worker */
2936*d83cc019SAndroid Build Coastguard Worker rc = drmModePageFlip(drm.fd, drm.display.pipes[params->pipe].crtc_id, new_fb->fb_id, 0, NULL);
2937*d83cc019SAndroid Build Coastguard Worker igt_assert(rc == -EINVAL || rc == 0);
2938*d83cc019SAndroid Build Coastguard Worker do_assertions(rc ? 0 : DONT_ASSERT_FBC_STATUS);
2939*d83cc019SAndroid Build Coastguard Worker }
2940*d83cc019SAndroid Build Coastguard Worker
2941*d83cc019SAndroid Build Coastguard Worker /**
2942*d83cc019SAndroid Build Coastguard Worker * tilingchange - alternate between tiled and untiled in multiple ways
2943*d83cc019SAndroid Build Coastguard Worker *
2944*d83cc019SAndroid Build Coastguard Worker * METHOD
2945*d83cc019SAndroid Build Coastguard Worker * This test alternates between tiled and untiled frontbuffers of the same
2946*d83cc019SAndroid Build Coastguard Worker * size and format through multiple different APIs: the page flip IOCTL,
2947*d83cc019SAndroid Build Coastguard Worker * normal modesets and the plane APIs.
2948*d83cc019SAndroid Build Coastguard Worker *
2949*d83cc019SAndroid Build Coastguard Worker * EXPECTED RESULTS
2950*d83cc019SAndroid Build Coastguard Worker * FBC gets properly disabled for the untiled FB and reenabled for the
2951*d83cc019SAndroid Build Coastguard Worker * tiled FB.
2952*d83cc019SAndroid Build Coastguard Worker *
2953*d83cc019SAndroid Build Coastguard Worker * FAILURES
2954*d83cc019SAndroid Build Coastguard Worker * Bad Kernels may somehow leave FBC enabled, which can cause FIFO underruns
2955*d83cc019SAndroid Build Coastguard Worker * that lead to CRC assertion failures.
2956*d83cc019SAndroid Build Coastguard Worker */
tilingchange_subtest(const struct test_mode * t)2957*d83cc019SAndroid Build Coastguard Worker static void tilingchange_subtest(const struct test_mode *t)
2958*d83cc019SAndroid Build Coastguard Worker {
2959*d83cc019SAndroid Build Coastguard Worker struct igt_fb new_fb, *old_fb;
2960*d83cc019SAndroid Build Coastguard Worker struct modeset_params *params = pick_params(t);
2961*d83cc019SAndroid Build Coastguard Worker enum flip_type flip_type;
2962*d83cc019SAndroid Build Coastguard Worker
2963*d83cc019SAndroid Build Coastguard Worker prepare_subtest(t, NULL);
2964*d83cc019SAndroid Build Coastguard Worker
2965*d83cc019SAndroid Build Coastguard Worker old_fb = params->primary.fb;
2966*d83cc019SAndroid Build Coastguard Worker
2967*d83cc019SAndroid Build Coastguard Worker create_fb(t->format, params->primary.fb->width, params->primary.fb->height,
2968*d83cc019SAndroid Build Coastguard Worker LOCAL_DRM_FORMAT_MOD_NONE, t->plane, &new_fb);
2969*d83cc019SAndroid Build Coastguard Worker fill_fb(&new_fb, COLOR_PRIM_BG);
2970*d83cc019SAndroid Build Coastguard Worker
2971*d83cc019SAndroid Build Coastguard Worker for (flip_type = 0; flip_type < FLIP_COUNT; flip_type++) {
2972*d83cc019SAndroid Build Coastguard Worker igt_debug("Flip type: %d\n", flip_type);
2973*d83cc019SAndroid Build Coastguard Worker
2974*d83cc019SAndroid Build Coastguard Worker /* Set a buffer with no tiling. */
2975*d83cc019SAndroid Build Coastguard Worker params->primary.fb = &new_fb;
2976*d83cc019SAndroid Build Coastguard Worker page_flip_for_params(params, flip_type);
2977*d83cc019SAndroid Build Coastguard Worker do_assertions(ASSERT_FBC_DISABLED);
2978*d83cc019SAndroid Build Coastguard Worker
2979*d83cc019SAndroid Build Coastguard Worker /* Put FBC back in a working state. */
2980*d83cc019SAndroid Build Coastguard Worker params->primary.fb = old_fb;
2981*d83cc019SAndroid Build Coastguard Worker page_flip_for_params(params, flip_type);
2982*d83cc019SAndroid Build Coastguard Worker do_assertions(0);
2983*d83cc019SAndroid Build Coastguard Worker }
2984*d83cc019SAndroid Build Coastguard Worker
2985*d83cc019SAndroid Build Coastguard Worker igt_remove_fb(drm.fd, &new_fb);
2986*d83cc019SAndroid Build Coastguard Worker }
2987*d83cc019SAndroid Build Coastguard Worker
2988*d83cc019SAndroid Build Coastguard Worker /*
2989*d83cc019SAndroid Build Coastguard Worker * basic - do some basic operations regardless of which features are enabled
2990*d83cc019SAndroid Build Coastguard Worker *
2991*d83cc019SAndroid Build Coastguard Worker * METHOD
2992*d83cc019SAndroid Build Coastguard Worker * This subtest does page flips and draw operations and checks the CRCs of the
2993*d83cc019SAndroid Build Coastguard Worker * results. The big difference between this and the others is that here we
2994*d83cc019SAndroid Build Coastguard Worker * don't enable/disable any features such as FBC or PSR: we go with whatever
2995*d83cc019SAndroid Build Coastguard Worker * the Kernel has enabled by default for us. This subtest only does things
2996*d83cc019SAndroid Build Coastguard Worker * that are exercised by the other subtests and in a less exhaustive way: it's
2997*d83cc019SAndroid Build Coastguard Worker * completely redundant. On the other hand, it is very quick and was created
2998*d83cc019SAndroid Build Coastguard Worker * with the CI system in mind: it's a quick way to detect regressions, so if
2999*d83cc019SAndroid Build Coastguard Worker * it fails, then we can run the other subtests to find out why.
3000*d83cc019SAndroid Build Coastguard Worker *
3001*d83cc019SAndroid Build Coastguard Worker * EXPECTED RESULTS
3002*d83cc019SAndroid Build Coastguard Worker * Passed CRC assertions.
3003*d83cc019SAndroid Build Coastguard Worker *
3004*d83cc019SAndroid Build Coastguard Worker * FAILURES
3005*d83cc019SAndroid Build Coastguard Worker * If you get a failure here, you should run the more specific draw and flip
3006*d83cc019SAndroid Build Coastguard Worker * subtests of each feature in order to discover what exactly is failing and
3007*d83cc019SAndroid Build Coastguard Worker * why.
3008*d83cc019SAndroid Build Coastguard Worker */
basic_subtest(const struct test_mode * t)3009*d83cc019SAndroid Build Coastguard Worker static void basic_subtest(const struct test_mode *t)
3010*d83cc019SAndroid Build Coastguard Worker {
3011*d83cc019SAndroid Build Coastguard Worker struct draw_pattern_info *pattern = &pattern1;
3012*d83cc019SAndroid Build Coastguard Worker struct modeset_params *params = pick_params(t);
3013*d83cc019SAndroid Build Coastguard Worker enum igt_draw_method method;
3014*d83cc019SAndroid Build Coastguard Worker struct igt_fb *fb1, fb2;
3015*d83cc019SAndroid Build Coastguard Worker int r;
3016*d83cc019SAndroid Build Coastguard Worker int assertions = DONT_ASSERT_FEATURE_STATUS;
3017*d83cc019SAndroid Build Coastguard Worker
3018*d83cc019SAndroid Build Coastguard Worker prepare_subtest(t, pattern);
3019*d83cc019SAndroid Build Coastguard Worker
3020*d83cc019SAndroid Build Coastguard Worker create_fb(t->format, params->primary.fb->width, params->primary.fb->height,
3021*d83cc019SAndroid Build Coastguard Worker opt.tiling, t->plane, &fb2);
3022*d83cc019SAndroid Build Coastguard Worker fb1 = params->primary.fb;
3023*d83cc019SAndroid Build Coastguard Worker
3024*d83cc019SAndroid Build Coastguard Worker for (r = 0, method = 0; method < IGT_DRAW_METHOD_COUNT; method++, r++) {
3025*d83cc019SAndroid Build Coastguard Worker if (r == pattern->n_rects) {
3026*d83cc019SAndroid Build Coastguard Worker params->primary.fb = (params->primary.fb == fb1) ? &fb2 : fb1;
3027*d83cc019SAndroid Build Coastguard Worker
3028*d83cc019SAndroid Build Coastguard Worker fill_fb_region(¶ms->primary, COLOR_PRIM_BG);
3029*d83cc019SAndroid Build Coastguard Worker update_wanted_crc(t, &blue_crcs[t->format].crc);
3030*d83cc019SAndroid Build Coastguard Worker
3031*d83cc019SAndroid Build Coastguard Worker page_flip_for_params(params, t->flip);
3032*d83cc019SAndroid Build Coastguard Worker do_assertions(assertions);
3033*d83cc019SAndroid Build Coastguard Worker
3034*d83cc019SAndroid Build Coastguard Worker r = 0;
3035*d83cc019SAndroid Build Coastguard Worker }
3036*d83cc019SAndroid Build Coastguard Worker
3037*d83cc019SAndroid Build Coastguard Worker draw_rect(pattern, ¶ms->primary, method, r);
3038*d83cc019SAndroid Build Coastguard Worker update_wanted_crc(t, &pattern->crcs[t->format][r]);
3039*d83cc019SAndroid Build Coastguard Worker do_assertions(assertions);
3040*d83cc019SAndroid Build Coastguard Worker }
3041*d83cc019SAndroid Build Coastguard Worker
3042*d83cc019SAndroid Build Coastguard Worker igt_remove_fb(drm.fd, &fb2);
3043*d83cc019SAndroid Build Coastguard Worker }
3044*d83cc019SAndroid Build Coastguard Worker
opt_handler(int option,int option_index,void * data)3045*d83cc019SAndroid Build Coastguard Worker static int opt_handler(int option, int option_index, void *data)
3046*d83cc019SAndroid Build Coastguard Worker {
3047*d83cc019SAndroid Build Coastguard Worker switch (option) {
3048*d83cc019SAndroid Build Coastguard Worker case 's':
3049*d83cc019SAndroid Build Coastguard Worker opt.check_status = false;
3050*d83cc019SAndroid Build Coastguard Worker break;
3051*d83cc019SAndroid Build Coastguard Worker case 'c':
3052*d83cc019SAndroid Build Coastguard Worker opt.check_crc = false;
3053*d83cc019SAndroid Build Coastguard Worker break;
3054*d83cc019SAndroid Build Coastguard Worker case 'o':
3055*d83cc019SAndroid Build Coastguard Worker opt.fbc_check_compression = false;
3056*d83cc019SAndroid Build Coastguard Worker break;
3057*d83cc019SAndroid Build Coastguard Worker case 'a':
3058*d83cc019SAndroid Build Coastguard Worker opt.fbc_check_last_action = false;
3059*d83cc019SAndroid Build Coastguard Worker break;
3060*d83cc019SAndroid Build Coastguard Worker case 'e':
3061*d83cc019SAndroid Build Coastguard Worker opt.no_edp = true;
3062*d83cc019SAndroid Build Coastguard Worker break;
3063*d83cc019SAndroid Build Coastguard Worker case 'm':
3064*d83cc019SAndroid Build Coastguard Worker opt.small_modes = true;
3065*d83cc019SAndroid Build Coastguard Worker break;
3066*d83cc019SAndroid Build Coastguard Worker case 'i':
3067*d83cc019SAndroid Build Coastguard Worker opt.show_hidden = true;
3068*d83cc019SAndroid Build Coastguard Worker break;
3069*d83cc019SAndroid Build Coastguard Worker case 't':
3070*d83cc019SAndroid Build Coastguard Worker opt.step++;
3071*d83cc019SAndroid Build Coastguard Worker break;
3072*d83cc019SAndroid Build Coastguard Worker case 'x':
3073*d83cc019SAndroid Build Coastguard Worker errno = 0;
3074*d83cc019SAndroid Build Coastguard Worker opt.shared_fb_x_offset = strtol(optarg, NULL, 0);
3075*d83cc019SAndroid Build Coastguard Worker if (errno != 0)
3076*d83cc019SAndroid Build Coastguard Worker return IGT_OPT_HANDLER_ERROR;
3077*d83cc019SAndroid Build Coastguard Worker break;
3078*d83cc019SAndroid Build Coastguard Worker case 'y':
3079*d83cc019SAndroid Build Coastguard Worker errno = 0;
3080*d83cc019SAndroid Build Coastguard Worker opt.shared_fb_y_offset = strtol(optarg, NULL, 0);
3081*d83cc019SAndroid Build Coastguard Worker if (errno != 0)
3082*d83cc019SAndroid Build Coastguard Worker return IGT_OPT_HANDLER_ERROR;
3083*d83cc019SAndroid Build Coastguard Worker break;
3084*d83cc019SAndroid Build Coastguard Worker case '1':
3085*d83cc019SAndroid Build Coastguard Worker if (opt.only_pipes != PIPE_COUNT)
3086*d83cc019SAndroid Build Coastguard Worker return IGT_OPT_HANDLER_ERROR;
3087*d83cc019SAndroid Build Coastguard Worker opt.only_pipes = PIPE_SINGLE;
3088*d83cc019SAndroid Build Coastguard Worker break;
3089*d83cc019SAndroid Build Coastguard Worker case '2':
3090*d83cc019SAndroid Build Coastguard Worker if (opt.only_pipes != PIPE_COUNT)
3091*d83cc019SAndroid Build Coastguard Worker return IGT_OPT_HANDLER_ERROR;
3092*d83cc019SAndroid Build Coastguard Worker opt.only_pipes = PIPE_DUAL;
3093*d83cc019SAndroid Build Coastguard Worker break;
3094*d83cc019SAndroid Build Coastguard Worker case 'l':
3095*d83cc019SAndroid Build Coastguard Worker if (!strcmp(optarg, "x"))
3096*d83cc019SAndroid Build Coastguard Worker opt.tiling = LOCAL_I915_FORMAT_MOD_X_TILED;
3097*d83cc019SAndroid Build Coastguard Worker else if (!strcmp(optarg, "y"))
3098*d83cc019SAndroid Build Coastguard Worker opt.tiling = LOCAL_I915_FORMAT_MOD_Y_TILED;
3099*d83cc019SAndroid Build Coastguard Worker else {
3100*d83cc019SAndroid Build Coastguard Worker igt_warn("Bad tiling value: %s\n", optarg);
3101*d83cc019SAndroid Build Coastguard Worker return IGT_OPT_HANDLER_ERROR;
3102*d83cc019SAndroid Build Coastguard Worker }
3103*d83cc019SAndroid Build Coastguard Worker break;
3104*d83cc019SAndroid Build Coastguard Worker default:
3105*d83cc019SAndroid Build Coastguard Worker return IGT_OPT_HANDLER_ERROR;
3106*d83cc019SAndroid Build Coastguard Worker }
3107*d83cc019SAndroid Build Coastguard Worker
3108*d83cc019SAndroid Build Coastguard Worker return IGT_OPT_HANDLER_SUCCESS;
3109*d83cc019SAndroid Build Coastguard Worker }
3110*d83cc019SAndroid Build Coastguard Worker
3111*d83cc019SAndroid Build Coastguard Worker const char *help_str =
3112*d83cc019SAndroid Build Coastguard Worker " --no-status-check Don't check for enable/disable status\n"
3113*d83cc019SAndroid Build Coastguard Worker " --no-crc-check Don't check for CRC values\n"
3114*d83cc019SAndroid Build Coastguard Worker " --no-fbc-compression-check Don't check for the FBC compression status\n"
3115*d83cc019SAndroid Build Coastguard Worker " --no-fbc-action-check Don't check for the FBC last action\n"
3116*d83cc019SAndroid Build Coastguard Worker " --no-edp Don't use eDP monitors\n"
3117*d83cc019SAndroid Build Coastguard Worker " --use-small-modes Use smaller resolutions for the modes\n"
3118*d83cc019SAndroid Build Coastguard Worker " --show-hidden Show hidden subtests\n"
3119*d83cc019SAndroid Build Coastguard Worker " --step Stop on each step so you can check the screen\n"
3120*d83cc019SAndroid Build Coastguard Worker " --shared-fb-x offset Use 'offset' as the X offset for the shared FB\n"
3121*d83cc019SAndroid Build Coastguard Worker " --shared-fb-y offset Use 'offset' as the Y offset for the shared FB\n"
3122*d83cc019SAndroid Build Coastguard Worker " --1p-only Only run subtests that use 1 pipe\n"
3123*d83cc019SAndroid Build Coastguard Worker " --2p-only Only run subtests that use 2 pipes\n"
3124*d83cc019SAndroid Build Coastguard Worker " --tiling tiling Use 'tiling' as the tiling mode, which can be\n"
3125*d83cc019SAndroid Build Coastguard Worker " either 'x' (default) or 'y'\n";
3126*d83cc019SAndroid Build Coastguard Worker
pipes_str(int pipes)3127*d83cc019SAndroid Build Coastguard Worker static const char *pipes_str(int pipes)
3128*d83cc019SAndroid Build Coastguard Worker {
3129*d83cc019SAndroid Build Coastguard Worker switch (pipes) {
3130*d83cc019SAndroid Build Coastguard Worker case PIPE_SINGLE:
3131*d83cc019SAndroid Build Coastguard Worker return "1p";
3132*d83cc019SAndroid Build Coastguard Worker case PIPE_DUAL:
3133*d83cc019SAndroid Build Coastguard Worker return "2p";
3134*d83cc019SAndroid Build Coastguard Worker default:
3135*d83cc019SAndroid Build Coastguard Worker igt_assert(false);
3136*d83cc019SAndroid Build Coastguard Worker }
3137*d83cc019SAndroid Build Coastguard Worker }
3138*d83cc019SAndroid Build Coastguard Worker
screen_str(int screen)3139*d83cc019SAndroid Build Coastguard Worker static const char *screen_str(int screen)
3140*d83cc019SAndroid Build Coastguard Worker {
3141*d83cc019SAndroid Build Coastguard Worker switch (screen) {
3142*d83cc019SAndroid Build Coastguard Worker case SCREEN_PRIM:
3143*d83cc019SAndroid Build Coastguard Worker return "primscrn";
3144*d83cc019SAndroid Build Coastguard Worker case SCREEN_SCND:
3145*d83cc019SAndroid Build Coastguard Worker return "scndscrn";
3146*d83cc019SAndroid Build Coastguard Worker case SCREEN_OFFSCREEN:
3147*d83cc019SAndroid Build Coastguard Worker return "offscren";
3148*d83cc019SAndroid Build Coastguard Worker default:
3149*d83cc019SAndroid Build Coastguard Worker igt_assert(false);
3150*d83cc019SAndroid Build Coastguard Worker }
3151*d83cc019SAndroid Build Coastguard Worker }
3152*d83cc019SAndroid Build Coastguard Worker
plane_str(int plane)3153*d83cc019SAndroid Build Coastguard Worker static const char *plane_str(int plane)
3154*d83cc019SAndroid Build Coastguard Worker {
3155*d83cc019SAndroid Build Coastguard Worker switch (plane) {
3156*d83cc019SAndroid Build Coastguard Worker case PLANE_PRI:
3157*d83cc019SAndroid Build Coastguard Worker return "pri";
3158*d83cc019SAndroid Build Coastguard Worker case PLANE_CUR:
3159*d83cc019SAndroid Build Coastguard Worker return "cur";
3160*d83cc019SAndroid Build Coastguard Worker case PLANE_SPR:
3161*d83cc019SAndroid Build Coastguard Worker return "spr";
3162*d83cc019SAndroid Build Coastguard Worker default:
3163*d83cc019SAndroid Build Coastguard Worker igt_assert(false);
3164*d83cc019SAndroid Build Coastguard Worker }
3165*d83cc019SAndroid Build Coastguard Worker }
3166*d83cc019SAndroid Build Coastguard Worker
fbs_str(int fb)3167*d83cc019SAndroid Build Coastguard Worker static const char *fbs_str(int fb)
3168*d83cc019SAndroid Build Coastguard Worker {
3169*d83cc019SAndroid Build Coastguard Worker switch (fb) {
3170*d83cc019SAndroid Build Coastguard Worker case FBS_INDIVIDUAL:
3171*d83cc019SAndroid Build Coastguard Worker return "indfb";
3172*d83cc019SAndroid Build Coastguard Worker case FBS_SHARED:
3173*d83cc019SAndroid Build Coastguard Worker return "shrfb";
3174*d83cc019SAndroid Build Coastguard Worker default:
3175*d83cc019SAndroid Build Coastguard Worker igt_assert(false);
3176*d83cc019SAndroid Build Coastguard Worker }
3177*d83cc019SAndroid Build Coastguard Worker }
3178*d83cc019SAndroid Build Coastguard Worker
feature_str(int feature)3179*d83cc019SAndroid Build Coastguard Worker static const char *feature_str(int feature)
3180*d83cc019SAndroid Build Coastguard Worker {
3181*d83cc019SAndroid Build Coastguard Worker switch (feature) {
3182*d83cc019SAndroid Build Coastguard Worker case FEATURE_NONE:
3183*d83cc019SAndroid Build Coastguard Worker return "nop";
3184*d83cc019SAndroid Build Coastguard Worker case FEATURE_FBC:
3185*d83cc019SAndroid Build Coastguard Worker return "fbc";
3186*d83cc019SAndroid Build Coastguard Worker case FEATURE_PSR:
3187*d83cc019SAndroid Build Coastguard Worker return "psr";
3188*d83cc019SAndroid Build Coastguard Worker case FEATURE_FBC | FEATURE_PSR:
3189*d83cc019SAndroid Build Coastguard Worker return "fbcpsr";
3190*d83cc019SAndroid Build Coastguard Worker case FEATURE_DRRS:
3191*d83cc019SAndroid Build Coastguard Worker return "drrs";
3192*d83cc019SAndroid Build Coastguard Worker case FEATURE_FBC | FEATURE_DRRS:
3193*d83cc019SAndroid Build Coastguard Worker return "fbcdrrs";
3194*d83cc019SAndroid Build Coastguard Worker case FEATURE_PSR | FEATURE_DRRS:
3195*d83cc019SAndroid Build Coastguard Worker return "psrdrrs";
3196*d83cc019SAndroid Build Coastguard Worker case FEATURE_FBC | FEATURE_PSR | FEATURE_DRRS:
3197*d83cc019SAndroid Build Coastguard Worker return "fbcpsrdrrs";
3198*d83cc019SAndroid Build Coastguard Worker default:
3199*d83cc019SAndroid Build Coastguard Worker igt_assert(false);
3200*d83cc019SAndroid Build Coastguard Worker }
3201*d83cc019SAndroid Build Coastguard Worker }
3202*d83cc019SAndroid Build Coastguard Worker
format_str(enum pixel_format format)3203*d83cc019SAndroid Build Coastguard Worker static const char *format_str(enum pixel_format format)
3204*d83cc019SAndroid Build Coastguard Worker {
3205*d83cc019SAndroid Build Coastguard Worker switch (format) {
3206*d83cc019SAndroid Build Coastguard Worker case FORMAT_RGB888:
3207*d83cc019SAndroid Build Coastguard Worker return "rgb888";
3208*d83cc019SAndroid Build Coastguard Worker case FORMAT_RGB565:
3209*d83cc019SAndroid Build Coastguard Worker return "rgb565";
3210*d83cc019SAndroid Build Coastguard Worker case FORMAT_RGB101010:
3211*d83cc019SAndroid Build Coastguard Worker return "rgb101010";
3212*d83cc019SAndroid Build Coastguard Worker default:
3213*d83cc019SAndroid Build Coastguard Worker igt_assert(false);
3214*d83cc019SAndroid Build Coastguard Worker }
3215*d83cc019SAndroid Build Coastguard Worker }
3216*d83cc019SAndroid Build Coastguard Worker
flip_str(enum flip_type flip)3217*d83cc019SAndroid Build Coastguard Worker static const char *flip_str(enum flip_type flip)
3218*d83cc019SAndroid Build Coastguard Worker {
3219*d83cc019SAndroid Build Coastguard Worker switch (flip) {
3220*d83cc019SAndroid Build Coastguard Worker case FLIP_PAGEFLIP:
3221*d83cc019SAndroid Build Coastguard Worker return "pg";
3222*d83cc019SAndroid Build Coastguard Worker case FLIP_MODESET:
3223*d83cc019SAndroid Build Coastguard Worker return "ms";
3224*d83cc019SAndroid Build Coastguard Worker case FLIP_PLANES:
3225*d83cc019SAndroid Build Coastguard Worker return "pl";
3226*d83cc019SAndroid Build Coastguard Worker default:
3227*d83cc019SAndroid Build Coastguard Worker igt_assert(false);
3228*d83cc019SAndroid Build Coastguard Worker }
3229*d83cc019SAndroid Build Coastguard Worker }
3230*d83cc019SAndroid Build Coastguard Worker
3231*d83cc019SAndroid Build Coastguard Worker #define TEST_MODE_ITER_BEGIN(t) \
3232*d83cc019SAndroid Build Coastguard Worker t.format = FORMAT_DEFAULT; \
3233*d83cc019SAndroid Build Coastguard Worker t.flip = FLIP_PAGEFLIP; \
3234*d83cc019SAndroid Build Coastguard Worker for (t.feature = 0; t.feature < FEATURE_COUNT; t.feature++) { \
3235*d83cc019SAndroid Build Coastguard Worker for (t.pipes = 0; t.pipes < PIPE_COUNT; t.pipes++) { \
3236*d83cc019SAndroid Build Coastguard Worker for (t.screen = 0; t.screen < SCREEN_COUNT; t.screen++) { \
3237*d83cc019SAndroid Build Coastguard Worker for (t.plane = 0; t.plane < PLANE_COUNT; t.plane++) { \
3238*d83cc019SAndroid Build Coastguard Worker for (t.fbs = 0; t.fbs < FBS_COUNT; t.fbs++) { \
3239*d83cc019SAndroid Build Coastguard Worker for (t.method = 0; t.method < IGT_DRAW_METHOD_COUNT; t.method++) { \
3240*d83cc019SAndroid Build Coastguard Worker if (t.pipes == PIPE_SINGLE && t.screen == SCREEN_SCND) \
3241*d83cc019SAndroid Build Coastguard Worker continue; \
3242*d83cc019SAndroid Build Coastguard Worker if (t.screen == SCREEN_OFFSCREEN && t.plane != PLANE_PRI) \
3243*d83cc019SAndroid Build Coastguard Worker continue; \
3244*d83cc019SAndroid Build Coastguard Worker if (!opt.show_hidden && t.pipes == PIPE_DUAL && \
3245*d83cc019SAndroid Build Coastguard Worker t.screen == SCREEN_OFFSCREEN) \
3246*d83cc019SAndroid Build Coastguard Worker continue; \
3247*d83cc019SAndroid Build Coastguard Worker if (!opt.show_hidden && t.feature == FEATURE_NONE) \
3248*d83cc019SAndroid Build Coastguard Worker continue; \
3249*d83cc019SAndroid Build Coastguard Worker if (!opt.show_hidden && t.fbs == FBS_SHARED && \
3250*d83cc019SAndroid Build Coastguard Worker (t.plane == PLANE_CUR || t.plane == PLANE_SPR)) \
3251*d83cc019SAndroid Build Coastguard Worker continue;
3252*d83cc019SAndroid Build Coastguard Worker
3253*d83cc019SAndroid Build Coastguard Worker
3254*d83cc019SAndroid Build Coastguard Worker #define TEST_MODE_ITER_END } } } } } }
3255*d83cc019SAndroid Build Coastguard Worker
3256*d83cc019SAndroid Build Coastguard Worker struct option long_options[] = {
3257*d83cc019SAndroid Build Coastguard Worker { "no-status-check", 0, 0, 's'},
3258*d83cc019SAndroid Build Coastguard Worker { "no-crc-check", 0, 0, 'c'},
3259*d83cc019SAndroid Build Coastguard Worker { "no-fbc-compression-check", 0, 0, 'o'},
3260*d83cc019SAndroid Build Coastguard Worker { "no-fbc-action-check", 0, 0, 'a'},
3261*d83cc019SAndroid Build Coastguard Worker { "no-edp", 0, 0, 'e'},
3262*d83cc019SAndroid Build Coastguard Worker { "use-small-modes", 0, 0, 'm'},
3263*d83cc019SAndroid Build Coastguard Worker { "show-hidden", 0, 0, 'i'},
3264*d83cc019SAndroid Build Coastguard Worker { "step", 0, 0, 't'},
3265*d83cc019SAndroid Build Coastguard Worker { "shared-fb-x", 1, 0, 'x'},
3266*d83cc019SAndroid Build Coastguard Worker { "shared-fb-y", 1, 0, 'y'},
3267*d83cc019SAndroid Build Coastguard Worker { "1p-only", 0, 0, '1'},
3268*d83cc019SAndroid Build Coastguard Worker { "2p-only", 0, 0, '2'},
3269*d83cc019SAndroid Build Coastguard Worker { "tiling", 1, 0, 'l'},
3270*d83cc019SAndroid Build Coastguard Worker { 0, 0, 0, 0 }
3271*d83cc019SAndroid Build Coastguard Worker };
3272*d83cc019SAndroid Build Coastguard Worker
3273*d83cc019SAndroid Build Coastguard Worker igt_main_args("", long_options, help_str, opt_handler, NULL)
3274*d83cc019SAndroid Build Coastguard Worker {
3275*d83cc019SAndroid Build Coastguard Worker struct test_mode t;
3276*d83cc019SAndroid Build Coastguard Worker
3277*d83cc019SAndroid Build Coastguard Worker igt_fixture
3278*d83cc019SAndroid Build Coastguard Worker setup_environment();
3279*d83cc019SAndroid Build Coastguard Worker
3280*d83cc019SAndroid Build Coastguard Worker for (t.feature = 0; t.feature < FEATURE_COUNT; t.feature++) {
3281*d83cc019SAndroid Build Coastguard Worker if (!opt.show_hidden && t.feature == FEATURE_NONE)
3282*d83cc019SAndroid Build Coastguard Worker continue;
3283*d83cc019SAndroid Build Coastguard Worker for (t.pipes = 0; t.pipes < PIPE_COUNT; t.pipes++) {
3284*d83cc019SAndroid Build Coastguard Worker t.screen = SCREEN_PRIM;
3285*d83cc019SAndroid Build Coastguard Worker t.plane = PLANE_PRI;
3286*d83cc019SAndroid Build Coastguard Worker t.fbs = FBS_INDIVIDUAL;
3287*d83cc019SAndroid Build Coastguard Worker t.format = FORMAT_DEFAULT;
3288*d83cc019SAndroid Build Coastguard Worker /* Make sure nothing is using these values. */
3289*d83cc019SAndroid Build Coastguard Worker t.flip = -1;
3290*d83cc019SAndroid Build Coastguard Worker t.method = -1;
3291*d83cc019SAndroid Build Coastguard Worker
3292*d83cc019SAndroid Build Coastguard Worker igt_subtest_f("%s-%s-rte",
3293*d83cc019SAndroid Build Coastguard Worker feature_str(t.feature),
3294*d83cc019SAndroid Build Coastguard Worker pipes_str(t.pipes))
3295*d83cc019SAndroid Build Coastguard Worker rte_subtest(&t);
3296*d83cc019SAndroid Build Coastguard Worker }
3297*d83cc019SAndroid Build Coastguard Worker }
3298*d83cc019SAndroid Build Coastguard Worker
3299*d83cc019SAndroid Build Coastguard Worker TEST_MODE_ITER_BEGIN(t)
3300*d83cc019SAndroid Build Coastguard Worker igt_subtest_f("%s-%s-%s-%s-%s-draw-%s",
3301*d83cc019SAndroid Build Coastguard Worker feature_str(t.feature),
3302*d83cc019SAndroid Build Coastguard Worker pipes_str(t.pipes),
3303*d83cc019SAndroid Build Coastguard Worker screen_str(t.screen),
3304*d83cc019SAndroid Build Coastguard Worker plane_str(t.plane),
3305*d83cc019SAndroid Build Coastguard Worker fbs_str(t.fbs),
3306*d83cc019SAndroid Build Coastguard Worker igt_draw_get_method_name(t.method))
3307*d83cc019SAndroid Build Coastguard Worker draw_subtest(&t);
3308*d83cc019SAndroid Build Coastguard Worker TEST_MODE_ITER_END
3309*d83cc019SAndroid Build Coastguard Worker
3310*d83cc019SAndroid Build Coastguard Worker TEST_MODE_ITER_BEGIN(t)
3311*d83cc019SAndroid Build Coastguard Worker if (t.plane != PLANE_PRI ||
3312*d83cc019SAndroid Build Coastguard Worker t.screen == SCREEN_OFFSCREEN ||
3313*d83cc019SAndroid Build Coastguard Worker (!opt.show_hidden && t.method != IGT_DRAW_BLT))
3314*d83cc019SAndroid Build Coastguard Worker continue;
3315*d83cc019SAndroid Build Coastguard Worker
3316*d83cc019SAndroid Build Coastguard Worker for (t.flip = 0; t.flip < FLIP_COUNT; t.flip++)
3317*d83cc019SAndroid Build Coastguard Worker igt_subtest_f("%s-%s-%s-%s-%sflip-%s",
3318*d83cc019SAndroid Build Coastguard Worker feature_str(t.feature),
3319*d83cc019SAndroid Build Coastguard Worker pipes_str(t.pipes),
3320*d83cc019SAndroid Build Coastguard Worker screen_str(t.screen),
3321*d83cc019SAndroid Build Coastguard Worker fbs_str(t.fbs),
3322*d83cc019SAndroid Build Coastguard Worker flip_str(t.flip),
3323*d83cc019SAndroid Build Coastguard Worker igt_draw_get_method_name(t.method))
3324*d83cc019SAndroid Build Coastguard Worker flip_subtest(&t);
3325*d83cc019SAndroid Build Coastguard Worker TEST_MODE_ITER_END
3326*d83cc019SAndroid Build Coastguard Worker
3327*d83cc019SAndroid Build Coastguard Worker TEST_MODE_ITER_BEGIN(t)
3328*d83cc019SAndroid Build Coastguard Worker if (t.plane != PLANE_PRI ||
3329*d83cc019SAndroid Build Coastguard Worker t.screen != SCREEN_PRIM ||
3330*d83cc019SAndroid Build Coastguard Worker t.method != IGT_DRAW_MMAP_GTT ||
3331*d83cc019SAndroid Build Coastguard Worker (t.feature & FEATURE_FBC) == 0)
3332*d83cc019SAndroid Build Coastguard Worker continue;
3333*d83cc019SAndroid Build Coastguard Worker
3334*d83cc019SAndroid Build Coastguard Worker igt_subtest_f("%s-%s-%s-fliptrack",
3335*d83cc019SAndroid Build Coastguard Worker feature_str(t.feature),
3336*d83cc019SAndroid Build Coastguard Worker pipes_str(t.pipes),
3337*d83cc019SAndroid Build Coastguard Worker fbs_str(t.fbs))
3338*d83cc019SAndroid Build Coastguard Worker fliptrack_subtest(&t, FLIP_PAGEFLIP);
3339*d83cc019SAndroid Build Coastguard Worker TEST_MODE_ITER_END
3340*d83cc019SAndroid Build Coastguard Worker
3341*d83cc019SAndroid Build Coastguard Worker TEST_MODE_ITER_BEGIN(t)
3342*d83cc019SAndroid Build Coastguard Worker if (t.screen == SCREEN_OFFSCREEN ||
3343*d83cc019SAndroid Build Coastguard Worker t.method != IGT_DRAW_BLT ||
3344*d83cc019SAndroid Build Coastguard Worker t.plane == PLANE_PRI)
3345*d83cc019SAndroid Build Coastguard Worker continue;
3346*d83cc019SAndroid Build Coastguard Worker
3347*d83cc019SAndroid Build Coastguard Worker igt_subtest_f("%s-%s-%s-%s-%s-move",
3348*d83cc019SAndroid Build Coastguard Worker feature_str(t.feature),
3349*d83cc019SAndroid Build Coastguard Worker pipes_str(t.pipes),
3350*d83cc019SAndroid Build Coastguard Worker screen_str(t.screen),
3351*d83cc019SAndroid Build Coastguard Worker plane_str(t.plane),
3352*d83cc019SAndroid Build Coastguard Worker fbs_str(t.fbs))
3353*d83cc019SAndroid Build Coastguard Worker move_subtest(&t);
3354*d83cc019SAndroid Build Coastguard Worker
3355*d83cc019SAndroid Build Coastguard Worker igt_subtest_f("%s-%s-%s-%s-%s-onoff",
3356*d83cc019SAndroid Build Coastguard Worker feature_str(t.feature),
3357*d83cc019SAndroid Build Coastguard Worker pipes_str(t.pipes),
3358*d83cc019SAndroid Build Coastguard Worker screen_str(t.screen),
3359*d83cc019SAndroid Build Coastguard Worker plane_str(t.plane),
3360*d83cc019SAndroid Build Coastguard Worker fbs_str(t.fbs))
3361*d83cc019SAndroid Build Coastguard Worker onoff_subtest(&t);
3362*d83cc019SAndroid Build Coastguard Worker TEST_MODE_ITER_END
3363*d83cc019SAndroid Build Coastguard Worker
3364*d83cc019SAndroid Build Coastguard Worker TEST_MODE_ITER_BEGIN(t)
3365*d83cc019SAndroid Build Coastguard Worker if (t.screen == SCREEN_OFFSCREEN ||
3366*d83cc019SAndroid Build Coastguard Worker t.method != IGT_DRAW_BLT ||
3367*d83cc019SAndroid Build Coastguard Worker t.plane != PLANE_SPR)
3368*d83cc019SAndroid Build Coastguard Worker continue;
3369*d83cc019SAndroid Build Coastguard Worker
3370*d83cc019SAndroid Build Coastguard Worker igt_subtest_f("%s-%s-%s-%s-%s-fullscreen",
3371*d83cc019SAndroid Build Coastguard Worker feature_str(t.feature),
3372*d83cc019SAndroid Build Coastguard Worker pipes_str(t.pipes),
3373*d83cc019SAndroid Build Coastguard Worker screen_str(t.screen),
3374*d83cc019SAndroid Build Coastguard Worker plane_str(t.plane),
3375*d83cc019SAndroid Build Coastguard Worker fbs_str(t.fbs))
3376*d83cc019SAndroid Build Coastguard Worker fullscreen_plane_subtest(&t);
3377*d83cc019SAndroid Build Coastguard Worker TEST_MODE_ITER_END
3378*d83cc019SAndroid Build Coastguard Worker
3379*d83cc019SAndroid Build Coastguard Worker TEST_MODE_ITER_BEGIN(t)
3380*d83cc019SAndroid Build Coastguard Worker if (t.screen != SCREEN_PRIM ||
3381*d83cc019SAndroid Build Coastguard Worker t.method != IGT_DRAW_BLT ||
3382*d83cc019SAndroid Build Coastguard Worker (!opt.show_hidden && t.plane != PLANE_PRI) ||
3383*d83cc019SAndroid Build Coastguard Worker (!opt.show_hidden && t.fbs != FBS_INDIVIDUAL))
3384*d83cc019SAndroid Build Coastguard Worker continue;
3385*d83cc019SAndroid Build Coastguard Worker
3386*d83cc019SAndroid Build Coastguard Worker igt_subtest_f("%s-%s-%s-%s-multidraw",
3387*d83cc019SAndroid Build Coastguard Worker feature_str(t.feature),
3388*d83cc019SAndroid Build Coastguard Worker pipes_str(t.pipes),
3389*d83cc019SAndroid Build Coastguard Worker plane_str(t.plane),
3390*d83cc019SAndroid Build Coastguard Worker fbs_str(t.fbs))
3391*d83cc019SAndroid Build Coastguard Worker multidraw_subtest(&t);
3392*d83cc019SAndroid Build Coastguard Worker TEST_MODE_ITER_END
3393*d83cc019SAndroid Build Coastguard Worker
3394*d83cc019SAndroid Build Coastguard Worker TEST_MODE_ITER_BEGIN(t)
3395*d83cc019SAndroid Build Coastguard Worker if (t.pipes != PIPE_SINGLE ||
3396*d83cc019SAndroid Build Coastguard Worker t.screen != SCREEN_PRIM ||
3397*d83cc019SAndroid Build Coastguard Worker t.plane != PLANE_PRI ||
3398*d83cc019SAndroid Build Coastguard Worker t.fbs != FBS_INDIVIDUAL ||
3399*d83cc019SAndroid Build Coastguard Worker t.method != IGT_DRAW_MMAP_GTT)
3400*d83cc019SAndroid Build Coastguard Worker continue;
3401*d83cc019SAndroid Build Coastguard Worker
3402*d83cc019SAndroid Build Coastguard Worker igt_subtest_f("%s-farfromfence", feature_str(t.feature))
3403*d83cc019SAndroid Build Coastguard Worker farfromfence_subtest(&t);
3404*d83cc019SAndroid Build Coastguard Worker TEST_MODE_ITER_END
3405*d83cc019SAndroid Build Coastguard Worker
3406*d83cc019SAndroid Build Coastguard Worker TEST_MODE_ITER_BEGIN(t)
3407*d83cc019SAndroid Build Coastguard Worker if (t.pipes != PIPE_SINGLE ||
3408*d83cc019SAndroid Build Coastguard Worker t.screen != SCREEN_PRIM ||
3409*d83cc019SAndroid Build Coastguard Worker t.plane != PLANE_PRI ||
3410*d83cc019SAndroid Build Coastguard Worker t.fbs != FBS_INDIVIDUAL)
3411*d83cc019SAndroid Build Coastguard Worker continue;
3412*d83cc019SAndroid Build Coastguard Worker
3413*d83cc019SAndroid Build Coastguard Worker for (t.format = 0; t.format < FORMAT_COUNT; t.format++) {
3414*d83cc019SAndroid Build Coastguard Worker /* Skip what we already tested. */
3415*d83cc019SAndroid Build Coastguard Worker if (t.format == FORMAT_DEFAULT)
3416*d83cc019SAndroid Build Coastguard Worker continue;
3417*d83cc019SAndroid Build Coastguard Worker
3418*d83cc019SAndroid Build Coastguard Worker igt_subtest_f("%s-%s-draw-%s",
3419*d83cc019SAndroid Build Coastguard Worker feature_str(t.feature),
3420*d83cc019SAndroid Build Coastguard Worker format_str(t.format),
3421*d83cc019SAndroid Build Coastguard Worker igt_draw_get_method_name(t.method))
3422*d83cc019SAndroid Build Coastguard Worker format_draw_subtest(&t);
3423*d83cc019SAndroid Build Coastguard Worker }
3424*d83cc019SAndroid Build Coastguard Worker TEST_MODE_ITER_END
3425*d83cc019SAndroid Build Coastguard Worker
3426*d83cc019SAndroid Build Coastguard Worker TEST_MODE_ITER_BEGIN(t)
3427*d83cc019SAndroid Build Coastguard Worker if (t.pipes != PIPE_SINGLE ||
3428*d83cc019SAndroid Build Coastguard Worker t.screen != SCREEN_PRIM ||
3429*d83cc019SAndroid Build Coastguard Worker t.plane != PLANE_PRI ||
3430*d83cc019SAndroid Build Coastguard Worker t.method != IGT_DRAW_BLT)
3431*d83cc019SAndroid Build Coastguard Worker continue;
3432*d83cc019SAndroid Build Coastguard Worker igt_subtest_f("%s-%s-scaledprimary",
3433*d83cc019SAndroid Build Coastguard Worker feature_str(t.feature),
3434*d83cc019SAndroid Build Coastguard Worker fbs_str(t.fbs))
3435*d83cc019SAndroid Build Coastguard Worker scaledprimary_subtest(&t);
3436*d83cc019SAndroid Build Coastguard Worker TEST_MODE_ITER_END
3437*d83cc019SAndroid Build Coastguard Worker
3438*d83cc019SAndroid Build Coastguard Worker TEST_MODE_ITER_BEGIN(t)
3439*d83cc019SAndroid Build Coastguard Worker if (t.pipes != PIPE_SINGLE ||
3440*d83cc019SAndroid Build Coastguard Worker t.screen != SCREEN_PRIM ||
3441*d83cc019SAndroid Build Coastguard Worker t.plane != PLANE_PRI ||
3442*d83cc019SAndroid Build Coastguard Worker t.fbs != FBS_INDIVIDUAL ||
3443*d83cc019SAndroid Build Coastguard Worker t.method != IGT_DRAW_BLT)
3444*d83cc019SAndroid Build Coastguard Worker continue;
3445*d83cc019SAndroid Build Coastguard Worker
3446*d83cc019SAndroid Build Coastguard Worker igt_subtest_f("%s-modesetfrombusy", feature_str(t.feature))
3447*d83cc019SAndroid Build Coastguard Worker modesetfrombusy_subtest(&t);
3448*d83cc019SAndroid Build Coastguard Worker
3449*d83cc019SAndroid Build Coastguard Worker if (t.feature & FEATURE_FBC) {
3450*d83cc019SAndroid Build Coastguard Worker igt_subtest_f("%s-badstride", feature_str(t.feature))
3451*d83cc019SAndroid Build Coastguard Worker badstride_subtest(&t);
3452*d83cc019SAndroid Build Coastguard Worker
3453*d83cc019SAndroid Build Coastguard Worker igt_subtest_f("%s-stridechange", feature_str(t.feature))
3454*d83cc019SAndroid Build Coastguard Worker stridechange_subtest(&t);
3455*d83cc019SAndroid Build Coastguard Worker
3456*d83cc019SAndroid Build Coastguard Worker igt_subtest_f("%s-tilingchange", feature_str(t.feature))
3457*d83cc019SAndroid Build Coastguard Worker tilingchange_subtest(&t);
3458*d83cc019SAndroid Build Coastguard Worker }
3459*d83cc019SAndroid Build Coastguard Worker
3460*d83cc019SAndroid Build Coastguard Worker if ((t.feature & FEATURE_PSR) || (t.feature & FEATURE_DRRS))
3461*d83cc019SAndroid Build Coastguard Worker igt_subtest_f("%s-slowdraw", feature_str(t.feature))
3462*d83cc019SAndroid Build Coastguard Worker slow_draw_subtest(&t);
3463*d83cc019SAndroid Build Coastguard Worker
3464*d83cc019SAndroid Build Coastguard Worker igt_subtest_f("%s-suspend", feature_str(t.feature))
3465*d83cc019SAndroid Build Coastguard Worker suspend_subtest(&t);
3466*d83cc019SAndroid Build Coastguard Worker TEST_MODE_ITER_END
3467*d83cc019SAndroid Build Coastguard Worker
3468*d83cc019SAndroid Build Coastguard Worker t.pipes = PIPE_SINGLE;
3469*d83cc019SAndroid Build Coastguard Worker t.screen = SCREEN_PRIM;
3470*d83cc019SAndroid Build Coastguard Worker t.plane = PLANE_PRI;
3471*d83cc019SAndroid Build Coastguard Worker t.fbs = FBS_INDIVIDUAL;
3472*d83cc019SAndroid Build Coastguard Worker t.feature = FEATURE_DEFAULT;
3473*d83cc019SAndroid Build Coastguard Worker t.format = FORMAT_DEFAULT;
3474*d83cc019SAndroid Build Coastguard Worker t.flip = FLIP_PAGEFLIP;
3475*d83cc019SAndroid Build Coastguard Worker igt_subtest("basic") {
3476*d83cc019SAndroid Build Coastguard Worker igt_require_gem(drm.fd);
3477*d83cc019SAndroid Build Coastguard Worker basic_subtest(&t);
3478*d83cc019SAndroid Build Coastguard Worker }
3479*d83cc019SAndroid Build Coastguard Worker
3480*d83cc019SAndroid Build Coastguard Worker igt_fixture
3481*d83cc019SAndroid Build Coastguard Worker teardown_environment();
3482*d83cc019SAndroid Build Coastguard Worker }
3483