zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

drm_mode.h (41328B) - Raw


      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)
     33 extern "C" {
     34 #endif
     35 
     36 /**
     37  * DOC: overview
     38  *
     39  * DRM exposes many UAPI and structure definitions to have a consistent
     40  * and standardized interface with users.
     41  * Userspace can refer to these structure definitions and UAPI formats
     42  * to communicate to drivers.
     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 
    221 /**
    222  * struct drm_mode_modeinfo - Display mode information.
    223  * @clock: pixel clock in kHz
    224  * @hdisplay: horizontal display size
    225  * @hsync_start: horizontal sync start
    226  * @hsync_end: horizontal sync end
    227  * @htotal: horizontal total size
    228  * @hskew: horizontal skew
    229  * @vdisplay: vertical display size
    230  * @vsync_start: vertical sync start
    231  * @vsync_end: vertical sync end
    232  * @vtotal: vertical total size
    233  * @vscan: vertical scan
    234  * @vrefresh: approximate vertical refresh rate in Hz
    235  * @flags: bitmask of misc. flags, see DRM_MODE_FLAG_* defines
    236  * @type: bitmask of type flags, see DRM_MODE_TYPE_* defines
    237  * @name: string describing the mode resolution
    238  *
    239  * This is the user-space API display mode information structure. For the
    240  * kernel version see struct drm_display_mode.
    241  */
    242 struct drm_mode_modeinfo {
    243 	__u32 clock;
    244 	__u16 hdisplay;
    245 	__u16 hsync_start;
    246 	__u16 hsync_end;
    247 	__u16 htotal;
    248 	__u16 hskew;
    249 	__u16 vdisplay;
    250 	__u16 vsync_start;
    251 	__u16 vsync_end;
    252 	__u16 vtotal;
    253 	__u16 vscan;
    254 
    255 	__u32 vrefresh;
    256 
    257 	__u32 flags;
    258 	__u32 type;
    259 	char name[DRM_DISPLAY_MODE_LEN];
    260 };
    261 
    262 struct drm_mode_card_res {
    263 	__u64 fb_id_ptr;
    264 	__u64 crtc_id_ptr;
    265 	__u64 connector_id_ptr;
    266 	__u64 encoder_id_ptr;
    267 	__u32 count_fbs;
    268 	__u32 count_crtcs;
    269 	__u32 count_connectors;
    270 	__u32 count_encoders;
    271 	__u32 min_width;
    272 	__u32 max_width;
    273 	__u32 min_height;
    274 	__u32 max_height;
    275 };
    276 
    277 struct drm_mode_crtc {
    278 	__u64 set_connectors_ptr;
    279 	__u32 count_connectors;
    280 
    281 	__u32 crtc_id; /**< Id */
    282 	__u32 fb_id; /**< Id of framebuffer */
    283 
    284 	__u32 x; /**< x Position on the framebuffer */
    285 	__u32 y; /**< y Position on the framebuffer */
    286 
    287 	__u32 gamma_size;
    288 	__u32 mode_valid;
    289 	struct drm_mode_modeinfo mode;
    290 };
    291 
    292 #define DRM_MODE_PRESENT_TOP_FIELD	(1<<0)
    293 #define DRM_MODE_PRESENT_BOTTOM_FIELD	(1<<1)
    294 
    295 /* Planes blend with or override other bits on the CRTC */
    296 struct drm_mode_set_plane {
    297 	__u32 plane_id;
    298 	__u32 crtc_id;
    299 	__u32 fb_id; /* fb object contains surface format type */
    300 	__u32 flags; /* see above flags */
    301 
    302 	/* Signed dest location allows it to be partially off screen */
    303 	__s32 crtc_x;
    304 	__s32 crtc_y;
    305 	__u32 crtc_w;
    306 	__u32 crtc_h;
    307 
    308 	/* Source values are 16.16 fixed point */
    309 	__u32 src_x;
    310 	__u32 src_y;
    311 	__u32 src_h;
    312 	__u32 src_w;
    313 };
    314 
    315 /**
    316  * struct drm_mode_get_plane - Get plane metadata.
    317  *
    318  * Userspace can perform a GETPLANE ioctl to retrieve information about a
    319  * plane.
    320  *
    321  * To retrieve the number of formats supported, set @count_format_types to zero
    322  * and call the ioctl. @count_format_types will be updated with the value.
    323  *
    324  * To retrieve these formats, allocate an array with the memory needed to store
    325  * @count_format_types formats. Point @format_type_ptr to this array and call
    326  * the ioctl again (with @count_format_types still set to the value returned in
    327  * the first ioctl call).
    328  */
    329 struct drm_mode_get_plane {
    330 	/**
    331 	 * @plane_id: Object ID of the plane whose information should be
    332 	 * retrieved. Set by caller.
    333 	 */
    334 	__u32 plane_id;
    335 
    336 	/** @crtc_id: Object ID of the current CRTC. */
    337 	__u32 crtc_id;
    338 	/** @fb_id: Object ID of the current fb. */
    339 	__u32 fb_id;
    340 
    341 	/**
    342 	 * @possible_crtcs: Bitmask of CRTC's compatible with the plane. CRTC's
    343 	 * are created and they receive an index, which corresponds to their
    344 	 * position in the bitmask. Bit N corresponds to
    345 	 * :ref:`CRTC index<crtc_index>` N.
    346 	 */
    347 	__u32 possible_crtcs;
    348 	/** @gamma_size: Never used. */
    349 	__u32 gamma_size;
    350 
    351 	/** @count_format_types: Number of formats. */
    352 	__u32 count_format_types;
    353 	/**
    354 	 * @format_type_ptr: Pointer to ``__u32`` array of formats that are
    355 	 * supported by the plane. These formats do not require modifiers.
    356 	 */
    357 	__u64 format_type_ptr;
    358 };
    359 
    360 struct drm_mode_get_plane_res {
    361 	__u64 plane_id_ptr;
    362 	__u32 count_planes;
    363 };
    364 
    365 #define DRM_MODE_ENCODER_NONE	0
    366 #define DRM_MODE_ENCODER_DAC	1
    367 #define DRM_MODE_ENCODER_TMDS	2
    368 #define DRM_MODE_ENCODER_LVDS	3
    369 #define DRM_MODE_ENCODER_TVDAC	4
    370 #define DRM_MODE_ENCODER_VIRTUAL 5
    371 #define DRM_MODE_ENCODER_DSI	6
    372 #define DRM_MODE_ENCODER_DPMST	7
    373 #define DRM_MODE_ENCODER_DPI	8
    374 
    375 struct drm_mode_get_encoder {
    376 	__u32 encoder_id;
    377 	__u32 encoder_type;
    378 
    379 	__u32 crtc_id; /**< Id of crtc */
    380 
    381 	__u32 possible_crtcs;
    382 	__u32 possible_clones;
    383 };
    384 
    385 /* This is for connectors with multiple signal types. */
    386 /* Try to match DRM_MODE_CONNECTOR_X as closely as possible. */
    387 enum drm_mode_subconnector {
    388 	DRM_MODE_SUBCONNECTOR_Automatic   = 0,  /* DVI-I, TV     */
    389 	DRM_MODE_SUBCONNECTOR_Unknown     = 0,  /* DVI-I, TV, DP */
    390 	DRM_MODE_SUBCONNECTOR_VGA	  = 1,  /*            DP */
    391 	DRM_MODE_SUBCONNECTOR_DVID	  = 3,  /* DVI-I      DP */
    392 	DRM_MODE_SUBCONNECTOR_DVIA	  = 4,  /* DVI-I         */
    393 	DRM_MODE_SUBCONNECTOR_Composite   = 5,  /*        TV     */
    394 	DRM_MODE_SUBCONNECTOR_SVIDEO	  = 6,  /*        TV     */
    395 	DRM_MODE_SUBCONNECTOR_Component   = 8,  /*        TV     */
    396 	DRM_MODE_SUBCONNECTOR_SCART	  = 9,  /*        TV     */
    397 	DRM_MODE_SUBCONNECTOR_DisplayPort = 10, /*            DP */
    398 	DRM_MODE_SUBCONNECTOR_HDMIA       = 11, /*            DP */
    399 	DRM_MODE_SUBCONNECTOR_Native      = 15, /*            DP */
    400 	DRM_MODE_SUBCONNECTOR_Wireless    = 18, /*            DP */
    401 };
    402 
    403 #define DRM_MODE_CONNECTOR_Unknown	0
    404 #define DRM_MODE_CONNECTOR_VGA		1
    405 #define DRM_MODE_CONNECTOR_DVII		2
    406 #define DRM_MODE_CONNECTOR_DVID		3
    407 #define DRM_MODE_CONNECTOR_DVIA		4
    408 #define DRM_MODE_CONNECTOR_Composite	5
    409 #define DRM_MODE_CONNECTOR_SVIDEO	6
    410 #define DRM_MODE_CONNECTOR_LVDS		7
    411 #define DRM_MODE_CONNECTOR_Component	8
    412 #define DRM_MODE_CONNECTOR_9PinDIN	9
    413 #define DRM_MODE_CONNECTOR_DisplayPort	10
    414 #define DRM_MODE_CONNECTOR_HDMIA	11
    415 #define DRM_MODE_CONNECTOR_HDMIB	12
    416 #define DRM_MODE_CONNECTOR_TV		13
    417 #define DRM_MODE_CONNECTOR_eDP		14
    418 #define DRM_MODE_CONNECTOR_VIRTUAL      15
    419 #define DRM_MODE_CONNECTOR_DSI		16
    420 #define DRM_MODE_CONNECTOR_DPI		17
    421 #define DRM_MODE_CONNECTOR_WRITEBACK	18
    422 #define DRM_MODE_CONNECTOR_SPI		19
    423 #define DRM_MODE_CONNECTOR_USB		20
    424 
    425 /**
    426  * struct drm_mode_get_connector - Get connector metadata.
    427  *
    428  * User-space can perform a GETCONNECTOR ioctl to retrieve information about a
    429  * connector. User-space is expected to retrieve encoders, modes and properties
    430  * by performing this ioctl at least twice: the first time to retrieve the
    431  * number of elements, the second time to retrieve the elements themselves.
    432  *
    433  * To retrieve the number of elements, set @count_props and @count_encoders to
    434  * zero, set @count_modes to 1, and set @modes_ptr to a temporary struct
    435  * drm_mode_modeinfo element.
    436  *
    437  * To retrieve the elements, allocate arrays for @encoders_ptr, @modes_ptr,
    438  * @props_ptr and @prop_values_ptr, then set @count_modes, @count_props and
    439  * @count_encoders to their capacity.
    440  *
    441  * Performing the ioctl only twice may be racy: the number of elements may have
    442  * changed with a hotplug event in-between the two ioctls. User-space is
    443  * expected to retry the last ioctl until the number of elements stabilizes.
    444  * The kernel won't fill any array which doesn't have the expected length.
    445  *
    446  * **Force-probing a connector**
    447  *
    448  * If the @count_modes field is set to zero and the DRM client is the current
    449  * DRM master, the kernel will perform a forced probe on the connector to
    450  * refresh the connector status, modes and EDID. A forced-probe can be slow,
    451  * might cause flickering and the ioctl will block.
    452  *
    453  * User-space needs to force-probe connectors to ensure their metadata is
    454  * up-to-date at startup and after receiving a hot-plug event. User-space
    455  * may perform a forced-probe when the user explicitly requests it. User-space
    456  * shouldn't perform a forced-probe in other situations.
    457  */
    458 struct drm_mode_get_connector {
    459 	/** @encoders_ptr: Pointer to ``__u32`` array of object IDs. */
    460 	__u64 encoders_ptr;
    461 	/** @modes_ptr: Pointer to struct drm_mode_modeinfo array. */
    462 	__u64 modes_ptr;
    463 	/** @props_ptr: Pointer to ``__u32`` array of property IDs. */
    464 	__u64 props_ptr;
    465 	/** @prop_values_ptr: Pointer to ``__u64`` array of property values. */
    466 	__u64 prop_values_ptr;
    467 
    468 	/** @count_modes: Number of modes. */
    469 	__u32 count_modes;
    470 	/** @count_props: Number of properties. */
    471 	__u32 count_props;
    472 	/** @count_encoders: Number of encoders. */
    473 	__u32 count_encoders;
    474 
    475 	/** @encoder_id: Object ID of the current encoder. */
    476 	__u32 encoder_id;
    477 	/** @connector_id: Object ID of the connector. */
    478 	__u32 connector_id;
    479 	/**
    480 	 * @connector_type: Type of the connector.
    481 	 *
    482 	 * See DRM_MODE_CONNECTOR_* defines.
    483 	 */
    484 	__u32 connector_type;
    485 	/**
    486 	 * @connector_type_id: Type-specific connector number.
    487 	 *
    488 	 * This is not an object ID. This is a per-type connector number. Each
    489 	 * (type, type_id) combination is unique across all connectors of a DRM
    490 	 * device.
    491 	 *
    492 	 * The (type, type_id) combination is not a stable identifier: the
    493 	 * type_id can change depending on the driver probe order.
    494 	 */
    495 	__u32 connector_type_id;
    496 
    497 	/**
    498 	 * @connection: Status of the connector.
    499 	 *
    500 	 * See enum drm_connector_status.
    501 	 */
    502 	__u32 connection;
    503 	/** @mm_width: Width of the connected sink in millimeters. */
    504 	__u32 mm_width;
    505 	/** @mm_height: Height of the connected sink in millimeters. */
    506 	__u32 mm_height;
    507 	/**
    508 	 * @subpixel: Subpixel order of the connected sink.
    509 	 *
    510 	 * See enum subpixel_order.
    511 	 */
    512 	__u32 subpixel;
    513 
    514 	/** @pad: Padding, must be zero. */
    515 	__u32 pad;
    516 };
    517 
    518 #define DRM_MODE_PROP_PENDING	(1<<0) /* deprecated, do not use */
    519 #define DRM_MODE_PROP_RANGE	(1<<1)
    520 #define DRM_MODE_PROP_IMMUTABLE	(1<<2)
    521 #define DRM_MODE_PROP_ENUM	(1<<3) /* enumerated type with text strings */
    522 #define DRM_MODE_PROP_BLOB	(1<<4)
    523 #define DRM_MODE_PROP_BITMASK	(1<<5) /* bitmask of enumerated types */
    524 
    525 /* non-extended types: legacy bitmask, one bit per type: */
    526 #define DRM_MODE_PROP_LEGACY_TYPE  ( \
    527 		DRM_MODE_PROP_RANGE | \
    528 		DRM_MODE_PROP_ENUM | \
    529 		DRM_MODE_PROP_BLOB | \
    530 		DRM_MODE_PROP_BITMASK)
    531 
    532 /* extended-types: rather than continue to consume a bit per type,
    533  * grab a chunk of the bits to use as integer type id.
    534  */
    535 #define DRM_MODE_PROP_EXTENDED_TYPE	0x0000ffc0
    536 #define DRM_MODE_PROP_TYPE(n)		((n) << 6)
    537 #define DRM_MODE_PROP_OBJECT		DRM_MODE_PROP_TYPE(1)
    538 #define DRM_MODE_PROP_SIGNED_RANGE	DRM_MODE_PROP_TYPE(2)
    539 
    540 /* the PROP_ATOMIC flag is used to hide properties from userspace that
    541  * is not aware of atomic properties.  This is mostly to work around
    542  * older userspace (DDX drivers) that read/write each prop they find,
    543  * without being aware that this could be triggering a lengthy modeset.
    544  */
    545 #define DRM_MODE_PROP_ATOMIC        0x80000000
    546 
    547 /**
    548  * struct drm_mode_property_enum - Description for an enum/bitfield entry.
    549  * @value: numeric value for this enum entry.
    550  * @name: symbolic name for this enum entry.
    551  *
    552  * See struct drm_property_enum for details.
    553  */
    554 struct drm_mode_property_enum {
    555 	__u64 value;
    556 	char name[DRM_PROP_NAME_LEN];
    557 };
    558 
    559 /**
    560  * struct drm_mode_get_property - Get property metadata.
    561  *
    562  * User-space can perform a GETPROPERTY ioctl to retrieve information about a
    563  * property. The same property may be attached to multiple objects, see
    564  * "Modeset Base Object Abstraction".
    565  *
    566  * The meaning of the @values_ptr field changes depending on the property type.
    567  * See &drm_property.flags for more details.
    568  *
    569  * The @enum_blob_ptr and @count_enum_blobs fields are only meaningful when the
    570  * property has the type &DRM_MODE_PROP_ENUM or &DRM_MODE_PROP_BITMASK. For
    571  * backwards compatibility, the kernel will always set @count_enum_blobs to
    572  * zero when the property has the type &DRM_MODE_PROP_BLOB. User-space must
    573  * ignore these two fields if the property has a different type.
    574  *
    575  * User-space is expected to retrieve values and enums by performing this ioctl
    576  * at least twice: the first time to retrieve the number of elements, the
    577  * second time to retrieve the elements themselves.
    578  *
    579  * To retrieve the number of elements, set @count_values and @count_enum_blobs
    580  * to zero, then call the ioctl. @count_values will be updated with the number
    581  * of elements. If the property has the type &DRM_MODE_PROP_ENUM or
    582  * &DRM_MODE_PROP_BITMASK, @count_enum_blobs will be updated as well.
    583  *
    584  * To retrieve the elements themselves, allocate an array for @values_ptr and
    585  * set @count_values to its capacity. If the property has the type
    586  * &DRM_MODE_PROP_ENUM or &DRM_MODE_PROP_BITMASK, allocate an array for
    587  * @enum_blob_ptr and set @count_enum_blobs to its capacity. Calling the ioctl
    588  * again will fill the arrays.
    589  */
    590 struct drm_mode_get_property {
    591 	/** @values_ptr: Pointer to a ``__u64`` array. */
    592 	__u64 values_ptr;
    593 	/** @enum_blob_ptr: Pointer to a struct drm_mode_property_enum array. */
    594 	__u64 enum_blob_ptr;
    595 
    596 	/**
    597 	 * @prop_id: Object ID of the property which should be retrieved. Set
    598 	 * by the caller.
    599 	 */
    600 	__u32 prop_id;
    601 	/**
    602 	 * @flags: ``DRM_MODE_PROP_*`` bitfield. See &drm_property.flags for
    603 	 * a definition of the flags.
    604 	 */
    605 	__u32 flags;
    606 	/**
    607 	 * @name: Symbolic property name. User-space should use this field to
    608 	 * recognize properties.
    609 	 */
    610 	char name[DRM_PROP_NAME_LEN];
    611 
    612 	/** @count_values: Number of elements in @values_ptr. */
    613 	__u32 count_values;
    614 	/** @count_enum_blobs: Number of elements in @enum_blob_ptr. */
    615 	__u32 count_enum_blobs;
    616 };
    617 
    618 struct drm_mode_connector_set_property {
    619 	__u64 value;
    620 	__u32 prop_id;
    621 	__u32 connector_id;
    622 };
    623 
    624 #define DRM_MODE_OBJECT_CRTC 0xcccccccc
    625 #define DRM_MODE_OBJECT_CONNECTOR 0xc0c0c0c0
    626 #define DRM_MODE_OBJECT_ENCODER 0xe0e0e0e0
    627 #define DRM_MODE_OBJECT_MODE 0xdededede
    628 #define DRM_MODE_OBJECT_PROPERTY 0xb0b0b0b0
    629 #define DRM_MODE_OBJECT_FB 0xfbfbfbfb
    630 #define DRM_MODE_OBJECT_BLOB 0xbbbbbbbb
    631 #define DRM_MODE_OBJECT_PLANE 0xeeeeeeee
    632 #define DRM_MODE_OBJECT_ANY 0
    633 
    634 struct drm_mode_obj_get_properties {
    635 	__u64 props_ptr;
    636 	__u64 prop_values_ptr;
    637 	__u32 count_props;
    638 	__u32 obj_id;
    639 	__u32 obj_type;
    640 };
    641 
    642 struct drm_mode_obj_set_property {
    643 	__u64 value;
    644 	__u32 prop_id;
    645 	__u32 obj_id;
    646 	__u32 obj_type;
    647 };
    648 
    649 struct drm_mode_get_blob {
    650 	__u32 blob_id;
    651 	__u32 length;
    652 	__u64 data;
    653 };
    654 
    655 struct drm_mode_fb_cmd {
    656 	__u32 fb_id;
    657 	__u32 width;
    658 	__u32 height;
    659 	__u32 pitch;
    660 	__u32 bpp;
    661 	__u32 depth;
    662 	/* driver specific handle */
    663 	__u32 handle;
    664 };
    665 
    666 #define DRM_MODE_FB_INTERLACED	(1<<0) /* for interlaced framebuffers */
    667 #define DRM_MODE_FB_MODIFIERS	(1<<1) /* enables ->modifier[] */
    668 
    669 /**
    670  * struct drm_mode_fb_cmd2 - Frame-buffer metadata.
    671  *
    672  * This struct holds frame-buffer metadata. There are two ways to use it:
    673  *
    674  * - User-space can fill this struct and perform a &DRM_IOCTL_MODE_ADDFB2
    675  *   ioctl to register a new frame-buffer. The new frame-buffer object ID will
    676  *   be set by the kernel in @fb_id.
    677  * - User-space can set @fb_id and perform a &DRM_IOCTL_MODE_GETFB2 ioctl to
    678  *   fetch metadata about an existing frame-buffer.
    679  *
    680  * In case of planar formats, this struct allows up to 4 buffer objects with
    681  * offsets and pitches per plane. The pitch and offset order are dictated by
    682  * the format FourCC as defined by ``drm_fourcc.h``, e.g. NV12 is described as:
    683  *
    684  *     YUV 4:2:0 image with a plane of 8-bit Y samples followed by an
    685  *     interleaved U/V plane containing 8-bit 2x2 subsampled colour difference
    686  *     samples.
    687  *
    688  * So it would consist of a Y plane at ``offsets[0]`` and a UV plane at
    689  * ``offsets[1]``.
    690  *
    691  * To accommodate tiled, compressed, etc formats, a modifier can be specified.
    692  * For more information see the "Format Modifiers" section. Note that even
    693  * though it looks like we have a modifier per-plane, we in fact do not. The
    694  * modifier for each plane must be identical. Thus all combinations of
    695  * different data layouts for multi-plane formats must be enumerated as
    696  * separate modifiers.
    697  *
    698  * All of the entries in @handles, @pitches, @offsets and @modifier must be
    699  * zero when unused. Warning, for @offsets and @modifier zero can't be used to
    700  * figure out whether the entry is used or not since it's a valid value (a zero
    701  * offset is common, and a zero modifier is &DRM_FORMAT_MOD_LINEAR).
    702  */
    703 struct drm_mode_fb_cmd2 {
    704 	/** @fb_id: Object ID of the frame-buffer. */
    705 	__u32 fb_id;
    706 	/** @width: Width of the frame-buffer. */
    707 	__u32 width;
    708 	/** @height: Height of the frame-buffer. */
    709 	__u32 height;
    710 	/**
    711 	 * @pixel_format: FourCC format code, see ``DRM_FORMAT_*`` constants in
    712 	 * ``drm_fourcc.h``.
    713 	 */
    714 	__u32 pixel_format;
    715 	/**
    716 	 * @flags: Frame-buffer flags (see &DRM_MODE_FB_INTERLACED and
    717 	 * &DRM_MODE_FB_MODIFIERS).
    718 	 */
    719 	__u32 flags;
    720 
    721 	/**
    722 	 * @handles: GEM buffer handle, one per plane. Set to 0 if the plane is
    723 	 * unused. The same handle can be used for multiple planes.
    724 	 */
    725 	__u32 handles[4];
    726 	/** @pitches: Pitch (aka. stride) in bytes, one per plane. */
    727 	__u32 pitches[4];
    728 	/** @offsets: Offset into the buffer in bytes, one per plane. */
    729 	__u32 offsets[4];
    730 	/**
    731 	 * @modifier: Format modifier, one per plane. See ``DRM_FORMAT_MOD_*``
    732 	 * constants in ``drm_fourcc.h``. All planes must use the same
    733 	 * modifier. Ignored unless &DRM_MODE_FB_MODIFIERS is set in @flags.
    734 	 */
    735 	__u64 modifier[4];
    736 };
    737 
    738 #define DRM_MODE_FB_DIRTY_ANNOTATE_COPY 0x01
    739 #define DRM_MODE_FB_DIRTY_ANNOTATE_FILL 0x02
    740 #define DRM_MODE_FB_DIRTY_FLAGS         0x03
    741 
    742 #define DRM_MODE_FB_DIRTY_MAX_CLIPS     256
    743 
    744 /*
    745  * Mark a region of a framebuffer as dirty.
    746  *
    747  * Some hardware does not automatically update display contents
    748  * as a hardware or software draw to a framebuffer. This ioctl
    749  * allows userspace to tell the kernel and the hardware what
    750  * regions of the framebuffer have changed.
    751  *
    752  * The kernel or hardware is free to update more then just the
    753  * region specified by the clip rects. The kernel or hardware
    754  * may also delay and/or coalesce several calls to dirty into a
    755  * single update.
    756  *
    757  * Userspace may annotate the updates, the annotates are a
    758  * promise made by the caller that the change is either a copy
    759  * of pixels or a fill of a single color in the region specified.
    760  *
    761  * If the DRM_MODE_FB_DIRTY_ANNOTATE_COPY flag is given then
    762  * the number of updated regions are half of num_clips given,
    763  * where the clip rects are paired in src and dst. The width and
    764  * height of each one of the pairs must match.
    765  *
    766  * If the DRM_MODE_FB_DIRTY_ANNOTATE_FILL flag is given the caller
    767  * promises that the region specified of the clip rects is filled
    768  * completely with a single color as given in the color argument.
    769  */
    770 
    771 struct drm_mode_fb_dirty_cmd {
    772 	__u32 fb_id;
    773 	__u32 flags;
    774 	__u32 color;
    775 	__u32 num_clips;
    776 	__u64 clips_ptr;
    777 };
    778 
    779 struct drm_mode_mode_cmd {
    780 	__u32 connector_id;
    781 	struct drm_mode_modeinfo mode;
    782 };
    783 
    784 #define DRM_MODE_CURSOR_BO	0x01
    785 #define DRM_MODE_CURSOR_MOVE	0x02
    786 #define DRM_MODE_CURSOR_FLAGS	0x03
    787 
    788 /*
    789  * depending on the value in flags different members are used.
    790  *
    791  * CURSOR_BO uses
    792  *    crtc_id
    793  *    width
    794  *    height
    795  *    handle - if 0 turns the cursor off
    796  *
    797  * CURSOR_MOVE uses
    798  *    crtc_id
    799  *    x
    800  *    y
    801  */
    802 struct drm_mode_cursor {
    803 	__u32 flags;
    804 	__u32 crtc_id;
    805 	__s32 x;
    806 	__s32 y;
    807 	__u32 width;
    808 	__u32 height;
    809 	/* driver specific handle */
    810 	__u32 handle;
    811 };
    812 
    813 struct drm_mode_cursor2 {
    814 	__u32 flags;
    815 	__u32 crtc_id;
    816 	__s32 x;
    817 	__s32 y;
    818 	__u32 width;
    819 	__u32 height;
    820 	/* driver specific handle */
    821 	__u32 handle;
    822 	__s32 hot_x;
    823 	__s32 hot_y;
    824 };
    825 
    826 struct drm_mode_crtc_lut {
    827 	__u32 crtc_id;
    828 	__u32 gamma_size;
    829 
    830 	/* pointers to arrays */
    831 	__u64 red;
    832 	__u64 green;
    833 	__u64 blue;
    834 };
    835 
    836 struct drm_color_ctm {
    837 	/*
    838 	 * Conversion matrix in S31.32 sign-magnitude
    839 	 * (not two's complement!) format.
    840 	 *
    841 	 * out   matrix    in
    842 	 * |R|   |0 1 2|   |R|
    843 	 * |G| = |3 4 5| x |G|
    844 	 * |B|   |6 7 8|   |B|
    845 	 */
    846 	__u64 matrix[9];
    847 };
    848 
    849 struct drm_color_lut {
    850 	/*
    851 	 * Values are mapped linearly to 0.0 - 1.0 range, with 0x0 == 0.0 and
    852 	 * 0xffff == 1.0.
    853 	 */
    854 	__u16 red;
    855 	__u16 green;
    856 	__u16 blue;
    857 	__u16 reserved;
    858 };
    859 
    860 /**
    861  * struct drm_plane_size_hint - Plane size hints
    862  * @width: The width of the plane in pixel
    863  * @height: The height of the plane in pixel
    864  *
    865  * The plane SIZE_HINTS property blob contains an
    866  * array of struct drm_plane_size_hint.
    867  */
    868 struct drm_plane_size_hint {
    869 	__u16 width;
    870 	__u16 height;
    871 };
    872 
    873 /**
    874  * struct hdr_metadata_infoframe - HDR Metadata Infoframe Data.
    875  *
    876  * HDR Metadata Infoframe as per CTA 861.G spec. This is expected
    877  * to match exactly with the spec.
    878  *
    879  * Userspace is expected to pass the metadata information as per
    880  * the format described in this structure.
    881  */
    882 struct hdr_metadata_infoframe {
    883 	/**
    884 	 * @eotf: Electro-Optical Transfer Function (EOTF)
    885 	 * used in the stream.
    886 	 */
    887 	__u8 eotf;
    888 	/**
    889 	 * @metadata_type: Static_Metadata_Descriptor_ID.
    890 	 */
    891 	__u8 metadata_type;
    892 	/**
    893 	 * @display_primaries: Color Primaries of the Data.
    894 	 * These are coded as unsigned 16-bit values in units of
    895 	 * 0.00002, where 0x0000 represents zero and 0xC350
    896 	 * represents 1.0000.
    897 	 * @display_primaries.x: X coordinate of color primary.
    898 	 * @display_primaries.y: Y coordinate of color primary.
    899 	 */
    900 	struct {
    901 		__u16 x, y;
    902 	} display_primaries[3];
    903 	/**
    904 	 * @white_point: White Point of Colorspace Data.
    905 	 * These are coded as unsigned 16-bit values in units of
    906 	 * 0.00002, where 0x0000 represents zero and 0xC350
    907 	 * represents 1.0000.
    908 	 * @white_point.x: X coordinate of whitepoint of color primary.
    909 	 * @white_point.y: Y coordinate of whitepoint of color primary.
    910 	 */
    911 	struct {
    912 		__u16 x, y;
    913 	} white_point;
    914 	/**
    915 	 * @max_display_mastering_luminance: Max Mastering Display Luminance.
    916 	 * This value is coded as an unsigned 16-bit value in units of 1 cd/m2,
    917 	 * where 0x0001 represents 1 cd/m2 and 0xFFFF represents 65535 cd/m2.
    918 	 */
    919 	__u16 max_display_mastering_luminance;
    920 	/**
    921 	 * @min_display_mastering_luminance: Min Mastering Display Luminance.
    922 	 * This value is coded as an unsigned 16-bit value in units of
    923 	 * 0.0001 cd/m2, where 0x0001 represents 0.0001 cd/m2 and 0xFFFF
    924 	 * represents 6.5535 cd/m2.
    925 	 */
    926 	__u16 min_display_mastering_luminance;
    927 	/**
    928 	 * @max_cll: Max Content Light Level.
    929 	 * This value is coded as an unsigned 16-bit value in units of 1 cd/m2,
    930 	 * where 0x0001 represents 1 cd/m2 and 0xFFFF represents 65535 cd/m2.
    931 	 */
    932 	__u16 max_cll;
    933 	/**
    934 	 * @max_fall: Max Frame Average Light Level.
    935 	 * This value is coded as an unsigned 16-bit value in units of 1 cd/m2,
    936 	 * where 0x0001 represents 1 cd/m2 and 0xFFFF represents 65535 cd/m2.
    937 	 */
    938 	__u16 max_fall;
    939 };
    940 
    941 /**
    942  * struct hdr_output_metadata - HDR output metadata
    943  *
    944  * Metadata Information to be passed from userspace
    945  */
    946 struct hdr_output_metadata {
    947 	/**
    948 	 * @metadata_type: Static_Metadata_Descriptor_ID.
    949 	 */
    950 	__u32 metadata_type;
    951 	/**
    952 	 * @hdmi_metadata_type1: HDR Metadata Infoframe.
    953 	 */
    954 	union {
    955 		struct hdr_metadata_infoframe hdmi_metadata_type1;
    956 	};
    957 };
    958 
    959 /**
    960  * DRM_MODE_PAGE_FLIP_EVENT
    961  *
    962  * Request that the kernel sends back a vblank event (see
    963  * struct drm_event_vblank) with the &DRM_EVENT_FLIP_COMPLETE type when the
    964  * page-flip is done.
    965  */
    966 #define DRM_MODE_PAGE_FLIP_EVENT 0x01
    967 /**
    968  * DRM_MODE_PAGE_FLIP_ASYNC
    969  *
    970  * Request that the page-flip is performed as soon as possible, ie. with no
    971  * delay due to waiting for vblank. This may cause tearing to be visible on
    972  * the screen.
    973  *
    974  * When used with atomic uAPI, the driver will return an error if the hardware
    975  * doesn't support performing an asynchronous page-flip for this update.
    976  * User-space should handle this, e.g. by falling back to a regular page-flip.
    977  *
    978  * Note, some hardware might need to perform one last synchronous page-flip
    979  * before being able to switch to asynchronous page-flips. As an exception,
    980  * the driver will return success even though that first page-flip is not
    981  * asynchronous.
    982  */
    983 #define DRM_MODE_PAGE_FLIP_ASYNC 0x02
    984 #define DRM_MODE_PAGE_FLIP_TARGET_ABSOLUTE 0x4
    985 #define DRM_MODE_PAGE_FLIP_TARGET_RELATIVE 0x8
    986 #define DRM_MODE_PAGE_FLIP_TARGET (DRM_MODE_PAGE_FLIP_TARGET_ABSOLUTE | \
    987 				   DRM_MODE_PAGE_FLIP_TARGET_RELATIVE)
    988 /**
    989  * DRM_MODE_PAGE_FLIP_FLAGS
    990  *
    991  * Bitmask of flags suitable for &drm_mode_crtc_page_flip_target.flags.
    992  */
    993 #define DRM_MODE_PAGE_FLIP_FLAGS (DRM_MODE_PAGE_FLIP_EVENT | \
    994 				  DRM_MODE_PAGE_FLIP_ASYNC | \
    995 				  DRM_MODE_PAGE_FLIP_TARGET)
    996 
    997 /*
    998  * Request a page flip on the specified crtc.
    999  *
   1000  * This ioctl will ask KMS to schedule a page flip for the specified
   1001  * crtc.  Once any pending rendering targeting the specified fb (as of
   1002  * ioctl time) has completed, the crtc will be reprogrammed to display
   1003  * that fb after the next vertical refresh.  The ioctl returns
   1004  * immediately, but subsequent rendering to the current fb will block
   1005  * in the execbuffer ioctl until the page flip happens.  If a page
   1006  * flip is already pending as the ioctl is called, EBUSY will be
   1007  * returned.
   1008  *
   1009  * Flag DRM_MODE_PAGE_FLIP_EVENT requests that drm sends back a vblank
   1010  * event (see drm.h: struct drm_event_vblank) when the page flip is
   1011  * done.  The user_data field passed in with this ioctl will be
   1012  * returned as the user_data field in the vblank event struct.
   1013  *
   1014  * Flag DRM_MODE_PAGE_FLIP_ASYNC requests that the flip happen
   1015  * 'as soon as possible', meaning that it not delay waiting for vblank.
   1016  * This may cause tearing on the screen.
   1017  *
   1018  * The reserved field must be zero.
   1019  */
   1020 
   1021 struct drm_mode_crtc_page_flip {
   1022 	__u32 crtc_id;
   1023 	__u32 fb_id;
   1024 	__u32 flags;
   1025 	__u32 reserved;
   1026 	__u64 user_data;
   1027 };
   1028 
   1029 /*
   1030  * Request a page flip on the specified crtc.
   1031  *
   1032  * Same as struct drm_mode_crtc_page_flip, but supports new flags and
   1033  * re-purposes the reserved field:
   1034  *
   1035  * The sequence field must be zero unless either of the
   1036  * DRM_MODE_PAGE_FLIP_TARGET_ABSOLUTE/RELATIVE flags is specified. When
   1037  * the ABSOLUTE flag is specified, the sequence field denotes the absolute
   1038  * vblank sequence when the flip should take effect. When the RELATIVE
   1039  * flag is specified, the sequence field denotes the relative (to the
   1040  * current one when the ioctl is called) vblank sequence when the flip
   1041  * should take effect. NOTE: DRM_IOCTL_WAIT_VBLANK must still be used to
   1042  * make sure the vblank sequence before the target one has passed before
   1043  * calling this ioctl. The purpose of the
   1044  * DRM_MODE_PAGE_FLIP_TARGET_ABSOLUTE/RELATIVE flags is merely to clarify
   1045  * the target for when code dealing with a page flip runs during a
   1046  * vertical blank period.
   1047  */
   1048 
   1049 struct drm_mode_crtc_page_flip_target {
   1050 	__u32 crtc_id;
   1051 	__u32 fb_id;
   1052 	__u32 flags;
   1053 	__u32 sequence;
   1054 	__u64 user_data;
   1055 };
   1056 
   1057 /**
   1058  * struct drm_mode_create_dumb - Create a KMS dumb buffer for scanout.
   1059  * @height: buffer height in pixels
   1060  * @width: buffer width in pixels
   1061  * @bpp: bits per pixel
   1062  * @flags: must be zero
   1063  * @handle: buffer object handle
   1064  * @pitch: number of bytes between two consecutive lines
   1065  * @size: size of the whole buffer in bytes
   1066  *
   1067  * User-space fills @height, @width, @bpp and @flags. If the IOCTL succeeds,
   1068  * the kernel fills @handle, @pitch and @size.
   1069  */
   1070 struct drm_mode_create_dumb {
   1071 	__u32 height;
   1072 	__u32 width;
   1073 	__u32 bpp;
   1074 	__u32 flags;
   1075 
   1076 	__u32 handle;
   1077 	__u32 pitch;
   1078 	__u64 size;
   1079 };
   1080 
   1081 /* set up for mmap of a dumb scanout buffer */
   1082 struct drm_mode_map_dumb {
   1083 	/** Handle for the object being mapped. */
   1084 	__u32 handle;
   1085 	__u32 pad;
   1086 	/**
   1087 	 * Fake offset to use for subsequent mmap call
   1088 	 *
   1089 	 * This is a fixed-size type for 32/64 compatibility.
   1090 	 */
   1091 	__u64 offset;
   1092 };
   1093 
   1094 struct drm_mode_destroy_dumb {
   1095 	__u32 handle;
   1096 };
   1097 
   1098 /**
   1099  * DRM_MODE_ATOMIC_TEST_ONLY
   1100  *
   1101  * Do not apply the atomic commit, instead check whether the hardware supports
   1102  * this configuration.
   1103  *
   1104  * See &drm_mode_config_funcs.atomic_check for more details on test-only
   1105  * commits.
   1106  */
   1107 #define DRM_MODE_ATOMIC_TEST_ONLY 0x0100
   1108 /**
   1109  * DRM_MODE_ATOMIC_NONBLOCK
   1110  *
   1111  * Do not block while applying the atomic commit. The &DRM_IOCTL_MODE_ATOMIC
   1112  * IOCTL returns immediately instead of waiting for the changes to be applied
   1113  * in hardware. Note, the driver will still check that the update can be
   1114  * applied before retuning.
   1115  */
   1116 #define DRM_MODE_ATOMIC_NONBLOCK  0x0200
   1117 /**
   1118  * DRM_MODE_ATOMIC_ALLOW_MODESET
   1119  *
   1120  * Allow the update to result in temporary or transient visible artifacts while
   1121  * the update is being applied. Applying the update may also take significantly
   1122  * more time than a page flip. All visual artifacts will disappear by the time
   1123  * the update is completed, as signalled through the vblank event's timestamp
   1124  * (see struct drm_event_vblank).
   1125  *
   1126  * This flag must be set when the KMS update might cause visible artifacts.
   1127  * Without this flag such KMS update will return a EINVAL error. What kind of
   1128  * update may cause visible artifacts depends on the driver and the hardware.
   1129  * User-space that needs to know beforehand if an update might cause visible
   1130  * artifacts can use &DRM_MODE_ATOMIC_TEST_ONLY without
   1131  * &DRM_MODE_ATOMIC_ALLOW_MODESET to see if it fails.
   1132  *
   1133  * To the best of the driver's knowledge, visual artifacts are guaranteed to
   1134  * not appear when this flag is not set. Some sinks might display visual
   1135  * artifacts outside of the driver's control.
   1136  */
   1137 #define DRM_MODE_ATOMIC_ALLOW_MODESET 0x0400
   1138 
   1139 /**
   1140  * DRM_MODE_ATOMIC_FLAGS
   1141  *
   1142  * Bitfield of flags accepted by the &DRM_IOCTL_MODE_ATOMIC IOCTL in
   1143  * &drm_mode_atomic.flags.
   1144  */
   1145 #define DRM_MODE_ATOMIC_FLAGS (\
   1146 		DRM_MODE_PAGE_FLIP_EVENT |\
   1147 		DRM_MODE_PAGE_FLIP_ASYNC |\
   1148 		DRM_MODE_ATOMIC_TEST_ONLY |\
   1149 		DRM_MODE_ATOMIC_NONBLOCK |\
   1150 		DRM_MODE_ATOMIC_ALLOW_MODESET)
   1151 
   1152 struct drm_mode_atomic {
   1153 	__u32 flags;
   1154 	__u32 count_objs;
   1155 	__u64 objs_ptr;
   1156 	__u64 count_props_ptr;
   1157 	__u64 props_ptr;
   1158 	__u64 prop_values_ptr;
   1159 	__u64 reserved;
   1160 	__u64 user_data;
   1161 };
   1162 
   1163 struct drm_format_modifier_blob {
   1164 #define FORMAT_BLOB_CURRENT 1
   1165 	/* Version of this blob format */
   1166 	__u32 version;
   1167 
   1168 	/* Flags */
   1169 	__u32 flags;
   1170 
   1171 	/* Number of fourcc formats supported */
   1172 	__u32 count_formats;
   1173 
   1174 	/* Where in this blob the formats exist (in bytes) */
   1175 	__u32 formats_offset;
   1176 
   1177 	/* Number of drm_format_modifiers */
   1178 	__u32 count_modifiers;
   1179 
   1180 	/* Where in this blob the modifiers exist (in bytes) */
   1181 	__u32 modifiers_offset;
   1182 
   1183 	/* __u32 formats[] */
   1184 	/* struct drm_format_modifier modifiers[] */
   1185 };
   1186 
   1187 struct drm_format_modifier {
   1188 	/* Bitmask of formats in get_plane format list this info applies to. The
   1189 	 * offset allows a sliding window of which 64 formats (bits).
   1190 	 *
   1191 	 * Some examples:
   1192 	 * In today's world with < 65 formats, and formats 0, and 2 are
   1193 	 * supported
   1194 	 * 0x0000000000000005
   1195 	 *		  ^-offset = 0, formats = 5
   1196 	 *
   1197 	 * If the number formats grew to 128, and formats 98-102 are
   1198 	 * supported with the modifier:
   1199 	 *
   1200 	 * 0x0000007c00000000 0000000000000000
   1201 	 *		  ^
   1202 	 *		  |__offset = 64, formats = 0x7c00000000
   1203 	 *
   1204 	 */
   1205 	__u64 formats;
   1206 	__u32 offset;
   1207 	__u32 pad;
   1208 
   1209 	/* The modifier that applies to the >get_plane format list bitmask. */
   1210 	__u64 modifier;
   1211 };
   1212 
   1213 /**
   1214  * struct drm_mode_create_blob - Create New blob property
   1215  *
   1216  * Create a new 'blob' data property, copying length bytes from data pointer,
   1217  * and returning new blob ID.
   1218  */
   1219 struct drm_mode_create_blob {
   1220 	/** @data: Pointer to data to copy. */
   1221 	__u64 data;
   1222 	/** @length: Length of data to copy. */
   1223 	__u32 length;
   1224 	/** @blob_id: Return: new property ID. */
   1225 	__u32 blob_id;
   1226 };
   1227 
   1228 /**
   1229  * struct drm_mode_destroy_blob - Destroy user blob
   1230  * @blob_id: blob_id to destroy
   1231  *
   1232  * Destroy a user-created blob property.
   1233  *
   1234  * User-space can release blobs as soon as they do not need to refer to them by
   1235  * their blob object ID.  For instance, if you are using a MODE_ID blob in an
   1236  * atomic commit and you will not make another commit re-using the same ID, you
   1237  * can destroy the blob as soon as the commit has been issued, without waiting
   1238  * for it to complete.
   1239  */
   1240 struct drm_mode_destroy_blob {
   1241 	__u32 blob_id;
   1242 };
   1243 
   1244 /**
   1245  * struct drm_mode_create_lease - Create lease
   1246  *
   1247  * Lease mode resources, creating another drm_master.
   1248  *
   1249  * The @object_ids array must reference at least one CRTC, one connector and
   1250  * one plane if &DRM_CLIENT_CAP_UNIVERSAL_PLANES is enabled. Alternatively,
   1251  * the lease can be completely empty.
   1252  */
   1253 struct drm_mode_create_lease {
   1254 	/** @object_ids: Pointer to array of object ids (__u32) */
   1255 	__u64 object_ids;
   1256 	/** @object_count: Number of object ids */
   1257 	__u32 object_count;
   1258 	/** @flags: flags for new FD (O_CLOEXEC, etc) */
   1259 	__u32 flags;
   1260 
   1261 	/** @lessee_id: Return: unique identifier for lessee. */
   1262 	__u32 lessee_id;
   1263 	/** @fd: Return: file descriptor to new drm_master file */
   1264 	__u32 fd;
   1265 };
   1266 
   1267 /**
   1268  * struct drm_mode_list_lessees - List lessees
   1269  *
   1270  * List lesses from a drm_master.
   1271  */
   1272 struct drm_mode_list_lessees {
   1273 	/**
   1274 	 * @count_lessees: Number of lessees.
   1275 	 *
   1276 	 * On input, provides length of the array.
   1277 	 * On output, provides total number. No
   1278 	 * more than the input number will be written
   1279 	 * back, so two calls can be used to get
   1280 	 * the size and then the data.
   1281 	 */
   1282 	__u32 count_lessees;
   1283 	/** @pad: Padding. */
   1284 	__u32 pad;
   1285 
   1286 	/**
   1287 	 * @lessees_ptr: Pointer to lessees.
   1288 	 *
   1289 	 * Pointer to __u64 array of lessee ids
   1290 	 */
   1291 	__u64 lessees_ptr;
   1292 };
   1293 
   1294 /**
   1295  * struct drm_mode_get_lease - Get Lease
   1296  *
   1297  * Get leased objects.
   1298  */
   1299 struct drm_mode_get_lease {
   1300 	/**
   1301 	 * @count_objects: Number of leased objects.
   1302 	 *
   1303 	 * On input, provides length of the array.
   1304 	 * On output, provides total number. No
   1305 	 * more than the input number will be written
   1306 	 * back, so two calls can be used to get
   1307 	 * the size and then the data.
   1308 	 */
   1309 	__u32 count_objects;
   1310 	/** @pad: Padding. */
   1311 	__u32 pad;
   1312 
   1313 	/**
   1314 	 * @objects_ptr: Pointer to objects.
   1315 	 *
   1316 	 * Pointer to __u32 array of object ids.
   1317 	 */
   1318 	__u64 objects_ptr;
   1319 };
   1320 
   1321 /**
   1322  * struct drm_mode_revoke_lease - Revoke lease
   1323  */
   1324 struct drm_mode_revoke_lease {
   1325 	/** @lessee_id: Unique ID of lessee */
   1326 	__u32 lessee_id;
   1327 };
   1328 
   1329 /**
   1330  * struct drm_mode_rect - Two dimensional rectangle.
   1331  * @x1: Horizontal starting coordinate (inclusive).
   1332  * @y1: Vertical starting coordinate (inclusive).
   1333  * @x2: Horizontal ending coordinate (exclusive).
   1334  * @y2: Vertical ending coordinate (exclusive).
   1335  *
   1336  * With drm subsystem using struct drm_rect to manage rectangular area this
   1337  * export it to user-space.
   1338  *
   1339  * Currently used by drm_mode_atomic blob property FB_DAMAGE_CLIPS.
   1340  */
   1341 struct drm_mode_rect {
   1342 	__s32 x1;
   1343 	__s32 y1;
   1344 	__s32 x2;
   1345 	__s32 y2;
   1346 };
   1347 
   1348 /**
   1349  * struct drm_mode_closefb
   1350  * @fb_id: Framebuffer ID.
   1351  * @pad: Must be zero.
   1352  */
   1353 struct drm_mode_closefb {
   1354 	__u32 fb_id;
   1355 	__u32 pad;
   1356 };
   1357 
   1358 #if defined(__cplusplus)
   1359 }
   1360 #endif
   1361 
   1362 #endif