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