sis_opt.c revision 72b676d7
172b676d7Smrg/* $XFree86$ */ 272b676d7Smrg/* $XdotOrg$ */ 372b676d7Smrg/* 472b676d7Smrg * SiS driver option evaluation 572b676d7Smrg * 672b676d7Smrg * Copyright (C) 2001-2005 by Thomas Winischhofer, Vienna, Austria 772b676d7Smrg * 872b676d7Smrg * Redistribution and use in source and binary forms, with or without 972b676d7Smrg * modification, are permitted provided that the following conditions 1072b676d7Smrg * are met: 1172b676d7Smrg * 1) Redistributions of source code must retain the above copyright 1272b676d7Smrg * notice, this list of conditions and the following disclaimer. 1372b676d7Smrg * 2) Redistributions in binary form must reproduce the above copyright 1472b676d7Smrg * notice, this list of conditions and the following disclaimer in the 1572b676d7Smrg * documentation and/or other materials provided with the distribution. 1672b676d7Smrg * 3) The name of the author may not be used to endorse or promote products 1772b676d7Smrg * derived from this software without specific prior written permission. 1872b676d7Smrg * 1972b676d7Smrg * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 2072b676d7Smrg * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 2172b676d7Smrg * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 2272b676d7Smrg * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 2372b676d7Smrg * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 2472b676d7Smrg * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2572b676d7Smrg * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2672b676d7Smrg * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2772b676d7Smrg * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 2872b676d7Smrg * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2972b676d7Smrg * 3072b676d7Smrg * Authors: Thomas Winischhofer <thomas@winischhofer.net> 3172b676d7Smrg * ? 3272b676d7Smrg */ 3372b676d7Smrg 3472b676d7Smrg#ifdef HAVE_CONFIG_H 3572b676d7Smrg#include "config.h" 3672b676d7Smrg#endif 3772b676d7Smrg 3872b676d7Smrg#include "sis.h" 3972b676d7Smrg 4072b676d7Smrg#include "xf86str.h" 4172b676d7Smrg#include "xf86Cursor.h" 4272b676d7Smrg 4372b676d7Smrgtypedef enum { 4472b676d7Smrg OPTION_SW_CURSOR, 4572b676d7Smrg OPTION_HW_CURSOR, 4672b676d7Smrg OPTION_ACCEL, 4772b676d7Smrg OPTION_ACCELMETHOD, 4872b676d7Smrg OPTION_TURBOQUEUE, 4972b676d7Smrg OPTION_FAST_VRAM, 5072b676d7Smrg OPTION_HOSTBUS, 5172b676d7Smrg OPTION_RENDER, 5272b676d7Smrg OPTION_FORCE_CRT1TYPE, 5372b676d7Smrg OPTION_FORCE_CRT2TYPE, 5472b676d7Smrg OPTION_YPBPRAR, 5572b676d7Smrg OPTION_SHADOW_FB, 5672b676d7Smrg OPTION_DRI, 5772b676d7Smrg OPTION_AGP_SIZE, 5872b676d7Smrg OPTION_ROTATE, 5972b676d7Smrg OPTION_REFLECT, 6072b676d7Smrg OPTION_XVIDEO, 6172b676d7Smrg OPTION_VESA, 6272b676d7Smrg OPTION_MAXXFBMEM, 6372b676d7Smrg OPTION_FORCECRT1, 6472b676d7Smrg OPTION_XVONCRT2, 6572b676d7Smrg OPTION_PDC, 6672b676d7Smrg OPTION_PDCA, 6772b676d7Smrg OPTION_EMI, 6872b676d7Smrg OPTION_TVSTANDARD, 6972b676d7Smrg OPTION_USEROMDATA, 7072b676d7Smrg OPTION_INTERNALMODES, 7172b676d7Smrg OPTION_USEOEM, 7272b676d7Smrg OPTION_YV12, 7372b676d7Smrg OPTION_CHTVOVERSCAN, 7472b676d7Smrg OPTION_CHTVSOVERSCAN, 7572b676d7Smrg OPTION_CHTVLUMABANDWIDTHCVBS, 7672b676d7Smrg OPTION_CHTVLUMABANDWIDTHSVIDEO, 7772b676d7Smrg OPTION_CHTVLUMAFLICKERFILTER, 7872b676d7Smrg OPTION_CHTVCHROMABANDWIDTH, 7972b676d7Smrg OPTION_CHTVCHROMAFLICKERFILTER, 8072b676d7Smrg OPTION_CHTVCVBSCOLOR, 8172b676d7Smrg OPTION_CHTVTEXTENHANCE, 8272b676d7Smrg OPTION_CHTVCONTRAST, 8372b676d7Smrg OPTION_SISTVEDGEENHANCE, 8472b676d7Smrg OPTION_SISTVANTIFLICKER, 8572b676d7Smrg OPTION_SISTVSATURATION, 8672b676d7Smrg OPTION_SISTVCHROMAFILTER, 8772b676d7Smrg OPTION_SISTVLUMAFILTER, 8872b676d7Smrg OPTION_SISTVCOLCALIBFINE, 8972b676d7Smrg OPTION_SISTVCOLCALIBCOARSE, 9072b676d7Smrg OPTION_TVXPOSOFFSET, 9172b676d7Smrg OPTION_TVYPOSOFFSET, 9272b676d7Smrg OPTION_TVXSCALE, 9372b676d7Smrg OPTION_TVYSCALE, 9472b676d7Smrg OPTION_SIS6326ANTIFLICKER, 9572b676d7Smrg OPTION_SIS6326ENABLEYFILTER, 9672b676d7Smrg OPTION_SIS6326YFILTERSTRONG, 9772b676d7Smrg OPTION_SIS6326FORCETVPPLUG, 9872b676d7Smrg OPTION_SIS6326FSCADJUST, 9972b676d7Smrg OPTION_CHTVTYPE, 10072b676d7Smrg OPTION_USERGBCURSOR, 10172b676d7Smrg OPTION_USERGBCURSORBLEND, 10272b676d7Smrg OPTION_USERGBCURSORBLENDTH, 10372b676d7Smrg OPTION_RESTOREBYSET, 10472b676d7Smrg OPTION_DDCFORCRT2, 10572b676d7Smrg OPTION_FORCECRT2REDETECTION, 10672b676d7Smrg OPTION_SENSEYPBPR, 10772b676d7Smrg OPTION_CRT1GAMMA, 10872b676d7Smrg OPTION_CRT2GAMMA, 10972b676d7Smrg OPTION_XVGAMMA, 11072b676d7Smrg OPTION_XVDEFCONTRAST, 11172b676d7Smrg OPTION_XVDEFBRIGHTNESS, 11272b676d7Smrg OPTION_XVDEFHUE, 11372b676d7Smrg OPTION_XVDEFSATURATION, 11472b676d7Smrg OPTION_XVDEFDISABLEGFX, 11572b676d7Smrg OPTION_XVDEFDISABLEGFXLR, 11672b676d7Smrg OPTION_XVMEMCPY, 11772b676d7Smrg OPTION_XVBENCHCPY, 11872b676d7Smrg#ifndef SISCHECKOSSSE 11972b676d7Smrg OPTION_XVSSECOPY, 12072b676d7Smrg#endif 12172b676d7Smrg OPTION_XVUSECHROMAKEY, 12272b676d7Smrg OPTION_XVCHROMAMIN, 12372b676d7Smrg OPTION_XVCHROMAMAX, 12472b676d7Smrg OPTION_XVDISABLECOLORKEY, 12572b676d7Smrg OPTION_XVINSIDECHROMAKEY, 12672b676d7Smrg OPTION_XVYUVCHROMAKEY, 12772b676d7Smrg OPTION_XVDEFAULTADAPTOR, 12872b676d7Smrg OPTION_SCALELCD, 12972b676d7Smrg OPTION_CENTERLCD, 13072b676d7Smrg OPTION_SPECIALTIMING, 13172b676d7Smrg OPTION_LVDSHL, 13272b676d7Smrg OPTION_PRGB, 13372b676d7Smrg OPTION_ENABLEHOTKEY, 13472b676d7Smrg OPTION_MERGEDFB, 13572b676d7Smrg OPTION_MERGEDFBAUTO, 13672b676d7Smrg OPTION_CRT2HSYNC, 13772b676d7Smrg OPTION_CRT2VREFRESH, 13872b676d7Smrg OPTION_CRT2POS, 13972b676d7Smrg OPTION_METAMODES, 14072b676d7Smrg OPTION_SISXINERAMA, 14172b676d7Smrg OPTION_CRT2ISSCRN0, 14272b676d7Smrg OPTION_MERGEDDPI, 14372b676d7Smrg OPTION_MERGEDFBNONRECT, 14472b676d7Smrg OPTION_MERGEDFBMOUSER, 14572b676d7Smrg OPTION_ENABLESISCTRL, 14672b676d7Smrg OPTION_STOREDBRI, 14772b676d7Smrg OPTION_STOREDBRI2, 14872b676d7Smrg OPTION_NEWSTOREDBRI, 14972b676d7Smrg OPTION_NEWSTOREDBRI2, 15072b676d7Smrg OPTION_NEWSTOREDCON, 15172b676d7Smrg OPTION_NEWSTOREDCON2, 15272b676d7Smrg OPTION_CRT1SATGAIN, 15372b676d7Smrg OPTION_OVERRULERANGES, 15472b676d7Smrg OPTION_FORCE1ASPECT, 15572b676d7Smrg OPTION_FORCE2ASPECT, 15672b676d7Smrg OPTION_TVBLUE, 15772b676d7Smrg#ifdef SIS_CP 15872b676d7Smrg SIS_CP_OPT_OPTIONS 15972b676d7Smrg#endif 16072b676d7Smrg OPTION_PSEUDO 16172b676d7Smrg} SISOpts; 16272b676d7Smrg 16372b676d7Smrgstatic const OptionInfoRec SISOptions[] = { 16472b676d7Smrg { OPTION_ACCEL, "Accel", OPTV_BOOLEAN, {0}, FALSE }, 16572b676d7Smrg#if defined(SIS_USE_XAA) && defined(SIS_USE_EXA) 16672b676d7Smrg { OPTION_ACCELMETHOD, "AccelMethod", OPTV_STRING, {0}, FALSE }, 16772b676d7Smrg#endif 16872b676d7Smrg { OPTION_TURBOQUEUE, "TurboQueue", OPTV_BOOLEAN, {0}, FALSE }, 16972b676d7Smrg { OPTION_FAST_VRAM, "FastVram", OPTV_BOOLEAN, {0}, FALSE }, 17072b676d7Smrg { OPTION_HOSTBUS, "HostBus", OPTV_BOOLEAN, {0}, FALSE }, 17172b676d7Smrg { OPTION_RENDER, "RenderAcceleration", OPTV_BOOLEAN, {0}, FALSE }, 17272b676d7Smrg { OPTION_FORCE_CRT1TYPE, "ForceCRT1Type", OPTV_STRING, {0}, FALSE }, 17372b676d7Smrg { OPTION_FORCE_CRT2TYPE, "ForceCRT2Type", OPTV_STRING, {0}, FALSE }, 17472b676d7Smrg { OPTION_SHADOW_FB, "ShadowFB", OPTV_BOOLEAN, {0}, FALSE }, 17572b676d7Smrg { OPTION_DRI, "DRI", OPTV_BOOLEAN, {0}, FALSE }, 17672b676d7Smrg { OPTION_AGP_SIZE, "AGPSize", OPTV_INTEGER, {0}, FALSE }, 17772b676d7Smrg { OPTION_AGP_SIZE, "GARTSize", OPTV_INTEGER, {0}, FALSE }, 17872b676d7Smrg { OPTION_VESA, "Vesa", OPTV_BOOLEAN, {0}, FALSE }, 17972b676d7Smrg { OPTION_MAXXFBMEM, "MaxXFBMem", OPTV_INTEGER, {0}, FALSE }, 18072b676d7Smrg { OPTION_ENABLESISCTRL, "EnableSiSCtrl", OPTV_BOOLEAN, {0}, FALSE }, 18172b676d7Smrg { OPTION_SW_CURSOR, "SWCursor", OPTV_BOOLEAN, {0}, FALSE }, 18272b676d7Smrg { OPTION_HW_CURSOR, "HWCursor", OPTV_BOOLEAN, {0}, FALSE }, 18372b676d7Smrg { OPTION_USERGBCURSOR, "UseColorHWCursor", OPTV_BOOLEAN, {0}, FALSE }, 18472b676d7Smrg { OPTION_ROTATE, "Rotate", OPTV_STRING, {0}, FALSE }, 18572b676d7Smrg { OPTION_REFLECT, "Reflect", OPTV_STRING, {0}, FALSE }, 18672b676d7Smrg { OPTION_XVIDEO, "Xvideo", OPTV_BOOLEAN, {0}, FALSE }, 18772b676d7Smrg { OPTION_INTERNALMODES, "InternalModes", OPTV_BOOLEAN, {0}, FALSE }, 18872b676d7Smrg { OPTION_OVERRULERANGES, "OverruleFrequencyRanges", OPTV_BOOLEAN, {0}, FALSE }, 18972b676d7Smrg { OPTION_RESTOREBYSET, "RestoreBySetMode", OPTV_BOOLEAN, {0}, FALSE }, 19072b676d7Smrg { OPTION_FORCECRT1, "ForceCRT1", OPTV_BOOLEAN, {0}, FALSE }, 19172b676d7Smrg { OPTION_XVONCRT2, "XvOnCRT2", OPTV_BOOLEAN, {0}, FALSE }, 19272b676d7Smrg { OPTION_PDC, "PanelDelayCompensation", OPTV_INTEGER, {0}, FALSE }, 19372b676d7Smrg { OPTION_PDC, "PDC", OPTV_INTEGER, {0}, FALSE }, 19472b676d7Smrg { OPTION_PDC, "PanelDelayCompensation2", OPTV_INTEGER, {0}, FALSE }, 19572b676d7Smrg { OPTION_PDC, "PDC2", OPTV_INTEGER, {0}, FALSE }, 19672b676d7Smrg { OPTION_PDCA, "PanelDelayCompensation1", OPTV_INTEGER, {0}, FALSE }, 19772b676d7Smrg { OPTION_PDCA, "PDC1", OPTV_INTEGER, {0}, FALSE }, 19872b676d7Smrg { OPTION_EMI, "EMI", OPTV_INTEGER, {0}, FALSE }, 19972b676d7Smrg { OPTION_LVDSHL, "LVDSHL", OPTV_INTEGER, {0}, FALSE }, 20072b676d7Smrg { OPTION_PRGB, "ForcePanelRGB", OPTV_INTEGER, {0}, FALSE }, 20172b676d7Smrg { OPTION_SPECIALTIMING, "SpecialTiming", OPTV_STRING, {0}, FALSE }, 20272b676d7Smrg { OPTION_TVSTANDARD, "TVStandard", OPTV_STRING, {0}, FALSE }, 20372b676d7Smrg { OPTION_USEROMDATA, "UseROMData", OPTV_BOOLEAN, {0}, FALSE }, 20472b676d7Smrg { OPTION_USEOEM, "UseOEMData", OPTV_BOOLEAN, {0}, FALSE }, 20572b676d7Smrg { OPTION_YV12, "YV12", OPTV_BOOLEAN, {0}, FALSE }, 20672b676d7Smrg { OPTION_CHTVTYPE, "CHTVType", OPTV_BOOLEAN, {0}, FALSE }, 20772b676d7Smrg { OPTION_CHTVOVERSCAN, "CHTVOverscan", OPTV_BOOLEAN, {0}, FALSE }, 20872b676d7Smrg { OPTION_CHTVSOVERSCAN, "CHTVSuperOverscan", OPTV_BOOLEAN, {0}, FALSE }, 20972b676d7Smrg { OPTION_CHTVLUMABANDWIDTHCVBS, "CHTVLumaBandwidthCVBS", OPTV_INTEGER, {0}, FALSE }, 21072b676d7Smrg { OPTION_CHTVLUMABANDWIDTHSVIDEO, "CHTVLumaBandwidthSVIDEO", OPTV_INTEGER, {0}, FALSE }, 21172b676d7Smrg { OPTION_CHTVLUMAFLICKERFILTER, "CHTVLumaFlickerFilter", OPTV_INTEGER, {0}, FALSE }, 21272b676d7Smrg { OPTION_CHTVCHROMABANDWIDTH, "CHTVChromaBandwidth", OPTV_INTEGER, {0}, FALSE }, 21372b676d7Smrg { OPTION_CHTVCHROMAFLICKERFILTER, "CHTVChromaFlickerFilter", OPTV_INTEGER, {0}, FALSE }, 21472b676d7Smrg { OPTION_CHTVCVBSCOLOR, "CHTVCVBSColor", OPTV_BOOLEAN, {0}, FALSE }, 21572b676d7Smrg { OPTION_CHTVTEXTENHANCE, "CHTVTextEnhance", OPTV_INTEGER, {0}, FALSE }, 21672b676d7Smrg { OPTION_CHTVCONTRAST, "CHTVContrast", OPTV_INTEGER, {0}, FALSE }, 21772b676d7Smrg { OPTION_SISTVEDGEENHANCE, "SISTVEdgeEnhance", OPTV_INTEGER, {0}, FALSE }, 21872b676d7Smrg { OPTION_SISTVANTIFLICKER, "SISTVAntiFlicker", OPTV_STRING, {0}, FALSE }, 21972b676d7Smrg { OPTION_SISTVSATURATION, "SISTVSaturation", OPTV_INTEGER, {0}, FALSE }, 22072b676d7Smrg { OPTION_SISTVCHROMAFILTER, "SISTVCFilter", OPTV_BOOLEAN, {0}, FALSE }, 22172b676d7Smrg { OPTION_SISTVLUMAFILTER, "SISTVYFilter", OPTV_INTEGER, {0}, FALSE }, 22272b676d7Smrg { OPTION_SISTVCOLCALIBFINE, "SISTVColorCalibFine", OPTV_INTEGER, {0}, FALSE }, 22372b676d7Smrg { OPTION_SISTVCOLCALIBCOARSE, "SISTVColorCalibCoarse", OPTV_INTEGER, {0}, FALSE }, 22472b676d7Smrg { OPTION_TVXSCALE, "SISTVXScale", OPTV_INTEGER, {0}, FALSE }, 22572b676d7Smrg { OPTION_TVYSCALE, "SISTVYScale", OPTV_INTEGER, {0}, FALSE }, 22672b676d7Smrg { OPTION_TVXPOSOFFSET, "TVXPosOffset", OPTV_INTEGER, {0}, FALSE }, 22772b676d7Smrg { OPTION_TVYPOSOFFSET, "TVYPosOffset", OPTV_INTEGER, {0}, FALSE }, 22872b676d7Smrg { OPTION_SIS6326ANTIFLICKER, "SIS6326TVAntiFlicker", OPTV_STRING, {0}, FALSE }, 22972b676d7Smrg { OPTION_SIS6326ENABLEYFILTER, "SIS6326TVEnableYFilter", OPTV_BOOLEAN, {0}, FALSE }, 23072b676d7Smrg { OPTION_SIS6326YFILTERSTRONG, "SIS6326TVYFilterStrong", OPTV_BOOLEAN, {0}, FALSE }, 23172b676d7Smrg { OPTION_SIS6326FORCETVPPLUG, "SIS6326TVForcePlug", OPTV_STRING, {0}, FALSE }, 23272b676d7Smrg { OPTION_SIS6326FSCADJUST, "SIS6326FSCAdjust", OPTV_INTEGER, {0}, FALSE }, 23372b676d7Smrg { OPTION_YPBPRAR, "YPbPrAspectRatio", OPTV_STRING, {0}, FALSE }, 23472b676d7Smrg { OPTION_TVBLUE, "TVBlueWorkAround", OPTV_BOOLEAN, {0}, FALSE }, 23572b676d7Smrg { OPTION_USERGBCURSORBLEND, "ColorHWCursorBlending", OPTV_BOOLEAN, {0}, FALSE }, 23672b676d7Smrg { OPTION_USERGBCURSORBLENDTH, "ColorHWCursorBlendThreshold", OPTV_INTEGER, {0}, FALSE }, 23772b676d7Smrg { OPTION_DDCFORCRT2, "CRT2Detection", OPTV_BOOLEAN, {0}, FALSE }, 23872b676d7Smrg { OPTION_FORCECRT2REDETECTION, "ForceCRT2ReDetection", OPTV_BOOLEAN, {0}, FALSE }, 23972b676d7Smrg { OPTION_SENSEYPBPR, "SenseYPbPr", OPTV_BOOLEAN, {0}, FALSE }, 24072b676d7Smrg { OPTION_CRT1GAMMA, "CRT1Gamma", OPTV_BOOLEAN, {0}, FALSE }, 24172b676d7Smrg { OPTION_CRT2GAMMA, "CRT2Gamma", OPTV_ANYSTR, {0}, FALSE }, 24272b676d7Smrg { OPTION_STOREDBRI, "GammaBrightness", OPTV_STRING, {0}, FALSE }, 24372b676d7Smrg { OPTION_STOREDBRI2, "GammaBrightnessCRT2", OPTV_STRING, {0}, FALSE }, 24472b676d7Smrg { OPTION_STOREDBRI2, "CRT2GammaBrightness", OPTV_STRING, {0}, FALSE }, 24572b676d7Smrg { OPTION_NEWSTOREDBRI, "Brightness", OPTV_STRING, {0}, FALSE }, 24672b676d7Smrg { OPTION_NEWSTOREDBRI, "NewGammaBrightness", OPTV_STRING, {0}, FALSE }, 24772b676d7Smrg { OPTION_NEWSTOREDBRI2, "CRT2Brightness", OPTV_STRING, {0}, FALSE }, 24872b676d7Smrg { OPTION_NEWSTOREDBRI2, "CRT2NewGammaBrightness", OPTV_STRING, {0}, FALSE }, 24972b676d7Smrg { OPTION_NEWSTOREDCON, "Contrast", OPTV_STRING, {0}, FALSE }, 25072b676d7Smrg { OPTION_NEWSTOREDCON, "NewGammaContrast", OPTV_STRING, {0}, FALSE }, 25172b676d7Smrg { OPTION_NEWSTOREDCON2, "CRT2Contrast", OPTV_STRING, {0}, FALSE }, 25272b676d7Smrg { OPTION_NEWSTOREDCON2, "CRT2NewGammaContrast", OPTV_STRING, {0}, FALSE }, 25372b676d7Smrg { OPTION_CRT1SATGAIN, "CRT1Saturation", OPTV_INTEGER, {0}, FALSE }, 25472b676d7Smrg { OPTION_XVGAMMA, "XvGamma", OPTV_ANYSTR, {0}, FALSE }, 25572b676d7Smrg { OPTION_XVDEFCONTRAST, "XvDefaultContrast", OPTV_INTEGER, {0}, FALSE }, 25672b676d7Smrg { OPTION_XVDEFBRIGHTNESS, "XvDefaultBrightness", OPTV_INTEGER, {0}, FALSE }, 25772b676d7Smrg { OPTION_XVDEFHUE, "XvDefaultHue", OPTV_INTEGER, {0}, FALSE }, 25872b676d7Smrg { OPTION_XVDEFSATURATION, "XvDefaultSaturation", OPTV_INTEGER, {0}, FALSE }, 25972b676d7Smrg { OPTION_XVDEFDISABLEGFX, "XvDefaultDisableGfx", OPTV_BOOLEAN, {0}, FALSE }, 26072b676d7Smrg { OPTION_XVDEFDISABLEGFXLR, "XvDefaultDisableGfxLR", OPTV_BOOLEAN, {0}, FALSE }, 26172b676d7Smrg { OPTION_XVCHROMAMIN, "XvChromaMin", OPTV_INTEGER, {0}, FALSE }, 26272b676d7Smrg { OPTION_XVCHROMAMAX, "XvChromaMax", OPTV_INTEGER, {0}, FALSE }, 26372b676d7Smrg { OPTION_XVUSECHROMAKEY, "XvUseChromaKey", OPTV_BOOLEAN, {0}, FALSE }, 26472b676d7Smrg { OPTION_XVINSIDECHROMAKEY, "XvInsideChromaKey", OPTV_BOOLEAN, {0}, FALSE }, 26572b676d7Smrg { OPTION_XVYUVCHROMAKEY, "XvYUVChromaKey", OPTV_BOOLEAN, {0}, FALSE }, 26672b676d7Smrg { OPTION_XVDISABLECOLORKEY, "XvDisableColorKey", OPTV_BOOLEAN, {0}, FALSE }, 26772b676d7Smrg { OPTION_XVMEMCPY, "XvUseMemcpy", OPTV_BOOLEAN, {0}, FALSE }, 26872b676d7Smrg { OPTION_XVBENCHCPY, "BenchmarkMemcpy", OPTV_BOOLEAN, {0}, FALSE }, 26972b676d7Smrg#ifndef SISCHECKOSSSE 27072b676d7Smrg { OPTION_XVSSECOPY, "UseSSE", OPTV_BOOLEAN, {0}, FALSE }, 27172b676d7Smrg#endif 27272b676d7Smrg { OPTION_XVDEFAULTADAPTOR, "XvDefaultAdaptor", OPTV_STRING, {0}, FALSE }, 27372b676d7Smrg { OPTION_SCALELCD, "ScaleLCD", OPTV_BOOLEAN, {0}, FALSE }, 27472b676d7Smrg { OPTION_CENTERLCD, "CenterLCD", OPTV_BOOLEAN, {0}, FALSE }, 27572b676d7Smrg { OPTION_ENABLEHOTKEY, "EnableHotkey", OPTV_BOOLEAN, {0}, FALSE }, 27672b676d7Smrg { OPTION_FORCE1ASPECT, "ForceCRT1VGAAspect", OPTV_STRING, {0}, FALSE }, 27772b676d7Smrg { OPTION_FORCE2ASPECT, "ForceCRT2VGAAspect", OPTV_STRING, {0}, FALSE }, 27872b676d7Smrg#ifdef SISMERGED 27972b676d7Smrg { OPTION_MERGEDFB, "MergedFB", OPTV_ANYSTR, {0}, FALSE }, 28072b676d7Smrg { OPTION_MERGEDFB, "TwinView", OPTV_ANYSTR, {0}, FALSE }, /* alias */ 28172b676d7Smrg { OPTION_MERGEDFBAUTO, "MergedFBAuto", OPTV_BOOLEAN, {0}, FALSE }, 28272b676d7Smrg { OPTION_CRT2HSYNC, "CRT2HSync", OPTV_STRING, {0}, FALSE }, 28372b676d7Smrg { OPTION_CRT2HSYNC, "SecondMonitorHorizSync", OPTV_STRING, {0}, FALSE }, /* alias */ 28472b676d7Smrg { OPTION_CRT2VREFRESH, "CRT2VRefresh", OPTV_STRING, {0}, FALSE }, 28572b676d7Smrg { OPTION_CRT2VREFRESH, "SecondMonitorVertRefresh", OPTV_STRING, {0}, FALSE }, /* alias */ 28672b676d7Smrg { OPTION_CRT2POS, "CRT2Position", OPTV_STRING, {0}, FALSE }, 28772b676d7Smrg { OPTION_CRT2POS, "TwinViewOrientation", OPTV_STRING, {0}, FALSE }, /* alias */ 28872b676d7Smrg { OPTION_METAMODES, "MetaModes", OPTV_STRING, {0}, FALSE }, 28972b676d7Smrg { OPTION_MERGEDDPI, "MergedDPI", OPTV_STRING, {0}, FALSE }, 29072b676d7Smrg#ifdef SISXINERAMA 29172b676d7Smrg { OPTION_SISXINERAMA, "MergedXinerama", OPTV_BOOLEAN, {0}, FALSE }, 29272b676d7Smrg { OPTION_SISXINERAMA, "TwinviewXineramaInfo", OPTV_BOOLEAN, {0}, FALSE }, /* alias */ 29372b676d7Smrg { OPTION_CRT2ISSCRN0, "MergedXineramaCRT2IsScreen0", OPTV_BOOLEAN, {0}, FALSE }, 29472b676d7Smrg { OPTION_MERGEDFBNONRECT, "MergedNonRectangular", OPTV_BOOLEAN, {0}, FALSE }, 29572b676d7Smrg { OPTION_MERGEDFBMOUSER, "MergedMouseRestriction", OPTV_BOOLEAN, {0}, FALSE }, 29672b676d7Smrg#endif 29772b676d7Smrg#endif 29872b676d7Smrg#ifdef SIS_CP 29972b676d7Smrg SIS_CP_OPTION_DETAIL 30072b676d7Smrg#endif 30172b676d7Smrg { -1, NULL, OPTV_NONE, {0}, FALSE } 30272b676d7Smrg}; 30372b676d7Smrg 30472b676d7Smrgstatic int 30572b676d7SmrgSiS_FIFT(const OptionInfoRec *options, int token) 30672b676d7Smrg{ 30772b676d7Smrg /* Find index from token */ 30872b676d7Smrg int i = 0; 30972b676d7Smrg while(options[i].token >= 0) { 31072b676d7Smrg if(options[i].token == token) return i; 31172b676d7Smrg i++; 31272b676d7Smrg } 31372b676d7Smrg return 0; /* Should not happen */ 31472b676d7Smrg} 31572b676d7Smrg 31672b676d7Smrgstatic void 31772b676d7SmrgSiS_PrintBadOpt(ScrnInfoPtr pScrn, char *strptr, int token) 31872b676d7Smrg{ 31972b676d7Smrg SISPtr pSiS = SISPTR(pScrn); 32072b676d7Smrg 32172b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_WARNING, 32272b676d7Smrg "\"%s\" is is not a valid parameter for option \"%s\"\n", 32372b676d7Smrg strptr, pSiS->Options[SiS_FIFT(pSiS->Options, token)].name); 32472b676d7Smrg} 32572b676d7Smrg 32672b676d7Smrgstatic void 32772b676d7SmrgSiS_PrintIlRange(ScrnInfoPtr pScrn, int token, int min, int max, UChar showhex) 32872b676d7Smrg{ 32972b676d7Smrg SISPtr pSiS = SISPTR(pScrn); 33072b676d7Smrg static const char *ilparmd = "Invalid parameter for \"%s\". Valid range is %d - %d\n"; 33172b676d7Smrg static const char *ilparmh = "Invalid parameter for \"%s\". Valid range is 0x%x - 0x%x\n"; 33272b676d7Smrg 33372b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_WARNING, 33472b676d7Smrg showhex ? ilparmh : ilparmd, 33572b676d7Smrg pSiS->Options[SiS_FIFT(pSiS->Options, token)].name, min, max); 33672b676d7Smrg} 33772b676d7Smrg 33872b676d7Smrg#ifdef SISDUALHEAD 33972b676d7Smrgstatic void 34072b676d7SmrgSiS_PrintOverruleDHM(ScrnInfoPtr pScrn, int token1, int token2) 34172b676d7Smrg{ 34272b676d7Smrg SISPtr pSiS = SISPTR(pScrn); 34372b676d7Smrg 34472b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, 34572b676d7Smrg "\"%s\" overrules \"%s\" in CRT2 (Master) device section\n", 34672b676d7Smrg pSiS->Options[SiS_FIFT(pSiS->Options, token1)].name, 34772b676d7Smrg pSiS->Options[SiS_FIFT(pSiS->Options, token2)].name); 34872b676d7Smrg} 34972b676d7Smrg#endif 35072b676d7Smrg 35172b676d7Smrgstatic Bool 35272b676d7SmrgSiS_StrIsBoolOn(char *strptr) 35372b676d7Smrg{ 35472b676d7Smrg if( (*strptr == '\0') || 35572b676d7Smrg (!xf86NameCmp(strptr,"on")) || 35672b676d7Smrg (!xf86NameCmp(strptr,"true")) || 35772b676d7Smrg (!xf86NameCmp(strptr,"yes")) || 35872b676d7Smrg (!xf86NameCmp(strptr,"1")) ) return TRUE; 35972b676d7Smrg return FALSE; 36072b676d7Smrg} 36172b676d7Smrg 36272b676d7Smrgstatic Bool 36372b676d7SmrgSiS_StrIsBoolOff(char *strptr) 36472b676d7Smrg{ 36572b676d7Smrg if( (!xf86NameCmp(strptr,"off")) || 36672b676d7Smrg (!xf86NameCmp(strptr,"false")) || 36772b676d7Smrg (!xf86NameCmp(strptr,"no")) || 36872b676d7Smrg (!xf86NameCmp(strptr,"0")) ) return TRUE; 36972b676d7Smrg return FALSE; 37072b676d7Smrg} 37172b676d7Smrg 37272b676d7Smrgstatic Bool 37372b676d7SmrgSiS_EvalOneOrThreeFloats(ScrnInfoPtr pScrn, int token, const char *myerror, 37472b676d7Smrg char *strptr, int *v1, int *v2, int *v3) 37572b676d7Smrg{ 37672b676d7Smrg SISPtr pSiS = SISPTR(pScrn); 37772b676d7Smrg float val1 = 0.0, val2 = 0.0, val3 = 0.0; 37872b676d7Smrg Bool valid = FALSE; 37972b676d7Smrg int result = sscanf(strptr, "%f %f %f", &val1, &val2, &val3); 38072b676d7Smrg if(result == 1) { 38172b676d7Smrg if((val1 >= 0.1) && (val1 <= 10.0)) { 38272b676d7Smrg valid = TRUE; 38372b676d7Smrg *v1 = *v2 = *v3 = (int)(val1 * 1000); 38472b676d7Smrg } 38572b676d7Smrg } else if(result == 3) { 38672b676d7Smrg if((val1 >= 0.1) && (val1 <= 10.0) && 38772b676d7Smrg (val2 >= 0.1) && (val2 <= 10.0) && 38872b676d7Smrg (val3 >= 0.1) && (val3 <= 10.0)) { 38972b676d7Smrg valid = TRUE; 39072b676d7Smrg *v1 = (int)(val1 * 1000); 39172b676d7Smrg *v2 = (int)(val2 * 1000); 39272b676d7Smrg *v3 = (int)(val3 * 1000); 39372b676d7Smrg } 39472b676d7Smrg } 39572b676d7Smrg if(!valid) { 39672b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_WARNING, myerror, 39772b676d7Smrg pSiS->Options[SiS_FIFT(pSiS->Options, token)].name); 39872b676d7Smrg } 39972b676d7Smrg return (valid); 40072b676d7Smrg} 40172b676d7Smrg 40272b676d7Smrgstatic Bool 40372b676d7SmrgSiS_EvalOneOrThreeFloats2(ScrnInfoPtr pScrn, int token, const char *myerror, 40472b676d7Smrg char *strptr, float *v1, float *v2, float *v3) 40572b676d7Smrg{ 40672b676d7Smrg SISPtr pSiS = SISPTR(pScrn); 40772b676d7Smrg float val1 = 0.0, val2 = 0.0, val3 = 0.0; 40872b676d7Smrg Bool valid = FALSE; 40972b676d7Smrg int result = sscanf(strptr, "%f %f %f", &val1, &val2, &val3); 41072b676d7Smrg if(result == 1) { 41172b676d7Smrg if((val1 >= -1.0) && (val1 <= 1.0)) { 41272b676d7Smrg valid = TRUE; 41372b676d7Smrg *v1 = *v2 = *v3 = val1; 41472b676d7Smrg } 41572b676d7Smrg } else if(result == 3) { 41672b676d7Smrg if((val1 >= -1.0) && (val1 <= 1.0) && 41772b676d7Smrg (val2 >= -1.0) && (val2 <= 1.0) && 41872b676d7Smrg (val3 >= -1.0) && (val3 <= 1.0)) { 41972b676d7Smrg valid = TRUE; 42072b676d7Smrg *v1 = val1; 42172b676d7Smrg *v2 = val2; 42272b676d7Smrg *v3 = val3; 42372b676d7Smrg } 42472b676d7Smrg } 42572b676d7Smrg if(!valid) { 42672b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_WARNING, myerror, 42772b676d7Smrg pSiS->Options[SiS_FIFT(pSiS->Options, token)].name); 42872b676d7Smrg } 42972b676d7Smrg return (valid); 43072b676d7Smrg} 43172b676d7Smrg 43272b676d7Smrgvoid 43372b676d7SmrgSiSOptions(ScrnInfoPtr pScrn) 43472b676d7Smrg{ 43572b676d7Smrg SISPtr pSiS = SISPTR(pScrn); 43672b676d7Smrg MessageType from; 43772b676d7Smrg char *strptr; 43872b676d7Smrg int ival; 43972b676d7Smrg static const char *baddhm = "Option \"%s\" ignored in Dual Head mode\n"; 44072b676d7Smrg static const char *validparm = "Valid parameters are"; 44172b676d7Smrg static const char *disabledstr= "disabled"; 44272b676d7Smrg static const char *enabledstr = "enabled"; 44372b676d7Smrg static const char *gammaopt = "%s expects either a boolean, or 1 or 3 real numbers (0.1 - 10.0)\n"; 44472b676d7Smrg static const char *briopt = "%s expects 1 or 3 real numbers (0.1 - 10.0)\n"; 44572b676d7Smrg static const char *newbriopt = "%s expects 1 or 3 real numbers (-1.0 - 1.0)\n"; 44672b676d7Smrg Bool val, IsDHM = FALSE; 44772b676d7Smrg Bool IsSecondHead = FALSE; 44872b676d7Smrg 44972b676d7Smrg /* Collect all of the relevant option flags (fill in pScrn->options) */ 45072b676d7Smrg xf86CollectOptions(pScrn, NULL); 45172b676d7Smrg 45272b676d7Smrg /* Process the options */ 45372b676d7Smrg if(!(pSiS->Options = xalloc(sizeof(SISOptions)))) return; 45472b676d7Smrg 45572b676d7Smrg memcpy(pSiS->Options, SISOptions, sizeof(SISOptions)); 45672b676d7Smrg 45772b676d7Smrg xf86ProcessOptions(pScrn->scrnIndex, pScrn->options, pSiS->Options); 45872b676d7Smrg 45972b676d7Smrg /* Set defaults */ 46072b676d7Smrg 46172b676d7Smrg pSiS->newFastVram = -1; 46272b676d7Smrg pSiS->HostBus = TRUE; 46372b676d7Smrg pSiS->TurboQueue = TRUE; 46472b676d7Smrg#ifdef SISVRAMQ 46572b676d7Smrg /* TODO: Option (315 series VRAM command queue) */ 46672b676d7Smrg /* But beware: sisfb does not know about this!!! */ 46772b676d7Smrg pSiS->cmdQueueSize = 512*1024; 46872b676d7Smrg if(pSiS->ChipType == XGI_20) { 46972b676d7Smrg /* Hardware maximum on Z7: 128k */ 47072b676d7Smrg pSiS->cmdQueueSize = 128*1024; 47172b676d7Smrg } 47272b676d7Smrg#endif 47372b676d7Smrg pSiS->doRender = TRUE; 47472b676d7Smrg pSiS->HWCursor = TRUE; 47572b676d7Smrg pSiS->Rotate = 0; 47672b676d7Smrg pSiS->Reflect = 0; 47772b676d7Smrg pSiS->NoAccel = FALSE; 47872b676d7Smrg#if (defined(SIS_USE_EXA) && defined(SIS_USE_XAA)) || !defined(SIS_USE_EXA) 47972b676d7Smrg pSiS->useEXA = FALSE; 48072b676d7Smrg#else 48172b676d7Smrg pSiS->useEXA = TRUE; 48272b676d7Smrg#endif 48372b676d7Smrg pSiS->ShadowFB = FALSE; 48472b676d7Smrg pSiS->loadDRI = FALSE; 48572b676d7Smrg#ifdef XF86DRI 48672b676d7Smrg pSiS->agpWantedPages = AGP_PAGES; 48772b676d7Smrg#endif 48872b676d7Smrg pSiS->VESA = -1; 48972b676d7Smrg pSiS->NoXvideo = FALSE; 49072b676d7Smrg pSiS->maxxfbmem = 0; 49172b676d7Smrg pSiS->forceCRT1 = -1; 49272b676d7Smrg pSiS->DSTN = FALSE; 49372b676d7Smrg pSiS->FSTN = FALSE; 49472b676d7Smrg pSiS->XvOnCRT2 = FALSE; 49572b676d7Smrg pSiS->NoYV12 = -1; 49672b676d7Smrg pSiS->PDC = -1; 49772b676d7Smrg pSiS->PDCA = -1; 49872b676d7Smrg pSiS->EMI = -1; 49972b676d7Smrg pSiS->PRGB = -1; 50072b676d7Smrg pSiS->OptTVStand = -1; 50172b676d7Smrg pSiS->OptROMUsage = -1; 50272b676d7Smrg pSiS->noInternalModes = FALSE; 50372b676d7Smrg pSiS->OptUseOEM = -1; 50472b676d7Smrg pSiS->OptTVOver = -1; 50572b676d7Smrg pSiS->OptTVSOver = -1; 50672b676d7Smrg pSiS->chtvlumabandwidthcvbs = -1; 50772b676d7Smrg pSiS->chtvlumabandwidthsvideo = -1; 50872b676d7Smrg pSiS->chtvlumaflickerfilter = -1; 50972b676d7Smrg pSiS->chtvchromabandwidth = -1; 51072b676d7Smrg pSiS->chtvchromaflickerfilter = -1; 51172b676d7Smrg pSiS->chtvcvbscolor = -1; 51272b676d7Smrg pSiS->chtvtextenhance = -1; 51372b676d7Smrg pSiS->chtvcontrast = -1; 51472b676d7Smrg pSiS->sistvedgeenhance = -1; 51572b676d7Smrg pSiS->sistvantiflicker = -1; 51672b676d7Smrg pSiS->sistvsaturation = -1; 51772b676d7Smrg pSiS->sistvcfilter = -1; 51872b676d7Smrg pSiS->sistvyfilter = 1; /* 0 = off, 1 = default, 2-8 = filter no */ 51972b676d7Smrg pSiS->sistvcolcalibc = 0; 52072b676d7Smrg pSiS->sistvcolcalibf = 0; 52172b676d7Smrg pSiS->sis6326enableyfilter = -1; 52272b676d7Smrg pSiS->sis6326yfilterstrong = -1; 52372b676d7Smrg pSiS->sis6326tvplug = -1; 52472b676d7Smrg pSiS->sis6326fscadjust = 0; 52572b676d7Smrg pSiS->tvxpos = 0; 52672b676d7Smrg pSiS->tvypos = 0; 52772b676d7Smrg pSiS->tvxscale = 0; 52872b676d7Smrg pSiS->tvyscale = 0; 52972b676d7Smrg pSiS->siscrt1satgain = 0; 53072b676d7Smrg pSiS->crt1satgaingiven = FALSE; 53172b676d7Smrg pSiS->NonDefaultPAL = pSiS->NonDefaultNTSC = -1; 53272b676d7Smrg pSiS->chtvtype = -1; 53372b676d7Smrg pSiS->restorebyset = TRUE; 53472b676d7Smrg pSiS->nocrt2ddcdetection = FALSE; 53572b676d7Smrg pSiS->forcecrt2redetection = TRUE; 53672b676d7Smrg pSiS->SenseYPbPr = TRUE; 53772b676d7Smrg pSiS->ForceCRT1Type = CRT1_VGA; 53872b676d7Smrg pSiS->CRT1TypeForced = FALSE; 53972b676d7Smrg pSiS->ForceCRT2Type = CRT2_DEFAULT; 54072b676d7Smrg pSiS->ForceYPbPrAR = TV_YPBPR169; 54172b676d7Smrg pSiS->ForceTVType = -1; 54272b676d7Smrg pSiS->CRT1gamma = TRUE; 54372b676d7Smrg pSiS->CRT1gammaGiven = FALSE; 54472b676d7Smrg pSiS->CRT2gamma = TRUE; 54572b676d7Smrg pSiS->XvGamma = FALSE; 54672b676d7Smrg pSiS->XvGammaGiven = FALSE; 54772b676d7Smrg pSiS->enablesisctrl = FALSE; 54872b676d7Smrg if((pSiS->VGAEngine == SIS_300_VGA) || (pSiS->VGAEngine == SIS_315_VGA)) { 54972b676d7Smrg pSiS->XvDefBri = 10; 55072b676d7Smrg pSiS->XvDefCon = 2; 55172b676d7Smrg } else { 55272b676d7Smrg pSiS->XvDefBri = 0; 55372b676d7Smrg pSiS->XvDefCon = 4; 55472b676d7Smrg } 55572b676d7Smrg pSiS->XvDefHue = 0; 55672b676d7Smrg pSiS->XvDefSat = 0; 55772b676d7Smrg pSiS->XvDefDisableGfx = FALSE; 55872b676d7Smrg pSiS->XvDefDisableGfxLR = FALSE; 55972b676d7Smrg pSiS->XvDefAdaptorBlit = FALSE; 56072b676d7Smrg pSiS->UsePanelScaler = -1; 56172b676d7Smrg pSiS->CenterLCD = -1; 56272b676d7Smrg pSiS->XvUseMemcpy = TRUE; 56372b676d7Smrg pSiS->XvUseChromaKey = FALSE; 56472b676d7Smrg pSiS->XvDisableColorKey = FALSE; 56572b676d7Smrg pSiS->XvInsideChromaKey = FALSE; 56672b676d7Smrg pSiS->XvYUVChromaKey = FALSE; 56772b676d7Smrg pSiS->XvChromaMin = 0x000101fe; 56872b676d7Smrg pSiS->XvChromaMax = 0x000101ff; 56972b676d7Smrg pSiS->XvGammaRed = pSiS->XvGammaGreen = pSiS->XvGammaBlue = 57072b676d7Smrg pSiS->XvGammaRedDef = pSiS->XvGammaGreenDef = pSiS->XvGammaBlueDef = 1000; 57172b676d7Smrg pSiS->GammaBriR = pSiS->GammaBriG = pSiS->GammaBriB = 1000; 57272b676d7Smrg pSiS->CRT2SepGamma = FALSE; 57372b676d7Smrg pSiS->GammaR2 = pSiS->GammaG2 = pSiS->GammaB2 = 1.0; 57472b676d7Smrg pSiS->GammaBriR2 = pSiS->GammaBriG2 = pSiS->GammaBriB2 = 1000; 57572b676d7Smrg pSiS->NewGammaBriR = pSiS->NewGammaBriG = pSiS->NewGammaBriB = 0.0; 57672b676d7Smrg pSiS->NewGammaConR = pSiS->NewGammaConG = pSiS->NewGammaConB = 0.0; 57772b676d7Smrg pSiS->NewGammaBriR2 = pSiS->NewGammaBriG2 = pSiS->NewGammaBriB2 = 0.0; 57872b676d7Smrg pSiS->NewGammaConR2 = pSiS->NewGammaConG2 = pSiS->NewGammaConB2 = 0.0; 57972b676d7Smrg pSiS->HideHWCursor = FALSE; 58072b676d7Smrg pSiS->HWCursorIsVisible = FALSE; 58172b676d7Smrg pSiS->OverruleRanges = TRUE; 58272b676d7Smrg pSiS->BenchMemCpy = TRUE; 58372b676d7Smrg#ifndef SISCHECKOSSSE 58472b676d7Smrg pSiS->XvSSEMemcpy = FALSE; 58572b676d7Smrg#endif 58672b676d7Smrg#ifdef SISMERGED 58772b676d7Smrg pSiS->MergedFB = pSiS->MergedFBAuto = FALSE; 58872b676d7Smrg pSiS->CRT2Position = sisRightOf; 58972b676d7Smrg pSiS->CRT2HSync = NULL; 59072b676d7Smrg pSiS->CRT2VRefresh = NULL; 59172b676d7Smrg pSiS->MetaModes = NULL; 59272b676d7Smrg pSiS->MergedFBXDPI = pSiS->MergedFBYDPI = 0; 59372b676d7Smrg pSiS->CRT1XOffs = pSiS->CRT1YOffs = pSiS->CRT2XOffs = pSiS->CRT2YOffs = 0; 59472b676d7Smrg pSiS->NonRect = pSiS->HaveNonRect = pSiS->HaveOffsRegions = FALSE; 59572b676d7Smrg pSiS->MBXNR1XMAX = pSiS->MBXNR1YMAX = pSiS->MBXNR2XMAX = pSiS->MBXNR2YMAX = 65536; 59672b676d7Smrg pSiS->MouseRestrictions = TRUE; 59772b676d7Smrg#ifdef SISXINERAMA 59872b676d7Smrg pSiS->UseSiSXinerama = TRUE; 59972b676d7Smrg pSiS->CRT2IsScrn0 = FALSE; 60072b676d7Smrg#endif 60172b676d7Smrg#endif 60272b676d7Smrg#ifdef SIS_CP 60372b676d7Smrg SIS_CP_OPT_DEFAULT 60472b676d7Smrg#endif 60572b676d7Smrg 60672b676d7Smrg /* Chipset dependent defaults */ 60772b676d7Smrg 60872b676d7Smrg if(pSiS->Chipset == PCI_CHIP_SIS530) { 60972b676d7Smrg /* TQ still broken on 530/620? */ 61072b676d7Smrg pSiS->TurboQueue = FALSE; 61172b676d7Smrg } 61272b676d7Smrg 61372b676d7Smrg if(pSiS->Chipset == PCI_CHIP_SIS6326) { 61472b676d7Smrg pSiS->newFastVram = 1; 61572b676d7Smrg } 61672b676d7Smrg 61772b676d7Smrg if(pSiS->ChipType == SIS_315H || 61872b676d7Smrg pSiS->ChipType == SIS_315) { 61972b676d7Smrg /* Cursor engine seriously broken */ 62072b676d7Smrg pSiS->HWCursor = FALSE; 62172b676d7Smrg } 62272b676d7Smrg 62372b676d7Smrg if((pSiS->Chipset == PCI_CHIP_SIS550) || 62472b676d7Smrg (pSiS->Chipset == PCI_CHIP_XGIXG20)) { 62572b676d7Smrg /* Alpha blending not supported */ 62672b676d7Smrg pSiS->doRender = FALSE; 62772b676d7Smrg } 62872b676d7Smrg 62972b676d7Smrg if(pSiS->Chipset == PCI_CHIP_XGIXG20) { 63072b676d7Smrg /* No video overlay, no video blitter */ 63172b676d7Smrg pSiS->NoXvideo = TRUE; 63272b676d7Smrg } 63372b676d7Smrg 63472b676d7Smrg /* DRI only supported on 300 series, 63572b676d7Smrg * so don't load DRI by default on 63672b676d7Smrg * others. 63772b676d7Smrg */ 63872b676d7Smrg if(pSiS->VGAEngine == SIS_300_VGA) { 63972b676d7Smrg pSiS->loadDRI = TRUE; 64072b676d7Smrg } 64172b676d7Smrg 64272b676d7Smrg#if XF86_VERSION_CURRENT < XF86_VERSION_NUMERIC(4,2,99,0,0) 64372b676d7Smrg pSiS->OptUseColorCursor = 0; 64472b676d7Smrg#else 64572b676d7Smrg if(pSiS->VGAEngine == SIS_300_VGA) { 64672b676d7Smrg pSiS->OptUseColorCursor = 0; 64772b676d7Smrg pSiS->OptUseColorCursorBlend = 1; 64872b676d7Smrg pSiS->OptColorCursorBlendThreshold = 0x37000000; 64972b676d7Smrg } else if(pSiS->VGAEngine == SIS_315_VGA) { 65072b676d7Smrg if(pSiS->Chipset == PCI_CHIP_XGIXG20) { 65172b676d7Smrg /* No color HW cursor on Z7 */ 65272b676d7Smrg pSiS->OptUseColorCursor = 0; 65372b676d7Smrg } else { 65472b676d7Smrg pSiS->OptUseColorCursor = 1; 65572b676d7Smrg } 65672b676d7Smrg } 65772b676d7Smrg#endif 65872b676d7Smrg 65972b676d7Smrg if(pSiS->VGAEngine == SIS_300_VGA) { 66072b676d7Smrg pSiS->AllowHotkey = 0; 66172b676d7Smrg } else if(pSiS->VGAEngine == SIS_315_VGA) { 66272b676d7Smrg pSiS->AllowHotkey = 1; 66372b676d7Smrg } 66472b676d7Smrg 66572b676d7Smrg /* Collect the options */ 66672b676d7Smrg 66772b676d7Smrg /* FastVRAM (5597/5598, 6326 and 530/620 only) 66872b676d7Smrg */ 66972b676d7Smrg if((pSiS->VGAEngine == SIS_OLD_VGA) || (pSiS->VGAEngine == SIS_530_VGA)) { 67072b676d7Smrg from = X_DEFAULT; 67172b676d7Smrg if(xf86GetOptValBool(pSiS->Options, OPTION_FAST_VRAM, &pSiS->newFastVram)) { 67272b676d7Smrg from = X_CONFIG; 67372b676d7Smrg } 67472b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, from, "Fast VRAM timing %s\n", 67572b676d7Smrg (pSiS->newFastVram == -1) ? 67672b676d7Smrg ((pSiS->oldChipset == OC_SIS620) ? "enabled (for read only)" : 67772b676d7Smrg "enabled (for write only)") : 67872b676d7Smrg (pSiS->newFastVram ? "enabled (for read and write)" : disabledstr)); 67972b676d7Smrg } 68072b676d7Smrg 68172b676d7Smrg /* HostBus (5597/5598 only) 68272b676d7Smrg */ 68372b676d7Smrg if(pSiS->Chipset == PCI_CHIP_SIS5597) { 68472b676d7Smrg from = X_DEFAULT; 68572b676d7Smrg if(xf86GetOptValBool(pSiS->Options, OPTION_HOSTBUS, &pSiS->HostBus)) { 68672b676d7Smrg from = X_CONFIG; 68772b676d7Smrg } 68872b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, from, "SiS5597/5598 VGA-to-CPU host bus %s\n", 68972b676d7Smrg pSiS->HostBus ? enabledstr : disabledstr); 69072b676d7Smrg } 69172b676d7Smrg 69272b676d7Smrg /* MaxXFBMem 69372b676d7Smrg * This options limits the amount of video memory X uses for screen 69472b676d7Smrg * and off-screen buffers. This option should be used if using DRI 69572b676d7Smrg * is intended. The kernel framebuffer driver required for DRM will 69672b676d7Smrg * start its memory heap at 12MB if it detects more than 16MB, at 8MB if 69772b676d7Smrg * between 8 and 16MB are available, otherwise at 4MB. So, if the amount 69872b676d7Smrg * of memory X uses, a clash between the framebuffer's memory heap 69972b676d7Smrg * and X is avoided. The amount is to be specified in KB. 70072b676d7Smrg */ 70172b676d7Smrg if(xf86GetOptValInteger(pSiS->Options, OPTION_MAXXFBMEM, (int *)&pSiS->maxxfbmem)) { 70272b676d7Smrg if(pSiS->maxxfbmem >= 2048) { 70372b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, 70472b676d7Smrg "MaxXFBMem: Framebuffer memory shall be limited to %d KB\n", 70572b676d7Smrg pSiS->maxxfbmem); 70672b676d7Smrg pSiS->maxxfbmem *= 1024; 70772b676d7Smrg } else { 70872b676d7Smrg pSiS->maxxfbmem = 0; 70972b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, 71072b676d7Smrg "Invalid MaxXFBMem setting; minimum is 2048\n"); 71172b676d7Smrg } 71272b676d7Smrg } 71372b676d7Smrg 71472b676d7Smrg /* Accel 71572b676d7Smrg * Turns on/off 2D acceleration 71672b676d7Smrg */ 71772b676d7Smrg if(!xf86ReturnOptValBool(pSiS->Options, OPTION_ACCEL, TRUE)) { 71872b676d7Smrg pSiS->NoAccel = TRUE; 71972b676d7Smrg#if XF86_VERSION_CURRENT < XF86_VERSION_NUMERIC(4,2,99,0,0) 72072b676d7Smrg pSiS->NoXvideo = TRUE; 72172b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "2D Acceleration and Xv disabled\n"); 72272b676d7Smrg#else 72372b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "2D Acceleration disabled\n"); 72472b676d7Smrg#endif 72572b676d7Smrg } 72672b676d7Smrg 72772b676d7Smrg#if defined(SIS_USE_XAA) && defined(SIS_USE_EXA) 72872b676d7Smrg if(!pSiS->NoAccel) { 72972b676d7Smrg from = X_DEFAULT; 73072b676d7Smrg if((strptr = (char *)xf86GetOptValString(pSiS->Options, OPTION_ACCELMETHOD))) { 73172b676d7Smrg if(!xf86NameCmp(strptr,"XAA")) { 73272b676d7Smrg from = X_CONFIG; 73372b676d7Smrg pSiS->useEXA = FALSE; 73472b676d7Smrg } else if(!xf86NameCmp(strptr,"EXA")) { 73572b676d7Smrg from = X_CONFIG; 73672b676d7Smrg pSiS->useEXA = TRUE; 73772b676d7Smrg } 73872b676d7Smrg } 73972b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, from, "Using %s acceleration architecture\n", 74072b676d7Smrg pSiS->useEXA ? "EXA" : "XAA"); 74172b676d7Smrg } 74272b676d7Smrg#endif 74372b676d7Smrg 74472b676d7Smrg /* RenderAcceleration 74572b676d7Smrg * En/Disables RENDER acceleration (315/330/340 series only, not 550, not XGI Z7) 74672b676d7Smrg */ 74772b676d7Smrg#ifdef SIS_USE_XAA 74872b676d7Smrg if((pSiS->VGAEngine == SIS_315_VGA) && 74972b676d7Smrg (pSiS->Chipset != PCI_CHIP_SIS550) && 75072b676d7Smrg (pSiS->Chipset != PCI_CHIP_XGIXG20) && 75172b676d7Smrg (!pSiS->NoAccel)) { 75272b676d7Smrg if(xf86GetOptValBool(pSiS->Options, OPTION_RENDER, &pSiS->doRender)) { 75372b676d7Smrg if(!pSiS->doRender) { 75472b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "RENDER Acceleration disabled\n"); 75572b676d7Smrg } 75672b676d7Smrg } 75772b676d7Smrg } 75872b676d7Smrg#else 75972b676d7Smrg pSiS->doRender = FALSE; 76072b676d7Smrg#endif 76172b676d7Smrg 76272b676d7Smrg /* SWCursor, HWCursor 76372b676d7Smrg * Chooses whether to use the hardware or software cursor 76472b676d7Smrg */ 76572b676d7Smrg from = X_DEFAULT; 76672b676d7Smrg if(xf86GetOptValBool(pSiS->Options, OPTION_HW_CURSOR, &pSiS->HWCursor)) { 76772b676d7Smrg from = X_CONFIG; 76872b676d7Smrg } 76972b676d7Smrg if(xf86ReturnOptValBool(pSiS->Options, OPTION_SW_CURSOR, FALSE)) { 77072b676d7Smrg from = X_CONFIG; 77172b676d7Smrg pSiS->HWCursor = FALSE; 77272b676d7Smrg pSiS->OptUseColorCursor = 0; 77372b676d7Smrg } 77472b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, from, "Using %s cursor\n", 77572b676d7Smrg pSiS->HWCursor ? "HW" : "SW"); 77672b676d7Smrg 77772b676d7Smrg /* 77872b676d7Smrg * UseColorHWCursor 77972b676d7Smrg * ColorHWCursorBlending 78072b676d7Smrg * ColorHWCursorBlendThreshold 78172b676d7Smrg * 78272b676d7Smrg * Enable/disable color hardware cursors; 78372b676d7Smrg * enable/disable color hw cursor emulation for 300 series 78472b676d7Smrg * select emultation transparency threshold for 300 series 78572b676d7Smrg * 78672b676d7Smrg */ 78772b676d7Smrg#if XF86_VERSION_CURRENT >= XF86_VERSION_NUMERIC(4,2,99,0,0) 78872b676d7Smrg#ifdef ARGB_CURSOR 78972b676d7Smrg#ifdef SIS_ARGB_CURSOR 79072b676d7Smrg if((pSiS->HWCursor) && 79172b676d7Smrg ((pSiS->VGAEngine == SIS_300_VGA) || (pSiS->VGAEngine == SIS_315_VGA)) && 79272b676d7Smrg (pSiS->Chipset != PCI_CHIP_XGIXG20)) { 79372b676d7Smrg 79472b676d7Smrg from = X_DEFAULT; 79572b676d7Smrg if(xf86GetOptValBool(pSiS->Options, OPTION_USERGBCURSOR, &pSiS->OptUseColorCursor)) { 79672b676d7Smrg from = X_CONFIG; 79772b676d7Smrg } 79872b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, from, "Color HW cursor is %s\n", 79972b676d7Smrg pSiS->OptUseColorCursor ? enabledstr : disabledstr); 80072b676d7Smrg 80172b676d7Smrg if(pSiS->VGAEngine == SIS_300_VGA) { 80272b676d7Smrg from = X_DEFAULT; 80372b676d7Smrg if(xf86GetOptValBool(pSiS->Options, OPTION_USERGBCURSORBLEND, &pSiS->OptUseColorCursorBlend)) { 80472b676d7Smrg from = X_CONFIG; 80572b676d7Smrg } 80672b676d7Smrg if(pSiS->OptUseColorCursor) { 80772b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, from, 80872b676d7Smrg "HW cursor color blending emulation is %s\n", 80972b676d7Smrg (pSiS->OptUseColorCursorBlend) ? enabledstr : disabledstr); 81072b676d7Smrg } 81172b676d7Smrg from = X_DEFAULT; 81272b676d7Smrg if(xf86GetOptValInteger(pSiS->Options, OPTION_USERGBCURSORBLENDTH, &ival)) { 81372b676d7Smrg if((ival >= 0) && (ival <= 255)) { 81472b676d7Smrg from = X_CONFIG; 81572b676d7Smrg pSiS->OptColorCursorBlendThreshold = (ival << 24); 81672b676d7Smrg } else { 81772b676d7Smrg ival = pSiS->OptColorCursorBlendThreshold >> 24; 81872b676d7Smrg SiS_PrintIlRange(pScrn, OPTION_USERGBCURSORBLENDTH, 0, 255, 0); 81972b676d7Smrg } 82072b676d7Smrg } else { 82172b676d7Smrg ival = pSiS->OptColorCursorBlendThreshold >> 24; 82272b676d7Smrg } 82372b676d7Smrg if(pSiS->OptUseColorCursor) { 82472b676d7Smrg if(pSiS->OptUseColorCursorBlend) { 82572b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, from, 82672b676d7Smrg "HW cursor color blending emulation threshold is %d\n", ival); 82772b676d7Smrg } 82872b676d7Smrg } 82972b676d7Smrg } 83072b676d7Smrg } 83172b676d7Smrg#endif 83272b676d7Smrg#endif 83372b676d7Smrg#endif 83472b676d7Smrg 83572b676d7Smrg /* OverruleFrequencyRanges 83672b676d7Smrg * Enable/disable overruling bogus frequency ranges for TV and LCD(A) 83772b676d7Smrg */ 83872b676d7Smrg if((pSiS->VGAEngine == SIS_300_VGA) || (pSiS->VGAEngine == SIS_315_VGA)) { 83972b676d7Smrg if(xf86GetOptValBool(pSiS->Options, OPTION_OVERRULERANGES, &val)) { 84072b676d7Smrg if(!val) { 84172b676d7Smrg pSiS->OverruleRanges = FALSE; 84272b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Overruling frequency ranges disabled\n"); 84372b676d7Smrg } 84472b676d7Smrg } 84572b676d7Smrg } 84672b676d7Smrg 84772b676d7Smrg#ifdef SISDUALHEAD 84872b676d7Smrg if(pSiS->DualHeadMode) { 84972b676d7Smrg IsDHM = TRUE; 85072b676d7Smrg if(pSiS->SecondHead) IsSecondHead = TRUE; 85172b676d7Smrg } 85272b676d7Smrg#endif 85372b676d7Smrg 85472b676d7Smrg /* MergedFB 85572b676d7Smrg * Enable/disable and configure merged framebuffer mode 85672b676d7Smrg */ 85772b676d7Smrg#ifdef SISMERGED 85872b676d7Smrg#ifdef SISDUALHEAD 85972b676d7Smrg if(pSiS->DualHeadMode) { 86072b676d7Smrg if(xf86IsOptionSet(pSiS->Options, OPTION_MERGEDFB)) { 86172b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_WARNING, baddhm, 86272b676d7Smrg pSiS->Options[SiS_FIFT(pSiS->Options, OPTION_MERGEDFB)].name); 86372b676d7Smrg } 86472b676d7Smrg if(xf86IsOptionSet(pSiS->Options, OPTION_MERGEDFBAUTO)) { 86572b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_WARNING, baddhm, 86672b676d7Smrg pSiS->Options[SiS_FIFT(pSiS->Options, OPTION_MERGEDFBAUTO)].name); 86772b676d7Smrg } 86872b676d7Smrg } else 86972b676d7Smrg#endif 87072b676d7Smrg if((pSiS->VGAEngine == SIS_300_VGA) || (pSiS->VGAEngine == SIS_315_VGA)) { 87172b676d7Smrg if((strptr = (char *)xf86GetOptValString(pSiS->Options, OPTION_MERGEDFB))) { 87272b676d7Smrg if(SiS_StrIsBoolOn(strptr)) { 87372b676d7Smrg pSiS->MergedFB = TRUE; 87472b676d7Smrg pSiS->MergedFBAuto = FALSE; 87572b676d7Smrg } else if(!xf86NameCmp(strptr, "AUTO")) { 87672b676d7Smrg pSiS->MergedFB = TRUE; 87772b676d7Smrg pSiS->MergedFBAuto = TRUE; 87872b676d7Smrg } 87972b676d7Smrg } 88072b676d7Smrg if(xf86GetOptValBool(pSiS->Options, OPTION_MERGEDFBAUTO, &val)) { 88172b676d7Smrg if(!pSiS->MergedFB) { 88272b676d7Smrg if(val) pSiS->MergedFB = pSiS->MergedFBAuto = TRUE; 88372b676d7Smrg } else { 88472b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_WARNING, 88572b676d7Smrg "Option \"MergedFB\" overrules option \"MergedFBAuto\"\n"); 88672b676d7Smrg } 88772b676d7Smrg } 88872b676d7Smrg 88972b676d7Smrg if(pSiS->MergedFB) { 89072b676d7Smrg if((strptr = (char *)xf86GetOptValString(pSiS->Options, OPTION_CRT2POS))) { 89172b676d7Smrg int result; 89272b676d7Smrg Bool valid = FALSE; 89372b676d7Smrg char *tempstr = xalloc(strlen(strptr) + 1); 89472b676d7Smrg result = sscanf(strptr, "%s %d", tempstr, &ival); 89572b676d7Smrg if(result >= 1) { 89672b676d7Smrg if(!xf86NameCmp(tempstr,"LeftOf")) { 89772b676d7Smrg pSiS->CRT2Position = sisLeftOf; 89872b676d7Smrg valid = TRUE; 89972b676d7Smrg if(result == 2) { 90072b676d7Smrg if(ival < 0) pSiS->CRT1YOffs = -ival; 90172b676d7Smrg else pSiS->CRT2YOffs = ival; 90272b676d7Smrg } 90372b676d7Smrg#ifdef SISXINERAMA 90472b676d7Smrg pSiS->CRT2IsScrn0 = TRUE; 90572b676d7Smrg#endif 90672b676d7Smrg } else if(!xf86NameCmp(tempstr,"RightOf")) { 90772b676d7Smrg pSiS->CRT2Position = sisRightOf; 90872b676d7Smrg valid = TRUE; 90972b676d7Smrg if(result == 2) { 91072b676d7Smrg if(ival < 0) pSiS->CRT1YOffs = -ival; 91172b676d7Smrg else pSiS->CRT2YOffs = ival; 91272b676d7Smrg } 91372b676d7Smrg#ifdef SISXINERAMA 91472b676d7Smrg pSiS->CRT2IsScrn0 = FALSE; 91572b676d7Smrg#endif 91672b676d7Smrg } else if(!xf86NameCmp(tempstr,"Above")) { 91772b676d7Smrg pSiS->CRT2Position = sisAbove; 91872b676d7Smrg valid = TRUE; 91972b676d7Smrg if(result == 2) { 92072b676d7Smrg if(ival < 0) pSiS->CRT1XOffs = -ival; 92172b676d7Smrg else pSiS->CRT2XOffs = ival; 92272b676d7Smrg } 92372b676d7Smrg#ifdef SISXINERAMA 92472b676d7Smrg pSiS->CRT2IsScrn0 = FALSE; 92572b676d7Smrg#endif 92672b676d7Smrg } else if(!xf86NameCmp(tempstr,"Below")) { 92772b676d7Smrg pSiS->CRT2Position = sisBelow; 92872b676d7Smrg valid = TRUE; 92972b676d7Smrg if(result == 2) { 93072b676d7Smrg if(ival < 0) pSiS->CRT1XOffs = -ival; 93172b676d7Smrg else pSiS->CRT2XOffs = ival; 93272b676d7Smrg } 93372b676d7Smrg#ifdef SISXINERAMA 93472b676d7Smrg pSiS->CRT2IsScrn0 = TRUE; 93572b676d7Smrg#endif 93672b676d7Smrg } else if(!xf86NameCmp(tempstr,"Clone")) { 93772b676d7Smrg pSiS->CRT2Position = sisClone; 93872b676d7Smrg if(result == 1) valid = TRUE; 93972b676d7Smrg#ifdef SISXINERAMA 94072b676d7Smrg pSiS->CRT2IsScrn0 = TRUE; 94172b676d7Smrg#endif 94272b676d7Smrg } 94372b676d7Smrg } 94472b676d7Smrg if(!valid) { 94572b676d7Smrg SiS_PrintBadOpt(pScrn, strptr, OPTION_CRT2POS); 94672b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, 94772b676d7Smrg "%s \"RightOf\", \"LeftOf\", \"Above\", \"Below\", or \"Clone\"\n", validparm); 94872b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, 94972b676d7Smrg "Except for \"Clone\", the parameter may be followed by an integer.\n"); 95072b676d7Smrg } 95172b676d7Smrg xfree(tempstr); 95272b676d7Smrg } 95372b676d7Smrg if((strptr = (char *)xf86GetOptValString(pSiS->Options, OPTION_METAMODES))) { 95472b676d7Smrg pSiS->MetaModes = xalloc(strlen(strptr) + 1); 95572b676d7Smrg if(pSiS->MetaModes) memcpy(pSiS->MetaModes, strptr, strlen(strptr) + 1); 95672b676d7Smrg } 95772b676d7Smrg if((strptr = (char *)xf86GetOptValString(pSiS->Options, OPTION_CRT2HSYNC))) { 95872b676d7Smrg pSiS->CRT2HSync = xalloc(strlen(strptr) + 1); 95972b676d7Smrg if(pSiS->CRT2HSync) memcpy(pSiS->CRT2HSync, strptr, strlen(strptr) + 1); 96072b676d7Smrg } 96172b676d7Smrg if((strptr = (char *)xf86GetOptValString(pSiS->Options, OPTION_CRT2VREFRESH))) { 96272b676d7Smrg pSiS->CRT2VRefresh = xalloc(strlen(strptr) + 1); 96372b676d7Smrg if(pSiS->CRT2VRefresh) memcpy(pSiS->CRT2VRefresh, strptr, strlen(strptr) + 1); 96472b676d7Smrg } 96572b676d7Smrg if((strptr = (char *)xf86GetOptValString(pSiS->Options, OPTION_MERGEDDPI))) { 96672b676d7Smrg int val1 = 0, val2 = 0; 96772b676d7Smrg sscanf(strptr, "%d %d", &val1, &val2); 96872b676d7Smrg if(val1 && val2) { 96972b676d7Smrg pSiS->MergedFBXDPI = val1; 97072b676d7Smrg pSiS->MergedFBYDPI = val2; 97172b676d7Smrg } else { 97272b676d7Smrg SiS_PrintBadOpt(pScrn, strptr, OPTION_MERGEDDPI); 97372b676d7Smrg } 97472b676d7Smrg } 97572b676d7Smrg#ifdef SISXINERAMA 97672b676d7Smrg if(pSiS->MergedFB) { 97772b676d7Smrg if(xf86GetOptValBool(pSiS->Options, OPTION_SISXINERAMA, &val)) { 97872b676d7Smrg if(!val) pSiS->UseSiSXinerama = FALSE; 97972b676d7Smrg } 98072b676d7Smrg if(pSiS->UseSiSXinerama) { 98172b676d7Smrg if(xf86GetOptValBool(pSiS->Options, OPTION_CRT2ISSCRN0, &val)) { 98272b676d7Smrg pSiS->CRT2IsScrn0 = val ? TRUE : FALSE; 98372b676d7Smrg } 98472b676d7Smrg if(xf86GetOptValBool(pSiS->Options, OPTION_MERGEDFBNONRECT, &val)) { 98572b676d7Smrg pSiS->NonRect = val ? TRUE : FALSE; 98672b676d7Smrg } 98772b676d7Smrg if(xf86GetOptValBool(pSiS->Options, OPTION_MERGEDFBMOUSER, &val)) { 98872b676d7Smrg pSiS->MouseRestrictions = val ? TRUE : FALSE; 98972b676d7Smrg } 99072b676d7Smrg } 99172b676d7Smrg } 99272b676d7Smrg#endif 99372b676d7Smrg } 99472b676d7Smrg } 99572b676d7Smrg#endif 99672b676d7Smrg 99772b676d7Smrg /* Some options can only be specified in the Master Head's Device 99872b676d7Smrg * section. Here we give the user a hint in the log. 99972b676d7Smrg */ 100072b676d7Smrg#ifdef SISDUALHEAD 100172b676d7Smrg if((pSiS->DualHeadMode) && (pSiS->SecondHead)) { 100272b676d7Smrg static const char *mystring = "Option \"%s\" only accepted in CRT2 (Master) Device section\n"; 100372b676d7Smrg int i; 100472b676d7Smrg const short forbiddenopts[] = { 100572b676d7Smrg OPTION_TURBOQUEUE, OPTION_RESTOREBYSET, OPTION_ENABLEHOTKEY, 100672b676d7Smrg OPTION_ENABLESISCTRL, OPTION_USEROMDATA, OPTION_USEOEM, 100772b676d7Smrg OPTION_FORCECRT1, OPTION_DDCFORCRT2, OPTION_FORCECRT2REDETECTION, 100872b676d7Smrg OPTION_SENSEYPBPR, OPTION_FORCE_CRT1TYPE, OPTION_FORCE_CRT2TYPE, 100972b676d7Smrg OPTION_YPBPRAR, OPTION_SCALELCD, OPTION_CENTERLCD, OPTION_PDC, 101072b676d7Smrg OPTION_PDCA, OPTION_EMI, OPTION_SPECIALTIMING, OPTION_LVDSHL, 101172b676d7Smrg OPTION_TVSTANDARD, OPTION_CHTVTYPE, OPTION_CHTVOVERSCAN, 101272b676d7Smrg OPTION_CHTVSOVERSCAN, OPTION_CHTVLUMABANDWIDTHCVBS, 101372b676d7Smrg OPTION_CHTVLUMABANDWIDTHSVIDEO, OPTION_CHTVLUMAFLICKERFILTER, 101472b676d7Smrg OPTION_CHTVCHROMABANDWIDTH, OPTION_CHTVCHROMAFLICKERFILTER, 101572b676d7Smrg OPTION_CHTVCVBSCOLOR, OPTION_CHTVTEXTENHANCE, OPTION_CHTVCONTRAST, 101672b676d7Smrg OPTION_SISTVEDGEENHANCE, OPTION_SISTVANTIFLICKER, OPTION_SISTVSATURATION, 101772b676d7Smrg OPTION_SISTVCHROMAFILTER, OPTION_SISTVLUMAFILTER, OPTION_SISTVCOLCALIBCOARSE, 101872b676d7Smrg OPTION_SISTVCOLCALIBFINE, OPTION_TVXPOSOFFSET, OPTION_TVYPOSOFFSET, 101972b676d7Smrg OPTION_TVXSCALE, OPTION_TVYSCALE, OPTION_TVBLUE, OPTION_CRT2GAMMA, OPTION_XVONCRT2, 102072b676d7Smrg OPTION_XVDEFAULTADAPTOR, OPTION_XVMEMCPY, OPTION_XVBENCHCPY, OPTION_FORCE2ASPECT, 102172b676d7Smrg#if defined(SIS_USE_XAA) && defined(SIS_USE_EXA) 102272b676d7Smrg OPTION_ACCELMETHOD, 102372b676d7Smrg#endif 102472b676d7Smrg#ifndef SISCHECKOSSSE 102572b676d7Smrg OPTION_XVSSECOPY, 102672b676d7Smrg#endif 102772b676d7Smrg#ifdef SIS_CP 102872b676d7Smrg SIS_CP_OPT_DH_WARN 102972b676d7Smrg#endif 103072b676d7Smrg -1 103172b676d7Smrg }; 103272b676d7Smrg 103372b676d7Smrg i = 0; 103472b676d7Smrg while(forbiddenopts[i] >= 0) { 103572b676d7Smrg if(xf86IsOptionSet(pSiS->Options, (int)forbiddenopts[i])) { 103672b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_WARNING, mystring, 103772b676d7Smrg pSiS->Options[SiS_FIFT(pSiS->Options, (int)forbiddenopts[i])].name); 103872b676d7Smrg } 103972b676d7Smrg i++; 104072b676d7Smrg } 104172b676d7Smrg 104272b676d7Smrg } else 104372b676d7Smrg#endif 104472b676d7Smrg { 104572b676d7Smrg if(pSiS->VGAEngine == SIS_315_VGA) { 104672b676d7Smrg 104772b676d7Smrg#ifdef SISVRAMQ 104872b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Using VRAM command queue, size %dk\n", 104972b676d7Smrg pSiS->cmdQueueSize / 1024); 105072b676d7Smrg#else 105172b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Using MMIO command queue, size 512k\n"); 105272b676d7Smrg#endif 105372b676d7Smrg 105472b676d7Smrg } else { 105572b676d7Smrg 105672b676d7Smrg /* TurboQueue */ 105772b676d7Smrg from = X_DEFAULT; 105872b676d7Smrg if(xf86GetOptValBool(pSiS->Options, OPTION_TURBOQUEUE, &pSiS->TurboQueue)) { 105972b676d7Smrg from = X_CONFIG; 106072b676d7Smrg } 106172b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, from, "TurboQueue %s\n", 106272b676d7Smrg pSiS->TurboQueue ? enabledstr : disabledstr); 106372b676d7Smrg } 106472b676d7Smrg 106572b676d7Smrg if((pSiS->VGAEngine == SIS_300_VGA) || (pSiS->VGAEngine == SIS_315_VGA)) { 106672b676d7Smrg 106772b676d7Smrg /* RestoreBySetMode (300/315/330 series only) 106872b676d7Smrg * Set this to force the driver to set the old mode instead of restoring 106972b676d7Smrg * the register contents. This can be used to overcome problems with 107072b676d7Smrg * LCD panels and video bridges. 107172b676d7Smrg */ 107272b676d7Smrg if(xf86GetOptValBool(pSiS->Options, OPTION_RESTOREBYSET, &val)) { 107372b676d7Smrg pSiS->restorebyset = val ? TRUE : FALSE; 107472b676d7Smrg } 107572b676d7Smrg 107672b676d7Smrg /* EnableHotkey (300/315/330 series and later only) 107772b676d7Smrg * Enables or disables the BIOS hotkey switch for 107872b676d7Smrg * switching the output device on laptops. 107972b676d7Smrg * This key causes a total machine hang on many 300 series 108072b676d7Smrg * machines, it is therefore by default disabled on such. 108172b676d7Smrg * In dual head mode, using the hotkey is lethal, so we 108272b676d7Smrg * forbid it then in any case. 108372b676d7Smrg * However, although the driver disables the hotkey as 108472b676d7Smrg * BIOS developers intented to do that, some buggy BIOSes 108572b676d7Smrg * still cause the machine to freeze. Hence the warning. 108672b676d7Smrg */ 108772b676d7Smrg ival = 0; 108872b676d7Smrg from = X_DEFAULT; 108972b676d7Smrg#ifdef SISDUALHEAD 109072b676d7Smrg if(pSiS->DualHeadMode) { 109172b676d7Smrg pSiS->AllowHotkey = 0; 109272b676d7Smrg ival = 1; 109372b676d7Smrg } else 109472b676d7Smrg#endif 109572b676d7Smrg if(xf86GetOptValBool(pSiS->Options, OPTION_ENABLEHOTKEY, &val)) { 109672b676d7Smrg pSiS->AllowHotkey = val ? 1 : 0; 109772b676d7Smrg from = X_CONFIG; 109872b676d7Smrg } 109972b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, from, "Hotkey display switching is %s%s\n", 110072b676d7Smrg pSiS->AllowHotkey ? enabledstr : disabledstr, 110172b676d7Smrg ival ? " in dual head mode" : ""); 110272b676d7Smrg if(pSiS->Chipset == PCI_CHIP_SIS630 || 110372b676d7Smrg pSiS->Chipset == PCI_CHIP_SIS650 || 110472b676d7Smrg pSiS->Chipset == PCI_CHIP_SIS660) { 110572b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, 110672b676d7Smrg "WARNING: Using the Hotkey might freeze your machine, regardless\n"); 110772b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, 110872b676d7Smrg " whether enabled or disabled. This is no driver bug.\n"); 110972b676d7Smrg } 111072b676d7Smrg 111172b676d7Smrg /* UseROMData (300/315/330 series and later only) 111272b676d7Smrg * This option is enabling/disabling usage of some machine 111372b676d7Smrg * specific data from the BIOS ROM. This option can - and 111472b676d7Smrg * should - be used in case the driver makes problems 111572b676d7Smrg * because SiS changed the location of this data. 111672b676d7Smrg */ 111772b676d7Smrg if(xf86GetOptValBool(pSiS->Options, OPTION_USEROMDATA, &val)) { 111872b676d7Smrg pSiS->OptROMUsage = val ? 1 : 0; 111972b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, 112072b676d7Smrg "Video ROM data usage shall be %s\n", 112172b676d7Smrg val ? enabledstr : disabledstr); 112272b676d7Smrg } 112372b676d7Smrg 112472b676d7Smrg /* UseOEMData (300/315/330 series and later only) 112572b676d7Smrg * The driver contains quite a lot data for OEM LCD panels 112672b676d7Smrg * and TV connector specifics which override the defaults. 112772b676d7Smrg * If this data is incorrect, the TV may lose color and 112872b676d7Smrg * the LCD panel might show some strange effects. Use this 112972b676d7Smrg * option to disable the usage of this data. 113072b676d7Smrg */ 113172b676d7Smrg if(xf86GetOptValBool(pSiS->Options, OPTION_USEOEM, &val)) { 113272b676d7Smrg pSiS->OptUseOEM = val ? 1 : 0; 113372b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, 113472b676d7Smrg "Internal CRT2 OEM data usage shall be %s\n", 113572b676d7Smrg val ? enabledstr : disabledstr); 113672b676d7Smrg } 113772b676d7Smrg 113872b676d7Smrg /* CRT2DDCDetection (315/330 series and later only) 113972b676d7Smrg * If set to true, this disables CRT2 detection using DDC. This is 114072b676d7Smrg * to avoid problems with not entirely DDC compiant LCD panels or 114172b676d7Smrg * VGA monitors connected to the secondary VGA plug. Since LCD and 114272b676d7Smrg * VGA share the same DDC channel, it might in some cases be impossible 114372b676d7Smrg * to determine if the device is a CRT monitor or a flat panel. 114472b676d7Smrg */ 114572b676d7Smrg if(xf86GetOptValBool(pSiS->Options, OPTION_DDCFORCRT2, &val)) { 114672b676d7Smrg pSiS->nocrt2ddcdetection = val ? FALSE : TRUE; 114772b676d7Smrg } 114872b676d7Smrg 114972b676d7Smrg /* ForceCRT2ReDetection (315/330 series and later only) 115072b676d7Smrg * If set to true, it forces re-detection of the LCD panel and 115172b676d7Smrg * a secondary VGA connection even if the BIOS already had found 115272b676d7Smrg * about it. This is meant for custom panels (ie such with 115372b676d7Smrg * non-standard resolutions) which the BIOS will "detect" according 115472b676d7Smrg * to the established timings, resulting in only a very vague idea 115572b676d7Smrg * about the panels real resolution. As for secondary VGA, this 115672b676d7Smrg * enables us to include a Plasma panel's proprietary modes. 115772b676d7Smrg */ 115872b676d7Smrg if(xf86GetOptValBool(pSiS->Options, OPTION_FORCECRT2REDETECTION, &val)) { 115972b676d7Smrg if(val) { 116072b676d7Smrg pSiS->forcecrt2redetection = TRUE; 116172b676d7Smrg pSiS->nocrt2ddcdetection = FALSE; 116272b676d7Smrg } else 116372b676d7Smrg pSiS->forcecrt2redetection = FALSE; 116472b676d7Smrg } 116572b676d7Smrg 116672b676d7Smrg /* SenseYPbPr (315/330 series and later only) 116772b676d7Smrg * If set to true, the driver will sense for YPbPr TV. This is 116872b676d7Smrg * inconvenient for folks connecting SVideo and CVBS at the same 116972b676d7Smrg * time, because this condition will be detected as YPbPr (since 117072b676d7Smrg * the TV output pins are shared). "False" will not sense for 117172b676d7Smrg * YPbPr and detect SVideo or CVBS only. 117272b676d7Smrg */ 117372b676d7Smrg if(xf86GetOptValBool(pSiS->Options, OPTION_SENSEYPBPR, &val)) { 117472b676d7Smrg if(val) pSiS->SenseYPbPr = TRUE; 117572b676d7Smrg else pSiS->SenseYPbPr = FALSE; 117672b676d7Smrg } 117772b676d7Smrg 117872b676d7Smrg /* ForceCRT1Type (315/330 series and later only) 117972b676d7Smrg * Used for forcing the driver to initialize CRT1 as 118072b676d7Smrg * VGA (analog) or LCDA (for simultanious LCD and TV 118172b676d7Smrg * display) - on M650/651 and 661 or later with 301C/30xLV only! 118272b676d7Smrg */ 118372b676d7Smrg if(pSiS->VGAEngine == SIS_315_VGA) { 118472b676d7Smrg if((strptr = (char *)xf86GetOptValString(pSiS->Options, OPTION_FORCE_CRT1TYPE))) { 118572b676d7Smrg if((!xf86NameCmp(strptr,"VGA")) || (!xf86NameCmp(strptr,"CRT"))) { 118672b676d7Smrg pSiS->ForceCRT1Type = CRT1_VGA; 118772b676d7Smrg pSiS->CRT1TypeForced = TRUE; 118872b676d7Smrg } else if( (!xf86NameCmp(strptr,"LCD")) || 118972b676d7Smrg (!xf86NameCmp(strptr,"LCDA")) || 119072b676d7Smrg (!xf86NameCmp(strptr,"DVI-D")) || 119172b676d7Smrg (!xf86NameCmp(strptr,"DVID")) || 119272b676d7Smrg (!xf86NameCmp(strptr,"DVI")) || 119372b676d7Smrg (!xf86NameCmp(strptr,"LCD-A")) ) { 119472b676d7Smrg pSiS->ForceCRT1Type = CRT1_LCDA; 119572b676d7Smrg pSiS->CRT1TypeForced = TRUE; 119672b676d7Smrg } else if((!xf86NameCmp(strptr,"NONE")) || (!xf86NameCmp(strptr,"OFF"))) { 119772b676d7Smrg pSiS->ForceCRT1Type = CRT1_VGA; 119872b676d7Smrg pSiS->forceCRT1 = 0; 119972b676d7Smrg pSiS->CRT1TypeForced = TRUE; 120072b676d7Smrg } else { 120172b676d7Smrg SiS_PrintBadOpt(pScrn, strptr, OPTION_FORCE_CRT1TYPE); 120272b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, 120372b676d7Smrg "%s \"VGA\" (alias \"CRT\"), \"LCD\" (alias \"DVI-D\") or NONE\n", validparm); 120472b676d7Smrg } 120572b676d7Smrg } 120672b676d7Smrg } 120772b676d7Smrg 120872b676d7Smrg /* ForceCRT1 (300/315/330 series and later only) 120972b676d7Smrg * This option can be used to force CRT1 (VGA) to be switched on/off. Its 121072b676d7Smrg * intention is mainly for old monitors that can't be detected 121172b676d7Smrg * automatically. This is only useful on machines with a video bridge. 121272b676d7Smrg * In normal cases, this option won't be necessary. 121372b676d7Smrg */ 121472b676d7Smrg if(pSiS->ForceCRT1Type == CRT1_VGA) { 121572b676d7Smrg if(xf86GetOptValBool(pSiS->Options, OPTION_FORCECRT1, &val)) { 121672b676d7Smrg pSiS->forceCRT1 = val ? 1 : 0; 121772b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, 121872b676d7Smrg "CRT1 shall be forced %s\n", 121972b676d7Smrg val ? "ON" : "OFF"); 122072b676d7Smrg } 122172b676d7Smrg } 122272b676d7Smrg 122372b676d7Smrg /* ForceCRT2Type (300/315/330 series and later only) 122472b676d7Smrg * Used for forcing the driver to use a given CRT2 device type. 122572b676d7Smrg * (SVIDEO, COMPOSITE and SCART for overriding detection) 122672b676d7Smrg */ 122772b676d7Smrg strptr = (char *)xf86GetOptValString(pSiS->Options, OPTION_FORCE_CRT2TYPE); 122872b676d7Smrg if(strptr != NULL) { 122972b676d7Smrg if(!xf86NameCmp(strptr,"TV")) 123072b676d7Smrg pSiS->ForceCRT2Type = CRT2_TV; 123172b676d7Smrg else if( (!xf86NameCmp(strptr,"SVIDEO")) || 123272b676d7Smrg (!xf86NameCmp(strptr,"SVHS")) ) { 123372b676d7Smrg pSiS->ForceCRT2Type = CRT2_TV; 123472b676d7Smrg pSiS->ForceTVType = TV_SVIDEO; 123572b676d7Smrg } else if( (!xf86NameCmp(strptr,"COMPOSITE")) || 123672b676d7Smrg (!xf86NameCmp(strptr,"CVBS")) ) { 123772b676d7Smrg pSiS->ForceCRT2Type = CRT2_TV; 123872b676d7Smrg pSiS->ForceTVType = TV_AVIDEO; 123972b676d7Smrg } else if( (!xf86NameCmp(strptr,"COMPOSITE SVIDEO")) || /* Ugly, but shorter than a parsing function */ 124072b676d7Smrg (!xf86NameCmp(strptr,"COMPOSITE+SVIDEO")) || 124172b676d7Smrg (!xf86NameCmp(strptr,"SVIDEO+COMPOSITE")) || 124272b676d7Smrg (!xf86NameCmp(strptr,"SVIDEO COMPOSITE")) ) { 124372b676d7Smrg pSiS->ForceCRT2Type = CRT2_TV; 124472b676d7Smrg pSiS->ForceTVType = (TV_SVIDEO | TV_AVIDEO); 124572b676d7Smrg } else if(!xf86NameCmp(strptr,"SCART")) { 124672b676d7Smrg pSiS->ForceCRT2Type = CRT2_TV; 124772b676d7Smrg pSiS->ForceTVType = TV_SCART; 124872b676d7Smrg } else if((!xf86NameCmp(strptr,"LCD")) || (!xf86NameCmp(strptr,"DVI-D"))) { 124972b676d7Smrg if(pSiS->ForceCRT1Type == CRT1_VGA) { 125072b676d7Smrg pSiS->ForceCRT2Type = CRT2_LCD; 125172b676d7Smrg } else { 125272b676d7Smrg pSiS->ForceCRT2Type = 0; 125372b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_ERROR, 125472b676d7Smrg "Can't set both CRT1 and CRT2 type to LCD; CRT2 disabled\n"); 125572b676d7Smrg } 125672b676d7Smrg } else if((!xf86NameCmp(strptr,"VGA")) || 125772b676d7Smrg (!xf86NameCmp(strptr,"DVI-A")) || 125872b676d7Smrg (!xf86NameCmp(strptr,"CRT"))) { 125972b676d7Smrg if(pSiS->ForceCRT1Type == CRT1_VGA) { 126072b676d7Smrg pSiS->ForceCRT2Type = CRT2_VGA; 126172b676d7Smrg } else { 126272b676d7Smrg pSiS->ForceCRT2Type = 0; 126372b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_ERROR, 126472b676d7Smrg "CRT2 can only be TV or off while CRT1 is LCD; CRT2 disabled\n"); 126572b676d7Smrg } 126672b676d7Smrg } else if(!xf86NameCmp(strptr,"NONE")) 126772b676d7Smrg pSiS->ForceCRT2Type = 0; 126872b676d7Smrg else if((!xf86NameCmp(strptr,"DSTN")) && (pSiS->Chipset == PCI_CHIP_SIS550)) { 126972b676d7Smrg if(pSiS->ForceCRT1Type == CRT1_VGA) { 127072b676d7Smrg pSiS->ForceCRT2Type = CRT2_LCD; 127172b676d7Smrg pSiS->DSTN = TRUE; 127272b676d7Smrg } 127372b676d7Smrg } else if((!xf86NameCmp(strptr,"FSTN")) && (pSiS->Chipset == PCI_CHIP_SIS550)) { 127472b676d7Smrg if(pSiS->ForceCRT1Type == CRT1_VGA) { 127572b676d7Smrg pSiS->ForceCRT2Type = CRT2_LCD; 127672b676d7Smrg pSiS->FSTN = TRUE; 127772b676d7Smrg } 127872b676d7Smrg#ifdef ENABLE_YPBPR 127972b676d7Smrg } else if(!xf86NameCmp(strptr,"HIVISION")) { 128072b676d7Smrg pSiS->ForceCRT2Type = CRT2_TV; 128172b676d7Smrg pSiS->ForceTVType = TV_HIVISION; 128272b676d7Smrg } else if((!xf86NameCmp(strptr,"YPBPR1080I")) && (pSiS->VGAEngine == SIS_315_VGA)) { 128372b676d7Smrg pSiS->ForceCRT2Type = CRT2_TV; 128472b676d7Smrg pSiS->ForceTVType = TV_YPBPR; 128572b676d7Smrg pSiS->ForceYPbPrType = TV_YPBPR1080I; 128672b676d7Smrg } else if(((!xf86NameCmp(strptr,"YPBPR525I")) || (!xf86NameCmp(strptr,"YPBPR480I"))) && 128772b676d7Smrg (pSiS->VGAEngine == SIS_315_VGA)) { 128872b676d7Smrg pSiS->ForceCRT2Type = CRT2_TV; 128972b676d7Smrg pSiS->ForceTVType = TV_YPBPR; 129072b676d7Smrg pSiS->ForceYPbPrType = TV_YPBPR525I; 129172b676d7Smrg } else if(((!xf86NameCmp(strptr,"YPBPR525P")) || (!xf86NameCmp(strptr,"YPBPR480P"))) && 129272b676d7Smrg (pSiS->VGAEngine == SIS_315_VGA)) { 129372b676d7Smrg pSiS->ForceCRT2Type = CRT2_TV; 129472b676d7Smrg pSiS->ForceTVType = TV_YPBPR; 129572b676d7Smrg pSiS->ForceYPbPrType = TV_YPBPR525P; 129672b676d7Smrg } else if(((!xf86NameCmp(strptr,"YPBPR625I")) || (!xf86NameCmp(strptr,"YPBPR576I"))) && 129772b676d7Smrg (pSiS->VGAEngine == SIS_315_VGA)) { 129872b676d7Smrg pSiS->ForceCRT2Type = CRT2_TV; 129972b676d7Smrg pSiS->ForceTVType = TV_YPBPR; 130072b676d7Smrg pSiS->ForceYPbPrType = TV_YPBPR625I; 130172b676d7Smrg } else if(((!xf86NameCmp(strptr,"YPBPR625P")) || (!xf86NameCmp(strptr,"YPBPR576P"))) && 130272b676d7Smrg (pSiS->VGAEngine == SIS_315_VGA)) { 130372b676d7Smrg pSiS->ForceCRT2Type = CRT2_TV; 130472b676d7Smrg pSiS->ForceTVType = TV_YPBPR; 130572b676d7Smrg pSiS->ForceYPbPrType = TV_YPBPR625P; 130672b676d7Smrg } else if(((!xf86NameCmp(strptr,"YPBPR750P")) || (!xf86NameCmp(strptr,"YPBPR720P"))) && 130772b676d7Smrg (pSiS->VGAEngine == SIS_315_VGA)) { 130872b676d7Smrg pSiS->ForceCRT2Type = CRT2_TV; 130972b676d7Smrg pSiS->ForceTVType = TV_YPBPR; 131072b676d7Smrg pSiS->ForceYPbPrType = TV_YPBPR750P; 131172b676d7Smrg#endif 131272b676d7Smrg } else { 131372b676d7Smrg SiS_PrintBadOpt(pScrn, strptr, OPTION_FORCE_CRT2TYPE); 131472b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, 131572b676d7Smrg "%s \"LCD\" (=\"DVI-D\"), \"TV\", \"SVIDEO\", \"COMPOSITE\",\n" 131672b676d7Smrg "\t\"SVIDEO+COMPOSITE\", \"SCART\", \"VGA\" (=\"DVI-A\") or \"NONE\"; on the SiS550\n" 131772b676d7Smrg "\talso \"DSTN\" and \"FSTN\"" 131872b676d7Smrg#ifdef ENABLE_YPBPR 131972b676d7Smrg "; on SiS 301/301B bridges also \"HIVISION\", and on\n" 132072b676d7Smrg "\tSiS315/330/340 series with 301C/30xLV bridge also \"YPBPR480I\", \"YPBPR480P\",\n" 132172b676d7Smrg "\t\"YPBPR576I\", \"YPBPR576P\", \"YPBPR720P\" and \"YPBPR1080I\"" 132272b676d7Smrg#endif 132372b676d7Smrg "\n", validparm); 132472b676d7Smrg } 132572b676d7Smrg 132672b676d7Smrg if(pSiS->ForceCRT2Type != CRT2_DEFAULT) 132772b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, 132872b676d7Smrg "CRT2 type shall be %s\n", strptr); 132972b676d7Smrg } 133072b676d7Smrg 133172b676d7Smrg if(pSiS->ForceTVType == TV_YPBPR) { 133272b676d7Smrg strptr = (char *)xf86GetOptValString(pSiS->Options, OPTION_YPBPRAR); 133372b676d7Smrg if(strptr != NULL) { 133472b676d7Smrg if(!xf86NameCmp(strptr,"4:3LB")) 133572b676d7Smrg pSiS->ForceYPbPrAR = TV_YPBPR43LB; 133672b676d7Smrg else if(!xf86NameCmp(strptr,"4:3")) 133772b676d7Smrg pSiS->ForceYPbPrAR = TV_YPBPR43; 133872b676d7Smrg else if(!xf86NameCmp(strptr,"16:9")) 133972b676d7Smrg pSiS->ForceYPbPrAR = TV_YPBPR169; 134072b676d7Smrg else { 134172b676d7Smrg SiS_PrintBadOpt(pScrn, strptr, OPTION_YPBPRAR); 134272b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, 134372b676d7Smrg "%s \"4:3LB\", \"4:3\" and \"16:9\"\n", validparm); 134472b676d7Smrg } 134572b676d7Smrg } 134672b676d7Smrg } 134772b676d7Smrg 134872b676d7Smrg strptr = (char *)xf86GetOptValString(pSiS->Options, OPTION_SPECIALTIMING); 134972b676d7Smrg if(strptr != NULL) { 135072b676d7Smrg int i = 0; 135172b676d7Smrg Bool found = FALSE; 135272b676d7Smrg if(!xf86NameCmp(strptr,"NONE")) { 135372b676d7Smrg pSiS->SiS_Pr->SiS_CustomT = CUT_FORCENONE; 135472b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, 135572b676d7Smrg "Special timing disabled\n"); 135672b676d7Smrg } else { 135772b676d7Smrg while(SiS_customttable[i].chipID != 0) { 135872b676d7Smrg if(!xf86NameCmp(strptr,SiS_customttable[i].optionName)) { 135972b676d7Smrg pSiS->SiS_Pr->SiS_CustomT = SiS_customttable[i].SpecialID; 136072b676d7Smrg found = TRUE; 136172b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, 136272b676d7Smrg "Special timing for %s %s forced\n", 136372b676d7Smrg SiS_customttable[i].vendorName, SiS_customttable[i].cardName); 136472b676d7Smrg break; 136572b676d7Smrg } 136672b676d7Smrg i++; 136772b676d7Smrg } 136872b676d7Smrg if(!found) { 136972b676d7Smrg SiS_PrintBadOpt(pScrn, strptr, OPTION_SPECIALTIMING); 137072b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, "%s:\n", validparm); 137172b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, "\t\"NONE\" (to disable special timings)\n"); 137272b676d7Smrg i = 0; 137372b676d7Smrg while(SiS_customttable[i].chipID != 0) { 137472b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, 137572b676d7Smrg "\t\"%s\" (for %s %s)\n", 137672b676d7Smrg SiS_customttable[i].optionName, 137772b676d7Smrg SiS_customttable[i].vendorName, 137872b676d7Smrg SiS_customttable[i].cardName); 137972b676d7Smrg i++; 138072b676d7Smrg } 138172b676d7Smrg } 138272b676d7Smrg } 138372b676d7Smrg } 138472b676d7Smrg 138572b676d7Smrg /* EnableSiSCtrl */ 138672b676d7Smrg /* Allow sisctrl tool to change driver settings */ 138772b676d7Smrg from = X_DEFAULT; 138872b676d7Smrg if(xf86GetOptValBool(pSiS->Options, OPTION_ENABLESISCTRL, &val)) { 138972b676d7Smrg if(val) pSiS->enablesisctrl = TRUE; 139072b676d7Smrg from = X_CONFIG; 139172b676d7Smrg } 139272b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, from, "SiSCtrl utility interface is %s\n", 139372b676d7Smrg pSiS->enablesisctrl ? enabledstr : disabledstr); 139472b676d7Smrg 139572b676d7Smrg if((from == X_DEFAULT) && (!pSiS->enablesisctrl)) { 139672b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, 139772b676d7Smrg "For information on SiSCtrl, see\n\t\thttp://www.winischhofer.at/linuxsispart1.shtml#sisctrl\n"); 139872b676d7Smrg } 139972b676d7Smrg 140072b676d7Smrg 140172b676d7Smrg /* ForceCRT1Aspect, ForceCRT2Aspect */ 140272b676d7Smrg /* Make driver believe that a connected CRT/VGA device is 4:3 ("normal") 140372b676d7Smrg * or 16:9 ("wide"). Note: This affects only for real VGA (analog) 140472b676d7Smrg * output devices, not TV or DVI/LCD. 140572b676d7Smrg */ 140672b676d7Smrg if(pSiS->VGAEngine == SIS_315_VGA) { 140772b676d7Smrg strptr = (char *)xf86GetOptValString(pSiS->Options, OPTION_FORCE2ASPECT); 140872b676d7Smrg if(strptr != NULL) { 140972b676d7Smrg if(!xf86NameCmp(strptr,"WIDE")) { 141072b676d7Smrg pSiS->SiS_Pr->SiS_UseWideCRT2 = TRUE; 141172b676d7Smrg } else if(!xf86NameCmp(strptr,"NORMAL")) { 141272b676d7Smrg pSiS->SiS_Pr->SiS_UseWideCRT2 = FALSE; 141372b676d7Smrg } else { 141472b676d7Smrg SiS_PrintBadOpt(pScrn, strptr, OPTION_FORCE2ASPECT); 141572b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, "%s:\n", validparm); 141672b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, "\t\"NORMAL\" or \"WIDE\"\n"); 141772b676d7Smrg } 141872b676d7Smrg /* Print status later */ 141972b676d7Smrg } 142072b676d7Smrg } 142172b676d7Smrg 142272b676d7Smrg /* ScaleLCD (300/315/330 series and later only) 142372b676d7Smrg * Can be used to force the bridge/panel link to [do|not do] the 142472b676d7Smrg * scaling of modes lower than the panel's native resolution. 142572b676d7Smrg * Setting this to TRUE will force the bridge/panel link 142672b676d7Smrg * to scale; FALSE will rely on the panel's capabilities. 142772b676d7Smrg * Not supported on all machines. 142872b676d7Smrg */ 142972b676d7Smrg if(xf86GetOptValBool(pSiS->Options, OPTION_SCALELCD, &val)) { 143072b676d7Smrg pSiS->UsePanelScaler = val ? 0 : 1; 143172b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "LCD scaling is %s\n", 143272b676d7Smrg pSiS->UsePanelScaler ? disabledstr : enabledstr); 143372b676d7Smrg } 143472b676d7Smrg 143572b676d7Smrg /* CenterLCD (300/315/330/later + SiS video bridge only) 143672b676d7Smrg * If LCD shall not be scaled, this selects whether 1:1 data 143772b676d7Smrg * will be sent to the output, or the image shall be centered 143872b676d7Smrg * on the LCD. For LVDS panels, screen will always be centered, 143972b676d7Smrg * since these have no built-in scaler. For TMDS, this is 144072b676d7Smrg * selectable. Non-centered means that the driver will pass 144172b676d7Smrg * 1:1 data to the output and that the panel will have to 144272b676d7Smrg * scale by itself (if supported by the panel). 144372b676d7Smrg */ 144472b676d7Smrg if(xf86GetOptValBool(pSiS->Options, OPTION_CENTERLCD, &val)) { 144572b676d7Smrg pSiS->CenterLCD = val ? 1 : 0; 144672b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Non-scaled LCD output will %sbe centered\n", 144772b676d7Smrg pSiS->CenterLCD ? "not " : ""); 144872b676d7Smrg } 144972b676d7Smrg 145072b676d7Smrg /* PanelDelayCompensation (300/315/330 series and later only) 145172b676d7Smrg * This might be required if the LCD panel shows "small waves" 145272b676d7Smrg * or wrong colors. 145372b676d7Smrg * The parameter is an integer, (on 300 series usually either 145472b676d7Smrg * 4, 32 or 24; on 315 series + LV bridge usually 3 or 51) 145572b676d7Smrg * Why this option? Simply because SiS did poor BIOS design. 145672b676d7Smrg * The PDC value depends on the very LCD panel used in a 145772b676d7Smrg * particular machine. For most panels, the driver is able 145872b676d7Smrg * to detect the correct value. However, some panels require 145972b676d7Smrg * a different setting. For 300 series, the value given must 146072b676d7Smrg * be within the mask 0x3c. For 661 and later, if must be 146172b676d7Smrg * within the range of 0 to 31. 146272b676d7Smrg */ 146372b676d7Smrg ival = -1; 146472b676d7Smrg xf86GetOptValInteger(pSiS->Options, OPTION_PDC, &ival); 146572b676d7Smrg if(ival != -1) { 146672b676d7Smrg pSiS->PDC = ival; 146772b676d7Smrg if((pSiS->VGAEngine == SIS_300_VGA) && (pSiS->PDC & ~0x3c)) { 146872b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_WARNING, 146972b676d7Smrg "Invalid PanelDelayCompensation parameter\n"); 147072b676d7Smrg pSiS->PDC = -1; 147172b676d7Smrg } else { 147272b676d7Smrg if(pSiS->VGAEngine == SIS_315_VGA) pSiS->PDC &= 0x1f; 147372b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, 147472b676d7Smrg "Panel delay compensation shall be %d (for LCD=CRT2)\n", 147572b676d7Smrg pSiS->PDC); 147672b676d7Smrg } 147772b676d7Smrg } 147872b676d7Smrg 147972b676d7Smrg /* PanelDelayCompensation1 (315/330 series and later only) 148072b676d7Smrg * Same as above, but for LCD-via-CRT1 ("LCDA") 148172b676d7Smrg */ 148272b676d7Smrg if(pSiS->VGAEngine == SIS_315_VGA) { 148372b676d7Smrg ival = -1; 148472b676d7Smrg xf86GetOptValInteger(pSiS->Options, OPTION_PDCA, &ival); 148572b676d7Smrg if(ival != -1) { 148672b676d7Smrg pSiS->PDCA = ival; 148772b676d7Smrg if(pSiS->PDCA > 0x1f) { 148872b676d7Smrg SiS_PrintIlRange(pScrn, OPTION_PDCA, 0, 31, 0); 148972b676d7Smrg pSiS->PDCA = -1; 149072b676d7Smrg } else { 149172b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, 149272b676d7Smrg "Panel delay compensation shall be %d (for LCD=CRT1)\n", 149372b676d7Smrg pSiS->PDCA); 149472b676d7Smrg } 149572b676d7Smrg } 149672b676d7Smrg } 149772b676d7Smrg 149872b676d7Smrg /* LVDSHL (300/315/330/later series + 30xLV bridge only) 149972b676d7Smrg * This might be required if the LCD panel is too dark. 150072b676d7Smrg * The parameter is an integer from 0 to 3. 150172b676d7Smrg */ 150272b676d7Smrg if(xf86GetOptValInteger(pSiS->Options, OPTION_LVDSHL, &pSiS->SiS_Pr->LVDSHL)) { 150372b676d7Smrg if((pSiS->SiS_Pr->LVDSHL < 0) || (pSiS->SiS_Pr->LVDSHL > 3)) { 150472b676d7Smrg SiS_PrintIlRange(pScrn, OPTION_LVDSHL, 0, 3, 0); 150572b676d7Smrg pSiS->SiS_Pr->LVDSHL = -1; 150672b676d7Smrg } else { 150772b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, 150872b676d7Smrg "LVDSHL will be %d\n", 150972b676d7Smrg pSiS->SiS_Pr->LVDSHL); 151072b676d7Smrg } 151172b676d7Smrg } 151272b676d7Smrg 151372b676d7Smrg /* EMI (315/330/later series + 302LV/302ELV bridge only) 151472b676d7Smrg * This might be required if the LCD panel loses sync on 151572b676d7Smrg * mode switches. So far, this problem should not show up 151672b676d7Smrg * due to the auto-detection (from reading the values set 151772b676d7Smrg * by the BIOS; however, the BIOS values are wrong sometimes 151872b676d7Smrg * such as in the case of some Compal machines with a 151972b676d7Smrg * 1400x1050, or some Inventec(Compaq) machines with a 152072b676d7Smrg * 1280x1024 panel. 152172b676d7Smrg * The parameter is an integer from 0 to 0x60ffffff. 152272b676d7Smrg */ 152372b676d7Smrg if(xf86GetOptValInteger(pSiS->Options, OPTION_EMI, &pSiS->EMI)) { 152472b676d7Smrg if((pSiS->EMI < 0) || (pSiS->EMI > 0x60ffffff)) { 152572b676d7Smrg SiS_PrintIlRange(pScrn, OPTION_LVDSHL, 0, 0x60ffffff, 1); 152672b676d7Smrg pSiS->EMI = -1; 152772b676d7Smrg } else { 152872b676d7Smrg pSiS->EMI &= 0x60ffffff; 152972b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, 153072b676d7Smrg "EMI will be 0x%04x\n", pSiS->EMI); 153172b676d7Smrg } 153272b676d7Smrg } 153372b676d7Smrg 153472b676d7Smrg /* TVBlueWorkAround (315/later series only) 153572b676d7Smrg * TRUE and FALSE are two ways to work around a "blue shade" on 153672b676d7Smrg * TV output. This work-around is disabled by not setting the 153772b676d7Smrg * option. 315 series + 301B-DH only. 153872b676d7Smrg */ 153972b676d7Smrg if(pSiS->VGAEngine == SIS_315_VGA) { 154072b676d7Smrg if(xf86GetOptValBool(pSiS->Options, OPTION_TVBLUE, &val)) { 154172b676d7Smrg pSiS->SiS_Pr->SiS_TVBlue = val ? 1 : 0; 154272b676d7Smrg } 154372b676d7Smrg } 154472b676d7Smrg 154572b676d7Smrg /* ForcePanelRGB (300/315/330 series and later only) 154672b676d7Smrg * Can be used to force the bridge/panel link to assume a 154772b676d7Smrg * specified LCD color capability of 18 or 24 bit in cases 154872b676d7Smrg * where the BIOS carries incorrect information (such as in 154972b676d7Smrg * the case of the MSI m250). 155072b676d7Smrg */ 155172b676d7Smrg if(xf86GetOptValInteger(pSiS->Options, OPTION_PRGB, &pSiS->PRGB)) { 155272b676d7Smrg if((pSiS->PRGB != 18 && pSiS->PRGB != 24)) { 155372b676d7Smrg pSiS->PRGB = -1; 155472b676d7Smrg SiS_PrintBadOpt(pScrn, strptr, OPTION_PRGB); 155572b676d7Smrg } else { 155672b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, 155772b676d7Smrg "LCD panel color depth is %d\n", 155872b676d7Smrg pSiS->PRGB); 155972b676d7Smrg } 156072b676d7Smrg } 156172b676d7Smrg 156272b676d7Smrg } 156372b676d7Smrg 156472b676d7Smrg 156572b676d7Smrg /* TVStandard (300/315/330/later series and 6326 w/ TV only) 156672b676d7Smrg * This option is for overriding the autodetection of 156772b676d7Smrg * the BIOS/Jumper option for PAL / NTSC 156872b676d7Smrg */ 156972b676d7Smrg if((pSiS->VGAEngine == SIS_300_VGA) || 157072b676d7Smrg (pSiS->VGAEngine == SIS_315_VGA) || 157172b676d7Smrg ((pSiS->Chipset == PCI_CHIP_SIS6326) && (pSiS->SiS6326Flags & SIS6326_HASTV))) { 157272b676d7Smrg strptr = (char *)xf86GetOptValString(pSiS->Options, OPTION_TVSTANDARD); 157372b676d7Smrg if(strptr != NULL) { 157472b676d7Smrg if(!xf86NameCmp(strptr,"PAL")) 157572b676d7Smrg pSiS->OptTVStand = 1; 157672b676d7Smrg else if((!xf86NameCmp(strptr,"PALM")) || 157772b676d7Smrg (!xf86NameCmp(strptr,"PAL-M"))) { 157872b676d7Smrg pSiS->OptTVStand = 1; 157972b676d7Smrg pSiS->NonDefaultPAL = 1; 158072b676d7Smrg } else if((!xf86NameCmp(strptr,"PALN")) || 158172b676d7Smrg (!xf86NameCmp(strptr,"PAL-N"))) { 158272b676d7Smrg pSiS->OptTVStand = 1; 158372b676d7Smrg pSiS->NonDefaultPAL = 0; 158472b676d7Smrg } else if((!xf86NameCmp(strptr,"NTSCJ")) || 158572b676d7Smrg (!xf86NameCmp(strptr,"NTSC-J"))) { 158672b676d7Smrg pSiS->OptTVStand = 0; 158772b676d7Smrg pSiS->NonDefaultNTSC = 1; 158872b676d7Smrg } else if(!xf86NameCmp(strptr,"NTSC")) 158972b676d7Smrg pSiS->OptTVStand = 0; 159072b676d7Smrg else { 159172b676d7Smrg SiS_PrintBadOpt(pScrn, strptr, OPTION_TVSTANDARD); 159272b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, 159372b676d7Smrg "%s \"PAL\", \"PALM\", \"PALN\", \"NTSC\", \"NTSCJ\"\n", validparm); 159472b676d7Smrg } 159572b676d7Smrg 159672b676d7Smrg if(pSiS->OptTVStand != -1) { 159772b676d7Smrg static const char *tvstdstr = "TV standard shall be %s\n"; 159872b676d7Smrg if(pSiS->Chipset == PCI_CHIP_SIS6326) { 159972b676d7Smrg pSiS->NonDefaultPAL = -1; 160072b676d7Smrg pSiS->NonDefaultNTSC = -1; 160172b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, tvstdstr, 160272b676d7Smrg pSiS->OptTVStand ? "PAL" : "NTSC"); 160372b676d7Smrg } else { 160472b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, tvstdstr, 160572b676d7Smrg (pSiS->OptTVStand ? 160672b676d7Smrg ( (pSiS->NonDefaultPAL == -1) ? "PAL" : 160772b676d7Smrg ((pSiS->NonDefaultPAL) ? "PALM" : "PALN") ) : 160872b676d7Smrg (pSiS->NonDefaultNTSC == -1) ? "NTSC" : "NTSCJ")); 160972b676d7Smrg } 161072b676d7Smrg } 161172b676d7Smrg } 161272b676d7Smrg } 161372b676d7Smrg 161472b676d7Smrg /* CHTVType (315/330/later series + Chrontel only) 161572b676d7Smrg * Used for telling the driver if the TV output shall 161672b676d7Smrg * be 525i YPbPr or SCART. 161772b676d7Smrg */ 161872b676d7Smrg if(pSiS->VGAEngine == SIS_315_VGA) { 161972b676d7Smrg strptr = (char *)xf86GetOptValString(pSiS->Options, OPTION_CHTVTYPE); 162072b676d7Smrg if(strptr != NULL) { 162172b676d7Smrg if(!xf86NameCmp(strptr,"SCART")) 162272b676d7Smrg pSiS->chtvtype = 1; 162372b676d7Smrg else if(!xf86NameCmp(strptr,"YPBPR525I")) 162472b676d7Smrg pSiS->chtvtype = 0; 162572b676d7Smrg else { 162672b676d7Smrg SiS_PrintBadOpt(pScrn, strptr, OPTION_CHTVTYPE); 162772b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, 162872b676d7Smrg "%s \"SCART\" or \"YPBPR525I\"\n", validparm); 162972b676d7Smrg } 163072b676d7Smrg if(pSiS->chtvtype != -1) 163172b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, 163272b676d7Smrg "Chrontel: TV type shall be %s\n", strptr); 163372b676d7Smrg } 163472b676d7Smrg } 163572b676d7Smrg 163672b676d7Smrg /* CHTVOverscan (300/315/330 series and later only) 163772b676d7Smrg * CHTVSuperOverscan (300/315/330 series and later only) 163872b676d7Smrg * These options are for overriding the BIOS option for 163972b676d7Smrg * TV Overscan. Some BIOSes don't even have such an option. 164072b676d7Smrg * SuperOverscan is only supported with PAL. 164172b676d7Smrg * Both options are only effective on machines with a 164272b676d7Smrg * CHRONTEL TV encoder. SuperOverscan is only available 164372b676d7Smrg * on the 700x. 164472b676d7Smrg */ 164572b676d7Smrg if((pSiS->VGAEngine == SIS_300_VGA) || (pSiS->VGAEngine == SIS_315_VGA)) { 164672b676d7Smrg if(xf86GetOptValBool(pSiS->Options, OPTION_CHTVOVERSCAN, &val)) { 164772b676d7Smrg pSiS->OptTVOver = val ? 1 : 0; 164872b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, 164972b676d7Smrg "Chrontel: TV overscan shall be %s\n", 165072b676d7Smrg val ? enabledstr : disabledstr); 165172b676d7Smrg } 165272b676d7Smrg if(xf86GetOptValBool(pSiS->Options, OPTION_CHTVSOVERSCAN, &pSiS->OptTVSOver)) { 165372b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, 165472b676d7Smrg "Chrontel: TV super overscan shall be %s\n", 165572b676d7Smrg pSiS->OptTVSOver ? enabledstr : disabledstr); 165672b676d7Smrg } 165772b676d7Smrg } 165872b676d7Smrg 165972b676d7Smrg /* Various parameters for TV output via SiS bridge, Chrontel or SiS6326 166072b676d7Smrg */ 166172b676d7Smrg if((pSiS->VGAEngine == SIS_300_VGA) || (pSiS->VGAEngine == SIS_315_VGA)) { 166272b676d7Smrg int tmp = 0; 166372b676d7Smrg xf86GetOptValInteger(pSiS->Options, OPTION_CHTVLUMABANDWIDTHCVBS, 166472b676d7Smrg &pSiS->chtvlumabandwidthcvbs); 166572b676d7Smrg xf86GetOptValInteger(pSiS->Options, OPTION_CHTVLUMABANDWIDTHSVIDEO, 166672b676d7Smrg &pSiS->chtvlumabandwidthsvideo); 166772b676d7Smrg xf86GetOptValInteger(pSiS->Options, OPTION_CHTVLUMAFLICKERFILTER, 166872b676d7Smrg &pSiS->chtvlumaflickerfilter); 166972b676d7Smrg xf86GetOptValInteger(pSiS->Options, OPTION_CHTVCHROMABANDWIDTH, 167072b676d7Smrg &pSiS->chtvchromabandwidth); 167172b676d7Smrg xf86GetOptValInteger(pSiS->Options, OPTION_CHTVCHROMAFLICKERFILTER, 167272b676d7Smrg &pSiS->chtvchromaflickerfilter); 167372b676d7Smrg xf86GetOptValBool(pSiS->Options, OPTION_CHTVCVBSCOLOR, 167472b676d7Smrg &pSiS->chtvcvbscolor); 167572b676d7Smrg xf86GetOptValInteger(pSiS->Options, OPTION_CHTVTEXTENHANCE, 167672b676d7Smrg &pSiS->chtvtextenhance); 167772b676d7Smrg xf86GetOptValInteger(pSiS->Options, OPTION_CHTVCONTRAST, 167872b676d7Smrg &pSiS->chtvcontrast); 167972b676d7Smrg xf86GetOptValInteger(pSiS->Options, OPTION_SISTVEDGEENHANCE, 168072b676d7Smrg &pSiS->sistvedgeenhance); 168172b676d7Smrg xf86GetOptValInteger(pSiS->Options, OPTION_SISTVSATURATION, 168272b676d7Smrg &pSiS->sistvsaturation); 168372b676d7Smrg xf86GetOptValInteger(pSiS->Options, OPTION_SISTVLUMAFILTER, 168472b676d7Smrg &pSiS->sistvyfilter); 168572b676d7Smrg if((pSiS->sistvyfilter < 0) || (pSiS->sistvyfilter > 8)) { 168672b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_WARNING, 168772b676d7Smrg "Illegal Y Filter number; valid is 0 (off), 1 (default), 2-8 (filter number 1-7)\n"); 168872b676d7Smrg pSiS->sistvyfilter = 1; 168972b676d7Smrg } 169072b676d7Smrg xf86GetOptValBool(pSiS->Options, OPTION_SISTVCHROMAFILTER, 169172b676d7Smrg &pSiS->sistvcfilter); 169272b676d7Smrg xf86GetOptValInteger(pSiS->Options, OPTION_SISTVCOLCALIBCOARSE, 169372b676d7Smrg &pSiS->sistvcolcalibc); 169472b676d7Smrg xf86GetOptValInteger(pSiS->Options, OPTION_SISTVCOLCALIBFINE, 169572b676d7Smrg &pSiS->sistvcolcalibf); 169672b676d7Smrg if((pSiS->sistvcolcalibf > 127) || (pSiS->sistvcolcalibf < -128) || 169772b676d7Smrg (pSiS->sistvcolcalibc > 120) || (pSiS->sistvcolcalibc < -120)) { 169872b676d7Smrg pSiS->sistvcolcalibf = pSiS->sistvcolcalibc = 0; 169972b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_WARNING, 170072b676d7Smrg "Illegal Color Calibration. Range is -128 to 127 (fine), -120 to 120 (coarse)\n"); 170172b676d7Smrg } 170272b676d7Smrg xf86GetOptValInteger(pSiS->Options, OPTION_TVXPOSOFFSET, 170372b676d7Smrg &pSiS->tvxpos); 170472b676d7Smrg xf86GetOptValInteger(pSiS->Options, OPTION_TVYPOSOFFSET, 170572b676d7Smrg &pSiS->tvypos); 170672b676d7Smrg if(pSiS->tvxpos > 32) { pSiS->tvxpos = 32; tmp = 1; } 170772b676d7Smrg if(pSiS->tvxpos < -32) { pSiS->tvxpos = -32; tmp = 1; } 170872b676d7Smrg if(pSiS->tvypos > 32) { pSiS->tvypos = 32; tmp = 1; } 170972b676d7Smrg if(pSiS->tvypos < -32) { pSiS->tvypos = -32; tmp = 1; } 171072b676d7Smrg if(tmp) xf86DrvMsg(pScrn->scrnIndex, X_WARNING, 171172b676d7Smrg "Illegal TV x or y offset. Range is from -32 to 32\n"); 171272b676d7Smrg tmp = 0; 171372b676d7Smrg xf86GetOptValInteger(pSiS->Options, OPTION_TVXSCALE, 171472b676d7Smrg &pSiS->tvxscale); 171572b676d7Smrg xf86GetOptValInteger(pSiS->Options, OPTION_TVYSCALE, 171672b676d7Smrg &pSiS->tvyscale); 171772b676d7Smrg if(pSiS->tvxscale > 16) { pSiS->tvxscale = 16; tmp = 1; } 171872b676d7Smrg if(pSiS->tvxscale < -16) { pSiS->tvxscale = -16; tmp = 1; } 171972b676d7Smrg if(pSiS->tvyscale > 3) { pSiS->tvyscale = 3; tmp = 1; } 172072b676d7Smrg if(pSiS->tvyscale < -4) { pSiS->tvyscale = -4; tmp = 1; } 172172b676d7Smrg if(tmp) xf86DrvMsg(pScrn->scrnIndex, X_WARNING, 172272b676d7Smrg "Illegal TV x or y scaling parameter. Range is from -16 to 16 (X), -4 to 3 (Y)\n"); 172372b676d7Smrg } 172472b676d7Smrg 172572b676d7Smrg if((pSiS->Chipset == PCI_CHIP_SIS6326) && (pSiS->SiS6326Flags & SIS6326_HASTV)) { 172672b676d7Smrg int tmp = 0; 172772b676d7Smrg strptr = (char *)xf86GetOptValString(pSiS->Options, OPTION_SIS6326FORCETVPPLUG); 172872b676d7Smrg if(strptr) { 172972b676d7Smrg if(!xf86NameCmp(strptr,"COMPOSITE")) 173072b676d7Smrg pSiS->sis6326tvplug = 1; 173172b676d7Smrg else if(!xf86NameCmp(strptr,"SVIDEO")) 173272b676d7Smrg pSiS->sis6326tvplug = 0; 173372b676d7Smrg else { 173472b676d7Smrg SiS_PrintBadOpt(pScrn, strptr, OPTION_SIS6326FORCETVPPLUG); 173572b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, 173672b676d7Smrg "%s \"COMPOSITE\" or \"SVIDEO\"\n", validparm); 173772b676d7Smrg } 173872b676d7Smrg } 173972b676d7Smrg xf86GetOptValBool(pSiS->Options, OPTION_SIS6326ENABLEYFILTER, 174072b676d7Smrg &pSiS->sis6326enableyfilter); 174172b676d7Smrg xf86GetOptValBool(pSiS->Options, OPTION_SIS6326YFILTERSTRONG, 174272b676d7Smrg &pSiS->sis6326yfilterstrong); 174372b676d7Smrg xf86GetOptValInteger(pSiS->Options, OPTION_TVXPOSOFFSET, 174472b676d7Smrg &pSiS->tvxpos); 174572b676d7Smrg xf86GetOptValInteger(pSiS->Options, OPTION_TVYPOSOFFSET, 174672b676d7Smrg &pSiS->tvypos); 174772b676d7Smrg if(pSiS->tvxpos > 16) { pSiS->tvxpos = 16; tmp = 1; } 174872b676d7Smrg if(pSiS->tvxpos < -16) { pSiS->tvxpos = -16; tmp = 1; } 174972b676d7Smrg if(pSiS->tvypos > 16) { pSiS->tvypos = 16; tmp = 1; } 175072b676d7Smrg if(pSiS->tvypos < -16) { pSiS->tvypos = -16; tmp = 1; } 175172b676d7Smrg if(tmp) xf86DrvMsg(pScrn->scrnIndex, X_WARNING, 175272b676d7Smrg "Illegal TV x or y offset. Range is from -16 to 16\n"); 175372b676d7Smrg xf86GetOptValInteger(pSiS->Options, OPTION_SIS6326FSCADJUST, 175472b676d7Smrg &pSiS->sis6326fscadjust); 175572b676d7Smrg if(pSiS->sis6326fscadjust) { 175672b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, 175772b676d7Smrg "Adjusting the default FSC by %d\n", 175872b676d7Smrg pSiS->sis6326fscadjust); 175972b676d7Smrg } 176072b676d7Smrg } 176172b676d7Smrg 176272b676d7Smrg if((pSiS->VGAEngine == SIS_300_VGA) || (pSiS->VGAEngine == SIS_315_VGA) || 176372b676d7Smrg ((pSiS->Chipset == PCI_CHIP_SIS6326) && (pSiS->SiS6326Flags & SIS6326_HASTV))) { 176472b676d7Smrg Bool Is6326 = FALSE; 176572b676d7Smrg strptr = (char *)xf86GetOptValString(pSiS->Options, OPTION_SISTVANTIFLICKER); 176672b676d7Smrg if(!strptr) { 176772b676d7Smrg strptr = (char *)xf86GetOptValString(pSiS->Options, OPTION_SIS6326ANTIFLICKER); 176872b676d7Smrg Is6326 = TRUE; 176972b676d7Smrg } 177072b676d7Smrg if(strptr) { 177172b676d7Smrg if(!xf86NameCmp(strptr,"OFF")) 177272b676d7Smrg pSiS->sistvantiflicker = 0; 177372b676d7Smrg else if(!xf86NameCmp(strptr,"LOW")) 177472b676d7Smrg pSiS->sistvantiflicker = 1; 177572b676d7Smrg else if(!xf86NameCmp(strptr,"MED")) 177672b676d7Smrg pSiS->sistvantiflicker = 2; 177772b676d7Smrg else if(!xf86NameCmp(strptr,"HIGH")) 177872b676d7Smrg pSiS->sistvantiflicker = 3; 177972b676d7Smrg else if(!xf86NameCmp(strptr,"ADAPTIVE")) 178072b676d7Smrg pSiS->sistvantiflicker = 4; 178172b676d7Smrg else { 178272b676d7Smrg pSiS->sistvantiflicker = -1; 178372b676d7Smrg SiS_PrintBadOpt(pScrn, strptr, Is6326 ? OPTION_SIS6326FORCETVPPLUG : OPTION_SISTVANTIFLICKER); 178472b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, 178572b676d7Smrg "%s \"OFF\", \"LOW\", \"MED\", \"HIGH\" or \"ADAPTIVE\"\n", validparm); 178672b676d7Smrg } 178772b676d7Smrg } 178872b676d7Smrg } 178972b676d7Smrg 179072b676d7Smrg /* CRT2Gamma - enable/disable/set gamma correction for CRT2 179172b676d7Smrg * Since 2004/11/26, this option is a boolean and string option 179272b676d7Smrg * simulaniously. "TRUE" (or other valid bool values) have the 179372b676d7Smrg * same effect as before: The driver uses the (global) Gamma 179472b676d7Smrg * for both CRT1 and CRT2. Otherwise, this option takes one or 179572b676d7Smrg * three floats between 0.1 and 10.0 which define a separate 179672b676d7Smrg * gamma correction for CRT2. (SiS video bridges only.) 179772b676d7Smrg */ 179872b676d7Smrg if((pSiS->VGAEngine == SIS_300_VGA) || (pSiS->VGAEngine == SIS_315_VGA)) { 179972b676d7Smrg if((strptr = (char *)xf86GetOptValString(pSiS->Options, OPTION_CRT2GAMMA))) { 180072b676d7Smrg if(SiS_StrIsBoolOn(strptr)) { 180172b676d7Smrg pSiS->CRT2gamma = TRUE; 180272b676d7Smrg pSiS->CRT2SepGamma = FALSE; 180372b676d7Smrg } else if(SiS_StrIsBoolOff(strptr)) { 180472b676d7Smrg pSiS->CRT2gamma = pSiS->CRT2SepGamma = FALSE; 180572b676d7Smrg } else { 180672b676d7Smrg if(SiS_EvalOneOrThreeFloats(pScrn, OPTION_CRT2GAMMA, gammaopt, strptr, 180772b676d7Smrg &pSiS->GammaR2i, &pSiS->GammaG2i, &pSiS->GammaB2i)) { 180872b676d7Smrg pSiS->GammaR2 = (float)pSiS->GammaR2i / 1000.0; 180972b676d7Smrg pSiS->GammaG2 = (float)pSiS->GammaG2i / 1000.0; 181072b676d7Smrg pSiS->GammaB2 = (float)pSiS->GammaB2i / 1000.0; 181172b676d7Smrg pSiS->CRT2gamma = TRUE; 181272b676d7Smrg if(!IsDHM) pSiS->CRT2SepGamma = TRUE; 181372b676d7Smrg else { 181472b676d7Smrg#ifdef SISDUALHEAD 181572b676d7Smrg pSiS->CRT2SepGamma = FALSE; 181672b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, 181772b676d7Smrg "CRT2Gamma values overrule default and Monitor Gamma\n"); 181872b676d7Smrg if(pScrn->monitor) { 181972b676d7Smrg pScrn->monitor->gamma.red = pSiS->GammaR2; 182072b676d7Smrg pScrn->monitor->gamma.green = pSiS->GammaG2; 182172b676d7Smrg pScrn->monitor->gamma.blue = pSiS->GammaB2; 182272b676d7Smrg } 182372b676d7Smrg#endif 182472b676d7Smrg } 182572b676d7Smrg } 182672b676d7Smrg } 182772b676d7Smrg } 182872b676d7Smrg } 182972b676d7Smrg 183072b676d7Smrg /* Default adaptor: Overlay (default) or blitter */ 183172b676d7Smrg if(pSiS->VGAEngine == SIS_315_VGA) { 183272b676d7Smrg if((strptr = (char *)xf86GetOptValString(pSiS->Options, OPTION_XVDEFAULTADAPTOR))) { 183372b676d7Smrg if(!xf86NameCmp(strptr, "OVERLAY")) { 183472b676d7Smrg pSiS->XvDefAdaptorBlit = FALSE; 183572b676d7Smrg } else if(!xf86NameCmp(strptr, "BLITTER")) { 183672b676d7Smrg pSiS->XvDefAdaptorBlit = TRUE; 183772b676d7Smrg } else { 183872b676d7Smrg SiS_PrintBadOpt(pScrn, strptr, OPTION_XVDEFAULTADAPTOR); 183972b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, 184072b676d7Smrg "%s \"OVERLAY\" or \"BLITTER\"\n", validparm); 184172b676d7Smrg } 184272b676d7Smrg } 184372b676d7Smrg } 184472b676d7Smrg 184572b676d7Smrg if(xf86GetOptValBool(pSiS->Options, OPTION_XVMEMCPY, &val)) { 184672b676d7Smrg pSiS->XvUseMemcpy = val ? TRUE : FALSE; 184772b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Xv will %suse memcpy()\n", 184872b676d7Smrg val ? "" : "not "); 184972b676d7Smrg } 185072b676d7Smrg 185172b676d7Smrg#if defined(__i386__) || defined(__AMD64__) || defined(__amd64__) || defined(__x86_64__) 185272b676d7Smrg if(xf86GetOptValBool(pSiS->Options, OPTION_XVBENCHCPY, &val)) { 185372b676d7Smrg pSiS->BenchMemCpy = val ? TRUE : FALSE; 185472b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, 185572b676d7Smrg "Will %sbenchmark methods for system RAM to video RAM transfers\n", 185672b676d7Smrg val ? "" : "not "); 185772b676d7Smrg } 185872b676d7Smrg 185972b676d7Smrg#ifndef SISCHECKOSSSE 186072b676d7Smrg if(xf86GetOptValBool(pSiS->Options, OPTION_XVSSECOPY, &val)) { 186172b676d7Smrg pSiS->XvSSEMemcpy = val ? TRUE : FALSE; 186272b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, 186372b676d7Smrg "Will %s use SSE CPU instructions\n", 186472b676d7Smrg val ? "eventually" : "not"); 186572b676d7Smrg } 186672b676d7Smrg#endif 186772b676d7Smrg#endif /* __i386__ || __AMD64__ || __amd64__ */ 186872b676d7Smrg 186972b676d7Smrg#ifdef SIS_CP 187072b676d7Smrg SIS_CP_OPT_DOOPT 187172b676d7Smrg#endif 187272b676d7Smrg 187372b676d7Smrg } /* DualHead */ 187472b676d7Smrg 187572b676d7Smrg /* CRT1Gamma - enable/disable gamma correction for CRT1 187672b676d7Smrg */ 187772b676d7Smrg if(xf86GetOptValBool(pSiS->Options, OPTION_CRT1GAMMA, &val)) { 187872b676d7Smrg pSiS->CRT1gamma = val; 187972b676d7Smrg pSiS->CRT1gammaGiven = TRUE; 188072b676d7Smrg } 188172b676d7Smrg 188272b676d7Smrg /* ForceCRT1Aspect, ForceCRT2Aspect */ 188372b676d7Smrg /* Make driver believe that a connected CRT/VGA device is 4:3 ("normal") 188472b676d7Smrg * or 16:9 ("wide"). Note: This affects only for real VGA (analog) 188572b676d7Smrg * output devices, not TV or DVI/LCD. 188672b676d7Smrg */ 188772b676d7Smrg if(pSiS->VGAEngine == SIS_315_VGA) { 188872b676d7Smrg strptr = (char *)xf86GetOptValString(pSiS->Options, OPTION_FORCE1ASPECT); 188972b676d7Smrg if(strptr != NULL) { 189072b676d7Smrg if(!xf86NameCmp(strptr,"WIDE")) { 189172b676d7Smrg pSiS->SiS_Pr->SiS_UseWide = 1; 189272b676d7Smrg } else if(!xf86NameCmp(strptr,"NORMAL")) { 189372b676d7Smrg pSiS->SiS_Pr->SiS_UseWide = 0; 189472b676d7Smrg } else { 189572b676d7Smrg SiS_PrintBadOpt(pScrn, strptr, OPTION_FORCE1ASPECT); 189672b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, "%s:\n", validparm); 189772b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, "\t\"NORMAL\" or \"WIDE\"\n"); 189872b676d7Smrg } 189972b676d7Smrg if(pSiS->SiS_Pr->SiS_UseWide != -1) { 190072b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, 190172b676d7Smrg "CRT1 (VGA) aspect ratio will be assumed %s\n", 190272b676d7Smrg pSiS->SiS_Pr->SiS_UseWide ? "wide" : "normal"); 190372b676d7Smrg } 190472b676d7Smrg } 190572b676d7Smrg if(pSiS->SiS_Pr->SiS_UseWideCRT2 != -1) { 190672b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, 190772b676d7Smrg "CRT2 (VGA) aspect ratio will be assumed %s\n", 190872b676d7Smrg pSiS->SiS_Pr->SiS_UseWideCRT2 ? "wide" : "normal"); 190972b676d7Smrg } 191072b676d7Smrg } 191172b676d7Smrg 191272b676d7Smrg /* VESA - DEPRECATED 191372b676d7Smrg * This option is for forcing the driver to use 191472b676d7Smrg * the VESA BIOS extension for mode switching. 191572b676d7Smrg */ 191672b676d7Smrg if(xf86GetOptValBool(pSiS->Options, OPTION_VESA, &val)) { 191772b676d7Smrg if(IsDHM) { 191872b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_WARNING, baddhm, 191972b676d7Smrg pSiS->Options[SiS_FIFT(pSiS->Options, OPTION_VESA)].name); 192072b676d7Smrg } else { 192172b676d7Smrg pSiS->VESA = val ? 1 : 0; 192272b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, 192372b676d7Smrg "VESA: VESA usage shall be %s\n", 192472b676d7Smrg val ? enabledstr : disabledstr); 192572b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_WARNING, 192672b676d7Smrg "*** Option \"VESA\" is deprecated. *** \n"); 192772b676d7Smrg if(pSiS->VESA) pSiS->ForceCRT1Type = CRT1_VGA; 192872b676d7Smrg } 192972b676d7Smrg } 193072b676d7Smrg 193172b676d7Smrg if((pSiS->VGAEngine == SIS_300_VGA) || (pSiS->VGAEngine == SIS_315_VGA)) { 193272b676d7Smrg /* InternalModes (300/315/330 series only) 193372b676d7Smrg * The default behavior is to replace X's default modes with 193472b676d7Smrg * a mode list generated out of the known and supported modes. Use 193572b676d7Smrg * this option to disable this. NOT RECOMMENDED. 193672b676d7Smrg */ 193772b676d7Smrg if(xf86GetOptValBool(pSiS->Options, OPTION_INTERNALMODES, &val)) { 193872b676d7Smrg pSiS->noInternalModes = val ? FALSE : TRUE; 193972b676d7Smrg if(pSiS->noInternalModes) { 194072b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Usage of built-in modes is %s\n", disabledstr); 194172b676d7Smrg } 194272b676d7Smrg } 194372b676d7Smrg 194472b676d7Smrg } 194572b676d7Smrg 194672b676d7Smrg /* ShadowFB */ 194772b676d7Smrg from = X_DEFAULT; 194872b676d7Smrg if(xf86GetOptValBool(pSiS->Options, OPTION_SHADOW_FB, &pSiS->ShadowFB)) { 194972b676d7Smrg#ifdef SISMERGED 195072b676d7Smrg if(pSiS->MergedFB) { 195172b676d7Smrg pSiS->ShadowFB = FALSE; 195272b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_WARNING, 195372b676d7Smrg "Shadow Framebuffer not supported in MergedFB mode\n"); 195472b676d7Smrg } else 195572b676d7Smrg#endif 195672b676d7Smrg from = X_CONFIG; 195772b676d7Smrg } 195872b676d7Smrg if(pSiS->ShadowFB) { 195972b676d7Smrg pSiS->NoAccel = TRUE; 196072b676d7Smrg#if XF86_VERSION_CURRENT < XF86_VERSION_NUMERIC(4,2,99,0,0) 196172b676d7Smrg pSiS->NoXvideo = TRUE; 196272b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, from, 196372b676d7Smrg "Using \"Shadow Framebuffer\" - 2D acceleration and Xv disabled\n"); 196472b676d7Smrg#else 196572b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, from, 196672b676d7Smrg "Using \"Shadow Framebuffer\" - 2D acceleration disabled\n"); 196772b676d7Smrg#endif 196872b676d7Smrg } 196972b676d7Smrg 197072b676d7Smrg /* Rotate */ 197172b676d7Smrg if((strptr = (char *)xf86GetOptValString(pSiS->Options, OPTION_ROTATE))) { 197272b676d7Smrg#ifdef SISMERGED 197372b676d7Smrg if(pSiS->MergedFB) { 197472b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_WARNING, 197572b676d7Smrg "Screen rotation not supported in MergedFB mode\n"); 197672b676d7Smrg } else 197772b676d7Smrg#endif 197872b676d7Smrg if(IsDHM) { 197972b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_WARNING, baddhm, 198072b676d7Smrg pSiS->Options[SiS_FIFT(pSiS->Options, OPTION_ROTATE)].name); 198172b676d7Smrg } else if(!xf86NameCmp(strptr, "CW")) { 198272b676d7Smrg pSiS->Rotate = 1; 198372b676d7Smrg } else if(!xf86NameCmp(strptr, "CCW")) { 198472b676d7Smrg pSiS->Rotate = -1; 198572b676d7Smrg } else { 198672b676d7Smrg SiS_PrintBadOpt(pScrn, strptr, OPTION_ROTATE); 198772b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, 198872b676d7Smrg "%s \"CW\" or \"CCW\"\n", validparm); 198972b676d7Smrg } 199072b676d7Smrg 199172b676d7Smrg if(pSiS->Rotate) { 199272b676d7Smrg pSiS->ShadowFB = TRUE; 199372b676d7Smrg pSiS->NoAccel = TRUE; 199472b676d7Smrg pSiS->HWCursor = FALSE; 199572b676d7Smrg pSiS->NoXvideo = TRUE; 199672b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, 199772b676d7Smrg "Rotating screen %sclockwise (2D acceleration and Xv disabled)\n", 199872b676d7Smrg (pSiS->Rotate == -1) ? "counter " : ""); 199972b676d7Smrg } 200072b676d7Smrg } 200172b676d7Smrg 200272b676d7Smrg /* Reflect */ 200372b676d7Smrg if((strptr = (char *)xf86GetOptValString(pSiS->Options, OPTION_REFLECT))) { 200472b676d7Smrg#ifdef SISMERGED 200572b676d7Smrg if(pSiS->MergedFB) { 200672b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_WARNING, 200772b676d7Smrg "Screen reflection not supported in MergedFB mode\n"); 200872b676d7Smrg } else 200972b676d7Smrg#endif 201072b676d7Smrg if(IsDHM) { 201172b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_WARNING, baddhm, 201272b676d7Smrg pSiS->Options[SiS_FIFT(pSiS->Options, OPTION_REFLECT)].name); 201372b676d7Smrg } else if(pSiS->Rotate) { 201472b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_WARNING, 201572b676d7Smrg "Screen rotation and reflection are mutually exclusive\n"); 201672b676d7Smrg } else if(!xf86NameCmp(strptr, "X")) { 201772b676d7Smrg pSiS->Reflect = 1; 201872b676d7Smrg } else if(!xf86NameCmp(strptr, "Y")) { 201972b676d7Smrg pSiS->Reflect = 2; 202072b676d7Smrg } else if((!xf86NameCmp(strptr, "XY")) || 202172b676d7Smrg (!xf86NameCmp(strptr, "YX"))) { 202272b676d7Smrg pSiS->Reflect = 3; 202372b676d7Smrg } else { 202472b676d7Smrg SiS_PrintBadOpt(pScrn, strptr, OPTION_REFLECT); 202572b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, 202672b676d7Smrg "%s \"X\", \"Y\" or \"XY\"\n", validparm); 202772b676d7Smrg } 202872b676d7Smrg 202972b676d7Smrg if(pSiS->Reflect) { 203072b676d7Smrg pSiS->ShadowFB = TRUE; 203172b676d7Smrg pSiS->NoAccel = TRUE; 203272b676d7Smrg pSiS->HWCursor = FALSE; 203372b676d7Smrg pSiS->NoXvideo = TRUE; 203472b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, 203572b676d7Smrg "Reflecting screen (2D acceleration and Xv disabled)\n"); 203672b676d7Smrg } 203772b676d7Smrg } 203872b676d7Smrg 203972b676d7Smrg#ifdef XF86DRI 204072b676d7Smrg /* DRI */ 204172b676d7Smrg from = X_DEFAULT; 204272b676d7Smrg if(xf86GetOptValBool(pSiS->Options, OPTION_DRI, &pSiS->loadDRI)) { 204372b676d7Smrg from = X_CONFIG; 204472b676d7Smrg } 204572b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, from, "DRI %s\n", 204672b676d7Smrg pSiS->loadDRI ? enabledstr : disabledstr); 204772b676d7Smrg 204872b676d7Smrg /* AGPSize = GARTSize */ 204972b676d7Smrg if(xf86GetOptValInteger(pSiS->Options, OPTION_AGP_SIZE, &ival)) { 205072b676d7Smrg if((ival >= 8) && (ival <= 512)) { 205172b676d7Smrg pSiS->agpWantedPages = (ival * 1024 * 1024) / AGP_PAGE_SIZE; 205272b676d7Smrg } else { 205372b676d7Smrg SiS_PrintIlRange(pScrn, OPTION_AGP_SIZE, 8, 512, 0); 205472b676d7Smrg } 205572b676d7Smrg } 205672b676d7Smrg#endif 205772b676d7Smrg 205872b676d7Smrg /* XVideo 205972b676d7Smrg * Set enables/disables Xv hardware video acceleration 206072b676d7Smrg */ 206172b676d7Smrg#if XF86_VERSION_CURRENT < XF86_VERSION_NUMERIC(4,2,99,0,0) 206272b676d7Smrg if((!pSiS->NoAccel) && (!pSiS->NoXvideo)) { 206372b676d7Smrg#else 206472b676d7Smrg if(!pSiS->NoXvideo) { 206572b676d7Smrg#endif 206672b676d7Smrg if(!xf86ReturnOptValBool(pSiS->Options, OPTION_XVIDEO, TRUE)) { 206772b676d7Smrg pSiS->NoXvideo = TRUE; 206872b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "XVideo extension (Xv) disabled\n"); 206972b676d7Smrg } 207072b676d7Smrg 207172b676d7Smrg if(!pSiS->NoXvideo) { 207272b676d7Smrg 207372b676d7Smrg if((pSiS->VGAEngine == SIS_300_VGA) || (pSiS->VGAEngine == SIS_315_VGA)) { 207472b676d7Smrg /* XvOnCRT2 207572b676d7Smrg * On chipsets with only one overlay (315, 650, 740, 330), the user can 207672b676d7Smrg * choose to display the overlay on CRT1 or CRT2. By setting this 207772b676d7Smrg * option to TRUE, the overlay will be displayed on CRT2. The 207872b676d7Smrg * default is: CRT1 if only CRT1 available, CRT2 if only CRT2 207972b676d7Smrg * available, and CRT1 if both is available and detected. 208072b676d7Smrg * Since implementation of the XV_SWITCHCRT Xv property this only 208172b676d7Smrg * selects the default CRT. 208272b676d7Smrg */ 208372b676d7Smrg if(xf86GetOptValBool(pSiS->Options, OPTION_XVONCRT2, &val)) { 208472b676d7Smrg pSiS->XvOnCRT2 = val ? TRUE : FALSE; 208572b676d7Smrg } 208672b676d7Smrg } 208772b676d7Smrg 208872b676d7Smrg if((pSiS->VGAEngine == SIS_OLD_VGA) || (pSiS->VGAEngine == SIS_530_VGA)) { 208972b676d7Smrg /* NoYV12 (for 5597/5598, 6326 and 530/620 only) 209072b676d7Smrg * YV12 has problems with videos larger than 384x288. So 209172b676d7Smrg * allow the user to disable YV12 support to force the 209272b676d7Smrg * application to use YUV2 instead. 209372b676d7Smrg */ 209472b676d7Smrg if(xf86GetOptValBool(pSiS->Options, OPTION_YV12, &val)) { 209572b676d7Smrg pSiS->NoYV12 = val ? 0 : 1; 209672b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, 209772b676d7Smrg "Xv YV12/I420 support is %s\n", 209872b676d7Smrg pSiS->NoYV12 ? disabledstr : enabledstr); 209972b676d7Smrg } 210072b676d7Smrg } 210172b676d7Smrg 210272b676d7Smrg /* Some Xv properties' defaults can be set by options */ 210372b676d7Smrg if(xf86GetOptValInteger(pSiS->Options, OPTION_XVDEFCONTRAST, &ival)) { 210472b676d7Smrg if((ival >= 0) && (ival <= 7)) pSiS->XvDefCon = ival; 210572b676d7Smrg else SiS_PrintIlRange(pScrn, OPTION_XVDEFCONTRAST, 0, 7, 0); 210672b676d7Smrg } 210772b676d7Smrg if(xf86GetOptValInteger(pSiS->Options, OPTION_XVDEFBRIGHTNESS, &ival)) { 210872b676d7Smrg if((ival >= -128) && (ival <= 127)) pSiS->XvDefBri = ival; 210972b676d7Smrg else SiS_PrintIlRange(pScrn, OPTION_XVDEFBRIGHTNESS, -128, 127, 0); 211072b676d7Smrg } 211172b676d7Smrg if(pSiS->VGAEngine == SIS_315_VGA) { 211272b676d7Smrg if(xf86GetOptValInteger(pSiS->Options, OPTION_XVDEFHUE, &ival)) { 211372b676d7Smrg if((ival >= -8) && (ival <= 7)) pSiS->XvDefHue = ival; 211472b676d7Smrg else SiS_PrintIlRange(pScrn, OPTION_XVDEFHUE, -8, 7, 0); 211572b676d7Smrg } 211672b676d7Smrg if(xf86GetOptValInteger(pSiS->Options, OPTION_XVDEFSATURATION, &ival)) { 211772b676d7Smrg if((ival >= -7) && (ival <= 7)) pSiS->XvDefSat = ival; 211872b676d7Smrg else SiS_PrintIlRange(pScrn, OPTION_XVDEFSATURATION, -7, 7, 0); 211972b676d7Smrg } 212072b676d7Smrg } 212172b676d7Smrg if(xf86GetOptValBool(pSiS->Options, OPTION_XVDEFDISABLEGFX, &val)) { 212272b676d7Smrg if(val) pSiS->XvDefDisableGfx = TRUE; 212372b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, 212472b676d7Smrg "Graphics display will be %s during Xv usage\n", 212572b676d7Smrg val ? disabledstr : enabledstr); 212672b676d7Smrg } 212772b676d7Smrg if((pSiS->VGAEngine == SIS_300_VGA) || (pSiS->VGAEngine == SIS_315_VGA)) { 212872b676d7Smrg if(xf86GetOptValBool(pSiS->Options, OPTION_XVDEFDISABLEGFXLR, &val)) { 212972b676d7Smrg if(val) pSiS->XvDefDisableGfxLR = TRUE; 213072b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, 213172b676d7Smrg "Graphics display left/right of overlay will be %s during Xv usage\n", 213272b676d7Smrg val ? disabledstr : enabledstr); 213372b676d7Smrg } 213472b676d7Smrg if(xf86GetOptValBool(pSiS->Options, OPTION_XVDISABLECOLORKEY, &val)) { 213572b676d7Smrg if(val) pSiS->XvDisableColorKey = TRUE; 213672b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, 213772b676d7Smrg "Xv Color key is %s\n", 213872b676d7Smrg val ? disabledstr : enabledstr); 213972b676d7Smrg } 214072b676d7Smrg if(xf86GetOptValBool(pSiS->Options, OPTION_XVUSECHROMAKEY, &val)) { 214172b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, 214272b676d7Smrg "Xv Chroma-keying is %s\n", 214372b676d7Smrg val ? enabledstr : disabledstr); 214472b676d7Smrg if(val) pSiS->XvUseChromaKey = TRUE; 214572b676d7Smrg } 214672b676d7Smrg if(xf86GetOptValBool(pSiS->Options, OPTION_XVINSIDECHROMAKEY, &val)) { 214772b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, 214872b676d7Smrg "Xv: Video is transparent if %s chroma key range\n", 214972b676d7Smrg val ? "inside" : "outside"); 215072b676d7Smrg if(val) pSiS->XvInsideChromaKey = TRUE; 215172b676d7Smrg } 215272b676d7Smrg if(pSiS->VGAEngine == SIS_300_VGA) { 215372b676d7Smrg if(xf86GetOptValBool(pSiS->Options, OPTION_XVYUVCHROMAKEY, &val)) { 215472b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, 215572b676d7Smrg "Xv: Chroma key is in %s format\n", 215672b676d7Smrg val ? "YUV" : "RGB"); 215772b676d7Smrg if(val) pSiS->XvYUVChromaKey = TRUE; 215872b676d7Smrg } 215972b676d7Smrg } else { 216072b676d7Smrg if(xf86GetOptValBool(pSiS->Options, OPTION_XVYUVCHROMAKEY, &val)) { 216172b676d7Smrg xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 4, 216272b676d7Smrg "Xv: Chroma key is of same format as video source\n"); 216372b676d7Smrg } 216472b676d7Smrg } 216572b676d7Smrg if(xf86GetOptValInteger(pSiS->Options, OPTION_XVCHROMAMIN, &ival)) { 216672b676d7Smrg if((ival >= 0) && (ival <= 0xffffff)) pSiS->XvChromaMin = ival; 216772b676d7Smrg else SiS_PrintIlRange(pScrn, OPTION_XVCHROMAMIN, 0, 0xffffff, 1); 216872b676d7Smrg } 216972b676d7Smrg if(xf86GetOptValInteger(pSiS->Options, OPTION_XVCHROMAMAX, &ival)) { 217072b676d7Smrg if((ival >= 0) && (ival <= 0xffffff)) pSiS->XvChromaMax = ival; 217172b676d7Smrg else SiS_PrintIlRange(pScrn, OPTION_XVCHROMAMAX, 0, 0xffffff, 1); 217272b676d7Smrg } 217372b676d7Smrg } 217472b676d7Smrg 217572b676d7Smrg if(pSiS->VGAEngine == SIS_315_VGA) { 217672b676d7Smrg /* XvGamma - enable/disable gamma correction for Xv 217772b676d7Smrg * Supported for CRT1 only 217872b676d7Smrg */ 217972b676d7Smrg if((strptr = (char *)xf86GetOptValString(pSiS->Options, OPTION_XVGAMMA))) { 218072b676d7Smrg if(SiS_StrIsBoolOn(strptr)) { 218172b676d7Smrg pSiS->XvGamma = pSiS->XvGammaGiven = TRUE; 218272b676d7Smrg } else if(SiS_StrIsBoolOff(strptr)) { 218372b676d7Smrg pSiS->XvGamma = FALSE; 218472b676d7Smrg pSiS->XvGammaGiven = TRUE; 218572b676d7Smrg } else { 218672b676d7Smrg if(SiS_EvalOneOrThreeFloats(pScrn, OPTION_XVGAMMA, gammaopt, strptr, 218772b676d7Smrg &pSiS->XvGammaRed, &pSiS->XvGammaGreen, &pSiS->XvGammaBlue)) { 218872b676d7Smrg pSiS->XvGamma = pSiS->XvGammaGiven = TRUE; 218972b676d7Smrg pSiS->XvGammaRedDef = pSiS->XvGammaRed; 219072b676d7Smrg pSiS->XvGammaGreenDef = pSiS->XvGammaGreen; 219172b676d7Smrg pSiS->XvGammaBlue = pSiS->XvGammaBlue; 219272b676d7Smrg } 219372b676d7Smrg } 219472b676d7Smrg } 219572b676d7Smrg } 219672b676d7Smrg } 219772b676d7Smrg } 219872b676d7Smrg 219972b676d7Smrg if((pSiS->VGAEngine == SIS_300_VGA) || (pSiS->VGAEngine == SIS_315_VGA)) { 220072b676d7Smrg Bool GotNewBri = FALSE, GotOldBri = FALSE, GotCon = FALSE; 220172b676d7Smrg if((strptr = (char *)xf86GetOptValString(pSiS->Options, OPTION_NEWSTOREDCON))) { 220272b676d7Smrg SiS_EvalOneOrThreeFloats2(pScrn, OPTION_NEWSTOREDCON, newbriopt, strptr, 220372b676d7Smrg &pSiS->NewGammaConR, &pSiS->NewGammaConG, &pSiS->NewGammaConB); 220472b676d7Smrg GotCon = TRUE; 220572b676d7Smrg } 220672b676d7Smrg if((strptr = (char *)xf86GetOptValString(pSiS->Options, OPTION_NEWSTOREDBRI))) { 220772b676d7Smrg SiS_EvalOneOrThreeFloats2(pScrn, OPTION_NEWSTOREDBRI, newbriopt, strptr, 220872b676d7Smrg &pSiS->NewGammaBriR, &pSiS->NewGammaBriG, &pSiS->NewGammaBriB); 220972b676d7Smrg GotNewBri = TRUE; 221072b676d7Smrg } 221172b676d7Smrg if(!GotCon && !GotNewBri) { 221272b676d7Smrg if((strptr = (char *)xf86GetOptValString(pSiS->Options, OPTION_STOREDBRI))) { 221372b676d7Smrg SiS_EvalOneOrThreeFloats(pScrn, OPTION_STOREDBRI, briopt, strptr, 221472b676d7Smrg &pSiS->GammaBriR, &pSiS->GammaBriG, &pSiS->GammaBriB); 221572b676d7Smrg GotOldBri = TRUE; 221672b676d7Smrg pSiS->SiS_SD3_Flags |= SiS_SD3_OLDGAMMAINUSE; 221772b676d7Smrg } 221872b676d7Smrg } 221972b676d7Smrg 222072b676d7Smrg if((!IsDHM) || (IsDHM && !IsSecondHead)) { 222172b676d7Smrg Bool GotCon2 = FALSE, GotNewBri2 = FALSE; 222272b676d7Smrg if(!GotOldBri) { 222372b676d7Smrg if((strptr = (char *)xf86GetOptValString(pSiS->Options, OPTION_NEWSTOREDCON2))) { 222472b676d7Smrg SiS_EvalOneOrThreeFloats2(pScrn, OPTION_NEWSTOREDCON2, newbriopt, strptr, 222572b676d7Smrg &pSiS->NewGammaConR2, &pSiS->NewGammaConG2, &pSiS->NewGammaConB2); 222672b676d7Smrg GotCon2 = TRUE; 222772b676d7Smrg } 222872b676d7Smrg if((strptr = (char *)xf86GetOptValString(pSiS->Options, OPTION_NEWSTOREDBRI2))) { 222972b676d7Smrg if(SiS_EvalOneOrThreeFloats2(pScrn, OPTION_NEWSTOREDBRI2, newbriopt, strptr, 223072b676d7Smrg &pSiS->NewGammaBriR2, &pSiS->NewGammaBriG2, &pSiS->NewGammaBriB2)) { 223172b676d7Smrg if(IsDHM) { 223272b676d7Smrg#ifdef SISDUALHEAD 223372b676d7Smrg if(GotNewBri) SiS_PrintOverruleDHM(pScrn, OPTION_NEWSTOREDBRI2, OPTION_NEWSTOREDBRI); 223472b676d7Smrg pSiS->NewGammaBriR = pSiS->NewGammaBriR2; 223572b676d7Smrg pSiS->NewGammaBriG = pSiS->NewGammaBriG2; 223672b676d7Smrg pSiS->NewGammaBriB = pSiS->NewGammaBriB2; 223772b676d7Smrg#endif 223872b676d7Smrg } else pSiS->CRT2SepGamma = TRUE; 223972b676d7Smrg } 224072b676d7Smrg GotNewBri2 = TRUE; 224172b676d7Smrg } 224272b676d7Smrg } 224372b676d7Smrg if(!GotCon2 && !GotNewBri2 && !GotNewBri && !GotCon) { 224472b676d7Smrg if((strptr = (char *)xf86GetOptValString(pSiS->Options, OPTION_STOREDBRI2))) { 224572b676d7Smrg pSiS->SiS_SD3_Flags |= SiS_SD3_OLDGAMMAINUSE; 224672b676d7Smrg if(SiS_EvalOneOrThreeFloats(pScrn, OPTION_STOREDBRI2, briopt, strptr, 224772b676d7Smrg &pSiS->GammaBriR2, &pSiS->GammaBriG2, &pSiS->GammaBriB2)) { 224872b676d7Smrg if(IsDHM) { 224972b676d7Smrg#ifdef SISDUALHEAD 225072b676d7Smrg if(GotOldBri) SiS_PrintOverruleDHM(pScrn, OPTION_STOREDBRI2, OPTION_STOREDBRI); 225172b676d7Smrg pSiS->GammaBriR = pSiS->GammaBriR2; 225272b676d7Smrg pSiS->GammaBriG = pSiS->GammaBriG2; 225372b676d7Smrg pSiS->GammaBriB = pSiS->GammaBriB2; 225472b676d7Smrg#endif 225572b676d7Smrg } else pSiS->CRT2SepGamma = TRUE; 225672b676d7Smrg } 225772b676d7Smrg } 225872b676d7Smrg } 225972b676d7Smrg } 226072b676d7Smrg } 226172b676d7Smrg 226272b676d7Smrg if(pSiS->SiS_SD3_Flags & SiS_SD3_CRT1SATGAIN) { 226372b676d7Smrg if(xf86GetOptValInteger(pSiS->Options, OPTION_CRT1SATGAIN, &ival)) { 226472b676d7Smrg if((ival >= 0) && (ival <= 7)) { 226572b676d7Smrg pSiS->siscrt1satgain = ival; 226672b676d7Smrg pSiS->crt1satgaingiven = TRUE; 226772b676d7Smrg } else SiS_PrintIlRange(pScrn, OPTION_CRT1SATGAIN, 0, 7, 0); 226872b676d7Smrg } 226972b676d7Smrg } 227072b676d7Smrg 227172b676d7Smrg} 227272b676d7Smrg 227372b676d7Smrgconst OptionInfoRec * 227472b676d7SmrgSISAvailableOptions(int chipid, int busid) 227572b676d7Smrg{ 227672b676d7Smrg return SISOptions; 227772b676d7Smrg} 2278