1/*
2 * Copyright (c) 2007 Dave Airlie <airlied@linux.ie>
3 * Copyright (c) 2007 Jakob Bornecrantz <wallbraker@gmail.com>
4 * Copyright (c) 2008 Red Hat Inc.
5 * Copyright (c) 2007-2008 Tungsten Graphics, Inc., Cedar Park, TX., USA
6 * Copyright (c) 2007-2008 Intel Corporation
7 *
8 * Permission is hereby granted, free of charge, to any person obtaining a
9 * copy of this software and associated documentation files (the "Software"),
10 * to deal in the Software without restriction, including without limitation
11 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12 * and/or sell copies of the Software, and to permit persons to whom the
13 * Software is furnished to do so, subject to the following conditions:
14 *
15 * The above copyright notice and this permission notice shall be included in
16 * all copies or substantial portions of the Software.
17 *
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
23 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
24 * IN THE SOFTWARE.
25 */
26
27#ifndef _DRM_MODE_H
28#define _DRM_MODE_H
29
30#include "drm.h"
31
32#if defined(__cplusplus)
33extern "C" {
34#endif
35
36/**
37 * DOC: overview
38 *
39 * DRM exposes many UAPI and structure definition to have a consistent
40 * and standardized interface with user.
41 * Userspace can refer to these structure definitions and UAPI formats
42 * to communicate to driver
43 */
44
45#define DRM_CONNECTOR_NAME_LEN	32
46#define DRM_DISPLAY_MODE_LEN	32
47#define DRM_PROP_NAME_LEN	32
48
49#define DRM_MODE_TYPE_BUILTIN	(1<<0) /* deprecated */
50#define DRM_MODE_TYPE_CLOCK_C	((1<<1) | DRM_MODE_TYPE_BUILTIN) /* deprecated */
51#define DRM_MODE_TYPE_CRTC_C	((1<<2) | DRM_MODE_TYPE_BUILTIN) /* deprecated */
52#define DRM_MODE_TYPE_PREFERRED	(1<<3)
53#define DRM_MODE_TYPE_DEFAULT	(1<<4) /* deprecated */
54#define DRM_MODE_TYPE_USERDEF	(1<<5)
55#define DRM_MODE_TYPE_DRIVER	(1<<6)
56
57#define DRM_MODE_TYPE_ALL	(DRM_MODE_TYPE_PREFERRED |	\
58				 DRM_MODE_TYPE_USERDEF |	\
59				 DRM_MODE_TYPE_DRIVER)
60
61/* Video mode flags */
62/* bit compatible with the xrandr RR_ definitions (bits 0-13)
63 *
64 * ABI warning: Existing userspace really expects
65 * the mode flags to match the xrandr definitions. Any
66 * changes that don't match the xrandr definitions will
67 * likely need a new client cap or some other mechanism
68 * to avoid breaking existing userspace. This includes
69 * allocating new flags in the previously unused bits!
70 */
71#define DRM_MODE_FLAG_PHSYNC			(1<<0)
72#define DRM_MODE_FLAG_NHSYNC			(1<<1)
73#define DRM_MODE_FLAG_PVSYNC			(1<<2)
74#define DRM_MODE_FLAG_NVSYNC			(1<<3)
75#define DRM_MODE_FLAG_INTERLACE			(1<<4)
76#define DRM_MODE_FLAG_DBLSCAN			(1<<5)
77#define DRM_MODE_FLAG_CSYNC			(1<<6)
78#define DRM_MODE_FLAG_PCSYNC			(1<<7)
79#define DRM_MODE_FLAG_NCSYNC			(1<<8)
80#define DRM_MODE_FLAG_HSKEW			(1<<9) /* hskew provided */
81#define DRM_MODE_FLAG_BCAST			(1<<10) /* deprecated */
82#define DRM_MODE_FLAG_PIXMUX			(1<<11) /* deprecated */
83#define DRM_MODE_FLAG_DBLCLK			(1<<12)
84#define DRM_MODE_FLAG_CLKDIV2			(1<<13)
85 /*
86  * When adding a new stereo mode don't forget to adjust DRM_MODE_FLAGS_3D_MAX
87  * (define not exposed to user space).
88  */
89#define DRM_MODE_FLAG_3D_MASK			(0x1f<<14)
90#define  DRM_MODE_FLAG_3D_NONE		(0<<14)
91#define  DRM_MODE_FLAG_3D_FRAME_PACKING		(1<<14)
92#define  DRM_MODE_FLAG_3D_FIELD_ALTERNATIVE	(2<<14)
93#define  DRM_MODE_FLAG_3D_LINE_ALTERNATIVE	(3<<14)
94#define  DRM_MODE_FLAG_3D_SIDE_BY_SIDE_FULL	(4<<14)
95#define  DRM_MODE_FLAG_3D_L_DEPTH		(5<<14)
96#define  DRM_MODE_FLAG_3D_L_DEPTH_GFX_GFX_DEPTH	(6<<14)
97#define  DRM_MODE_FLAG_3D_TOP_AND_BOTTOM	(7<<14)
98#define  DRM_MODE_FLAG_3D_SIDE_BY_SIDE_HALF	(8<<14)
99
100/* Picture aspect ratio options */
101#define DRM_MODE_PICTURE_ASPECT_NONE		0
102#define DRM_MODE_PICTURE_ASPECT_4_3		1
103#define DRM_MODE_PICTURE_ASPECT_16_9		2
104#define DRM_MODE_PICTURE_ASPECT_64_27		3
105#define DRM_MODE_PICTURE_ASPECT_256_135		4
106
107/* Content type options */
108#define DRM_MODE_CONTENT_TYPE_NO_DATA		0
109#define DRM_MODE_CONTENT_TYPE_GRAPHICS		1
110#define DRM_MODE_CONTENT_TYPE_PHOTO		2
111#define DRM_MODE_CONTENT_TYPE_CINEMA		3
112#define DRM_MODE_CONTENT_TYPE_GAME		4
113
114/* Aspect ratio flag bitmask (4 bits 22:19) */
115#define DRM_MODE_FLAG_PIC_AR_MASK		(0x0F<<19)
116#define  DRM_MODE_FLAG_PIC_AR_NONE \
117			(DRM_MODE_PICTURE_ASPECT_NONE<<19)
118#define  DRM_MODE_FLAG_PIC_AR_4_3 \
119			(DRM_MODE_PICTURE_ASPECT_4_3<<19)
120#define  DRM_MODE_FLAG_PIC_AR_16_9 \
121			(DRM_MODE_PICTURE_ASPECT_16_9<<19)
122#define  DRM_MODE_FLAG_PIC_AR_64_27 \
123			(DRM_MODE_PICTURE_ASPECT_64_27<<19)
124#define  DRM_MODE_FLAG_PIC_AR_256_135 \
125			(DRM_MODE_PICTURE_ASPECT_256_135<<19)
126
127#define  DRM_MODE_FLAG_ALL	(DRM_MODE_FLAG_PHSYNC |		\
128				 DRM_MODE_FLAG_NHSYNC |		\
129				 DRM_MODE_FLAG_PVSYNC |		\
130				 DRM_MODE_FLAG_NVSYNC |		\
131				 DRM_MODE_FLAG_INTERLACE |	\
132				 DRM_MODE_FLAG_DBLSCAN |	\
133				 DRM_MODE_FLAG_CSYNC |		\
134				 DRM_MODE_FLAG_PCSYNC |		\
135				 DRM_MODE_FLAG_NCSYNC |		\
136				 DRM_MODE_FLAG_HSKEW |		\
137				 DRM_MODE_FLAG_DBLCLK |		\
138				 DRM_MODE_FLAG_CLKDIV2 |	\
139				 DRM_MODE_FLAG_3D_MASK)
140
141/* DPMS flags */
142/* bit compatible with the xorg definitions. */
143#define DRM_MODE_DPMS_ON	0
144#define DRM_MODE_DPMS_STANDBY	1
145#define DRM_MODE_DPMS_SUSPEND	2
146#define DRM_MODE_DPMS_OFF	3
147
148/* Scaling mode options */
149#define DRM_MODE_SCALE_NONE		0 /* Unmodified timing (display or
150					     software can still scale) */
151#define DRM_MODE_SCALE_FULLSCREEN	1 /* Full screen, ignore aspect */
152#define DRM_MODE_SCALE_CENTER		2 /* Centered, no scaling */
153#define DRM_MODE_SCALE_ASPECT		3 /* Full screen, preserve aspect */
154
155/* Dithering mode options */
156#define DRM_MODE_DITHERING_OFF	0
157#define DRM_MODE_DITHERING_ON	1
158#define DRM_MODE_DITHERING_AUTO 2
159
160/* Dirty info options */
161#define DRM_MODE_DIRTY_OFF      0
162#define DRM_MODE_DIRTY_ON       1
163#define DRM_MODE_DIRTY_ANNOTATE 2
164
165/* Link Status options */
166#define DRM_MODE_LINK_STATUS_GOOD	0
167#define DRM_MODE_LINK_STATUS_BAD	1
168
169/*
170 * DRM_MODE_ROTATE_<degrees>
171 *
172 * Signals that a drm plane is been rotated <degrees> degrees in counter
173 * clockwise direction.
174 *
175 * This define is provided as a convenience, looking up the property id
176 * using the name->prop id lookup is the preferred method.
177 */
178#define DRM_MODE_ROTATE_0       (1<<0)
179#define DRM_MODE_ROTATE_90      (1<<1)
180#define DRM_MODE_ROTATE_180     (1<<2)
181#define DRM_MODE_ROTATE_270     (1<<3)
182
183/*
184 * DRM_MODE_ROTATE_MASK
185 *
186 * Bitmask used to look for drm plane rotations.
187 */
188#define DRM_MODE_ROTATE_MASK (\
189		DRM_MODE_ROTATE_0  | \
190		DRM_MODE_ROTATE_90  | \
191		DRM_MODE_ROTATE_180 | \
192		DRM_MODE_ROTATE_270)
193
194/*
195 * DRM_MODE_REFLECT_<axis>
196 *
197 * Signals that the contents of a drm plane is reflected along the <axis> axis,
198 * in the same way as mirroring.
199 * See kerneldoc chapter "Plane Composition Properties" for more details.
200 *
201 * This define is provided as a convenience, looking up the property id
202 * using the name->prop id lookup is the preferred method.
203 */
204#define DRM_MODE_REFLECT_X      (1<<4)
205#define DRM_MODE_REFLECT_Y      (1<<5)
206
207/*
208 * DRM_MODE_REFLECT_MASK
209 *
210 * Bitmask used to look for drm plane reflections.
211 */
212#define DRM_MODE_REFLECT_MASK (\
213		DRM_MODE_REFLECT_X | \
214		DRM_MODE_REFLECT_Y)
215
216/* Content Protection Flags */
217#define DRM_MODE_CONTENT_PROTECTION_UNDESIRED	0
218#define DRM_MODE_CONTENT_PROTECTION_DESIRED     1
219#define DRM_MODE_CONTENT_PROTECTION_ENABLED     2
220
221struct drm_mode_modeinfo {
222	__u32 clock;
223	__u16 hdisplay;
224	__u16 hsync_start;
225	__u16 hsync_end;
226	__u16 htotal;
227	__u16 hskew;
228	__u16 vdisplay;
229	__u16 vsync_start;
230	__u16 vsync_end;
231	__u16 vtotal;
232	__u16 vscan;
233
234	__u32 vrefresh;
235
236	__u32 flags;
237	__u32 type;
238	char name[DRM_DISPLAY_MODE_LEN];
239};
240
241struct drm_mode_card_res {
242	__u64 fb_id_ptr;
243	__u64 crtc_id_ptr;
244	__u64 connector_id_ptr;
245	__u64 encoder_id_ptr;
246	__u32 count_fbs;
247	__u32 count_crtcs;
248	__u32 count_connectors;
249	__u32 count_encoders;
250	__u32 min_width;
251	__u32 max_width;
252	__u32 min_height;
253	__u32 max_height;
254};
255
256struct drm_mode_crtc {
257	__u64 set_connectors_ptr;
258	__u32 count_connectors;
259
260	__u32 crtc_id; /**< Id */
261	__u32 fb_id; /**< Id of framebuffer */
262
263	__u32 x; /**< x Position on the framebuffer */
264	__u32 y; /**< y Position on the framebuffer */
265
266	__u32 gamma_size;
267	__u32 mode_valid;
268	struct drm_mode_modeinfo mode;
269};
270
271#define DRM_MODE_PRESENT_TOP_FIELD	(1<<0)
272#define DRM_MODE_PRESENT_BOTTOM_FIELD	(1<<1)
273
274/* Planes blend with or override other bits on the CRTC */
275struct drm_mode_set_plane {
276	__u32 plane_id;
277	__u32 crtc_id;
278	__u32 fb_id; /* fb object contains surface format type */
279	__u32 flags; /* see above flags */
280
281	/* Signed dest location allows it to be partially off screen */
282	__s32 crtc_x;
283	__s32 crtc_y;
284	__u32 crtc_w;
285	__u32 crtc_h;
286
287	/* Source values are 16.16 fixed point */
288	__u32 src_x;
289	__u32 src_y;
290	__u32 src_h;
291	__u32 src_w;
292};
293
294struct drm_mode_get_plane {
295	__u32 plane_id;
296
297	__u32 crtc_id;
298	__u32 fb_id;
299
300	__u32 possible_crtcs;
301	__u32 gamma_size;
302
303	__u32 count_format_types;
304	__u64 format_type_ptr;
305};
306
307struct drm_mode_get_plane_res {
308	__u64 plane_id_ptr;
309	__u32 count_planes;
310};
311
312#define DRM_MODE_ENCODER_NONE	0
313#define DRM_MODE_ENCODER_DAC	1
314#define DRM_MODE_ENCODER_TMDS	2
315#define DRM_MODE_ENCODER_LVDS	3
316#define DRM_MODE_ENCODER_TVDAC	4
317#define DRM_MODE_ENCODER_VIRTUAL 5
318#define DRM_MODE_ENCODER_DSI	6
319#define DRM_MODE_ENCODER_DPMST	7
320#define DRM_MODE_ENCODER_DPI	8
321
322struct drm_mode_get_encoder {
323	__u32 encoder_id;
324	__u32 encoder_type;
325
326	__u32 crtc_id; /**< Id of crtc */
327
328	__u32 possible_crtcs;
329	__u32 possible_clones;
330};
331
332/* This is for connectors with multiple signal types. */
333/* Try to match DRM_MODE_CONNECTOR_X as closely as possible. */
334enum drm_mode_subconnector {
335	DRM_MODE_SUBCONNECTOR_Automatic   = 0,  /* DVI-I, TV     */
336	DRM_MODE_SUBCONNECTOR_Unknown     = 0,  /* DVI-I, TV, DP */
337	DRM_MODE_SUBCONNECTOR_VGA	  = 1,  /*            DP */
338	DRM_MODE_SUBCONNECTOR_DVID	  = 3,  /* DVI-I      DP */
339	DRM_MODE_SUBCONNECTOR_DVIA	  = 4,  /* DVI-I         */
340	DRM_MODE_SUBCONNECTOR_Composite   = 5,  /*        TV     */
341	DRM_MODE_SUBCONNECTOR_SVIDEO	  = 6,  /*        TV     */
342	DRM_MODE_SUBCONNECTOR_Component   = 8,  /*        TV     */
343	DRM_MODE_SUBCONNECTOR_SCART	  = 9,  /*        TV     */
344	DRM_MODE_SUBCONNECTOR_DisplayPort = 10, /*            DP */
345	DRM_MODE_SUBCONNECTOR_HDMIA       = 11, /*            DP */
346	DRM_MODE_SUBCONNECTOR_Native      = 15, /*            DP */
347	DRM_MODE_SUBCONNECTOR_Wireless    = 18, /*            DP */
348};
349
350#define DRM_MODE_CONNECTOR_Unknown	0
351#define DRM_MODE_CONNECTOR_VGA		1
352#define DRM_MODE_CONNECTOR_DVII		2
353#define DRM_MODE_CONNECTOR_DVID		3
354#define DRM_MODE_CONNECTOR_DVIA		4
355#define DRM_MODE_CONNECTOR_Composite	5
356#define DRM_MODE_CONNECTOR_SVIDEO	6
357#define DRM_MODE_CONNECTOR_LVDS		7
358#define DRM_MODE_CONNECTOR_Component	8
359#define DRM_MODE_CONNECTOR_9PinDIN	9
360#define DRM_MODE_CONNECTOR_DisplayPort	10
361#define DRM_MODE_CONNECTOR_HDMIA	11
362#define DRM_MODE_CONNECTOR_HDMIB	12
363#define DRM_MODE_CONNECTOR_TV		13
364#define DRM_MODE_CONNECTOR_eDP		14
365#define DRM_MODE_CONNECTOR_VIRTUAL      15
366#define DRM_MODE_CONNECTOR_DSI		16
367#define DRM_MODE_CONNECTOR_DPI		17
368#define DRM_MODE_CONNECTOR_WRITEBACK	18
369#define DRM_MODE_CONNECTOR_SPI		19
370
371struct drm_mode_get_connector {
372
373	__u64 encoders_ptr;
374	__u64 modes_ptr;
375	__u64 props_ptr;
376	__u64 prop_values_ptr;
377
378	__u32 count_modes;
379	__u32 count_props;
380	__u32 count_encoders;
381
382	__u32 encoder_id; /**< Current Encoder */
383	__u32 connector_id; /**< Id */
384	__u32 connector_type;
385	__u32 connector_type_id;
386
387	__u32 connection;
388	__u32 mm_width;  /**< width in millimeters */
389	__u32 mm_height; /**< height in millimeters */
390	__u32 subpixel;
391
392	__u32 pad;
393};
394
395#define DRM_MODE_PROP_PENDING	(1<<0) /* deprecated, do not use */
396#define DRM_MODE_PROP_RANGE	(1<<1)
397#define DRM_MODE_PROP_IMMUTABLE	(1<<2)
398#define DRM_MODE_PROP_ENUM	(1<<3) /* enumerated type with text strings */
399#define DRM_MODE_PROP_BLOB	(1<<4)
400#define DRM_MODE_PROP_BITMASK	(1<<5) /* bitmask of enumerated types */
401
402/* non-extended types: legacy bitmask, one bit per type: */
403#define DRM_MODE_PROP_LEGACY_TYPE  ( \
404		DRM_MODE_PROP_RANGE | \
405		DRM_MODE_PROP_ENUM | \
406		DRM_MODE_PROP_BLOB | \
407		DRM_MODE_PROP_BITMASK)
408
409/* extended-types: rather than continue to consume a bit per type,
410 * grab a chunk of the bits to use as integer type id.
411 */
412#define DRM_MODE_PROP_EXTENDED_TYPE	0x0000ffc0
413#define DRM_MODE_PROP_TYPE(n)		((n) << 6)
414#define DRM_MODE_PROP_OBJECT		DRM_MODE_PROP_TYPE(1)
415#define DRM_MODE_PROP_SIGNED_RANGE	DRM_MODE_PROP_TYPE(2)
416
417/* the PROP_ATOMIC flag is used to hide properties from userspace that
418 * is not aware of atomic properties.  This is mostly to work around
419 * older userspace (DDX drivers) that read/write each prop they find,
420 * witout being aware that this could be triggering a lengthy modeset.
421 */
422#define DRM_MODE_PROP_ATOMIC        0x80000000
423
424struct drm_mode_property_enum {
425	__u64 value;
426	char name[DRM_PROP_NAME_LEN];
427};
428
429struct drm_mode_get_property {
430	__u64 values_ptr; /* values and blob lengths */
431	__u64 enum_blob_ptr; /* enum and blob id ptrs */
432
433	__u32 prop_id;
434	__u32 flags;
435	char name[DRM_PROP_NAME_LEN];
436
437	__u32 count_values;
438	/* This is only used to count enum values, not blobs. The _blobs is
439	 * simply because of a historical reason, i.e. backwards compat. */
440	__u32 count_enum_blobs;
441};
442
443struct drm_mode_connector_set_property {
444	__u64 value;
445	__u32 prop_id;
446	__u32 connector_id;
447};
448
449#define DRM_MODE_OBJECT_CRTC 0xcccccccc
450#define DRM_MODE_OBJECT_CONNECTOR 0xc0c0c0c0
451#define DRM_MODE_OBJECT_ENCODER 0xe0e0e0e0
452#define DRM_MODE_OBJECT_MODE 0xdededede
453#define DRM_MODE_OBJECT_PROPERTY 0xb0b0b0b0
454#define DRM_MODE_OBJECT_FB 0xfbfbfbfb
455#define DRM_MODE_OBJECT_BLOB 0xbbbbbbbb
456#define DRM_MODE_OBJECT_PLANE 0xeeeeeeee
457#define DRM_MODE_OBJECT_ANY 0
458
459struct drm_mode_obj_get_properties {
460	__u64 props_ptr;
461	__u64 prop_values_ptr;
462	__u32 count_props;
463	__u32 obj_id;
464	__u32 obj_type;
465};
466
467struct drm_mode_obj_set_property {
468	__u64 value;
469	__u32 prop_id;
470	__u32 obj_id;
471	__u32 obj_type;
472};
473
474struct drm_mode_get_blob {
475	__u32 blob_id;
476	__u32 length;
477	__u64 data;
478};
479
480struct drm_mode_fb_cmd {
481	__u32 fb_id;
482	__u32 width;
483	__u32 height;
484	__u32 pitch;
485	__u32 bpp;
486	__u32 depth;
487	/* driver specific handle */
488	__u32 handle;
489};
490
491#define DRM_MODE_FB_INTERLACED	(1<<0) /* for interlaced framebuffers */
492#define DRM_MODE_FB_MODIFIERS	(1<<1) /* enables ->modifer[] */
493
494struct drm_mode_fb_cmd2 {
495	__u32 fb_id;
496	__u32 width;
497	__u32 height;
498	__u32 pixel_format; /* fourcc code from drm_fourcc.h */
499	__u32 flags; /* see above flags */
500
501	/*
502	 * In case of planar formats, this ioctl allows up to 4
503	 * buffer objects with offsets and pitches per plane.
504	 * The pitch and offset order is dictated by the fourcc,
505	 * e.g. NV12 (https://fourcc.org/yuv.php#NV12) is described as:
506	 *
507	 *   YUV 4:2:0 image with a plane of 8 bit Y samples
508	 *   followed by an interleaved U/V plane containing
509	 *   8 bit 2x2 subsampled colour difference samples.
510	 *
511	 * So it would consist of Y as offsets[0] and UV as
512	 * offsets[1].  Note that offsets[0] will generally
513	 * be 0 (but this is not required).
514	 *
515	 * To accommodate tiled, compressed, etc formats, a
516	 * modifier can be specified.  The default value of zero
517	 * indicates "native" format as specified by the fourcc.
518	 * Vendor specific modifier token.  Note that even though
519	 * it looks like we have a modifier per-plane, we in fact
520	 * do not. The modifier for each plane must be identical.
521	 * Thus all combinations of different data layouts for
522	 * multi plane formats must be enumerated as separate
523	 * modifiers.
524	 */
525	__u32 handles[4];
526	__u32 pitches[4]; /* pitch for each plane */
527	__u32 offsets[4]; /* offset of each plane */
528	__u64 modifier[4]; /* ie, tiling, compress */
529};
530
531#define DRM_MODE_FB_DIRTY_ANNOTATE_COPY 0x01
532#define DRM_MODE_FB_DIRTY_ANNOTATE_FILL 0x02
533#define DRM_MODE_FB_DIRTY_FLAGS         0x03
534
535#define DRM_MODE_FB_DIRTY_MAX_CLIPS     256
536
537/*
538 * Mark a region of a framebuffer as dirty.
539 *
540 * Some hardware does not automatically update display contents
541 * as a hardware or software draw to a framebuffer. This ioctl
542 * allows userspace to tell the kernel and the hardware what
543 * regions of the framebuffer have changed.
544 *
545 * The kernel or hardware is free to update more then just the
546 * region specified by the clip rects. The kernel or hardware
547 * may also delay and/or coalesce several calls to dirty into a
548 * single update.
549 *
550 * Userspace may annotate the updates, the annotates are a
551 * promise made by the caller that the change is either a copy
552 * of pixels or a fill of a single color in the region specified.
553 *
554 * If the DRM_MODE_FB_DIRTY_ANNOTATE_COPY flag is given then
555 * the number of updated regions are half of num_clips given,
556 * where the clip rects are paired in src and dst. The width and
557 * height of each one of the pairs must match.
558 *
559 * If the DRM_MODE_FB_DIRTY_ANNOTATE_FILL flag is given the caller
560 * promises that the region specified of the clip rects is filled
561 * completely with a single color as given in the color argument.
562 */
563
564struct drm_mode_fb_dirty_cmd {
565	__u32 fb_id;
566	__u32 flags;
567	__u32 color;
568	__u32 num_clips;
569	__u64 clips_ptr;
570};
571
572struct drm_mode_mode_cmd {
573	__u32 connector_id;
574	struct drm_mode_modeinfo mode;
575};
576
577#define DRM_MODE_CURSOR_BO	0x01
578#define DRM_MODE_CURSOR_MOVE	0x02
579#define DRM_MODE_CURSOR_FLAGS	0x03
580
581/*
582 * depending on the value in flags different members are used.
583 *
584 * CURSOR_BO uses
585 *    crtc_id
586 *    width
587 *    height
588 *    handle - if 0 turns the cursor off
589 *
590 * CURSOR_MOVE uses
591 *    crtc_id
592 *    x
593 *    y
594 */
595struct drm_mode_cursor {
596	__u32 flags;
597	__u32 crtc_id;
598	__s32 x;
599	__s32 y;
600	__u32 width;
601	__u32 height;
602	/* driver specific handle */
603	__u32 handle;
604};
605
606struct drm_mode_cursor2 {
607	__u32 flags;
608	__u32 crtc_id;
609	__s32 x;
610	__s32 y;
611	__u32 width;
612	__u32 height;
613	/* driver specific handle */
614	__u32 handle;
615	__s32 hot_x;
616	__s32 hot_y;
617};
618
619struct drm_mode_crtc_lut {
620	__u32 crtc_id;
621	__u32 gamma_size;
622
623	/* pointers to arrays */
624	__u64 red;
625	__u64 green;
626	__u64 blue;
627};
628
629struct drm_color_ctm {
630	/*
631	 * Conversion matrix in S31.32 sign-magnitude
632	 * (not two's complement!) format.
633	 */
634	__u64 matrix[9];
635};
636
637struct drm_color_lut {
638	/*
639	 * Values are mapped linearly to 0.0 - 1.0 range, with 0x0 == 0.0 and
640	 * 0xffff == 1.0.
641	 */
642	__u16 red;
643	__u16 green;
644	__u16 blue;
645	__u16 reserved;
646};
647
648/**
649 * struct hdr_metadata_infoframe - HDR Metadata Infoframe Data.
650 *
651 * HDR Metadata Infoframe as per CTA 861.G spec. This is expected
652 * to match exactly with the spec.
653 *
654 * Userspace is expected to pass the metadata information as per
655 * the format described in this structure.
656 */
657struct hdr_metadata_infoframe {
658	/**
659	 * @eotf: Electro-Optical Transfer Function (EOTF)
660	 * used in the stream.
661	 */
662	__u8 eotf;
663	/**
664	 * @metadata_type: Static_Metadata_Descriptor_ID.
665	 */
666	__u8 metadata_type;
667	/**
668	 * @display_primaries: Color Primaries of the Data.
669	 * These are coded as unsigned 16-bit values in units of
670	 * 0.00002, where 0x0000 represents zero and 0xC350
671	 * represents 1.0000.
672	 * @display_primaries.x: X cordinate of color primary.
673	 * @display_primaries.y: Y cordinate of color primary.
674	 */
675	struct {
676		__u16 x, y;
677		} display_primaries[3];
678	/**
679	 * @white_point: White Point of Colorspace Data.
680	 * These are coded as unsigned 16-bit values in units of
681	 * 0.00002, where 0x0000 represents zero and 0xC350
682	 * represents 1.0000.
683	 * @white_point.x: X cordinate of whitepoint of color primary.
684	 * @white_point.y: Y cordinate of whitepoint of color primary.
685	 */
686	struct {
687		__u16 x, y;
688		} white_point;
689	/**
690	 * @max_display_mastering_luminance: Max Mastering Display Luminance.
691	 * This value is coded as an unsigned 16-bit value in units of 1 cd/m2,
692	 * where 0x0001 represents 1 cd/m2 and 0xFFFF represents 65535 cd/m2.
693	 */
694	__u16 max_display_mastering_luminance;
695	/**
696	 * @min_display_mastering_luminance: Min Mastering Display Luminance.
697	 * This value is coded as an unsigned 16-bit value in units of
698	 * 0.0001 cd/m2, where 0x0001 represents 0.0001 cd/m2 and 0xFFFF
699	 * represents 6.5535 cd/m2.
700	 */
701	__u16 min_display_mastering_luminance;
702	/**
703	 * @max_cll: Max Content Light Level.
704	 * This value is coded as an unsigned 16-bit value in units of 1 cd/m2,
705	 * where 0x0001 represents 1 cd/m2 and 0xFFFF represents 65535 cd/m2.
706	 */
707	__u16 max_cll;
708	/**
709	 * @max_fall: Max Frame Average Light Level.
710	 * This value is coded as an unsigned 16-bit value in units of 1 cd/m2,
711	 * where 0x0001 represents 1 cd/m2 and 0xFFFF represents 65535 cd/m2.
712	 */
713	__u16 max_fall;
714};
715
716/**
717 * struct hdr_output_metadata - HDR output metadata
718 *
719 * Metadata Information to be passed from userspace
720 */
721struct hdr_output_metadata {
722	/**
723	 * @metadata_type: Static_Metadata_Descriptor_ID.
724	 */
725	__u32 metadata_type;
726	/**
727	 * @hdmi_metadata_type1: HDR Metadata Infoframe.
728	 */
729	union {
730		struct hdr_metadata_infoframe hdmi_metadata_type1;
731	};
732};
733
734#define DRM_MODE_PAGE_FLIP_EVENT 0x01
735#define DRM_MODE_PAGE_FLIP_ASYNC 0x02
736#define DRM_MODE_PAGE_FLIP_TARGET_ABSOLUTE 0x4
737#define DRM_MODE_PAGE_FLIP_TARGET_RELATIVE 0x8
738#define DRM_MODE_PAGE_FLIP_TARGET (DRM_MODE_PAGE_FLIP_TARGET_ABSOLUTE | \
739				   DRM_MODE_PAGE_FLIP_TARGET_RELATIVE)
740#define DRM_MODE_PAGE_FLIP_FLAGS (DRM_MODE_PAGE_FLIP_EVENT | \
741				  DRM_MODE_PAGE_FLIP_ASYNC | \
742				  DRM_MODE_PAGE_FLIP_TARGET)
743
744/*
745 * Request a page flip on the specified crtc.
746 *
747 * This ioctl will ask KMS to schedule a page flip for the specified
748 * crtc.  Once any pending rendering targeting the specified fb (as of
749 * ioctl time) has completed, the crtc will be reprogrammed to display
750 * that fb after the next vertical refresh.  The ioctl returns
751 * immediately, but subsequent rendering to the current fb will block
752 * in the execbuffer ioctl until the page flip happens.  If a page
753 * flip is already pending as the ioctl is called, EBUSY will be
754 * returned.
755 *
756 * Flag DRM_MODE_PAGE_FLIP_EVENT requests that drm sends back a vblank
757 * event (see drm.h: struct drm_event_vblank) when the page flip is
758 * done.  The user_data field passed in with this ioctl will be
759 * returned as the user_data field in the vblank event struct.
760 *
761 * Flag DRM_MODE_PAGE_FLIP_ASYNC requests that the flip happen
762 * 'as soon as possible', meaning that it not delay waiting for vblank.
763 * This may cause tearing on the screen.
764 *
765 * The reserved field must be zero.
766 */
767
768struct drm_mode_crtc_page_flip {
769	__u32 crtc_id;
770	__u32 fb_id;
771	__u32 flags;
772	__u32 reserved;
773	__u64 user_data;
774};
775
776/*
777 * Request a page flip on the specified crtc.
778 *
779 * Same as struct drm_mode_crtc_page_flip, but supports new flags and
780 * re-purposes the reserved field:
781 *
782 * The sequence field must be zero unless either of the
783 * DRM_MODE_PAGE_FLIP_TARGET_ABSOLUTE/RELATIVE flags is specified. When
784 * the ABSOLUTE flag is specified, the sequence field denotes the absolute
785 * vblank sequence when the flip should take effect. When the RELATIVE
786 * flag is specified, the sequence field denotes the relative (to the
787 * current one when the ioctl is called) vblank sequence when the flip
788 * should take effect. NOTE: DRM_IOCTL_WAIT_VBLANK must still be used to
789 * make sure the vblank sequence before the target one has passed before
790 * calling this ioctl. The purpose of the
791 * DRM_MODE_PAGE_FLIP_TARGET_ABSOLUTE/RELATIVE flags is merely to clarify
792 * the target for when code dealing with a page flip runs during a
793 * vertical blank period.
794 */
795
796struct drm_mode_crtc_page_flip_target {
797	__u32 crtc_id;
798	__u32 fb_id;
799	__u32 flags;
800	__u32 sequence;
801	__u64 user_data;
802};
803
804/* create a dumb scanout buffer */
805struct drm_mode_create_dumb {
806	__u32 height;
807	__u32 width;
808	__u32 bpp;
809	__u32 flags;
810	/* handle, pitch, size will be returned */
811	__u32 handle;
812	__u32 pitch;
813	__u64 size;
814};
815
816/* set up for mmap of a dumb scanout buffer */
817struct drm_mode_map_dumb {
818	/** Handle for the object being mapped. */
819	__u32 handle;
820	__u32 pad;
821	/**
822	 * Fake offset to use for subsequent mmap call
823	 *
824	 * This is a fixed-size type for 32/64 compatibility.
825	 */
826	__u64 offset;
827};
828
829struct drm_mode_destroy_dumb {
830	__u32 handle;
831};
832
833/* page-flip flags are valid, plus: */
834#define DRM_MODE_ATOMIC_TEST_ONLY 0x0100
835#define DRM_MODE_ATOMIC_NONBLOCK  0x0200
836#define DRM_MODE_ATOMIC_ALLOW_MODESET 0x0400
837
838#define DRM_MODE_ATOMIC_FLAGS (\
839		DRM_MODE_PAGE_FLIP_EVENT |\
840		DRM_MODE_PAGE_FLIP_ASYNC |\
841		DRM_MODE_ATOMIC_TEST_ONLY |\
842		DRM_MODE_ATOMIC_NONBLOCK |\
843		DRM_MODE_ATOMIC_ALLOW_MODESET)
844
845struct drm_mode_atomic {
846	__u32 flags;
847	__u32 count_objs;
848	__u64 objs_ptr;
849	__u64 count_props_ptr;
850	__u64 props_ptr;
851	__u64 prop_values_ptr;
852	__u64 reserved;
853	__u64 user_data;
854};
855
856struct drm_format_modifier_blob {
857#define FORMAT_BLOB_CURRENT 1
858	/* Version of this blob format */
859	__u32 version;
860
861	/* Flags */
862	__u32 flags;
863
864	/* Number of fourcc formats supported */
865	__u32 count_formats;
866
867	/* Where in this blob the formats exist (in bytes) */
868	__u32 formats_offset;
869
870	/* Number of drm_format_modifiers */
871	__u32 count_modifiers;
872
873	/* Where in this blob the modifiers exist (in bytes) */
874	__u32 modifiers_offset;
875
876	/* __u32 formats[] */
877	/* struct drm_format_modifier modifiers[] */
878};
879
880struct drm_format_modifier {
881	/* Bitmask of formats in get_plane format list this info applies to. The
882	 * offset allows a sliding window of which 64 formats (bits).
883	 *
884	 * Some examples:
885	 * In today's world with < 65 formats, and formats 0, and 2 are
886	 * supported
887	 * 0x0000000000000005
888	 *		  ^-offset = 0, formats = 5
889	 *
890	 * If the number formats grew to 128, and formats 98-102 are
891	 * supported with the modifier:
892	 *
893	 * 0x0000007c00000000 0000000000000000
894	 *		  ^
895	 *		  |__offset = 64, formats = 0x7c00000000
896	 *
897	 */
898	__u64 formats;
899	__u32 offset;
900	__u32 pad;
901
902	/* The modifier that applies to the >get_plane format list bitmask. */
903	__u64 modifier;
904};
905
906/**
907 * struct drm_mode_create_blob - Create New block property
908 * @data: Pointer to data to copy.
909 * @length: Length of data to copy.
910 * @blob_id: new property ID.
911 * Create a new 'blob' data property, copying length bytes from data pointer,
912 * and returning new blob ID.
913 */
914struct drm_mode_create_blob {
915	/** Pointer to data to copy. */
916	__u64 data;
917	/** Length of data to copy. */
918	__u32 length;
919	/** Return: new property ID. */
920	__u32 blob_id;
921};
922
923/**
924 * struct drm_mode_destroy_blob - Destroy user blob
925 * @blob_id: blob_id to destroy
926 * Destroy a user-created blob property.
927 */
928struct drm_mode_destroy_blob {
929	__u32 blob_id;
930};
931
932/**
933 * struct drm_mode_create_lease - Create lease
934 * @object_ids: Pointer to array of object ids.
935 * @object_count: Number of object ids.
936 * @flags: flags for new FD.
937 * @lessee_id: unique identifier for lessee.
938 * @fd: file descriptor to new drm_master file.
939 * Lease mode resources, creating another drm_master.
940 */
941struct drm_mode_create_lease {
942	/** Pointer to array of object ids (__u32) */
943	__u64 object_ids;
944	/** Number of object ids */
945	__u32 object_count;
946	/** flags for new FD (O_CLOEXEC, etc) */
947	__u32 flags;
948
949	/** Return: unique identifier for lessee. */
950	__u32 lessee_id;
951	/** Return: file descriptor to new drm_master file */
952	__u32 fd;
953};
954
955/**
956 * struct drm_mode_list_lessees - List lessees
957 * @count_lessees: Number of lessees.
958 * @pad: pad.
959 * @lessees_ptr: Pointer to lessess.
960 * List lesses from a drm_master
961 */
962struct drm_mode_list_lessees {
963	/** Number of lessees.
964	 * On input, provides length of the array.
965	 * On output, provides total number. No
966	 * more than the input number will be written
967	 * back, so two calls can be used to get
968	 * the size and then the data.
969	 */
970	__u32 count_lessees;
971	__u32 pad;
972
973	/** Pointer to lessees.
974	 * pointer to __u64 array of lessee ids
975	 */
976	__u64 lessees_ptr;
977};
978
979/**
980 * struct drm_mode_get_lease - Get Lease
981 * @count_objects: Number of leased objects.
982 * @pad: pad.
983 * @objects_ptr: Pointer to objects.
984 * Get leased objects
985 */
986struct drm_mode_get_lease {
987	/** Number of leased objects.
988	 * On input, provides length of the array.
989	 * On output, provides total number. No
990	 * more than the input number will be written
991	 * back, so two calls can be used to get
992	 * the size and then the data.
993	 */
994	__u32 count_objects;
995	__u32 pad;
996
997	/** Pointer to objects.
998	 * pointer to __u32 array of object ids
999	 */
1000	__u64 objects_ptr;
1001};
1002
1003/**
1004 * struct drm_mode_revoke_lease - Revoke lease
1005 * @lessee_id: Unique ID of lessee.
1006 * Revoke lease
1007 */
1008struct drm_mode_revoke_lease {
1009	/** Unique ID of lessee
1010	 */
1011	__u32 lessee_id;
1012};
1013
1014/**
1015 * struct drm_mode_rect - Two dimensional rectangle.
1016 * @x1: Horizontal starting coordinate (inclusive).
1017 * @y1: Vertical starting coordinate (inclusive).
1018 * @x2: Horizontal ending coordinate (exclusive).
1019 * @y2: Vertical ending coordinate (exclusive).
1020 *
1021 * With drm subsystem using struct drm_rect to manage rectangular area this
1022 * export it to user-space.
1023 *
1024 * Currently used by drm_mode_atomic blob property FB_DAMAGE_CLIPS.
1025 */
1026struct drm_mode_rect {
1027	__s32 x1;
1028	__s32 y1;
1029	__s32 x2;
1030	__s32 y2;
1031};
1032
1033#if defined(__cplusplus)
1034}
1035#endif
1036
1037#endif
1038