2 * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas.
5 * Permission is hereby granted, free of charge, to any person obtaining a
6 * copy of this software and associated documentation files (the
7 * "Software"), to deal in the Software without restriction, including
8 * without limitation the rights to use, copy, modify, merge, publish,
9 * distribute, sub license, and/or sell copies of the Software, and to
10 * permit persons to whom the Software is furnished to do so, subject to
11 * the following conditions:
13 * The above copyright notice and this permission notice (including the
14 * next paragraph) shall be included in all copies or substantial portions
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
20 * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
21 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
22 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
23 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26 * Author: Alan Hourihane <alanh@tungstengraphics.com>
27 * Author: Jakob Bornecrantz <wallbraker@gmail.com>
31 #include "xorg-server.h"
43 #include <sys/types.h>
45 #ifdef HAVE_XEXTPROTO_71
46 #include <X11/extensions/dpmsconst.h>
49 #include <X11/extensions/dpms.h>
52 #include "xorg_tracker.h"
56 drmModeConnectorPtr drm_connector
;
61 static char *output_enum_list
[] = {
78 output_create_resources(xf86OutputPtr output
)
80 #ifdef RANDR_12_INTERFACE
81 #endif /* RANDR_12_INTERFACE */
85 output_dpms(xf86OutputPtr output
, int mode
)
89 static xf86OutputStatus
90 output_detect(xf86OutputPtr output
)
92 modesettingPtr ms
= modesettingPTR(output
->scrn
);
93 struct output_private
*priv
= output
->driver_private
;
94 drmModeConnectorPtr drm_connector
;
95 xf86OutputStatus status
;
97 drm_connector
= drmModeGetConnector(ms
->fd
, priv
->drm_connector
->connector_id
);
99 drmModeFreeConnector(priv
->drm_connector
);
100 priv
->drm_connector
= drm_connector
;
102 drm_connector
= priv
->drm_connector
;
105 switch (drm_connector
->connection
) {
106 case DRM_MODE_CONNECTED
:
107 status
= XF86OutputStatusConnected
;
109 case DRM_MODE_DISCONNECTED
:
110 status
= XF86OutputStatusDisconnected
;
113 status
= XF86OutputStatusUnknown
;
119 static DisplayModePtr
120 output_get_modes(xf86OutputPtr output
)
122 struct output_private
*priv
= output
->driver_private
;
123 drmModeConnectorPtr drm_connector
= priv
->drm_connector
;
124 drmModeModeInfoPtr drm_mode
= NULL
;
125 DisplayModePtr modes
= NULL
, mode
= NULL
;
128 for (i
= 0; i
< drm_connector
->count_modes
; i
++) {
129 drm_mode
= &drm_connector
->modes
[i
];
131 mode
= calloc(1, sizeof(DisplayModeRec
));
134 mode
->Clock
= drm_mode
->clock
;
135 mode
->HDisplay
= drm_mode
->hdisplay
;
136 mode
->HSyncStart
= drm_mode
->hsync_start
;
137 mode
->HSyncEnd
= drm_mode
->hsync_end
;
138 mode
->HTotal
= drm_mode
->htotal
;
139 mode
->VDisplay
= drm_mode
->vdisplay
;
140 mode
->VSyncStart
= drm_mode
->vsync_start
;
141 mode
->VSyncEnd
= drm_mode
->vsync_end
;
142 mode
->VTotal
= drm_mode
->vtotal
;
143 mode
->Flags
= drm_mode
->flags
;
144 mode
->HSkew
= drm_mode
->hskew
;
145 mode
->VScan
= drm_mode
->vscan
;
146 mode
->VRefresh
= xf86ModeVRefresh(mode
);
147 mode
->Private
= (void *)drm_mode
;
149 if (drm_mode
->type
& DRM_MODE_TYPE_PREFERRED
)
150 mode
->type
|= M_T_PREFERRED
;
151 if (drm_mode
->type
& DRM_MODE_TYPE_DRIVER
)
152 mode
->type
|= M_T_DRIVER
;
153 xf86SetModeDefaultName(mode
);
154 modes
= xf86ModesAdd(modes
, mode
);
155 xf86PrintModeline(0, mode
);
163 output_mode_valid(xf86OutputPtr output
, DisplayModePtr pMode
)
165 modesettingPtr ms
= modesettingPTR(output
->scrn
);
166 CustomizerPtr cust
= ms
->cust
;
168 if (cust
&& cust
->winsys_check_fb_size
&&
169 !cust
->winsys_check_fb_size(cust
, pMode
->HDisplay
*
170 output
->scrn
->bitsPerPixel
/ 8,
177 #ifdef RANDR_12_INTERFACE
179 output_set_property(xf86OutputPtr output
, Atom property
, RRPropertyValuePtr value
)
183 #endif /* RANDR_12_INTERFACE */
185 #ifdef RANDR_13_INTERFACE
187 output_get_property(xf86OutputPtr output
, Atom property
)
191 #endif /* RANDR_13_INTERFACE */
194 output_destroy(xf86OutputPtr output
)
196 struct output_private
*priv
= output
->driver_private
;
197 drmModeFreeConnector(priv
->drm_connector
);
199 output
->driver_private
= NULL
;
202 static const xf86OutputFuncsRec output_funcs
= {
203 .create_resources
= output_create_resources
,
204 #ifdef RANDR_12_INTERFACE
205 .set_property
= output_set_property
,
207 #ifdef RANDR_13_INTERFACE
208 .get_property
= output_get_property
,
211 .detect
= output_detect
,
213 .get_modes
= output_get_modes
,
214 .mode_valid
= output_mode_valid
,
215 .destroy
= output_destroy
,
219 xorg_output_init(ScrnInfoPtr pScrn
)
221 modesettingPtr ms
= modesettingPTR(pScrn
);
222 xf86OutputPtr output
;
224 drmModeConnectorPtr drm_connector
= NULL
;
225 drmModeEncoderPtr drm_encoder
= NULL
;
226 struct output_private
*priv
;
230 res
= drmModeGetResources(ms
->fd
);
232 DRV_ERROR("Failed drmModeGetResources\n");
236 for (c
= 0; c
< res
->count_connectors
; c
++) {
237 drm_connector
= drmModeGetConnector(ms
->fd
, res
->connectors
[c
]);
242 for (p
= 0; p
< drm_connector
->count_props
; p
++) {
243 drmModePropertyPtr prop
;
245 prop
= drmModeGetProperty(ms
->fd
, drm_connector
->props
[p
]);
249 ErrorF("VALUES %d\n", prop
->count_values
);
251 for (v
= 0; v
< prop
->count_values
; v
++)
252 ErrorF("%s %lld\n", prop
->name
, prop
->values
[v
]);
260 snprintf(name
, 32, "%s%d",
261 output_enum_list
[drm_connector
->connector_type
],
262 drm_connector
->connector_type_id
);
265 priv
= calloc(sizeof(*priv
), 1);
270 output
= xf86OutputCreate(pScrn
, &output_funcs
, name
);
276 drm_encoder
= drmModeGetEncoder(ms
->fd
, drm_connector
->encoders
[0]);
278 output
->possible_crtcs
= drm_encoder
->possible_crtcs
;
279 output
->possible_clones
= drm_encoder
->possible_clones
;
281 output
->possible_crtcs
= 0;
282 output
->possible_clones
= 0;
285 priv
->drm_connector
= drm_connector
;
286 output
->driver_private
= priv
;
287 output
->subpixel_order
= SubPixelHorizontalRGB
;
288 output
->interlaceAllowed
= FALSE
;
289 output
->doubleScanAllowed
= FALSE
;
293 drmModeFreeResources(res
);
297 xorg_output_get_id(xf86OutputPtr output
)
299 struct output_private
*priv
= output
->driver_private
;
300 return priv
->drm_connector
->connector_id
;
303 /* vim: set sw=4 ts=8 sts=4: */