1 | /*
|
---|
2 | * \file xf86drmMode.h
|
---|
3 | * Header for DRM modesetting interface.
|
---|
4 | *
|
---|
5 | * \author Jakob Bornecrantz <wallbraker@gmail.com>
|
---|
6 | *
|
---|
7 | * \par Acknowledgements:
|
---|
8 | * Feb 2007, Dave Airlie <airlied@linux.ie>
|
---|
9 | */
|
---|
10 |
|
---|
11 | /*
|
---|
12 | * Copyright (c) 2007-2008 Tungsten Graphics, Inc., Cedar Park, Texas.
|
---|
13 | * Copyright (c) 2007-2008 Dave Airlie <airlied@linux.ie>
|
---|
14 | * Copyright (c) 2007-2008 Jakob Bornecrantz <wallbraker@gmail.com>
|
---|
15 | *
|
---|
16 | * Permission is hereby granted, free of charge, to any person obtaining a
|
---|
17 | * copy of this software and associated documentation files (the "Software"),
|
---|
18 | * to deal in the Software without restriction, including without limitation
|
---|
19 | * the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
---|
20 | * and/or sell copies of the Software, and to permit persons to whom the
|
---|
21 | * Software is furnished to do so, subject to the following conditions:
|
---|
22 | *
|
---|
23 | * The above copyright notice and this permission notice shall be included in
|
---|
24 | * all copies or substantial portions of the Software.
|
---|
25 | *
|
---|
26 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
---|
27 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
---|
28 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
---|
29 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
---|
30 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
---|
31 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
---|
32 | * IN THE SOFTWARE.
|
---|
33 | *
|
---|
34 | */
|
---|
35 |
|
---|
36 | #include <drm.h>
|
---|
37 |
|
---|
38 | /*
|
---|
39 | * This is the interface for modesetting for drm.
|
---|
40 | *
|
---|
41 | * In order to use this interface you must include either <stdint.h> or another
|
---|
42 | * header defining uint32_t, int32_t and uint16_t.
|
---|
43 | *
|
---|
44 | * It aims to provide a randr1.2 compatible interface for modesettings in the
|
---|
45 | * kernel, the interface is also ment to be used by libraries like EGL.
|
---|
46 | *
|
---|
47 | * More information can be found in randrproto.txt which can be found here:
|
---|
48 | * http://gitweb.freedesktop.org/?p=xorg/proto/randrproto.git
|
---|
49 | *
|
---|
50 | * There are some major diffrences to be noted. Unlike the randr1.2 proto you
|
---|
51 | * need to create the memory object of the framebuffer yourself with the ttm
|
---|
52 | * buffer object interface. This object needs to be pinned.
|
---|
53 | */
|
---|
54 |
|
---|
55 | /*
|
---|
56 | * If we pickup an old version of drm.h which doesn't include drm_mode.h
|
---|
57 | * we should redefine defines. This is so that builds doesn't breaks with
|
---|
58 | * new libdrm on old kernels.
|
---|
59 | */
|
---|
60 | #ifndef _DRM_MODE_H
|
---|
61 |
|
---|
62 | #define DRM_DISPLAY_INFO_LEN 32
|
---|
63 | #define DRM_CONNECTOR_NAME_LEN 32
|
---|
64 | #define DRM_DISPLAY_MODE_LEN 32
|
---|
65 | #define DRM_PROP_NAME_LEN 32
|
---|
66 |
|
---|
67 | #define DRM_MODE_TYPE_BUILTIN (1<<0)
|
---|
68 | #define DRM_MODE_TYPE_CLOCK_C ((1<<1) | DRM_MODE_TYPE_BUILTIN)
|
---|
69 | #define DRM_MODE_TYPE_CRTC_C ((1<<2) | DRM_MODE_TYPE_BUILTIN)
|
---|
70 | #define DRM_MODE_TYPE_PREFERRED (1<<3)
|
---|
71 | #define DRM_MODE_TYPE_DEFAULT (1<<4)
|
---|
72 | #define DRM_MODE_TYPE_USERDEF (1<<5)
|
---|
73 | #define DRM_MODE_TYPE_DRIVER (1<<6)
|
---|
74 |
|
---|
75 | /* Video mode flags */
|
---|
76 | /* bit compatible with the xorg definitions. */
|
---|
77 | #define DRM_MODE_FLAG_PHSYNC (1<<0)
|
---|
78 | #define DRM_MODE_FLAG_NHSYNC (1<<1)
|
---|
79 | #define DRM_MODE_FLAG_PVSYNC (1<<2)
|
---|
80 | #define DRM_MODE_FLAG_NVSYNC (1<<3)
|
---|
81 | #define DRM_MODE_FLAG_INTERLACE (1<<4)
|
---|
82 | #define DRM_MODE_FLAG_DBLSCAN (1<<5)
|
---|
83 | #define DRM_MODE_FLAG_CSYNC (1<<6)
|
---|
84 | #define DRM_MODE_FLAG_PCSYNC (1<<7)
|
---|
85 | #define DRM_MODE_FLAG_NCSYNC (1<<8)
|
---|
86 | #define DRM_MODE_FLAG_HSKEW (1<<9) /* hskew provided */
|
---|
87 | #define DRM_MODE_FLAG_BCAST (1<<10)
|
---|
88 | #define DRM_MODE_FLAG_PIXMUX (1<<11)
|
---|
89 | #define DRM_MODE_FLAG_DBLCLK (1<<12)
|
---|
90 | #define DRM_MODE_FLAG_CLKDIV2 (1<<13)
|
---|
91 |
|
---|
92 | /* DPMS flags */
|
---|
93 | /* bit compatible with the xorg definitions. */
|
---|
94 | #define DRM_MODE_DPMS_ON 0
|
---|
95 | #define DRM_MODE_DPMS_STANDBY 1
|
---|
96 | #define DRM_MODE_DPMS_SUSPEND 2
|
---|
97 | #define DRM_MODE_DPMS_OFF 3
|
---|
98 |
|
---|
99 | /* Scaling mode options */
|
---|
100 | #define DRM_MODE_SCALE_NON_GPU 0
|
---|
101 | #define DRM_MODE_SCALE_FULLSCREEN 1
|
---|
102 | #define DRM_MODE_SCALE_NO_SCALE 2
|
---|
103 | #define DRM_MODE_SCALE_ASPECT 3
|
---|
104 |
|
---|
105 | /* Dithering mode options */
|
---|
106 | #define DRM_MODE_DITHERING_OFF 0
|
---|
107 | #define DRM_MODE_DITHERING_ON 1
|
---|
108 |
|
---|
109 | #define DRM_MODE_ENCODER_NONE 0
|
---|
110 | #define DRM_MODE_ENCODER_DAC 1
|
---|
111 | #define DRM_MODE_ENCODER_TMDS 2
|
---|
112 | #define DRM_MODE_ENCODER_LVDS 3
|
---|
113 | #define DRM_MODE_ENCODER_TVDAC 4
|
---|
114 |
|
---|
115 | #define DRM_MODE_SUBCONNECTOR_Automatic 0
|
---|
116 | #define DRM_MODE_SUBCONNECTOR_Unknown 0
|
---|
117 | #define DRM_MODE_SUBCONNECTOR_DVID 3
|
---|
118 | #define DRM_MODE_SUBCONNECTOR_DVIA 4
|
---|
119 | #define DRM_MODE_SUBCONNECTOR_Composite 5
|
---|
120 | #define DRM_MODE_SUBCONNECTOR_SVIDEO 6
|
---|
121 | #define DRM_MODE_SUBCONNECTOR_Component 8
|
---|
122 |
|
---|
123 | #define DRM_MODE_CONNECTOR_Unknown 0
|
---|
124 | #define DRM_MODE_CONNECTOR_VGA 1
|
---|
125 | #define DRM_MODE_CONNECTOR_DVII 2
|
---|
126 | #define DRM_MODE_CONNECTOR_DVID 3
|
---|
127 | #define DRM_MODE_CONNECTOR_DVIA 4
|
---|
128 | #define DRM_MODE_CONNECTOR_Composite 5
|
---|
129 | #define DRM_MODE_CONNECTOR_SVIDEO 6
|
---|
130 | #define DRM_MODE_CONNECTOR_LVDS 7
|
---|
131 | #define DRM_MODE_CONNECTOR_Component 8
|
---|
132 | #define DRM_MODE_CONNECTOR_9PinDIN 9
|
---|
133 | #define DRM_MODE_CONNECTOR_DisplayPort 10
|
---|
134 | #define DRM_MODE_CONNECTOR_HDMIA 11
|
---|
135 | #define DRM_MODE_CONNECTOR_HDMIB 12
|
---|
136 |
|
---|
137 | #define DRM_MODE_PROP_PENDING (1<<0)
|
---|
138 | #define DRM_MODE_PROP_RANGE (1<<1)
|
---|
139 | #define DRM_MODE_PROP_IMMUTABLE (1<<2)
|
---|
140 | #define DRM_MODE_PROP_ENUM (1<<3) /* enumerated type with text strings */
|
---|
141 | #define DRM_MODE_PROP_BLOB (1<<4)
|
---|
142 |
|
---|
143 | #define DRM_MODE_CURSOR_BO (1<<0)
|
---|
144 | #define DRM_MODE_CURSOR_MOVE (1<<1)
|
---|
145 |
|
---|
146 | #endif /* _DRM_MODE_H */
|
---|
147 |
|
---|
148 | typedef struct _drmModeRes {
|
---|
149 |
|
---|
150 | int count_fbs;
|
---|
151 | uint32_t *fbs;
|
---|
152 |
|
---|
153 | int count_crtcs;
|
---|
154 | uint32_t *crtcs;
|
---|
155 |
|
---|
156 | int count_connectors;
|
---|
157 | uint32_t *connectors;
|
---|
158 |
|
---|
159 | int count_encoders;
|
---|
160 | uint32_t *encoders;
|
---|
161 |
|
---|
162 | uint32_t min_width, max_width;
|
---|
163 | uint32_t min_height, max_height;
|
---|
164 | } drmModeRes, *drmModeResPtr;
|
---|
165 |
|
---|
166 | typedef struct _drmModeModeInfo {
|
---|
167 | uint32_t clock;
|
---|
168 | uint16_t hdisplay, hsync_start, hsync_end, htotal, hskew;
|
---|
169 | uint16_t vdisplay, vsync_start, vsync_end, vtotal, vscan;
|
---|
170 |
|
---|
171 | uint32_t vrefresh; /* vertical refresh * 1000 */
|
---|
172 |
|
---|
173 | uint32_t flags;
|
---|
174 | uint32_t type;
|
---|
175 | char name[DRM_DISPLAY_MODE_LEN];
|
---|
176 | } drmModeModeInfo, *drmModeModeInfoPtr;
|
---|
177 |
|
---|
178 | typedef struct _drmModeFB {
|
---|
179 | uint32_t fb_id;
|
---|
180 | uint32_t width, height;
|
---|
181 | uint32_t pitch;
|
---|
182 | uint32_t bpp;
|
---|
183 | uint32_t depth;
|
---|
184 | /* driver specific handle */
|
---|
185 | uint32_t handle;
|
---|
186 | } drmModeFB, *drmModeFBPtr;
|
---|
187 |
|
---|
188 | typedef struct _drmModePropertyBlob {
|
---|
189 | uint32_t id;
|
---|
190 | uint32_t length;
|
---|
191 | void *data;
|
---|
192 | } drmModePropertyBlobRes, *drmModePropertyBlobPtr;
|
---|
193 |
|
---|
194 | typedef struct _drmModeProperty {
|
---|
195 | uint32_t prop_id;
|
---|
196 | uint32_t flags;
|
---|
197 | char name[DRM_PROP_NAME_LEN];
|
---|
198 | int count_values;
|
---|
199 | uint64_t *values; // store the blob lengths
|
---|
200 | int count_enums;
|
---|
201 | struct drm_mode_property_enum *enums;
|
---|
202 | int count_blobs;
|
---|
203 | uint32_t *blob_ids; // store the blob IDs
|
---|
204 | } drmModePropertyRes, *drmModePropertyPtr;
|
---|
205 |
|
---|
206 | typedef struct _drmModeCrtc {
|
---|
207 | uint32_t crtc_id;
|
---|
208 | uint32_t buffer_id; /**< FB id to connect to 0 = disconnect */
|
---|
209 |
|
---|
210 | uint32_t x, y; /**< Position on the framebuffer */
|
---|
211 | uint32_t width, height;
|
---|
212 | int mode_valid;
|
---|
213 | drmModeModeInfo mode;
|
---|
214 |
|
---|
215 | int gamma_size; /**< Number of gamma stops */
|
---|
216 |
|
---|
217 | } drmModeCrtc, *drmModeCrtcPtr;
|
---|
218 |
|
---|
219 | typedef struct _drmModeEncoder {
|
---|
220 | uint32_t encoder_id;
|
---|
221 | uint32_t encoder_type;
|
---|
222 | uint32_t crtc_id;
|
---|
223 | uint32_t possible_crtcs;
|
---|
224 | uint32_t possible_clones;
|
---|
225 | } drmModeEncoder, *drmModeEncoderPtr;
|
---|
226 |
|
---|
227 | typedef enum {
|
---|
228 | DRM_MODE_CONNECTED = 1,
|
---|
229 | DRM_MODE_DISCONNECTED = 2,
|
---|
230 | DRM_MODE_UNKNOWNCONNECTION = 3
|
---|
231 | } drmModeConnection;
|
---|
232 |
|
---|
233 | typedef enum {
|
---|
234 | DRM_MODE_SUBPIXEL_UNKNOWN = 1,
|
---|
235 | DRM_MODE_SUBPIXEL_HORIZONTAL_RGB = 2,
|
---|
236 | DRM_MODE_SUBPIXEL_HORIZONTAL_BGR = 3,
|
---|
237 | DRM_MODE_SUBPIXEL_VERTICAL_RGB = 4,
|
---|
238 | DRM_MODE_SUBPIXEL_VERTICAL_BGR = 5,
|
---|
239 | DRM_MODE_SUBPIXEL_NONE = 6
|
---|
240 | } drmModeSubPixel;
|
---|
241 |
|
---|
242 | typedef struct _drmModeConnector {
|
---|
243 | uint32_t connector_id;
|
---|
244 | uint32_t encoder_id; /**< Encoder currently connected to */
|
---|
245 | uint32_t connector_type;
|
---|
246 | uint32_t connector_type_id;
|
---|
247 | drmModeConnection connection;
|
---|
248 | uint32_t mmWidth, mmHeight; /**< HxW in millimeters */
|
---|
249 | drmModeSubPixel subpixel;
|
---|
250 |
|
---|
251 | int count_modes;
|
---|
252 | drmModeModeInfoPtr modes;
|
---|
253 |
|
---|
254 | int count_props;
|
---|
255 | uint32_t *props; /**< List of property ids */
|
---|
256 | uint64_t *prop_values; /**< List of property values */
|
---|
257 |
|
---|
258 | int count_encoders;
|
---|
259 | uint32_t *encoders; /**< List of encoder ids */
|
---|
260 | } drmModeConnector, *drmModeConnectorPtr;
|
---|
261 |
|
---|
262 |
|
---|
263 |
|
---|
264 | extern void drmModeFreeModeInfo( drmModeModeInfoPtr ptr );
|
---|
265 | extern void drmModeFreeResources( drmModeResPtr ptr );
|
---|
266 | extern void drmModeFreeFB( drmModeFBPtr ptr );
|
---|
267 | extern void drmModeFreeCrtc( drmModeCrtcPtr ptr );
|
---|
268 | extern void drmModeFreeConnector( drmModeConnectorPtr ptr );
|
---|
269 | extern void drmModeFreeEncoder( drmModeEncoderPtr ptr );
|
---|
270 |
|
---|
271 | /**
|
---|
272 | * Retrives all of the resources associated with a card.
|
---|
273 | */
|
---|
274 | extern drmModeResPtr drmModeGetResources(int fd);
|
---|
275 |
|
---|
276 | /*
|
---|
277 | * FrameBuffer manipulation.
|
---|
278 | */
|
---|
279 |
|
---|
280 | /**
|
---|
281 | * Retrive information about framebuffer bufferId
|
---|
282 | */
|
---|
283 | extern drmModeFBPtr drmModeGetFB(int fd, uint32_t bufferId);
|
---|
284 |
|
---|
285 | /**
|
---|
286 | * Creates a new framebuffer with an buffer object as its scanout buffer.
|
---|
287 | */
|
---|
288 | extern int drmModeAddFB(int fd, uint32_t width, uint32_t height, uint8_t depth,
|
---|
289 | uint8_t bpp, uint32_t pitch, uint32_t bo_handle,
|
---|
290 | uint32_t *buf_id);
|
---|
291 | /**
|
---|
292 | * Destroies the given framebuffer.
|
---|
293 | */
|
---|
294 | extern int drmModeRmFB(int fd, uint32_t bufferId);
|
---|
295 |
|
---|
296 | /*
|
---|
297 | * Crtc functions
|
---|
298 | */
|
---|
299 |
|
---|
300 | /**
|
---|
301 | * Retrive information about the ctrt crtcId
|
---|
302 | */
|
---|
303 | extern drmModeCrtcPtr drmModeGetCrtc(int fd, uint32_t crtcId);
|
---|
304 |
|
---|
305 | /**
|
---|
306 | * Set the mode on a crtc crtcId with the given mode modeId.
|
---|
307 | */
|
---|
308 | int drmModeSetCrtc(int fd, uint32_t crtcId, uint32_t bufferId,
|
---|
309 | uint32_t x, uint32_t y, uint32_t *connectors, int count,
|
---|
310 | drmModeModeInfoPtr mode);
|
---|
311 |
|
---|
312 | /*
|
---|
313 | * Cursor functions
|
---|
314 | */
|
---|
315 |
|
---|
316 | /**
|
---|
317 | * Set the cursor on crtc
|
---|
318 | */
|
---|
319 | int drmModeSetCursor(int fd, uint32_t crtcId, uint32_t bo_handle, uint32_t width, uint32_t height);
|
---|
320 |
|
---|
321 | /**
|
---|
322 | * Move the cursor on crtc
|
---|
323 | */
|
---|
324 | int drmModeMoveCursor(int fd, uint32_t crtcId, int x, int y);
|
---|
325 |
|
---|
326 | /**
|
---|
327 | * Encoder functions
|
---|
328 | */
|
---|
329 | drmModeEncoderPtr drmModeGetEncoder(int fd, uint32_t encoder_id);
|
---|
330 |
|
---|
331 | /*
|
---|
332 | * Connector manipulation
|
---|
333 | */
|
---|
334 |
|
---|
335 | /**
|
---|
336 | * Retrive information about the connector connectorId.
|
---|
337 | */
|
---|
338 | extern drmModeConnectorPtr drmModeGetConnector(int fd,
|
---|
339 | uint32_t connectorId);
|
---|
340 |
|
---|
341 | /**
|
---|
342 | * Attaches the given mode to an connector.
|
---|
343 | */
|
---|
344 | extern int drmModeAttachMode(int fd, uint32_t connectorId, drmModeModeInfoPtr mode_info);
|
---|
345 |
|
---|
346 | /**
|
---|
347 | * Detaches a mode from the connector
|
---|
348 | * must be unused, by the given mode.
|
---|
349 | */
|
---|
350 | extern int drmModeDetachMode(int fd, uint32_t connectorId, drmModeModeInfoPtr mode_info);
|
---|
351 |
|
---|
352 | extern drmModePropertyPtr drmModeGetProperty(int fd, uint32_t propertyId);
|
---|
353 | extern void drmModeFreeProperty(drmModePropertyPtr ptr);
|
---|
354 |
|
---|
355 | extern drmModePropertyBlobPtr drmModeGetPropertyBlob(int fd, uint32_t blob_id);
|
---|
356 | extern void drmModeFreePropertyBlob(drmModePropertyBlobPtr ptr);
|
---|
357 | extern int drmModeConnectorSetProperty(int fd, uint32_t connector_id, uint32_t property_id,
|
---|
358 | uint64_t value);
|
---|
359 | extern int drmCheckModesettingSupported(const char *busid);
|
---|
360 |
|
---|
361 | extern int drmModeCrtcSetGamma(int fd, uint32_t crtc_id, uint32_t size,
|
---|
362 | uint16_t *red, uint16_t *green, uint16_t *blue);
|
---|
363 | extern int drmModeCrtcGetGamma(int fd, uint32_t crtc_id, uint32_t size,
|
---|
364 | uint16_t *red, uint16_t *green, uint16_t *blue);
|
---|