xorg_output.c revision fb18ec4f2775f96982a39247efd1c70cccbc46fc
13c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*
23c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas.
33c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * All Rights Reserved.
43c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
53c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Permission is hereby granted, free of charge, to any person obtaining a
63c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * copy of this software and associated documentation files (the
73c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * "Software"), to deal in the Software without restriction, including
83c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * without limitation the rights to use, copy, modify, merge, publish,
93c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * distribute, sub license, and/or sell copies of the Software, and to
103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * permit persons to whom the Software is furnished to do so, subject to
113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * the following conditions:
123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * The above copyright notice and this permission notice (including the
143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * next paragraph) shall be included in all copies or substantial portions
153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * of the Software.
163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Author: Alan Hourihane <alanh@tungstengraphics.com>
273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Author: Jakob Bornecrantz <wallbraker@gmail.com>
283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry */
303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "xorg-server.h"
323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <xf86.h>
333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <xf86i2c.h>
343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <xf86Crtc.h>
353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <xf86DDC.h>
363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <errno.h>
373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <fcntl.h>
383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <unistd.h>
393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <stdio.h>
403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <stdlib.h>
413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <stdint.h>
423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <string.h>
433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <sys/stat.h>
443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <sys/types.h>
453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#ifdef HAVE_XEXTPROTO_71
473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <X11/extensions/dpmsconst.h>
483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#else
493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#define DPMS_SERVER
503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <X11/extensions/dpms.h>
513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#endif
523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "xorg_tracker.h"
543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
553c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystruct output_private
563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry    drmModeConnectorPtr drm_connector;
583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry    drmModePropertyBlobPtr edid_blob;
593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry    int fd;
603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry    int c;
613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
633c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic char *output_enum_list[] = {
643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry    "Unknown",
653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry    "VGA",
663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry    "DVI",
673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry    "DVI",
683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry    "DVI",
693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry    "Composite",
703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry    "SVIDEO",
713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry    "LVDS",
723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry    "CTV",
733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry    "DIN",
743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry    "DP",
753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry    "HDMI",
763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry    "HDMI",
773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
793c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void
803c827367444ee418f129b2c238299f49d3264554Jarkko Poyryoutput_create_resources(xf86OutputPtr output)
813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#ifdef RANDR_12_INTERFACE
833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#endif /* RANDR_12_INTERFACE */
843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
863c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void
873c827367444ee418f129b2c238299f49d3264554Jarkko Poyryoutput_dpms(xf86OutputPtr output, int mode)
883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
913c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic xf86OutputStatus
923c827367444ee418f129b2c238299f49d3264554Jarkko Poyryoutput_detect(xf86OutputPtr output)
933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry    modesettingPtr ms = modesettingPTR(output->scrn);
953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry    struct output_private *priv = output->driver_private;
963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry    drmModeConnectorPtr drm_connector;
973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry    xf86OutputStatus status;
983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry    drm_connector = drmModeGetConnector(ms->fd, priv->drm_connector->connector_id);
1003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry    if (drm_connector) {
1013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	drmModeFreeConnector(priv->drm_connector);
1023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	priv->drm_connector = drm_connector;
1033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry    } else {
1043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	drm_connector = priv->drm_connector;
1053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry    }
1063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry    switch (drm_connector->connection) {
1083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry    case DRM_MODE_CONNECTED:
1093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	status = XF86OutputStatusConnected;
1103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	break;
1113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry    case DRM_MODE_DISCONNECTED:
1123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	status = XF86OutputStatusDisconnected;
1133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	break;
1143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry    default:
1153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	status = XF86OutputStatusUnknown;
1163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry    }
1173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry    return status;
1193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1213c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic DisplayModePtr
1223c827367444ee418f129b2c238299f49d3264554Jarkko Poyryoutput_get_modes(xf86OutputPtr output)
1233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry    struct output_private *priv = output->driver_private;
1253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry    drmModeConnectorPtr drm_connector = priv->drm_connector;
1263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry    drmModeModeInfoPtr drm_mode = NULL;
1273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry    drmModePropertyPtr props = NULL;
1283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry    xf86MonPtr ddc_mon = NULL;
1293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry    DisplayModePtr modes = NULL, mode = NULL;
1303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry    int i;
1313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (i = 0; i < drm_connector->count_props; i++) {
1333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		props = drmModeGetProperty(priv->fd, drm_connector->props[i]);
1343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (!props)
1353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			continue;
1363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (!(props->flags & DRM_MODE_PROP_BLOB))
1383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			goto out_free;
1393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (!strcmp(props->name, "EDID")) {
1413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (priv->edid_blob)
1423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				drmModeFreePropertyBlob(priv->edid_blob);
1433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			priv->edid_blob = drmModeGetPropertyBlob(priv->fd,
1443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry							  drm_connector->prop_values[i]);
1453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
1463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		out_free:
1483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		drmModeFreeProperty(props);
1493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
1503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (priv->edid_blob) {
1523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		ddc_mon = xf86InterpretEDID(output->scrn->scrnIndex,
1533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									priv->edid_blob->data);
1543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (ddc_mon && priv->edid_blob->length > 128)
1563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			ddc_mon->flags |= MONITOR_EDID_COMPLETE_RAWDATA;
1573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
1583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	xf86OutputSetEDID(output, ddc_mon);
1593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry    for (i = 0; i < drm_connector->count_modes; i++) {
1613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	drm_mode = &drm_connector->modes[i];
1623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (drm_mode) {
1633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	    mode = calloc(1, sizeof(DisplayModeRec));
1643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	    if (!mode)
1653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		continue;
1663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	    mode->Clock = drm_mode->clock;
1673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	    mode->HDisplay = drm_mode->hdisplay;
1683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	    mode->HSyncStart = drm_mode->hsync_start;
1693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	    mode->HSyncEnd = drm_mode->hsync_end;
1703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	    mode->HTotal = drm_mode->htotal;
1713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	    mode->VDisplay = drm_mode->vdisplay;
1723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	    mode->VSyncStart = drm_mode->vsync_start;
1733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	    mode->VSyncEnd = drm_mode->vsync_end;
1743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	    mode->VTotal = drm_mode->vtotal;
1753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	    mode->Flags = drm_mode->flags;
1763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	    mode->HSkew = drm_mode->hskew;
1773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	    mode->VScan = drm_mode->vscan;
1783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	    mode->VRefresh = xf86ModeVRefresh(mode);
1793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	    mode->Private = (void *)drm_mode;
1803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	    mode->type = 0;
1813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	    if (drm_mode->type & DRM_MODE_TYPE_PREFERRED)
1823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		mode->type |= M_T_PREFERRED;
1833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	    if (drm_mode->type & DRM_MODE_TYPE_DRIVER)
1843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		mode->type |= M_T_DRIVER;
1853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	    xf86SetModeDefaultName(mode);
1863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	    modes = xf86ModesAdd(modes, mode);
1873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	    xf86PrintModeline(0, mode);
1883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
1893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry    }
1903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry    return modes;
1923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1943c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic int
1953c827367444ee418f129b2c238299f49d3264554Jarkko Poyryoutput_mode_valid(xf86OutputPtr output, DisplayModePtr pMode)
1963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry    modesettingPtr ms = modesettingPTR(output->scrn);
1983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry    CustomizerPtr cust = ms->cust;
1993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry    if (cust && cust->winsys_check_fb_size &&
2013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	!cust->winsys_check_fb_size(cust, pMode->HDisplay *
2023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				    output->scrn->bitsPerPixel / 8,
2033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				    pMode->VDisplay))
2043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return MODE_BAD;
2053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry    return MODE_OK;
2073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#ifdef RANDR_12_INTERFACE
2103c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic Bool
2113c827367444ee418f129b2c238299f49d3264554Jarkko Poyryoutput_set_property(xf86OutputPtr output, Atom property, RRPropertyValuePtr value)
2123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry    return TRUE;
2143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#endif /* RANDR_12_INTERFACE */
2163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#ifdef RANDR_13_INTERFACE
2183c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic Bool
2193c827367444ee418f129b2c238299f49d3264554Jarkko Poyryoutput_get_property(xf86OutputPtr output, Atom property)
2203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry    return TRUE;
2223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#endif /* RANDR_13_INTERFACE */
2243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2253c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void
2263c827367444ee418f129b2c238299f49d3264554Jarkko Poyryoutput_destroy(xf86OutputPtr output)
2273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry    struct output_private *priv = output->driver_private;
2293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry    if (priv->edid_blob)
2303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		drmModeFreePropertyBlob(priv->edid_blob);
2313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry    drmModeFreeConnector(priv->drm_connector);
2323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry    free(priv);
2333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry    output->driver_private = NULL;
2343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2363c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic const xf86OutputFuncsRec output_funcs = {
2373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry    .create_resources = output_create_resources,
2383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#ifdef RANDR_12_INTERFACE
2393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry    .set_property = output_set_property,
2403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#endif
2413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#ifdef RANDR_13_INTERFACE
2423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry    .get_property = output_get_property,
2433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#endif
2443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry    .dpms = output_dpms,
2453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry    .detect = output_detect,
2463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry    .get_modes = output_get_modes,
2483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry    .mode_valid = output_mode_valid,
2493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry    .destroy = output_destroy,
2503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
2513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2523c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid
2533c827367444ee418f129b2c238299f49d3264554Jarkko Poyryxorg_output_init(ScrnInfoPtr pScrn)
2543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry    modesettingPtr ms = modesettingPTR(pScrn);
2563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry    xf86OutputPtr output;
2573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry    drmModeResPtr res;
2583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry    drmModeConnectorPtr drm_connector = NULL;
2593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry    drmModeEncoderPtr drm_encoder = NULL;
2603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry    struct output_private *priv;
2613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry    char name[32];
2623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry    int c, v, p;
2633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry    res = drmModeGetResources(ms->fd);
2653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry    if (res == 0) {
2663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DRV_ERROR("Failed drmModeGetResources\n");
2673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return;
2683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry    }
2693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry    for (c = 0; c < res->count_connectors; c++) {
2713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	drm_connector = drmModeGetConnector(ms->fd, res->connectors[c]);
2723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!drm_connector)
2733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	    goto out;
2743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#if 0
2763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (p = 0; p < drm_connector->count_props; p++) {
2773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	    drmModePropertyPtr prop;
2783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	    prop = drmModeGetProperty(ms->fd, drm_connector->props[p]);
2803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	    name = NULL;
2823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	    if (prop) {
2833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		ErrorF("VALUES %d\n", prop->count_values);
2843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (v = 0; v < prop->count_values; v++)
2863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		    ErrorF("%s %lld\n", prop->name, prop->values[v]);
2873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	    }
2883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
2893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#else
2903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	(void)p;
2913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	(void)v;
2923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#endif
2933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	snprintf(name, 32, "%s%d",
2953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		 output_enum_list[drm_connector->connector_type],
2963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		 drm_connector->connector_type_id);
2973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	priv = calloc(sizeof(*priv), 1);
3003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!priv) {
3013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	    continue;
3023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
3033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	output = xf86OutputCreate(pScrn, &output_funcs, name);
3053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!output) {
3063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	    free(priv);
3073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	    continue;
3083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
3093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	drm_encoder = drmModeGetEncoder(ms->fd, drm_connector->encoders[0]);
3113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (drm_encoder) {
3123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	    output->possible_crtcs = drm_encoder->possible_crtcs;
3133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	    output->possible_clones = drm_encoder->possible_clones;
3143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	} else {
3153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	    output->possible_crtcs = 0;
3163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	    output->possible_clones = 0;
3173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
3183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	priv->c = c;
3193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	priv->drm_connector = drm_connector;
3203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	priv->fd = ms->fd;
3213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	output->driver_private = priv;
3223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	output->subpixel_order = SubPixelHorizontalRGB;
3233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	output->interlaceAllowed = FALSE;
3243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	output->doubleScanAllowed = FALSE;
3253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry    }
3263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry  out:
3283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry    drmModeFreeResources(res);
3293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
3303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3313c827367444ee418f129b2c238299f49d3264554Jarkko Poyryunsigned
3323c827367444ee418f129b2c238299f49d3264554Jarkko Poyryxorg_output_get_id(xf86OutputPtr output)
3333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
3343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry    struct output_private *priv = output->driver_private;
3353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry    return priv->drm_connector->connector_id;
3363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
3373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/* vim: set sw=4 ts=8 sts=4: */
3393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry