drm/ffi/
xf86drm_mode.rs

1/*
2 * Copyright (c) 2007-2008 Tungsten Graphics, Inc., Cedar Park, Texas.
3 * Copyright (c) 2007-2008 Dave Airlie <airlied@linux.ie>
4 * Copyright (c) 2007-2008 Jakob Bornecrantz <wallbraker@gmail.com>
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 * and/or sell copies of the Software, and to permit persons to whom the
11 * Software is furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
22 * IN THE SOFTWARE.
23 *
24 */
25
26use libc::*;
27
28use ffi::drm::*;
29use ffi::drm_mode::*;
30
31/*
32 * This is the interface for modesetting for drm.
33 *
34 * In order to use this interface you must include either <stdint.h> or another
35 * header defining uint32_t, int32_t and uint16_t.
36 *
37 * It aims to provide a randr1.2 compatible interface for modesettings in the
38 * kernel, the interface is also ment to be used by libraries like EGL.
39 *
40 * More information can be found in randrproto.txt which can be found here:
41 * http://gitweb.freedesktop.org/?p=xorg/proto/randrproto.git
42 *
43 * There are some major diffrences to be noted. Unlike the randr1.2 proto you
44 * need to create the memory object of the framebuffer yourself with the ttm
45 * buffer object interface. This object needs to be pinned.
46 */
47
48/* Scaling mode options */
49pub const DRM_MODE_SCALE_NON_GPU: c_int = 0;
50pub const DRM_MODE_SCALE_NO_SCALE: c_int = 2;
51
52/* Dithering mode options */
53pub const DRM_MODE_ENCODER_NONE: c_int = 0;
54pub const DRM_MODE_ENCODER_DAC: c_int = 1;
55pub const DRM_MODE_ENCODER_TMDS: c_int = 2;
56pub const DRM_MODE_ENCODER_LVDS: c_int = 3;
57pub const DRM_MODE_ENCODER_TVDAC: c_int = 4;
58pub const DRM_MODE_ENCODER_VIRTUAL: c_int = 5;
59pub const DRM_MODE_ENCODER_DSI: c_int = 6;
60
61pub const DRM_MODE_SUBCONNECTOR_AUTOMATIC: c_int = 0;
62pub const DRM_MODE_SUBCONNECTOR_UNKNOWN: c_int = 0;
63pub const DRM_MODE_SUBCONNECTOR_DVID: c_int = 3;
64pub const DRM_MODE_SUBCONNECTOR_DVIA: c_int = 4;
65pub const DRM_MODE_SUBCONNECTOR_COMPOSITE: c_int = 5;
66pub const DRM_MODE_SUBCONNECTOR_SVIDEO: c_int = 6;
67pub const DRM_MODE_SUBCONNECTOR_COMPONENT: c_int = 8;
68pub const DRM_MODE_SUBCONNECTOR_SCART: c_int = 9;
69
70pub const DRM_MODE_CONNECTOR_UNKNOWN: c_int = 0;
71pub const DRM_MODE_CONNECTOR_VGA: c_int = 1;
72pub const DRM_MODE_CONNECTOR_DVII: c_int = 2;
73pub const DRM_MODE_CONNECTOR_DVID: c_int = 3;
74pub const DRM_MODE_CONNECTOR_DVIA: c_int = 4;
75pub const DRM_MODE_CONNECTOR_COMPOSITE: c_int = 5;
76pub const DRM_MODE_CONNECTOR_SVIDEO: c_int = 6;
77pub const DRM_MODE_CONNECTOR_LVDS: c_int = 7;
78pub const DRM_MODE_CONNECTOR_COMPONENT: c_int = 8;
79pub const DRM_MODE_CONNECTOR_9PINDIN: c_int = 9;
80pub const DRM_MODE_CONNECTOR_DISPLAYPORT: c_int = 10;
81pub const DRM_MODE_CONNECTOR_HDMIA: c_int = 11;
82pub const DRM_MODE_CONNECTOR_HDMIB: c_int = 12;
83pub const DRM_MODE_CONNECTOR_TV: c_int = 13;
84pub const DRM_MODE_CONNECTOR_EDP: c_int = 14;
85pub const DRM_MODE_CONNECTOR_VIRTUAL: c_int = 15;
86pub const DRM_MODE_CONNECTOR_DSI: c_int = 16;
87
88pub const DRM_MODE_PROP_PENDING: c_int = (1<<0);
89pub const DRM_MODE_PROP_RANGE: c_int = (1<<1);
90pub const DRM_MODE_PROP_IMMUTABLE: c_int = (1<<2);
91pub const DRM_MODE_PROP_ENUM: c_int = (1<<3) /* enumerated type with text strings */;
92pub const DRM_MODE_PROP_BLOB: c_int = (1<<4);
93
94pub const DRM_MODE_CURSOR_BO: c_int = (1<<0);
95pub const DRM_MODE_CURSOR_MOVE: c_int = (1<<1);
96
97/*
98 * Feature defines
99 *
100 * Just because these are defined doesn't mean that the kernel
101 * can do that feature, its just for new code vs old libdrm.
102 */
103pub const DRM_MODE_FEATURE_KMS: c_int = 1;
104pub const DRM_MODE_FEATURE_DIRTYFB: c_int = 1;
105
106#[repr(C)]
107pub struct drmModeRes {
108    pub count_fbs: c_int,
109    pub fbs: *mut uint32_t,
110
111    pub count_crtcs: c_int,
112    pub crtcs: *mut uint32_t,
113
114    pub count_connectors: c_int,
115    pub connectors: *mut uint32_t,
116
117    pub count_encoders: c_int,
118    pub encoders: *mut uint32_t,
119
120    pub min_width: uint32_t,
121    pub max_width: uint32_t,
122    pub min_height: uint32_t,
123    pub max_height: uint32_t
124}
125impl ::std::default::Default for drmModeRes {
126    fn default() -> drmModeRes { unsafe { ::std::mem::zeroed() } }
127}
128
129pub type drmModeResPtr = *mut drmModeRes;
130
131#[repr(C)]
132#[derive(Clone)]
133pub struct drmModeModeInfo {
134    pub clock: uint32_t,
135    pub hdisplay: uint16_t,
136    pub hsync_start: uint16_t,
137    pub hsync_end: uint16_t,
138    pub htotal: uint16_t,
139    pub hskew: uint16_t,
140    pub vdisplay: uint16_t,
141    pub vsync_start: uint16_t,
142    pub vsync_end: uint16_t,
143    pub vtotal: uint16_t,
144    pub vscan: uint16_t,
145    pub vrefresh: uint32_t,
146    pub flags: uint32_t,
147    pub mode_type: uint32_t,
148    pub name: [c_char; DRM_DISPLAY_MODE_LEN as usize]
149}
150impl ::std::default::Default for drmModeModeInfo {
151    fn default() -> drmModeModeInfo { unsafe { ::std::mem::zeroed() } }
152}
153
154pub type drmModeModeInfoPtr = *const drmModeModeInfo;
155
156#[repr(C)]
157pub struct drmModeFB {
158	fb_id: uint32_t,
159	width: uint32_t,
160    height: uint32_t,
161	pitch: uint32_t,
162	bpp: uint32_t,
163	depth: uint32_t,
164	/* driver specific handle */
165	handle: uint32_t
166}
167impl ::std::default::Default for drmModeFB {
168    fn default() -> drmModeFB { unsafe { ::std::mem::zeroed() } }
169}
170
171pub type drmModeFBPtr = *mut drmModeFB;
172
173pub type drmModeClip = drm_clip_rect;
174pub type drmModeClipPtr = *mut drmModeClip;
175
176#[repr(C)]
177pub struct drmModePropertyBlobRes {
178	id: uint32_t,
179	length: uint32_t,
180	data: *mut c_void
181}
182impl ::std::default::Default for drmModePropertyBlobRes {
183    fn default() -> drmModePropertyBlobRes { unsafe { ::std::mem::zeroed() } }
184}
185
186pub type drmModePropertyBlobPtr = *mut drmModePropertyBlobRes;
187
188#[repr(C)]
189pub struct drmModePropertyRes {
190	prop_id: uint32_t,
191	flags: uint32_t,
192	name: [c_char; DRM_PROP_NAME_LEN as usize],
193	count_values: c_int,
194	values: uint64_t, /* store the blob lengths */
195	count_enums: c_int,
196	enums: *mut drm_mode_property_enum,
197	count_blobs: c_int,
198	blob_ids: *mut uint32_t
199}
200impl ::std::default::Default for drmModePropertyRes {
201    fn default() -> drmModePropertyRes { unsafe { ::std::mem::zeroed() } }
202}
203
204pub type drmModePropertyPtr = *mut drmModePropertyRes;
205
206// static __inline int drm_property_type_is(drmModePropertyPtr property,
207// 		uint32_t type)
208// {
209// 	/* instanceof for props.. handles extended type vs original types: */
210// 	if (property->flags & DRM_MODE_PROP_EXTENDED_TYPE)
211// 		return (property->flags & DRM_MODE_PROP_EXTENDED_TYPE) == type;
212// 	return property->flags & type;
213// }
214
215#[repr(C)]
216pub struct drmModeCrtc {
217	pub crtc_id: uint32_t,
218	pub buffer_id: uint32_t, /**< FB id to connect to 0 = disconnect */
219
220	pub x: uint32_t,
221    pub y: uint32_t, /**< Position on the framebuffer */
222	pub width: uint32_t,
223    pub height: uint32_t,
224	pub mode_valid: c_int,
225	pub mode: drmModeModeInfo,
226	pub gamma_size: c_int
227}
228impl ::std::default::Default for drmModeCrtc {
229    fn default() -> drmModeCrtc { unsafe { ::std::mem::zeroed() } }
230}
231
232pub type drmModeCrtcPtr = *mut drmModeCrtc;
233
234#[repr(C)]
235pub struct drmModeEncoder {
236	pub encoder_id: uint32_t,
237	pub encoder_type: uint32_t,
238	pub crtc_id: uint32_t,
239	pub possible_crtcs: uint32_t,
240	pub possible_clones: uint32_t
241}
242impl ::std::default::Default for drmModeEncoder {
243    fn default() -> drmModeEncoder { unsafe { ::std::mem::zeroed() } }
244}
245
246pub type drmModeEncoderPtr = *mut drmModeEncoder;
247
248#[repr(C)]
249pub enum drmModeConnection {
250	DRM_MODE_CONNECTED         = 1,
251	DRM_MODE_DISCONNECTED      = 2,
252	DRM_MODE_UNKNOWNCONNECTION = 3
253}
254
255#[repr(C)]
256pub enum drmModeSubPixel {
257	DRM_MODE_SUBPIXEL_UNKNOWN        = 1,
258	DRM_MODE_SUBPIXEL_HORIZONTAL_RGB = 2,
259	DRM_MODE_SUBPIXEL_HORIZONTAL_BGR = 3,
260	DRM_MODE_SUBPIXEL_VERTICAL_RGB   = 4,
261	DRM_MODE_SUBPIXEL_VERTICAL_BGR   = 5,
262	DRM_MODE_SUBPIXEL_NONE           = 6
263}
264
265#[repr(C)]
266pub struct drmModeConnector {
267	pub connector_id: uint32_t,
268	pub encoder_id: uint32_t, /**< Encoder currently connected to */
269	pub connector_type: uint32_t,
270	pub connector_type_id: uint32_t,
271	pub connection: drmModeConnection,
272	pub mmWidth: uint32_t,
273    pub mmHeight: uint32_t, /**< HxW in millimeters */
274	pub subpixel: drmModeSubPixel,
275
276	pub count_modes: c_int,
277	pub modes: drmModeModeInfoPtr,
278
279	pub count_props: c_int,
280	pub props: *mut uint32_t, /**< List of property ids */
281	pub prop_values: *mut uint64_t, /**< List of property values */
282
283	pub count_encoders: c_int,
284	pub encoders: *mut uint32_t
285}
286impl ::std::default::Default for drmModeConnector {
287    fn default() -> drmModeConnector { unsafe { ::std::mem::zeroed() } }
288}
289
290pub type drmModeConnectorPtr = *mut drmModeConnector;
291
292pub const DRM_PLANE_TYPE_OVERLAY: c_int = 0;
293pub const DRM_PLANE_TYPE_PRIMARY: c_int = 1;
294pub const DRM_PLANE_TYPE_CURSOR: c_int = 2;
295
296#[repr(C)]
297pub struct drmModeObjectProperties {
298	count_props: uint32_t,
299	props: *mut uint32_t,
300	prop_values: *mut uint64_t
301}
302impl ::std::default::Default for drmModeObjectProperties {
303    fn default() -> drmModeObjectProperties { unsafe { ::std::mem::zeroed() } }
304}
305
306pub type drmModeObjectPropertiesPtr = *mut drmModeObjectProperties;
307
308#[repr(C)]
309pub struct drmModePlane {
310	count_formats: uint32_t,
311	formats: *mut uint32_t,
312	plane_id: uint32_t,
313
314	crtc_id: uint32_t,
315	fb_id: uint32_t,
316
317	crtc_x: uint32_t,
318    crtc_y: uint32_t,
319	x: uint32_t,
320    y: uint32_t,
321
322	possible_crtcs: uint32_t,
323	gamma_size: uint32_t
324}
325impl ::std::default::Default for drmModePlane {
326    fn default() -> drmModePlane { unsafe { ::std::mem::zeroed() } }
327}
328
329pub type drmModePlanePtr = *mut drmModePlane;
330
331#[repr(C)]
332pub struct drmModePlaneRes {
333	count_planes: uint32_t,
334	planes: *mut uint32_t
335}
336impl ::std::default::Default for drmModePlaneRes {
337    fn default() -> drmModePlaneRes { unsafe { ::std::mem::zeroed() } }
338}
339
340pub type drmModePlaneResPtr = *mut drmModePlaneRes;
341
342#[repr(C)]
343pub struct _drmModeAtomicReqItem {
344	object_id: uint32_t,
345	property_id: uint32_t,
346	value: uint64_t
347}
348impl ::std::default::Default for _drmModeAtomicReqItem {
349    fn default() -> _drmModeAtomicReqItem { unsafe { ::std::mem::zeroed() } }
350}
351
352
353#[repr(C)]
354pub struct _drmModeAtomicReq {
355	cursor: uint32_t,
356	size_items: uint32_t,
357	items: _drmModeAtomicReqItem
358}
359impl ::std::default::Default for _drmModeAtomicReq {
360    fn default() -> _drmModeAtomicReq { unsafe { ::std::mem::zeroed() } }
361}
362
363
364pub type drmModeAtomicReq = _drmModeAtomicReq;
365pub type drmModeAtomicReqPtr = *mut drmModeAtomicReq;
366
367#[link(name = "drm")]
368#[allow(dead_code)]
369extern {
370    pub fn drmModeFreeModeInfo(ptr: drmModeModeInfoPtr) -> c_void;
371    pub fn drmModeFreeResources(ptr: drmModeResPtr) -> c_void;
372    pub fn drmModeFreeFB(ptr: drmModeFBPtr) -> c_void;
373    pub fn drmModeFreeCrtc(ptr: drmModeCrtcPtr) -> c_void;
374    pub fn drmModeFreeConnector(ptr: drmModeConnectorPtr) -> c_void;
375    pub fn drmModeFreeEncoder(ptr: drmModeEncoderPtr) -> c_void;
376    pub fn drmModeFreePlane(ptr: drmModePlanePtr) -> c_void;
377    pub fn drmModeFreePlaneResources(ptr: drmModePlaneResPtr) -> c_void;
378
379    /**
380    * Retrives all of the resources associated with a card.
381    */
382    pub fn drmModeGetResources(fd: c_int) -> drmModeResPtr;
383
384    /*
385    * FrameBuffer manipulation.
386    */
387
388    /**
389    * Retrive information about framebuffer bufferId
390    */
391    pub fn drmModeGetFB(fd: c_int, bufferId: uint32_t) -> drmModeFBPtr;
392
393    /**
394    * Creates a new framebuffer with an buffer object as its scanout buffer.
395    */
396    pub fn drmModeAddFB(fd: c_int, width: uint32_t, height: uint32_t, depth: uint8_t,
397        bpp: uint8_t, pitch: uint32_t, bo_handle: uint32_t,
398        buf_id: *mut uint32_t) -> c_int;
399
400    /* ...with a specific pixel format */
401    pub fn drmModeAddFB2(fd: c_int, width: uint32_t, height: uint32_t,
402        pixel_format: uint32_t, bo_handles: [uint32_t; 4],
403        pitches: [uint32_t; 4], offsets: [uint32_t; 4],
404        buf_id: *mut uint32_t, flags: uint32_t) -> c_int;
405
406    /**
407    * Destroies the given framebuffer.
408    */
409    pub fn drmModeRmFB(fd: c_int, bufferId: uint32_t) -> c_int;
410
411    /**
412    * Mark a region of a framebuffer as dirty.
413    */
414    pub fn drmModeDirtyFB(fd: c_int, bufferId: uint32_t,
415        clips: drmModeClipPtr, num_clips: uint32_t) -> c_int;
416
417    /*
418    * Crtc functions
419    */
420
421    /**
422    * Retrive information about the ctrt crtcId
423    */
424    pub fn drmModeGetCrtc(fd: c_int, crtcId: uint32_t) -> drmModeCrtcPtr;
425
426    /**
427    * Set the mode on a crtc crtcId with the given mode modeId.
428    */
429    pub fn drmModeSetCrtc(fd: c_int, crtcId: uint32_t, bufferId: uint32_t,
430        x: uint32_t, y: uint32_t, connectors: *const uint32_t, count: c_int,
431        mode: drmModeModeInfoPtr) -> c_int;
432
433    /*
434    * Cursor functions
435    */
436
437    /**
438    * Set the cursor on crtc
439    */
440    pub fn drmModeSetCursor(fd: c_int, crtcId: uint32_t, bo_handle: uint32_t, width: uint32_t,
441        height: uint32_t) -> c_int;
442
443    pub fn drmModeSetCursor2(fd: c_int, crtcId: uint32_t, bo_handle: uint32_t, width: uint32_t,
444        height: uint32_t, hot_x: int32_t, hot_y: int32_t) -> c_int;
445
446    /**
447    * Move the cursor on crtc
448    */
449    pub fn drmModeMoveCursor(fd: c_int, crtcId: uint32_t, x: c_int, y: c_int) -> c_int;
450
451    /**
452    * Encoder functions
453    */
454    pub fn drmModeGetEncoder(fd: c_int, encoder_id: uint32_t) -> drmModeEncoderPtr;
455
456    /*
457    * Connector manipulation
458    */
459
460    /**
461    * Retrieve all information about the connector connectorId. This will do a
462    * forced probe on the connector to retrieve remote information such as EDIDs
463    * from the display device.
464    */
465    pub fn drmModeGetConnector(fd: c_int, connectorId: uint32_t) -> drmModeConnectorPtr;
466
467    /**
468    * Retrieve current information, i.e the currently active mode and encoder,
469    * about the connector connectorId. This will not do any probing on the
470    * connector or remote device, and only reports what is currently known.
471    * For the complete set of modes and encoders associated with the connector
472    * use drmModeGetConnector() which will do a probe to determine any display
473    * link changes first.
474    */
475    pub fn drmModeGetConnectorCurrent(fd: c_int, connector_id: uint32_t) -> drmModeConnectorPtr;
476
477    /**
478    * Attaches the given mode to an connector.
479    */
480    pub fn drmModeAttachMode(fd: c_int, connectorId: uint32_t,
481        mode_info: drmModeModeInfoPtr) -> c_int;
482
483    /**
484    * Detaches a mode from the connector
485    * must be unused, by the given mode.
486    */
487    pub fn drmModeDetachMode(fd: c_int, connectorId: uint32_t,
488        mode_info: drmModeModeInfoPtr) -> c_int;
489
490    pub fn drmModeGetProperty(fd: c_int, propertyId: uint32_t) -> drmModePropertyPtr;
491    pub fn drmModeFreeProperty(ptr: drmModePropertyPtr) -> c_void;
492
493    pub fn drmModeGetPropertyBlob(fd: c_int, blob_id: uint32_t) -> drmModePropertyBlobPtr;
494    pub fn drmModeFreePropertyBlob(ptr: drmModePropertyBlobPtr) -> c_void;
495    pub fn drmModeConnectorSetProperty(fd: c_int, connector_id: uint32_t, property_id: uint32_t,
496        value: uint64_t) -> c_int;
497    pub fn drmCheckModesettingSupported(busid: *const c_char) -> c_int;
498
499    pub fn drmModeCrtcSetGamma(fd: c_int, crtc_id: uint32_t, size: uint32_t,
500        red: *mut uint16_t, green: *mut uint16_t, blue: *mut uint16_t) -> c_int;
501    pub fn drmModeCrtcGetGamma(fd: c_int, crtc_id: uint32_t, size: uint32_t,
502        red: *mut uint16_t, green: *mut uint16_t, blue: *mut uint16_t) -> c_int;
503    pub fn drmModePageFlip(fd: c_int, crtc_id: uint32_t, fb_id: uint32_t,
504        flags: uint32_t, user_data: *const c_void) -> c_int;
505
506    pub fn drmModeGetPlaneResources(fd: c_int) -> drmModePlaneResPtr;
507    pub fn drmModeGetPlane(fd: c_int, plane_id: uint32_t) -> drmModePlanePtr;
508    pub fn drmModeSetPlane(fd: c_int, plane_id: uint32_t, crtc_id: uint32_t,
509        fb_id: uint32_t, flags: uint32_t,
510        crtc_x: int32_t, crtc_y: int32_t,
511        crtc_w: uint32_t, crtc_h: uint32_t,
512        src_x: uint32_t, src_y: uint32_t,
513        src_w: uint32_t, src_h: uint32_t) -> c_int;
514
515    pub fn drmModeObjectGetProperties(fd: c_int,
516        object_id: uint32_t,
517        object_type: uint32_t) -> drmModeObjectPropertiesPtr;
518    pub fn drmModeFreeObjectProperties(ptr: drmModeObjectPropertiesPtr) -> c_void;
519    pub fn drmModeObjectSetProperty(fd: c_int, object_id: uint32_t,
520        object_type: uint32_t, property_id: uint32_t,
521        value: uint64_t) -> c_int;
522
523    pub fn drmModeAtomicAlloc() -> drmModeAtomicReqPtr;
524    pub fn drmModeAtomicDuplicate(req: drmModeAtomicReqPtr) -> drmModeAtomicReqPtr;
525    pub fn drmModeAtomicMerge(base: drmModeAtomicReqPtr,
526        augment: drmModeAtomicReqPtr) -> c_int;
527    pub fn drmModeAtomicFree(req: drmModeAtomicReqPtr) -> c_void;
528    pub fn drmModeAtomicGetCursor(req: drmModeAtomicReqPtr) -> c_int;
529    pub fn drmModeAtomicSetCursor(req: drmModeAtomicReqPtr, cursor: c_int) -> c_void;
530    pub fn drmModeAtomicAddProperty(req: drmModeAtomicReqPtr,
531        object_id: uint32_t,
532        property_id: uint32_t,
533        value: uint64_t) -> c_int;
534    pub fn drmModeAtomicCommit(fd: c_int,
535        req: drmModeAtomicReqPtr,
536        flags: uint32_t,
537        user_data: *mut c_void) -> c_int;
538
539    pub fn drmModeCreatePropertyBlob(fd: c_int, data: *const c_void, size: size_t,
540        id: *mut uint32_t) -> c_int;
541    pub fn drmModeDestroyPropertyBlob(fd: c_int, id: uint32_t) -> c_int;
542}