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