xref: /aosp_15_r20/external/igt-gpu-tools/tests/kms_atomic.c (revision d83cc019efdc2edc6c4b16e9034a3ceb8d35d77c)
1*d83cc019SAndroid Build Coastguard Worker /*
2*d83cc019SAndroid Build Coastguard Worker  * Copyright © 2015 Intel Corporation
3*d83cc019SAndroid Build Coastguard Worker  * Copyright © 2014-2015 Collabora, Ltd.
4*d83cc019SAndroid Build Coastguard Worker  *
5*d83cc019SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a
6*d83cc019SAndroid Build Coastguard Worker  * copy of this software and associated documentation files (the "Software"),
7*d83cc019SAndroid Build Coastguard Worker  * to deal in the Software without restriction, including without limitation
8*d83cc019SAndroid Build Coastguard Worker  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9*d83cc019SAndroid Build Coastguard Worker  * and/or sell copies of the Software, and to permit persons to whom the
10*d83cc019SAndroid Build Coastguard Worker  * Software is furnished to do so, subject to the following conditions:
11*d83cc019SAndroid Build Coastguard Worker  *
12*d83cc019SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice (including the next
13*d83cc019SAndroid Build Coastguard Worker  * paragraph) shall be included in all copies or substantial portions of the
14*d83cc019SAndroid Build Coastguard Worker  * Software.
15*d83cc019SAndroid Build Coastguard Worker  *
16*d83cc019SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17*d83cc019SAndroid Build Coastguard Worker  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18*d83cc019SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
19*d83cc019SAndroid Build Coastguard Worker  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20*d83cc019SAndroid Build Coastguard Worker  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21*d83cc019SAndroid Build Coastguard Worker  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
22*d83cc019SAndroid Build Coastguard Worker  * IN THE SOFTWARE.
23*d83cc019SAndroid Build Coastguard Worker  *
24*d83cc019SAndroid Build Coastguard Worker  * Authors:
25*d83cc019SAndroid Build Coastguard Worker  *    Micah Fedke <[email protected]>
26*d83cc019SAndroid Build Coastguard Worker  *    Daniel Stone <[email protected]>
27*d83cc019SAndroid Build Coastguard Worker  *    Pekka Paalanen <[email protected]>
28*d83cc019SAndroid Build Coastguard Worker  */
29*d83cc019SAndroid Build Coastguard Worker 
30*d83cc019SAndroid Build Coastguard Worker /*
31*d83cc019SAndroid Build Coastguard Worker  * Testcase: testing atomic modesetting API
32*d83cc019SAndroid Build Coastguard Worker  */
33*d83cc019SAndroid Build Coastguard Worker 
34*d83cc019SAndroid Build Coastguard Worker #include <unistd.h>
35*d83cc019SAndroid Build Coastguard Worker #include <stdlib.h>
36*d83cc019SAndroid Build Coastguard Worker #include <stdio.h>
37*d83cc019SAndroid Build Coastguard Worker #include <stdint.h>
38*d83cc019SAndroid Build Coastguard Worker #include <string.h>
39*d83cc019SAndroid Build Coastguard Worker #include <errno.h>
40*d83cc019SAndroid Build Coastguard Worker #include <xf86drmMode.h>
41*d83cc019SAndroid Build Coastguard Worker #include <cairo.h>
42*d83cc019SAndroid Build Coastguard Worker #include "drm.h"
43*d83cc019SAndroid Build Coastguard Worker #include "ioctl_wrappers.h"
44*d83cc019SAndroid Build Coastguard Worker #include "drmtest.h"
45*d83cc019SAndroid Build Coastguard Worker #include "igt.h"
46*d83cc019SAndroid Build Coastguard Worker #include "igt_aux.h"
47*d83cc019SAndroid Build Coastguard Worker #include "sw_sync.h"
48*d83cc019SAndroid Build Coastguard Worker 
49*d83cc019SAndroid Build Coastguard Worker #ifndef DRM_CAP_CURSOR_WIDTH
50*d83cc019SAndroid Build Coastguard Worker #define DRM_CAP_CURSOR_WIDTH 0x8
51*d83cc019SAndroid Build Coastguard Worker #endif
52*d83cc019SAndroid Build Coastguard Worker 
53*d83cc019SAndroid Build Coastguard Worker #ifndef DRM_CAP_CURSOR_HEIGHT
54*d83cc019SAndroid Build Coastguard Worker #define DRM_CAP_CURSOR_HEIGHT 0x9
55*d83cc019SAndroid Build Coastguard Worker #endif
56*d83cc019SAndroid Build Coastguard Worker 
57*d83cc019SAndroid Build Coastguard Worker IGT_TEST_DESCRIPTION("Test atomic modesetting API");
58*d83cc019SAndroid Build Coastguard Worker 
59*d83cc019SAndroid Build Coastguard Worker enum kms_atomic_check_relax {
60*d83cc019SAndroid Build Coastguard Worker 	ATOMIC_RELAX_NONE = 0,
61*d83cc019SAndroid Build Coastguard Worker 	CRTC_RELAX_MODE = (1 << 0),
62*d83cc019SAndroid Build Coastguard Worker 	PLANE_RELAX_FB = (1 << 1)
63*d83cc019SAndroid Build Coastguard Worker };
64*d83cc019SAndroid Build Coastguard Worker 
plane_filter(enum igt_atomic_plane_properties prop)65*d83cc019SAndroid Build Coastguard Worker static bool plane_filter(enum igt_atomic_plane_properties prop)
66*d83cc019SAndroid Build Coastguard Worker {
67*d83cc019SAndroid Build Coastguard Worker 	if ((1 << prop) & IGT_PLANE_COORD_CHANGED_MASK)
68*d83cc019SAndroid Build Coastguard Worker 		return false;
69*d83cc019SAndroid Build Coastguard Worker 
70*d83cc019SAndroid Build Coastguard Worker 	if (prop == IGT_PLANE_CRTC_ID || prop == IGT_PLANE_FB_ID)
71*d83cc019SAndroid Build Coastguard Worker 		return false;
72*d83cc019SAndroid Build Coastguard Worker 
73*d83cc019SAndroid Build Coastguard Worker 	if (prop == IGT_PLANE_IN_FENCE_FD)
74*d83cc019SAndroid Build Coastguard Worker 		return false;
75*d83cc019SAndroid Build Coastguard Worker 
76*d83cc019SAndroid Build Coastguard Worker 	/* Don't care about other properties */
77*d83cc019SAndroid Build Coastguard Worker 	return true;
78*d83cc019SAndroid Build Coastguard Worker }
79*d83cc019SAndroid Build Coastguard Worker 
plane_get_current_state(igt_plane_t * plane,uint64_t * values)80*d83cc019SAndroid Build Coastguard Worker static void plane_get_current_state(igt_plane_t *plane, uint64_t *values)
81*d83cc019SAndroid Build Coastguard Worker {
82*d83cc019SAndroid Build Coastguard Worker 	int i;
83*d83cc019SAndroid Build Coastguard Worker 
84*d83cc019SAndroid Build Coastguard Worker 	for (i = 0; i < IGT_NUM_PLANE_PROPS; i++) {
85*d83cc019SAndroid Build Coastguard Worker 		if (plane_filter(i)) {
86*d83cc019SAndroid Build Coastguard Worker 			values[i] = 0;
87*d83cc019SAndroid Build Coastguard Worker 			continue;
88*d83cc019SAndroid Build Coastguard Worker 		}
89*d83cc019SAndroid Build Coastguard Worker 
90*d83cc019SAndroid Build Coastguard Worker 		values[i] = igt_plane_get_prop(plane, i);
91*d83cc019SAndroid Build Coastguard Worker 	}
92*d83cc019SAndroid Build Coastguard Worker }
93*d83cc019SAndroid Build Coastguard Worker 
plane_check_current_state(igt_plane_t * plane,const uint64_t * values,enum kms_atomic_check_relax relax)94*d83cc019SAndroid Build Coastguard Worker static void plane_check_current_state(igt_plane_t *plane, const uint64_t *values,
95*d83cc019SAndroid Build Coastguard Worker 				      enum kms_atomic_check_relax relax)
96*d83cc019SAndroid Build Coastguard Worker {
97*d83cc019SAndroid Build Coastguard Worker 	drmModePlanePtr legacy;
98*d83cc019SAndroid Build Coastguard Worker 	uint64_t current_values[IGT_NUM_PLANE_PROPS];
99*d83cc019SAndroid Build Coastguard Worker 	int i;
100*d83cc019SAndroid Build Coastguard Worker 
101*d83cc019SAndroid Build Coastguard Worker 	legacy = drmModeGetPlane(plane->pipe->display->drm_fd, plane->drm_plane->plane_id);
102*d83cc019SAndroid Build Coastguard Worker 	igt_assert(legacy);
103*d83cc019SAndroid Build Coastguard Worker 
104*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq_u32(legacy->crtc_id, values[IGT_PLANE_CRTC_ID]);
105*d83cc019SAndroid Build Coastguard Worker 
106*d83cc019SAndroid Build Coastguard Worker 	if (!(relax & PLANE_RELAX_FB))
107*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eq_u32(legacy->fb_id, values[IGT_PLANE_FB_ID]);
108*d83cc019SAndroid Build Coastguard Worker 
109*d83cc019SAndroid Build Coastguard Worker 	plane_get_current_state(plane, current_values);
110*d83cc019SAndroid Build Coastguard Worker 
111*d83cc019SAndroid Build Coastguard Worker 	/* Legacy cursor ioctls create their own, unknowable, internal
112*d83cc019SAndroid Build Coastguard Worker 	 * framebuffer which we can't reason about. */
113*d83cc019SAndroid Build Coastguard Worker 	if (relax & PLANE_RELAX_FB)
114*d83cc019SAndroid Build Coastguard Worker 		current_values[IGT_PLANE_FB_ID] = values[IGT_PLANE_FB_ID];
115*d83cc019SAndroid Build Coastguard Worker 
116*d83cc019SAndroid Build Coastguard Worker 	for (i = 0; i < IGT_NUM_PLANE_PROPS; i++)
117*d83cc019SAndroid Build Coastguard Worker 		if (!plane_filter(i))
118*d83cc019SAndroid Build Coastguard Worker 			igt_assert_eq_u64(current_values[i], values[i]);
119*d83cc019SAndroid Build Coastguard Worker 
120*d83cc019SAndroid Build Coastguard Worker 	drmModeFreePlane(legacy);
121*d83cc019SAndroid Build Coastguard Worker }
122*d83cc019SAndroid Build Coastguard Worker 
plane_commit(igt_plane_t * plane,enum igt_commit_style s,enum kms_atomic_check_relax relax)123*d83cc019SAndroid Build Coastguard Worker static void plane_commit(igt_plane_t *plane, enum igt_commit_style s,
124*d83cc019SAndroid Build Coastguard Worker                                 enum kms_atomic_check_relax relax)
125*d83cc019SAndroid Build Coastguard Worker {
126*d83cc019SAndroid Build Coastguard Worker 	igt_display_commit2(plane->pipe->display, s);
127*d83cc019SAndroid Build Coastguard Worker 	plane_check_current_state(plane, plane->values, relax);
128*d83cc019SAndroid Build Coastguard Worker }
129*d83cc019SAndroid Build Coastguard Worker 
plane_commit_atomic_err(igt_plane_t * plane,enum kms_atomic_check_relax relax,int err)130*d83cc019SAndroid Build Coastguard Worker static void plane_commit_atomic_err(igt_plane_t *plane,
131*d83cc019SAndroid Build Coastguard Worker 				    enum kms_atomic_check_relax relax,
132*d83cc019SAndroid Build Coastguard Worker 				    int err)
133*d83cc019SAndroid Build Coastguard Worker {
134*d83cc019SAndroid Build Coastguard Worker 	uint64_t current_values[IGT_NUM_PLANE_PROPS];
135*d83cc019SAndroid Build Coastguard Worker 
136*d83cc019SAndroid Build Coastguard Worker 	plane_get_current_state(plane, current_values);
137*d83cc019SAndroid Build Coastguard Worker 
138*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(-err, igt_display_try_commit2(plane->pipe->display, COMMIT_ATOMIC));
139*d83cc019SAndroid Build Coastguard Worker 
140*d83cc019SAndroid Build Coastguard Worker 	plane_check_current_state(plane, current_values, relax);
141*d83cc019SAndroid Build Coastguard Worker }
142*d83cc019SAndroid Build Coastguard Worker 
crtc_filter(enum igt_atomic_crtc_properties prop)143*d83cc019SAndroid Build Coastguard Worker static bool crtc_filter(enum igt_atomic_crtc_properties prop)
144*d83cc019SAndroid Build Coastguard Worker {
145*d83cc019SAndroid Build Coastguard Worker 	if (prop == IGT_CRTC_MODE_ID || prop == IGT_CRTC_ACTIVE)
146*d83cc019SAndroid Build Coastguard Worker 		return false;
147*d83cc019SAndroid Build Coastguard Worker 
148*d83cc019SAndroid Build Coastguard Worker 	return true;
149*d83cc019SAndroid Build Coastguard Worker }
150*d83cc019SAndroid Build Coastguard Worker 
crtc_get_current_state(igt_pipe_t * pipe,uint64_t * values)151*d83cc019SAndroid Build Coastguard Worker static void crtc_get_current_state(igt_pipe_t *pipe, uint64_t *values)
152*d83cc019SAndroid Build Coastguard Worker {
153*d83cc019SAndroid Build Coastguard Worker 	int i;
154*d83cc019SAndroid Build Coastguard Worker 
155*d83cc019SAndroid Build Coastguard Worker 	for (i = 0; i < IGT_NUM_CRTC_PROPS; i++) {
156*d83cc019SAndroid Build Coastguard Worker 		if (crtc_filter(i)) {
157*d83cc019SAndroid Build Coastguard Worker 			values[i] = 0;
158*d83cc019SAndroid Build Coastguard Worker 			continue;
159*d83cc019SAndroid Build Coastguard Worker 		}
160*d83cc019SAndroid Build Coastguard Worker 
161*d83cc019SAndroid Build Coastguard Worker 		values[i] = igt_pipe_obj_get_prop(pipe, i);
162*d83cc019SAndroid Build Coastguard Worker 	}
163*d83cc019SAndroid Build Coastguard Worker }
164*d83cc019SAndroid Build Coastguard Worker 
crtc_check_current_state(igt_pipe_t * pipe,const uint64_t * pipe_values,const uint64_t * primary_values,enum kms_atomic_check_relax relax)165*d83cc019SAndroid Build Coastguard Worker static void crtc_check_current_state(igt_pipe_t *pipe,
166*d83cc019SAndroid Build Coastguard Worker 				     const uint64_t *pipe_values,
167*d83cc019SAndroid Build Coastguard Worker 				     const uint64_t *primary_values,
168*d83cc019SAndroid Build Coastguard Worker 				     enum kms_atomic_check_relax relax)
169*d83cc019SAndroid Build Coastguard Worker {
170*d83cc019SAndroid Build Coastguard Worker 	uint64_t current_pipe_values[IGT_NUM_CRTC_PROPS];
171*d83cc019SAndroid Build Coastguard Worker 	drmModeCrtcPtr legacy;
172*d83cc019SAndroid Build Coastguard Worker 	drmModePropertyBlobRes *mode_prop = NULL;
173*d83cc019SAndroid Build Coastguard Worker 	struct drm_mode_modeinfo *mode = NULL;
174*d83cc019SAndroid Build Coastguard Worker 
175*d83cc019SAndroid Build Coastguard Worker 	if (pipe_values[IGT_CRTC_MODE_ID]) {
176*d83cc019SAndroid Build Coastguard Worker 		mode_prop = drmModeGetPropertyBlob(pipe->display->drm_fd,
177*d83cc019SAndroid Build Coastguard Worker 						   pipe_values[IGT_CRTC_MODE_ID]);
178*d83cc019SAndroid Build Coastguard Worker 
179*d83cc019SAndroid Build Coastguard Worker 		igt_assert(mode_prop);
180*d83cc019SAndroid Build Coastguard Worker 
181*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eq(mode_prop->length,
182*d83cc019SAndroid Build Coastguard Worker 		              sizeof(struct drm_mode_modeinfo));
183*d83cc019SAndroid Build Coastguard Worker 		mode = mode_prop->data;
184*d83cc019SAndroid Build Coastguard Worker 	}
185*d83cc019SAndroid Build Coastguard Worker 
186*d83cc019SAndroid Build Coastguard Worker 	legacy = drmModeGetCrtc(pipe->display->drm_fd, pipe->crtc_id);
187*d83cc019SAndroid Build Coastguard Worker 	igt_assert(legacy);
188*d83cc019SAndroid Build Coastguard Worker 
189*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq_u32(legacy->crtc_id, pipe->crtc_id);
190*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq_u32(legacy->x, primary_values[IGT_PLANE_SRC_X] >> 16);
191*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq_u32(legacy->y, primary_values[IGT_PLANE_SRC_Y] >> 16);
192*d83cc019SAndroid Build Coastguard Worker 
193*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq_u32(legacy->buffer_id, primary_values[IGT_PLANE_FB_ID]);
194*d83cc019SAndroid Build Coastguard Worker 
195*d83cc019SAndroid Build Coastguard Worker 	if (legacy->mode_valid) {
196*d83cc019SAndroid Build Coastguard Worker 		igt_assert(mode_prop);
197*d83cc019SAndroid Build Coastguard Worker 
198*d83cc019SAndroid Build Coastguard Worker 		do_or_die(memcmp(&legacy->mode, mode, sizeof(*mode)));
199*d83cc019SAndroid Build Coastguard Worker 
200*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eq(legacy->width, legacy->mode.hdisplay);
201*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eq(legacy->height, legacy->mode.vdisplay);
202*d83cc019SAndroid Build Coastguard Worker 
203*d83cc019SAndroid Build Coastguard Worker 		igt_assert_neq(pipe_values[IGT_CRTC_MODE_ID], 0);
204*d83cc019SAndroid Build Coastguard Worker 	} else {
205*d83cc019SAndroid Build Coastguard Worker 		igt_assert(!mode_prop);
206*d83cc019SAndroid Build Coastguard Worker 	}
207*d83cc019SAndroid Build Coastguard Worker 
208*d83cc019SAndroid Build Coastguard Worker 	crtc_get_current_state(pipe, current_pipe_values);
209*d83cc019SAndroid Build Coastguard Worker 
210*d83cc019SAndroid Build Coastguard Worker 	/* Optionally relax the check for MODE_ID: using the legacy SetCrtc
211*d83cc019SAndroid Build Coastguard Worker 	 * API can potentially change MODE_ID even if the mode itself remains
212*d83cc019SAndroid Build Coastguard Worker 	 * unchanged. */
213*d83cc019SAndroid Build Coastguard Worker 	if (relax & CRTC_RELAX_MODE && mode && current_pipe_values[IGT_CRTC_MODE_ID] &&
214*d83cc019SAndroid Build Coastguard Worker 	    current_pipe_values[IGT_CRTC_MODE_ID] != pipe_values[IGT_CRTC_MODE_ID]) {
215*d83cc019SAndroid Build Coastguard Worker 		drmModePropertyBlobRes *cur_prop =
216*d83cc019SAndroid Build Coastguard Worker 			drmModeGetPropertyBlob(pipe->display->drm_fd,
217*d83cc019SAndroid Build Coastguard Worker 					       current_pipe_values[IGT_CRTC_MODE_ID]);
218*d83cc019SAndroid Build Coastguard Worker 
219*d83cc019SAndroid Build Coastguard Worker 		igt_assert(cur_prop);
220*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eq(cur_prop->length, sizeof(struct drm_mode_modeinfo));
221*d83cc019SAndroid Build Coastguard Worker 
222*d83cc019SAndroid Build Coastguard Worker 		if (!memcmp(cur_prop->data, mode, sizeof(*mode)))
223*d83cc019SAndroid Build Coastguard Worker 			current_pipe_values[IGT_CRTC_MODE_ID] = pipe_values[IGT_CRTC_MODE_ID];
224*d83cc019SAndroid Build Coastguard Worker 
225*d83cc019SAndroid Build Coastguard Worker 		drmModeFreePropertyBlob(cur_prop);
226*d83cc019SAndroid Build Coastguard Worker 	}
227*d83cc019SAndroid Build Coastguard Worker 
228*d83cc019SAndroid Build Coastguard Worker 	do_or_die(memcmp(pipe_values, current_pipe_values, sizeof(current_pipe_values)));
229*d83cc019SAndroid Build Coastguard Worker 
230*d83cc019SAndroid Build Coastguard Worker 	drmModeFreeCrtc(legacy);
231*d83cc019SAndroid Build Coastguard Worker 	drmModeFreePropertyBlob(mode_prop);
232*d83cc019SAndroid Build Coastguard Worker }
233*d83cc019SAndroid Build Coastguard Worker 
crtc_commit(igt_pipe_t * pipe,igt_plane_t * plane,enum igt_commit_style s,enum kms_atomic_check_relax relax)234*d83cc019SAndroid Build Coastguard Worker static void crtc_commit(igt_pipe_t *pipe, igt_plane_t *plane,
235*d83cc019SAndroid Build Coastguard Worker 			enum igt_commit_style s,
236*d83cc019SAndroid Build Coastguard Worker 			enum kms_atomic_check_relax relax)
237*d83cc019SAndroid Build Coastguard Worker {
238*d83cc019SAndroid Build Coastguard Worker 	igt_display_commit2(pipe->display, s);
239*d83cc019SAndroid Build Coastguard Worker 
240*d83cc019SAndroid Build Coastguard Worker 	crtc_check_current_state(pipe, pipe->values, plane->values, relax);
241*d83cc019SAndroid Build Coastguard Worker 	plane_check_current_state(plane, plane->values, relax);
242*d83cc019SAndroid Build Coastguard Worker }
243*d83cc019SAndroid Build Coastguard Worker 
crtc_commit_atomic_flags_err(igt_pipe_t * pipe,igt_plane_t * plane,unsigned flags,enum kms_atomic_check_relax relax,int err)244*d83cc019SAndroid Build Coastguard Worker static void crtc_commit_atomic_flags_err(igt_pipe_t *pipe, igt_plane_t *plane,
245*d83cc019SAndroid Build Coastguard Worker 					 unsigned flags,
246*d83cc019SAndroid Build Coastguard Worker 					 enum kms_atomic_check_relax relax,
247*d83cc019SAndroid Build Coastguard Worker 					 int err)
248*d83cc019SAndroid Build Coastguard Worker {
249*d83cc019SAndroid Build Coastguard Worker 	uint64_t current_pipe_values[IGT_NUM_CRTC_PROPS];
250*d83cc019SAndroid Build Coastguard Worker 	uint64_t current_plane_values[IGT_NUM_PLANE_PROPS];
251*d83cc019SAndroid Build Coastguard Worker 
252*d83cc019SAndroid Build Coastguard Worker 	crtc_get_current_state(pipe, current_pipe_values);
253*d83cc019SAndroid Build Coastguard Worker 	plane_get_current_state(plane, current_plane_values);
254*d83cc019SAndroid Build Coastguard Worker 
255*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(-err, igt_display_try_commit_atomic(pipe->display, flags, NULL));
256*d83cc019SAndroid Build Coastguard Worker 
257*d83cc019SAndroid Build Coastguard Worker 	crtc_check_current_state(pipe, current_pipe_values, current_plane_values, relax);
258*d83cc019SAndroid Build Coastguard Worker 	plane_check_current_state(plane, current_plane_values, relax);
259*d83cc019SAndroid Build Coastguard Worker }
260*d83cc019SAndroid Build Coastguard Worker 
261*d83cc019SAndroid Build Coastguard Worker #define crtc_commit_atomic_err(pipe, plane, relax, err) \
262*d83cc019SAndroid Build Coastguard Worker 	crtc_commit_atomic_flags_err(pipe, plane, DRM_MODE_ATOMIC_ALLOW_MODESET, relax, err)
263*d83cc019SAndroid Build Coastguard Worker 
plane_get_igt_format(igt_plane_t * plane)264*d83cc019SAndroid Build Coastguard Worker static uint32_t plane_get_igt_format(igt_plane_t *plane)
265*d83cc019SAndroid Build Coastguard Worker {
266*d83cc019SAndroid Build Coastguard Worker 	drmModePlanePtr plane_kms;
267*d83cc019SAndroid Build Coastguard Worker 	int i;
268*d83cc019SAndroid Build Coastguard Worker 
269*d83cc019SAndroid Build Coastguard Worker 	plane_kms = plane->drm_plane;
270*d83cc019SAndroid Build Coastguard Worker 
271*d83cc019SAndroid Build Coastguard Worker 	for (i = 0; i < plane_kms->count_formats; i++) {
272*d83cc019SAndroid Build Coastguard Worker 		if (igt_fb_supported_format(plane_kms->formats[i]))
273*d83cc019SAndroid Build Coastguard Worker 			return plane_kms->formats[i];
274*d83cc019SAndroid Build Coastguard Worker 	}
275*d83cc019SAndroid Build Coastguard Worker 
276*d83cc019SAndroid Build Coastguard Worker 	return 0;
277*d83cc019SAndroid Build Coastguard Worker }
278*d83cc019SAndroid Build Coastguard Worker 
279*d83cc019SAndroid Build Coastguard Worker static void
plane_primary_overlay_zpos(igt_pipe_t * pipe,igt_output_t * output,igt_plane_t * primary,igt_plane_t * overlay,uint32_t format_primary,uint32_t format_overlay)280*d83cc019SAndroid Build Coastguard Worker plane_primary_overlay_zpos(igt_pipe_t *pipe, igt_output_t *output,
281*d83cc019SAndroid Build Coastguard Worker 			   igt_plane_t *primary, igt_plane_t *overlay,
282*d83cc019SAndroid Build Coastguard Worker 			   uint32_t format_primary, uint32_t format_overlay)
283*d83cc019SAndroid Build Coastguard Worker {
284*d83cc019SAndroid Build Coastguard Worker 	struct igt_fb fb_primary, fb_overlay;
285*d83cc019SAndroid Build Coastguard Worker 	drmModeModeInfo *mode = igt_output_get_mode(output);
286*d83cc019SAndroid Build Coastguard Worker 	cairo_t *cr;
287*d83cc019SAndroid Build Coastguard Worker 
288*d83cc019SAndroid Build Coastguard Worker 	/* for primary */
289*d83cc019SAndroid Build Coastguard Worker 	uint32_t w = mode->hdisplay;
290*d83cc019SAndroid Build Coastguard Worker 	uint32_t h = mode->vdisplay;
291*d83cc019SAndroid Build Coastguard Worker 
292*d83cc019SAndroid Build Coastguard Worker 	/* for overlay */
293*d83cc019SAndroid Build Coastguard Worker 	uint32_t w_overlay = mode->hdisplay / 2;
294*d83cc019SAndroid Build Coastguard Worker 	uint32_t h_overlay = mode->vdisplay / 2;
295*d83cc019SAndroid Build Coastguard Worker 
296*d83cc019SAndroid Build Coastguard Worker 	igt_create_color_pattern_fb(pipe->display->drm_fd,
297*d83cc019SAndroid Build Coastguard Worker 				    w, h, format_primary, I915_TILING_NONE,
298*d83cc019SAndroid Build Coastguard Worker 				    0.2, 0.2, 0.2, &fb_primary);
299*d83cc019SAndroid Build Coastguard Worker 
300*d83cc019SAndroid Build Coastguard Worker 	igt_create_color_pattern_fb(pipe->display->drm_fd,
301*d83cc019SAndroid Build Coastguard Worker 				    w_overlay, h_overlay,
302*d83cc019SAndroid Build Coastguard Worker 				    format_overlay, I915_TILING_NONE,
303*d83cc019SAndroid Build Coastguard Worker 				    0.2, 0.2, 0.2, &fb_overlay);
304*d83cc019SAndroid Build Coastguard Worker 
305*d83cc019SAndroid Build Coastguard Worker #if defined(USE_CAIRO_PIXMAN)
306*d83cc019SAndroid Build Coastguard Worker 	/* Draw a hole in the overlay */
307*d83cc019SAndroid Build Coastguard Worker 	cr = igt_get_cairo_ctx(pipe->display->drm_fd, &fb_overlay);
308*d83cc019SAndroid Build Coastguard Worker 	cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE);
309*d83cc019SAndroid Build Coastguard Worker 	igt_paint_color_alpha(cr, w_overlay / 4, h_overlay / 4,
310*d83cc019SAndroid Build Coastguard Worker 			      w_overlay / 2, h_overlay / 2,
311*d83cc019SAndroid Build Coastguard Worker 			      0.0, 0.0, 0.0, 0.0);
312*d83cc019SAndroid Build Coastguard Worker 	cairo_set_operator(cr, CAIRO_OPERATOR_OVER);
313*d83cc019SAndroid Build Coastguard Worker 	igt_put_cairo_ctx(pipe->display->drm_fd, &fb_overlay, cr);
314*d83cc019SAndroid Build Coastguard Worker #endif
315*d83cc019SAndroid Build Coastguard Worker 
316*d83cc019SAndroid Build Coastguard Worker 	igt_plane_set_fb(primary, &fb_primary);
317*d83cc019SAndroid Build Coastguard Worker 	igt_plane_set_fb(overlay, &fb_overlay);
318*d83cc019SAndroid Build Coastguard Worker 
319*d83cc019SAndroid Build Coastguard Worker 	igt_plane_set_position(overlay, w_overlay / 2, h_overlay / 2);
320*d83cc019SAndroid Build Coastguard Worker 
321*d83cc019SAndroid Build Coastguard Worker 	igt_plane_set_prop_value(primary, IGT_PLANE_ZPOS, 0);
322*d83cc019SAndroid Build Coastguard Worker 	igt_plane_set_prop_value(overlay, IGT_PLANE_ZPOS, 1);
323*d83cc019SAndroid Build Coastguard Worker 
324*d83cc019SAndroid Build Coastguard Worker 	igt_info("Committing with overlay on top, it has a hole "\
325*d83cc019SAndroid Build Coastguard Worker 		  "through which the primary should be seen\n");
326*d83cc019SAndroid Build Coastguard Worker 	plane_commit(primary, COMMIT_ATOMIC, ATOMIC_RELAX_NONE);
327*d83cc019SAndroid Build Coastguard Worker 
328*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq_u64(igt_plane_get_prop(primary, IGT_PLANE_ZPOS), 0);
329*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq_u64(igt_plane_get_prop(overlay, IGT_PLANE_ZPOS), 1);
330*d83cc019SAndroid Build Coastguard Worker 
331*d83cc019SAndroid Build Coastguard Worker 	igt_plane_set_prop_value(primary, IGT_PLANE_ZPOS, 1);
332*d83cc019SAndroid Build Coastguard Worker 	igt_plane_set_prop_value(overlay, IGT_PLANE_ZPOS, 0);
333*d83cc019SAndroid Build Coastguard Worker 
334*d83cc019SAndroid Build Coastguard Worker 	igt_info("Committing with primary on top, only the primary "\
335*d83cc019SAndroid Build Coastguard Worker 		 "should be visible\n");
336*d83cc019SAndroid Build Coastguard Worker 	plane_commit(primary, COMMIT_ATOMIC, ATOMIC_RELAX_NONE);
337*d83cc019SAndroid Build Coastguard Worker 
338*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq_u64(igt_plane_get_prop(primary, IGT_PLANE_ZPOS), 1);
339*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq_u64(igt_plane_get_prop(overlay, IGT_PLANE_ZPOS), 0);
340*d83cc019SAndroid Build Coastguard Worker 
341*d83cc019SAndroid Build Coastguard Worker 	/* Draw a hole in the primary exactly on top of the overlay plane */
342*d83cc019SAndroid Build Coastguard Worker #if defined(USE_CAIRO_PIXMAN)
343*d83cc019SAndroid Build Coastguard Worker 	cr = igt_get_cairo_ctx(pipe->display->drm_fd, &fb_primary);
344*d83cc019SAndroid Build Coastguard Worker 	cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE);
345*d83cc019SAndroid Build Coastguard Worker 	igt_paint_color_alpha(cr, w_overlay / 2, h_overlay / 2,
346*d83cc019SAndroid Build Coastguard Worker 			      w_overlay, h_overlay,
347*d83cc019SAndroid Build Coastguard Worker 			      0.0, 0.0, 0.0, 0.5);
348*d83cc019SAndroid Build Coastguard Worker 	cairo_set_operator(cr, CAIRO_OPERATOR_OVER);
349*d83cc019SAndroid Build Coastguard Worker 	igt_put_cairo_ctx(pipe->display->drm_fd, &fb_primary, cr);
350*d83cc019SAndroid Build Coastguard Worker #endif
351*d83cc019SAndroid Build Coastguard Worker 
352*d83cc019SAndroid Build Coastguard Worker 	igt_info("Committing with a hole in the primary through "\
353*d83cc019SAndroid Build Coastguard Worker 		  "which the underlay should be seen\n");
354*d83cc019SAndroid Build Coastguard Worker 	plane_commit(primary, COMMIT_ATOMIC, ATOMIC_RELAX_NONE);
355*d83cc019SAndroid Build Coastguard Worker 
356*d83cc019SAndroid Build Coastguard Worker 	/* reset it back to initial state */
357*d83cc019SAndroid Build Coastguard Worker 	igt_plane_set_prop_value(primary, IGT_PLANE_ZPOS, 0);
358*d83cc019SAndroid Build Coastguard Worker 	igt_plane_set_prop_value(overlay, IGT_PLANE_ZPOS, 1);
359*d83cc019SAndroid Build Coastguard Worker 	plane_commit(primary, COMMIT_ATOMIC, ATOMIC_RELAX_NONE);
360*d83cc019SAndroid Build Coastguard Worker 
361*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq_u64(igt_plane_get_prop(primary, IGT_PLANE_ZPOS), 0);
362*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq_u64(igt_plane_get_prop(overlay, IGT_PLANE_ZPOS), 1);
363*d83cc019SAndroid Build Coastguard Worker }
364*d83cc019SAndroid Build Coastguard Worker 
plane_overlay(igt_pipe_t * pipe,igt_output_t * output,igt_plane_t * plane)365*d83cc019SAndroid Build Coastguard Worker static void plane_overlay(igt_pipe_t *pipe, igt_output_t *output, igt_plane_t *plane)
366*d83cc019SAndroid Build Coastguard Worker {
367*d83cc019SAndroid Build Coastguard Worker 	drmModeModeInfo *mode = igt_output_get_mode(output);
368*d83cc019SAndroid Build Coastguard Worker 	uint32_t format = plane_get_igt_format(plane);
369*d83cc019SAndroid Build Coastguard Worker 	struct igt_fb fb;
370*d83cc019SAndroid Build Coastguard Worker 	uint32_t w = mode->hdisplay / 2;
371*d83cc019SAndroid Build Coastguard Worker 	uint32_t h = mode->vdisplay / 2;
372*d83cc019SAndroid Build Coastguard Worker 
373*d83cc019SAndroid Build Coastguard Worker 	igt_require(format != 0);
374*d83cc019SAndroid Build Coastguard Worker 
375*d83cc019SAndroid Build Coastguard Worker 	igt_create_pattern_fb(pipe->display->drm_fd, w, h,
376*d83cc019SAndroid Build Coastguard Worker 			      format, I915_TILING_NONE, &fb);
377*d83cc019SAndroid Build Coastguard Worker 
378*d83cc019SAndroid Build Coastguard Worker 	igt_plane_set_fb(plane, &fb);
379*d83cc019SAndroid Build Coastguard Worker 	igt_plane_set_position(plane, w/2, h/2);
380*d83cc019SAndroid Build Coastguard Worker 
381*d83cc019SAndroid Build Coastguard Worker 	/* Enable the overlay plane using the atomic API, and double-check
382*d83cc019SAndroid Build Coastguard Worker 	 * state is what we think it should be. */
383*d83cc019SAndroid Build Coastguard Worker 	plane_commit(plane, COMMIT_ATOMIC, ATOMIC_RELAX_NONE);
384*d83cc019SAndroid Build Coastguard Worker 
385*d83cc019SAndroid Build Coastguard Worker 	/* Disable the plane and check the state matches the old. */
386*d83cc019SAndroid Build Coastguard Worker 	igt_plane_set_fb(plane, NULL);
387*d83cc019SAndroid Build Coastguard Worker 	igt_plane_set_position(plane, 0, 0);
388*d83cc019SAndroid Build Coastguard Worker 	plane_commit(plane, COMMIT_ATOMIC, ATOMIC_RELAX_NONE);
389*d83cc019SAndroid Build Coastguard Worker 
390*d83cc019SAndroid Build Coastguard Worker 	/* Re-enable the plane through the legacy plane API, and verify through
391*d83cc019SAndroid Build Coastguard Worker 	 * atomic. */
392*d83cc019SAndroid Build Coastguard Worker 	igt_plane_set_fb(plane, &fb);
393*d83cc019SAndroid Build Coastguard Worker 	igt_plane_set_position(plane, w/2, h/2);
394*d83cc019SAndroid Build Coastguard Worker 	plane_commit(plane, COMMIT_LEGACY, ATOMIC_RELAX_NONE);
395*d83cc019SAndroid Build Coastguard Worker 
396*d83cc019SAndroid Build Coastguard Worker 	/* Restore the plane to its original settings through the legacy plane
397*d83cc019SAndroid Build Coastguard Worker 	 * API, and verify through atomic. */
398*d83cc019SAndroid Build Coastguard Worker 	igt_plane_set_fb(plane, NULL);
399*d83cc019SAndroid Build Coastguard Worker 	igt_plane_set_position(plane, 0, 0);
400*d83cc019SAndroid Build Coastguard Worker 	plane_commit(plane, COMMIT_LEGACY, ATOMIC_RELAX_NONE);
401*d83cc019SAndroid Build Coastguard Worker 
402*d83cc019SAndroid Build Coastguard Worker 	igt_remove_fb(pipe->display->drm_fd, &fb);
403*d83cc019SAndroid Build Coastguard Worker }
404*d83cc019SAndroid Build Coastguard Worker 
plane_primary(igt_pipe_t * pipe,igt_plane_t * plane,struct igt_fb * fb)405*d83cc019SAndroid Build Coastguard Worker static void plane_primary(igt_pipe_t *pipe, igt_plane_t *plane, struct igt_fb *fb)
406*d83cc019SAndroid Build Coastguard Worker {
407*d83cc019SAndroid Build Coastguard Worker 	struct igt_fb fb2;
408*d83cc019SAndroid Build Coastguard Worker 
409*d83cc019SAndroid Build Coastguard Worker 	igt_create_color_pattern_fb(pipe->display->drm_fd,
410*d83cc019SAndroid Build Coastguard Worker 				    fb->width, fb->height,
411*d83cc019SAndroid Build Coastguard Worker 				    fb->drm_format, I915_TILING_NONE,
412*d83cc019SAndroid Build Coastguard Worker 				    0.2, 0.2, 0.2, &fb2);
413*d83cc019SAndroid Build Coastguard Worker 
414*d83cc019SAndroid Build Coastguard Worker 	/* Flip the primary plane using the atomic API, and double-check
415*d83cc019SAndroid Build Coastguard Worker 	 * state is what we think it should be. */
416*d83cc019SAndroid Build Coastguard Worker 	igt_plane_set_fb(plane, &fb2);
417*d83cc019SAndroid Build Coastguard Worker 	crtc_commit(pipe, plane, COMMIT_ATOMIC, ATOMIC_RELAX_NONE);
418*d83cc019SAndroid Build Coastguard Worker 
419*d83cc019SAndroid Build Coastguard Worker 	/* Restore the primary plane and check the state matches the old. */
420*d83cc019SAndroid Build Coastguard Worker 	igt_plane_set_fb(plane, fb);
421*d83cc019SAndroid Build Coastguard Worker 	crtc_commit(pipe, plane, COMMIT_ATOMIC, ATOMIC_RELAX_NONE);
422*d83cc019SAndroid Build Coastguard Worker 
423*d83cc019SAndroid Build Coastguard Worker 	/* Set the plane through the legacy CRTC/primary-plane API, and
424*d83cc019SAndroid Build Coastguard Worker 	 * verify through atomic. */
425*d83cc019SAndroid Build Coastguard Worker 	igt_plane_set_fb(plane, &fb2);
426*d83cc019SAndroid Build Coastguard Worker 	crtc_commit(pipe, plane, COMMIT_LEGACY, CRTC_RELAX_MODE);
427*d83cc019SAndroid Build Coastguard Worker 
428*d83cc019SAndroid Build Coastguard Worker 	/* Restore the plane to its original settings through the legacy CRTC
429*d83cc019SAndroid Build Coastguard Worker 	 * API, and verify through atomic. */
430*d83cc019SAndroid Build Coastguard Worker 	igt_plane_set_fb(plane, fb);
431*d83cc019SAndroid Build Coastguard Worker 	crtc_commit(pipe, plane, COMMIT_LEGACY, CRTC_RELAX_MODE);
432*d83cc019SAndroid Build Coastguard Worker 
433*d83cc019SAndroid Build Coastguard Worker 	/* Set the plane through the universal setplane API, and
434*d83cc019SAndroid Build Coastguard Worker 	 * verify through atomic. */
435*d83cc019SAndroid Build Coastguard Worker 	igt_plane_set_fb(plane, &fb2);
436*d83cc019SAndroid Build Coastguard Worker 	plane_commit(plane, COMMIT_UNIVERSAL, ATOMIC_RELAX_NONE);
437*d83cc019SAndroid Build Coastguard Worker }
438*d83cc019SAndroid Build Coastguard Worker 
439*d83cc019SAndroid Build Coastguard Worker /* test to ensure that DRM_MODE_ATOMIC_TEST_ONLY really only touches the
440*d83cc019SAndroid Build Coastguard Worker  * free-standing state objects and nothing else.
441*d83cc019SAndroid Build Coastguard Worker  */
test_only(igt_pipe_t * pipe_obj,igt_plane_t * primary,igt_output_t * output)442*d83cc019SAndroid Build Coastguard Worker static void test_only(igt_pipe_t *pipe_obj,
443*d83cc019SAndroid Build Coastguard Worker 		      igt_plane_t *primary,
444*d83cc019SAndroid Build Coastguard Worker 		      igt_output_t *output)
445*d83cc019SAndroid Build Coastguard Worker {
446*d83cc019SAndroid Build Coastguard Worker 	drmModeModeInfo *mode = igt_output_get_mode(output);
447*d83cc019SAndroid Build Coastguard Worker 	uint32_t format = plane_get_igt_format(primary);
448*d83cc019SAndroid Build Coastguard Worker 	struct igt_fb fb;
449*d83cc019SAndroid Build Coastguard Worker 	uint64_t old_plane_values[IGT_NUM_PLANE_PROPS], old_crtc_values[IGT_NUM_CRTC_PROPS];
450*d83cc019SAndroid Build Coastguard Worker 
451*d83cc019SAndroid Build Coastguard Worker 	igt_require(format != 0);
452*d83cc019SAndroid Build Coastguard Worker 
453*d83cc019SAndroid Build Coastguard Worker 	plane_get_current_state(primary, old_plane_values);
454*d83cc019SAndroid Build Coastguard Worker 	crtc_get_current_state(pipe_obj, old_crtc_values);
455*d83cc019SAndroid Build Coastguard Worker 
456*d83cc019SAndroid Build Coastguard Worker 	igt_assert(!old_crtc_values[IGT_CRTC_MODE_ID]);
457*d83cc019SAndroid Build Coastguard Worker 
458*d83cc019SAndroid Build Coastguard Worker 	igt_create_pattern_fb(pipe_obj->display->drm_fd,
459*d83cc019SAndroid Build Coastguard Worker 			     mode->hdisplay, mode->vdisplay,
460*d83cc019SAndroid Build Coastguard Worker 			     format, I915_TILING_NONE, &fb);
461*d83cc019SAndroid Build Coastguard Worker 	igt_plane_set_fb(primary, &fb);
462*d83cc019SAndroid Build Coastguard Worker 	igt_output_set_pipe(output, pipe_obj->pipe);
463*d83cc019SAndroid Build Coastguard Worker 
464*d83cc019SAndroid Build Coastguard Worker 	igt_display_commit_atomic(pipe_obj->display, DRM_MODE_ATOMIC_TEST_ONLY | DRM_MODE_ATOMIC_ALLOW_MODESET, NULL);
465*d83cc019SAndroid Build Coastguard Worker 
466*d83cc019SAndroid Build Coastguard Worker 	/* check the state, should still be old state */
467*d83cc019SAndroid Build Coastguard Worker 	crtc_check_current_state(pipe_obj, old_crtc_values, old_plane_values, ATOMIC_RELAX_NONE);
468*d83cc019SAndroid Build Coastguard Worker 	plane_check_current_state(primary, old_plane_values, ATOMIC_RELAX_NONE);
469*d83cc019SAndroid Build Coastguard Worker 
470*d83cc019SAndroid Build Coastguard Worker 	/*
471*d83cc019SAndroid Build Coastguard Worker 	 * Enable the plane through the legacy CRTC/primary-plane API, and
472*d83cc019SAndroid Build Coastguard Worker 	 * verify through atomic.
473*d83cc019SAndroid Build Coastguard Worker 	 */
474*d83cc019SAndroid Build Coastguard Worker 	crtc_commit(pipe_obj, primary, COMMIT_LEGACY, CRTC_RELAX_MODE);
475*d83cc019SAndroid Build Coastguard Worker 
476*d83cc019SAndroid Build Coastguard Worker 	/* Same for disable.. */
477*d83cc019SAndroid Build Coastguard Worker 	plane_get_current_state(primary, old_plane_values);
478*d83cc019SAndroid Build Coastguard Worker 	crtc_get_current_state(pipe_obj, old_crtc_values);
479*d83cc019SAndroid Build Coastguard Worker 
480*d83cc019SAndroid Build Coastguard Worker 	igt_plane_set_fb(primary, NULL);
481*d83cc019SAndroid Build Coastguard Worker 	igt_output_set_pipe(output, PIPE_NONE);
482*d83cc019SAndroid Build Coastguard Worker 
483*d83cc019SAndroid Build Coastguard Worker 	igt_display_commit_atomic(pipe_obj->display, DRM_MODE_ATOMIC_TEST_ONLY | DRM_MODE_ATOMIC_ALLOW_MODESET, NULL);
484*d83cc019SAndroid Build Coastguard Worker 
485*d83cc019SAndroid Build Coastguard Worker 	/* for extra stress, go through dpms off/on cycle */
486*d83cc019SAndroid Build Coastguard Worker 	kmstest_set_connector_dpms(output->display->drm_fd, output->config.connector, DRM_MODE_DPMS_OFF);
487*d83cc019SAndroid Build Coastguard Worker 	kmstest_set_connector_dpms(output->display->drm_fd, output->config.connector, DRM_MODE_DPMS_ON);
488*d83cc019SAndroid Build Coastguard Worker 
489*d83cc019SAndroid Build Coastguard Worker 	/* check the state, should still be old state */
490*d83cc019SAndroid Build Coastguard Worker 	crtc_check_current_state(pipe_obj, old_crtc_values, old_plane_values, ATOMIC_RELAX_NONE);
491*d83cc019SAndroid Build Coastguard Worker 	plane_check_current_state(primary, old_plane_values, ATOMIC_RELAX_NONE);
492*d83cc019SAndroid Build Coastguard Worker 
493*d83cc019SAndroid Build Coastguard Worker 	/* And disable the pipe and remove fb, test complete */
494*d83cc019SAndroid Build Coastguard Worker 	crtc_commit(pipe_obj, primary, COMMIT_ATOMIC, ATOMIC_RELAX_NONE);
495*d83cc019SAndroid Build Coastguard Worker 	igt_remove_fb(pipe_obj->display->drm_fd, &fb);
496*d83cc019SAndroid Build Coastguard Worker }
497*d83cc019SAndroid Build Coastguard Worker 
plane_cursor(igt_pipe_t * pipe_obj,igt_output_t * output,igt_plane_t * cursor)498*d83cc019SAndroid Build Coastguard Worker static void plane_cursor(igt_pipe_t *pipe_obj,
499*d83cc019SAndroid Build Coastguard Worker 			 igt_output_t *output,
500*d83cc019SAndroid Build Coastguard Worker 			 igt_plane_t *cursor)
501*d83cc019SAndroid Build Coastguard Worker {
502*d83cc019SAndroid Build Coastguard Worker 	drmModeModeInfo *mode = igt_output_get_mode(output);
503*d83cc019SAndroid Build Coastguard Worker 	struct igt_fb fb;
504*d83cc019SAndroid Build Coastguard Worker 	uint64_t width, height;
505*d83cc019SAndroid Build Coastguard Worker 	int x = mode->hdisplay / 2;
506*d83cc019SAndroid Build Coastguard Worker 	int y = mode->vdisplay / 2;
507*d83cc019SAndroid Build Coastguard Worker 
508*d83cc019SAndroid Build Coastguard Worker 	/* Any kernel new enough for atomic, also has the cursor size caps. */
509*d83cc019SAndroid Build Coastguard Worker 	do_or_die(drmGetCap(pipe_obj->display->drm_fd,
510*d83cc019SAndroid Build Coastguard Worker 	                    DRM_CAP_CURSOR_WIDTH, &width));
511*d83cc019SAndroid Build Coastguard Worker 	do_or_die(drmGetCap(pipe_obj->display->drm_fd,
512*d83cc019SAndroid Build Coastguard Worker 	                    DRM_CAP_CURSOR_HEIGHT, &height));
513*d83cc019SAndroid Build Coastguard Worker 
514*d83cc019SAndroid Build Coastguard Worker 	igt_create_color_fb(pipe_obj->display->drm_fd,
515*d83cc019SAndroid Build Coastguard Worker 			    width, height, DRM_FORMAT_ARGB8888,
516*d83cc019SAndroid Build Coastguard Worker 			    LOCAL_DRM_FORMAT_MOD_NONE,
517*d83cc019SAndroid Build Coastguard Worker 			    0.0, 0.0, 0.0, &fb);
518*d83cc019SAndroid Build Coastguard Worker 
519*d83cc019SAndroid Build Coastguard Worker 	/* Flip the cursor plane using the atomic API, and double-check
520*d83cc019SAndroid Build Coastguard Worker 	 * state is what we think it should be. */
521*d83cc019SAndroid Build Coastguard Worker 	igt_plane_set_fb(cursor, &fb);
522*d83cc019SAndroid Build Coastguard Worker 	igt_plane_set_position(cursor, x, y);
523*d83cc019SAndroid Build Coastguard Worker 	plane_commit(cursor, COMMIT_ATOMIC, ATOMIC_RELAX_NONE);
524*d83cc019SAndroid Build Coastguard Worker 
525*d83cc019SAndroid Build Coastguard Worker 	/* Restore the cursor plane and check the state matches the old. */
526*d83cc019SAndroid Build Coastguard Worker 	igt_plane_set_fb(cursor, NULL);
527*d83cc019SAndroid Build Coastguard Worker 	igt_plane_set_position(cursor, 0, 0);
528*d83cc019SAndroid Build Coastguard Worker 	plane_commit(cursor, COMMIT_ATOMIC, ATOMIC_RELAX_NONE);
529*d83cc019SAndroid Build Coastguard Worker 
530*d83cc019SAndroid Build Coastguard Worker 	/* Re-enable the plane through the legacy cursor API, and verify
531*d83cc019SAndroid Build Coastguard Worker 	 * through atomic. */
532*d83cc019SAndroid Build Coastguard Worker 	igt_plane_set_fb(cursor, &fb);
533*d83cc019SAndroid Build Coastguard Worker 	igt_plane_set_position(cursor, x, y);
534*d83cc019SAndroid Build Coastguard Worker 	plane_commit(cursor, COMMIT_LEGACY, PLANE_RELAX_FB);
535*d83cc019SAndroid Build Coastguard Worker 
536*d83cc019SAndroid Build Coastguard Worker 	/* Wiggle. */
537*d83cc019SAndroid Build Coastguard Worker 	igt_plane_set_position(cursor, x - 16, y - 16);
538*d83cc019SAndroid Build Coastguard Worker 	plane_commit(cursor, COMMIT_LEGACY, PLANE_RELAX_FB);
539*d83cc019SAndroid Build Coastguard Worker 
540*d83cc019SAndroid Build Coastguard Worker 	/* Restore the plane to its original settings through the legacy cursor
541*d83cc019SAndroid Build Coastguard Worker 	 * API, and verify through atomic. */
542*d83cc019SAndroid Build Coastguard Worker 	igt_plane_set_fb(cursor, NULL);
543*d83cc019SAndroid Build Coastguard Worker 	igt_plane_set_position(cursor, 0, 0);
544*d83cc019SAndroid Build Coastguard Worker 	plane_commit(cursor, COMMIT_LEGACY, ATOMIC_RELAX_NONE);
545*d83cc019SAndroid Build Coastguard Worker }
546*d83cc019SAndroid Build Coastguard Worker 
plane_invalid_params(igt_pipe_t * pipe,igt_output_t * output,igt_plane_t * plane,struct igt_fb * fb)547*d83cc019SAndroid Build Coastguard Worker static void plane_invalid_params(igt_pipe_t *pipe,
548*d83cc019SAndroid Build Coastguard Worker 				 igt_output_t *output,
549*d83cc019SAndroid Build Coastguard Worker 				 igt_plane_t *plane,
550*d83cc019SAndroid Build Coastguard Worker 				 struct igt_fb *fb)
551*d83cc019SAndroid Build Coastguard Worker {
552*d83cc019SAndroid Build Coastguard Worker 	struct igt_fb fb2;
553*d83cc019SAndroid Build Coastguard Worker 
554*d83cc019SAndroid Build Coastguard Worker 	/* Pass a series of invalid object IDs for the FB ID. */
555*d83cc019SAndroid Build Coastguard Worker 	igt_plane_set_prop_value(plane, IGT_PLANE_FB_ID, plane->drm_plane->plane_id);
556*d83cc019SAndroid Build Coastguard Worker 	plane_commit_atomic_err(plane, ATOMIC_RELAX_NONE, EINVAL);
557*d83cc019SAndroid Build Coastguard Worker 
558*d83cc019SAndroid Build Coastguard Worker 	igt_plane_set_prop_value(plane, IGT_PLANE_FB_ID, pipe->crtc_id);
559*d83cc019SAndroid Build Coastguard Worker 	plane_commit_atomic_err(plane, ATOMIC_RELAX_NONE, EINVAL);
560*d83cc019SAndroid Build Coastguard Worker 
561*d83cc019SAndroid Build Coastguard Worker 	igt_plane_set_prop_value(plane, IGT_PLANE_FB_ID, output->id);
562*d83cc019SAndroid Build Coastguard Worker 	plane_commit_atomic_err(plane, ATOMIC_RELAX_NONE, EINVAL);
563*d83cc019SAndroid Build Coastguard Worker 
564*d83cc019SAndroid Build Coastguard Worker 	igt_plane_set_prop_value(plane, IGT_PLANE_FB_ID, pipe->values[IGT_CRTC_MODE_ID]);
565*d83cc019SAndroid Build Coastguard Worker 	plane_commit_atomic_err(plane, ATOMIC_RELAX_NONE, EINVAL);
566*d83cc019SAndroid Build Coastguard Worker 
567*d83cc019SAndroid Build Coastguard Worker 	/* Valid, but invalid because CRTC_ID is set. */
568*d83cc019SAndroid Build Coastguard Worker 	igt_plane_set_prop_value(plane, IGT_PLANE_FB_ID, 0);
569*d83cc019SAndroid Build Coastguard Worker 	plane_commit_atomic_err(plane, ATOMIC_RELAX_NONE, EINVAL);
570*d83cc019SAndroid Build Coastguard Worker 
571*d83cc019SAndroid Build Coastguard Worker 	igt_plane_set_fb(plane, fb);
572*d83cc019SAndroid Build Coastguard Worker 	plane_commit(plane, COMMIT_ATOMIC, ATOMIC_RELAX_NONE);
573*d83cc019SAndroid Build Coastguard Worker 
574*d83cc019SAndroid Build Coastguard Worker 	/* Pass a series of invalid object IDs for the CRTC ID. */
575*d83cc019SAndroid Build Coastguard Worker 	igt_plane_set_prop_value(plane, IGT_PLANE_CRTC_ID, plane->drm_plane->plane_id);
576*d83cc019SAndroid Build Coastguard Worker 	plane_commit_atomic_err(plane, ATOMIC_RELAX_NONE, EINVAL);
577*d83cc019SAndroid Build Coastguard Worker 
578*d83cc019SAndroid Build Coastguard Worker 	igt_plane_set_prop_value(plane, IGT_PLANE_CRTC_ID, fb->fb_id);
579*d83cc019SAndroid Build Coastguard Worker 	plane_commit_atomic_err(plane, ATOMIC_RELAX_NONE, EINVAL);
580*d83cc019SAndroid Build Coastguard Worker 
581*d83cc019SAndroid Build Coastguard Worker 	igt_plane_set_prop_value(plane, IGT_PLANE_CRTC_ID, output->id);
582*d83cc019SAndroid Build Coastguard Worker 	plane_commit_atomic_err(plane, ATOMIC_RELAX_NONE, EINVAL);
583*d83cc019SAndroid Build Coastguard Worker 
584*d83cc019SAndroid Build Coastguard Worker 	igt_plane_set_prop_value(plane, IGT_PLANE_CRTC_ID, pipe->values[IGT_CRTC_MODE_ID]);
585*d83cc019SAndroid Build Coastguard Worker 	plane_commit_atomic_err(plane, ATOMIC_RELAX_NONE, EINVAL);
586*d83cc019SAndroid Build Coastguard Worker 
587*d83cc019SAndroid Build Coastguard Worker 	/* Valid, but invalid because FB_ID is set. */
588*d83cc019SAndroid Build Coastguard Worker 	igt_plane_set_prop_value(plane, IGT_PLANE_CRTC_ID, 0);
589*d83cc019SAndroid Build Coastguard Worker 	plane_commit_atomic_err(plane, ATOMIC_RELAX_NONE, EINVAL);
590*d83cc019SAndroid Build Coastguard Worker 
591*d83cc019SAndroid Build Coastguard Worker 	igt_plane_set_fb(plane, fb);
592*d83cc019SAndroid Build Coastguard Worker 	plane_commit(plane, COMMIT_ATOMIC, ATOMIC_RELAX_NONE);
593*d83cc019SAndroid Build Coastguard Worker 
594*d83cc019SAndroid Build Coastguard Worker 	/* Create a framebuffer too small for the plane configuration. */
595*d83cc019SAndroid Build Coastguard Worker 	igt_create_pattern_fb(pipe->display->drm_fd,
596*d83cc019SAndroid Build Coastguard Worker 			      fb->width - 1, fb->height - 1,
597*d83cc019SAndroid Build Coastguard Worker 			      fb->drm_format, I915_TILING_NONE, &fb2);
598*d83cc019SAndroid Build Coastguard Worker 
599*d83cc019SAndroid Build Coastguard Worker 	igt_plane_set_prop_value(plane, IGT_PLANE_FB_ID, fb2.fb_id);
600*d83cc019SAndroid Build Coastguard Worker 	plane_commit_atomic_err(plane, ATOMIC_RELAX_NONE, ENOSPC);
601*d83cc019SAndroid Build Coastguard Worker 
602*d83cc019SAndroid Build Coastguard Worker 	/* Restore the primary plane and check the state matches the old. */
603*d83cc019SAndroid Build Coastguard Worker 	igt_plane_set_fb(plane, fb);
604*d83cc019SAndroid Build Coastguard Worker 	plane_commit(plane, COMMIT_ATOMIC, ATOMIC_RELAX_NONE);
605*d83cc019SAndroid Build Coastguard Worker }
606*d83cc019SAndroid Build Coastguard Worker 
plane_invalid_params_fence(igt_pipe_t * pipe,igt_output_t * output,igt_plane_t * plane)607*d83cc019SAndroid Build Coastguard Worker static void plane_invalid_params_fence(igt_pipe_t *pipe,
608*d83cc019SAndroid Build Coastguard Worker 				       igt_output_t *output,
609*d83cc019SAndroid Build Coastguard Worker 				       igt_plane_t *plane)
610*d83cc019SAndroid Build Coastguard Worker {
611*d83cc019SAndroid Build Coastguard Worker 	int timeline, fence_fd;
612*d83cc019SAndroid Build Coastguard Worker 
613*d83cc019SAndroid Build Coastguard Worker 	igt_require_sw_sync();
614*d83cc019SAndroid Build Coastguard Worker 
615*d83cc019SAndroid Build Coastguard Worker 	timeline = sw_sync_timeline_create();
616*d83cc019SAndroid Build Coastguard Worker 
617*d83cc019SAndroid Build Coastguard Worker 	/* invalid fence fd */
618*d83cc019SAndroid Build Coastguard Worker 	igt_plane_set_fence_fd(plane, pipe->display->drm_fd);
619*d83cc019SAndroid Build Coastguard Worker 	plane_commit_atomic_err(plane, ATOMIC_RELAX_NONE, EINVAL);
620*d83cc019SAndroid Build Coastguard Worker 
621*d83cc019SAndroid Build Coastguard Worker 	/* Valid fence_fd but invalid CRTC */
622*d83cc019SAndroid Build Coastguard Worker 	fence_fd = sw_sync_timeline_create_fence(timeline, 1);
623*d83cc019SAndroid Build Coastguard Worker 
624*d83cc019SAndroid Build Coastguard Worker 	igt_plane_set_prop_value(plane, IGT_PLANE_CRTC_ID, ~0);
625*d83cc019SAndroid Build Coastguard Worker 	igt_plane_set_fence_fd(plane, fence_fd);
626*d83cc019SAndroid Build Coastguard Worker 	plane_commit_atomic_err(plane, ATOMIC_RELAX_NONE, EINVAL);
627*d83cc019SAndroid Build Coastguard Worker 
628*d83cc019SAndroid Build Coastguard Worker 	sw_sync_timeline_inc(timeline, 1);
629*d83cc019SAndroid Build Coastguard Worker 	igt_plane_set_prop_value(plane, IGT_PLANE_CRTC_ID, pipe->crtc_id);
630*d83cc019SAndroid Build Coastguard Worker 	plane_commit(plane, COMMIT_ATOMIC, ATOMIC_RELAX_NONE);
631*d83cc019SAndroid Build Coastguard Worker 
632*d83cc019SAndroid Build Coastguard Worker 	close(fence_fd);
633*d83cc019SAndroid Build Coastguard Worker 	close(timeline);
634*d83cc019SAndroid Build Coastguard Worker }
635*d83cc019SAndroid Build Coastguard Worker 
crtc_invalid_params(igt_pipe_t * pipe,igt_output_t * output,igt_plane_t * plane,struct igt_fb * fb)636*d83cc019SAndroid Build Coastguard Worker static void crtc_invalid_params(igt_pipe_t *pipe,
637*d83cc019SAndroid Build Coastguard Worker 				igt_output_t *output,
638*d83cc019SAndroid Build Coastguard Worker 				igt_plane_t *plane,
639*d83cc019SAndroid Build Coastguard Worker 				struct igt_fb *fb)
640*d83cc019SAndroid Build Coastguard Worker {
641*d83cc019SAndroid Build Coastguard Worker 	uint64_t old_mode_id = pipe->values[IGT_CRTC_MODE_ID];
642*d83cc019SAndroid Build Coastguard Worker 	drmModeModeInfo *mode = igt_output_get_mode(output);
643*d83cc019SAndroid Build Coastguard Worker 
644*d83cc019SAndroid Build Coastguard Worker 	/* Pass a series of invalid object IDs for the mode ID. */
645*d83cc019SAndroid Build Coastguard Worker 	igt_pipe_obj_set_prop_value(pipe, IGT_CRTC_MODE_ID, plane->drm_plane->plane_id);
646*d83cc019SAndroid Build Coastguard Worker 	crtc_commit_atomic_err(pipe, plane, ATOMIC_RELAX_NONE, EINVAL);
647*d83cc019SAndroid Build Coastguard Worker 
648*d83cc019SAndroid Build Coastguard Worker 	igt_pipe_obj_set_prop_value(pipe, IGT_CRTC_MODE_ID, pipe->crtc_id);
649*d83cc019SAndroid Build Coastguard Worker 	crtc_commit_atomic_err(pipe, plane, ATOMIC_RELAX_NONE, EINVAL);
650*d83cc019SAndroid Build Coastguard Worker 
651*d83cc019SAndroid Build Coastguard Worker 	igt_pipe_obj_set_prop_value(pipe, IGT_CRTC_MODE_ID, output->id);
652*d83cc019SAndroid Build Coastguard Worker 	crtc_commit_atomic_err(pipe, plane, ATOMIC_RELAX_NONE, EINVAL);
653*d83cc019SAndroid Build Coastguard Worker 
654*d83cc019SAndroid Build Coastguard Worker 	igt_pipe_obj_set_prop_value(pipe, IGT_CRTC_MODE_ID, fb->fb_id);
655*d83cc019SAndroid Build Coastguard Worker 	crtc_commit_atomic_err(pipe, plane, ATOMIC_RELAX_NONE, EINVAL);
656*d83cc019SAndroid Build Coastguard Worker 
657*d83cc019SAndroid Build Coastguard Worker 	/* Can we restore mode? */
658*d83cc019SAndroid Build Coastguard Worker 	igt_pipe_obj_set_prop_value(pipe, IGT_CRTC_MODE_ID, old_mode_id);
659*d83cc019SAndroid Build Coastguard Worker 	crtc_commit_atomic_flags_err(pipe, plane, DRM_MODE_ATOMIC_TEST_ONLY, ATOMIC_RELAX_NONE, 0);
660*d83cc019SAndroid Build Coastguard Worker 
661*d83cc019SAndroid Build Coastguard Worker 	/*
662*d83cc019SAndroid Build Coastguard Worker 	 * TEST_ONLY cannot be combined with DRM_MODE_PAGE_FLIP_EVENT,
663*d83cc019SAndroid Build Coastguard Worker 	 * but DRM_MODE_PAGE_FLIP_EVENT will always generate EINVAL
664*d83cc019SAndroid Build Coastguard Worker 	 * without valid crtc, so test it here.
665*d83cc019SAndroid Build Coastguard Worker 	 */
666*d83cc019SAndroid Build Coastguard Worker 	crtc_commit_atomic_flags_err(pipe, plane,
667*d83cc019SAndroid Build Coastguard Worker 				     DRM_MODE_ATOMIC_TEST_ONLY | DRM_MODE_PAGE_FLIP_EVENT,
668*d83cc019SAndroid Build Coastguard Worker 				     ATOMIC_RELAX_NONE, EINVAL);
669*d83cc019SAndroid Build Coastguard Worker 
670*d83cc019SAndroid Build Coastguard Worker 	/* Create a blob which is the wrong size to be a valid mode. */
671*d83cc019SAndroid Build Coastguard Worker 	igt_pipe_obj_replace_prop_blob(pipe, IGT_CRTC_MODE_ID, mode, sizeof(*mode) - 1);
672*d83cc019SAndroid Build Coastguard Worker 	crtc_commit_atomic_err(pipe, plane, ATOMIC_RELAX_NONE, EINVAL);
673*d83cc019SAndroid Build Coastguard Worker 
674*d83cc019SAndroid Build Coastguard Worker 	igt_pipe_obj_replace_prop_blob(pipe, IGT_CRTC_MODE_ID, mode, sizeof(*mode) + 1);
675*d83cc019SAndroid Build Coastguard Worker 	crtc_commit_atomic_err(pipe, plane, ATOMIC_RELAX_NONE, EINVAL);
676*d83cc019SAndroid Build Coastguard Worker 
677*d83cc019SAndroid Build Coastguard Worker 
678*d83cc019SAndroid Build Coastguard Worker 	/* Restore the CRTC and check the state matches the old. */
679*d83cc019SAndroid Build Coastguard Worker 	igt_pipe_obj_replace_prop_blob(pipe, IGT_CRTC_MODE_ID, mode, sizeof(*mode));
680*d83cc019SAndroid Build Coastguard Worker 	crtc_commit(pipe, plane, COMMIT_ATOMIC, ATOMIC_RELAX_NONE);
681*d83cc019SAndroid Build Coastguard Worker }
682*d83cc019SAndroid Build Coastguard Worker 
crtc_invalid_params_fence(igt_pipe_t * pipe,igt_output_t * output,igt_plane_t * plane,struct igt_fb * fb)683*d83cc019SAndroid Build Coastguard Worker static void crtc_invalid_params_fence(igt_pipe_t *pipe,
684*d83cc019SAndroid Build Coastguard Worker 				      igt_output_t *output,
685*d83cc019SAndroid Build Coastguard Worker 				      igt_plane_t *plane,
686*d83cc019SAndroid Build Coastguard Worker 				      struct igt_fb *fb)
687*d83cc019SAndroid Build Coastguard Worker {
688*d83cc019SAndroid Build Coastguard Worker 	int timeline, fence_fd;
689*d83cc019SAndroid Build Coastguard Worker 	void *map;
690*d83cc019SAndroid Build Coastguard Worker 	const ptrdiff_t page_size = sysconf(_SC_PAGE_SIZE);
691*d83cc019SAndroid Build Coastguard Worker 
692*d83cc019SAndroid Build Coastguard Worker 	uint64_t old_mode_id = pipe->values[IGT_CRTC_MODE_ID];
693*d83cc019SAndroid Build Coastguard Worker 
694*d83cc019SAndroid Build Coastguard Worker 	igt_require_sw_sync();
695*d83cc019SAndroid Build Coastguard Worker 
696*d83cc019SAndroid Build Coastguard Worker 	timeline = sw_sync_timeline_create();
697*d83cc019SAndroid Build Coastguard Worker 
698*d83cc019SAndroid Build Coastguard Worker 	/* invalid out_fence_ptr */
699*d83cc019SAndroid Build Coastguard Worker 	map = mmap(NULL, page_size, PROT_READ, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
700*d83cc019SAndroid Build Coastguard Worker 	igt_assert(map != MAP_FAILED);
701*d83cc019SAndroid Build Coastguard Worker 
702*d83cc019SAndroid Build Coastguard Worker 	igt_pipe_obj_set_prop_value(pipe, IGT_CRTC_OUT_FENCE_PTR, (ptrdiff_t)map);
703*d83cc019SAndroid Build Coastguard Worker 	crtc_commit_atomic_err(pipe, plane, ATOMIC_RELAX_NONE, EFAULT);
704*d83cc019SAndroid Build Coastguard Worker 	munmap(map, page_size);
705*d83cc019SAndroid Build Coastguard Worker 
706*d83cc019SAndroid Build Coastguard Worker 	/* invalid out_fence_ptr */
707*d83cc019SAndroid Build Coastguard Worker 	map = mmap(NULL, page_size, PROT_EXEC, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
708*d83cc019SAndroid Build Coastguard Worker 	igt_assert(map != MAP_FAILED);
709*d83cc019SAndroid Build Coastguard Worker 
710*d83cc019SAndroid Build Coastguard Worker 	igt_pipe_obj_set_prop_value(pipe, IGT_CRTC_OUT_FENCE_PTR, (ptrdiff_t)map);
711*d83cc019SAndroid Build Coastguard Worker 	crtc_commit_atomic_err(pipe, plane, ATOMIC_RELAX_NONE, EFAULT);
712*d83cc019SAndroid Build Coastguard Worker 	munmap(map, page_size);
713*d83cc019SAndroid Build Coastguard Worker 
714*d83cc019SAndroid Build Coastguard Worker 	/* invalid out_fence_ptr */
715*d83cc019SAndroid Build Coastguard Worker 	map = mmap(NULL, page_size, PROT_NONE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
716*d83cc019SAndroid Build Coastguard Worker 	igt_assert(map != MAP_FAILED);
717*d83cc019SAndroid Build Coastguard Worker 
718*d83cc019SAndroid Build Coastguard Worker 	igt_pipe_obj_set_prop_value(pipe, IGT_CRTC_OUT_FENCE_PTR, (ptrdiff_t)map);
719*d83cc019SAndroid Build Coastguard Worker 	crtc_commit_atomic_err(pipe, plane, ATOMIC_RELAX_NONE, EFAULT);
720*d83cc019SAndroid Build Coastguard Worker 	munmap(map, page_size);
721*d83cc019SAndroid Build Coastguard Worker 
722*d83cc019SAndroid Build Coastguard Worker 	/* valid in fence but not allowed prop on crtc */
723*d83cc019SAndroid Build Coastguard Worker 	fence_fd = sw_sync_timeline_create_fence(timeline, 1);
724*d83cc019SAndroid Build Coastguard Worker 	igt_plane_set_fence_fd(plane, fence_fd);
725*d83cc019SAndroid Build Coastguard Worker 
726*d83cc019SAndroid Build Coastguard Worker 	igt_pipe_obj_set_prop_value(pipe, IGT_CRTC_ACTIVE, 0);
727*d83cc019SAndroid Build Coastguard Worker 	igt_pipe_obj_clear_prop_changed(pipe, IGT_CRTC_OUT_FENCE_PTR);
728*d83cc019SAndroid Build Coastguard Worker 
729*d83cc019SAndroid Build Coastguard Worker 	crtc_commit_atomic_flags_err(pipe, plane, 0, ATOMIC_RELAX_NONE, EINVAL);
730*d83cc019SAndroid Build Coastguard Worker 
731*d83cc019SAndroid Build Coastguard Worker 	/* valid out fence ptr and flip event but not allowed prop on crtc */
732*d83cc019SAndroid Build Coastguard Worker 	igt_pipe_request_out_fence(pipe);
733*d83cc019SAndroid Build Coastguard Worker 	crtc_commit_atomic_flags_err(pipe, plane, DRM_MODE_PAGE_FLIP_EVENT,
734*d83cc019SAndroid Build Coastguard Worker 				     ATOMIC_RELAX_NONE, EINVAL);
735*d83cc019SAndroid Build Coastguard Worker 
736*d83cc019SAndroid Build Coastguard Worker 	/* valid flip event but not allowed prop on crtc */
737*d83cc019SAndroid Build Coastguard Worker 	igt_pipe_obj_clear_prop_changed(pipe, IGT_CRTC_OUT_FENCE_PTR);
738*d83cc019SAndroid Build Coastguard Worker 	crtc_commit_atomic_flags_err(pipe, plane, DRM_MODE_PAGE_FLIP_EVENT,
739*d83cc019SAndroid Build Coastguard Worker 				     ATOMIC_RELAX_NONE, EINVAL);
740*d83cc019SAndroid Build Coastguard Worker 
741*d83cc019SAndroid Build Coastguard Worker 	igt_pipe_obj_set_prop_value(pipe, IGT_CRTC_ACTIVE, 1);
742*d83cc019SAndroid Build Coastguard Worker 
743*d83cc019SAndroid Build Coastguard Worker 	/* Configuration should be valid again */
744*d83cc019SAndroid Build Coastguard Worker 	crtc_commit_atomic_flags_err(pipe, plane, DRM_MODE_ATOMIC_TEST_ONLY,
745*d83cc019SAndroid Build Coastguard Worker 				     ATOMIC_RELAX_NONE, 0);
746*d83cc019SAndroid Build Coastguard Worker 
747*d83cc019SAndroid Build Coastguard Worker 	/* Set invalid prop */
748*d83cc019SAndroid Build Coastguard Worker 	igt_pipe_obj_set_prop_value(pipe, IGT_CRTC_MODE_ID, fb->fb_id);
749*d83cc019SAndroid Build Coastguard Worker 
750*d83cc019SAndroid Build Coastguard Worker 	/* valid out fence but invalid prop on crtc */
751*d83cc019SAndroid Build Coastguard Worker 	igt_pipe_request_out_fence(pipe);
752*d83cc019SAndroid Build Coastguard Worker 	crtc_commit_atomic_flags_err(pipe, plane, 0,
753*d83cc019SAndroid Build Coastguard Worker 				     ATOMIC_RELAX_NONE, EINVAL);
754*d83cc019SAndroid Build Coastguard Worker 
755*d83cc019SAndroid Build Coastguard Worker 	/* valid out fence ptr and flip event but invalid prop on crtc */
756*d83cc019SAndroid Build Coastguard Worker 	crtc_commit_atomic_flags_err(pipe, plane, DRM_MODE_PAGE_FLIP_EVENT,
757*d83cc019SAndroid Build Coastguard Worker 				     ATOMIC_RELAX_NONE, EINVAL);
758*d83cc019SAndroid Build Coastguard Worker 
759*d83cc019SAndroid Build Coastguard Worker 	/* valid page flip event but invalid prop on crtc */
760*d83cc019SAndroid Build Coastguard Worker 	crtc_commit_atomic_flags_err(pipe, plane, DRM_MODE_PAGE_FLIP_EVENT,
761*d83cc019SAndroid Build Coastguard Worker 				     ATOMIC_RELAX_NONE, EINVAL);
762*d83cc019SAndroid Build Coastguard Worker 
763*d83cc019SAndroid Build Coastguard Worker 	/* successful TEST_ONLY with fences set */
764*d83cc019SAndroid Build Coastguard Worker 	igt_pipe_obj_set_prop_value(pipe, IGT_CRTC_MODE_ID, old_mode_id);
765*d83cc019SAndroid Build Coastguard Worker 	crtc_commit_atomic_flags_err(pipe, plane, DRM_MODE_ATOMIC_TEST_ONLY,
766*d83cc019SAndroid Build Coastguard Worker 				     ATOMIC_RELAX_NONE, 0);
767*d83cc019SAndroid Build Coastguard Worker 	igt_assert(pipe->out_fence_fd == -1);
768*d83cc019SAndroid Build Coastguard Worker 	close(fence_fd);
769*d83cc019SAndroid Build Coastguard Worker 	close(timeline);
770*d83cc019SAndroid Build Coastguard Worker 
771*d83cc019SAndroid Build Coastguard Worker 	/* reset fences */
772*d83cc019SAndroid Build Coastguard Worker 	igt_plane_set_fence_fd(plane, -1);
773*d83cc019SAndroid Build Coastguard Worker 	igt_pipe_obj_set_prop_value(pipe, IGT_CRTC_OUT_FENCE_PTR, 0);
774*d83cc019SAndroid Build Coastguard Worker 	igt_pipe_obj_clear_prop_changed(pipe, IGT_CRTC_OUT_FENCE_PTR);
775*d83cc019SAndroid Build Coastguard Worker 	crtc_commit(pipe, plane, COMMIT_ATOMIC, ATOMIC_RELAX_NONE);
776*d83cc019SAndroid Build Coastguard Worker 
777*d83cc019SAndroid Build Coastguard Worker 	/* out fence ptr but not page flip event */
778*d83cc019SAndroid Build Coastguard Worker 	igt_pipe_request_out_fence(pipe);
779*d83cc019SAndroid Build Coastguard Worker 	crtc_commit(pipe, plane, COMMIT_ATOMIC, ATOMIC_RELAX_NONE);
780*d83cc019SAndroid Build Coastguard Worker 
781*d83cc019SAndroid Build Coastguard Worker 	igt_assert(pipe->out_fence_fd != -1);
782*d83cc019SAndroid Build Coastguard Worker }
783*d83cc019SAndroid Build Coastguard Worker 
784*d83cc019SAndroid Build Coastguard Worker /* Abuse the atomic ioctl directly in order to test various invalid conditions,
785*d83cc019SAndroid Build Coastguard Worker  * which the libdrm wrapper won't allow us to create. */
atomic_invalid_params(igt_pipe_t * pipe,igt_plane_t * plane,igt_output_t * output,struct igt_fb * fb)786*d83cc019SAndroid Build Coastguard Worker static void atomic_invalid_params(igt_pipe_t *pipe,
787*d83cc019SAndroid Build Coastguard Worker 				  igt_plane_t *plane,
788*d83cc019SAndroid Build Coastguard Worker 				  igt_output_t *output,
789*d83cc019SAndroid Build Coastguard Worker 				  struct igt_fb *fb)
790*d83cc019SAndroid Build Coastguard Worker {
791*d83cc019SAndroid Build Coastguard Worker 	igt_display_t *display = pipe->display;
792*d83cc019SAndroid Build Coastguard Worker 	struct drm_mode_atomic ioc;
793*d83cc019SAndroid Build Coastguard Worker 	uint32_t obj_raw[16]; /* array of objects (sized by count_objs) */
794*d83cc019SAndroid Build Coastguard Worker 	uint32_t num_props_raw[16]; /* array of num props per obj (ditto) */
795*d83cc019SAndroid Build Coastguard Worker 	uint32_t props_raw[256]; /* array of props (sum of count_props) */
796*d83cc019SAndroid Build Coastguard Worker 	uint64_t values_raw[256]; /* array of values for properties (ditto) */
797*d83cc019SAndroid Build Coastguard Worker 	int i;
798*d83cc019SAndroid Build Coastguard Worker 
799*d83cc019SAndroid Build Coastguard Worker 	memset(&ioc, 0, sizeof(ioc));
800*d83cc019SAndroid Build Coastguard Worker 
801*d83cc019SAndroid Build Coastguard Worker 	/* An empty request should do nothing. */
802*d83cc019SAndroid Build Coastguard Worker 	do_ioctl(display->drm_fd, DRM_IOCTL_MODE_ATOMIC, &ioc);
803*d83cc019SAndroid Build Coastguard Worker 
804*d83cc019SAndroid Build Coastguard Worker 	for (i = 0; i < ARRAY_SIZE(obj_raw); i++)
805*d83cc019SAndroid Build Coastguard Worker 		obj_raw[i] = 0;
806*d83cc019SAndroid Build Coastguard Worker 	for (i = 0; i < ARRAY_SIZE(num_props_raw); i++)
807*d83cc019SAndroid Build Coastguard Worker 		num_props_raw[i] = 0;
808*d83cc019SAndroid Build Coastguard Worker 	for (i = 0; i < ARRAY_SIZE(props_raw); i++)
809*d83cc019SAndroid Build Coastguard Worker 		props_raw[i] = 0;
810*d83cc019SAndroid Build Coastguard Worker 	for (i = 0; i < ARRAY_SIZE(values_raw); i++)
811*d83cc019SAndroid Build Coastguard Worker 		values_raw[i] = 0;
812*d83cc019SAndroid Build Coastguard Worker 
813*d83cc019SAndroid Build Coastguard Worker 	ioc.objs_ptr = (uintptr_t) obj_raw;
814*d83cc019SAndroid Build Coastguard Worker 	ioc.count_props_ptr = (uintptr_t) num_props_raw;
815*d83cc019SAndroid Build Coastguard Worker 	ioc.props_ptr = (uintptr_t) props_raw;
816*d83cc019SAndroid Build Coastguard Worker 	ioc.prop_values_ptr = (uintptr_t) values_raw;
817*d83cc019SAndroid Build Coastguard Worker 
818*d83cc019SAndroid Build Coastguard Worker 	/* Valid pointers, but still should copy nothing. */
819*d83cc019SAndroid Build Coastguard Worker 	do_ioctl(display->drm_fd, DRM_IOCTL_MODE_ATOMIC, &ioc);
820*d83cc019SAndroid Build Coastguard Worker 
821*d83cc019SAndroid Build Coastguard Worker 	/* Valid noop, but with event set should fail. */
822*d83cc019SAndroid Build Coastguard Worker 	ioc.flags = DRM_MODE_PAGE_FLIP_EVENT;
823*d83cc019SAndroid Build Coastguard Worker 	do_ioctl_err(display->drm_fd, DRM_IOCTL_MODE_ATOMIC, &ioc, EINVAL);
824*d83cc019SAndroid Build Coastguard Worker 
825*d83cc019SAndroid Build Coastguard Worker 	/* Nonsense flags. */
826*d83cc019SAndroid Build Coastguard Worker 	ioc.flags = 0xdeadbeef;
827*d83cc019SAndroid Build Coastguard Worker 	do_ioctl_err(display->drm_fd, DRM_IOCTL_MODE_ATOMIC, &ioc, EINVAL);
828*d83cc019SAndroid Build Coastguard Worker 
829*d83cc019SAndroid Build Coastguard Worker 	ioc.flags = 0;
830*d83cc019SAndroid Build Coastguard Worker 	/* Safety check that flags is reset properly. */
831*d83cc019SAndroid Build Coastguard Worker 	do_ioctl(display->drm_fd, DRM_IOCTL_MODE_ATOMIC, &ioc);
832*d83cc019SAndroid Build Coastguard Worker 
833*d83cc019SAndroid Build Coastguard Worker 	/* Reserved/MBZ. */
834*d83cc019SAndroid Build Coastguard Worker 	ioc.reserved = 1;
835*d83cc019SAndroid Build Coastguard Worker 	do_ioctl_err(display->drm_fd, DRM_IOCTL_MODE_ATOMIC, &ioc, EINVAL);
836*d83cc019SAndroid Build Coastguard Worker 	ioc.reserved = 0;
837*d83cc019SAndroid Build Coastguard Worker 	do_ioctl(display->drm_fd, DRM_IOCTL_MODE_ATOMIC, &ioc);
838*d83cc019SAndroid Build Coastguard Worker 
839*d83cc019SAndroid Build Coastguard Worker 	/* Zero is not a valid object ID. */
840*d83cc019SAndroid Build Coastguard Worker 	ioc.count_objs = ARRAY_SIZE(obj_raw);
841*d83cc019SAndroid Build Coastguard Worker 	do_ioctl_err(display->drm_fd, DRM_IOCTL_MODE_ATOMIC, &ioc, ENOENT);
842*d83cc019SAndroid Build Coastguard Worker 
843*d83cc019SAndroid Build Coastguard Worker 	/* Invalid object type (not a thing we can set properties on). */
844*d83cc019SAndroid Build Coastguard Worker 	ioc.count_objs = 1;
845*d83cc019SAndroid Build Coastguard Worker 	obj_raw[0] = pipe->values[IGT_CRTC_MODE_ID];
846*d83cc019SAndroid Build Coastguard Worker 	do_ioctl_err(display->drm_fd, DRM_IOCTL_MODE_ATOMIC, &ioc, ENOENT);
847*d83cc019SAndroid Build Coastguard Worker 	obj_raw[0] = fb->fb_id;
848*d83cc019SAndroid Build Coastguard Worker 	do_ioctl_err(display->drm_fd, DRM_IOCTL_MODE_ATOMIC, &ioc, ENOENT);
849*d83cc019SAndroid Build Coastguard Worker 
850*d83cc019SAndroid Build Coastguard Worker 	/* Filled object but with no properties; no-op. */
851*d83cc019SAndroid Build Coastguard Worker 	for (i = 0; i < ARRAY_SIZE(obj_raw); i++)
852*d83cc019SAndroid Build Coastguard Worker 		obj_raw[i] = pipe->crtc_id;
853*d83cc019SAndroid Build Coastguard Worker 	do_ioctl(display->drm_fd, DRM_IOCTL_MODE_ATOMIC, &ioc);
854*d83cc019SAndroid Build Coastguard Worker 
855*d83cc019SAndroid Build Coastguard Worker 	/* Pass in all sorts of things other than the property ID. */
856*d83cc019SAndroid Build Coastguard Worker 	num_props_raw[0] = 1;
857*d83cc019SAndroid Build Coastguard Worker 	do_ioctl_err(display->drm_fd, DRM_IOCTL_MODE_ATOMIC, &ioc, ENOENT);
858*d83cc019SAndroid Build Coastguard Worker 	props_raw[0] = pipe->crtc_id;
859*d83cc019SAndroid Build Coastguard Worker 	do_ioctl_err(display->drm_fd, DRM_IOCTL_MODE_ATOMIC, &ioc, ENOENT);
860*d83cc019SAndroid Build Coastguard Worker 	props_raw[0] = plane->drm_plane->plane_id;
861*d83cc019SAndroid Build Coastguard Worker 	do_ioctl_err(display->drm_fd, DRM_IOCTL_MODE_ATOMIC, &ioc, ENOENT);
862*d83cc019SAndroid Build Coastguard Worker 	props_raw[0] = output->id;
863*d83cc019SAndroid Build Coastguard Worker 	do_ioctl_err(display->drm_fd, DRM_IOCTL_MODE_ATOMIC, &ioc, ENOENT);
864*d83cc019SAndroid Build Coastguard Worker 	props_raw[0] = pipe->values[IGT_CRTC_MODE_ID];
865*d83cc019SAndroid Build Coastguard Worker 	do_ioctl_err(display->drm_fd, DRM_IOCTL_MODE_ATOMIC, &ioc, ENOENT);
866*d83cc019SAndroid Build Coastguard Worker 
867*d83cc019SAndroid Build Coastguard Worker 	/* Valid property, valid value. */
868*d83cc019SAndroid Build Coastguard Worker 
869*d83cc019SAndroid Build Coastguard Worker 	for (i = 0; i < ARRAY_SIZE(props_raw); i++) {
870*d83cc019SAndroid Build Coastguard Worker 		props_raw[i] = pipe->props[IGT_CRTC_MODE_ID];
871*d83cc019SAndroid Build Coastguard Worker 		values_raw[i] = pipe->values[IGT_CRTC_MODE_ID];
872*d83cc019SAndroid Build Coastguard Worker 	}
873*d83cc019SAndroid Build Coastguard Worker 	do_ioctl(display->drm_fd, DRM_IOCTL_MODE_ATOMIC, &ioc);
874*d83cc019SAndroid Build Coastguard Worker 
875*d83cc019SAndroid Build Coastguard Worker 	/* Setting the same thing multiple times is OK. */
876*d83cc019SAndroid Build Coastguard Worker 	for (i = 0; i < ARRAY_SIZE(obj_raw); i++)
877*d83cc019SAndroid Build Coastguard Worker 		num_props_raw[i] = ARRAY_SIZE(props_raw) / ARRAY_SIZE(obj_raw);
878*d83cc019SAndroid Build Coastguard Worker 	do_ioctl(display->drm_fd, DRM_IOCTL_MODE_ATOMIC, &ioc);
879*d83cc019SAndroid Build Coastguard Worker 	ioc.count_objs = ARRAY_SIZE(obj_raw);
880*d83cc019SAndroid Build Coastguard Worker 	do_ioctl(display->drm_fd, DRM_IOCTL_MODE_ATOMIC, &ioc);
881*d83cc019SAndroid Build Coastguard Worker 
882*d83cc019SAndroid Build Coastguard Worker 	/* Pass a series of outlandish addresses. */
883*d83cc019SAndroid Build Coastguard Worker 	ioc.objs_ptr = 0;
884*d83cc019SAndroid Build Coastguard Worker 	do_ioctl_err(display->drm_fd, DRM_IOCTL_MODE_ATOMIC, &ioc, EFAULT);
885*d83cc019SAndroid Build Coastguard Worker 
886*d83cc019SAndroid Build Coastguard Worker 	ioc.objs_ptr = (uintptr_t) obj_raw;
887*d83cc019SAndroid Build Coastguard Worker 	ioc.count_props_ptr = 0;
888*d83cc019SAndroid Build Coastguard Worker 	do_ioctl_err(display->drm_fd, DRM_IOCTL_MODE_ATOMIC, &ioc, EFAULT);
889*d83cc019SAndroid Build Coastguard Worker 
890*d83cc019SAndroid Build Coastguard Worker 	ioc.count_props_ptr = (uintptr_t) num_props_raw;
891*d83cc019SAndroid Build Coastguard Worker 	ioc.props_ptr = 0;
892*d83cc019SAndroid Build Coastguard Worker 	do_ioctl_err(display->drm_fd, DRM_IOCTL_MODE_ATOMIC, &ioc, EFAULT);
893*d83cc019SAndroid Build Coastguard Worker 
894*d83cc019SAndroid Build Coastguard Worker 	ioc.props_ptr = (uintptr_t) props_raw;
895*d83cc019SAndroid Build Coastguard Worker 	ioc.prop_values_ptr = 0;
896*d83cc019SAndroid Build Coastguard Worker 	do_ioctl_err(display->drm_fd, DRM_IOCTL_MODE_ATOMIC, &ioc, EFAULT);
897*d83cc019SAndroid Build Coastguard Worker 
898*d83cc019SAndroid Build Coastguard Worker 	ioc.prop_values_ptr = (uintptr_t) values_raw;
899*d83cc019SAndroid Build Coastguard Worker 	do_ioctl(display->drm_fd, DRM_IOCTL_MODE_ATOMIC, &ioc);
900*d83cc019SAndroid Build Coastguard Worker 
901*d83cc019SAndroid Build Coastguard Worker 	/* Attempt to overflow and/or trip various boundary conditions. */
902*d83cc019SAndroid Build Coastguard Worker 	ioc.count_objs = UINT32_MAX / sizeof(uint32_t);
903*d83cc019SAndroid Build Coastguard Worker 	do_ioctl_err(display->drm_fd, DRM_IOCTL_MODE_ATOMIC, &ioc, ENOENT);
904*d83cc019SAndroid Build Coastguard Worker 
905*d83cc019SAndroid Build Coastguard Worker 	ioc.count_objs = ARRAY_SIZE(obj_raw);
906*d83cc019SAndroid Build Coastguard Worker 	ioc.objs_ptr = UINT64_MAX - sizeof(uint32_t);
907*d83cc019SAndroid Build Coastguard Worker 	do_ioctl_err(display->drm_fd, DRM_IOCTL_MODE_ATOMIC, &ioc, EFAULT);
908*d83cc019SAndroid Build Coastguard Worker 	ioc.count_objs = 1;
909*d83cc019SAndroid Build Coastguard Worker 	ioc.objs_ptr = UINT64_MAX - sizeof(uint32_t);
910*d83cc019SAndroid Build Coastguard Worker 	do_ioctl_err(display->drm_fd, DRM_IOCTL_MODE_ATOMIC, &ioc, EFAULT);
911*d83cc019SAndroid Build Coastguard Worker 
912*d83cc019SAndroid Build Coastguard Worker 	num_props_raw[0] = UINT32_MAX / sizeof(uint32_t);
913*d83cc019SAndroid Build Coastguard Worker 	do_ioctl_err(display->drm_fd, DRM_IOCTL_MODE_ATOMIC, &ioc, EFAULT);
914*d83cc019SAndroid Build Coastguard Worker 	num_props_raw[0] = UINT32_MAX - 1;
915*d83cc019SAndroid Build Coastguard Worker 	do_ioctl_err(display->drm_fd, DRM_IOCTL_MODE_ATOMIC, &ioc, EFAULT);
916*d83cc019SAndroid Build Coastguard Worker 
917*d83cc019SAndroid Build Coastguard Worker 	for (i = 0; i < ARRAY_SIZE(obj_raw); i++)
918*d83cc019SAndroid Build Coastguard Worker 		num_props_raw[i] = (UINT32_MAX / ARRAY_SIZE(obj_raw)) + 1;
919*d83cc019SAndroid Build Coastguard Worker 	do_ioctl_err(display->drm_fd, DRM_IOCTL_MODE_ATOMIC, &ioc, EFAULT);
920*d83cc019SAndroid Build Coastguard Worker 	for (i = 0; i < ARRAY_SIZE(obj_raw); i++)
921*d83cc019SAndroid Build Coastguard Worker 		num_props_raw[i] = ARRAY_SIZE(props_raw) / ARRAY_SIZE(obj_raw);
922*d83cc019SAndroid Build Coastguard Worker 	do_ioctl_err(display->drm_fd, DRM_IOCTL_MODE_ATOMIC, &ioc, EFAULT);
923*d83cc019SAndroid Build Coastguard Worker }
924*d83cc019SAndroid Build Coastguard Worker 
atomic_setup(igt_display_t * display,enum pipe pipe,igt_output_t * output,igt_plane_t * primary,struct igt_fb * fb)925*d83cc019SAndroid Build Coastguard Worker static void atomic_setup(igt_display_t *display, enum pipe pipe, igt_output_t *output, igt_plane_t *primary, struct igt_fb *fb)
926*d83cc019SAndroid Build Coastguard Worker {
927*d83cc019SAndroid Build Coastguard Worker 	igt_output_set_pipe(output, pipe);
928*d83cc019SAndroid Build Coastguard Worker 	igt_plane_set_fb(primary, fb);
929*d83cc019SAndroid Build Coastguard Worker 
930*d83cc019SAndroid Build Coastguard Worker 	crtc_commit(primary->pipe, primary, COMMIT_ATOMIC, ATOMIC_RELAX_NONE);
931*d83cc019SAndroid Build Coastguard Worker }
932*d83cc019SAndroid Build Coastguard Worker 
atomic_clear(igt_display_t * display,enum pipe pipe,igt_plane_t * primary,igt_output_t * output)933*d83cc019SAndroid Build Coastguard Worker static void atomic_clear(igt_display_t *display, enum pipe pipe, igt_plane_t *primary, igt_output_t *output)
934*d83cc019SAndroid Build Coastguard Worker {
935*d83cc019SAndroid Build Coastguard Worker 	igt_plane_t *plane;
936*d83cc019SAndroid Build Coastguard Worker 
937*d83cc019SAndroid Build Coastguard Worker 	for_each_plane_on_pipe(display, pipe, plane) {
938*d83cc019SAndroid Build Coastguard Worker 		igt_plane_set_fb(plane, NULL);
939*d83cc019SAndroid Build Coastguard Worker 		igt_plane_set_position(plane, 0, 0);
940*d83cc019SAndroid Build Coastguard Worker 	}
941*d83cc019SAndroid Build Coastguard Worker 
942*d83cc019SAndroid Build Coastguard Worker 	igt_output_set_pipe(output, PIPE_NONE);
943*d83cc019SAndroid Build Coastguard Worker 	crtc_commit(primary->pipe, primary, COMMIT_ATOMIC, ATOMIC_RELAX_NONE);
944*d83cc019SAndroid Build Coastguard Worker }
945*d83cc019SAndroid Build Coastguard Worker 
946*d83cc019SAndroid Build Coastguard Worker igt_main
947*d83cc019SAndroid Build Coastguard Worker {
948*d83cc019SAndroid Build Coastguard Worker 	igt_display_t display;
949*d83cc019SAndroid Build Coastguard Worker 	enum pipe pipe = PIPE_NONE;
950*d83cc019SAndroid Build Coastguard Worker 	igt_pipe_t *pipe_obj;
951*d83cc019SAndroid Build Coastguard Worker 	igt_output_t *output = NULL;
952*d83cc019SAndroid Build Coastguard Worker 	igt_plane_t *primary = NULL;
953*d83cc019SAndroid Build Coastguard Worker 	drmModeModeInfo *mode;
954*d83cc019SAndroid Build Coastguard Worker 	struct igt_fb fb;
955*d83cc019SAndroid Build Coastguard Worker 
956*d83cc019SAndroid Build Coastguard Worker 	igt_fixture {
957*d83cc019SAndroid Build Coastguard Worker 		display.drm_fd = drm_open_driver_master(DRIVER_ANY);
958*d83cc019SAndroid Build Coastguard Worker 
959*d83cc019SAndroid Build Coastguard Worker 		kmstest_set_vt_graphics_mode();
960*d83cc019SAndroid Build Coastguard Worker 
961*d83cc019SAndroid Build Coastguard Worker 		igt_display_require(&display, display.drm_fd);
962*d83cc019SAndroid Build Coastguard Worker 		igt_require(display.is_atomic);
963*d83cc019SAndroid Build Coastguard Worker 		igt_display_require_output(&display);
964*d83cc019SAndroid Build Coastguard Worker 
965*d83cc019SAndroid Build Coastguard Worker 		for_each_pipe_with_valid_output(&display, pipe, output)
966*d83cc019SAndroid Build Coastguard Worker 			break;
967*d83cc019SAndroid Build Coastguard Worker 
968*d83cc019SAndroid Build Coastguard Worker 		pipe_obj = &display.pipes[pipe];
969*d83cc019SAndroid Build Coastguard Worker 		primary = igt_pipe_get_plane_type(pipe_obj, DRM_PLANE_TYPE_PRIMARY);
970*d83cc019SAndroid Build Coastguard Worker 
971*d83cc019SAndroid Build Coastguard Worker 		mode = igt_output_get_mode(output);
972*d83cc019SAndroid Build Coastguard Worker 
973*d83cc019SAndroid Build Coastguard Worker 		igt_create_pattern_fb(display.drm_fd,
974*d83cc019SAndroid Build Coastguard Worker 				      mode->hdisplay, mode->vdisplay,
975*d83cc019SAndroid Build Coastguard Worker 				      plane_get_igt_format(primary),
976*d83cc019SAndroid Build Coastguard Worker 				      LOCAL_DRM_FORMAT_MOD_NONE, &fb);
977*d83cc019SAndroid Build Coastguard Worker 	}
978*d83cc019SAndroid Build Coastguard Worker 
979*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("plane_overlay_legacy") {
980*d83cc019SAndroid Build Coastguard Worker 		igt_plane_t *overlay =
981*d83cc019SAndroid Build Coastguard Worker 			igt_pipe_get_plane_type(pipe_obj, DRM_PLANE_TYPE_OVERLAY);
982*d83cc019SAndroid Build Coastguard Worker 
983*d83cc019SAndroid Build Coastguard Worker 		igt_require(overlay);
984*d83cc019SAndroid Build Coastguard Worker 
985*d83cc019SAndroid Build Coastguard Worker 		atomic_setup(&display, pipe, output, primary, &fb);
986*d83cc019SAndroid Build Coastguard Worker 		plane_overlay(pipe_obj, output, overlay);
987*d83cc019SAndroid Build Coastguard Worker 	}
988*d83cc019SAndroid Build Coastguard Worker 
989*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("plane_primary_legacy") {
990*d83cc019SAndroid Build Coastguard Worker 		atomic_setup(&display, pipe, output, primary, &fb);
991*d83cc019SAndroid Build Coastguard Worker 
992*d83cc019SAndroid Build Coastguard Worker 		plane_primary(pipe_obj, primary, &fb);
993*d83cc019SAndroid Build Coastguard Worker 	}
994*d83cc019SAndroid Build Coastguard Worker 
995*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("plane_primary_overlay_zpos") {
996*d83cc019SAndroid Build Coastguard Worker 		uint32_t format_primary = DRM_FORMAT_ARGB8888;
997*d83cc019SAndroid Build Coastguard Worker 		uint32_t format_overlay = DRM_FORMAT_ARGB1555;
998*d83cc019SAndroid Build Coastguard Worker 
999*d83cc019SAndroid Build Coastguard Worker 		igt_plane_t *overlay =
1000*d83cc019SAndroid Build Coastguard Worker 			igt_pipe_get_plane_type(pipe_obj, DRM_PLANE_TYPE_OVERLAY);
1001*d83cc019SAndroid Build Coastguard Worker 
1002*d83cc019SAndroid Build Coastguard Worker 		igt_require(overlay);
1003*d83cc019SAndroid Build Coastguard Worker 		igt_require(igt_plane_has_prop(primary, IGT_PLANE_ZPOS));
1004*d83cc019SAndroid Build Coastguard Worker 		igt_require(igt_plane_has_prop(overlay, IGT_PLANE_ZPOS));
1005*d83cc019SAndroid Build Coastguard Worker 
1006*d83cc019SAndroid Build Coastguard Worker 		igt_require(igt_plane_has_format_mod(primary, format_primary, 0x0));
1007*d83cc019SAndroid Build Coastguard Worker 		igt_require(igt_plane_has_format_mod(overlay, format_overlay, 0x0));
1008*d83cc019SAndroid Build Coastguard Worker 
1009*d83cc019SAndroid Build Coastguard Worker 		igt_output_set_pipe(output, pipe);
1010*d83cc019SAndroid Build Coastguard Worker 		plane_primary_overlay_zpos(pipe_obj, output, primary, overlay,
1011*d83cc019SAndroid Build Coastguard Worker 					   format_primary, format_overlay);
1012*d83cc019SAndroid Build Coastguard Worker 	}
1013*d83cc019SAndroid Build Coastguard Worker 
1014*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("test_only") {
1015*d83cc019SAndroid Build Coastguard Worker 		atomic_clear(&display, pipe, primary, output);
1016*d83cc019SAndroid Build Coastguard Worker 
1017*d83cc019SAndroid Build Coastguard Worker 		test_only(pipe_obj, primary, output);
1018*d83cc019SAndroid Build Coastguard Worker 	}
1019*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("plane_cursor_legacy") {
1020*d83cc019SAndroid Build Coastguard Worker 		igt_plane_t *cursor =
1021*d83cc019SAndroid Build Coastguard Worker 			igt_pipe_get_plane_type(pipe_obj, DRM_PLANE_TYPE_CURSOR);
1022*d83cc019SAndroid Build Coastguard Worker 
1023*d83cc019SAndroid Build Coastguard Worker 		igt_require(cursor);
1024*d83cc019SAndroid Build Coastguard Worker 
1025*d83cc019SAndroid Build Coastguard Worker 		atomic_setup(&display, pipe, output, primary, &fb);
1026*d83cc019SAndroid Build Coastguard Worker 		plane_cursor(pipe_obj, output, cursor);
1027*d83cc019SAndroid Build Coastguard Worker 	}
1028*d83cc019SAndroid Build Coastguard Worker 
1029*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("plane_invalid_params") {
1030*d83cc019SAndroid Build Coastguard Worker 		atomic_setup(&display, pipe, output, primary, &fb);
1031*d83cc019SAndroid Build Coastguard Worker 
1032*d83cc019SAndroid Build Coastguard Worker 		plane_invalid_params(pipe_obj, output, primary, &fb);
1033*d83cc019SAndroid Build Coastguard Worker 	}
1034*d83cc019SAndroid Build Coastguard Worker 
1035*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("plane_invalid_params_fence") {
1036*d83cc019SAndroid Build Coastguard Worker 		atomic_setup(&display, pipe, output, primary, &fb);
1037*d83cc019SAndroid Build Coastguard Worker 
1038*d83cc019SAndroid Build Coastguard Worker 		plane_invalid_params_fence(pipe_obj, output, primary);
1039*d83cc019SAndroid Build Coastguard Worker 	}
1040*d83cc019SAndroid Build Coastguard Worker 
1041*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("crtc_invalid_params") {
1042*d83cc019SAndroid Build Coastguard Worker 		atomic_setup(&display, pipe, output, primary, &fb);
1043*d83cc019SAndroid Build Coastguard Worker 
1044*d83cc019SAndroid Build Coastguard Worker 		crtc_invalid_params(pipe_obj, output, primary, &fb);
1045*d83cc019SAndroid Build Coastguard Worker 	}
1046*d83cc019SAndroid Build Coastguard Worker 
1047*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("crtc_invalid_params_fence") {
1048*d83cc019SAndroid Build Coastguard Worker 		atomic_setup(&display, pipe, output, primary, &fb);
1049*d83cc019SAndroid Build Coastguard Worker 
1050*d83cc019SAndroid Build Coastguard Worker 		crtc_invalid_params_fence(pipe_obj, output, primary, &fb);
1051*d83cc019SAndroid Build Coastguard Worker 	}
1052*d83cc019SAndroid Build Coastguard Worker 
1053*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("atomic_invalid_params") {
1054*d83cc019SAndroid Build Coastguard Worker 		atomic_setup(&display, pipe, output, primary, &fb);
1055*d83cc019SAndroid Build Coastguard Worker 
1056*d83cc019SAndroid Build Coastguard Worker 		atomic_invalid_params(pipe_obj, primary, output, &fb);
1057*d83cc019SAndroid Build Coastguard Worker 	}
1058*d83cc019SAndroid Build Coastguard Worker 
1059*d83cc019SAndroid Build Coastguard Worker 	igt_fixture {
1060*d83cc019SAndroid Build Coastguard Worker 		atomic_clear(&display, pipe, primary, output);
1061*d83cc019SAndroid Build Coastguard Worker 		igt_remove_fb(display.drm_fd, &fb);
1062*d83cc019SAndroid Build Coastguard Worker 
1063*d83cc019SAndroid Build Coastguard Worker 		igt_display_fini(&display);
1064*d83cc019SAndroid Build Coastguard Worker 	}
1065*d83cc019SAndroid Build Coastguard Worker }
1066