xref: /freebsd/sys/dev/drm2/drm_mode.h (revision 95ee2897e98f5d444f26ed2334cc7c439f9c16c6)
1*592ffb21SWarner Losh /*
2*592ffb21SWarner Losh  * Copyright (c) 2007 Dave Airlie <airlied@linux.ie>
3*592ffb21SWarner Losh  * Copyright (c) 2007 Jakob Bornecrantz <wallbraker@gmail.com>
4*592ffb21SWarner Losh  * Copyright (c) 2008 Red Hat Inc.
5*592ffb21SWarner Losh  * Copyright (c) 2007-2008 Tungsten Graphics, Inc., Cedar Park, TX., USA
6*592ffb21SWarner Losh  * Copyright (c) 2007-2008 Intel Corporation
7*592ffb21SWarner Losh  *
8*592ffb21SWarner Losh  * Permission is hereby granted, free of charge, to any person obtaining a
9*592ffb21SWarner Losh  * copy of this software and associated documentation files (the "Software"),
10*592ffb21SWarner Losh  * to deal in the Software without restriction, including without limitation
11*592ffb21SWarner Losh  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12*592ffb21SWarner Losh  * and/or sell copies of the Software, and to permit persons to whom the
13*592ffb21SWarner Losh  * Software is furnished to do so, subject to the following conditions:
14*592ffb21SWarner Losh  *
15*592ffb21SWarner Losh  * The above copyright notice and this permission notice shall be included in
16*592ffb21SWarner Losh  * all copies or substantial portions of the Software.
17*592ffb21SWarner Losh  *
18*592ffb21SWarner Losh  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19*592ffb21SWarner Losh  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20*592ffb21SWarner Losh  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21*592ffb21SWarner Losh  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22*592ffb21SWarner Losh  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
23*592ffb21SWarner Losh  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
24*592ffb21SWarner Losh  * IN THE SOFTWARE.
25*592ffb21SWarner Losh  */
26*592ffb21SWarner Losh 
27*592ffb21SWarner Losh #ifndef _DRM_MODE_H
28*592ffb21SWarner Losh #define _DRM_MODE_H
29*592ffb21SWarner Losh 
30*592ffb21SWarner Losh #include <dev/drm2/drm_os_freebsd.h>
31*592ffb21SWarner Losh 
32*592ffb21SWarner Losh #define DRM_DISPLAY_INFO_LEN	32
33*592ffb21SWarner Losh #define DRM_CONNECTOR_NAME_LEN	32
34*592ffb21SWarner Losh #define DRM_DISPLAY_MODE_LEN	32
35*592ffb21SWarner Losh #define DRM_PROP_NAME_LEN	32
36*592ffb21SWarner Losh 
37*592ffb21SWarner Losh #define DRM_MODE_TYPE_BUILTIN	(1<<0)
38*592ffb21SWarner Losh #define DRM_MODE_TYPE_CLOCK_C	((1<<1) | DRM_MODE_TYPE_BUILTIN)
39*592ffb21SWarner Losh #define DRM_MODE_TYPE_CRTC_C	((1<<2) | DRM_MODE_TYPE_BUILTIN)
40*592ffb21SWarner Losh #define DRM_MODE_TYPE_PREFERRED	(1<<3)
41*592ffb21SWarner Losh #define DRM_MODE_TYPE_DEFAULT	(1<<4)
42*592ffb21SWarner Losh #define DRM_MODE_TYPE_USERDEF	(1<<5)
43*592ffb21SWarner Losh #define DRM_MODE_TYPE_DRIVER	(1<<6)
44*592ffb21SWarner Losh 
45*592ffb21SWarner Losh /* Video mode flags */
46*592ffb21SWarner Losh /* bit compatible with the xorg definitions. */
47*592ffb21SWarner Losh #define DRM_MODE_FLAG_PHSYNC	(1<<0)
48*592ffb21SWarner Losh #define DRM_MODE_FLAG_NHSYNC	(1<<1)
49*592ffb21SWarner Losh #define DRM_MODE_FLAG_PVSYNC	(1<<2)
50*592ffb21SWarner Losh #define DRM_MODE_FLAG_NVSYNC	(1<<3)
51*592ffb21SWarner Losh #define DRM_MODE_FLAG_INTERLACE	(1<<4)
52*592ffb21SWarner Losh #define DRM_MODE_FLAG_DBLSCAN	(1<<5)
53*592ffb21SWarner Losh #define DRM_MODE_FLAG_CSYNC	(1<<6)
54*592ffb21SWarner Losh #define DRM_MODE_FLAG_PCSYNC	(1<<7)
55*592ffb21SWarner Losh #define DRM_MODE_FLAG_NCSYNC	(1<<8)
56*592ffb21SWarner Losh #define DRM_MODE_FLAG_HSKEW	(1<<9) /* hskew provided */
57*592ffb21SWarner Losh #define DRM_MODE_FLAG_BCAST	(1<<10)
58*592ffb21SWarner Losh #define DRM_MODE_FLAG_PIXMUX	(1<<11)
59*592ffb21SWarner Losh #define DRM_MODE_FLAG_DBLCLK	(1<<12)
60*592ffb21SWarner Losh #define DRM_MODE_FLAG_CLKDIV2	(1<<13)
61*592ffb21SWarner Losh 
62*592ffb21SWarner Losh /* DPMS flags */
63*592ffb21SWarner Losh /* bit compatible with the xorg definitions. */
64*592ffb21SWarner Losh #define DRM_MODE_DPMS_ON	0
65*592ffb21SWarner Losh #define DRM_MODE_DPMS_STANDBY	1
66*592ffb21SWarner Losh #define DRM_MODE_DPMS_SUSPEND	2
67*592ffb21SWarner Losh #define DRM_MODE_DPMS_OFF	3
68*592ffb21SWarner Losh 
69*592ffb21SWarner Losh /* Scaling mode options */
70*592ffb21SWarner Losh #define DRM_MODE_SCALE_NONE		0 /* Unmodified timing (display or
71*592ffb21SWarner Losh 					     software can still scale) */
72*592ffb21SWarner Losh #define DRM_MODE_SCALE_FULLSCREEN	1 /* Full screen, ignore aspect */
73*592ffb21SWarner Losh #define DRM_MODE_SCALE_CENTER		2 /* Centered, no scaling */
74*592ffb21SWarner Losh #define DRM_MODE_SCALE_ASPECT		3 /* Full screen, preserve aspect */
75*592ffb21SWarner Losh 
76*592ffb21SWarner Losh /* Dithering mode options */
77*592ffb21SWarner Losh #define DRM_MODE_DITHERING_OFF	0
78*592ffb21SWarner Losh #define DRM_MODE_DITHERING_ON	1
79*592ffb21SWarner Losh #define DRM_MODE_DITHERING_AUTO 2
80*592ffb21SWarner Losh 
81*592ffb21SWarner Losh /* Dirty info options */
82*592ffb21SWarner Losh #define DRM_MODE_DIRTY_OFF      0
83*592ffb21SWarner Losh #define DRM_MODE_DIRTY_ON       1
84*592ffb21SWarner Losh #define DRM_MODE_DIRTY_ANNOTATE 2
85*592ffb21SWarner Losh 
86*592ffb21SWarner Losh struct drm_mode_modeinfo {
87*592ffb21SWarner Losh 	__u32 clock;
88*592ffb21SWarner Losh 	__u16 hdisplay, hsync_start, hsync_end, htotal, hskew;
89*592ffb21SWarner Losh 	__u16 vdisplay, vsync_start, vsync_end, vtotal, vscan;
90*592ffb21SWarner Losh 
91*592ffb21SWarner Losh 	__u32 vrefresh;
92*592ffb21SWarner Losh 
93*592ffb21SWarner Losh 	__u32 flags;
94*592ffb21SWarner Losh 	__u32 type;
95*592ffb21SWarner Losh 	char name[DRM_DISPLAY_MODE_LEN];
96*592ffb21SWarner Losh };
97*592ffb21SWarner Losh 
98*592ffb21SWarner Losh struct drm_mode_card_res {
99*592ffb21SWarner Losh 	__u64 fb_id_ptr;
100*592ffb21SWarner Losh 	__u64 crtc_id_ptr;
101*592ffb21SWarner Losh 	__u64 connector_id_ptr;
102*592ffb21SWarner Losh 	__u64 encoder_id_ptr;
103*592ffb21SWarner Losh 	__u32 count_fbs;
104*592ffb21SWarner Losh 	__u32 count_crtcs;
105*592ffb21SWarner Losh 	__u32 count_connectors;
106*592ffb21SWarner Losh 	__u32 count_encoders;
107*592ffb21SWarner Losh 	__u32 min_width, max_width;
108*592ffb21SWarner Losh 	__u32 min_height, max_height;
109*592ffb21SWarner Losh };
110*592ffb21SWarner Losh 
111*592ffb21SWarner Losh struct drm_mode_crtc {
112*592ffb21SWarner Losh 	__u64 set_connectors_ptr;
113*592ffb21SWarner Losh 	__u32 count_connectors;
114*592ffb21SWarner Losh 
115*592ffb21SWarner Losh 	__u32 crtc_id; /**< Id */
116*592ffb21SWarner Losh 	__u32 fb_id; /**< Id of framebuffer */
117*592ffb21SWarner Losh 
118*592ffb21SWarner Losh 	__u32 x, y; /**< Position on the frameuffer */
119*592ffb21SWarner Losh 
120*592ffb21SWarner Losh 	__u32 gamma_size;
121*592ffb21SWarner Losh 	__u32 mode_valid;
122*592ffb21SWarner Losh 	struct drm_mode_modeinfo mode;
123*592ffb21SWarner Losh };
124*592ffb21SWarner Losh 
125*592ffb21SWarner Losh #define DRM_MODE_PRESENT_TOP_FIELD	(1<<0)
126*592ffb21SWarner Losh #define DRM_MODE_PRESENT_BOTTOM_FIELD	(1<<1)
127*592ffb21SWarner Losh 
128*592ffb21SWarner Losh /* Planes blend with or override other bits on the CRTC */
129*592ffb21SWarner Losh struct drm_mode_set_plane {
130*592ffb21SWarner Losh 	__u32 plane_id;
131*592ffb21SWarner Losh 	__u32 crtc_id;
132*592ffb21SWarner Losh 	__u32 fb_id; /* fb object contains surface format type */
133*592ffb21SWarner Losh 	__u32 flags; /* see above flags */
134*592ffb21SWarner Losh 
135*592ffb21SWarner Losh 	/* Signed dest location allows it to be partially off screen */
136*592ffb21SWarner Losh 	__s32 crtc_x, crtc_y;
137*592ffb21SWarner Losh 	__u32 crtc_w, crtc_h;
138*592ffb21SWarner Losh 
139*592ffb21SWarner Losh 	/* Source values are 16.16 fixed point */
140*592ffb21SWarner Losh 	__u32 src_x, src_y;
141*592ffb21SWarner Losh 	__u32 src_h, src_w;
142*592ffb21SWarner Losh };
143*592ffb21SWarner Losh 
144*592ffb21SWarner Losh struct drm_mode_get_plane {
145*592ffb21SWarner Losh 	__u32 plane_id;
146*592ffb21SWarner Losh 
147*592ffb21SWarner Losh 	__u32 crtc_id;
148*592ffb21SWarner Losh 	__u32 fb_id;
149*592ffb21SWarner Losh 
150*592ffb21SWarner Losh 	__u32 possible_crtcs;
151*592ffb21SWarner Losh 	__u32 gamma_size;
152*592ffb21SWarner Losh 
153*592ffb21SWarner Losh 	__u32 count_format_types;
154*592ffb21SWarner Losh 	__u64 format_type_ptr;
155*592ffb21SWarner Losh };
156*592ffb21SWarner Losh 
157*592ffb21SWarner Losh struct drm_mode_get_plane_res {
158*592ffb21SWarner Losh 	__u64 plane_id_ptr;
159*592ffb21SWarner Losh 	__u32 count_planes;
160*592ffb21SWarner Losh };
161*592ffb21SWarner Losh 
162*592ffb21SWarner Losh #define DRM_MODE_ENCODER_NONE	0
163*592ffb21SWarner Losh #define DRM_MODE_ENCODER_DAC	1
164*592ffb21SWarner Losh #define DRM_MODE_ENCODER_TMDS	2
165*592ffb21SWarner Losh #define DRM_MODE_ENCODER_LVDS	3
166*592ffb21SWarner Losh #define DRM_MODE_ENCODER_TVDAC	4
167*592ffb21SWarner Losh #define DRM_MODE_ENCODER_VIRTUAL 5
168*592ffb21SWarner Losh 
169*592ffb21SWarner Losh struct drm_mode_get_encoder {
170*592ffb21SWarner Losh 	__u32 encoder_id;
171*592ffb21SWarner Losh 	__u32 encoder_type;
172*592ffb21SWarner Losh 
173*592ffb21SWarner Losh 	__u32 crtc_id; /**< Id of crtc */
174*592ffb21SWarner Losh 
175*592ffb21SWarner Losh 	__u32 possible_crtcs;
176*592ffb21SWarner Losh 	__u32 possible_clones;
177*592ffb21SWarner Losh };
178*592ffb21SWarner Losh 
179*592ffb21SWarner Losh /* This is for connectors with multiple signal types. */
180*592ffb21SWarner Losh /* Try to match DRM_MODE_CONNECTOR_X as closely as possible. */
181*592ffb21SWarner Losh #define DRM_MODE_SUBCONNECTOR_Automatic	0
182*592ffb21SWarner Losh #define DRM_MODE_SUBCONNECTOR_Unknown	0
183*592ffb21SWarner Losh #define DRM_MODE_SUBCONNECTOR_DVID	3
184*592ffb21SWarner Losh #define DRM_MODE_SUBCONNECTOR_DVIA	4
185*592ffb21SWarner Losh #define DRM_MODE_SUBCONNECTOR_Composite	5
186*592ffb21SWarner Losh #define DRM_MODE_SUBCONNECTOR_SVIDEO	6
187*592ffb21SWarner Losh #define DRM_MODE_SUBCONNECTOR_Component	8
188*592ffb21SWarner Losh #define DRM_MODE_SUBCONNECTOR_SCART	9
189*592ffb21SWarner Losh 
190*592ffb21SWarner Losh #define DRM_MODE_CONNECTOR_Unknown	0
191*592ffb21SWarner Losh #define DRM_MODE_CONNECTOR_VGA		1
192*592ffb21SWarner Losh #define DRM_MODE_CONNECTOR_DVII		2
193*592ffb21SWarner Losh #define DRM_MODE_CONNECTOR_DVID		3
194*592ffb21SWarner Losh #define DRM_MODE_CONNECTOR_DVIA		4
195*592ffb21SWarner Losh #define DRM_MODE_CONNECTOR_Composite	5
196*592ffb21SWarner Losh #define DRM_MODE_CONNECTOR_SVIDEO	6
197*592ffb21SWarner Losh #define DRM_MODE_CONNECTOR_LVDS		7
198*592ffb21SWarner Losh #define DRM_MODE_CONNECTOR_Component	8
199*592ffb21SWarner Losh #define DRM_MODE_CONNECTOR_9PinDIN	9
200*592ffb21SWarner Losh #define DRM_MODE_CONNECTOR_DisplayPort	10
201*592ffb21SWarner Losh #define DRM_MODE_CONNECTOR_HDMIA	11
202*592ffb21SWarner Losh #define DRM_MODE_CONNECTOR_HDMIB	12
203*592ffb21SWarner Losh #define DRM_MODE_CONNECTOR_TV		13
204*592ffb21SWarner Losh #define DRM_MODE_CONNECTOR_eDP		14
205*592ffb21SWarner Losh #define DRM_MODE_CONNECTOR_VIRTUAL      15
206*592ffb21SWarner Losh 
207*592ffb21SWarner Losh struct drm_mode_get_connector {
208*592ffb21SWarner Losh 
209*592ffb21SWarner Losh 	__u64 encoders_ptr;
210*592ffb21SWarner Losh 	__u64 modes_ptr;
211*592ffb21SWarner Losh 	__u64 props_ptr;
212*592ffb21SWarner Losh 	__u64 prop_values_ptr;
213*592ffb21SWarner Losh 
214*592ffb21SWarner Losh 	__u32 count_modes;
215*592ffb21SWarner Losh 	__u32 count_props;
216*592ffb21SWarner Losh 	__u32 count_encoders;
217*592ffb21SWarner Losh 
218*592ffb21SWarner Losh 	__u32 encoder_id; /**< Current Encoder */
219*592ffb21SWarner Losh 	__u32 connector_id; /**< Id */
220*592ffb21SWarner Losh 	__u32 connector_type;
221*592ffb21SWarner Losh 	__u32 connector_type_id;
222*592ffb21SWarner Losh 
223*592ffb21SWarner Losh 	__u32 connection;
224*592ffb21SWarner Losh 	__u32 mm_width, mm_height; /**< HxW in millimeters */
225*592ffb21SWarner Losh 	__u32 subpixel;
226*592ffb21SWarner Losh };
227*592ffb21SWarner Losh 
228*592ffb21SWarner Losh #define DRM_MODE_PROP_PENDING	(1<<0)
229*592ffb21SWarner Losh #define DRM_MODE_PROP_RANGE	(1<<1)
230*592ffb21SWarner Losh #define DRM_MODE_PROP_IMMUTABLE	(1<<2)
231*592ffb21SWarner Losh #define DRM_MODE_PROP_ENUM	(1<<3) /* enumerated type with text strings */
232*592ffb21SWarner Losh #define DRM_MODE_PROP_BLOB	(1<<4)
233*592ffb21SWarner Losh #define DRM_MODE_PROP_BITMASK	(1<<5) /* bitmask of enumerated types */
234*592ffb21SWarner Losh 
235*592ffb21SWarner Losh struct drm_mode_property_enum {
236*592ffb21SWarner Losh 	__u64 value;
237*592ffb21SWarner Losh 	char name[DRM_PROP_NAME_LEN];
238*592ffb21SWarner Losh };
239*592ffb21SWarner Losh 
240*592ffb21SWarner Losh struct drm_mode_get_property {
241*592ffb21SWarner Losh 	__u64 values_ptr; /* values and blob lengths */
242*592ffb21SWarner Losh 	__u64 enum_blob_ptr; /* enum and blob id ptrs */
243*592ffb21SWarner Losh 
244*592ffb21SWarner Losh 	__u32 prop_id;
245*592ffb21SWarner Losh 	__u32 flags;
246*592ffb21SWarner Losh 	char name[DRM_PROP_NAME_LEN];
247*592ffb21SWarner Losh 
248*592ffb21SWarner Losh 	__u32 count_values;
249*592ffb21SWarner Losh 	__u32 count_enum_blobs;
250*592ffb21SWarner Losh };
251*592ffb21SWarner Losh 
252*592ffb21SWarner Losh struct drm_mode_connector_set_property {
253*592ffb21SWarner Losh 	__u64 value;
254*592ffb21SWarner Losh 	__u32 prop_id;
255*592ffb21SWarner Losh 	__u32 connector_id;
256*592ffb21SWarner Losh };
257*592ffb21SWarner Losh 
258*592ffb21SWarner Losh struct drm_mode_obj_get_properties {
259*592ffb21SWarner Losh 	__u64 props_ptr;
260*592ffb21SWarner Losh 	__u64 prop_values_ptr;
261*592ffb21SWarner Losh 	__u32 count_props;
262*592ffb21SWarner Losh 	__u32 obj_id;
263*592ffb21SWarner Losh 	__u32 obj_type;
264*592ffb21SWarner Losh };
265*592ffb21SWarner Losh 
266*592ffb21SWarner Losh struct drm_mode_obj_set_property {
267*592ffb21SWarner Losh 	__u64 value;
268*592ffb21SWarner Losh 	__u32 prop_id;
269*592ffb21SWarner Losh 	__u32 obj_id;
270*592ffb21SWarner Losh 	__u32 obj_type;
271*592ffb21SWarner Losh };
272*592ffb21SWarner Losh 
273*592ffb21SWarner Losh struct drm_mode_get_blob {
274*592ffb21SWarner Losh 	__u32 blob_id;
275*592ffb21SWarner Losh 	__u32 length;
276*592ffb21SWarner Losh 	__u64 data;
277*592ffb21SWarner Losh };
278*592ffb21SWarner Losh 
279*592ffb21SWarner Losh struct drm_mode_fb_cmd {
280*592ffb21SWarner Losh 	__u32 fb_id;
281*592ffb21SWarner Losh 	__u32 width, height;
282*592ffb21SWarner Losh 	__u32 pitch;
283*592ffb21SWarner Losh 	__u32 bpp;
284*592ffb21SWarner Losh 	__u32 depth;
285*592ffb21SWarner Losh 	/* driver specific handle */
286*592ffb21SWarner Losh 	__u32 handle;
287*592ffb21SWarner Losh };
288*592ffb21SWarner Losh 
289*592ffb21SWarner Losh #define DRM_MODE_FB_INTERLACED	(1<<0) /* for interlaced framebuffers */
290*592ffb21SWarner Losh 
291*592ffb21SWarner Losh struct drm_mode_fb_cmd2 {
292*592ffb21SWarner Losh 	__u32 fb_id;
293*592ffb21SWarner Losh 	__u32 width, height;
294*592ffb21SWarner Losh 	__u32 pixel_format; /* fourcc code from drm_fourcc.h */
295*592ffb21SWarner Losh 	__u32 flags; /* see above flags */
296*592ffb21SWarner Losh 
297*592ffb21SWarner Losh 	/*
298*592ffb21SWarner Losh 	 * In case of planar formats, this ioctl allows up to 4
299*592ffb21SWarner Losh 	 * buffer objects with offets and pitches per plane.
300*592ffb21SWarner Losh 	 * The pitch and offset order is dictated by the fourcc,
301*592ffb21SWarner Losh 	 * e.g. NV12 (http://fourcc.org/yuv.php#NV12) is described as:
302*592ffb21SWarner Losh 	 *
303*592ffb21SWarner Losh 	 *   YUV 4:2:0 image with a plane of 8 bit Y samples
304*592ffb21SWarner Losh 	 *   followed by an interleaved U/V plane containing
305*592ffb21SWarner Losh 	 *   8 bit 2x2 subsampled colour difference samples.
306*592ffb21SWarner Losh 	 *
307*592ffb21SWarner Losh 	 * So it would consist of Y as offset[0] and UV as
308*592ffb21SWarner Losh 	 * offeset[1].  Note that offset[0] will generally
309*592ffb21SWarner Losh 	 * be 0.
310*592ffb21SWarner Losh 	 */
311*592ffb21SWarner Losh 	__u32 handles[4];
312*592ffb21SWarner Losh 	__u32 pitches[4]; /* pitch for each plane */
313*592ffb21SWarner Losh 	__u32 offsets[4]; /* offset of each plane */
314*592ffb21SWarner Losh };
315*592ffb21SWarner Losh 
316*592ffb21SWarner Losh #define DRM_MODE_FB_DIRTY_ANNOTATE_COPY 0x01
317*592ffb21SWarner Losh #define DRM_MODE_FB_DIRTY_ANNOTATE_FILL 0x02
318*592ffb21SWarner Losh #define DRM_MODE_FB_DIRTY_FLAGS         0x03
319*592ffb21SWarner Losh 
320*592ffb21SWarner Losh #define DRM_MODE_FB_DIRTY_MAX_CLIPS     256
321*592ffb21SWarner Losh 
322*592ffb21SWarner Losh /*
323*592ffb21SWarner Losh  * Mark a region of a framebuffer as dirty.
324*592ffb21SWarner Losh  *
325*592ffb21SWarner Losh  * Some hardware does not automatically update display contents
326*592ffb21SWarner Losh  * as a hardware or software draw to a framebuffer. This ioctl
327*592ffb21SWarner Losh  * allows userspace to tell the kernel and the hardware what
328*592ffb21SWarner Losh  * regions of the framebuffer have changed.
329*592ffb21SWarner Losh  *
330*592ffb21SWarner Losh  * The kernel or hardware is free to update more then just the
331*592ffb21SWarner Losh  * region specified by the clip rects. The kernel or hardware
332*592ffb21SWarner Losh  * may also delay and/or coalesce several calls to dirty into a
333*592ffb21SWarner Losh  * single update.
334*592ffb21SWarner Losh  *
335*592ffb21SWarner Losh  * Userspace may annotate the updates, the annotates are a
336*592ffb21SWarner Losh  * promise made by the caller that the change is either a copy
337*592ffb21SWarner Losh  * of pixels or a fill of a single color in the region specified.
338*592ffb21SWarner Losh  *
339*592ffb21SWarner Losh  * If the DRM_MODE_FB_DIRTY_ANNOTATE_COPY flag is given then
340*592ffb21SWarner Losh  * the number of updated regions are half of num_clips given,
341*592ffb21SWarner Losh  * where the clip rects are paired in src and dst. The width and
342*592ffb21SWarner Losh  * height of each one of the pairs must match.
343*592ffb21SWarner Losh  *
344*592ffb21SWarner Losh  * If the DRM_MODE_FB_DIRTY_ANNOTATE_FILL flag is given the caller
345*592ffb21SWarner Losh  * promises that the region specified of the clip rects is filled
346*592ffb21SWarner Losh  * completely with a single color as given in the color argument.
347*592ffb21SWarner Losh  */
348*592ffb21SWarner Losh 
349*592ffb21SWarner Losh struct drm_mode_fb_dirty_cmd {
350*592ffb21SWarner Losh 	__u32 fb_id;
351*592ffb21SWarner Losh 	__u32 flags;
352*592ffb21SWarner Losh 	__u32 color;
353*592ffb21SWarner Losh 	__u32 num_clips;
354*592ffb21SWarner Losh 	__u64 clips_ptr;
355*592ffb21SWarner Losh };
356*592ffb21SWarner Losh 
357*592ffb21SWarner Losh struct drm_mode_mode_cmd {
358*592ffb21SWarner Losh 	__u32 connector_id;
359*592ffb21SWarner Losh 	struct drm_mode_modeinfo mode;
360*592ffb21SWarner Losh };
361*592ffb21SWarner Losh 
362*592ffb21SWarner Losh #define DRM_MODE_CURSOR_BO	0x01
363*592ffb21SWarner Losh #define DRM_MODE_CURSOR_MOVE	0x02
364*592ffb21SWarner Losh #define DRM_MODE_CURSOR_FLAGS	0x03
365*592ffb21SWarner Losh 
366*592ffb21SWarner Losh /*
367*592ffb21SWarner Losh  * depending on the value in flags different members are used.
368*592ffb21SWarner Losh  *
369*592ffb21SWarner Losh  * CURSOR_BO uses
370*592ffb21SWarner Losh  *    crtc
371*592ffb21SWarner Losh  *    width
372*592ffb21SWarner Losh  *    height
373*592ffb21SWarner Losh  *    handle - if 0 turns the cursor of
374*592ffb21SWarner Losh  *
375*592ffb21SWarner Losh  * CURSOR_MOVE uses
376*592ffb21SWarner Losh  *    crtc
377*592ffb21SWarner Losh  *    x
378*592ffb21SWarner Losh  *    y
379*592ffb21SWarner Losh  */
380*592ffb21SWarner Losh struct drm_mode_cursor {
381*592ffb21SWarner Losh 	__u32 flags;
382*592ffb21SWarner Losh 	__u32 crtc_id;
383*592ffb21SWarner Losh 	__s32 x;
384*592ffb21SWarner Losh 	__s32 y;
385*592ffb21SWarner Losh 	__u32 width;
386*592ffb21SWarner Losh 	__u32 height;
387*592ffb21SWarner Losh 	/* driver specific handle */
388*592ffb21SWarner Losh 	__u32 handle;
389*592ffb21SWarner Losh };
390*592ffb21SWarner Losh 
391*592ffb21SWarner Losh struct drm_mode_crtc_lut {
392*592ffb21SWarner Losh 	__u32 crtc_id;
393*592ffb21SWarner Losh 	__u32 gamma_size;
394*592ffb21SWarner Losh 
395*592ffb21SWarner Losh 	/* pointers to arrays */
396*592ffb21SWarner Losh 	__u64 red;
397*592ffb21SWarner Losh 	__u64 green;
398*592ffb21SWarner Losh 	__u64 blue;
399*592ffb21SWarner Losh };
400*592ffb21SWarner Losh 
401*592ffb21SWarner Losh #define DRM_MODE_PAGE_FLIP_EVENT 0x01
402*592ffb21SWarner Losh #define DRM_MODE_PAGE_FLIP_FLAGS DRM_MODE_PAGE_FLIP_EVENT
403*592ffb21SWarner Losh 
404*592ffb21SWarner Losh /*
405*592ffb21SWarner Losh  * Request a page flip on the specified crtc.
406*592ffb21SWarner Losh  *
407*592ffb21SWarner Losh  * This ioctl will ask KMS to schedule a page flip for the specified
408*592ffb21SWarner Losh  * crtc.  Once any pending rendering targeting the specified fb (as of
409*592ffb21SWarner Losh  * ioctl time) has completed, the crtc will be reprogrammed to display
410*592ffb21SWarner Losh  * that fb after the next vertical refresh.  The ioctl returns
411*592ffb21SWarner Losh  * immediately, but subsequent rendering to the current fb will block
412*592ffb21SWarner Losh  * in the execbuffer ioctl until the page flip happens.  If a page
413*592ffb21SWarner Losh  * flip is already pending as the ioctl is called, EBUSY will be
414*592ffb21SWarner Losh  * returned.
415*592ffb21SWarner Losh  *
416*592ffb21SWarner Losh  * The ioctl supports one flag, DRM_MODE_PAGE_FLIP_EVENT, which will
417*592ffb21SWarner Losh  * request that drm sends back a vblank event (see drm.h: struct
418*592ffb21SWarner Losh  * drm_event_vblank) when the page flip is done.  The user_data field
419*592ffb21SWarner Losh  * passed in with this ioctl will be returned as the user_data field
420*592ffb21SWarner Losh  * in the vblank event struct.
421*592ffb21SWarner Losh  *
422*592ffb21SWarner Losh  * The reserved field must be zero until we figure out something
423*592ffb21SWarner Losh  * clever to use it for.
424*592ffb21SWarner Losh  */
425*592ffb21SWarner Losh 
426*592ffb21SWarner Losh struct drm_mode_crtc_page_flip {
427*592ffb21SWarner Losh 	__u32 crtc_id;
428*592ffb21SWarner Losh 	__u32 fb_id;
429*592ffb21SWarner Losh 	__u32 flags;
430*592ffb21SWarner Losh 	__u32 reserved;
431*592ffb21SWarner Losh 	__u64 user_data;
432*592ffb21SWarner Losh };
433*592ffb21SWarner Losh 
434*592ffb21SWarner Losh /* create a dumb scanout buffer */
435*592ffb21SWarner Losh struct drm_mode_create_dumb {
436*592ffb21SWarner Losh 	uint32_t height;
437*592ffb21SWarner Losh 	uint32_t width;
438*592ffb21SWarner Losh 	uint32_t bpp;
439*592ffb21SWarner Losh 	uint32_t flags;
440*592ffb21SWarner Losh 	/* handle, pitch, size will be returned */
441*592ffb21SWarner Losh 	uint32_t handle;
442*592ffb21SWarner Losh 	uint32_t pitch;
443*592ffb21SWarner Losh 	uint64_t size;
444*592ffb21SWarner Losh };
445*592ffb21SWarner Losh 
446*592ffb21SWarner Losh /* set up for mmap of a dumb scanout buffer */
447*592ffb21SWarner Losh struct drm_mode_map_dumb {
448*592ffb21SWarner Losh 	/** Handle for the object being mapped. */
449*592ffb21SWarner Losh 	__u32 handle;
450*592ffb21SWarner Losh 	__u32 pad;
451*592ffb21SWarner Losh 	/**
452*592ffb21SWarner Losh 	 * Fake offset to use for subsequent mmap call
453*592ffb21SWarner Losh 	 *
454*592ffb21SWarner Losh 	 * This is a fixed-size type for 32/64 compatibility.
455*592ffb21SWarner Losh 	 */
456*592ffb21SWarner Losh 	__u64 offset;
457*592ffb21SWarner Losh };
458*592ffb21SWarner Losh 
459*592ffb21SWarner Losh struct drm_mode_destroy_dumb {
460*592ffb21SWarner Losh 	uint32_t handle;
461*592ffb21SWarner Losh };
462*592ffb21SWarner Losh 
463*592ffb21SWarner Losh #endif
464