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 "X11/Xatom.h"
54 #include "xorg_tracker.h"
56 static char *output_enum_list
[] = {
73 output_create_resources(xf86OutputPtr output
)
75 #ifdef RANDR_12_INTERFACE
76 #endif /* RANDR_12_INTERFACE */
80 output_dpms(xf86OutputPtr output
, int mode
)
84 static xf86OutputStatus
85 output_detect(xf86OutputPtr output
)
87 drmModeConnectorPtr drm_connector
= output
->driver_private
;
89 switch (drm_connector
->connection
) {
90 case DRM_MODE_CONNECTED
:
91 return XF86OutputStatusConnected
;
92 case DRM_MODE_DISCONNECTED
:
93 return XF86OutputStatusDisconnected
;
95 return XF86OutputStatusUnknown
;
100 output_get_modes(xf86OutputPtr output
)
102 drmModeConnectorPtr drm_connector
= output
->driver_private
;
103 drmModeModeInfoPtr drm_mode
= NULL
;
104 DisplayModePtr modes
= NULL
, mode
= NULL
;
107 for (i
= 0; i
< drm_connector
->count_modes
; i
++) {
108 drm_mode
= &drm_connector
->modes
[i
];
110 mode
= xcalloc(1, sizeof(DisplayModeRec
));
113 mode
->Clock
= drm_mode
->clock
;
114 mode
->HDisplay
= drm_mode
->hdisplay
;
115 mode
->HSyncStart
= drm_mode
->hsync_start
;
116 mode
->HSyncEnd
= drm_mode
->hsync_end
;
117 mode
->HTotal
= drm_mode
->htotal
;
118 mode
->VDisplay
= drm_mode
->vdisplay
;
119 mode
->VSyncStart
= drm_mode
->vsync_start
;
120 mode
->VSyncEnd
= drm_mode
->vsync_end
;
121 mode
->VTotal
= drm_mode
->vtotal
;
122 mode
->Flags
= drm_mode
->flags
;
123 mode
->HSkew
= drm_mode
->hskew
;
124 mode
->VScan
= drm_mode
->vscan
;
125 mode
->VRefresh
= xf86ModeVRefresh(mode
);
126 mode
->Private
= (void *)drm_mode
;
128 if (drm_mode
->type
& DRM_MODE_TYPE_PREFERRED
)
129 mode
->type
|= M_T_PREFERRED
;
130 if (drm_mode
->type
& DRM_MODE_TYPE_DRIVER
)
131 mode
->type
|= M_T_DRIVER
;
132 xf86SetModeDefaultName(mode
);
133 modes
= xf86ModesAdd(modes
, mode
);
134 xf86PrintModeline(0, mode
);
142 output_mode_valid(xf86OutputPtr output
, DisplayModePtr pMode
)
147 #ifdef RANDR_12_INTERFACE
149 output_set_property(xf86OutputPtr output
, Atom property
, RRPropertyValuePtr value
)
153 #endif /* RANDR_12_INTERFACE */
155 #ifdef RANDR_13_INTERFACE
157 output_get_property(xf86OutputPtr output
, Atom property
)
161 #endif /* RANDR_13_INTERFACE */
164 output_destroy(xf86OutputPtr output
)
166 drmModeFreeConnector(output
->driver_private
);
169 static const xf86OutputFuncsRec output_funcs
= {
170 .create_resources
= output_create_resources
,
171 #ifdef RANDR_12_INTERFACE
172 .set_property
= output_set_property
,
174 #ifdef RANDR_13_INTERFACE
175 .get_property
= output_get_property
,
178 .detect
= output_detect
,
180 .get_modes
= output_get_modes
,
181 .mode_valid
= output_mode_valid
,
182 .destroy
= output_destroy
,
186 xorg_output_init(ScrnInfoPtr pScrn
)
188 modesettingPtr ms
= modesettingPTR(pScrn
);
189 xf86OutputPtr output
;
191 drmModeConnectorPtr drm_connector
= NULL
;
192 drmModeEncoderPtr drm_encoder
= NULL
;
196 res
= drmModeGetResources(ms
->fd
);
198 DRV_ERROR("Failed drmModeGetResources\n");
202 for (c
= 0; c
< res
->count_connectors
; c
++) {
203 drm_connector
= drmModeGetConnector(ms
->fd
, res
->connectors
[c
]);
208 for (p
= 0; p
< drm_connector
->count_props
; p
++) {
209 drmModePropertyPtr prop
;
211 prop
= drmModeGetProperty(ms
->fd
, drm_connector
->props
[p
]);
215 ErrorF("VALUES %d\n", prop
->count_values
);
217 for (v
= 0; v
< prop
->count_values
; v
++)
218 ErrorF("%s %lld\n", prop
->name
, prop
->values
[v
]);
226 snprintf(name
, 32, "%s%d",
227 output_enum_list
[drm_connector
->connector_type
],
228 drm_connector
->connector_type_id
);
231 output
= xf86OutputCreate(pScrn
, &output_funcs
, name
);
235 drm_encoder
= drmModeGetEncoder(ms
->fd
, drm_connector
->encoders
[0]);
237 output
->possible_crtcs
= drm_encoder
->possible_crtcs
;
238 output
->possible_clones
= drm_encoder
->possible_clones
;
240 output
->possible_crtcs
= 0;
241 output
->possible_clones
= 0;
243 output
->driver_private
= drm_connector
;
244 output
->subpixel_order
= SubPixelHorizontalRGB
;
245 output
->interlaceAllowed
= FALSE
;
246 output
->doubleScanAllowed
= FALSE
;
250 drmModeFreeResources(res
);
253 /* vim: set sw=4 ts=8 sts=4: */