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