1*54e60f84SAndroid Build Coastguard Worker /*
2*54e60f84SAndroid Build Coastguard Worker * Copyright (c) 2008 NVIDIA, Corporation
3*54e60f84SAndroid Build Coastguard Worker *
4*54e60f84SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a copy
5*54e60f84SAndroid Build Coastguard Worker * of this software and associated documentation files (the "Software"), to deal
6*54e60f84SAndroid Build Coastguard Worker * in the Software without restriction, including without limitation the rights
7*54e60f84SAndroid Build Coastguard Worker * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8*54e60f84SAndroid Build Coastguard Worker * copies of the Software, and to permit persons to whom the Software is
9*54e60f84SAndroid Build Coastguard Worker * furnished to do so, subject to the following conditions:
10*54e60f84SAndroid Build Coastguard Worker *
11*54e60f84SAndroid Build Coastguard Worker * The above copyright notice and this permission notice (including the next
12*54e60f84SAndroid Build Coastguard Worker * paragraph) shall be included in all copies or substantial portions of the
13*54e60f84SAndroid Build Coastguard Worker * Software.
14*54e60f84SAndroid Build Coastguard Worker *
15*54e60f84SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*54e60f84SAndroid Build Coastguard Worker * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*54e60f84SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18*54e60f84SAndroid Build Coastguard Worker * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19*54e60f84SAndroid Build Coastguard Worker * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20*54e60f84SAndroid Build Coastguard Worker * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21*54e60f84SAndroid Build Coastguard Worker * SOFTWARE.
22*54e60f84SAndroid Build Coastguard Worker */
23*54e60f84SAndroid Build Coastguard Worker
24*54e60f84SAndroid Build Coastguard Worker #define _GNU_SOURCE 1
25*54e60f84SAndroid Build Coastguard Worker #include "sysdeps.h"
26*54e60f84SAndroid Build Coastguard Worker
27*54e60f84SAndroid Build Coastguard Worker #ifdef HAVE_NVCTRL
28*54e60f84SAndroid Build Coastguard Worker
29*54e60f84SAndroid Build Coastguard Worker #include <string.h>
30*54e60f84SAndroid Build Coastguard Worker
31*54e60f84SAndroid Build Coastguard Worker #define NEED_REPLIES
32*54e60f84SAndroid Build Coastguard Worker #include <stdlib.h>
33*54e60f84SAndroid Build Coastguard Worker #include <X11/Xlibint.h>
34*54e60f84SAndroid Build Coastguard Worker #include <X11/Xutil.h>
35*54e60f84SAndroid Build Coastguard Worker #include <X11/extensions/Xext.h>
36*54e60f84SAndroid Build Coastguard Worker #include <X11/extensions/extutil.h>
37*54e60f84SAndroid Build Coastguard Worker #include "va_nvctrl.h"
38*54e60f84SAndroid Build Coastguard Worker
39*54e60f84SAndroid Build Coastguard Worker #define NV_CONTROL_ERRORS 0
40*54e60f84SAndroid Build Coastguard Worker #define NV_CONTROL_EVENTS 5
41*54e60f84SAndroid Build Coastguard Worker #define NV_CONTROL_NAME "NV-CONTROL"
42*54e60f84SAndroid Build Coastguard Worker
43*54e60f84SAndroid Build Coastguard Worker #define NV_CTRL_TARGET_TYPE_X_SCREEN 0
44*54e60f84SAndroid Build Coastguard Worker #define NV_CTRL_TARGET_TYPE_GPU 1
45*54e60f84SAndroid Build Coastguard Worker #define NV_CTRL_TARGET_TYPE_FRAMELOCK 2
46*54e60f84SAndroid Build Coastguard Worker #define NV_CTRL_TARGET_TYPE_VCSC 3 /* Visual Computing System */
47*54e60f84SAndroid Build Coastguard Worker
48*54e60f84SAndroid Build Coastguard Worker #define NV_CTRL_STRING_NVIDIA_DRIVER_VERSION 3 /* R--G */
49*54e60f84SAndroid Build Coastguard Worker
50*54e60f84SAndroid Build Coastguard Worker #define X_nvCtrlQueryExtension 0
51*54e60f84SAndroid Build Coastguard Worker #define X_nvCtrlIsNv 1
52*54e60f84SAndroid Build Coastguard Worker #define X_nvCtrlQueryStringAttribute 4
53*54e60f84SAndroid Build Coastguard Worker
54*54e60f84SAndroid Build Coastguard Worker typedef struct {
55*54e60f84SAndroid Build Coastguard Worker CARD8 reqType;
56*54e60f84SAndroid Build Coastguard Worker CARD8 nvReqType;
57*54e60f84SAndroid Build Coastguard Worker CARD16 length B16;
58*54e60f84SAndroid Build Coastguard Worker } xnvCtrlQueryExtensionReq;
59*54e60f84SAndroid Build Coastguard Worker #define sz_xnvCtrlQueryExtensionReq 4
60*54e60f84SAndroid Build Coastguard Worker
61*54e60f84SAndroid Build Coastguard Worker typedef struct {
62*54e60f84SAndroid Build Coastguard Worker BYTE type; /* X_Reply */
63*54e60f84SAndroid Build Coastguard Worker CARD8 padb1;
64*54e60f84SAndroid Build Coastguard Worker CARD16 sequenceNumber B16;
65*54e60f84SAndroid Build Coastguard Worker CARD32 length B32;
66*54e60f84SAndroid Build Coastguard Worker CARD16 major B16;
67*54e60f84SAndroid Build Coastguard Worker CARD16 minor B16;
68*54e60f84SAndroid Build Coastguard Worker CARD32 padl4 B32;
69*54e60f84SAndroid Build Coastguard Worker CARD32 padl5 B32;
70*54e60f84SAndroid Build Coastguard Worker CARD32 padl6 B32;
71*54e60f84SAndroid Build Coastguard Worker CARD32 padl7 B32;
72*54e60f84SAndroid Build Coastguard Worker CARD32 padl8 B32;
73*54e60f84SAndroid Build Coastguard Worker } xnvCtrlQueryExtensionReply;
74*54e60f84SAndroid Build Coastguard Worker #define sz_xnvCtrlQueryExtensionReply 32
75*54e60f84SAndroid Build Coastguard Worker
76*54e60f84SAndroid Build Coastguard Worker typedef struct {
77*54e60f84SAndroid Build Coastguard Worker CARD8 reqType;
78*54e60f84SAndroid Build Coastguard Worker CARD8 nvReqType;
79*54e60f84SAndroid Build Coastguard Worker CARD16 length B16;
80*54e60f84SAndroid Build Coastguard Worker CARD32 screen B32;
81*54e60f84SAndroid Build Coastguard Worker } xnvCtrlIsNvReq;
82*54e60f84SAndroid Build Coastguard Worker #define sz_xnvCtrlIsNvReq 8
83*54e60f84SAndroid Build Coastguard Worker
84*54e60f84SAndroid Build Coastguard Worker typedef struct {
85*54e60f84SAndroid Build Coastguard Worker BYTE type; /* X_Reply */
86*54e60f84SAndroid Build Coastguard Worker CARD8 padb1;
87*54e60f84SAndroid Build Coastguard Worker CARD16 sequenceNumber B16;
88*54e60f84SAndroid Build Coastguard Worker CARD32 length B32;
89*54e60f84SAndroid Build Coastguard Worker CARD32 isnv B32;
90*54e60f84SAndroid Build Coastguard Worker CARD32 padl4 B32;
91*54e60f84SAndroid Build Coastguard Worker CARD32 padl5 B32;
92*54e60f84SAndroid Build Coastguard Worker CARD32 padl6 B32;
93*54e60f84SAndroid Build Coastguard Worker CARD32 padl7 B32;
94*54e60f84SAndroid Build Coastguard Worker CARD32 padl8 B32;
95*54e60f84SAndroid Build Coastguard Worker } xnvCtrlIsNvReply;
96*54e60f84SAndroid Build Coastguard Worker #define sz_xnvCtrlIsNvReply 32
97*54e60f84SAndroid Build Coastguard Worker
98*54e60f84SAndroid Build Coastguard Worker typedef struct {
99*54e60f84SAndroid Build Coastguard Worker CARD8 reqType;
100*54e60f84SAndroid Build Coastguard Worker CARD8 nvReqType;
101*54e60f84SAndroid Build Coastguard Worker CARD16 length B16;
102*54e60f84SAndroid Build Coastguard Worker CARD16 target_id B16; /* X screen number or GPU number */
103*54e60f84SAndroid Build Coastguard Worker CARD16 target_type B16; /* X screen or GPU */
104*54e60f84SAndroid Build Coastguard Worker CARD32 display_mask B32;
105*54e60f84SAndroid Build Coastguard Worker CARD32 attribute B32;
106*54e60f84SAndroid Build Coastguard Worker } xnvCtrlQueryStringAttributeReq;
107*54e60f84SAndroid Build Coastguard Worker #define sz_xnvCtrlQueryStringAttributeReq 16
108*54e60f84SAndroid Build Coastguard Worker
109*54e60f84SAndroid Build Coastguard Worker typedef struct {
110*54e60f84SAndroid Build Coastguard Worker BYTE type;
111*54e60f84SAndroid Build Coastguard Worker BYTE pad0;
112*54e60f84SAndroid Build Coastguard Worker CARD16 sequenceNumber B16;
113*54e60f84SAndroid Build Coastguard Worker CARD32 length B32;
114*54e60f84SAndroid Build Coastguard Worker CARD32 flags B32;
115*54e60f84SAndroid Build Coastguard Worker CARD32 n B32; /* Length of string */
116*54e60f84SAndroid Build Coastguard Worker CARD32 pad4 B32;
117*54e60f84SAndroid Build Coastguard Worker CARD32 pad5 B32;
118*54e60f84SAndroid Build Coastguard Worker CARD32 pad6 B32;
119*54e60f84SAndroid Build Coastguard Worker CARD32 pad7 B32;
120*54e60f84SAndroid Build Coastguard Worker } xnvCtrlQueryStringAttributeReply;
121*54e60f84SAndroid Build Coastguard Worker #define sz_xnvCtrlQueryStringAttributeReply 32
122*54e60f84SAndroid Build Coastguard Worker
123*54e60f84SAndroid Build Coastguard Worker #define NVCTRL_EXT_NEED_CHECK (XPointer)(~0)
124*54e60f84SAndroid Build Coastguard Worker #define NVCTRL_EXT_NEED_NOTHING (XPointer)(0)
125*54e60f84SAndroid Build Coastguard Worker #define NVCTRL_EXT_NEED_TARGET_SWAP (XPointer)(1)
126*54e60f84SAndroid Build Coastguard Worker
127*54e60f84SAndroid Build Coastguard Worker static XExtensionInfo _nvctrl_ext_info_data;
128*54e60f84SAndroid Build Coastguard Worker static XExtensionInfo *nvctrl_ext_info = &_nvctrl_ext_info_data;
129*54e60f84SAndroid Build Coastguard Worker static /* const */ char *nvctrl_extension_name = NV_CONTROL_NAME;
130*54e60f84SAndroid Build Coastguard Worker
131*54e60f84SAndroid Build Coastguard Worker #define XNVCTRLCheckExtension(dpy,i,val) \
132*54e60f84SAndroid Build Coastguard Worker XextCheckExtension (dpy, i, nvctrl_extension_name, val)
133*54e60f84SAndroid Build Coastguard Worker #define XNVCTRLSimpleCheckExtension(dpy,i) \
134*54e60f84SAndroid Build Coastguard Worker XextSimpleCheckExtension (dpy, i, nvctrl_extension_name)
135*54e60f84SAndroid Build Coastguard Worker
136*54e60f84SAndroid Build Coastguard Worker static XEXT_GENERATE_CLOSE_DISPLAY(close_display, nvctrl_ext_info)
137*54e60f84SAndroid Build Coastguard Worker
138*54e60f84SAndroid Build Coastguard Worker static /* const */ XExtensionHooks nvctrl_extension_hooks = {
139*54e60f84SAndroid Build Coastguard Worker NULL, /* create_gc */
140*54e60f84SAndroid Build Coastguard Worker NULL, /* copy_gc */
141*54e60f84SAndroid Build Coastguard Worker NULL, /* flush_gc */
142*54e60f84SAndroid Build Coastguard Worker NULL, /* free_gc */
143*54e60f84SAndroid Build Coastguard Worker NULL, /* create_font */
144*54e60f84SAndroid Build Coastguard Worker NULL, /* free_font */
145*54e60f84SAndroid Build Coastguard Worker close_display, /* close_display */
146*54e60f84SAndroid Build Coastguard Worker NULL, /* wire_to_event */
147*54e60f84SAndroid Build Coastguard Worker NULL, /* event_to_wire */
148*54e60f84SAndroid Build Coastguard Worker NULL, /* error */
149*54e60f84SAndroid Build Coastguard Worker NULL, /* error_string */
150*54e60f84SAndroid Build Coastguard Worker };
151*54e60f84SAndroid Build Coastguard Worker
152*54e60f84SAndroid Build Coastguard Worker static XEXT_GENERATE_FIND_DISPLAY(find_display, nvctrl_ext_info,
153*54e60f84SAndroid Build Coastguard Worker nvctrl_extension_name,
154*54e60f84SAndroid Build Coastguard Worker &nvctrl_extension_hooks,
155*54e60f84SAndroid Build Coastguard Worker NV_CONTROL_EVENTS, NVCTRL_EXT_NEED_CHECK)
156*54e60f84SAndroid Build Coastguard Worker
157*54e60f84SAndroid Build Coastguard Worker static Bool XNVCTRLQueryVersion(Display *dpy, int *major, int *minor);
158*54e60f84SAndroid Build Coastguard Worker
159*54e60f84SAndroid Build Coastguard Worker /*
160*54e60f84SAndroid Build Coastguard Worker * NV-CONTROL versions 1.8 and 1.9 pack the target_type and target_id
161*54e60f84SAndroid Build Coastguard Worker * fields in reversed order. In order to talk to one of these servers,
162*54e60f84SAndroid Build Coastguard Worker * we need to swap these fields.
163*54e60f84SAndroid Build Coastguard Worker */
XNVCTRLCheckTargetData(Display * dpy,XExtDisplayInfo * info,int * target_type,int * target_id)164*54e60f84SAndroid Build Coastguard Worker static void XNVCTRLCheckTargetData(Display *dpy, XExtDisplayInfo *info,
165*54e60f84SAndroid Build Coastguard Worker int *target_type, int *target_id)
166*54e60f84SAndroid Build Coastguard Worker {
167*54e60f84SAndroid Build Coastguard Worker /* Find out what the server's NV-CONTROL version is and
168*54e60f84SAndroid Build Coastguard Worker * setup for swapping if we need to.
169*54e60f84SAndroid Build Coastguard Worker */
170*54e60f84SAndroid Build Coastguard Worker if (info->data == NVCTRL_EXT_NEED_CHECK) {
171*54e60f84SAndroid Build Coastguard Worker int major, minor;
172*54e60f84SAndroid Build Coastguard Worker
173*54e60f84SAndroid Build Coastguard Worker if (XNVCTRLQueryVersion(dpy, &major, &minor)) {
174*54e60f84SAndroid Build Coastguard Worker if (major == 1 &&
175*54e60f84SAndroid Build Coastguard Worker (minor == 8 || minor == 9)) {
176*54e60f84SAndroid Build Coastguard Worker info->data = NVCTRL_EXT_NEED_TARGET_SWAP;
177*54e60f84SAndroid Build Coastguard Worker } else {
178*54e60f84SAndroid Build Coastguard Worker info->data = NVCTRL_EXT_NEED_NOTHING;
179*54e60f84SAndroid Build Coastguard Worker }
180*54e60f84SAndroid Build Coastguard Worker } else {
181*54e60f84SAndroid Build Coastguard Worker info->data = NVCTRL_EXT_NEED_NOTHING;
182*54e60f84SAndroid Build Coastguard Worker }
183*54e60f84SAndroid Build Coastguard Worker }
184*54e60f84SAndroid Build Coastguard Worker
185*54e60f84SAndroid Build Coastguard Worker /* We need to swap the target_type and target_id */
186*54e60f84SAndroid Build Coastguard Worker if (info->data == NVCTRL_EXT_NEED_TARGET_SWAP) {
187*54e60f84SAndroid Build Coastguard Worker int tmp;
188*54e60f84SAndroid Build Coastguard Worker tmp = *target_type;
189*54e60f84SAndroid Build Coastguard Worker *target_type = *target_id;
190*54e60f84SAndroid Build Coastguard Worker *target_id = tmp;
191*54e60f84SAndroid Build Coastguard Worker }
192*54e60f84SAndroid Build Coastguard Worker }
193*54e60f84SAndroid Build Coastguard Worker
194*54e60f84SAndroid Build Coastguard Worker
XNVCTRLQueryExtension(Display * dpy,int * event_basep,int * error_basep)195*54e60f84SAndroid Build Coastguard Worker static Bool XNVCTRLQueryExtension(
196*54e60f84SAndroid Build Coastguard Worker Display *dpy,
197*54e60f84SAndroid Build Coastguard Worker int *event_basep,
198*54e60f84SAndroid Build Coastguard Worker int *error_basep
199*54e60f84SAndroid Build Coastguard Worker )
200*54e60f84SAndroid Build Coastguard Worker {
201*54e60f84SAndroid Build Coastguard Worker XExtDisplayInfo *info = find_display(dpy);
202*54e60f84SAndroid Build Coastguard Worker
203*54e60f84SAndroid Build Coastguard Worker if (XextHasExtension(info)) {
204*54e60f84SAndroid Build Coastguard Worker if (event_basep) *event_basep = info->codes->first_event;
205*54e60f84SAndroid Build Coastguard Worker if (error_basep) *error_basep = info->codes->first_error;
206*54e60f84SAndroid Build Coastguard Worker return True;
207*54e60f84SAndroid Build Coastguard Worker } else {
208*54e60f84SAndroid Build Coastguard Worker return False;
209*54e60f84SAndroid Build Coastguard Worker }
210*54e60f84SAndroid Build Coastguard Worker }
211*54e60f84SAndroid Build Coastguard Worker
212*54e60f84SAndroid Build Coastguard Worker
XNVCTRLQueryVersion(Display * dpy,int * major,int * minor)213*54e60f84SAndroid Build Coastguard Worker static Bool XNVCTRLQueryVersion(
214*54e60f84SAndroid Build Coastguard Worker Display *dpy,
215*54e60f84SAndroid Build Coastguard Worker int *major,
216*54e60f84SAndroid Build Coastguard Worker int *minor
217*54e60f84SAndroid Build Coastguard Worker )
218*54e60f84SAndroid Build Coastguard Worker {
219*54e60f84SAndroid Build Coastguard Worker XExtDisplayInfo *info = find_display(dpy);
220*54e60f84SAndroid Build Coastguard Worker xnvCtrlQueryExtensionReply rep;
221*54e60f84SAndroid Build Coastguard Worker xnvCtrlQueryExtensionReq *req;
222*54e60f84SAndroid Build Coastguard Worker
223*54e60f84SAndroid Build Coastguard Worker if (!XextHasExtension(info))
224*54e60f84SAndroid Build Coastguard Worker return False;
225*54e60f84SAndroid Build Coastguard Worker
226*54e60f84SAndroid Build Coastguard Worker XNVCTRLCheckExtension(dpy, info, False);
227*54e60f84SAndroid Build Coastguard Worker
228*54e60f84SAndroid Build Coastguard Worker LockDisplay(dpy);
229*54e60f84SAndroid Build Coastguard Worker GetReq(nvCtrlQueryExtension, req);
230*54e60f84SAndroid Build Coastguard Worker req->reqType = info->codes->major_opcode;
231*54e60f84SAndroid Build Coastguard Worker req->nvReqType = X_nvCtrlQueryExtension;
232*54e60f84SAndroid Build Coastguard Worker if (!_XReply(dpy, (xReply *) &rep, 0, xTrue)) {
233*54e60f84SAndroid Build Coastguard Worker UnlockDisplay(dpy);
234*54e60f84SAndroid Build Coastguard Worker SyncHandle();
235*54e60f84SAndroid Build Coastguard Worker return False;
236*54e60f84SAndroid Build Coastguard Worker }
237*54e60f84SAndroid Build Coastguard Worker if (major) *major = rep.major;
238*54e60f84SAndroid Build Coastguard Worker if (minor) *minor = rep.minor;
239*54e60f84SAndroid Build Coastguard Worker UnlockDisplay(dpy);
240*54e60f84SAndroid Build Coastguard Worker SyncHandle();
241*54e60f84SAndroid Build Coastguard Worker return True;
242*54e60f84SAndroid Build Coastguard Worker }
243*54e60f84SAndroid Build Coastguard Worker
244*54e60f84SAndroid Build Coastguard Worker
XNVCTRLIsNvScreen(Display * dpy,int screen)245*54e60f84SAndroid Build Coastguard Worker static Bool XNVCTRLIsNvScreen(
246*54e60f84SAndroid Build Coastguard Worker Display *dpy,
247*54e60f84SAndroid Build Coastguard Worker int screen
248*54e60f84SAndroid Build Coastguard Worker )
249*54e60f84SAndroid Build Coastguard Worker {
250*54e60f84SAndroid Build Coastguard Worker XExtDisplayInfo *info = find_display(dpy);
251*54e60f84SAndroid Build Coastguard Worker xnvCtrlIsNvReply rep;
252*54e60f84SAndroid Build Coastguard Worker xnvCtrlIsNvReq *req;
253*54e60f84SAndroid Build Coastguard Worker Bool isnv;
254*54e60f84SAndroid Build Coastguard Worker
255*54e60f84SAndroid Build Coastguard Worker if (!XextHasExtension(info))
256*54e60f84SAndroid Build Coastguard Worker return False;
257*54e60f84SAndroid Build Coastguard Worker
258*54e60f84SAndroid Build Coastguard Worker XNVCTRLCheckExtension(dpy, info, False);
259*54e60f84SAndroid Build Coastguard Worker
260*54e60f84SAndroid Build Coastguard Worker LockDisplay(dpy);
261*54e60f84SAndroid Build Coastguard Worker GetReq(nvCtrlIsNv, req);
262*54e60f84SAndroid Build Coastguard Worker req->reqType = info->codes->major_opcode;
263*54e60f84SAndroid Build Coastguard Worker req->nvReqType = X_nvCtrlIsNv;
264*54e60f84SAndroid Build Coastguard Worker req->screen = screen;
265*54e60f84SAndroid Build Coastguard Worker if (!_XReply(dpy, (xReply *) &rep, 0, xTrue)) {
266*54e60f84SAndroid Build Coastguard Worker UnlockDisplay(dpy);
267*54e60f84SAndroid Build Coastguard Worker SyncHandle();
268*54e60f84SAndroid Build Coastguard Worker return False;
269*54e60f84SAndroid Build Coastguard Worker }
270*54e60f84SAndroid Build Coastguard Worker isnv = rep.isnv;
271*54e60f84SAndroid Build Coastguard Worker UnlockDisplay(dpy);
272*54e60f84SAndroid Build Coastguard Worker SyncHandle();
273*54e60f84SAndroid Build Coastguard Worker return isnv;
274*54e60f84SAndroid Build Coastguard Worker }
275*54e60f84SAndroid Build Coastguard Worker
276*54e60f84SAndroid Build Coastguard Worker
XNVCTRLQueryTargetStringAttribute(Display * dpy,int target_type,int target_id,unsigned int display_mask,unsigned int attribute,char ** ptr)277*54e60f84SAndroid Build Coastguard Worker static Bool XNVCTRLQueryTargetStringAttribute(
278*54e60f84SAndroid Build Coastguard Worker Display *dpy,
279*54e60f84SAndroid Build Coastguard Worker int target_type,
280*54e60f84SAndroid Build Coastguard Worker int target_id,
281*54e60f84SAndroid Build Coastguard Worker unsigned int display_mask,
282*54e60f84SAndroid Build Coastguard Worker unsigned int attribute,
283*54e60f84SAndroid Build Coastguard Worker char **ptr
284*54e60f84SAndroid Build Coastguard Worker )
285*54e60f84SAndroid Build Coastguard Worker {
286*54e60f84SAndroid Build Coastguard Worker XExtDisplayInfo *info = find_display(dpy);
287*54e60f84SAndroid Build Coastguard Worker xnvCtrlQueryStringAttributeReply rep;
288*54e60f84SAndroid Build Coastguard Worker xnvCtrlQueryStringAttributeReq *req;
289*54e60f84SAndroid Build Coastguard Worker Bool exists;
290*54e60f84SAndroid Build Coastguard Worker int length, numbytes, slop;
291*54e60f84SAndroid Build Coastguard Worker
292*54e60f84SAndroid Build Coastguard Worker if (!ptr) return False;
293*54e60f84SAndroid Build Coastguard Worker
294*54e60f84SAndroid Build Coastguard Worker if (!XextHasExtension(info))
295*54e60f84SAndroid Build Coastguard Worker return False;
296*54e60f84SAndroid Build Coastguard Worker
297*54e60f84SAndroid Build Coastguard Worker XNVCTRLCheckExtension(dpy, info, False);
298*54e60f84SAndroid Build Coastguard Worker XNVCTRLCheckTargetData(dpy, info, &target_type, &target_id);
299*54e60f84SAndroid Build Coastguard Worker
300*54e60f84SAndroid Build Coastguard Worker LockDisplay(dpy);
301*54e60f84SAndroid Build Coastguard Worker GetReq(nvCtrlQueryStringAttribute, req);
302*54e60f84SAndroid Build Coastguard Worker req->reqType = info->codes->major_opcode;
303*54e60f84SAndroid Build Coastguard Worker req->nvReqType = X_nvCtrlQueryStringAttribute;
304*54e60f84SAndroid Build Coastguard Worker req->target_type = target_type;
305*54e60f84SAndroid Build Coastguard Worker req->target_id = target_id;
306*54e60f84SAndroid Build Coastguard Worker req->display_mask = display_mask;
307*54e60f84SAndroid Build Coastguard Worker req->attribute = attribute;
308*54e60f84SAndroid Build Coastguard Worker if (!_XReply(dpy, (xReply *) &rep, 0, False)) {
309*54e60f84SAndroid Build Coastguard Worker UnlockDisplay(dpy);
310*54e60f84SAndroid Build Coastguard Worker SyncHandle();
311*54e60f84SAndroid Build Coastguard Worker return False;
312*54e60f84SAndroid Build Coastguard Worker }
313*54e60f84SAndroid Build Coastguard Worker length = rep.length;
314*54e60f84SAndroid Build Coastguard Worker numbytes = rep.n;
315*54e60f84SAndroid Build Coastguard Worker slop = numbytes & 3;
316*54e60f84SAndroid Build Coastguard Worker *ptr = (char *) Xmalloc(numbytes);
317*54e60f84SAndroid Build Coastguard Worker if (! *ptr) {
318*54e60f84SAndroid Build Coastguard Worker _XEatData(dpy, length);
319*54e60f84SAndroid Build Coastguard Worker UnlockDisplay(dpy);
320*54e60f84SAndroid Build Coastguard Worker SyncHandle();
321*54e60f84SAndroid Build Coastguard Worker return False;
322*54e60f84SAndroid Build Coastguard Worker } else {
323*54e60f84SAndroid Build Coastguard Worker _XRead(dpy, (char *) *ptr, numbytes);
324*54e60f84SAndroid Build Coastguard Worker if (slop) _XEatData(dpy, 4 - slop);
325*54e60f84SAndroid Build Coastguard Worker }
326*54e60f84SAndroid Build Coastguard Worker exists = rep.flags;
327*54e60f84SAndroid Build Coastguard Worker UnlockDisplay(dpy);
328*54e60f84SAndroid Build Coastguard Worker SyncHandle();
329*54e60f84SAndroid Build Coastguard Worker return exists;
330*54e60f84SAndroid Build Coastguard Worker }
331*54e60f84SAndroid Build Coastguard Worker
XNVCTRLQueryStringAttribute(Display * dpy,int screen,unsigned int display_mask,unsigned int attribute,char ** ptr)332*54e60f84SAndroid Build Coastguard Worker static Bool XNVCTRLQueryStringAttribute(
333*54e60f84SAndroid Build Coastguard Worker Display *dpy,
334*54e60f84SAndroid Build Coastguard Worker int screen,
335*54e60f84SAndroid Build Coastguard Worker unsigned int display_mask,
336*54e60f84SAndroid Build Coastguard Worker unsigned int attribute,
337*54e60f84SAndroid Build Coastguard Worker char **ptr
338*54e60f84SAndroid Build Coastguard Worker )
339*54e60f84SAndroid Build Coastguard Worker {
340*54e60f84SAndroid Build Coastguard Worker return XNVCTRLQueryTargetStringAttribute(dpy, NV_CTRL_TARGET_TYPE_X_SCREEN,
341*54e60f84SAndroid Build Coastguard Worker screen, display_mask,
342*54e60f84SAndroid Build Coastguard Worker attribute, ptr);
343*54e60f84SAndroid Build Coastguard Worker }
344*54e60f84SAndroid Build Coastguard Worker
345*54e60f84SAndroid Build Coastguard Worker
VA_NVCTRLQueryDirectRenderingCapable(Display * dpy,int screen,Bool * isCapable)346*54e60f84SAndroid Build Coastguard Worker static Bool VA_NVCTRLQueryDirectRenderingCapable(Display *dpy, int screen,
347*54e60f84SAndroid Build Coastguard Worker Bool *isCapable)
348*54e60f84SAndroid Build Coastguard Worker {
349*54e60f84SAndroid Build Coastguard Worker int event_base;
350*54e60f84SAndroid Build Coastguard Worker int error_base;
351*54e60f84SAndroid Build Coastguard Worker
352*54e60f84SAndroid Build Coastguard Worker if (isCapable)
353*54e60f84SAndroid Build Coastguard Worker *isCapable = False;
354*54e60f84SAndroid Build Coastguard Worker
355*54e60f84SAndroid Build Coastguard Worker if (!XNVCTRLQueryExtension(dpy, &event_base, &error_base))
356*54e60f84SAndroid Build Coastguard Worker return False;
357*54e60f84SAndroid Build Coastguard Worker
358*54e60f84SAndroid Build Coastguard Worker if (isCapable && XNVCTRLIsNvScreen(dpy, screen))
359*54e60f84SAndroid Build Coastguard Worker *isCapable = True;
360*54e60f84SAndroid Build Coastguard Worker
361*54e60f84SAndroid Build Coastguard Worker return True;
362*54e60f84SAndroid Build Coastguard Worker }
363*54e60f84SAndroid Build Coastguard Worker
VA_NVCTRLGetClientDriverName(Display * dpy,int screen,char ** clientDriverName)364*54e60f84SAndroid Build Coastguard Worker static Bool VA_NVCTRLGetClientDriverName(Display *dpy, int screen,
365*54e60f84SAndroid Build Coastguard Worker char **clientDriverName)
366*54e60f84SAndroid Build Coastguard Worker {
367*54e60f84SAndroid Build Coastguard Worker int ddxDriverMajorVersion, ddxDriverMinorVersion, ddxDriverPatchVersion;
368*54e60f84SAndroid Build Coastguard Worker
369*54e60f84SAndroid Build Coastguard Worker char *nvidia_driver_version = NULL;
370*54e60f84SAndroid Build Coastguard Worker if (!XNVCTRLQueryStringAttribute(dpy, screen, 0, NV_CTRL_STRING_NVIDIA_DRIVER_VERSION, &nvidia_driver_version))
371*54e60f84SAndroid Build Coastguard Worker return False;
372*54e60f84SAndroid Build Coastguard Worker
373*54e60f84SAndroid Build Coastguard Worker char *end, *str = nvidia_driver_version;
374*54e60f84SAndroid Build Coastguard Worker unsigned long v = strtoul(str, &end, 10);
375*54e60f84SAndroid Build Coastguard Worker if (end && end != str) {
376*54e60f84SAndroid Build Coastguard Worker ddxDriverMajorVersion = v;
377*54e60f84SAndroid Build Coastguard Worker if (*(str = end) == '.') {
378*54e60f84SAndroid Build Coastguard Worker v = strtoul(str + 1, &end, 10);
379*54e60f84SAndroid Build Coastguard Worker if (end && end != str && (*end == '.' || *end == '\0')) {
380*54e60f84SAndroid Build Coastguard Worker ddxDriverMinorVersion = v;
381*54e60f84SAndroid Build Coastguard Worker if (*(str = end) == '.') {
382*54e60f84SAndroid Build Coastguard Worker v = strtoul(str + 1, &end, 10);
383*54e60f84SAndroid Build Coastguard Worker if (end && end != str && *end == '\0') {
384*54e60f84SAndroid Build Coastguard Worker ddxDriverPatchVersion = v;
385*54e60f84SAndroid Build Coastguard Worker }
386*54e60f84SAndroid Build Coastguard Worker }
387*54e60f84SAndroid Build Coastguard Worker }
388*54e60f84SAndroid Build Coastguard Worker }
389*54e60f84SAndroid Build Coastguard Worker }
390*54e60f84SAndroid Build Coastguard Worker Xfree(nvidia_driver_version);
391*54e60f84SAndroid Build Coastguard Worker (void) ddxDriverMajorVersion;
392*54e60f84SAndroid Build Coastguard Worker (void) ddxDriverMinorVersion;
393*54e60f84SAndroid Build Coastguard Worker (void) ddxDriverPatchVersion;
394*54e60f84SAndroid Build Coastguard Worker
395*54e60f84SAndroid Build Coastguard Worker *clientDriverName = strdup("nvidia");
396*54e60f84SAndroid Build Coastguard Worker
397*54e60f84SAndroid Build Coastguard Worker return True;
398*54e60f84SAndroid Build Coastguard Worker }
399*54e60f84SAndroid Build Coastguard Worker
va_NVCTRL_GetDriverNames(VADisplayContextP pDisplayContext,char ** drivers,unsigned * num_drivers)400*54e60f84SAndroid Build Coastguard Worker VAStatus va_NVCTRL_GetDriverNames(
401*54e60f84SAndroid Build Coastguard Worker VADisplayContextP pDisplayContext,
402*54e60f84SAndroid Build Coastguard Worker char **drivers,
403*54e60f84SAndroid Build Coastguard Worker unsigned *num_drivers
404*54e60f84SAndroid Build Coastguard Worker )
405*54e60f84SAndroid Build Coastguard Worker {
406*54e60f84SAndroid Build Coastguard Worker VADriverContextP ctx = pDisplayContext->pDriverContext;
407*54e60f84SAndroid Build Coastguard Worker int direct_capable;
408*54e60f84SAndroid Build Coastguard Worker
409*54e60f84SAndroid Build Coastguard Worker if (!VA_NVCTRLQueryDirectRenderingCapable(ctx->native_dpy, ctx->x11_screen,
410*54e60f84SAndroid Build Coastguard Worker &direct_capable) || !direct_capable)
411*54e60f84SAndroid Build Coastguard Worker return VA_STATUS_ERROR_UNKNOWN;
412*54e60f84SAndroid Build Coastguard Worker
413*54e60f84SAndroid Build Coastguard Worker if (!VA_NVCTRLGetClientDriverName(ctx->native_dpy, ctx->x11_screen,
414*54e60f84SAndroid Build Coastguard Worker drivers))
415*54e60f84SAndroid Build Coastguard Worker return VA_STATUS_ERROR_UNKNOWN;
416*54e60f84SAndroid Build Coastguard Worker
417*54e60f84SAndroid Build Coastguard Worker *num_drivers = 1;
418*54e60f84SAndroid Build Coastguard Worker return VA_STATUS_SUCCESS;
419*54e60f84SAndroid Build Coastguard Worker }
420*54e60f84SAndroid Build Coastguard Worker
421*54e60f84SAndroid Build Coastguard Worker #endif
422