1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas.
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * All Rights Reserved.
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * "Software"), to deal in the Software without restriction, including
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * without limitation the rights to use, copy, modify, merge, publish,
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * distribute, sub license, and/or sell copies of the Software, and to
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * permit persons to whom the Software is furnished to do so, subject to
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the following conditions:
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * next paragraph) shall be included in all copies or substantial portions
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * of the Software.
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Author: Alan Hourihane <alanh@tungstengraphics.com>
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Author: Jakob Bornecrantz <wallbraker@gmail.com>
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <unistd.h>
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <string.h>
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <assert.h>
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <stdlib.h>
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <math.h>
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <stdint.h>
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "xorg-server.h"
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <xf86.h>
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <xf86i2c.h>
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <xf86Crtc.h>
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <cursorstr.h>
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "xorg_tracker.h"
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "xf86Modes.h"
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef HAVE_XEXTPROTO_71
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <X11/extensions/dpmsconst.h>
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DPMS_SERVER
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <X11/extensions/dpms.h>
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "state_tracker/drm_driver.h"
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_inlines.h"
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_rect.h"
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef HAVE_LIBKMS
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "libkms/libkms.h"
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct crtc_private
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    drmModeCrtcPtr drm_crtc;
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    /* hwcursor */
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    struct pipe_resource *cursor_tex;
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    struct kms_bo *cursor_bo;
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    unsigned cursor_handle;
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcrtc_dpms(xf86CrtcPtr crtc, int mode)
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    /* ScrnInfoPtr pScrn = crtc->scrn; */
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    switch (mode) {
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    case DPMSModeOn:
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    case DPMSModeStandby:
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    case DPMSModeSuspend:
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	break;
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    case DPMSModeOff:
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	break;
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    }
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic Bool
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcrtc_set_mode_major(xf86CrtcPtr crtc, DisplayModePtr mode,
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    Rotation rotation, int x, int y)
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(crtc->scrn);
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    modesettingPtr ms = modesettingPTR(crtc->scrn);
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    xf86OutputPtr output = NULL;
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    struct crtc_private *crtcp = crtc->driver_private;
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    drmModeCrtcPtr drm_crtc = crtcp->drm_crtc;
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    drmModeModeInfo drm_mode;
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    int i, ret;
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    unsigned int connector_id;
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    for (i = 0; i < config->num_output; output = NULL, i++) {
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	output = config->output[i];
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (output->crtc == crtc)
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    break;
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    }
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    if (!output)
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return FALSE;
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    connector_id = xorg_output_get_id(output);
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    drm_mode.clock = mode->Clock;
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    drm_mode.hdisplay = mode->HDisplay;
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    drm_mode.hsync_start = mode->HSyncStart;
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    drm_mode.hsync_end = mode->HSyncEnd;
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    drm_mode.htotal = mode->HTotal;
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    drm_mode.vdisplay = mode->VDisplay;
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    drm_mode.vsync_start = mode->VSyncStart;
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    drm_mode.vsync_end = mode->VSyncEnd;
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    drm_mode.vtotal = mode->VTotal;
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    drm_mode.flags = mode->Flags;
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    drm_mode.hskew = mode->HSkew;
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    drm_mode.vscan = mode->VScan;
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    drm_mode.vrefresh = mode->VRefresh;
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    drm_mode.type = 0;
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    if (!mode->name)
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	xf86SetModeDefaultName(mode);
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    strncpy(drm_mode.name, mode->name, DRM_DISPLAY_MODE_LEN - 1);
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    drm_mode.name[DRM_DISPLAY_MODE_LEN - 1] = '\0';
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    ret = drmModeSetCrtc(ms->fd, drm_crtc->crtc_id, ms->fb_id, x, y,
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			 &connector_id, 1, &drm_mode);
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    if (ret)
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return FALSE;
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    /* Only set gamma when needed, to avoid unneeded delays. */
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if defined(XF86_CRTC_VERSION) && XF86_CRTC_VERSION >= 3
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    if (!crtc->active && crtc->version >= 3)
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	crtc->funcs->gamma_set(crtc, crtc->gamma_red, crtc->gamma_green,
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			       crtc->gamma_blue, crtc->gamma_size);
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    crtc->active = TRUE;
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    crtc->x = x;
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    crtc->y = y;
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    crtc->mode = *mode;
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    crtc->rotation = rotation;
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    return TRUE;
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcrtc_gamma_set(xf86CrtcPtr crtc, CARD16 * red, CARD16 * green, CARD16 * blue,
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       int size)
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    modesettingPtr ms = modesettingPTR(crtc->scrn);
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    struct crtc_private *crtcp = crtc->driver_private;
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    drmModeCrtcSetGamma(ms->fd, crtcp->drm_crtc->crtc_id, size, red, green, blue);
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if 0 /* Implement and enable to enable rotation and reflection. */
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void *
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcrtc_shadow_allocate(xf86CrtcPtr crtc, int width, int height)
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    /* ScrnInfoPtr pScrn = crtc->scrn; */
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    return NULL;
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic PixmapPtr
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcrtc_shadow_create(xf86CrtcPtr crtc, void *data, int width, int height)
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    /* ScrnInfoPtr pScrn = crtc->scrn; */
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    return NULL;
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcrtc_shadow_destroy(xf86CrtcPtr crtc, PixmapPtr rotate_pixmap, void *data)
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    /* ScrnInfoPtr pScrn = crtc->scrn; */
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Cursor functions
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcrtc_set_cursor_colors(xf86CrtcPtr crtc, int bg, int fg)
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    /* XXX: See if this one is needed, as we only support ARGB cursors */
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcrtc_set_cursor_position(xf86CrtcPtr crtc, int x, int y)
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    modesettingPtr ms = modesettingPTR(crtc->scrn);
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    struct crtc_private *crtcp = crtc->driver_private;
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    drmModeMoveCursor(ms->fd, crtcp->drm_crtc->crtc_id, x, y);
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcrtc_load_cursor_argb_ga3d(xf86CrtcPtr crtc, CARD32 * image)
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    unsigned char *ptr;
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    modesettingPtr ms = modesettingPTR(crtc->scrn);
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    struct crtc_private *crtcp = crtc->driver_private;
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    struct pipe_transfer *transfer;
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    struct pipe_fence_handle *fence = NULL;
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    struct pipe_context *ctx = ms->ctx;
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    struct pipe_screen *screen = ms->screen;
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    if (!crtcp->cursor_tex) {
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct pipe_resource templat;
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct winsys_handle whandle;
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	memset(&templat, 0, sizeof(templat));
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	templat.bind |= PIPE_BIND_RENDER_TARGET;
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	templat.bind |= PIPE_BIND_SCANOUT;
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	templat.bind |= PIPE_BIND_CURSOR;
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	templat.target = PIPE_TEXTURE_2D;
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	templat.last_level = 0;
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	templat.depth0 = 1;
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	templat.array_size = 1;
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	templat.format = PIPE_FORMAT_B8G8R8A8_UNORM;
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	templat.width0 = 64;
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	templat.height0 = 64;
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	memset(&whandle, 0, sizeof(whandle));
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	whandle.type = DRM_API_HANDLE_TYPE_KMS;
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	crtcp->cursor_tex = screen->resource_create(screen, &templat);
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	screen->resource_get_handle(screen, crtcp->cursor_tex, &whandle);
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	crtcp->cursor_handle = whandle.handle;
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    }
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    transfer = pipe_get_transfer(ctx, crtcp->cursor_tex,
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 0, 0,
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 PIPE_TRANSFER_WRITE,
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 0, 0, 64, 64);
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    ptr = ctx->transfer_map(ctx, transfer);
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    util_copy_rect(ptr, crtcp->cursor_tex->format,
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		   transfer->stride, 0, 0,
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		   64, 64, (void*)image, 64 * 4, 0, 0);
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    ctx->transfer_unmap(ctx, transfer);
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    ctx->transfer_destroy(ctx, transfer);
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    ctx->flush(ctx, &fence);
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    if (fence) {
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	screen->fence_finish(screen, fence, PIPE_TIMEOUT_INFINITE);
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	screen->fence_reference(screen, &fence, NULL);
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    }
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    if (crtc->cursor_shown)
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	drmModeSetCursor(ms->fd, crtcp->drm_crtc->crtc_id,
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			 crtcp->cursor_handle, 64, 64);
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if HAVE_LIBKMS
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcrtc_load_cursor_argb_kms(xf86CrtcPtr crtc, CARD32 * image)
268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    modesettingPtr ms = modesettingPTR(crtc->scrn);
270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    struct crtc_private *crtcp = crtc->driver_private;
271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    unsigned char *ptr;
272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    if (!crtcp->cursor_bo) {
274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned attr[8];
275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	attr[0] = KMS_BO_TYPE;
277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef KMS_BO_TYPE_CURSOR_64X64_A8R8G8B8
278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	attr[1] = KMS_BO_TYPE_CURSOR_64X64_A8R8G8B8;
279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else
280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	attr[1] = KMS_BO_TYPE_CURSOR;
281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	attr[2] = KMS_WIDTH;
283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	attr[3] = 64;
284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	attr[4] = KMS_HEIGHT;
285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	attr[5] = 64;
286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	attr[6] = 0;
287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        if (kms_bo_create(ms->kms, attr, &crtcp->cursor_bo))
289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	   return;
290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (kms_bo_get_prop(crtcp->cursor_bo, KMS_HANDLE,
292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			    &crtcp->cursor_handle))
293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    goto err_bo_destroy;
294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    }
295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    kms_bo_map(crtcp->cursor_bo, (void**)&ptr);
297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    memcpy(ptr, image, 64*64*4);
298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    kms_bo_unmap(crtcp->cursor_bo);
299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    if (crtc->cursor_shown)
301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	drmModeSetCursor(ms->fd, crtcp->drm_crtc->crtc_id,
302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			 crtcp->cursor_handle, 64, 64);
303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    return;
305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgerr_bo_destroy:
307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    kms_bo_destroy(&crtcp->cursor_bo);
308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcrtc_load_cursor_argb(xf86CrtcPtr crtc, CARD32 * image)
313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(crtc->scrn);
315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    modesettingPtr ms = modesettingPTR(crtc->scrn);
316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    /* Older X servers have cursor reference counting bugs leading to use of
318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     * freed memory and consequently random crashes. Should be fixed as of
319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     * xserver 1.8, but this workaround shouldn't hurt anyway.
320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     */
321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    if (config->cursor)
322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       config->cursor->refcnt++;
323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    if (ms->cursor)
325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       FreeCursor(ms->cursor, None);
326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    ms->cursor = config->cursor;
328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    if (ms->screen)
330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	crtc_load_cursor_argb_ga3d(crtc, image);
331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef HAVE_LIBKMS
332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    else if (ms->kms)
333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	crtc_load_cursor_argb_kms(crtc, image);
334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcrtc_show_cursor(xf86CrtcPtr crtc)
339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    modesettingPtr ms = modesettingPTR(crtc->scrn);
341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    struct crtc_private *crtcp = crtc->driver_private;
342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    if (crtcp->cursor_tex || crtcp->cursor_bo)
344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	drmModeSetCursor(ms->fd, crtcp->drm_crtc->crtc_id,
345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			 crtcp->cursor_handle, 64, 64);
346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcrtc_hide_cursor(xf86CrtcPtr crtc)
350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    modesettingPtr ms = modesettingPTR(crtc->scrn);
352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    struct crtc_private *crtcp = crtc->driver_private;
353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    drmModeSetCursor(ms->fd, crtcp->drm_crtc->crtc_id, 0, 0, 0);
355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Called at vt leave
359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgxorg_crtc_cursor_destroy(xf86CrtcPtr crtc)
362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    struct crtc_private *crtcp = crtc->driver_private;
364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    if (crtcp->cursor_tex)
366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	pipe_resource_reference(&crtcp->cursor_tex, NULL);
367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef HAVE_LIBKMS
368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    if (crtcp->cursor_bo)
369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	kms_bo_destroy(&crtcp->cursor_bo);
370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Misc functions
375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcrtc_destroy(xf86CrtcPtr crtc)
379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    struct crtc_private *crtcp = crtc->driver_private;
381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    xorg_crtc_cursor_destroy(crtc);
383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    drmModeFreeCrtc(crtcp->drm_crtc);
385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    free(crtcp);
387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    crtc->driver_private = NULL;
388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const xf86CrtcFuncsRec crtc_funcs = {
391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    .dpms = crtc_dpms,
392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    .set_mode_major = crtc_set_mode_major,
393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    .set_cursor_colors = crtc_set_cursor_colors,
395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    .set_cursor_position = crtc_set_cursor_position,
396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    .show_cursor = crtc_show_cursor,
397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    .hide_cursor = crtc_hide_cursor,
398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    .load_cursor_argb = crtc_load_cursor_argb,
399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    .shadow_create = NULL,
401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    .shadow_allocate = NULL,
402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    .shadow_destroy = NULL,
403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    .gamma_set = crtc_gamma_set,
405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    .destroy = crtc_destroy,
406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgxorg_crtc_init(ScrnInfoPtr pScrn)
410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    modesettingPtr ms = modesettingPTR(pScrn);
412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    xf86CrtcPtr crtc;
413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    drmModeResPtr res;
414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    drmModeCrtcPtr drm_crtc = NULL;
415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    struct crtc_private *crtcp;
416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    int c;
417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    res = drmModeGetResources(ms->fd);
419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    if (res == 0) {
420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	ErrorF("Failed drmModeGetResources %d\n", errno);
421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return;
422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    }
423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    for (c = 0; c < res->count_crtcs; c++) {
425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	drm_crtc = drmModeGetCrtc(ms->fd, res->crtcs[c]);
426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (!drm_crtc)
428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    continue;
429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	crtc = xf86CrtcCreate(pScrn, &crtc_funcs);
431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (crtc == NULL)
432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    goto out;
433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	crtcp = calloc(1, sizeof(struct crtc_private));
435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (!crtcp) {
436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    xf86CrtcDestroy(crtc);
437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    goto out;
438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	crtcp->drm_crtc = drm_crtc;
441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	crtc->driver_private = crtcp;
443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    }
444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  out:
446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    drmModeFreeResources(res);
447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* vim: set sw=4 ts=8 sts=4: */
450