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