PM: adding suspend/resume support
[gstreamer-omap:libdce.git] / libdce-x11.c
1 /*
2  * Copyright (c) 2012, Texas Instruments Incorporated
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  *
9  * *  Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  *
12  * *  Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * *  Neither the name of Texas Instruments Incorporated nor the names of
17  *    its contributors may be used to endorse or promote products derived
18  *    from this software without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
22  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
24  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
26  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
27  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
28  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
29  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
30  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  */
32
33 #include <stdlib.h>
34 #include <string.h>
35 #include <stdio.h>
36 #include <unistd.h>
37 #include <stdint.h>
38 #include <sys/types.h>
39 #include <sys/stat.h>
40 #include <fcntl.h>
41 #include <pthread.h>
42 #include <xf86drm.h>
43 #include <xf86drm.h>
44 #include <omap_drm.h>
45 #include <omap_drmif.h>
46
47 #include <X11/Xlib.h>
48 #include <X11/Xmd.h>
49 #include <X11/extensions/dri2proto.h>
50 #include <X11/extensions/dri2.h>
51
52 #include <ti/dce/dce_priv.h>
53
54 int dce_auth_x11(int *pfd)
55 {
56     Display *dpy;
57     Window root;
58     drm_magic_t magic;
59     int eventBase, errorBase, major, minor;
60     char *driver, *device;
61     int ret = -1;
62     int fd = *pfd;
63
64     INFO("attempting to open X11 connection");
65     dpy = XOpenDisplay(NULL);
66     if (!dpy) {
67         ERROR("Could not open display");
68         goto no_x11;
69     }
70
71     if (!DRI2InitDisplay(dpy, NULL)) {
72         ERROR("DRI2InitDisplay failed");
73         goto no_x11;
74     }
75
76     if (!DRI2QueryExtension(dpy, &eventBase, &errorBase)) {
77         ERROR("DRI2QueryExtension failed");
78         goto no_x11;
79     }
80
81     DEBUG("DRI2QueryExtension: eventBase=%d, errorBase=%d", eventBase, errorBase);
82
83     if (!DRI2QueryVersion(dpy, &major, &minor)) {
84         ERROR("DRI2QueryVersion failed");
85         goto no_x11;
86     }
87
88     DEBUG("DRI2QueryVersion: major=%d, minor=%d", major, minor);
89
90     root = RootWindow(dpy, DefaultScreen(dpy));
91
92     if (!DRI2Connect(dpy, root, DRI2DriverDRI, &driver, &device)) {
93         DEBUG("DRI2Connect failed");
94         goto no_x11;
95     }
96
97     DEBUG("DRI2Connect: driver=%s, device=%s", driver, device);
98
99     /* only open the device if we don't already have an fd.. see
100      * dce_set_fd().  Need to sort out a better way to handle this
101      * but GEM buffer handles are only valid within the context of
102      * a given file-open.  Switching to dmabuf or flink handles
103      * would solve this.
104      */
105     if (fd == -1) {
106         fd = open(device, O_RDWR);
107         if (fd < 0) {
108             ERROR("open failed");
109             goto no_x11_free;
110         }
111     }
112
113     if (drmGetMagic(fd, &magic)) {
114         ERROR("drmGetMagic failed");
115         goto no_x11_free;
116     }
117
118     if (!DRI2Authenticate(dpy, root, magic)) {
119         ERROR("DRI2Authenticate failed");
120         goto no_x11_free;
121     }
122
123     ret = 0;
124     *pfd = fd;
125
126 no_x11_free:
127     XFree(driver);
128     XFree(device);
129 no_x11:
130     return ret;
131 }