xref: /aosp_15_r20/external/igt-gpu-tools/lib/igt_kms.h (revision d83cc019efdc2edc6c4b16e9034a3ceb8d35d77c)
1*d83cc019SAndroid Build Coastguard Worker /*
2*d83cc019SAndroid Build Coastguard Worker  * Copyright © 2013 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:
24*d83cc019SAndroid Build Coastguard Worker  * 	Daniel Vetter <[email protected]>
25*d83cc019SAndroid Build Coastguard Worker  * 	Damien Lespiau <[email protected]>
26*d83cc019SAndroid Build Coastguard Worker  */
27*d83cc019SAndroid Build Coastguard Worker 
28*d83cc019SAndroid Build Coastguard Worker #ifndef __IGT_KMS_H__
29*d83cc019SAndroid Build Coastguard Worker #define __IGT_KMS_H__
30*d83cc019SAndroid Build Coastguard Worker 
31*d83cc019SAndroid Build Coastguard Worker #include <stdbool.h>
32*d83cc019SAndroid Build Coastguard Worker #include <stdint.h>
33*d83cc019SAndroid Build Coastguard Worker #include <stddef.h>
34*d83cc019SAndroid Build Coastguard Worker #include <assert.h>
35*d83cc019SAndroid Build Coastguard Worker 
36*d83cc019SAndroid Build Coastguard Worker #include <xf86drmMode.h>
37*d83cc019SAndroid Build Coastguard Worker 
38*d83cc019SAndroid Build Coastguard Worker #include "igt_fb.h"
39*d83cc019SAndroid Build Coastguard Worker #include "ioctl_wrappers.h"
40*d83cc019SAndroid Build Coastguard Worker 
41*d83cc019SAndroid Build Coastguard Worker #ifdef __cplusplus
42*d83cc019SAndroid Build Coastguard Worker extern "C" {
43*d83cc019SAndroid Build Coastguard Worker #endif
44*d83cc019SAndroid Build Coastguard Worker 
45*d83cc019SAndroid Build Coastguard Worker /* Low-level helpers with kmstest_ prefix */
46*d83cc019SAndroid Build Coastguard Worker 
47*d83cc019SAndroid Build Coastguard Worker /**
48*d83cc019SAndroid Build Coastguard Worker  * pipe:
49*d83cc019SAndroid Build Coastguard Worker  * @PIPE_NONE: Invalid pipe, used for disconnecting a output from a pipe.
50*d83cc019SAndroid Build Coastguard Worker  * @PIPE_ANY: Deprecated alias for @PIPE_NONE.
51*d83cc019SAndroid Build Coastguard Worker  * @PIPE_A: First crtc.
52*d83cc019SAndroid Build Coastguard Worker  * @PIPE_B: Second crtc.
53*d83cc019SAndroid Build Coastguard Worker  * @PIPE_C: Third crtc.
54*d83cc019SAndroid Build Coastguard Worker  * @PIPE_D: Fourth crtc.
55*d83cc019SAndroid Build Coastguard Worker  * @PIPE_E: Fifth crtc.
56*d83cc019SAndroid Build Coastguard Worker  * @PIPE_F: Sixth crtc.
57*d83cc019SAndroid Build Coastguard Worker  * @IGT_MAX_PIPES: Max number of pipes allowed.
58*d83cc019SAndroid Build Coastguard Worker  */
59*d83cc019SAndroid Build Coastguard Worker enum pipe
60*d83cc019SAndroid Build Coastguard Worker #ifdef __cplusplus
61*d83cc019SAndroid Build Coastguard Worker : int
62*d83cc019SAndroid Build Coastguard Worker #endif
63*d83cc019SAndroid Build Coastguard Worker {
64*d83cc019SAndroid Build Coastguard Worker         PIPE_NONE = -1,
65*d83cc019SAndroid Build Coastguard Worker         PIPE_ANY = PIPE_NONE,
66*d83cc019SAndroid Build Coastguard Worker         PIPE_A = 0,
67*d83cc019SAndroid Build Coastguard Worker         PIPE_B,
68*d83cc019SAndroid Build Coastguard Worker         PIPE_C,
69*d83cc019SAndroid Build Coastguard Worker         PIPE_D,
70*d83cc019SAndroid Build Coastguard Worker         PIPE_E,
71*d83cc019SAndroid Build Coastguard Worker         PIPE_F,
72*d83cc019SAndroid Build Coastguard Worker         IGT_MAX_PIPES
73*d83cc019SAndroid Build Coastguard Worker };
74*d83cc019SAndroid Build Coastguard Worker const char *kmstest_pipe_name(enum pipe pipe);
75*d83cc019SAndroid Build Coastguard Worker int kmstest_pipe_to_index(char pipe);
76*d83cc019SAndroid Build Coastguard Worker const char *kmstest_plane_type_name(int plane_type);
77*d83cc019SAndroid Build Coastguard Worker 
78*d83cc019SAndroid Build Coastguard Worker enum port {
79*d83cc019SAndroid Build Coastguard Worker         PORT_A = 0,
80*d83cc019SAndroid Build Coastguard Worker         PORT_B,
81*d83cc019SAndroid Build Coastguard Worker         PORT_C,
82*d83cc019SAndroid Build Coastguard Worker         PORT_D,
83*d83cc019SAndroid Build Coastguard Worker         PORT_E,
84*d83cc019SAndroid Build Coastguard Worker         I915_MAX_PORTS
85*d83cc019SAndroid Build Coastguard Worker };
86*d83cc019SAndroid Build Coastguard Worker 
87*d83cc019SAndroid Build Coastguard Worker /**
88*d83cc019SAndroid Build Coastguard Worker  * kmstest_port_name:
89*d83cc019SAndroid Build Coastguard Worker  * @port: display plane
90*d83cc019SAndroid Build Coastguard Worker  *
91*d83cc019SAndroid Build Coastguard Worker  * Returns: String representing @port, e.g. "A".
92*d83cc019SAndroid Build Coastguard Worker  */
93*d83cc019SAndroid Build Coastguard Worker #define kmstest_port_name(port) ((port) + 'A')
94*d83cc019SAndroid Build Coastguard Worker 
95*d83cc019SAndroid Build Coastguard Worker const char *kmstest_encoder_type_str(int type);
96*d83cc019SAndroid Build Coastguard Worker const char *kmstest_connector_status_str(int status);
97*d83cc019SAndroid Build Coastguard Worker const char *kmstest_connector_type_str(int type);
98*d83cc019SAndroid Build Coastguard Worker 
99*d83cc019SAndroid Build Coastguard Worker void kmstest_dump_mode(drmModeModeInfo *mode);
100*d83cc019SAndroid Build Coastguard Worker 
101*d83cc019SAndroid Build Coastguard Worker int kmstest_get_pipe_from_crtc_id(int fd, int crtc_id);
102*d83cc019SAndroid Build Coastguard Worker void kmstest_set_vt_graphics_mode(void);
103*d83cc019SAndroid Build Coastguard Worker void kmstest_restore_vt_mode(void);
104*d83cc019SAndroid Build Coastguard Worker 
105*d83cc019SAndroid Build Coastguard Worker enum igt_atomic_crtc_properties {
106*d83cc019SAndroid Build Coastguard Worker        IGT_CRTC_BACKGROUND = 0,
107*d83cc019SAndroid Build Coastguard Worker        IGT_CRTC_CTM,
108*d83cc019SAndroid Build Coastguard Worker        IGT_CRTC_GAMMA_LUT,
109*d83cc019SAndroid Build Coastguard Worker        IGT_CRTC_GAMMA_LUT_SIZE,
110*d83cc019SAndroid Build Coastguard Worker        IGT_CRTC_DEGAMMA_LUT,
111*d83cc019SAndroid Build Coastguard Worker        IGT_CRTC_DEGAMMA_LUT_SIZE,
112*d83cc019SAndroid Build Coastguard Worker        IGT_CRTC_MODE_ID,
113*d83cc019SAndroid Build Coastguard Worker        IGT_CRTC_ACTIVE,
114*d83cc019SAndroid Build Coastguard Worker        IGT_CRTC_OUT_FENCE_PTR,
115*d83cc019SAndroid Build Coastguard Worker        IGT_CRTC_VRR_ENABLED,
116*d83cc019SAndroid Build Coastguard Worker        IGT_NUM_CRTC_PROPS
117*d83cc019SAndroid Build Coastguard Worker };
118*d83cc019SAndroid Build Coastguard Worker 
119*d83cc019SAndroid Build Coastguard Worker /**
120*d83cc019SAndroid Build Coastguard Worker  * igt_crtc_prop_names
121*d83cc019SAndroid Build Coastguard Worker  *
122*d83cc019SAndroid Build Coastguard Worker  * igt_crtc_prop_names contains a list of crtc property names,
123*d83cc019SAndroid Build Coastguard Worker  * as indexed by the igt_atomic_crtc_properties enum.
124*d83cc019SAndroid Build Coastguard Worker  */
125*d83cc019SAndroid Build Coastguard Worker extern const char * const igt_crtc_prop_names[];
126*d83cc019SAndroid Build Coastguard Worker 
127*d83cc019SAndroid Build Coastguard Worker enum igt_atomic_connector_properties {
128*d83cc019SAndroid Build Coastguard Worker        IGT_CONNECTOR_SCALING_MODE = 0,
129*d83cc019SAndroid Build Coastguard Worker        IGT_CONNECTOR_CRTC_ID,
130*d83cc019SAndroid Build Coastguard Worker        IGT_CONNECTOR_DPMS,
131*d83cc019SAndroid Build Coastguard Worker        IGT_CONNECTOR_BROADCAST_RGB,
132*d83cc019SAndroid Build Coastguard Worker        IGT_CONNECTOR_CONTENT_PROTECTION,
133*d83cc019SAndroid Build Coastguard Worker        IGT_CONNECTOR_VRR_CAPABLE,
134*d83cc019SAndroid Build Coastguard Worker        IGT_CONNECTOR_HDCP_CONTENT_TYPE,
135*d83cc019SAndroid Build Coastguard Worker        IGT_CONNECTOR_LINK_STATUS,
136*d83cc019SAndroid Build Coastguard Worker        IGT_NUM_CONNECTOR_PROPS
137*d83cc019SAndroid Build Coastguard Worker };
138*d83cc019SAndroid Build Coastguard Worker 
139*d83cc019SAndroid Build Coastguard Worker /**
140*d83cc019SAndroid Build Coastguard Worker  * igt_connector_prop_names
141*d83cc019SAndroid Build Coastguard Worker  *
142*d83cc019SAndroid Build Coastguard Worker  * igt_connector_prop_names contains a list of crtc property names,
143*d83cc019SAndroid Build Coastguard Worker  * as indexed by the igt_atomic_connector_properties enum.
144*d83cc019SAndroid Build Coastguard Worker  */
145*d83cc019SAndroid Build Coastguard Worker extern const char * const igt_connector_prop_names[];
146*d83cc019SAndroid Build Coastguard Worker 
147*d83cc019SAndroid Build Coastguard Worker struct kmstest_connector_config {
148*d83cc019SAndroid Build Coastguard Worker 	drmModeCrtc *crtc;
149*d83cc019SAndroid Build Coastguard Worker 	drmModeConnector *connector;
150*d83cc019SAndroid Build Coastguard Worker 	drmModeEncoder *encoder;
151*d83cc019SAndroid Build Coastguard Worker 	drmModeModeInfo default_mode;
152*d83cc019SAndroid Build Coastguard Worker 
153*d83cc019SAndroid Build Coastguard Worker 	int pipe;
154*d83cc019SAndroid Build Coastguard Worker 	unsigned valid_crtc_idx_mask;
155*d83cc019SAndroid Build Coastguard Worker };
156*d83cc019SAndroid Build Coastguard Worker 
157*d83cc019SAndroid Build Coastguard Worker struct kmstest_plane {
158*d83cc019SAndroid Build Coastguard Worker 	int id;
159*d83cc019SAndroid Build Coastguard Worker 	int index;
160*d83cc019SAndroid Build Coastguard Worker 	int type;
161*d83cc019SAndroid Build Coastguard Worker 	int pos_x;
162*d83cc019SAndroid Build Coastguard Worker 	int pos_y;
163*d83cc019SAndroid Build Coastguard Worker 	int width;
164*d83cc019SAndroid Build Coastguard Worker 	int height;
165*d83cc019SAndroid Build Coastguard Worker };
166*d83cc019SAndroid Build Coastguard Worker 
167*d83cc019SAndroid Build Coastguard Worker struct kmstest_crtc {
168*d83cc019SAndroid Build Coastguard Worker 	int id;
169*d83cc019SAndroid Build Coastguard Worker 	int pipe;
170*d83cc019SAndroid Build Coastguard Worker 	bool active;
171*d83cc019SAndroid Build Coastguard Worker 	int width;
172*d83cc019SAndroid Build Coastguard Worker 	int height;
173*d83cc019SAndroid Build Coastguard Worker 	int n_planes;
174*d83cc019SAndroid Build Coastguard Worker 	struct kmstest_plane *planes;
175*d83cc019SAndroid Build Coastguard Worker };
176*d83cc019SAndroid Build Coastguard Worker 
177*d83cc019SAndroid Build Coastguard Worker /**
178*d83cc019SAndroid Build Coastguard Worker  * kmstest_force_connector_state:
179*d83cc019SAndroid Build Coastguard Worker  * @FORCE_CONNECTOR_UNSPECIFIED: Unspecified
180*d83cc019SAndroid Build Coastguard Worker  * @FORCE_CONNECTOR_ON: On
181*d83cc019SAndroid Build Coastguard Worker  * @FORCE_CONNECTOR_DIGITAL: Digital
182*d83cc019SAndroid Build Coastguard Worker  * @FORCE_CONNECTOR_OFF: Off
183*d83cc019SAndroid Build Coastguard Worker  */
184*d83cc019SAndroid Build Coastguard Worker enum kmstest_force_connector_state {
185*d83cc019SAndroid Build Coastguard Worker 	FORCE_CONNECTOR_UNSPECIFIED,
186*d83cc019SAndroid Build Coastguard Worker 	FORCE_CONNECTOR_ON,
187*d83cc019SAndroid Build Coastguard Worker 	FORCE_CONNECTOR_DIGITAL,
188*d83cc019SAndroid Build Coastguard Worker 	FORCE_CONNECTOR_OFF
189*d83cc019SAndroid Build Coastguard Worker };
190*d83cc019SAndroid Build Coastguard Worker 
191*d83cc019SAndroid Build Coastguard Worker /**
192*d83cc019SAndroid Build Coastguard Worker  * intel_broadcast_rgb_mode:
193*d83cc019SAndroid Build Coastguard Worker  * @BROADCAST_RGB_AUTO: Choose the color range to use automatically
194*d83cc019SAndroid Build Coastguard Worker  * @BROADCAST_RGB_FULL: Force the connector to use full color range
195*d83cc019SAndroid Build Coastguard Worker  * @BROADCAST_RGB_16_235: Force the connector to use a limited 16:235 color
196*d83cc019SAndroid Build Coastguard Worker  * range
197*d83cc019SAndroid Build Coastguard Worker  */
198*d83cc019SAndroid Build Coastguard Worker enum intel_broadcast_rgb_mode {
199*d83cc019SAndroid Build Coastguard Worker 	BROADCAST_RGB_AUTO = 0,
200*d83cc019SAndroid Build Coastguard Worker 	BROADCAST_RGB_FULL,
201*d83cc019SAndroid Build Coastguard Worker 	BROADCAST_RGB_16_235
202*d83cc019SAndroid Build Coastguard Worker };
203*d83cc019SAndroid Build Coastguard Worker 
204*d83cc019SAndroid Build Coastguard Worker struct edid;
205*d83cc019SAndroid Build Coastguard Worker 
206*d83cc019SAndroid Build Coastguard Worker bool kmstest_force_connector(int fd, drmModeConnector *connector,
207*d83cc019SAndroid Build Coastguard Worker 			     enum kmstest_force_connector_state state);
208*d83cc019SAndroid Build Coastguard Worker void kmstest_force_edid(int drm_fd, drmModeConnector *connector,
209*d83cc019SAndroid Build Coastguard Worker 			const struct edid *edid);
210*d83cc019SAndroid Build Coastguard Worker 
211*d83cc019SAndroid Build Coastguard Worker bool kmstest_get_connector_default_mode(int drm_fd, drmModeConnector *connector,
212*d83cc019SAndroid Build Coastguard Worker 					drmModeModeInfo *mode);
213*d83cc019SAndroid Build Coastguard Worker bool kmstest_get_connector_config(int drm_fd, uint32_t connector_id,
214*d83cc019SAndroid Build Coastguard Worker 				  unsigned long crtc_idx_mask,
215*d83cc019SAndroid Build Coastguard Worker 				  struct kmstest_connector_config *config);
216*d83cc019SAndroid Build Coastguard Worker bool kmstest_probe_connector_config(int drm_fd, uint32_t connector_id,
217*d83cc019SAndroid Build Coastguard Worker 				    unsigned long crtc_idx_mask,
218*d83cc019SAndroid Build Coastguard Worker 				    struct kmstest_connector_config *config);
219*d83cc019SAndroid Build Coastguard Worker void kmstest_free_connector_config(struct kmstest_connector_config *config);
220*d83cc019SAndroid Build Coastguard Worker 
221*d83cc019SAndroid Build Coastguard Worker void kmstest_set_connector_dpms(int fd, drmModeConnector *connector, int mode);
222*d83cc019SAndroid Build Coastguard Worker bool kmstest_get_property(int drm_fd, uint32_t object_id, uint32_t object_type,
223*d83cc019SAndroid Build Coastguard Worker 			  const char *name, uint32_t *prop_id, uint64_t *value,
224*d83cc019SAndroid Build Coastguard Worker 			  drmModePropertyPtr *prop);
225*d83cc019SAndroid Build Coastguard Worker void kmstest_unset_all_crtcs(int drm_fd, drmModeResPtr resources);
226*d83cc019SAndroid Build Coastguard Worker int kmstest_get_crtc_idx(drmModeRes *res, uint32_t crtc_id);
227*d83cc019SAndroid Build Coastguard Worker uint32_t kmstest_find_crtc_for_connector(int fd, drmModeRes *res,
228*d83cc019SAndroid Build Coastguard Worker 					 drmModeConnector *connector,
229*d83cc019SAndroid Build Coastguard Worker 					 uint32_t crtc_blacklist_idx_mask);
230*d83cc019SAndroid Build Coastguard Worker 
231*d83cc019SAndroid Build Coastguard Worker uint32_t kmstest_dumb_create(int fd, int width, int height, int bpp,
232*d83cc019SAndroid Build Coastguard Worker 			     unsigned *stride, uint64_t *size);
233*d83cc019SAndroid Build Coastguard Worker 
234*d83cc019SAndroid Build Coastguard Worker void *kmstest_dumb_map_buffer(int fd, uint32_t handle, uint64_t size,
235*d83cc019SAndroid Build Coastguard Worker 			      unsigned prot);
236*d83cc019SAndroid Build Coastguard Worker void kmstest_dumb_destroy(int fd, uint32_t handle);
237*d83cc019SAndroid Build Coastguard Worker void kmstest_wait_for_pageflip(int fd);
238*d83cc019SAndroid Build Coastguard Worker unsigned int kmstest_get_vblank(int fd, int pipe, unsigned int flags);
239*d83cc019SAndroid Build Coastguard Worker void igt_assert_plane_visible(int fd, enum pipe pipe, int plane_index, bool visibility);
240*d83cc019SAndroid Build Coastguard Worker 
241*d83cc019SAndroid Build Coastguard Worker bool kms_has_vblank(int fd);
242*d83cc019SAndroid Build Coastguard Worker 
243*d83cc019SAndroid Build Coastguard Worker /*
244*d83cc019SAndroid Build Coastguard Worker  * A small modeset API
245*d83cc019SAndroid Build Coastguard Worker  */
246*d83cc019SAndroid Build Coastguard Worker 
247*d83cc019SAndroid Build Coastguard Worker /* High-level kms api with igt_ prefix */
248*d83cc019SAndroid Build Coastguard Worker 
249*d83cc019SAndroid Build Coastguard Worker /**
250*d83cc019SAndroid Build Coastguard Worker  * igt_commit_style:
251*d83cc019SAndroid Build Coastguard Worker  * @COMMIT_LEGACY: Changes will be committed using the legacy API.
252*d83cc019SAndroid Build Coastguard Worker  * @COMMIT_UNIVERSAL: Changes will be committed with the universal plane API, no modesets are allowed.
253*d83cc019SAndroid Build Coastguard Worker  * @COMMIT_ATOMIC: Changes will be committed using the atomic API.
254*d83cc019SAndroid Build Coastguard Worker  */
255*d83cc019SAndroid Build Coastguard Worker enum igt_commit_style {
256*d83cc019SAndroid Build Coastguard Worker 	COMMIT_LEGACY = 0,
257*d83cc019SAndroid Build Coastguard Worker 	COMMIT_UNIVERSAL,
258*d83cc019SAndroid Build Coastguard Worker 	COMMIT_ATOMIC,
259*d83cc019SAndroid Build Coastguard Worker };
260*d83cc019SAndroid Build Coastguard Worker 
261*d83cc019SAndroid Build Coastguard Worker enum igt_atomic_plane_properties {
262*d83cc019SAndroid Build Coastguard Worker        IGT_PLANE_SRC_X = 0,
263*d83cc019SAndroid Build Coastguard Worker        IGT_PLANE_SRC_Y,
264*d83cc019SAndroid Build Coastguard Worker        IGT_PLANE_SRC_W,
265*d83cc019SAndroid Build Coastguard Worker        IGT_PLANE_SRC_H,
266*d83cc019SAndroid Build Coastguard Worker 
267*d83cc019SAndroid Build Coastguard Worker        IGT_PLANE_CRTC_X,
268*d83cc019SAndroid Build Coastguard Worker        IGT_PLANE_CRTC_Y,
269*d83cc019SAndroid Build Coastguard Worker        IGT_PLANE_CRTC_W,
270*d83cc019SAndroid Build Coastguard Worker        IGT_PLANE_CRTC_H,
271*d83cc019SAndroid Build Coastguard Worker 
272*d83cc019SAndroid Build Coastguard Worker /* Append new properties after IGT_PLANE_COORD_CHANGED_MASK */
273*d83cc019SAndroid Build Coastguard Worker #define IGT_PLANE_COORD_CHANGED_MASK 0xff
274*d83cc019SAndroid Build Coastguard Worker 
275*d83cc019SAndroid Build Coastguard Worker        IGT_PLANE_FB_ID,
276*d83cc019SAndroid Build Coastguard Worker        IGT_PLANE_CRTC_ID,
277*d83cc019SAndroid Build Coastguard Worker        IGT_PLANE_IN_FENCE_FD,
278*d83cc019SAndroid Build Coastguard Worker        IGT_PLANE_TYPE,
279*d83cc019SAndroid Build Coastguard Worker        IGT_PLANE_ROTATION,
280*d83cc019SAndroid Build Coastguard Worker        IGT_PLANE_IN_FORMATS,
281*d83cc019SAndroid Build Coastguard Worker        IGT_PLANE_COLOR_ENCODING,
282*d83cc019SAndroid Build Coastguard Worker        IGT_PLANE_COLOR_RANGE,
283*d83cc019SAndroid Build Coastguard Worker        IGT_PLANE_PIXEL_BLEND_MODE,
284*d83cc019SAndroid Build Coastguard Worker        IGT_PLANE_ALPHA,
285*d83cc019SAndroid Build Coastguard Worker        IGT_PLANE_ZPOS,
286*d83cc019SAndroid Build Coastguard Worker        IGT_NUM_PLANE_PROPS
287*d83cc019SAndroid Build Coastguard Worker };
288*d83cc019SAndroid Build Coastguard Worker 
289*d83cc019SAndroid Build Coastguard Worker /**
290*d83cc019SAndroid Build Coastguard Worker  * igt_plane_prop_names
291*d83cc019SAndroid Build Coastguard Worker  *
292*d83cc019SAndroid Build Coastguard Worker  * igt_plane_prop_names contains a list of crtc property names,
293*d83cc019SAndroid Build Coastguard Worker  * as indexed by the igt_atomic_plane_properties enum.
294*d83cc019SAndroid Build Coastguard Worker  */
295*d83cc019SAndroid Build Coastguard Worker extern const char * const igt_plane_prop_names[];
296*d83cc019SAndroid Build Coastguard Worker 
297*d83cc019SAndroid Build Coastguard Worker typedef struct igt_display igt_display_t;
298*d83cc019SAndroid Build Coastguard Worker typedef struct igt_pipe igt_pipe_t;
299*d83cc019SAndroid Build Coastguard Worker typedef uint32_t igt_fixed_t;			/* 16.16 fixed point */
300*d83cc019SAndroid Build Coastguard Worker 
301*d83cc019SAndroid Build Coastguard Worker typedef enum {
302*d83cc019SAndroid Build Coastguard Worker 	/* this maps to the kernel API */
303*d83cc019SAndroid Build Coastguard Worker 	IGT_ROTATION_0   = 1 << 0,
304*d83cc019SAndroid Build Coastguard Worker 	IGT_ROTATION_90  = 1 << 1,
305*d83cc019SAndroid Build Coastguard Worker 	IGT_ROTATION_180 = 1 << 2,
306*d83cc019SAndroid Build Coastguard Worker 	IGT_ROTATION_270 = 1 << 3,
307*d83cc019SAndroid Build Coastguard Worker 	IGT_REFLECT_X    = 1 << 4,
308*d83cc019SAndroid Build Coastguard Worker 	IGT_REFLECT_Y    = 1 << 5,
309*d83cc019SAndroid Build Coastguard Worker } igt_rotation_t;
310*d83cc019SAndroid Build Coastguard Worker 
311*d83cc019SAndroid Build Coastguard Worker #define IGT_ROTATION_MASK \
312*d83cc019SAndroid Build Coastguard Worker 	(IGT_ROTATION_0 | IGT_ROTATION_90 | IGT_ROTATION_180 | IGT_ROTATION_270)
313*d83cc019SAndroid Build Coastguard Worker 
314*d83cc019SAndroid Build Coastguard Worker typedef struct igt_plane {
315*d83cc019SAndroid Build Coastguard Worker 	/*< private >*/
316*d83cc019SAndroid Build Coastguard Worker 	igt_pipe_t *pipe;
317*d83cc019SAndroid Build Coastguard Worker 	struct igt_plane *ref;
318*d83cc019SAndroid Build Coastguard Worker 	int index;
319*d83cc019SAndroid Build Coastguard Worker 	/* capabilities */
320*d83cc019SAndroid Build Coastguard Worker 	int type;
321*d83cc019SAndroid Build Coastguard Worker 
322*d83cc019SAndroid Build Coastguard Worker 	/*
323*d83cc019SAndroid Build Coastguard Worker 	 * drm_plane can be NULL for primary and cursor planes (when not
324*d83cc019SAndroid Build Coastguard Worker 	 * using the atomic modeset API)
325*d83cc019SAndroid Build Coastguard Worker 	 */
326*d83cc019SAndroid Build Coastguard Worker 	drmModePlane *drm_plane;
327*d83cc019SAndroid Build Coastguard Worker 
328*d83cc019SAndroid Build Coastguard Worker 	/* gem handle for fb */
329*d83cc019SAndroid Build Coastguard Worker 	uint32_t gem_handle;
330*d83cc019SAndroid Build Coastguard Worker 
331*d83cc019SAndroid Build Coastguard Worker 	struct {
332*d83cc019SAndroid Build Coastguard Worker 		uint64_t values[IGT_NUM_COLOR_ENCODINGS];
333*d83cc019SAndroid Build Coastguard Worker 	} color_encoding;
334*d83cc019SAndroid Build Coastguard Worker 	struct {
335*d83cc019SAndroid Build Coastguard Worker 		uint64_t values[IGT_NUM_COLOR_RANGES];
336*d83cc019SAndroid Build Coastguard Worker 	} color_range;
337*d83cc019SAndroid Build Coastguard Worker 
338*d83cc019SAndroid Build Coastguard Worker 	uint64_t changed;
339*d83cc019SAndroid Build Coastguard Worker 	uint32_t props[IGT_NUM_PLANE_PROPS];
340*d83cc019SAndroid Build Coastguard Worker 	uint64_t values[IGT_NUM_PLANE_PROPS];
341*d83cc019SAndroid Build Coastguard Worker 
342*d83cc019SAndroid Build Coastguard Worker 	uint64_t *modifiers;
343*d83cc019SAndroid Build Coastguard Worker 	uint32_t *formats;
344*d83cc019SAndroid Build Coastguard Worker 	int format_mod_count;
345*d83cc019SAndroid Build Coastguard Worker } igt_plane_t;
346*d83cc019SAndroid Build Coastguard Worker 
347*d83cc019SAndroid Build Coastguard Worker struct igt_pipe {
348*d83cc019SAndroid Build Coastguard Worker 	igt_display_t *display;
349*d83cc019SAndroid Build Coastguard Worker 	enum pipe pipe;
350*d83cc019SAndroid Build Coastguard Worker 
351*d83cc019SAndroid Build Coastguard Worker 	int n_planes;
352*d83cc019SAndroid Build Coastguard Worker 	int plane_cursor;
353*d83cc019SAndroid Build Coastguard Worker 	int plane_primary;
354*d83cc019SAndroid Build Coastguard Worker 	igt_plane_t *planes;
355*d83cc019SAndroid Build Coastguard Worker 
356*d83cc019SAndroid Build Coastguard Worker 	uint64_t changed;
357*d83cc019SAndroid Build Coastguard Worker 	uint32_t props[IGT_NUM_CRTC_PROPS];
358*d83cc019SAndroid Build Coastguard Worker 	uint64_t values[IGT_NUM_CRTC_PROPS];
359*d83cc019SAndroid Build Coastguard Worker 
360*d83cc019SAndroid Build Coastguard Worker 	uint32_t crtc_id;
361*d83cc019SAndroid Build Coastguard Worker 
362*d83cc019SAndroid Build Coastguard Worker 	int32_t out_fence_fd;
363*d83cc019SAndroid Build Coastguard Worker };
364*d83cc019SAndroid Build Coastguard Worker 
365*d83cc019SAndroid Build Coastguard Worker typedef struct {
366*d83cc019SAndroid Build Coastguard Worker 	/*< private >*/
367*d83cc019SAndroid Build Coastguard Worker 	igt_display_t *display;
368*d83cc019SAndroid Build Coastguard Worker 	uint32_t id;					/* KMS id */
369*d83cc019SAndroid Build Coastguard Worker 	struct kmstest_connector_config config;
370*d83cc019SAndroid Build Coastguard Worker 	char *name;
371*d83cc019SAndroid Build Coastguard Worker 	bool force_reprobe;
372*d83cc019SAndroid Build Coastguard Worker 	enum pipe pending_pipe;
373*d83cc019SAndroid Build Coastguard Worker 	bool use_override_mode;
374*d83cc019SAndroid Build Coastguard Worker 	drmModeModeInfo override_mode;
375*d83cc019SAndroid Build Coastguard Worker 
376*d83cc019SAndroid Build Coastguard Worker 	/* bitmask of changed properties */
377*d83cc019SAndroid Build Coastguard Worker 	uint64_t changed;
378*d83cc019SAndroid Build Coastguard Worker 
379*d83cc019SAndroid Build Coastguard Worker 	uint32_t props[IGT_NUM_CONNECTOR_PROPS];
380*d83cc019SAndroid Build Coastguard Worker 	uint64_t values[IGT_NUM_CONNECTOR_PROPS];
381*d83cc019SAndroid Build Coastguard Worker } igt_output_t;
382*d83cc019SAndroid Build Coastguard Worker 
383*d83cc019SAndroid Build Coastguard Worker struct igt_display {
384*d83cc019SAndroid Build Coastguard Worker 	int drm_fd;
385*d83cc019SAndroid Build Coastguard Worker 	int log_shift;
386*d83cc019SAndroid Build Coastguard Worker 	int n_pipes;
387*d83cc019SAndroid Build Coastguard Worker 	int n_planes;
388*d83cc019SAndroid Build Coastguard Worker 	int n_outputs;
389*d83cc019SAndroid Build Coastguard Worker 	igt_output_t *outputs;
390*d83cc019SAndroid Build Coastguard Worker 	igt_plane_t *planes;
391*d83cc019SAndroid Build Coastguard Worker 	igt_pipe_t *pipes;
392*d83cc019SAndroid Build Coastguard Worker 	bool has_cursor_plane;
393*d83cc019SAndroid Build Coastguard Worker 	bool is_atomic;
394*d83cc019SAndroid Build Coastguard Worker 	bool first_commit;
395*d83cc019SAndroid Build Coastguard Worker 
396*d83cc019SAndroid Build Coastguard Worker 	uint64_t *modifiers;
397*d83cc019SAndroid Build Coastguard Worker 	uint32_t *formats;
398*d83cc019SAndroid Build Coastguard Worker 	int format_mod_count;
399*d83cc019SAndroid Build Coastguard Worker };
400*d83cc019SAndroid Build Coastguard Worker 
401*d83cc019SAndroid Build Coastguard Worker void igt_display_require(igt_display_t *display, int drm_fd);
402*d83cc019SAndroid Build Coastguard Worker void igt_display_fini(igt_display_t *display);
403*d83cc019SAndroid Build Coastguard Worker void igt_display_reset(igt_display_t *display);
404*d83cc019SAndroid Build Coastguard Worker int  igt_display_commit2(igt_display_t *display, enum igt_commit_style s);
405*d83cc019SAndroid Build Coastguard Worker int  igt_display_commit(igt_display_t *display);
406*d83cc019SAndroid Build Coastguard Worker int  igt_display_try_commit_atomic(igt_display_t *display, uint32_t flags, void *user_data);
407*d83cc019SAndroid Build Coastguard Worker void igt_display_commit_atomic(igt_display_t *display, uint32_t flags, void *user_data);
408*d83cc019SAndroid Build Coastguard Worker int  igt_display_try_commit2(igt_display_t *display, enum igt_commit_style s);
409*d83cc019SAndroid Build Coastguard Worker int  igt_display_drop_events(igt_display_t *display);
410*d83cc019SAndroid Build Coastguard Worker int  igt_display_get_n_pipes(igt_display_t *display);
411*d83cc019SAndroid Build Coastguard Worker void igt_display_require_output(igt_display_t *display);
412*d83cc019SAndroid Build Coastguard Worker void igt_display_require_output_on_pipe(igt_display_t *display, enum pipe pipe);
413*d83cc019SAndroid Build Coastguard Worker 
414*d83cc019SAndroid Build Coastguard Worker const char *igt_output_name(igt_output_t *output);
415*d83cc019SAndroid Build Coastguard Worker drmModeModeInfo *igt_output_get_mode(igt_output_t *output);
416*d83cc019SAndroid Build Coastguard Worker void igt_output_override_mode(igt_output_t *output, const drmModeModeInfo *mode);
417*d83cc019SAndroid Build Coastguard Worker void igt_output_set_pipe(igt_output_t *output, enum pipe pipe);
418*d83cc019SAndroid Build Coastguard Worker igt_plane_t *igt_output_get_plane(igt_output_t *output, int plane_idx);
419*d83cc019SAndroid Build Coastguard Worker igt_plane_t *igt_output_get_plane_type(igt_output_t *output, int plane_type);
420*d83cc019SAndroid Build Coastguard Worker int igt_output_count_plane_type(igt_output_t *output, int plane_type);
421*d83cc019SAndroid Build Coastguard Worker igt_plane_t *igt_output_get_plane_type_index(igt_output_t *output,
422*d83cc019SAndroid Build Coastguard Worker 					     int plane_type, int index);
423*d83cc019SAndroid Build Coastguard Worker igt_output_t *igt_output_from_connector(igt_display_t *display,
424*d83cc019SAndroid Build Coastguard Worker     drmModeConnector *connector);
425*d83cc019SAndroid Build Coastguard Worker const drmModeModeInfo *igt_std_1024_mode_get(void);
426*d83cc019SAndroid Build Coastguard Worker 
427*d83cc019SAndroid Build Coastguard Worker igt_plane_t *igt_pipe_get_plane_type(igt_pipe_t *pipe, int plane_type);
428*d83cc019SAndroid Build Coastguard Worker int igt_pipe_count_plane_type(igt_pipe_t *pipe, int plane_type);
429*d83cc019SAndroid Build Coastguard Worker igt_plane_t *igt_pipe_get_plane_type_index(igt_pipe_t *pipe, int plane_type,
430*d83cc019SAndroid Build Coastguard Worker 					   int index);
431*d83cc019SAndroid Build Coastguard Worker igt_output_t *igt_get_single_output_for_pipe(igt_display_t *display, enum pipe pipe);
432*d83cc019SAndroid Build Coastguard Worker 
433*d83cc019SAndroid Build Coastguard Worker void igt_pipe_request_out_fence(igt_pipe_t *pipe);
434*d83cc019SAndroid Build Coastguard Worker 
435*d83cc019SAndroid Build Coastguard Worker void igt_plane_set_fb(igt_plane_t *plane, struct igt_fb *fb);
436*d83cc019SAndroid Build Coastguard Worker void igt_plane_set_fence_fd(igt_plane_t *plane, int fence_fd);
437*d83cc019SAndroid Build Coastguard Worker void igt_plane_set_pipe(igt_plane_t *plane, igt_pipe_t *pipe);
438*d83cc019SAndroid Build Coastguard Worker void igt_plane_set_position(igt_plane_t *plane, int x, int y);
439*d83cc019SAndroid Build Coastguard Worker void igt_plane_set_size(igt_plane_t *plane, int w, int h);
440*d83cc019SAndroid Build Coastguard Worker void igt_plane_set_rotation(igt_plane_t *plane, igt_rotation_t rotation);
441*d83cc019SAndroid Build Coastguard Worker void igt_fb_set_position(struct igt_fb *fb, igt_plane_t *plane,
442*d83cc019SAndroid Build Coastguard Worker 	uint32_t x, uint32_t y);
443*d83cc019SAndroid Build Coastguard Worker void igt_fb_set_size(struct igt_fb *fb, igt_plane_t *plane,
444*d83cc019SAndroid Build Coastguard Worker 	uint32_t w, uint32_t h);
445*d83cc019SAndroid Build Coastguard Worker 
446*d83cc019SAndroid Build Coastguard Worker void igt_wait_for_vblank(int drm_fd, enum pipe pipe);
447*d83cc019SAndroid Build Coastguard Worker void igt_wait_for_vblank_count(int drm_fd, enum pipe pipe, int count);
448*d83cc019SAndroid Build Coastguard Worker 
igt_output_is_connected(igt_output_t * output)449*d83cc019SAndroid Build Coastguard Worker static inline bool igt_output_is_connected(igt_output_t *output)
450*d83cc019SAndroid Build Coastguard Worker {
451*d83cc019SAndroid Build Coastguard Worker 	/* Something went wrong during probe? */
452*d83cc019SAndroid Build Coastguard Worker 	if (!output->config.connector ||
453*d83cc019SAndroid Build Coastguard Worker 	    !output->config.connector->count_modes)
454*d83cc019SAndroid Build Coastguard Worker 		return false;
455*d83cc019SAndroid Build Coastguard Worker 
456*d83cc019SAndroid Build Coastguard Worker 	if (output->config.connector->connection == DRM_MODE_CONNECTED)
457*d83cc019SAndroid Build Coastguard Worker 		return true;
458*d83cc019SAndroid Build Coastguard Worker 
459*d83cc019SAndroid Build Coastguard Worker 	return false;
460*d83cc019SAndroid Build Coastguard Worker }
461*d83cc019SAndroid Build Coastguard Worker 
462*d83cc019SAndroid Build Coastguard Worker /**
463*d83cc019SAndroid Build Coastguard Worker  * igt_pipe_connector_valid:
464*d83cc019SAndroid Build Coastguard Worker  * @pipe: pipe to check.
465*d83cc019SAndroid Build Coastguard Worker  * @output: #igt_output_t to check.
466*d83cc019SAndroid Build Coastguard Worker  *
467*d83cc019SAndroid Build Coastguard Worker  * Checks whether the given pipe and output can be used together.
468*d83cc019SAndroid Build Coastguard Worker  */
469*d83cc019SAndroid Build Coastguard Worker #define igt_pipe_connector_valid(pipe, output) \
470*d83cc019SAndroid Build Coastguard Worker 	(igt_output_is_connected((output)) && \
471*d83cc019SAndroid Build Coastguard Worker 	       (output->config.valid_crtc_idx_mask & (1 << (pipe))))
472*d83cc019SAndroid Build Coastguard Worker 
473*d83cc019SAndroid Build Coastguard Worker #define for_each_if(condition) if (!(condition)) {} else
474*d83cc019SAndroid Build Coastguard Worker 
475*d83cc019SAndroid Build Coastguard Worker /**
476*d83cc019SAndroid Build Coastguard Worker  * for_each_connected_output:
477*d83cc019SAndroid Build Coastguard Worker  * @display: a pointer to an #igt_display_t structure
478*d83cc019SAndroid Build Coastguard Worker  * @output: The output to iterate.
479*d83cc019SAndroid Build Coastguard Worker  *
480*d83cc019SAndroid Build Coastguard Worker  * This for loop iterates over all outputs.
481*d83cc019SAndroid Build Coastguard Worker  */
482*d83cc019SAndroid Build Coastguard Worker #define for_each_connected_output(display, output)		\
483*d83cc019SAndroid Build Coastguard Worker 	for (int i__ = 0;  assert(igt_can_fail()), i__ < (display)->n_outputs; i__++)	\
484*d83cc019SAndroid Build Coastguard Worker 		for_each_if ((((output) = &(display)->outputs[i__]), \
485*d83cc019SAndroid Build Coastguard Worker 			      igt_output_is_connected((output))))
486*d83cc019SAndroid Build Coastguard Worker 
487*d83cc019SAndroid Build Coastguard Worker /**
488*d83cc019SAndroid Build Coastguard Worker  * for_each_pipe_static:
489*d83cc019SAndroid Build Coastguard Worker  * @pipe: The pipe to iterate.
490*d83cc019SAndroid Build Coastguard Worker  *
491*d83cc019SAndroid Build Coastguard Worker  * This for loop iterates over all pipes supported by IGT libraries.
492*d83cc019SAndroid Build Coastguard Worker  *
493*d83cc019SAndroid Build Coastguard Worker  * This should be used to enumerate per-pipe subtests since it has no runtime
494*d83cc019SAndroid Build Coastguard Worker  * depencies.
495*d83cc019SAndroid Build Coastguard Worker  */
496*d83cc019SAndroid Build Coastguard Worker #define for_each_pipe_static(pipe) \
497*d83cc019SAndroid Build Coastguard Worker 	for (pipe = 0; pipe < IGT_MAX_PIPES; pipe++)
498*d83cc019SAndroid Build Coastguard Worker 
499*d83cc019SAndroid Build Coastguard Worker /**
500*d83cc019SAndroid Build Coastguard Worker  * for_each_pipe:
501*d83cc019SAndroid Build Coastguard Worker  * @display: a pointer to an #igt_display_t structure
502*d83cc019SAndroid Build Coastguard Worker  * @pipe: The pipe to iterate.
503*d83cc019SAndroid Build Coastguard Worker  *
504*d83cc019SAndroid Build Coastguard Worker  * This for loop iterates over all pipes.
505*d83cc019SAndroid Build Coastguard Worker  *
506*d83cc019SAndroid Build Coastguard Worker  * Note that this cannot be used to enumerate per-pipe subtest names since it
507*d83cc019SAndroid Build Coastguard Worker  * depends upon runtime probing of the actual kms driver that is being tested.
508*d83cc019SAndroid Build Coastguard Worker  * Use #for_each_pipe_static instead.
509*d83cc019SAndroid Build Coastguard Worker  */
510*d83cc019SAndroid Build Coastguard Worker #ifdef __cplusplus
511*d83cc019SAndroid Build Coastguard Worker #define for_each_pipe(display, pipe_i)					\
512*d83cc019SAndroid Build Coastguard Worker 	for (pipe_i = (enum pipe)0; assert(igt_can_fail()), pipe_i < igt_display_get_n_pipes(display); pipe_i = (enum pipe)((int)pipe_i + 1))
513*d83cc019SAndroid Build Coastguard Worker #else
514*d83cc019SAndroid Build Coastguard Worker #define for_each_pipe(display, pipe)					\
515*d83cc019SAndroid Build Coastguard Worker 	for (pipe = 0; assert(igt_can_fail()), pipe < igt_display_get_n_pipes(display); pipe++)
516*d83cc019SAndroid Build Coastguard Worker #endif
517*d83cc019SAndroid Build Coastguard Worker 
518*d83cc019SAndroid Build Coastguard Worker /**
519*d83cc019SAndroid Build Coastguard Worker  * for_each_pipe_with_valid_output:
520*d83cc019SAndroid Build Coastguard Worker  * @display: a pointer to an #igt_display_t structure
521*d83cc019SAndroid Build Coastguard Worker  * @pipe: The pipe for which this @pipe / @output combination is valid.
522*d83cc019SAndroid Build Coastguard Worker  * @output: The output for which this @pipe / @output combination is valid.
523*d83cc019SAndroid Build Coastguard Worker  *
524*d83cc019SAndroid Build Coastguard Worker  * This for loop is called over all connected outputs. This function
525*d83cc019SAndroid Build Coastguard Worker  * will try every combination of @pipe and @output.
526*d83cc019SAndroid Build Coastguard Worker  *
527*d83cc019SAndroid Build Coastguard Worker  * If you only need to test a single output for each pipe, use
528*d83cc019SAndroid Build Coastguard Worker  * for_each_pipe_with_single_output(), if you only need an
529*d83cc019SAndroid Build Coastguard Worker  * output for a single pipe, use igt_get_single_output_for_pipe().
530*d83cc019SAndroid Build Coastguard Worker  */
531*d83cc019SAndroid Build Coastguard Worker #define for_each_pipe_with_valid_output(display, pipe, output) \
532*d83cc019SAndroid Build Coastguard Worker 	for (int con__ = (pipe) = 0; \
533*d83cc019SAndroid Build Coastguard Worker 	     assert(igt_can_fail()), (pipe) < igt_display_get_n_pipes((display)) && con__ < (display)->n_outputs; \
534*d83cc019SAndroid Build Coastguard Worker 	     con__ = (con__ + 1 < (display)->n_outputs) ? con__ + 1 : (pipe = pipe + 1, 0)) \
535*d83cc019SAndroid Build Coastguard Worker 		for_each_if ((((output) = &(display)->outputs[con__]), \
536*d83cc019SAndroid Build Coastguard Worker 			     igt_pipe_connector_valid((pipe), (output))))
537*d83cc019SAndroid Build Coastguard Worker 
538*d83cc019SAndroid Build Coastguard Worker igt_output_t **__igt_pipe_populate_outputs(igt_display_t *display,
539*d83cc019SAndroid Build Coastguard Worker 					   igt_output_t **chosen_outputs);
540*d83cc019SAndroid Build Coastguard Worker 
541*d83cc019SAndroid Build Coastguard Worker /**
542*d83cc019SAndroid Build Coastguard Worker  * for_each_pipe_with_single_output:
543*d83cc019SAndroid Build Coastguard Worker  * @display: a pointer to an #igt_display_t structure
544*d83cc019SAndroid Build Coastguard Worker  * @pipe: The pipe for which this @pipe / @output combination is valid.
545*d83cc019SAndroid Build Coastguard Worker  * @output: The output for which this @pipe / @output combination is valid.
546*d83cc019SAndroid Build Coastguard Worker  *
547*d83cc019SAndroid Build Coastguard Worker  * This loop is called over all pipes, and will try to find a compatible output
548*d83cc019SAndroid Build Coastguard Worker  * for each pipe. Unlike for_each_pipe_with_valid_output(), this function will
549*d83cc019SAndroid Build Coastguard Worker  * be called at most once for each pipe.
550*d83cc019SAndroid Build Coastguard Worker  */
551*d83cc019SAndroid Build Coastguard Worker #define for_each_pipe_with_single_output(display, pipe, output) \
552*d83cc019SAndroid Build Coastguard Worker 	for (igt_output_t *__outputs[(display)->n_pipes], \
553*d83cc019SAndroid Build Coastguard Worker 	     **__output = __igt_pipe_populate_outputs((display), __outputs); \
554*d83cc019SAndroid Build Coastguard Worker 	     __output < &__outputs[(display)->n_pipes]; __output++) \
555*d83cc019SAndroid Build Coastguard Worker 		for_each_if (*__output && \
556*d83cc019SAndroid Build Coastguard Worker 			     ((pipe) = (__output - __outputs), (output) = *__output, 1))
557*d83cc019SAndroid Build Coastguard Worker 
558*d83cc019SAndroid Build Coastguard Worker /**
559*d83cc019SAndroid Build Coastguard Worker  * for_each_valid_output_on_pipe:
560*d83cc019SAndroid Build Coastguard Worker  * @display: a pointer to an #igt_display_t structure
561*d83cc019SAndroid Build Coastguard Worker  * @pipe: Pipe to enumerate valid outputs over
562*d83cc019SAndroid Build Coastguard Worker  * @output: The enumerated output.
563*d83cc019SAndroid Build Coastguard Worker  *
564*d83cc019SAndroid Build Coastguard Worker  * This for loop is called over all connected @output that can be used
565*d83cc019SAndroid Build Coastguard Worker  * on this @pipe . If there are no valid outputs for this pipe, nothing
566*d83cc019SAndroid Build Coastguard Worker  * happens.
567*d83cc019SAndroid Build Coastguard Worker  */
568*d83cc019SAndroid Build Coastguard Worker #define for_each_valid_output_on_pipe(display, pipe, output) \
569*d83cc019SAndroid Build Coastguard Worker 	for_each_connected_output((display), (output)) \
570*d83cc019SAndroid Build Coastguard Worker 		for_each_if (igt_pipe_connector_valid((pipe), (output)))
571*d83cc019SAndroid Build Coastguard Worker 
572*d83cc019SAndroid Build Coastguard Worker #define for_each_plane_on_pipe(display, pipe, plane)			\
573*d83cc019SAndroid Build Coastguard Worker 	for (int j__ = 0; assert(igt_can_fail()), (plane) = &(display)->pipes[(pipe)].planes[j__], \
574*d83cc019SAndroid Build Coastguard Worker 		     j__ < (display)->pipes[(pipe)].n_planes; j__++)
575*d83cc019SAndroid Build Coastguard Worker 
576*d83cc019SAndroid Build Coastguard Worker #define IGT_FIXED(i,f)	((i) << 16 | (f))
577*d83cc019SAndroid Build Coastguard Worker 
578*d83cc019SAndroid Build Coastguard Worker /**
579*d83cc019SAndroid Build Coastguard Worker  * igt_plane_has_prop:
580*d83cc019SAndroid Build Coastguard Worker  * @plane: Plane to check.
581*d83cc019SAndroid Build Coastguard Worker  * @prop: Property to check.
582*d83cc019SAndroid Build Coastguard Worker  *
583*d83cc019SAndroid Build Coastguard Worker  * Check whether plane supports a given property.
584*d83cc019SAndroid Build Coastguard Worker  *
585*d83cc019SAndroid Build Coastguard Worker  * Returns: True if the property is supported, otherwise false.
586*d83cc019SAndroid Build Coastguard Worker  */
587*d83cc019SAndroid Build Coastguard Worker static inline bool
igt_plane_has_prop(igt_plane_t * plane,enum igt_atomic_plane_properties prop)588*d83cc019SAndroid Build Coastguard Worker igt_plane_has_prop(igt_plane_t *plane, enum igt_atomic_plane_properties prop)
589*d83cc019SAndroid Build Coastguard Worker {
590*d83cc019SAndroid Build Coastguard Worker 	return plane->props[prop];
591*d83cc019SAndroid Build Coastguard Worker }
592*d83cc019SAndroid Build Coastguard Worker 
593*d83cc019SAndroid Build Coastguard Worker uint64_t igt_plane_get_prop(igt_plane_t *plane, enum igt_atomic_plane_properties prop);
594*d83cc019SAndroid Build Coastguard Worker 
595*d83cc019SAndroid Build Coastguard Worker #define igt_plane_is_prop_changed(plane, prop) \
596*d83cc019SAndroid Build Coastguard Worker 	(!!((plane)->changed & (1 << (prop))))
597*d83cc019SAndroid Build Coastguard Worker 
598*d83cc019SAndroid Build Coastguard Worker #define igt_plane_set_prop_changed(plane, prop) \
599*d83cc019SAndroid Build Coastguard Worker 	(plane)->changed |= 1 << (prop)
600*d83cc019SAndroid Build Coastguard Worker 
601*d83cc019SAndroid Build Coastguard Worker #define igt_plane_clear_prop_changed(plane, prop) \
602*d83cc019SAndroid Build Coastguard Worker 	(plane)->changed &= ~(1 << (prop))
603*d83cc019SAndroid Build Coastguard Worker 
604*d83cc019SAndroid Build Coastguard Worker #define igt_plane_set_prop_value(plane, prop, value) \
605*d83cc019SAndroid Build Coastguard Worker 	do { \
606*d83cc019SAndroid Build Coastguard Worker 		plane->values[prop] = value; \
607*d83cc019SAndroid Build Coastguard Worker 		igt_plane_set_prop_changed(plane, prop); \
608*d83cc019SAndroid Build Coastguard Worker 	} while (0)
609*d83cc019SAndroid Build Coastguard Worker 
610*d83cc019SAndroid Build Coastguard Worker extern bool igt_plane_try_prop_enum(igt_plane_t *plane,
611*d83cc019SAndroid Build Coastguard Worker 				    enum igt_atomic_plane_properties prop,
612*d83cc019SAndroid Build Coastguard Worker 				    const char *val);
613*d83cc019SAndroid Build Coastguard Worker 
614*d83cc019SAndroid Build Coastguard Worker extern void igt_plane_set_prop_enum(igt_plane_t *plane,
615*d83cc019SAndroid Build Coastguard Worker 				    enum igt_atomic_plane_properties prop,
616*d83cc019SAndroid Build Coastguard Worker 				    const char *val);
617*d83cc019SAndroid Build Coastguard Worker 
618*d83cc019SAndroid Build Coastguard Worker extern void igt_plane_replace_prop_blob(igt_plane_t *plane,
619*d83cc019SAndroid Build Coastguard Worker 					enum igt_atomic_plane_properties prop,
620*d83cc019SAndroid Build Coastguard Worker 					const void *ptr, size_t length);
621*d83cc019SAndroid Build Coastguard Worker 
622*d83cc019SAndroid Build Coastguard Worker /**
623*d83cc019SAndroid Build Coastguard Worker  * igt_output_has_prop:
624*d83cc019SAndroid Build Coastguard Worker  * @output: Output to check.
625*d83cc019SAndroid Build Coastguard Worker  * @prop: Property to check.
626*d83cc019SAndroid Build Coastguard Worker  *
627*d83cc019SAndroid Build Coastguard Worker  * Check whether output supports a given property.
628*d83cc019SAndroid Build Coastguard Worker  *
629*d83cc019SAndroid Build Coastguard Worker  * Returns: True if the property is supported, otherwise false.
630*d83cc019SAndroid Build Coastguard Worker  */
631*d83cc019SAndroid Build Coastguard Worker static inline bool
igt_output_has_prop(igt_output_t * output,enum igt_atomic_connector_properties prop)632*d83cc019SAndroid Build Coastguard Worker igt_output_has_prop(igt_output_t *output, enum igt_atomic_connector_properties prop)
633*d83cc019SAndroid Build Coastguard Worker {
634*d83cc019SAndroid Build Coastguard Worker 	return output->props[prop];
635*d83cc019SAndroid Build Coastguard Worker }
636*d83cc019SAndroid Build Coastguard Worker 
637*d83cc019SAndroid Build Coastguard Worker uint64_t igt_output_get_prop(igt_output_t *output, enum igt_atomic_connector_properties prop);
638*d83cc019SAndroid Build Coastguard Worker 
639*d83cc019SAndroid Build Coastguard Worker #define igt_output_is_prop_changed(output, prop) \
640*d83cc019SAndroid Build Coastguard Worker 	(!!((output)->changed & (1 << (prop))))
641*d83cc019SAndroid Build Coastguard Worker #define igt_output_set_prop_changed(output, prop) \
642*d83cc019SAndroid Build Coastguard Worker 	(output)->changed |= 1 << (prop)
643*d83cc019SAndroid Build Coastguard Worker 
644*d83cc019SAndroid Build Coastguard Worker #define igt_output_clear_prop_changed(output, prop) \
645*d83cc019SAndroid Build Coastguard Worker 	(output)->changed &= ~(1 << (prop))
646*d83cc019SAndroid Build Coastguard Worker 
647*d83cc019SAndroid Build Coastguard Worker #define igt_output_set_prop_value(output, prop, value) \
648*d83cc019SAndroid Build Coastguard Worker 	do { \
649*d83cc019SAndroid Build Coastguard Worker 		(output)->values[prop] = (value); \
650*d83cc019SAndroid Build Coastguard Worker 		igt_output_set_prop_changed(output, prop); \
651*d83cc019SAndroid Build Coastguard Worker 	} while (0)
652*d83cc019SAndroid Build Coastguard Worker 
653*d83cc019SAndroid Build Coastguard Worker extern bool igt_output_try_prop_enum(igt_output_t *output,
654*d83cc019SAndroid Build Coastguard Worker 				     enum igt_atomic_connector_properties prop,
655*d83cc019SAndroid Build Coastguard Worker 				     const char *val);
656*d83cc019SAndroid Build Coastguard Worker 
657*d83cc019SAndroid Build Coastguard Worker extern void igt_output_set_prop_enum(igt_output_t *output,
658*d83cc019SAndroid Build Coastguard Worker 				     enum igt_atomic_connector_properties prop,
659*d83cc019SAndroid Build Coastguard Worker 				     const char *val);
660*d83cc019SAndroid Build Coastguard Worker 
661*d83cc019SAndroid Build Coastguard Worker extern void igt_output_replace_prop_blob(igt_output_t *output,
662*d83cc019SAndroid Build Coastguard Worker 					 enum igt_atomic_connector_properties prop,
663*d83cc019SAndroid Build Coastguard Worker 					 const void *ptr, size_t length);
664*d83cc019SAndroid Build Coastguard Worker /**
665*d83cc019SAndroid Build Coastguard Worker  * igt_pipe_obj_has_prop:
666*d83cc019SAndroid Build Coastguard Worker  * @pipe: Pipe to check.
667*d83cc019SAndroid Build Coastguard Worker  * @prop: Property to check.
668*d83cc019SAndroid Build Coastguard Worker  *
669*d83cc019SAndroid Build Coastguard Worker  * Check whether pipe supports a given property.
670*d83cc019SAndroid Build Coastguard Worker  *
671*d83cc019SAndroid Build Coastguard Worker  * Returns: True if the property is supported, otherwise false.
672*d83cc019SAndroid Build Coastguard Worker  */
673*d83cc019SAndroid Build Coastguard Worker static inline bool
igt_pipe_obj_has_prop(igt_pipe_t * pipe,enum igt_atomic_crtc_properties prop)674*d83cc019SAndroid Build Coastguard Worker igt_pipe_obj_has_prop(igt_pipe_t *pipe, enum igt_atomic_crtc_properties prop)
675*d83cc019SAndroid Build Coastguard Worker {
676*d83cc019SAndroid Build Coastguard Worker 	return pipe->props[prop];
677*d83cc019SAndroid Build Coastguard Worker }
678*d83cc019SAndroid Build Coastguard Worker 
679*d83cc019SAndroid Build Coastguard Worker uint64_t igt_pipe_obj_get_prop(igt_pipe_t *pipe, enum igt_atomic_crtc_properties prop);
680*d83cc019SAndroid Build Coastguard Worker 
681*d83cc019SAndroid Build Coastguard Worker /**
682*d83cc019SAndroid Build Coastguard Worker  * igt_pipe_get_prop:
683*d83cc019SAndroid Build Coastguard Worker  * @display: Pointer to display.
684*d83cc019SAndroid Build Coastguard Worker  * @pipe: Target pipe.
685*d83cc019SAndroid Build Coastguard Worker  * @prop: Property to return.
686*d83cc019SAndroid Build Coastguard Worker  *
687*d83cc019SAndroid Build Coastguard Worker  * Return current value on a pipe for a given property.
688*d83cc019SAndroid Build Coastguard Worker  *
689*d83cc019SAndroid Build Coastguard Worker  * Returns: The value the property is set to, if this
690*d83cc019SAndroid Build Coastguard Worker  * is a blob, the blob id is returned. This can be passed
691*d83cc019SAndroid Build Coastguard Worker  * to drmModeGetPropertyBlob() to get the contents of the blob.
692*d83cc019SAndroid Build Coastguard Worker  */
693*d83cc019SAndroid Build Coastguard Worker static inline uint64_t
igt_pipe_get_prop(igt_display_t * display,enum pipe pipe,enum igt_atomic_crtc_properties prop)694*d83cc019SAndroid Build Coastguard Worker igt_pipe_get_prop(igt_display_t *display, enum pipe pipe,
695*d83cc019SAndroid Build Coastguard Worker 		  enum igt_atomic_crtc_properties prop)
696*d83cc019SAndroid Build Coastguard Worker {
697*d83cc019SAndroid Build Coastguard Worker 	return igt_pipe_obj_get_prop(&display->pipes[pipe], prop);
698*d83cc019SAndroid Build Coastguard Worker }
699*d83cc019SAndroid Build Coastguard Worker 
700*d83cc019SAndroid Build Coastguard Worker /**
701*d83cc019SAndroid Build Coastguard Worker  * igt_pipe_has_prop:
702*d83cc019SAndroid Build Coastguard Worker  * @display: Pointer to display.
703*d83cc019SAndroid Build Coastguard Worker  * @pipe: Pipe to check.
704*d83cc019SAndroid Build Coastguard Worker  * @prop: Property to check.
705*d83cc019SAndroid Build Coastguard Worker  *
706*d83cc019SAndroid Build Coastguard Worker  * Check whether pipe supports a given property.
707*d83cc019SAndroid Build Coastguard Worker  *
708*d83cc019SAndroid Build Coastguard Worker  * Returns: True if the property is supported, otherwise false.
709*d83cc019SAndroid Build Coastguard Worker  */
710*d83cc019SAndroid Build Coastguard Worker static inline bool
igt_pipe_has_prop(igt_display_t * display,enum pipe pipe,enum igt_atomic_crtc_properties prop)711*d83cc019SAndroid Build Coastguard Worker igt_pipe_has_prop(igt_display_t *display, enum pipe pipe,
712*d83cc019SAndroid Build Coastguard Worker 		  enum igt_atomic_crtc_properties prop)
713*d83cc019SAndroid Build Coastguard Worker {
714*d83cc019SAndroid Build Coastguard Worker 	return display->pipes[pipe].props[prop];
715*d83cc019SAndroid Build Coastguard Worker }
716*d83cc019SAndroid Build Coastguard Worker 
717*d83cc019SAndroid Build Coastguard Worker #define igt_pipe_obj_is_prop_changed(pipe_obj, prop) \
718*d83cc019SAndroid Build Coastguard Worker 	(!!((pipe_obj)->changed & (1 << (prop))))
719*d83cc019SAndroid Build Coastguard Worker 
720*d83cc019SAndroid Build Coastguard Worker #define igt_pipe_is_prop_changed(display, pipe, prop) \
721*d83cc019SAndroid Build Coastguard Worker 	igt_pipe_obj_is_prop_changed(&(display)->pipes[(pipe)], prop)
722*d83cc019SAndroid Build Coastguard Worker 
723*d83cc019SAndroid Build Coastguard Worker #define igt_pipe_obj_set_prop_changed(pipe_obj, prop) \
724*d83cc019SAndroid Build Coastguard Worker 	(pipe_obj)->changed |= 1 << (prop)
725*d83cc019SAndroid Build Coastguard Worker 
726*d83cc019SAndroid Build Coastguard Worker #define igt_pipe_set_prop_changed(display, pipe, prop) \
727*d83cc019SAndroid Build Coastguard Worker 	igt_pipe_obj_set_prop_changed(&(display)->pipes[(pipe)], prop)
728*d83cc019SAndroid Build Coastguard Worker 
729*d83cc019SAndroid Build Coastguard Worker #define igt_pipe_obj_clear_prop_changed(pipe_obj, prop) \
730*d83cc019SAndroid Build Coastguard Worker 	(pipe_obj)->changed &= ~(1 << (prop))
731*d83cc019SAndroid Build Coastguard Worker 
732*d83cc019SAndroid Build Coastguard Worker #define igt_pipe_clear_prop_changed(display, pipe, prop) \
733*d83cc019SAndroid Build Coastguard Worker 	igt_pipe_obj_clear_prop_changed(&(display)->pipes[(pipe)], prop)
734*d83cc019SAndroid Build Coastguard Worker 
735*d83cc019SAndroid Build Coastguard Worker #define igt_pipe_obj_set_prop_value(pipe_obj, prop, value) \
736*d83cc019SAndroid Build Coastguard Worker 	do { \
737*d83cc019SAndroid Build Coastguard Worker 		(pipe_obj)->values[prop] = (value); \
738*d83cc019SAndroid Build Coastguard Worker 		igt_pipe_obj_set_prop_changed(pipe_obj, prop); \
739*d83cc019SAndroid Build Coastguard Worker 	} while (0)
740*d83cc019SAndroid Build Coastguard Worker 
741*d83cc019SAndroid Build Coastguard Worker #define igt_pipe_set_prop_value(display, pipe, prop, value) \
742*d83cc019SAndroid Build Coastguard Worker 	igt_pipe_obj_set_prop_value(&(display)->pipes[(pipe)], prop, value)
743*d83cc019SAndroid Build Coastguard Worker 
744*d83cc019SAndroid Build Coastguard Worker extern bool igt_pipe_obj_try_prop_enum(igt_pipe_t *pipe,
745*d83cc019SAndroid Build Coastguard Worker 				       enum igt_atomic_crtc_properties prop,
746*d83cc019SAndroid Build Coastguard Worker 				       const char *val);
747*d83cc019SAndroid Build Coastguard Worker 
748*d83cc019SAndroid Build Coastguard Worker extern void igt_pipe_obj_set_prop_enum(igt_pipe_t *pipe,
749*d83cc019SAndroid Build Coastguard Worker 				       enum igt_atomic_crtc_properties prop,
750*d83cc019SAndroid Build Coastguard Worker 				       const char *val);
751*d83cc019SAndroid Build Coastguard Worker 
752*d83cc019SAndroid Build Coastguard Worker #define igt_pipe_try_prop_enum(display, pipe, prop, val) \
753*d83cc019SAndroid Build Coastguard Worker 	igt_pipe_obj_try_prop_enum(&(display)->pipes[(pipe)], prop, val)
754*d83cc019SAndroid Build Coastguard Worker 
755*d83cc019SAndroid Build Coastguard Worker #define igt_pipe_set_prop_enum(display, pipe, prop, val) \
756*d83cc019SAndroid Build Coastguard Worker 	igt_pipe_obj_set_prop_enum(&(display)->pipes[(pipe)], prop, val)
757*d83cc019SAndroid Build Coastguard Worker 
758*d83cc019SAndroid Build Coastguard Worker extern void igt_pipe_obj_replace_prop_blob(igt_pipe_t *pipe,
759*d83cc019SAndroid Build Coastguard Worker 					   enum igt_atomic_crtc_properties prop,
760*d83cc019SAndroid Build Coastguard Worker 					   const void *ptr, size_t length);
761*d83cc019SAndroid Build Coastguard Worker 
762*d83cc019SAndroid Build Coastguard Worker #define igt_pipe_replace_prop_blob(display, pipe, prop, ptr, length) \
763*d83cc019SAndroid Build Coastguard Worker 	igt_pipe_obj_replace_prop_blob(&(display)->pipes[(pipe)], prop, ptr, length)
764*d83cc019SAndroid Build Coastguard Worker 
765*d83cc019SAndroid Build Coastguard Worker void igt_pipe_refresh(igt_display_t *display, enum pipe pipe, bool force);
766*d83cc019SAndroid Build Coastguard Worker 
767*d83cc019SAndroid Build Coastguard Worker void igt_enable_connectors(int drm_fd);
768*d83cc019SAndroid Build Coastguard Worker void igt_reset_connectors(void);
769*d83cc019SAndroid Build Coastguard Worker 
770*d83cc019SAndroid Build Coastguard Worker uint32_t kmstest_get_vbl_flag(uint32_t pipe_id);
771*d83cc019SAndroid Build Coastguard Worker 
772*d83cc019SAndroid Build Coastguard Worker const struct edid *igt_kms_get_base_edid(void);
773*d83cc019SAndroid Build Coastguard Worker const struct edid *igt_kms_get_alt_edid(void);
774*d83cc019SAndroid Build Coastguard Worker const struct edid *igt_kms_get_hdmi_audio_edid(void);
775*d83cc019SAndroid Build Coastguard Worker const struct edid *igt_kms_get_dp_audio_edid(void);
776*d83cc019SAndroid Build Coastguard Worker const struct edid *igt_kms_get_4k_edid(void);
777*d83cc019SAndroid Build Coastguard Worker const struct edid *igt_kms_get_3d_edid(void);
778*d83cc019SAndroid Build Coastguard Worker 
779*d83cc019SAndroid Build Coastguard Worker struct udev_monitor *igt_watch_hotplug(void);
780*d83cc019SAndroid Build Coastguard Worker bool igt_hotplug_detected(struct udev_monitor *mon,
781*d83cc019SAndroid Build Coastguard Worker 			  int timeout_secs);
782*d83cc019SAndroid Build Coastguard Worker bool igt_lease_change_detected(struct udev_monitor *mon,
783*d83cc019SAndroid Build Coastguard Worker 			       int timeout_secs);
784*d83cc019SAndroid Build Coastguard Worker void igt_flush_hotplugs(struct udev_monitor *mon);
785*d83cc019SAndroid Build Coastguard Worker void igt_cleanup_hotplug(struct udev_monitor *mon);
786*d83cc019SAndroid Build Coastguard Worker 
787*d83cc019SAndroid Build Coastguard Worker bool igt_display_has_format_mod(igt_display_t *display, uint32_t format, uint64_t modifier);
788*d83cc019SAndroid Build Coastguard Worker bool igt_plane_has_format_mod(igt_plane_t *plane, uint32_t format, uint64_t modifier);
789*d83cc019SAndroid Build Coastguard Worker 
790*d83cc019SAndroid Build Coastguard Worker /**
791*d83cc019SAndroid Build Coastguard Worker  * igt_vblank_after_eq:
792*d83cc019SAndroid Build Coastguard Worker  * @a: First vblank sequence number.
793*d83cc019SAndroid Build Coastguard Worker  * @b: Second vblank sequence number.
794*d83cc019SAndroid Build Coastguard Worker  *
795*d83cc019SAndroid Build Coastguard Worker  * Compare vblank sequence numbers,
796*d83cc019SAndroid Build Coastguard Worker  * handling wraparound correctly.
797*d83cc019SAndroid Build Coastguard Worker  *
798*d83cc019SAndroid Build Coastguard Worker  * Returns: @a >= @b
799*d83cc019SAndroid Build Coastguard Worker  */
igt_vblank_after_eq(uint32_t a,uint32_t b)800*d83cc019SAndroid Build Coastguard Worker static inline bool igt_vblank_after_eq(uint32_t a, uint32_t b)
801*d83cc019SAndroid Build Coastguard Worker {
802*d83cc019SAndroid Build Coastguard Worker 	return (int32_t)(a - b) >= 0;
803*d83cc019SAndroid Build Coastguard Worker }
804*d83cc019SAndroid Build Coastguard Worker 
805*d83cc019SAndroid Build Coastguard Worker /**
806*d83cc019SAndroid Build Coastguard Worker  * igt_vblank_before_eq:
807*d83cc019SAndroid Build Coastguard Worker  * @a: First vblank sequence number.
808*d83cc019SAndroid Build Coastguard Worker  * @b: Second vblank sequence number.
809*d83cc019SAndroid Build Coastguard Worker  *
810*d83cc019SAndroid Build Coastguard Worker  * Compare vblank sequence numbers,
811*d83cc019SAndroid Build Coastguard Worker  * handling wraparound correctly.
812*d83cc019SAndroid Build Coastguard Worker  *
813*d83cc019SAndroid Build Coastguard Worker  * Returns: @a <= @b
814*d83cc019SAndroid Build Coastguard Worker  */
igt_vblank_before_eq(uint32_t a,uint32_t b)815*d83cc019SAndroid Build Coastguard Worker static inline bool igt_vblank_before_eq(uint32_t a, uint32_t b)
816*d83cc019SAndroid Build Coastguard Worker {
817*d83cc019SAndroid Build Coastguard Worker 	return igt_vblank_after_eq(b, a);
818*d83cc019SAndroid Build Coastguard Worker }
819*d83cc019SAndroid Build Coastguard Worker 
820*d83cc019SAndroid Build Coastguard Worker /**
821*d83cc019SAndroid Build Coastguard Worker  * igt_vblank_after:
822*d83cc019SAndroid Build Coastguard Worker  * @a: First vblank sequence number.
823*d83cc019SAndroid Build Coastguard Worker  * @b: Second vblank sequence number.
824*d83cc019SAndroid Build Coastguard Worker  *
825*d83cc019SAndroid Build Coastguard Worker  * Compare vblank sequence numbers,
826*d83cc019SAndroid Build Coastguard Worker  * handling wraparound correctly.
827*d83cc019SAndroid Build Coastguard Worker  *
828*d83cc019SAndroid Build Coastguard Worker  * Returns: @a > @b
829*d83cc019SAndroid Build Coastguard Worker  */
igt_vblank_after(uint32_t a,uint32_t b)830*d83cc019SAndroid Build Coastguard Worker static inline bool igt_vblank_after(uint32_t a, uint32_t b)
831*d83cc019SAndroid Build Coastguard Worker {
832*d83cc019SAndroid Build Coastguard Worker 	return (int32_t)(b - a) < 0;
833*d83cc019SAndroid Build Coastguard Worker }
834*d83cc019SAndroid Build Coastguard Worker 
835*d83cc019SAndroid Build Coastguard Worker /**
836*d83cc019SAndroid Build Coastguard Worker  * igt_vblank_before:
837*d83cc019SAndroid Build Coastguard Worker  * @a: First vblank sequence number.
838*d83cc019SAndroid Build Coastguard Worker  * @b: Second vblank sequence number.
839*d83cc019SAndroid Build Coastguard Worker  *
840*d83cc019SAndroid Build Coastguard Worker  * Compare vblank sequence numbers,
841*d83cc019SAndroid Build Coastguard Worker  * handling wraparound correctly.
842*d83cc019SAndroid Build Coastguard Worker  *
843*d83cc019SAndroid Build Coastguard Worker  * Returns: @a < @b
844*d83cc019SAndroid Build Coastguard Worker  */
igt_vblank_before(uint32_t a,uint32_t b)845*d83cc019SAndroid Build Coastguard Worker static inline bool igt_vblank_before(uint32_t a, uint32_t b)
846*d83cc019SAndroid Build Coastguard Worker {
847*d83cc019SAndroid Build Coastguard Worker 	return igt_vblank_after(b, a);
848*d83cc019SAndroid Build Coastguard Worker }
849*d83cc019SAndroid Build Coastguard Worker 
850*d83cc019SAndroid Build Coastguard Worker #ifdef __cplusplus
851*d83cc019SAndroid Build Coastguard Worker }
852*d83cc019SAndroid Build Coastguard Worker #endif
853*d83cc019SAndroid Build Coastguard Worker 
854*d83cc019SAndroid Build Coastguard Worker #endif /* __IGT_KMS_H__ */
855