xgi_opt.c revision 098ad5bd
1/*
2 * Video driver option evaluation
3 *
4 * Copyright (C) 2001-2004 by Thomas Winischhofer, Vienna, Austria
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1) Redistributions of source code must retain the above copyright
10 *    notice, this list of conditions and the following disclaimer.
11 * 2) Redistributions in binary form must reproduce the above copyright
12 *    notice, this list of conditions and the following disclaimer in the
13 *    documentation and/or other materials provided with the distribution.
14 * 3) The name of the author may not be used to endorse or promote products
15 *    derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESSED OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 *
28 * "NoAccel", "NoXVideo", "SWCursor", "HWCursor" and "Rotate" option portions
29 * Copyright (C) 1999-2004 The XFree86 Project, Inc. Licensed under the terms
30 * of the XFree86 license (http://www.xfree86.org/current/LICENSE1.html).
31 *
32 * Authors:  	Thomas Winischhofer <thomas@winischhofer.net>
33 *              ?
34 */
35
36#ifdef HAVE_CONFIG_H
37#include "config.h"
38#endif
39
40#include "xf86.h"
41#include "xf86PciInfo.h"
42#include "xf86str.h"
43#include "xf86Cursor.h"
44
45#include "xgi.h"
46
47typedef enum {
48    OPTION_SW_CURSOR,
49    OPTION_HW_CURSOR,
50    OPTION_ACCELMETHOD,
51    OPTION_NOACCEL,
52    OPTION_TURBOQUEUE,
53    OPTION_RENDER,
54    OPTION_FORCE_CRT1TYPE,
55    OPTION_FORCE_CRT2TYPE,
56    OPTION_YPBPRAR,
57    OPTION_SHADOW_FB,
58    OPTION_DRI,
59    OPTION_AGP_SIZE,
60    OPTION_AGP_SIZE2,
61    OPTION_ROTATE,
62    OPTION_NOXVIDEO,
63    OPTION_MAXXFBMEM,
64    OPTION_USEROMDATA,
65    OPTION_NOINTERNALMODES,
66    OPTION_RESTOREBYSET,
67    OPTION_NODDCFORCRT2,
68    OPTION_FORCECRT2REDETECTION,
69    OPTION_SENSEYPBPR,
70    OPTION_CRT1GAMMA,
71    OPTION_CRT2GAMMA,
72    OPTION_XVGAMMA,
73    OPTION_XVDEFCONTRAST,
74    OPTION_XVDEFBRIGHTNESS,
75    OPTION_XVDEFHUE,
76    OPTION_XVDEFSATURATION,
77    OPTION_XVDEFDISABLEGFX,
78    OPTION_XVDEFDISABLEGFXLR,
79    OPTION_XVMEMCPY,
80    OPTION_SCALELCD,
81    OPTION_CENTERLCD,
82    OPTION_SPECIALTIMING,
83    OPTION_ENABLEHOTKEY,
84    OPTION_MERGEDFB,
85    OPTION_MERGEDFBAUTO,
86    OPTION_CRT2HSYNC,
87    OPTION_CRT2VREFRESH,
88    OPTION_CRT2POS,
89    OPTION_METAMODES,
90    OPTION_MERGEDFB2,
91    OPTION_CRT2HSYNC2,
92    OPTION_CRT2VREFRESH2,
93    OPTION_CRT2POS2,
94    OPTION_NOXGIXINERAMA,
95    OPTION_NOXGIXINERAMA2,
96    OPTION_CRT2ISSCRN0,
97    OPTION_MERGEDDPI,
98    OPTION_ENABLEXGICTRL,
99    OPTION_STOREDBRI,
100    OPTION_STOREDPBRI,
101    OPTION_RUNTIME_DEBUG,  /* Jong 07/27/2009 */
102	OPTION_TARGET_RATE,    /* Jong@09032009 */
103	OPTION_IGNORE_DDC,     /* Jong@09032009 */
104	OPTION_NONDDC_DEFAULT_MODE, /* Jong@09042009 */
105	OPTION_GAMMA_RGB,			/* Jong@09092009 */
106#ifdef XGI_CP
107    XGI_CP_OPT_OPTIONS
108#endif
109    OPTION_PSEUDO
110} XGIOpts;
111
112static const OptionInfoRec XGIOptions[] = {
113    { OPTION_SW_CURSOR,         	"SWcursor",               OPTV_BOOLEAN,   {0}, FALSE },
114    { OPTION_HW_CURSOR,         	"HWcursor",               OPTV_BOOLEAN,   {0}, FALSE },
115    { OPTION_ACCELMETHOD,			"AccelMethod",			OPTV_STRING,	{0}, FALSE },
116    { OPTION_NOACCEL,           	"NoAccel",                OPTV_BOOLEAN,   {0}, FALSE },
117    { OPTION_TURBOQUEUE,        	"TurboQueue",             OPTV_BOOLEAN,   {0}, FALSE },
118    { OPTION_RENDER,        		"RenderAcceleration",     OPTV_BOOLEAN,   {0}, FALSE },
119    { OPTION_FORCE_CRT1TYPE,    	"ForceCRT1Type",          OPTV_STRING,    {0}, FALSE },
120    { OPTION_FORCE_CRT2TYPE,    	"ForceCRT2Type",          OPTV_STRING,    {0}, FALSE },
121    { OPTION_YPBPRAR,  		  		"YPbPrAspectRatio",       OPTV_STRING,    {0}, FALSE },
122    { OPTION_SHADOW_FB,         	"ShadowFB",               OPTV_BOOLEAN,   {0}, FALSE },
123    { OPTION_DRI,         		"DRI",               	  OPTV_BOOLEAN,   {0}, FALSE },
124    { OPTION_AGP_SIZE,			"AGPSize",      	  OPTV_INTEGER,   {0}, FALSE },
125    { OPTION_AGP_SIZE2,			"GARTSize",      	  OPTV_INTEGER,   {0}, FALSE },
126    { OPTION_ROTATE,            	"Rotate",                 OPTV_STRING,    {0}, FALSE },
127    { OPTION_NOXVIDEO,          	"NoXvideo",               OPTV_BOOLEAN,   {0}, FALSE },
128    { OPTION_MAXXFBMEM,         	"MaxXFBMem",              OPTV_INTEGER,   {0}, -1    },
129    { OPTION_SPECIALTIMING,        	"SpecialTiming",          OPTV_STRING,    {0}, -1    },
130    { OPTION_USEROMDATA,		"UseROMData",	          OPTV_BOOLEAN,   {0}, -1    },
131    { OPTION_NOINTERNALMODES,   	"NoInternalModes",        OPTV_BOOLEAN,   {0}, FALSE },
132    { OPTION_RESTOREBYSET,		"RestoreBySetMode", 	  OPTV_BOOLEAN,   {0}, -1    },
133    { OPTION_NODDCFORCRT2,		"NoCRT2Detection", 	  OPTV_BOOLEAN,   {0}, -1    },
134    { OPTION_FORCECRT2REDETECTION,	"ForceCRT2ReDetection",   OPTV_BOOLEAN,   {0}, -1    },
135    { OPTION_SENSEYPBPR,		"SenseYPbPr",   	  OPTV_BOOLEAN,   {0}, -1    },
136    { OPTION_CRT1GAMMA,			"CRT1Gamma", 	  	  OPTV_BOOLEAN,   {0}, -1    },
137    { OPTION_CRT2GAMMA,			"CRT2Gamma", 	  	  OPTV_BOOLEAN,   {0}, -1    },
138    { OPTION_STOREDBRI,			"StoredGammaBrightness",  OPTV_STRING,    {0}, -1    },
139    { OPTION_STOREDPBRI,		"StoredGammaPreBrightness",OPTV_STRING,   {0}, -1    },
140    { OPTION_XVGAMMA,			"XvGamma", 	  	  OPTV_STRING,    {0}, -1    },
141    { OPTION_XVDEFCONTRAST,		"XvDefaultContrast", 	  OPTV_INTEGER,   {0}, -1    },
142    { OPTION_XVDEFBRIGHTNESS,		"XvDefaultBrightness", 	  OPTV_INTEGER,   {0}, -1    },
143    { OPTION_XVDEFHUE,			"XvDefaultHue", 	  OPTV_INTEGER,   {0}, -1    },
144    { OPTION_XVDEFSATURATION,		"XvDefaultSaturation", 	  OPTV_INTEGER,   {0}, -1    },
145    { OPTION_XVDEFDISABLEGFX,		"XvDefaultDisableGfx", 	  OPTV_BOOLEAN,   {0}, -1    },
146    { OPTION_XVDEFDISABLEGFXLR,		"XvDefaultDisableGfxLR",  OPTV_BOOLEAN,   {0}, -1    },
147    { OPTION_XVMEMCPY,			"XvUseMemcpy",  	  OPTV_BOOLEAN,   {0}, -1    },
148    { OPTION_ENABLEHOTKEY,		"EnableHotkey",	   	  OPTV_BOOLEAN,   {0}, -1    },
149    { OPTION_ENABLEXGICTRL,		"EnableXGICtrl",   	  OPTV_BOOLEAN,   {0}, -1    },
150#ifdef XGIMERGED
151    { OPTION_MERGEDFB,			"MergedFB",		  OPTV_BOOLEAN,	  {0}, FALSE },
152    { OPTION_MERGEDFB2,			"TwinView",		  OPTV_BOOLEAN,	  {0}, FALSE },	  /* alias */
153    { OPTION_MERGEDFBAUTO,		"MergedFBAuto",		  OPTV_BOOLEAN,	  {0}, FALSE },
154    { OPTION_CRT2HSYNC,			"CRT2HSync",		  OPTV_STRING,	  {0}, FALSE },
155    { OPTION_CRT2HSYNC2,		"SecondMonitorHorizSync", OPTV_STRING,	  {0}, FALSE },   /* alias */
156    { OPTION_CRT2VREFRESH,		"CRT2VRefresh",		  OPTV_STRING,    {0}, FALSE },
157    { OPTION_CRT2VREFRESH2,		"SecondMonitorVertRefresh", OPTV_STRING,  {0}, FALSE },   /* alias */
158    { OPTION_CRT2POS,   		"CRT2Position",		  OPTV_STRING,	  {0}, FALSE },
159    { OPTION_CRT2POS2,   		"TwinViewOrientation",	  OPTV_STRING,	  {0}, FALSE },   /* alias */
160    { OPTION_METAMODES,   		"MetaModes",  		  OPTV_STRING,	  {0}, FALSE },
161    { OPTION_MERGEDDPI,			"MergedDPI", 		  OPTV_STRING,	  {0}, FALSE },
162    { OPTION_RUNTIME_DEBUG,		"RunTimeDebug",      	  OPTV_BOOLEAN,   {0}, -1 }, /* Jong 07/27/2009 */
163    { OPTION_TARGET_RATE,		"TargetRate",      	  OPTV_INTEGER,   {0}, -1 }, /* Jong@09032009 */
164    { OPTION_IGNORE_DDC,		"IgnoreDDC",      	  OPTV_BOOLEAN,   {0}, -1 }, /* Jong@09032009 */
165    { OPTION_NONDDC_DEFAULT_MODE,		"NonDDCDefaultMode",      	  OPTV_STRING,   {0}, FALSE }, /* Jong@09042009 */
166    { OPTION_GAMMA_RGB,			"GammaRGB",      	  OPTV_STRING,   {0}, FALSE }, /* Jong@09092009 */
167#ifdef XGIXINERAMA
168    { OPTION_NOXGIXINERAMA,		"NoMergedXinerama",	  OPTV_BOOLEAN,	  {0}, FALSE },
169    { OPTION_NOXGIXINERAMA2,		"NoTwinviewXineramaInfo", OPTV_BOOLEAN,   {0}, FALSE },   /* alias */
170    { OPTION_CRT2ISSCRN0,		"MergedXineramaCRT2IsScreen0",OPTV_BOOLEAN,{0},FALSE },
171#endif
172#endif
173#ifdef XGI_CP
174    XGI_CP_OPTION_DETAIL
175#endif
176    { -1,                       	NULL,                     OPTV_NONE,      {0}, FALSE }
177};
178
179unsigned int g_GammaRed;
180unsigned int g_GammaGreen;
181unsigned int g_GammaBlue;
182
183void
184xgiOptions(ScrnInfoPtr pScrn)
185{
186    XGIPtr      pXGI = XGIPTR(pScrn);
187    MessageType from;
188    char        *strptr;
189    static const char *mybadparm = "\"%s\" is is not a valid parameter for option \"%s\"\n";
190    static const char *disabledstr = "disabled";
191    static const char *enabledstr = "enabled";
192    static const char *ilrangestr = "Illegal %s parameter. Valid range is %d through %d\n";
193
194    /* Collect all of the relevant option flags (fill in pScrn->options) */
195    xf86CollectOptions(pScrn, NULL);
196
197    /* Process the options */
198    if(!(pXGI->Options = xalloc(sizeof(XGIOptions)))) return;
199
200    memcpy(pXGI->Options, XGIOptions, sizeof(XGIOptions));
201
202    xf86ProcessOptions(pScrn->scrnIndex, pScrn->options, pXGI->Options);
203
204    /* Set defaults */
205/*
206#ifdef __powerpc__
207    pXGI->NoAccel = TRUE;
208#endif
209*/
210    pXGI->TurboQueue = TRUE;
211#ifdef XGIVRAMQ
212    /* TODO: Option (315 series VRAM command queue) */
213    /* But beware: xgifb does not know about this!!! */
214    pXGI->cmdQueueSize = 512*1024;
215#endif
216    pXGI->doRender = TRUE;
217    pXGI->HWCursor = TRUE;
218    pXGI->Rotate = FALSE;
219    pXGI->ShadowFB = FALSE;
220
221	/* Jong 01/22/2009; only XG40 has 3-d feature */
222	if(pXGI->Chipset == PCI_CHIP_XGIXG40)
223		pXGI->loadDRI = TRUE;
224	else
225		pXGI->loadDRI = FALSE;
226
227    pXGI->agpWantedPages = AGP_PAGES;
228    pXGI->NoXvideo = FALSE;
229    pXGI->maxxfbmem = 0;
230    pXGI->OptROMUsage = -1;
231    pXGI->noInternalModes = FALSE;
232    pXGI->NonDefaultPAL = pXGI->NonDefaultNTSC = -1;
233    pXGI->restorebyset = TRUE;
234    pXGI->nocrt2ddcdetection = FALSE;
235    pXGI->forcecrt2redetection = TRUE;   /* default changed since 13/09/2003 */
236    pXGI->SenseYPbPr = TRUE;
237    pXGI->ForceCRT1Type = CRT1_VGA;
238    pXGI->ForceCRT2Type = CRT2_DEFAULT;
239    pXGI->ForceYPbPrAR = TV_YPBPR169;
240    pXGI->ForceTVType = -1;
241    pXGI->CRT1gamma = TRUE;
242    pXGI->CRT1gammaGiven = FALSE;
243    pXGI->CRT2gamma = TRUE;
244    pXGI->XvGamma = FALSE;
245    pXGI->XvGammaGiven = FALSE;
246    pXGI->enablexgictrl = FALSE;
247
248       pXGI->XvDefBri = 0;
249       pXGI->XvDefCon = 4;
250
251    pXGI->XvDefHue = 0;
252    pXGI->XvDefSat = 0;
253    pXGI->XvDefDisableGfx = FALSE;
254    pXGI->XvDefDisableGfxLR = FALSE;
255    pXGI->XvUseMemcpy = TRUE;
256    pXGI->XvGammaRed = pXGI->XvGammaGreen = pXGI->XvGammaBlue = 1000;
257#ifdef XGIMERGED
258    pXGI->MergedFB = pXGI->MergedFBAuto = FALSE;
259    pXGI->CRT2Position = xgiRightOf;
260    pXGI->CRT2HSync = NULL;
261    pXGI->CRT2VRefresh = NULL;
262    pXGI->MetaModes = NULL;
263    pXGI->MergedFBXDPI = pXGI->MergedFBYDPI = 0;
264#ifdef XGIXINERAMA
265    pXGI->UsexgiXinerama = TRUE;
266    pXGI->CRT2IsScrn0 = FALSE;
267#endif
268#endif
269#ifdef XGI_CP
270    XGI_CP_OPT_DEFAULT
271#endif
272
273
274    /* Collect the options */
275
276	int	TargetRefreshRate = 0;
277    if(xf86GetOptValInteger(pXGI->Options /* pScrn->monitor->options */, OPTION_TARGET_RATE, &TargetRefreshRate))
278	{
279		xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Monitor (Option) : Set target refresh rate at %d for all modes...\n", TargetRefreshRate);
280	}
281
282    pXGI->TargetRefreshRate = TargetRefreshRate;
283
284	pXGI->IgnoreDDC = FALSE;
285    if(xf86GetOptValBool(pXGI->Options, OPTION_IGNORE_DDC, &pXGI->IgnoreDDC))
286	{
287		if(pXGI->IgnoreDDC == TRUE)
288			xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Monitor (Option) : IgnoreDDC \n");
289	}
290#if 0 /* can support 1280x768 but not being applied */
291	else
292	{
293		pXGI->IgnoreDDC = TRUE;
294		xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Monitor (Option) : set IgnoreDDC as default\n");
295	}
296#endif
297
298	pXGI->Non_DDC_DefaultMode = FALSE;
299	pXGI->Non_DDC_DefaultResolutionX = 1024;
300	pXGI->Non_DDC_DefaultResolutionY = 768;
301	pXGI->Non_DDC_DefaultRefreshRate = 60;
302
303	char	ModeStringFormat[32] = 	"%[^x]x%[^@]@%[^\n]" /* "%[^x]+%[^@]+%[^H^z]" */;
304    char*   Non_DDCDefaultMode = "";
305    char   Non_DDCDefaultResolutionX[8] = "";
306    char   Non_DDCDefaultResolutionY[8] = "";
307    char   Non_DDCDefaultRefreshRate[8] = "";
308
309	/* strcpy(ModeStringFormat, "%[^+]x%[^+]@%[^\n]"); */
310
311	if((Non_DDCDefaultMode = (char *)xf86GetOptValString(pXGI->Options, OPTION_NONDDC_DEFAULT_MODE)))
312	{
313		sscanf(Non_DDCDefaultMode, ModeStringFormat,
314				Non_DDCDefaultResolutionX ,
315				Non_DDCDefaultResolutionY ,
316				Non_DDCDefaultRefreshRate  );
317
318		if( (xf86NameCmp(Non_DDCDefaultResolutionX,"") == 0) || (xf86NameCmp(Non_DDCDefaultResolutionY,"") == 0) )
319		{
320			strcpy(Non_DDCDefaultResolutionX, "1024");
321			strcpy(Non_DDCDefaultResolutionY, "768");
322		}
323
324		if( (xf86NameCmp(Non_DDCDefaultRefreshRate,"") == 0) || (xf86NameCmp(Non_DDCDefaultRefreshRate,"auto") == 0) )
325				strcpy(Non_DDCDefaultRefreshRate, "60");
326
327		ErrorF("Non-DDC default mode is (%s x %s @ %s Hz)...\n",
328					Non_DDCDefaultResolutionX ,
329					Non_DDCDefaultResolutionY ,
330					Non_DDCDefaultRefreshRate );
331
332		pXGI->Non_DDC_DefaultMode = TRUE;
333
334		pXGI->Non_DDC_DefaultResolutionX = atoi(Non_DDCDefaultResolutionX);
335		pXGI->Non_DDC_DefaultResolutionY = atoi(Non_DDCDefaultResolutionY);
336		pXGI->Non_DDC_DefaultRefreshRate = atoi(Non_DDCDefaultRefreshRate);
337
338		ErrorF("Non-DDC default mode is (%d x %d @ %d Hz)...\n",
339					pXGI->Non_DDC_DefaultResolutionX ,
340					pXGI->Non_DDC_DefaultResolutionY ,
341					pXGI->Non_DDC_DefaultRefreshRate );
342	}
343
344	/* Jong@09092009; gamma value */
345	g_GammaRed = g_GammaGreen = g_GammaBlue = 1000;
346
347	char	GammaStringFormat[32] = "%[^,],%[^,],%[^\n]";
348    char*   GammaRGB = "";
349    char   GammaRed[8] = "";
350    char   GammaGreen[8] = "";
351    char   GammaBlue[8] = "";
352
353	if((GammaRGB = (char *)xf86GetOptValString(pXGI->Options, OPTION_GAMMA_RGB)))
354	{
355		ErrorF("GammaRGB is (%s) from xorg.conf\n", GammaRGB);
356		sscanf(GammaRGB, GammaStringFormat,
357				GammaRed ,
358				GammaGreen ,
359				GammaBlue  );
360		ErrorF("GammaRGB is (%s, %s, %s) after parsing\n", GammaRed, GammaGreen, GammaBlue);
361
362		g_GammaRed = atoi(GammaRed);
363		g_GammaGreen = atoi(GammaGreen);
364		g_GammaBlue = atoi(GammaBlue);
365
366		ErrorF("GammaRGB is (%d, %d, %d) after atoi()\n", g_GammaRed, g_GammaGreen, g_GammaBlue);
367	}
368
369    /* MaxXFBMem
370     * This options limits the amount of video memory X uses for screen
371     * and off-screen buffers. This option should be used if using DRI
372     * is intended. The kernel framebuffer driver required for DRM will
373     * start its memory heap at 12MB if it detects more than 16MB, at 8MB if
374     * between 8 and 16MB are available, otherwise at 4MB. So, if the amount
375     * of memory X uses, a clash between the framebuffer's memory heap
376     * and X is avoided. The amount is to be specified in KB.
377     */
378    if(xf86GetOptValULong(pXGI->Options, OPTION_MAXXFBMEM,
379                                &pXGI->maxxfbmem)) {
380            xf86DrvMsg(pScrn->scrnIndex, X_CONFIG,
381                    "MaxXFBMem: Framebuffer memory shall be limited to %ld KB\n",
382		    pXGI->maxxfbmem);
383	    pXGI->maxxfbmem *= 1024;
384    }
385
386    /* NoAccel
387     * Turns off 2D acceleration
388     */
389    if(xf86ReturnOptValBool(pXGI->Options, OPTION_NOACCEL, FALSE)) {
390        pXGI->NoAccel = TRUE;
391	xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "2D Acceleration disabled\n");
392    }
393
394	/* Jong@10022009; for xvinfo */
395	if ((pXGI->Chipset== PCI_CHIP_XGIXG20)||(pXGI->Chipset== PCI_CHIP_XGIXG21)||(pXGI->Chipset== PCI_CHIP_XGIXG27))
396		pXGI->NoXvideo = TRUE;
397
398	pXGI->useEXA = FALSE; /* default : XAA */
399    if(!pXGI->NoAccel)
400	{
401		from = X_DEFAULT;
402		if((strptr = (char *)xf86GetOptValString(pXGI->Options, OPTION_ACCELMETHOD))) {
403			if(!xf86NameCmp(strptr,"XAA")) {
404				from = X_CONFIG;
405				pXGI->useEXA = FALSE;
406			} else if(!xf86NameCmp(strptr,"EXA")) {
407				from = X_CONFIG;
408				pXGI->useEXA = TRUE;
409			}
410		}
411
412		xf86DrvMsg(pScrn->scrnIndex, from, "Using %s acceleration architecture\n",
413			pXGI->useEXA ? "EXA" : "XAA");
414    }
415
416    /* SWCursor
417     * HWCursor
418     * Chooses whether to use the hardware or software cursor
419     */
420    from = X_DEFAULT;
421    if(xf86GetOptValBool(pXGI->Options, OPTION_HW_CURSOR, &pXGI->HWCursor)) {
422        from = X_CONFIG;
423    }
424    if(xf86ReturnOptValBool(pXGI->Options, OPTION_SW_CURSOR, FALSE)) {
425        from = X_CONFIG;
426        pXGI->HWCursor = FALSE;
427    }
428    xf86DrvMsg(pScrn->scrnIndex, from, "Using %s cursor\n",
429                                pXGI->HWCursor ? "HW" : "SW");
430
431    /*
432     * MergedFB
433     *
434     * Enable/disable and configure merged framebuffer mode
435     *
436     */
437#ifdef XGIMERGED
438    if (IS_DUAL_HEAD(pXGI)) {
439       Bool val;
440       if(xf86GetOptValBool(pXGI->Options, OPTION_MERGEDFB, &val)) {
441          xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
442	     "Option \"MergedFB\" cannot be used in Dual Head mode\n");
443       }
444    } else
445#endif
446
447    /* Some options can only be specified in the Master Head's Device
448     * section. Here we give the user a hint in the log.
449     */
450    if (IS_DUAL_HEAD(pXGI) && IS_SECOND_HEAD(pXGI)) {
451       static const char *mystring = "Option \"%s\" is only accepted in Master Head's device section\n";
452       Bool val;
453
454       if(xf86GetOptValBool(pXGI->Options, OPTION_TURBOQUEUE, &val)) {
455          xf86DrvMsg(pScrn->scrnIndex, X_WARNING, mystring, "TurboQueue");
456       }
457       if(xf86GetOptValBool(pXGI->Options, OPTION_RESTOREBYSET, &val)) {
458          xf86DrvMsg(pScrn->scrnIndex, X_WARNING, mystring, "RestoreBySetMode");
459       }
460       if(xf86GetOptValBool(pXGI->Options, OPTION_ENABLEHOTKEY, &val)) {
461          xf86DrvMsg(pScrn->scrnIndex, X_WARNING, mystring, "EnableHotKey");
462       }
463       if(xf86GetOptValBool(pXGI->Options, OPTION_ENABLEXGICTRL, &val)) {
464          xf86DrvMsg(pScrn->scrnIndex, X_WARNING, mystring, "EnableXGICtrl");
465       }
466       if(xf86GetOptValBool(pXGI->Options, OPTION_USEROMDATA, &val)) {
467          xf86DrvMsg(pScrn->scrnIndex, X_WARNING, mystring, "UseROMData");
468       }
469       if(xf86GetOptValBool(pXGI->Options, OPTION_NODDCFORCRT2, &val)) {
470          xf86DrvMsg(pScrn->scrnIndex, X_WARNING, mystring, "NoCRT2Detection");
471       }
472       if(xf86GetOptValBool(pXGI->Options, OPTION_FORCECRT2REDETECTION, &val)) {
473          xf86DrvMsg(pScrn->scrnIndex, X_WARNING, mystring, "ForceCRT2ReDetection");
474       }
475       if(xf86GetOptValBool(pXGI->Options, OPTION_SENSEYPBPR, &val)) {
476          xf86DrvMsg(pScrn->scrnIndex, X_WARNING, mystring, "SenseYPbPr");
477       }
478       if(xf86GetOptValString(pXGI->Options, OPTION_FORCE_CRT1TYPE)) {
479          xf86DrvMsg(pScrn->scrnIndex, X_WARNING, mystring, "ForceCRT1Type");
480       }
481       if(xf86GetOptValString(pXGI->Options, OPTION_FORCE_CRT2TYPE)) {
482          xf86DrvMsg(pScrn->scrnIndex, X_WARNING, mystring, "ForceCRT2Type");
483       }
484       if(xf86GetOptValString(pXGI->Options, OPTION_YPBPRAR)) {
485          xf86DrvMsg(pScrn->scrnIndex, X_WARNING, mystring, "YPbPrAspectRatio");
486       }
487       if(xf86GetOptValString(pXGI->Options, OPTION_SPECIALTIMING)) {
488          xf86DrvMsg(pScrn->scrnIndex, X_WARNING, mystring, "SpecialTiming");
489       }
490       if(xf86GetOptValBool(pXGI->Options, OPTION_CRT2GAMMA, &val)) {
491          xf86DrvMsg(pScrn->scrnIndex, X_WARNING, mystring, "CRT2Gamma");
492       }
493#ifdef XGI_CP
494       XGI_CP_OPT_DH_WARN
495#endif
496    }
497    else {
498	  /* TurboQueue */
499
500          from = X_DEFAULT;
501          if(xf86GetOptValBool(pXGI->Options, OPTION_TURBOQUEUE, &pXGI->TurboQueue)) {
502    	     from = X_CONFIG;
503          }
504          xf86DrvMsg(pScrn->scrnIndex, from, "TurboQueue %s\n",
505                    pXGI->TurboQueue ? enabledstr : disabledstr);
506
507#ifdef XGI_CP
508       XGI_CP_OPT_DOOPT
509#endif
510
511    }  /* DualHead */
512
513    /* CRT1Gamma - enable/disable gamma correction for CRT1
514     */
515    {
516       Bool val;
517       if(xf86GetOptValBool(pXGI->Options, OPTION_CRT1GAMMA, &val)) {
518	  pXGI->CRT1gamma = val;
519	  pXGI->CRT1gammaGiven = TRUE;
520       }
521    }
522
523
524    /* ShadowFB */
525    from = X_DEFAULT;
526    if(xf86GetOptValBool(pXGI->Options, OPTION_SHADOW_FB, &pXGI->ShadowFB)) {
527#ifdef XGIMERGED
528       if(pXGI->MergedFB) {
529          pXGI->ShadowFB = FALSE;
530	  xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
531	      "Shadow Frame Buffer not supported in MergedFB mode\n");
532       } else
533#endif
534          from = X_CONFIG;
535    }
536    if(pXGI->ShadowFB) {
537	pXGI->NoAccel = TRUE;
538    	xf86DrvMsg(pScrn->scrnIndex, from,
539	   "Using \"Shadow Frame Buffer\" - 2D acceleration disabled\n");
540    }
541
542    /* Rotate */
543    if((strptr = (char *)xf86GetOptValString(pXGI->Options, OPTION_ROTATE))) {
544#ifdef XGIMERGED
545       if(pXGI->MergedFB) {
546	  xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
547	      "Screen rotation not supported in MergedFB mode\n");
548       } else
549#endif
550       if(!xf86NameCmp(strptr, "CW")) {
551          pXGI->Rotate = 1;
552       } else if(!xf86NameCmp(strptr, "CCW")) {
553          pXGI->Rotate = -1;
554       } else {
555          xf86DrvMsg(pScrn->scrnIndex, X_WARNING, mybadparm, strptr, "Rotate");
556          xf86DrvMsg(pScrn->scrnIndex, X_INFO,
557              "Valid parameters are \"CW\" or \"CCW\"\n");
558       }
559
560       if(pXGI->Rotate) {
561          pXGI->ShadowFB = TRUE;
562          pXGI->NoAccel  = TRUE;
563          pXGI->HWCursor = FALSE;
564	  xf86DrvMsg(pScrn->scrnIndex, X_CONFIG,
565              "Rotating screen %sclockwise (2D acceleration %sdisabled)\n",
566	      (pXGI->Rotate == -1) ? "counter " : "",
567              "and RandR extension "
568	      );
569       }
570    }
571
572	/* Jong 07/27/2009; get option of run-time debug */
573    if(!xf86GetOptValBool(pXGI->Options, OPTION_RUNTIME_DEBUG, &g_bRunTimeDebug))
574		g_bRunTimeDebug=0;
575
576#ifdef XF86DRI
577    /* DRI */
578    from = X_DEFAULT;
579    if(xf86GetOptValBool(pXGI->Options, OPTION_DRI, &pXGI->loadDRI)) {
580       from = X_CONFIG;
581    }
582    xf86DrvMsg(pScrn->scrnIndex, from, "DRI %s\n",
583       pXGI->loadDRI ? enabledstr : disabledstr);
584
585    /* AGPSize */
586    {
587       int vali;
588       Bool gotit = FALSE;
589       if(xf86GetOptValInteger(pXGI->Options, OPTION_AGP_SIZE, &vali)) {
590          gotit = TRUE;
591       } else if(xf86GetOptValInteger(pXGI->Options, OPTION_AGP_SIZE2, &vali)) {
592          gotit = TRUE;
593       }
594       if(gotit) {
595	  if((vali >= 8) && (vali <= 512)) {
596	     pXGI->agpWantedPages = (vali * 1024 * 1024) / AGP_PAGE_SIZE;
597	  } else {
598	     xf86DrvMsg(pScrn->scrnIndex, X_WARNING, ilrangestr, "AGPSize (alias GARTSize)", 8, 512);
599	  }
600       }
601    }
602#endif
603
604    /* NoXVideo
605     * Set this to TRUE to disable Xv hardware video acceleration
606     */
607    if(!pXGI->NoXvideo) {
608       if(xf86ReturnOptValBool(pXGI->Options, OPTION_NOXVIDEO, FALSE)) {
609          pXGI->NoXvideo = TRUE;
610          xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "XVideo extension disabled\n");
611       }
612
613       if(!pXGI->NoXvideo) {
614          Bool val;
615	  int tmp;
616
617	  /* Some Xv properties' defaults can be set by options */
618          if(xf86GetOptValInteger(pXGI->Options, OPTION_XVDEFCONTRAST, &tmp)) {
619             if((tmp >= 0) && (tmp <= 7)) pXGI->XvDefCon = tmp;
620             else xf86DrvMsg(pScrn->scrnIndex, X_WARNING, ilrangestr,
621       		      "XvDefaultContrast" ,0, 7);
622          }
623          if(xf86GetOptValInteger(pXGI->Options, OPTION_XVDEFBRIGHTNESS, &tmp)) {
624             if((tmp >= -128) && (tmp <= 127)) pXGI->XvDefBri = tmp;
625             else xf86DrvMsg(pScrn->scrnIndex, X_WARNING, ilrangestr,
626       		      "XvDefaultBrightness", -128, 127);
627          }
628
629	  if(xf86GetOptValBool(pXGI->Options, OPTION_XVDEFDISABLEGFX, &val)) {
630	     if(val)  pXGI->XvDefDisableGfx = TRUE;
631	     xf86DrvMsg(pScrn->scrnIndex, X_CONFIG,
632	        "Graphics display will be %s during Xv usage\n",
633	     	val ? disabledstr : enabledstr);
634          }
635
636	  if(xf86GetOptValBool(pXGI->Options, OPTION_XVMEMCPY, &val)) {
637	     pXGI->XvUseMemcpy = val ? TRUE : FALSE;
638	     xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Xv will %suse memcpy()\n",
639	     	val ? "" : "not ");
640          }
641       }
642    }
643}
644
645const OptionInfoRec *
646XGIAvailableOptions(int chipid, int busid)
647{
648    return XGIOptions;
649}
650