172b676d7Smrg/* 272b676d7Smrg * SiS driver utility interface & routines 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 * Author: 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#include <X11/X.h> 3872b676d7Smrg#include "dixstruct.h" 3972b676d7Smrg 4072b676d7Smrg#include "sis_videostr.h" 4172b676d7Smrg 4272b676d7Smrg#ifdef TWDEBUG 4372b676d7Smrg#define SIS_NEED_orSISIDXREG 4472b676d7Smrg#include "sis_regs.h" 4572b676d7Smrg#endif 4672b676d7Smrg 4772b676d7Smrg/* Definitions for SISCTRL extension */ 4872b676d7Smrg 4972b676d7Smrg#define SISCTRL_PROTOCOL_NAME "SISCTRL" 5072b676d7Smrg 5172b676d7Smrg#define SISCTRL_MAJOR_VERSION 0 /* current version numbers */ 5272b676d7Smrg#define SISCTRL_MINOR_VERSION 1 5372b676d7Smrg 5472b676d7Smrg#define SISCTRL_MAX_SCREENS 32 /* number of screens the ext can handle */ 5572b676d7Smrg 5672b676d7Smrg#define X_SiSCtrlQueryVersion 0 5772b676d7Smrg#define X_SiSCtrlCommand 1 5872b676d7Smrg 5972b676d7Smrg#define SDC_ID 0x53495321 6072b676d7Smrg 6172b676d7Smrg#define SDC_VERSION 1 6272b676d7Smrg 6372b676d7Smrg#define SDC_NUM_PARM_RESULT 20 6472b676d7Smrg 6572b676d7Smrg/* sdc_command */ 6672b676d7Smrg#define SDC_CMD_GETVERSION 0x98980001 6772b676d7Smrg#define SDC_CMD_GETHWINFO 0x98980002 6872b676d7Smrg#define SDC_CMD_GETALLFLAGS 0x98980003 6972b676d7Smrg#define SDC_CMD_GETVBFLAGSVERSION 0x98980004 7072b676d7Smrg#define SDC_CMD_GETVBFLAGS 0x98980005 7172b676d7Smrg#define SDC_CMD_CHECKMODEFORCRT2 0x98980006 7272b676d7Smrg#define SDC_CMD_SETVBFLAGS 0x98980007 7372b676d7Smrg#define SDC_CMD_GETDETECTEDDEVICES 0x98980008 7472b676d7Smrg#define SDC_CMD_REDETECTCRT2DEVICES 0x98980009 7572b676d7Smrg#define SDC_CMD_GETCRT1STATUS 0x9898000a 7672b676d7Smrg#define SDC_CMD_SETCRT1STATUS 0x9898000b 7772b676d7Smrg#define SDC_CMD_GETSDFLAGS 0x9898000c 7872b676d7Smrg#define SDC_CMD_GETSD2FLAGS 0x9898000d 7972b676d7Smrg#define SDC_CMD_GETLOCKSTATUS 0x9898000e 8072b676d7Smrg#define SDC_CMD_SETLOCKSTATUS 0x9898000f 8172b676d7Smrg#define SDC_CMD_GETTVANTIFLICKER 0x98980010 8272b676d7Smrg#define SDC_CMD_SETTVANTIFLICKER 0x98980011 8372b676d7Smrg#define SDC_CMD_GETTVSATURATION 0x98980012 8472b676d7Smrg#define SDC_CMD_SETTVSATURATION 0x98980013 8572b676d7Smrg#define SDC_CMD_GETTVEDGEENHANCE 0x98980014 8672b676d7Smrg#define SDC_CMD_SETTVEDGEENHANCE 0x98980015 8772b676d7Smrg#define SDC_CMD_GETTVCFILTER 0x98980016 8872b676d7Smrg#define SDC_CMD_SETTVCFILTER 0x98980017 8972b676d7Smrg#define SDC_CMD_GETTVYFILTER 0x98980018 9072b676d7Smrg#define SDC_CMD_SETTVYFILTER 0x98980019 9172b676d7Smrg#define SDC_CMD_GETTVCOLORCALIB 0x9898001a 9272b676d7Smrg#define SDC_CMD_SETTVCOLORCALIB 0x9898001b 9372b676d7Smrg#define SDC_CMD_GETTVCHCONTRAST 0x9898001c 9472b676d7Smrg#define SDC_CMD_SETTVCHCONTRAST 0x9898001d 9572b676d7Smrg#define SDC_CMD_GETTVCHTEXTENHANCE 0x9898001e 9672b676d7Smrg#define SDC_CMD_SETTVCHTEXTENHANCE 0x9898001f 9772b676d7Smrg#define SDC_CMD_GETTVCHCHROMAFLICKERFILTER 0x98980020 9872b676d7Smrg#define SDC_CMD_SETTVCHCHROMAFLICKERFILTER 0x98980021 9972b676d7Smrg#define SDC_CMD_GETTVCHLUMAFLICKERFILTER 0x98980022 10072b676d7Smrg#define SDC_CMD_SETTVCHLUMAFLICKERFILTER 0x98980023 10172b676d7Smrg#define SDC_CMD_GETTVCHCVBSCOLOR 0x98980024 10272b676d7Smrg#define SDC_CMD_SETTVCHCVBSCOLOR 0x98980025 10372b676d7Smrg#define SDC_CMD_GETCHTVOVERSCAN 0x98980026 10472b676d7Smrg#define SDC_CMD_SETCHTVOVERSCAN 0x98980027 10572b676d7Smrg#define SDC_CMD_GETGAMMASTATUS 0x98980028 10672b676d7Smrg#define SDC_CMD_SETGAMMASTATUS 0x98980029 10772b676d7Smrg#define SDC_CMD_GETTVXSCALE 0x9898002a 10872b676d7Smrg#define SDC_CMD_SETTVXSCALE 0x9898002b 10972b676d7Smrg#define SDC_CMD_GETTVYSCALE 0x9898002c 11072b676d7Smrg#define SDC_CMD_SETTVYSCALE 0x9898002d 11172b676d7Smrg#define SDC_CMD_GETSCREENSIZE 0x9898002e 11272b676d7Smrg#define SDC_CMD_GETGAMMABRIGHTNESS 0x9898002f 11372b676d7Smrg#define SDC_CMD_SETGAMMABRIGHTNESS 0x98980030 11472b676d7Smrg#define SDC_CMD_GETGAMMABRIGHTNESS2 0x98980031 11572b676d7Smrg#define SDC_CMD_SETGAMMABRIGHTNESS2 0x98980032 11672b676d7Smrg#define SDC_CMD_GETGETGAMMACRT2 0x98980033 11772b676d7Smrg#define SDC_CMD_SETGETGAMMACRT2 0x98980034 11872b676d7Smrg#define SDC_CMD_GETHWCURSORSTATUS 0x98980035 11972b676d7Smrg#define SDC_CMD_SETHWCURSORSTATUS 0x98980036 12072b676d7Smrg#define SDC_CMD_GETPANELMODE 0x98980037 12172b676d7Smrg#define SDC_CMD_SETPANELMODE 0x98980038 12272b676d7Smrg#define SDC_CMD_GETMERGEDMODEDETAILS 0x98980039 12372b676d7Smrg#define SDC_CMD_GETDEVICENAME 0x9898003a 12472b676d7Smrg#define SDC_CMD_GETMONITORNAME 0x9898003b 12572b676d7Smrg#define SDC_CMD_GETDEVICENAME2 0x9898003c 12672b676d7Smrg#define SDC_CMD_GETMONITORNAME2 0x9898003d 12772b676d7Smrg#define SDC_CMD_SETXVBRIGHTNESS 0x9898003e 12872b676d7Smrg#define SDC_CMD_GETXVBRIGHTNESS 0x9898003f 12972b676d7Smrg#define SDC_CMD_SETXVCONTRAST 0x98980040 13072b676d7Smrg#define SDC_CMD_GETXVCONTRAST 0x98980041 13172b676d7Smrg#define SDC_CMD_SETXVHUE 0x98980042 13272b676d7Smrg#define SDC_CMD_GETXVHUE 0x98980043 13372b676d7Smrg#define SDC_CMD_SETXVSATURATION 0x98980044 13472b676d7Smrg#define SDC_CMD_GETXVSATURATION 0x98980045 13572b676d7Smrg#define SDC_CMD_SETXVGAMMA 0x98980046 13672b676d7Smrg#define SDC_CMD_GETXVGAMMA 0x98980047 13772b676d7Smrg#define SDC_CMD_SETXVCOLORKEY 0x98980048 13872b676d7Smrg#define SDC_CMD_GETXVCOLORKEY 0x98980049 13972b676d7Smrg#define SDC_CMD_SETXVAUTOPAINTCOLORKEY 0x9898004a 14072b676d7Smrg#define SDC_CMD_GETXVAUTOPAINTCOLORKEY 0x9898004b 14172b676d7Smrg#define SDC_CMD_SETXVDEFAULTS 0x9898004c 14272b676d7Smrg#define SDC_CMD_SETXVDISABLEGFX 0x9898004d 14372b676d7Smrg#define SDC_CMD_GETXVDISABLEGFX 0x9898004e 14472b676d7Smrg#define SDC_CMD_SETXVDISABLEGFXLR 0x9898004f 14572b676d7Smrg#define SDC_CMD_GETXVDISABLEGFXLR 0x98980050 14672b676d7Smrg#define SDC_CMD_SETXVSWITCHCRT 0x98980051 14772b676d7Smrg#define SDC_CMD_GETXVSWITCHCRT 0x98980052 14872b676d7Smrg#define SDC_CMD_GETTVXPOS 0x98980053 14972b676d7Smrg#define SDC_CMD_SETTVXPOS 0x98980054 15072b676d7Smrg#define SDC_CMD_GETTVYPOS 0x98980055 15172b676d7Smrg#define SDC_CMD_SETTVYPOS 0x98980056 15272b676d7Smrg#define SDC_CMD_SETXVDEINT 0x98980057 15372b676d7Smrg#define SDC_CMD_GETXVDEINT 0x98980058 15472b676d7Smrg#define SDC_CMD_GETMONGAMMACRT1 0x98980059 15572b676d7Smrg#define SDC_CMD_GETMONGAMMACRT2 0x9898005a 15672b676d7Smrg#define SDC_CMD_LOGQUIET 0x9898005b 15772b676d7Smrg#define SDC_CMD_GETNEWGAMMABRICON 0x9898005c 15872b676d7Smrg#define SDC_CMD_SETNEWGAMMABRICON 0x9898005d 15972b676d7Smrg#define SDC_CMD_GETNEWGAMMABRICON2 0x9898005e 16072b676d7Smrg#define SDC_CMD_SETNEWGAMMABRICON2 0x9898005f 16172b676d7Smrg#define SDC_CMD_GETGETNEWGAMMACRT2 0x98980060 16272b676d7Smrg#define SDC_CMD_SETGETNEWGAMMACRT2 0x98980061 16372b676d7Smrg#define SDC_CMD_NEWSETVBFLAGS 0x98980062 16472b676d7Smrg#define SDC_CMD_GETCRT1SATGAIN 0x98980063 16572b676d7Smrg#define SDC_CMD_SETCRT1SATGAIN 0x98980064 16672b676d7Smrg#define SDC_CMD_GETCRT2SATGAIN 0x98980065 16772b676d7Smrg#define SDC_CMD_SETCRT2SATGAIN 0x98980066 16872b676d7Smrg/* more to come, adapt MAXCOMMAND! */ 16972b676d7Smrg#define SDC_MAXCOMMAND SDC_CMD_SETCRT2SATGAIN 17072b676d7Smrg 17172b676d7Smrg/* in result_header */ 17272b676d7Smrg#define SDC_RESULT_OK 0x66670000 17372b676d7Smrg#define SDC_RESULT_UNDEFCMD 0x66670001 17472b676d7Smrg#define SDC_RESULT_NOPERM 0x66670002 17572b676d7Smrg#define SDC_RESULT_INVAL 0x66670003 17672b676d7Smrg#define SDC_RESULT_MESSAGEERROR 0x66670004 /* Client side only */ 17772b676d7Smrg#define SDC_RESULT_NOEXTENSION 0x66670005 /* Client side only */ 17872b676d7Smrg 17972b676d7Smrg/* For SDC_CMD_GETHWINFO */ 18072b676d7Smrg#define SDC_BUS_TYPE_PCI 0 18172b676d7Smrg#define SDC_BUS_TYPE_AGP 1 18272b676d7Smrg#define SDC_BUS_TYPE_PCIE 2 18372b676d7Smrg#define SDC_BUS_TYPE_USB 3 18472b676d7Smrg 18572b676d7Smrg/* For SDC_CMD_GETMERGEDMODEDETAILS */ 18672b676d7Smrg#define SDC_MMODE_POS_ERROR 0 18772b676d7Smrg#define SDC_MMODE_POS_LEFTOF 1 18872b676d7Smrg#define SDC_MMODE_POS_RIGHTOF 2 18972b676d7Smrg#define SDC_MMODE_POS_ABOVE 3 19072b676d7Smrg#define SDC_MMODE_POS_BELOW 4 19172b676d7Smrg#define SDC_MMODE_POS_CLONE 5 19272b676d7Smrg 19372b676d7Smrgtypedef struct _SiSCtrlQueryVersion { 19472b676d7Smrg CARD8 reqType; /* always SiSCtrlReqCode */ 19572b676d7Smrg CARD8 SiSCtrlReqType; /* always X_SiSCtrlQueryVersion */ 1967edd284eSmrg CARD16 length; 19772b676d7Smrg} xSiSCtrlQueryVersionReq; 19872b676d7Smrg#define sz_xSiSCtrlQueryVersionReq 4 19972b676d7Smrg 20072b676d7Smrgtypedef struct { 20172b676d7Smrg BYTE type; /* X_Reply */ 20272b676d7Smrg BOOL pad1; 2037edd284eSmrg CARD16 sequenceNumber; 2047edd284eSmrg CARD32 length; 2057edd284eSmrg CARD16 majorVersion; /* major version of SISCTRL */ 2067edd284eSmrg CARD16 minorVersion; /* minor version of SISCTRL */ 2077edd284eSmrg CARD32 pad2; 2087edd284eSmrg CARD32 pad3; 2097edd284eSmrg CARD32 pad4; 2107edd284eSmrg CARD32 pad5; 2117edd284eSmrg CARD32 pad6; 21272b676d7Smrg} xSiSCtrlQueryVersionReply; 21372b676d7Smrg#define sz_xSiSCtrlQueryVersionReply 32 21472b676d7Smrg 21572b676d7Smrgtypedef struct { 21672b676d7Smrg CARD8 reqType; /* always SiSCtrlReqCode */ 21772b676d7Smrg CARD8 SiSCtrlReqType; /* always SiSCtrl_SiSCtrlCommand */ 2187edd284eSmrg CARD16 length; 2197edd284eSmrg CARD32 pad1; 22072b676d7Smrg CARD32 screen; 22172b676d7Smrg CARD32 sdc_id; 22272b676d7Smrg CARD32 sdc_chksum; 22372b676d7Smrg CARD32 sdc_command; 22472b676d7Smrg CARD32 sdc_parm[SDC_NUM_PARM_RESULT]; 22572b676d7Smrg CARD32 sdc_result_header; 22672b676d7Smrg CARD32 sdc_result[SDC_NUM_PARM_RESULT]; 22772b676d7Smrg char sdc_buffer[32]; 22872b676d7Smrg} xSiSCtrlCommandReq; 22972b676d7Smrg#define sz_xSiSCtrlCommandReq (28 + (SDC_NUM_PARM_RESULT * 4 * 2) + 32) 23072b676d7Smrg 23172b676d7Smrgtypedef struct { 23272b676d7Smrg BYTE type; /* X_Reply */ 23372b676d7Smrg BOOL pad1; 2347edd284eSmrg CARD16 sequenceNumber; 2357edd284eSmrg CARD32 length; 23672b676d7Smrg CARD32 screen; 23772b676d7Smrg CARD32 sdc_id; 23872b676d7Smrg CARD32 sdc_chksum; 23972b676d7Smrg CARD32 sdc_command; 24072b676d7Smrg CARD32 sdc_parm[SDC_NUM_PARM_RESULT]; 24172b676d7Smrg CARD32 sdc_result_header; 24272b676d7Smrg CARD32 sdc_result[SDC_NUM_PARM_RESULT]; 24372b676d7Smrg char sdc_buffer[32]; 24472b676d7Smrg} xSiSCtrlCommandReply; 24572b676d7Smrg#define sz_xSiSCtrlCommandReply (28 + (SDC_NUM_PARM_RESULT * 4 * 2) + 32) 24672b676d7Smrg 24772b676d7Smrgtypedef struct { 24872b676d7Smrg unsigned int maxscreens; /* Max number of entries = SISCTRL_MAX_SCREENS*/ 24972b676d7Smrg unsigned int version_major; /* Extension major version */ 25072b676d7Smrg unsigned int version_minor; /* Extension minor version */ 25172b676d7Smrg int (*HandleSiSDirectCommand[SISCTRL_MAX_SCREENS])(xSiSCtrlCommandReply *); 25272b676d7Smrg} xSiSCtrlScreenTable; 25372b676d7Smrg 25472b676d7Smrgvoid SiSCtrlExtInit(ScrnInfoPtr pScrn); 25572b676d7Smrgvoid SiSCtrlExtUnregister(SISPtr pSiS, int index); 25672b676d7Smrg 25772b676d7Smrg#ifdef XV_SD_DEPRECATED 25872b676d7Smrgint SISSetPortUtilAttribute(ScrnInfoPtr pScrn, Atom attribute, 25972b676d7Smrg INT32 value, SISPortPrivPtr pPriv); 26072b676d7Smrgint SISGetPortUtilAttribute(ScrnInfoPtr pScrn, Atom attribute, 26172b676d7Smrg INT32 *value, SISPortPrivPtr pPriv); 26272b676d7Smrg#endif 26372b676d7Smrg 26472b676d7Smrgextern Bool SISRedetectCRT2Type(ScrnInfoPtr pScrn); 26572b676d7Smrgextern UShort SiS_CheckModeCRT1(ScrnInfoPtr pScrn, DisplayModePtr mode, 26672b676d7Smrg unsigned int VBFlags, Bool hcm); 26772b676d7Smrgextern UShort SiS_CheckModeCRT2(ScrnInfoPtr pScrn, DisplayModePtr mode, 26872b676d7Smrg unsigned int VBFlags, Bool hcm); 26974c14cd6Smrgextern void SISAdjustFrame(ADJUST_FRAME_ARGS_DECL); 27072b676d7Smrgextern float SiSCalcVRate(DisplayModePtr mode); 27172b676d7Smrgextern void SiS_UpdateGammaCRT2(ScrnInfoPtr pScrn); 27272b676d7Smrg#ifdef SISGAMMARAMP 27372b676d7Smrgextern void SISCalculateGammaRamp(ScreenPtr pScreen, ScrnInfoPtr pScrn); 27472b676d7Smrg#endif 27572b676d7Smrg 27672b676d7Smrgextern void SISSetPortDefaults(ScrnInfoPtr pScrn, SISPortPrivPtr pPriv); 27772b676d7Smrgextern void SISUpdateVideoParms(SISPtr pSiS, SISPortPrivPtr pPriv); 27872b676d7Smrgextern void SiSUpdateXvGamma(SISPtr pSiS, SISPortPrivPtr pPriv); 27972b676d7Smrg 28072b676d7Smrg/*********************************** 28172b676d7Smrg * Low-level routines * 28272b676d7Smrg ***********************************/ 28372b676d7Smrg 28472b676d7Smrgstatic Bool 28572b676d7SmrgSISSwitchCRT1Status(ScrnInfoPtr pScrn, int onoff, Bool quiet) 28672b676d7Smrg{ 28772b676d7Smrg SISPtr pSiS = SISPTR(pScrn); 28872b676d7Smrg DisplayModePtr mode = pScrn->currentMode; 28972b676d7Smrg ULong vbflags = pSiS->VBFlags; 29072b676d7Smrg ULong vbflags3 = pSiS->VBFlags3; 29172b676d7Smrg int crt1off; 29272b676d7Smrg 29372b676d7Smrg /* onoff: 0=OFF, 1=ON(VGA), 2=ON(LCDA) */ 29472b676d7Smrg 29572b676d7Smrg /* Switching to LCDA will disable CRT2 if previously LCD or VGA, 29672b676d7Smrg * unless on a dual-vb setup 29772b676d7Smrg */ 29872b676d7Smrg 29972b676d7Smrg /* For usability reasons, the user should not simply "lose" one 30072b676d7Smrg * of his output devices in MergedFB mode. Therefore, a switch 30172b676d7Smrg * which might lead to this situation will not be performed in 30272b676d7Smrg * MergedFB mode. (For example: If CRT2 is either LCD or VGA, 30372b676d7Smrg * don't let the user switch to LCD-via-CRT1 mode, because he 30472b676d7Smrg * would lose one output device since LCD-via-CRT1 is only 30572b676d7Smrg * supported together with TV, not any other CRT2 type.) 30672b676d7Smrg * In Non-MergedFB mode, losing one output device is not 30772b676d7Smrg * considered that harmful. 30872b676d7Smrg * Update: We let the user switch off a device if currently 30972b676d7Smrg * a "clone" mode is active. Same for switching CRT1 to LCD 31072b676d7Smrg * while CRT2 is LCD or VGA. 31172b676d7Smrg */ 31272b676d7Smrg 31372b676d7Smrg /* Do NOT use this to switch from CRT1_LCDA to CRT2_LCD */ 31472b676d7Smrg 31572b676d7Smrg /* Only on 300 and 315/330/340 series */ 31672b676d7Smrg if(pSiS->VGAEngine != SIS_300_VGA && 31772b676d7Smrg pSiS->VGAEngine != SIS_315_VGA) return FALSE; 31872b676d7Smrg 31972b676d7Smrg /* Off only if at least one CRT2 device is active */ 32072b676d7Smrg if((!onoff) && (!(vbflags & CRT2_ENABLE))) return FALSE; 32172b676d7Smrg 32272b676d7Smrg#ifdef SISDUALHEAD 32372b676d7Smrg if(pSiS->DualHeadMode) return FALSE; 32472b676d7Smrg#endif 32572b676d7Smrg 32672b676d7Smrg /* Can't switch to LCDA if not supported (duh!) */ 32772b676d7Smrg if(!(pSiS->SiS_SD_Flags & SiS_SD_SUPPORTLCDA)) { 32872b676d7Smrg if(onoff == 2) { 32972b676d7Smrg if(!quiet) { 33072b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_ERROR, 33172b676d7Smrg "LCD-via-CRT1 not supported by hardware or no panel detected\n"); 33272b676d7Smrg } 33372b676d7Smrg return FALSE; 33472b676d7Smrg } 33572b676d7Smrg } 33672b676d7Smrg 33772b676d7Smrg#ifdef SISMERGED 33872b676d7Smrg if(pSiS->MergedFB) { 33972b676d7Smrg if(((SiSMergedDisplayModePtr)mode->Private)->CRT2Position != sisClone) { 34072b676d7Smrg if(!onoff) { 34172b676d7Smrg if(!quiet) { 34272b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_ERROR, 34372b676d7Smrg "CRT1 can't be switched off in MergedFB mode unless a clone mode is active\n"); 34472b676d7Smrg } 34572b676d7Smrg return FALSE; 34672b676d7Smrg } else if(onoff == 2) { 34772b676d7Smrg if(!(pSiS->SiS_SD3_Flags & SiS_SD3_SUPPORTDUALDVI)) { 34872b676d7Smrg if(vbflags & (CRT2_LCD|CRT2_VGA)) { 34972b676d7Smrg if(!quiet) { 35072b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_ERROR, 35172b676d7Smrg "CRT1 type can only be VGA while CRT2 is LCD or VGA\n"); 35272b676d7Smrg } 35372b676d7Smrg return FALSE; 35472b676d7Smrg } 35572b676d7Smrg } 35672b676d7Smrg } 35772b676d7Smrg } 35872b676d7Smrg if(mode->Private) { 35972b676d7Smrg mode = ((SiSMergedDisplayModePtr)mode->Private)->CRT1; 36072b676d7Smrg } 36172b676d7Smrg } 36272b676d7Smrg#endif 36372b676d7Smrg 36472b676d7Smrg vbflags &= ~(DISPTYPE_CRT1 | SINGLE_MODE | MIRROR_MODE | CRT1_LCDA); 36572b676d7Smrg vbflags3 &= ~(VB3_CRT1_TV | VB3_CRT1_LCD | VB3_CRT1_VGA); 36672b676d7Smrg crt1off = 1; 36772b676d7Smrg if(onoff > 0) { 36872b676d7Smrg vbflags |= DISPTYPE_CRT1; 36972b676d7Smrg crt1off = 0; 37072b676d7Smrg if(onoff == 2) { 37172b676d7Smrg vbflags |= CRT1_LCDA; 37272b676d7Smrg vbflags3 |= VB3_CRT1_LCD; 37372b676d7Smrg if(!(pSiS->SiS_SD3_Flags & SiS_SD3_SUPPORTDUALDVI)) { 37472b676d7Smrg vbflags &= ~(CRT2_LCD|CRT2_VGA); 37572b676d7Smrg } 37672b676d7Smrg } else { 37772b676d7Smrg vbflags3 |= VB3_CRT1_VGA; 37872b676d7Smrg } 37972b676d7Smrg /* Remember: Dualhead not supported */ 38072b676d7Smrg if(vbflags & CRT2_ENABLE) vbflags |= MIRROR_MODE; 38172b676d7Smrg else vbflags |= SINGLE_MODE; 38272b676d7Smrg } else { 38372b676d7Smrg vbflags |= SINGLE_MODE; 38472b676d7Smrg } 38572b676d7Smrg 38672b676d7Smrg if(vbflags & CRT1_LCDA) { 38772b676d7Smrg if(SiS_CheckModeCRT1(pScrn, mode, vbflags, pSiS->HaveCustomModes) < 0x14) { 38872b676d7Smrg if(!quiet) { 38972b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_ERROR, 39072b676d7Smrg "Current mode not suitable for LCD-via-CRT1\n"); 39172b676d7Smrg } 39272b676d7Smrg return FALSE; 39372b676d7Smrg } 39472b676d7Smrg } 39572b676d7Smrg 39672b676d7Smrg pSiS->CRT1off = crt1off; 39772b676d7Smrg pSiS->VBFlags = pSiS->VBFlags_backup = vbflags; 39872b676d7Smrg pSiS->VBFlags3 = pSiS->VBFlags_backup3 = vbflags3; 39972b676d7Smrg 40072b676d7Smrg /* Sync the accelerators */ 40172b676d7Smrg (*pSiS->SyncAccel)(pScrn); 40272b676d7Smrg 40372b676d7Smrg pSiS->skipswitchcheck = TRUE; 40474c14cd6Smrg if(!(pScrn->SwitchMode(SWITCH_MODE_ARGS(pScrn, pScrn->currentMode)))) { 40572b676d7Smrg pSiS->skipswitchcheck = FALSE; 40672b676d7Smrg return FALSE; 40772b676d7Smrg } 40872b676d7Smrg pSiS->skipswitchcheck = FALSE; 40974c14cd6Smrg SISAdjustFrame(ADJUST_FRAME_ARGS(pScrn, pScrn->frameX0, pScrn->frameY0)); 41072b676d7Smrg return TRUE; 41172b676d7Smrg} 41272b676d7Smrg 41372b676d7Smrgstatic Bool 41472b676d7SmrgSISRedetectCRT2Devices(ScrnInfoPtr pScrn) 41572b676d7Smrg{ 41672b676d7Smrg SISPtr pSiS = SISPTR(pScrn); 41772b676d7Smrg 41872b676d7Smrg if((pSiS->VGAEngine != SIS_300_VGA) && (pSiS->VGAEngine != SIS_315_VGA)) { 41972b676d7Smrg return FALSE; 42072b676d7Smrg } 42172b676d7Smrg 42272b676d7Smrg#ifdef SISDUALHEAD 42372b676d7Smrg if(pSiS->DualHeadMode) return FALSE; 42472b676d7Smrg#endif 42572b676d7Smrg 42672b676d7Smrg /* Sync the accelerators */ 42772b676d7Smrg (*pSiS->SyncAccel)(pScrn); 42872b676d7Smrg 42972b676d7Smrg if(SISRedetectCRT2Type(pScrn)) { 43072b676d7Smrg /* If this returns TRUE, we need to reset the display mode */ 43172b676d7Smrg /* Sync the accelerators */ 43272b676d7Smrg (*pSiS->SyncAccel)(pScrn); 43372b676d7Smrg pSiS->skipswitchcheck = TRUE; 43474c14cd6Smrg if(!(pScrn->SwitchMode(SWITCH_MODE_ARGS(pScrn, pScrn->currentMode)))) { 43572b676d7Smrg pSiS->skipswitchcheck = FALSE; 43672b676d7Smrg return FALSE; 43772b676d7Smrg } 43872b676d7Smrg pSiS->skipswitchcheck = FALSE; 43974c14cd6Smrg SISAdjustFrame(ADJUST_FRAME_ARGS(pScrn, pScrn->frameX0, pScrn->frameY0)); 44072b676d7Smrg } 44172b676d7Smrg return TRUE; 44272b676d7Smrg} 44372b676d7Smrg 44472b676d7Smrgstatic Bool 44572b676d7SmrgSISSwitchCRT2Type(ScrnInfoPtr pScrn, ULong newvbflags, Bool quiet) 44672b676d7Smrg{ 44772b676d7Smrg SISPtr pSiS = SISPTR(pScrn); 44872b676d7Smrg Bool hcm = pSiS->HaveCustomModes; 44972b676d7Smrg DisplayModePtr mode = pScrn->currentMode; 45072b676d7Smrg 45172b676d7Smrg /* Do NOT use this to switch from CRT2_LCD to CRT1_LCDA */ 45272b676d7Smrg 45372b676d7Smrg /* Switching CRT2 to LCD or VGA will switch CRT1 to VGA if 45472b676d7Smrg * previously LCD-via-CRT1 45572b676d7Smrg */ 45672b676d7Smrg 45772b676d7Smrg /* For usability reasons, the user should not simply "lose" one 45872b676d7Smrg * of his output devices in MergedFB mode. Therefore, a switch 45972b676d7Smrg * which might lead to this situation will not be performed in 46072b676d7Smrg * MergedFB mode. (For example: If CRT1 is LCD-via-CRT1, don't 46172b676d7Smrg * let the user switch CRT2 to LCD or VGA mode, because he 46272b676d7Smrg * would lose one output device since LCD-via-CRT1 is only 46372b676d7Smrg * supported together with TV, not any other CRT2 type.) 46472b676d7Smrg * In Non-MergedFB mode, losing one output device is not 46572b676d7Smrg * considered that harmful. 46672b676d7Smrg * Update: We allow this if currently a "clone" display mode 46772b676d7Smrg * is active. 46872b676d7Smrg */ 46972b676d7Smrg 47072b676d7Smrg /* Only on 300 and 315/330/340 series */ 47172b676d7Smrg if(pSiS->VGAEngine != SIS_300_VGA && 47272b676d7Smrg pSiS->VGAEngine != SIS_315_VGA) return FALSE; 47372b676d7Smrg 47472b676d7Smrg /* Only if there is a video bridge */ 47572b676d7Smrg if(!(pSiS->VBFlags2 & VB2_VIDEOBRIDGE)) return FALSE; 47672b676d7Smrg 47772b676d7Smrg#ifdef SISDUALHEAD 47872b676d7Smrg if(pSiS->DualHeadMode) return FALSE; 47972b676d7Smrg#endif 48072b676d7Smrg 48172b676d7Smrg#define SiS_NewVBMask (CRT2_ENABLE|CRT1_LCDA|TV_PAL|TV_NTSC|TV_PALM|TV_PALN|TV_NTSCJ| \ 48272b676d7Smrg TV_AVIDEO|TV_SVIDEO|TV_SCART|TV_HIVISION|TV_YPBPR|TV_YPBPRALL|\ 48372b676d7Smrg TV_YPBPRAR) 48472b676d7Smrg 48572b676d7Smrg newvbflags &= SiS_NewVBMask; 48672b676d7Smrg newvbflags |= pSiS->VBFlags & ~SiS_NewVBMask; 48772b676d7Smrg 48872b676d7Smrg if(!(pSiS->SiS_SD_Flags & SiS_SD_SUPPORTLCDA)) { 48972b676d7Smrg newvbflags &= ~CRT1_LCDA; 49072b676d7Smrg } 49172b676d7Smrg if(!(pSiS->SiS_SD_Flags & SiS_SD_SUPPORTHIVISION)) { 49272b676d7Smrg newvbflags &= ~TV_HIVISION; 49372b676d7Smrg } 49472b676d7Smrg if(!(pSiS->SiS_SD_Flags & SiS_SD_SUPPORTYPBPR)) { 49572b676d7Smrg newvbflags &= ~TV_YPBPR; 49672b676d7Smrg } 49772b676d7Smrg 49872b676d7Smrg#ifdef SISMERGED 49972b676d7Smrg if(pSiS->MergedFB) { 50072b676d7Smrg if((mode->Private) && 50172b676d7Smrg ((SiSMergedDisplayModePtr)mode->Private)->CRT2Position != sisClone) { 50272b676d7Smrg if(!(newvbflags & CRT2_ENABLE)) { 50372b676d7Smrg if(!quiet) { 50472b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_ERROR, 50572b676d7Smrg "CRT2 can't be switched off in MergedFB mode unless a clone mode is active\n"); 50672b676d7Smrg } 50772b676d7Smrg return FALSE; 50872b676d7Smrg } 50972b676d7Smrg if(!(pSiS->SiS_SD3_Flags & SiS_SD3_SUPPORTDUALDVI)) { 51072b676d7Smrg if((newvbflags & (CRT2_LCD|CRT2_VGA)) && (newvbflags & CRT1_LCDA)) { 51172b676d7Smrg if(!quiet) { 51272b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_ERROR, 51372b676d7Smrg "CRT2 type can only be TV while in LCD-via-CRT1 mode\n"); 51472b676d7Smrg } 51572b676d7Smrg return FALSE; 51672b676d7Smrg } 51772b676d7Smrg } 51872b676d7Smrg } 51972b676d7Smrg hcm = pSiS->HaveCustomModes2; 52072b676d7Smrg if(mode->Private) { 52172b676d7Smrg mode = ((SiSMergedDisplayModePtr)mode->Private)->CRT2; 52272b676d7Smrg } 52372b676d7Smrg } 52472b676d7Smrg#endif 52572b676d7Smrg 5267edd284eSmrg if((!(newvbflags & CRT2_ENABLE)) && (!(newvbflags & DISPTYPE_CRT1))) { 52772b676d7Smrg if(!quiet) { 52872b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_ERROR, 52972b676d7Smrg "CRT2 can't be switched off while CRT1 is off\n"); 53072b676d7Smrg } 53172b676d7Smrg return FALSE; 53272b676d7Smrg } 53372b676d7Smrg 53472b676d7Smrg /* CRT2_LCD and CRT2_VGA overrule LCDA (in non-MergedFB mode) */ 53572b676d7Smrg if(!(pSiS->SiS_SD3_Flags & SiS_SD3_SUPPORTDUALDVI)) { 53672b676d7Smrg if(newvbflags & (CRT2_LCD|CRT2_VGA)) { 53772b676d7Smrg newvbflags &= ~CRT1_LCDA; 53872b676d7Smrg } 53972b676d7Smrg } 54072b676d7Smrg 54172b676d7Smrg /* Check if the current mode is suitable for desired output device (if any) */ 54272b676d7Smrg if(SiS_CheckModeCRT2(pScrn, mode, newvbflags, hcm) < 0x14) { 54372b676d7Smrg if(!quiet) { 54472b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_ERROR, 54572b676d7Smrg "Current mode not suitable for desired CRT2 output device\n"); 54672b676d7Smrg } 54772b676d7Smrg return FALSE; 54872b676d7Smrg } 54972b676d7Smrg 55072b676d7Smrg /* Remember: Dualhead not supported */ 55172b676d7Smrg newvbflags &= ~(SINGLE_MODE | MIRROR_MODE); 55272b676d7Smrg if((newvbflags & DISPTYPE_CRT1) && (newvbflags & CRT2_ENABLE)) { 55372b676d7Smrg newvbflags |= MIRROR_MODE; 55472b676d7Smrg } else { 55572b676d7Smrg newvbflags |= SINGLE_MODE; 55672b676d7Smrg } 55772b676d7Smrg 55872b676d7Smrg /* Sync the accelerators */ 55972b676d7Smrg (*pSiS->SyncAccel)(pScrn); 56072b676d7Smrg 56172b676d7Smrg pSiS->VBFlags = pSiS->VBFlags_backup = newvbflags; 56272b676d7Smrg 56372b676d7Smrg pSiS->skipswitchcheck = TRUE; 56474c14cd6Smrg if(!(pScrn->SwitchMode(SWITCH_MODE_ARGS(pScrn, pScrn->currentMode)))) { 56572b676d7Smrg pSiS->skipswitchcheck = FALSE; 56672b676d7Smrg return FALSE; 56772b676d7Smrg } 56872b676d7Smrg pSiS->skipswitchcheck = FALSE; 56974c14cd6Smrg SISAdjustFrame(ADJUST_FRAME_ARGS(pScrn, pScrn->frameX0, pScrn->frameY0)); 57072b676d7Smrg return TRUE; 57172b676d7Smrg} 57272b676d7Smrg 57372b676d7Smrgstatic Bool 57472b676d7SmrgSISSwitchOutputType(ScrnInfoPtr pScrn, ULong newvbflags, ULong newvbflags3, 57572b676d7Smrg ULong newvbflags4, Bool quiet) 57672b676d7Smrg{ 57772b676d7Smrg /* For future use */ 57872b676d7Smrg 57972b676d7Smrg return FALSE; 58072b676d7Smrg} 58172b676d7Smrg 58272b676d7Smrgstatic ULong 58372b676d7SmrgSiSCondToVBFlags(UShort cond, ULong GivenVBFlags) 58472b676d7Smrg{ 58572b676d7Smrg ULong vbflags = GivenVBFlags; 58672b676d7Smrg 58772b676d7Smrg /* No special treatment for NTSC-J here; conditions equal NTSC */ 58872b676d7Smrg if(cond) { 58972b676d7Smrg vbflags &= ~(CRT2_ENABLE | CRT1_LCDA | TV_STANDARD | TV_INTERFACE); 59072b676d7Smrg if((cond & SiS_CF2_TYPEMASK) == SiS_CF2_LCD) { 59172b676d7Smrg vbflags |= CRT2_LCD; 59272b676d7Smrg } else if((cond & SiS_CF2_TYPEMASK) == SiS_CF2_TV) { 59372b676d7Smrg vbflags |= (CRT2_TV | TV_SVIDEO); 59472b676d7Smrg if(cond & SiS_CF2_TVPAL) vbflags |= TV_PAL; 59572b676d7Smrg else if(cond & SiS_CF2_TVPALM) vbflags |= (TV_PAL | TV_PALM); 59672b676d7Smrg else if(cond & SiS_CF2_TVPALN) vbflags |= (TV_PAL | TV_PALN); 59772b676d7Smrg else if(cond & SiS_CF2_TVNTSC) vbflags |= TV_NTSC; 59872b676d7Smrg } else if((cond & SiS_CF2_TYPEMASK) == SiS_CF2_TVSPECIAL) { 59972b676d7Smrg vbflags |= CRT2_TV; 60072b676d7Smrg if((cond & SiS_CF2_TVSPECMASK) == SiS_CF2_TVHIVISION) 60172b676d7Smrg vbflags |= TV_HIVISION; 60272b676d7Smrg else if((cond & SiS_CF2_TVSPECMASK) == SiS_CF2_TVYPBPR525I) 60372b676d7Smrg vbflags |= (TV_YPBPR | TV_YPBPR525I); 60472b676d7Smrg else if((cond & SiS_CF2_TVSPECMASK) == SiS_CF2_TVYPBPR525P) 60572b676d7Smrg vbflags |= (TV_YPBPR | TV_YPBPR525P); 60672b676d7Smrg else if((cond & SiS_CF2_TVSPECMASK) == SiS_CF2_TVYPBPR625I) 60772b676d7Smrg vbflags |= (TV_YPBPR | TV_YPBPR625I); 60872b676d7Smrg else if((cond & SiS_CF2_TVSPECMASK) == SiS_CF2_TVYPBPR625P) 60972b676d7Smrg vbflags |= (TV_YPBPR | TV_YPBPR625P); 61072b676d7Smrg else if((cond & SiS_CF2_TVSPECMASK) == SiS_CF2_TVYPBPR750P) 61172b676d7Smrg vbflags |= (TV_YPBPR | TV_YPBPR750P); 61272b676d7Smrg else if((cond & SiS_CF2_TVSPECMASK) == SiS_CF2_TVYPBPR1080I) 61372b676d7Smrg vbflags |= (TV_YPBPR | TV_YPBPR1080I); 61472b676d7Smrg } else if((cond & SiS_CF2_TYPEMASK) == SiS_CF2_VGA2) { 61572b676d7Smrg vbflags |= CRT2_VGA; 61672b676d7Smrg } else if((cond & SiS_CF2_TYPEMASK) == SiS_CF2_CRT1LCDA) { 61772b676d7Smrg vbflags |= CRT1_LCDA; 61872b676d7Smrg } 61972b676d7Smrg } 62072b676d7Smrg return(vbflags); 62172b676d7Smrg} 62272b676d7Smrg 62372b676d7Smrgstatic int 62472b676d7SmrgSISCheckModeForCRT2Type(ScrnInfoPtr pScrn, DisplayModePtr mode, ULong vbflags, UShort cond, Bool quiet) 62572b676d7Smrg{ 62672b676d7Smrg SISPtr pSiS = SISPTR(pScrn); 62772b676d7Smrg DisplayModePtr mastermode; 62872b676d7Smrg Bool hcm = pSiS->HaveCustomModes; 62972b676d7Smrg int result = 0; 63072b676d7Smrg 63172b676d7Smrg mastermode = mode; 63272b676d7Smrg 63372b676d7Smrg#ifdef SISDUALHEAD 63472b676d7Smrg if((!pSiS->DualHeadMode) || (!pSiS->SecondHead)) { 63572b676d7Smrg#endif 63672b676d7Smrg 63772b676d7Smrg if(vbflags & CRT2_ENABLE) { 63872b676d7Smrg 63972b676d7Smrg#ifdef SISMERGED 64072b676d7Smrg if(pSiS->MergedFB) { 64172b676d7Smrg hcm = pSiS->HaveCustomModes2; 64272b676d7Smrg if(mode->Private) { 64372b676d7Smrg mode = ((SiSMergedDisplayModePtr)mode->Private)->CRT2; 64472b676d7Smrg } 64572b676d7Smrg } 64672b676d7Smrg#endif 64772b676d7Smrg 64872b676d7Smrg /* For RandR */ 64972b676d7Smrg if((mode->HDisplay > pScrn->virtualX) || (mode->VDisplay > pScrn->virtualY)) { 65072b676d7Smrg if(!quiet) { 65172b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_ERROR, 65272b676d7Smrg "Desired mode too large for current screen size\n"); 65372b676d7Smrg } 65472b676d7Smrg result |= 0x02; 65572b676d7Smrg } 65672b676d7Smrg 65772b676d7Smrg /* Check if the desired mode is suitable for current CRT2 output device */ 65872b676d7Smrg if(SiS_CheckModeCRT2(pScrn, mode, vbflags, hcm) < 0x14) { 65972b676d7Smrg if((!cond) && (!quiet)) { 66072b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_ERROR, 66172b676d7Smrg "Desired mode not suitable for current CRT2 output device\n"); 66272b676d7Smrg } 66372b676d7Smrg result |= 0x01; 66472b676d7Smrg } 66572b676d7Smrg 66672b676d7Smrg } 66772b676d7Smrg 66872b676d7Smrg#ifdef SISDUALHEAD 66972b676d7Smrg } 67072b676d7Smrg#endif 67172b676d7Smrg 67272b676d7Smrg mode = mastermode; 67372b676d7Smrg 67472b676d7Smrg#ifdef SISDUALHEAD 67572b676d7Smrg if((!pSiS->DualHeadMode) || (pSiS->SecondHead)) { 67672b676d7Smrg#endif 67772b676d7Smrg 67872b676d7Smrg if(vbflags & CRT1_LCDA) { 67972b676d7Smrg 68072b676d7Smrg#ifdef SISMERGED 68172b676d7Smrg if(pSiS->MergedFB) { 68272b676d7Smrg hcm = pSiS->HaveCustomModes; 68372b676d7Smrg if(mode->Private) { 68472b676d7Smrg mode = ((SiSMergedDisplayModePtr)mode->Private)->CRT1; 68572b676d7Smrg } 68672b676d7Smrg } 68772b676d7Smrg#endif 68872b676d7Smrg 68972b676d7Smrg /* For RandR */ 69072b676d7Smrg if((mode->HDisplay > pScrn->virtualX) || (mode->VDisplay > pScrn->virtualY)) { 69172b676d7Smrg if(!quiet) { 69272b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_ERROR, 69372b676d7Smrg "Desired mode too large for current screen size\n"); 69472b676d7Smrg } 69572b676d7Smrg result |= 0x02; 69672b676d7Smrg } 69772b676d7Smrg 69872b676d7Smrg /* Check if the desired mode is suitable for current CRT1 output device */ 69972b676d7Smrg if(SiS_CheckModeCRT1(pScrn, mode, vbflags, hcm) < 0x14) { 70072b676d7Smrg if((!cond) && (!quiet)) { 70172b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_ERROR, 70272b676d7Smrg "Desired mode not suitable for current CRT1 output device\n"); 70372b676d7Smrg } 70472b676d7Smrg result |= 0x01; 70572b676d7Smrg } 70672b676d7Smrg 70772b676d7Smrg } 70872b676d7Smrg 70972b676d7Smrg#ifdef SISDUALHEAD 71072b676d7Smrg } 71172b676d7Smrg#endif 71272b676d7Smrg 71372b676d7Smrg return result; 71472b676d7Smrg} 71572b676d7Smrg 71672b676d7Smrg#ifdef XV_SD_DEPRECATED 71772b676d7Smrgstatic int 71872b676d7SmrgSISCheckModeIndexForCRT2Type(ScrnInfoPtr pScrn, UShort cond, UShort index, Bool quiet) 71972b676d7Smrg{ 72072b676d7Smrg SISPtr pSiS = SISPTR(pScrn); 72172b676d7Smrg DisplayModePtr mode = pScrn->modes; 72272b676d7Smrg ULong vbflags; 72372b676d7Smrg int i; 72472b676d7Smrg 72572b676d7Smrg /* Not only CRT2, but also LCDA */ 72672b676d7Smrg 72772b676d7Smrg /* returns 0 if mode ok, 72872b676d7Smrg * 0x01 if mode not ok for CRT2 device, 72972b676d7Smrg * 0x02 if mode too large for current root window 73072b676d7Smrg * or combinations thereof 73172b676d7Smrg */ 73272b676d7Smrg 73372b676d7Smrg vbflags = SiSCondToVBFlags(cond, pSiS->VBFlags); 73472b676d7Smrg 73572b676d7Smrg /* Find mode of given index */ 73672b676d7Smrg if(index) { 73772b676d7Smrg for(i = 0; i < index; i++) { 73872b676d7Smrg if(!mode) return 0x03; 73972b676d7Smrg mode = mode->next; 74072b676d7Smrg } 74172b676d7Smrg } 74272b676d7Smrg 74372b676d7Smrg return(SISCheckModeForCRT2Type(pScrn, mode, vbflags, cond, quiet)); 74472b676d7Smrg} 74572b676d7Smrg#endif 74672b676d7Smrg 74772b676d7Smrgstatic DisplayModePtr 74872b676d7SmrgsisFindModeFromTiming(ScrnInfoPtr pScrn, UShort hdisplay, 74972b676d7Smrg UShort vdisplay, UShort htotal, UShort vtotal, 75072b676d7Smrg UShort hsyncstart, UShort hsyncend, UShort vsyncstart, 75172b676d7Smrg UShort vsyncend, int clock) 75272b676d7Smrg{ 75372b676d7Smrg DisplayModePtr mode = pScrn->modes, pmode = pScrn->modes; 75472b676d7Smrg Bool found = FALSE; 75572b676d7Smrg 75672b676d7Smrg do { 75772b676d7Smrg if( (mode->HDisplay == hdisplay) && 75872b676d7Smrg (mode->VDisplay == vdisplay) && 75972b676d7Smrg (mode->HTotal == htotal) && 76072b676d7Smrg (mode->VTotal == vtotal) && 76172b676d7Smrg (mode->HSyncStart == hsyncstart) && 76272b676d7Smrg (mode->VSyncStart == vsyncstart) && 76372b676d7Smrg (mode->HSyncEnd == hsyncend) && 76472b676d7Smrg (mode->VSyncEnd == vsyncend) && 76572b676d7Smrg (mode->Clock == clock) ) { 76672b676d7Smrg found = TRUE; 76772b676d7Smrg break; 76872b676d7Smrg } 76972b676d7Smrg mode = mode->next; 77072b676d7Smrg } while((mode) && (mode != pmode)); 77172b676d7Smrg 77272b676d7Smrg if(found) return mode; 77372b676d7Smrg else return NULL; 77472b676d7Smrg} 77572b676d7Smrg 77672b676d7Smrgstatic int 77772b676d7SmrgSISCheckModeTimingForCRT2Type(ScrnInfoPtr pScrn, UShort cond, UShort hdisplay, 77872b676d7Smrg UShort vdisplay, UShort htotal, UShort vtotal, 77972b676d7Smrg UShort hsyncstart, UShort hsyncend, UShort vsyncstart, 78072b676d7Smrg UShort vsyncend, int clock, Bool quiet) 78172b676d7Smrg{ 78272b676d7Smrg SISPtr pSiS = SISPTR(pScrn); 78372b676d7Smrg DisplayModePtr mode; 78472b676d7Smrg ULong vbflags; 78572b676d7Smrg 78672b676d7Smrg /* Not only CRT2, but also LCDA */ 78772b676d7Smrg 78872b676d7Smrg /* returns 0 if mode ok, 78972b676d7Smrg * 0x01 if mode not ok for CRT2 device, 79072b676d7Smrg * 0x02 if mode too large for current root window 79172b676d7Smrg * or combinations thereof 79272b676d7Smrg */ 79372b676d7Smrg 79472b676d7Smrg vbflags = SiSCondToVBFlags(cond, pSiS->VBFlags); 79572b676d7Smrg 79672b676d7Smrg /* Find mode with given timing */ 79772b676d7Smrg mode = sisFindModeFromTiming(pScrn, hdisplay, vdisplay, htotal, vtotal, 79872b676d7Smrg hsyncstart, hsyncend, vsyncstart, vsyncend, 79972b676d7Smrg clock); 80072b676d7Smrg if(!mode) return 0x03; 80172b676d7Smrg 80272b676d7Smrg return(SISCheckModeForCRT2Type(pScrn, mode, vbflags, cond, quiet)); 80372b676d7Smrg} 80472b676d7Smrg 80572b676d7Smrg#ifdef SISMERGED 80672b676d7Smrgstatic void 80772b676d7SmrgSISGetMergedModeDetails(ScrnInfoPtr pScrn, 80872b676d7Smrg int hd, int vd, int ht, int vt, int hss, int hse, int vss, int vse, int clk, 80972b676d7Smrg unsigned int *pos, unsigned int *crt1x, unsigned int *crt1y, 81072b676d7Smrg unsigned int *crt1clk, unsigned int *crt2x, unsigned int *crt2y, 81172b676d7Smrg unsigned int *crt2clk) 81272b676d7Smrg{ 81372b676d7Smrg SISPtr pSiS = SISPTR(pScrn); 81472b676d7Smrg DisplayModePtr mode, tmode; 81572b676d7Smrg 81672b676d7Smrg if(!pSiS->MergedFB) { 81772b676d7Smrg *pos = SDC_MMODE_POS_ERROR; 81872b676d7Smrg return; 81972b676d7Smrg } 82072b676d7Smrg 82172b676d7Smrg /* Find mode with given timing */ 82272b676d7Smrg mode = sisFindModeFromTiming(pScrn, hd, vd, ht, vt, hss, hse, vss, vse, clk); 82372b676d7Smrg if(!mode) { 82472b676d7Smrg *pos = SDC_MMODE_POS_ERROR; 82572b676d7Smrg return; 82672b676d7Smrg } 82772b676d7Smrg 82872b676d7Smrg switch(((SiSMergedDisplayModePtr)mode->Private)->CRT2Position) { 82972b676d7Smrg case sisLeftOf: *pos = SDC_MMODE_POS_LEFTOF; break; 83072b676d7Smrg case sisRightOf: *pos = SDC_MMODE_POS_RIGHTOF; break; 83172b676d7Smrg case sisAbove: *pos = SDC_MMODE_POS_ABOVE; break; 83272b676d7Smrg case sisBelow: *pos = SDC_MMODE_POS_BELOW; break; 83372b676d7Smrg default: *pos = SDC_MMODE_POS_CLONE; 83472b676d7Smrg } 83572b676d7Smrg 83672b676d7Smrg tmode = ((SiSMergedDisplayModePtr)mode->Private)->CRT1; 83772b676d7Smrg *crt1x = tmode->HDisplay; 83872b676d7Smrg *crt1y = tmode->VDisplay; 83972b676d7Smrg *crt1clk = (unsigned int)SiSCalcVRate(tmode); 84072b676d7Smrg 84172b676d7Smrg tmode = ((SiSMergedDisplayModePtr)mode->Private)->CRT2; 84272b676d7Smrg *crt2x = tmode->HDisplay; 84372b676d7Smrg *crt2y = tmode->VDisplay; 84472b676d7Smrg *crt2clk = (unsigned int)SiSCalcVRate(tmode); 84572b676d7Smrg} 84672b676d7Smrg#endif 84772b676d7Smrg 84872b676d7Smrg/*********************************** 84972b676d7Smrg * SiSCtrl extension interface * 85072b676d7Smrg ***********************************/ 85172b676d7Smrg 85272b676d7Smrgstatic void 8531654201cSmayasisutil_prepare_string(xSiSCtrlCommandReply *sdcbuf, const char *mystring) 85472b676d7Smrg{ 85572b676d7Smrg int slen = 0; 85672b676d7Smrg sdcbuf->sdc_buffer[0] = 0; 85772b676d7Smrg if(mystring) { 85872b676d7Smrg slen = strlen(mystring); 85972b676d7Smrg if(slen > 31) slen = 31; 86072b676d7Smrg strncpy(&sdcbuf->sdc_buffer[0], mystring, slen); 86172b676d7Smrg sdcbuf->sdc_buffer[slen] = 0; 86272b676d7Smrg } 86372b676d7Smrg sdcbuf->sdc_result[0] = slen; 86472b676d7Smrg} 86572b676d7Smrg 86672b676d7Smrgstatic int 86772b676d7SmrgSiSHandleSiSDirectCommand(xSiSCtrlCommandReply *sdcbuf) 86872b676d7Smrg{ 86974c14cd6Smrg ScrnInfoPtr pScrn = xf86ScreenToScrn(screenInfo.screens[sdcbuf->screen]); 87072b676d7Smrg SISPtr pSiS = SISPTR(pScrn); 87172b676d7Smrg#ifdef SISDUALHEAD 87272b676d7Smrg SISEntPtr pSiSEnt = pSiS->entityPrivate; 87372b676d7Smrg#endif 87472b676d7Smrg SISPortPrivPtr pPriv = NULL; 87572b676d7Smrg int i; 87672b676d7Smrg ULong j; 87772b676d7Smrg 87872b676d7Smrg if(sdcbuf->sdc_id != SDC_ID) return BadMatch; 87972b676d7Smrg 88072b676d7Smrg if(pSiS->adaptor) { 88172b676d7Smrg pPriv = GET_PORT_PRIVATE(pScrn); 88272b676d7Smrg } 88372b676d7Smrg 88472b676d7Smrg j = sdcbuf->sdc_command; 88572b676d7Smrg for(i = 0; i < SDC_NUM_PARM_RESULT; i++) { 88672b676d7Smrg j += sdcbuf->sdc_parm[i]; 88772b676d7Smrg } 88872b676d7Smrg 88972b676d7Smrg if(j != sdcbuf->sdc_chksum) return BadMatch; 89072b676d7Smrg 89172b676d7Smrg sdcbuf->sdc_result_header = SDC_RESULT_OK; 89272b676d7Smrg 89372b676d7Smrg switch(sdcbuf->sdc_command) { 89472b676d7Smrg 89572b676d7Smrg case SDC_CMD_GETVERSION: 89672b676d7Smrg sdcbuf->sdc_result[0] = SDC_VERSION; 89772b676d7Smrg sdcbuf->sdc_result[1] = SDC_MAXCOMMAND; 89872b676d7Smrg break; 89972b676d7Smrg 90072b676d7Smrg case SDC_CMD_GETHWINFO: 90172b676d7Smrg { 90272b676d7Smrg UShort romptr = 0; 90372b676d7Smrg char *biosvers = NULL; 90472b676d7Smrg int slen = 0; 90572b676d7Smrg 90672b676d7Smrg if(pSiS->BIOS) { 90772b676d7Smrg romptr = pSiS->BIOS[0x16] | (pSiS->BIOS[0x17] << 8); 90872b676d7Smrg if(romptr < 65530) { 90972b676d7Smrg biosvers = (char *)&pSiS->BIOS[romptr]; 91072b676d7Smrg slen = strlen(biosvers); 91172b676d7Smrg if(slen > 10) slen = 10; 91272b676d7Smrg } 91372b676d7Smrg } 91472b676d7Smrg sdcbuf->sdc_result[0] = pSiS->IsAGPCard ? SDC_BUS_TYPE_AGP : SDC_BUS_TYPE_PCI; 91572b676d7Smrg if(pSiS->IsPCIExpress) sdcbuf->sdc_result[0] = SDC_BUS_TYPE_PCIE; 91672b676d7Smrg sdcbuf->sdc_result[1] = pSiS->PciBus; 91772b676d7Smrg sdcbuf->sdc_result[2] = pSiS->PciDevice; 91872b676d7Smrg sdcbuf->sdc_result[3] = pSiS->PciFunc; 91972b676d7Smrg sdcbuf->sdc_result[4] = pSiS->ROM661New ? 1 : (pSiS->HaveXGIBIOS ? 2 : 0), 92072b676d7Smrg sdcbuf->sdc_result[5] = pSiS->ChipFlags; 92172b676d7Smrg sdcbuf->sdc_result[6] = pSiS->ChipType; 92272b676d7Smrg sdcbuf->sdc_result[7] = pSiS->ChipRev; 92372b676d7Smrg sdcbuf->sdc_result[8] = SISDRIVERVERSIONYEAR; 92472b676d7Smrg sdcbuf->sdc_result[9] = SISDRIVERVERSIONMONTH; 92572b676d7Smrg sdcbuf->sdc_result[10] = SISDRIVERVERSIONDAY; 92672b676d7Smrg sdcbuf->sdc_result[11] = SISDRIVERREVISION; 92772b676d7Smrg sdcbuf->sdc_result[12] = pScrn->videoRam; 92872b676d7Smrg sdcbuf->sdc_result[13] = pSiS->UMAsize; 92972b676d7Smrg sdcbuf->sdc_result[14] = pSiS->LFBsize; 93072b676d7Smrg if(slen) strncpy(&sdcbuf->sdc_buffer[0], biosvers, slen); 93172b676d7Smrg sdcbuf->sdc_buffer[slen] = 0; 93272b676d7Smrg } 93372b676d7Smrg break; 93472b676d7Smrg 93572b676d7Smrg case SDC_CMD_GETALLFLAGS: 93672b676d7Smrg sdcbuf->sdc_result[0] = SIS_VBFlagsVersion; 93772b676d7Smrg sdcbuf->sdc_result[1] = pSiS->VBFlags; 93872b676d7Smrg sdcbuf->sdc_result[2] = pSiS->SiS_SD_Flags; 93972b676d7Smrg sdcbuf->sdc_result[3] = pSiS->SiS_SD2_Flags; 94072b676d7Smrg sdcbuf->sdc_result[4] = pSiS->detectedCRT2Devices; 94172b676d7Smrg sdcbuf->sdc_result[5] = pSiS->VBFlags2; 94272b676d7Smrg sdcbuf->sdc_result[6] = pSiS->SiS_SD3_Flags; 94372b676d7Smrg sdcbuf->sdc_result[7] = pSiS->SiS_SD4_Flags; 94472b676d7Smrg sdcbuf->sdc_result[8] = pSiS->VBFlags3; 94572b676d7Smrg sdcbuf->sdc_result[9] = pSiS->VBFlags4; 94672b676d7Smrg break; 94772b676d7Smrg 94872b676d7Smrg case SDC_CMD_GETVBFLAGSVERSION: 94972b676d7Smrg sdcbuf->sdc_result[0] = SIS_VBFlagsVersion; 95072b676d7Smrg break; 95172b676d7Smrg 95272b676d7Smrg case SDC_CMD_GETVBFLAGS: 95372b676d7Smrg sdcbuf->sdc_result[0] = pSiS->VBFlags; 95472b676d7Smrg sdcbuf->sdc_result[1] = pSiS->VBFlags2; 95572b676d7Smrg sdcbuf->sdc_result[2] = pSiS->VBFlags3; 95672b676d7Smrg sdcbuf->sdc_result[3] = pSiS->VBFlags4; 95772b676d7Smrg break; 95872b676d7Smrg 95972b676d7Smrg case SDC_CMD_CHECKMODEFORCRT2: 96072b676d7Smrg { 96172b676d7Smrg int clk, hd, hss, hse, ht, vd, vss, vse, vt, result; 96272b676d7Smrg ULong flags; 96372b676d7Smrg 96472b676d7Smrg flags = sdcbuf->sdc_parm[0]; 96572b676d7Smrg clk = sdcbuf->sdc_parm[1]; 96672b676d7Smrg hd = sdcbuf->sdc_parm[2]; 96772b676d7Smrg hss = sdcbuf->sdc_parm[3]; 96872b676d7Smrg hse = sdcbuf->sdc_parm[4]; 96972b676d7Smrg ht = sdcbuf->sdc_parm[5]; 97072b676d7Smrg vd = sdcbuf->sdc_parm[6]; 97172b676d7Smrg vss = sdcbuf->sdc_parm[7]; 97272b676d7Smrg vse = sdcbuf->sdc_parm[8]; 97372b676d7Smrg vt = sdcbuf->sdc_parm[9]; 97472b676d7Smrg 97572b676d7Smrg result = SISCheckModeTimingForCRT2Type(pScrn, (UShort)(flags & 0xff), 97672b676d7Smrg hd, vd, ht, vt, hss, hse, vss, vse, clk, pSiS->SCLogQuiet) & 0xff; 97772b676d7Smrg sdcbuf->sdc_result[0] = result; 97872b676d7Smrg } 97972b676d7Smrg break; 98072b676d7Smrg 98172b676d7Smrg case SDC_CMD_SETVBFLAGS: 98272b676d7Smrg#ifdef SISDUALHEAD 98372b676d7Smrg if(!pSiS->DualHeadMode) { 98472b676d7Smrg#endif 98572b676d7Smrg if(pSiS->xv_sisdirectunlocked) { 98672b676d7Smrg SISSwitchCRT2Type(pScrn, (ULong)sdcbuf->sdc_parm[0], pSiS->SCLogQuiet); 98772b676d7Smrg if(pPriv) SISUpdateVideoParms(pSiS, pPriv); 98872b676d7Smrg } else sdcbuf->sdc_result_header = SDC_RESULT_NOPERM; 98972b676d7Smrg#ifdef SISDUALHEAD 99072b676d7Smrg } else sdcbuf->sdc_result_header = SDC_RESULT_NOPERM; 99172b676d7Smrg#endif 99272b676d7Smrg break; 99372b676d7Smrg 99472b676d7Smrg case SDC_CMD_NEWSETVBFLAGS: 99572b676d7Smrg#ifdef SISDUALHEAD 99672b676d7Smrg if(!pSiS->DualHeadMode) { 99772b676d7Smrg#endif 99872b676d7Smrg if(pSiS->xv_sisdirectunlocked) { 99972b676d7Smrg SISSwitchOutputType(pScrn, (ULong)sdcbuf->sdc_parm[0], (ULong)sdcbuf->sdc_parm[1], 100072b676d7Smrg (ULong)sdcbuf->sdc_parm[2], pSiS->SCLogQuiet); 100172b676d7Smrg if(pPriv) SISUpdateVideoParms(pSiS, pPriv); 100272b676d7Smrg } else sdcbuf->sdc_result_header = SDC_RESULT_NOPERM; 100372b676d7Smrg#ifdef SISDUALHEAD 100472b676d7Smrg } else sdcbuf->sdc_result_header = SDC_RESULT_NOPERM; 100572b676d7Smrg#endif 100672b676d7Smrg break; 100772b676d7Smrg 100872b676d7Smrg case SDC_CMD_GETDETECTEDDEVICES: 100972b676d7Smrg sdcbuf->sdc_result[0] = pSiS->detectedCRT2Devices; 101072b676d7Smrg break; 101172b676d7Smrg 101272b676d7Smrg case SDC_CMD_REDETECTCRT2DEVICES: 101372b676d7Smrg#ifdef SISDUALHEAD 101472b676d7Smrg if(!pSiS->DualHeadMode) { 101572b676d7Smrg#endif 101672b676d7Smrg if(pSiS->xv_sisdirectunlocked) { 101772b676d7Smrg SISRedetectCRT2Devices(pScrn); 101872b676d7Smrg } else sdcbuf->sdc_result_header = SDC_RESULT_NOPERM; 101972b676d7Smrg#ifdef SISDUALHEAD 102072b676d7Smrg } else sdcbuf->sdc_result_header = SDC_RESULT_NOPERM; 102172b676d7Smrg#endif 102272b676d7Smrg break; 102372b676d7Smrg 102472b676d7Smrg case SDC_CMD_GETCRT1STATUS: 102572b676d7Smrg sdcbuf->sdc_result[0] = pSiS->CRT1isoff ? 0 : 1; 102672b676d7Smrg break; 102772b676d7Smrg 102872b676d7Smrg case SDC_CMD_SETCRT1STATUS: 102972b676d7Smrg#ifdef SISDUALHEAD 103072b676d7Smrg if(!pSiS->DualHeadMode) { 103172b676d7Smrg#endif 103272b676d7Smrg if(pSiS->xv_sisdirectunlocked) { 103372b676d7Smrg SISSwitchCRT1Status(pScrn, (ULong)sdcbuf->sdc_parm[0], pSiS->SCLogQuiet); 103472b676d7Smrg if(pPriv) SISUpdateVideoParms(pSiS, pPriv); 103572b676d7Smrg } else sdcbuf->sdc_result_header = SDC_RESULT_NOPERM; 103672b676d7Smrg#ifdef SISDUALHEAD 103772b676d7Smrg } else sdcbuf->sdc_result_header = SDC_RESULT_NOPERM; 103872b676d7Smrg#endif 103972b676d7Smrg break; 104072b676d7Smrg 104172b676d7Smrg case SDC_CMD_GETSDFLAGS: 104272b676d7Smrg sdcbuf->sdc_result[0] = pSiS->SiS_SD_Flags; 104372b676d7Smrg break; 104472b676d7Smrg 104572b676d7Smrg case SDC_CMD_GETSD2FLAGS: 104672b676d7Smrg sdcbuf->sdc_result[0] = pSiS->SiS_SD2_Flags; 104772b676d7Smrg break; 104872b676d7Smrg 104972b676d7Smrg case SDC_CMD_GETLOCKSTATUS: 105072b676d7Smrg sdcbuf->sdc_result[0] = pSiS->xv_sisdirectunlocked; 105172b676d7Smrg break; 105272b676d7Smrg 105372b676d7Smrg case SDC_CMD_SETLOCKSTATUS: 105472b676d7Smrg if(pSiS->enablesisctrl) { 105572b676d7Smrg if(sdcbuf->sdc_parm[0] == SIS_DIRECTKEY) { 105672b676d7Smrg pSiS->xv_sisdirectunlocked++; 105772b676d7Smrg } else if(pSiS->xv_sisdirectunlocked) { 105872b676d7Smrg pSiS->xv_sisdirectunlocked--; 105972b676d7Smrg } 106072b676d7Smrg } else { 106172b676d7Smrg pSiS->xv_sisdirectunlocked = 0; 106272b676d7Smrg sdcbuf->sdc_result_header = SDC_RESULT_NOPERM; 106372b676d7Smrg } 106472b676d7Smrg break; 106572b676d7Smrg 106672b676d7Smrg case SDC_CMD_GETTVANTIFLICKER: 106772b676d7Smrg sdcbuf->sdc_result[0] = SiS_GetSISTVantiflicker(pScrn); 106872b676d7Smrg break; 106972b676d7Smrg 107072b676d7Smrg case SDC_CMD_SETTVANTIFLICKER: 107172b676d7Smrg if(pSiS->xv_sisdirectunlocked) { 107272b676d7Smrg SiS_SetSISTVantiflicker(pScrn, (int)sdcbuf->sdc_parm[0]); 107372b676d7Smrg } else sdcbuf->sdc_result_header = SDC_RESULT_NOPERM; 107472b676d7Smrg break; 107572b676d7Smrg 107672b676d7Smrg case SDC_CMD_GETTVSATURATION: 107772b676d7Smrg sdcbuf->sdc_result[0] = SiS_GetSISTVsaturation(pScrn); 107872b676d7Smrg break; 107972b676d7Smrg 108072b676d7Smrg case SDC_CMD_SETTVSATURATION: 108172b676d7Smrg if(pSiS->xv_sisdirectunlocked) { 108272b676d7Smrg SiS_SetSISTVsaturation(pScrn, (int)sdcbuf->sdc_parm[0]); 108372b676d7Smrg } else sdcbuf->sdc_result_header = SDC_RESULT_NOPERM; 108472b676d7Smrg break; 108572b676d7Smrg 108672b676d7Smrg case SDC_CMD_GETTVEDGEENHANCE: 108772b676d7Smrg sdcbuf->sdc_result[0] = SiS_GetSISTVedgeenhance(pScrn);; 108872b676d7Smrg break; 108972b676d7Smrg 109072b676d7Smrg case SDC_CMD_SETTVEDGEENHANCE: 109172b676d7Smrg if(pSiS->xv_sisdirectunlocked) { 109272b676d7Smrg SiS_SetSISTVedgeenhance(pScrn, (int)sdcbuf->sdc_parm[0]); 109372b676d7Smrg } else sdcbuf->sdc_result_header = SDC_RESULT_NOPERM; 109472b676d7Smrg break; 109572b676d7Smrg 109672b676d7Smrg case SDC_CMD_GETTVCFILTER: 109772b676d7Smrg sdcbuf->sdc_result[0] = SiS_GetSISTVcfilter(pScrn); 109872b676d7Smrg break; 109972b676d7Smrg 110072b676d7Smrg case SDC_CMD_SETTVCFILTER: 110172b676d7Smrg if(pSiS->xv_sisdirectunlocked) { 110272b676d7Smrg SiS_SetSISTVcfilter(pScrn, sdcbuf->sdc_parm[0] ? 1 : 0); 110372b676d7Smrg } else sdcbuf->sdc_result_header = SDC_RESULT_NOPERM; 110472b676d7Smrg break; 110572b676d7Smrg 110672b676d7Smrg case SDC_CMD_GETTVYFILTER: 110772b676d7Smrg sdcbuf->sdc_result[0] = SiS_GetSISTVyfilter(pScrn); 110872b676d7Smrg break; 110972b676d7Smrg 111072b676d7Smrg case SDC_CMD_SETTVYFILTER: 111172b676d7Smrg if(pSiS->xv_sisdirectunlocked) { 111272b676d7Smrg SiS_SetSISTVyfilter(pScrn, sdcbuf->sdc_parm[0]); 111372b676d7Smrg } else sdcbuf->sdc_result_header = SDC_RESULT_NOPERM; 111472b676d7Smrg break; 111572b676d7Smrg 111672b676d7Smrg case SDC_CMD_GETTVCOLORCALIB: 111772b676d7Smrg sdcbuf->sdc_result[0] = SiS_GetSISTVcolcalib(pScrn, TRUE) + 32768; 111872b676d7Smrg sdcbuf->sdc_result[1] = SiS_GetSISTVcolcalib(pScrn, FALSE) + 32768; 111972b676d7Smrg break; 112072b676d7Smrg 112172b676d7Smrg case SDC_CMD_SETTVCOLORCALIB: 112272b676d7Smrg if(pSiS->xv_sisdirectunlocked) { 112372b676d7Smrg SiS_SetSISTVcolcalib(pScrn, (int)sdcbuf->sdc_parm[0] - 32768, TRUE); 112472b676d7Smrg SiS_SetSISTVcolcalib(pScrn, (int)sdcbuf->sdc_parm[1] - 32768, FALSE); 112572b676d7Smrg } else sdcbuf->sdc_result_header = SDC_RESULT_NOPERM; 112672b676d7Smrg break; 112772b676d7Smrg 112872b676d7Smrg case SDC_CMD_GETTVCHCONTRAST: 112972b676d7Smrg sdcbuf->sdc_result[0] = SiS_GetCHTVcontrast(pScrn); 113072b676d7Smrg break; 113172b676d7Smrg 113272b676d7Smrg case SDC_CMD_SETTVCHCONTRAST: 113372b676d7Smrg if(pSiS->xv_sisdirectunlocked) { 113472b676d7Smrg SiS_SetCHTVcontrast(pScrn, (int)sdcbuf->sdc_parm[0]); 113572b676d7Smrg } else sdcbuf->sdc_result_header = SDC_RESULT_NOPERM; 113672b676d7Smrg break; 113772b676d7Smrg 113872b676d7Smrg case SDC_CMD_GETTVCHTEXTENHANCE: 113972b676d7Smrg sdcbuf->sdc_result[0] = SiS_GetCHTVtextenhance(pScrn); 114072b676d7Smrg break; 114172b676d7Smrg 114272b676d7Smrg case SDC_CMD_SETTVCHTEXTENHANCE: 114372b676d7Smrg if(pSiS->xv_sisdirectunlocked) { 114472b676d7Smrg SiS_SetCHTVtextenhance(pScrn, (int)sdcbuf->sdc_parm[0]); 114572b676d7Smrg } else sdcbuf->sdc_result_header = SDC_RESULT_NOPERM; 114672b676d7Smrg break; 114772b676d7Smrg 114872b676d7Smrg case SDC_CMD_GETTVCHCHROMAFLICKERFILTER: 114972b676d7Smrg sdcbuf->sdc_result[0] = SiS_GetCHTVchromaflickerfilter(pScrn); 115072b676d7Smrg break; 115172b676d7Smrg 115272b676d7Smrg case SDC_CMD_SETTVCHCHROMAFLICKERFILTER: 115372b676d7Smrg if(pSiS->xv_sisdirectunlocked) { 115472b676d7Smrg SiS_SetCHTVchromaflickerfilter(pScrn, (int)sdcbuf->sdc_parm[0]); 115572b676d7Smrg } else sdcbuf->sdc_result_header = SDC_RESULT_NOPERM; 115672b676d7Smrg break; 115772b676d7Smrg 115872b676d7Smrg case SDC_CMD_GETTVCHLUMAFLICKERFILTER: 115972b676d7Smrg sdcbuf->sdc_result[0] = SiS_GetCHTVlumaflickerfilter(pScrn); 116072b676d7Smrg break; 116172b676d7Smrg 116272b676d7Smrg case SDC_CMD_SETTVCHLUMAFLICKERFILTER: 116372b676d7Smrg if(pSiS->xv_sisdirectunlocked) { 116472b676d7Smrg SiS_SetCHTVlumaflickerfilter(pScrn, (int)sdcbuf->sdc_parm[0]); 116572b676d7Smrg } else sdcbuf->sdc_result_header = SDC_RESULT_NOPERM; 116672b676d7Smrg break; 116772b676d7Smrg 116872b676d7Smrg case SDC_CMD_GETTVCHCVBSCOLOR: 116972b676d7Smrg sdcbuf->sdc_result[0] = SiS_GetCHTVcvbscolor(pScrn); 117072b676d7Smrg break; 117172b676d7Smrg 117272b676d7Smrg case SDC_CMD_SETTVCHCVBSCOLOR: 117372b676d7Smrg if(pSiS->xv_sisdirectunlocked) { 117472b676d7Smrg SiS_SetCHTVcvbscolor(pScrn, sdcbuf->sdc_parm[0] ? 1 : 0); 117572b676d7Smrg } else sdcbuf->sdc_result_header = SDC_RESULT_NOPERM; 117672b676d7Smrg break; 117772b676d7Smrg 117872b676d7Smrg case SDC_CMD_GETCHTVOVERSCAN: 117972b676d7Smrg { /* Changing of CRT2 settings not supported in DHM! */ 118072b676d7Smrg int i = 0; 118172b676d7Smrg if(pSiS->OptTVSOver == 1) i = 3; 118272b676d7Smrg else if(pSiS->UseCHOverScan == 1) i = 2; 118372b676d7Smrg else if(pSiS->UseCHOverScan == 0) i = 1; 118472b676d7Smrg sdcbuf->sdc_result[0] = i; 118572b676d7Smrg } 118672b676d7Smrg break; 118772b676d7Smrg 118872b676d7Smrg case SDC_CMD_SETCHTVOVERSCAN: 118972b676d7Smrg if(pSiS->xv_sisdirectunlocked) { 119072b676d7Smrg pSiS->UseCHOverScan = -1; 119172b676d7Smrg pSiS->OptTVSOver = FALSE; 119272b676d7Smrg if(sdcbuf->sdc_parm[0] == 3) { 119372b676d7Smrg if(pSiS->SiS_SD_Flags & SiS_SD_SUPPORTSOVER) { 119472b676d7Smrg pSiS->OptTVSOver = TRUE; 119572b676d7Smrg } 119672b676d7Smrg pSiS->UseCHOverScan = 1; 119772b676d7Smrg } else if(sdcbuf->sdc_parm[0] == 2) pSiS->UseCHOverScan = 1; 119872b676d7Smrg else if(sdcbuf->sdc_parm[0] == 1) pSiS->UseCHOverScan = 0; 119972b676d7Smrg } else sdcbuf->sdc_result_header = SDC_RESULT_NOPERM; 120072b676d7Smrg break; 120172b676d7Smrg 120272b676d7Smrg case SDC_CMD_GETGAMMASTATUS: 120372b676d7Smrg { 120472b676d7Smrg int i = 0; 120572b676d7Smrg#ifdef SISDUALHEAD 120672b676d7Smrg if(pSiS->DualHeadMode) { 120772b676d7Smrg if(pSiSEnt->CRT1gamma) i |= 0x01; 120872b676d7Smrg if(pSiSEnt->CRT2gamma) i |= 0x02; 120972b676d7Smrg } else { 121072b676d7Smrg#endif 121172b676d7Smrg if(pSiS->CRT1gamma) i |= 0x01; 121272b676d7Smrg if(pSiS->CRT2gamma) i |= 0x02; 121372b676d7Smrg if(pSiS->CRT2SepGamma) i |= 0x08; 121472b676d7Smrg#ifdef SISDUALHEAD 121572b676d7Smrg } 121672b676d7Smrg#endif 121772b676d7Smrg if(pSiS->XvGamma) i |= 0x04; 121872b676d7Smrg sdcbuf->sdc_result[0] = i; 121972b676d7Smrg } 122072b676d7Smrg break; 122172b676d7Smrg 122272b676d7Smrg case SDC_CMD_SETGAMMASTATUS: 122372b676d7Smrg if(pSiS->xv_sisdirectunlocked) { 122472b676d7Smrg int value = sdcbuf->sdc_parm[0]; 122572b676d7Smrg Bool backup = pSiS->XvGamma; 122672b676d7Smrg Bool backup2 = pSiS->CRT2SepGamma; 122772b676d7Smrg pSiS->CRT1gamma = (value & 0x01) ? TRUE : FALSE; 122872b676d7Smrg pSiS->CRT2gamma = (value & 0x02) ? TRUE : FALSE; 122972b676d7Smrg#ifdef SISDUALHEAD 123072b676d7Smrg if(pSiS->DualHeadMode) { 123172b676d7Smrg pSiSEnt->CRT1gamma = pSiS->CRT1gamma; 123272b676d7Smrg pSiSEnt->CRT2gamma = pSiS->CRT2gamma; 123372b676d7Smrg } 123472b676d7Smrg#endif 123572b676d7Smrg if(pSiS->SiS_SD_Flags & SiS_SD_SUPPORTSGRCRT2) { 123672b676d7Smrg pSiS->CRT2SepGamma = (value & 0x08) ? TRUE : FALSE; 123772b676d7Smrg if(pSiS->CRT2SepGamma != backup2) { 123872b676d7Smrg if(pSiS->CRT2SepGamma) { 123972b676d7Smrg SiS_UpdateGammaCRT2(pScrn); 124072b676d7Smrg } 124172b676d7Smrg#ifdef SISGAMMARAMP 124272b676d7Smrg else { 124372b676d7Smrg SISCalculateGammaRamp(pScrn->pScreen, pScrn); 124472b676d7Smrg } 124572b676d7Smrg#endif 124672b676d7Smrg /* ATTN: When disabling CRT2 sep gamma, 124772b676d7Smrg * as long as SISGAMMARAMP is not defined, 124872b676d7Smrg * application needs to reset palette using 124972b676d7Smrg * vidmodextension! (See SiS_SD_CANSETGAMMA) 125072b676d7Smrg * 125172b676d7Smrg * Note: Difference between setting gamma values 125272b676d7Smrg * for CRT1 and CRT2: For CRT1, driver only 125372b676d7Smrg * stores the values, but does nothing with them; 125472b676d7Smrg * App needs to calc gamma ramp itself for CRT1, 125572b676d7Smrg * and set it using the VidModExtention. 125672b676d7Smrg * For CRT2, the driver will IMMEDIATELY recalc 125772b676d7Smrg * the palette. 125872b676d7Smrg */ 125972b676d7Smrg } 126072b676d7Smrg } else pSiS->CRT2SepGamma = FALSE; 126172b676d7Smrg 126272b676d7Smrg pSiS->XvGamma = (value & 0x04) ? TRUE : FALSE; 126372b676d7Smrg if(pSiS->VGAEngine == SIS_315_VGA) { 126472b676d7Smrg if(backup != pSiS->XvGamma) { 126572b676d7Smrg if(pPriv) SiSUpdateXvGamma(pSiS, pPriv); 126672b676d7Smrg } 126772b676d7Smrg } 126872b676d7Smrg } else sdcbuf->sdc_result_header = SDC_RESULT_NOPERM; 126972b676d7Smrg break; 127072b676d7Smrg 127172b676d7Smrg case SDC_CMD_GETTVXSCALE: 127272b676d7Smrg sdcbuf->sdc_result[0] = SiS_GetTVxscale(pScrn) + 32768; 127372b676d7Smrg break; 127472b676d7Smrg 127572b676d7Smrg case SDC_CMD_SETTVXSCALE: 127672b676d7Smrg { 127772b676d7Smrg int value = sdcbuf->sdc_parm[0] - 32768; 127872b676d7Smrg if((value < -16) || (value > 16)) { 127972b676d7Smrg sdcbuf->sdc_result_header = SDC_RESULT_INVAL; 128072b676d7Smrg } else if(pSiS->xv_sisdirectunlocked) { 128172b676d7Smrg SiS_SetTVxscale(pScrn, value); 128272b676d7Smrg } else sdcbuf->sdc_result_header = SDC_RESULT_NOPERM; 128372b676d7Smrg } 128472b676d7Smrg break; 128572b676d7Smrg 128672b676d7Smrg case SDC_CMD_GETTVYSCALE: 128772b676d7Smrg sdcbuf->sdc_result[0] = SiS_GetTVyscale(pScrn) + 32768; 128872b676d7Smrg break; 128972b676d7Smrg 129072b676d7Smrg case SDC_CMD_SETTVYSCALE: 129172b676d7Smrg { 129272b676d7Smrg int value = sdcbuf->sdc_parm[0] - 32768; 129372b676d7Smrg if((value < -4) || (value > 3)) { 129472b676d7Smrg sdcbuf->sdc_result_header = SDC_RESULT_INVAL; 129572b676d7Smrg } else if(pSiS->xv_sisdirectunlocked) { 129672b676d7Smrg SiS_SetTVyscale(pScrn, value); 129772b676d7Smrg } else sdcbuf->sdc_result_header = SDC_RESULT_NOPERM; 129872b676d7Smrg } 129972b676d7Smrg break; 130072b676d7Smrg 130172b676d7Smrg case SDC_CMD_GETSCREENSIZE: 130272b676d7Smrg sdcbuf->sdc_result[0] = (pScrn->virtualX << 16) | pScrn->virtualY; 130372b676d7Smrg break; 130472b676d7Smrg 130572b676d7Smrg case SDC_CMD_GETGAMMABRIGHTNESS: /* xv_BRx, xv_PBx */ 130672b676d7Smrg sdcbuf->sdc_result[0] = pSiS->GammaBriR; 130772b676d7Smrg sdcbuf->sdc_result[1] = pSiS->GammaBriG; 130872b676d7Smrg sdcbuf->sdc_result[2] = pSiS->GammaBriB; 130972b676d7Smrg break; 131072b676d7Smrg 131172b676d7Smrg case SDC_CMD_GETNEWGAMMABRICON: /* no xv pendant */ 131272b676d7Smrg sdcbuf->sdc_result[0] = (CARD32)(((int)(pSiS->NewGammaBriR * 1000.0)) + 1000); 131372b676d7Smrg sdcbuf->sdc_result[1] = (CARD32)(((int)(pSiS->NewGammaBriG * 1000.0)) + 1000); 131472b676d7Smrg sdcbuf->sdc_result[2] = (CARD32)(((int)(pSiS->NewGammaBriB * 1000.0)) + 1000); 131572b676d7Smrg sdcbuf->sdc_result[3] = (CARD32)(((int)(pSiS->NewGammaConR * 1000.0)) + 1000); 131672b676d7Smrg sdcbuf->sdc_result[4] = (CARD32)(((int)(pSiS->NewGammaConG * 1000.0)) + 1000); 131772b676d7Smrg sdcbuf->sdc_result[5] = (CARD32)(((int)(pSiS->NewGammaConB * 1000.0)) + 1000); 131872b676d7Smrg break; 131972b676d7Smrg 132072b676d7Smrg case SDC_CMD_SETGAMMABRIGHTNESS: /* xv_BRx, xv_PBx */ 132172b676d7Smrg if(sdcbuf->sdc_parm[0] < 100 || sdcbuf->sdc_parm[0] > 10000 || 132272b676d7Smrg sdcbuf->sdc_parm[1] < 100 || sdcbuf->sdc_parm[1] > 10000 || 132372b676d7Smrg sdcbuf->sdc_parm[2] < 100 || sdcbuf->sdc_parm[2] > 10000) { 132472b676d7Smrg sdcbuf->sdc_result_header = SDC_RESULT_INVAL; 132572b676d7Smrg } else if(pSiS->xv_sisdirectunlocked) { 132672b676d7Smrg pSiS->GammaBriR = sdcbuf->sdc_parm[0]; 132772b676d7Smrg pSiS->GammaBriG = sdcbuf->sdc_parm[1]; 132872b676d7Smrg pSiS->GammaBriB = sdcbuf->sdc_parm[2]; 132972b676d7Smrg pSiS->NewGammaBriR = pSiS->NewGammaBriG = pSiS->NewGammaBriB = 0.0; 133072b676d7Smrg pSiS->NewGammaConR = pSiS->NewGammaConG = pSiS->NewGammaConB = 0.0; 133172b676d7Smrg pSiS->SiS_SD3_Flags |= SiS_SD3_OLDGAMMAINUSE; 133272b676d7Smrg } else sdcbuf->sdc_result_header = SDC_RESULT_NOPERM; 133372b676d7Smrg break; 133472b676d7Smrg 133572b676d7Smrg case SDC_CMD_SETNEWGAMMABRICON: /* no xv pendant */ 133672b676d7Smrg if(sdcbuf->sdc_parm[0] > 2000 || sdcbuf->sdc_parm[1] > 2000 || 133772b676d7Smrg sdcbuf->sdc_parm[2] > 2000 || sdcbuf->sdc_parm[3] > 2000 || 133872b676d7Smrg sdcbuf->sdc_parm[4] > 2000 || sdcbuf->sdc_parm[5] > 2000) { 133972b676d7Smrg sdcbuf->sdc_result_header = SDC_RESULT_INVAL; 134072b676d7Smrg } else if(pSiS->xv_sisdirectunlocked) { 134172b676d7Smrg pSiS->NewGammaBriR = ((float)((int)sdcbuf->sdc_parm[0] - 1000)) / 1000.0; 134272b676d7Smrg pSiS->NewGammaBriG = ((float)((int)sdcbuf->sdc_parm[1] - 1000)) / 1000.0; 134372b676d7Smrg pSiS->NewGammaBriB = ((float)((int)sdcbuf->sdc_parm[2] - 1000)) / 1000.0; 134472b676d7Smrg pSiS->NewGammaConR = ((float)((int)sdcbuf->sdc_parm[3] - 1000)) / 1000.0; 134572b676d7Smrg pSiS->NewGammaConG = ((float)((int)sdcbuf->sdc_parm[4] - 1000)) / 1000.0; 134672b676d7Smrg pSiS->NewGammaConB = ((float)((int)sdcbuf->sdc_parm[5] - 1000)) / 1000.0; 134772b676d7Smrg pSiS->GammaBriR = pSiS->GammaBriG = pSiS->GammaBriB = 1000; 134872b676d7Smrg pSiS->SiS_SD3_Flags &= ~SiS_SD3_OLDGAMMAINUSE; 134972b676d7Smrg } else sdcbuf->sdc_result_header = SDC_RESULT_NOPERM; 135072b676d7Smrg break; 135172b676d7Smrg 135272b676d7Smrg case SDC_CMD_GETGAMMABRIGHTNESS2: /* xv_BRx2, xv_PBx2 */ 135372b676d7Smrg#ifdef SISDUALHEAD 135472b676d7Smrg if(pSiS->DualHeadMode) { 135572b676d7Smrg sdcbuf->sdc_result[0] = pSiSEnt->GammaBriR; 135672b676d7Smrg sdcbuf->sdc_result[1] = pSiSEnt->GammaBriG; 135772b676d7Smrg sdcbuf->sdc_result[2] = pSiSEnt->GammaBriB; 135872b676d7Smrg break; 135972b676d7Smrg } 136072b676d7Smrg#endif 136172b676d7Smrg sdcbuf->sdc_result[0] = pSiS->GammaBriR; 136272b676d7Smrg sdcbuf->sdc_result[1] = pSiS->GammaBriG; 136372b676d7Smrg sdcbuf->sdc_result[2] = pSiS->GammaBriB; 136472b676d7Smrg break; 136572b676d7Smrg 136672b676d7Smrg case SDC_CMD_GETNEWGAMMABRICON2: /* no xv pendant */ 136772b676d7Smrg#ifdef SISDUALHEAD 136872b676d7Smrg if(pSiS->DualHeadMode) { 136972b676d7Smrg sdcbuf->sdc_result[0] = (CARD32)(((int)(pSiSEnt->NewGammaBriR * 1000.0)) + 1000); 137072b676d7Smrg sdcbuf->sdc_result[1] = (CARD32)(((int)(pSiSEnt->NewGammaBriG * 1000.0)) + 1000); 137172b676d7Smrg sdcbuf->sdc_result[2] = (CARD32)(((int)(pSiSEnt->NewGammaBriB * 1000.0)) + 1000); 137272b676d7Smrg sdcbuf->sdc_result[3] = (CARD32)(((int)(pSiSEnt->NewGammaConR * 1000.0)) + 1000); 137372b676d7Smrg sdcbuf->sdc_result[4] = (CARD32)(((int)(pSiSEnt->NewGammaConG * 1000.0)) + 1000); 137472b676d7Smrg sdcbuf->sdc_result[5] = (CARD32)(((int)(pSiSEnt->NewGammaConB * 1000.0)) + 1000); 137572b676d7Smrg break; 137672b676d7Smrg } 137772b676d7Smrg#endif 137872b676d7Smrg sdcbuf->sdc_result[0] = (CARD32)(((int)(pSiS->NewGammaBriR * 1000.0)) + 1000); 137972b676d7Smrg sdcbuf->sdc_result[1] = (CARD32)(((int)(pSiS->NewGammaBriG * 1000.0)) + 1000); 138072b676d7Smrg sdcbuf->sdc_result[2] = (CARD32)(((int)(pSiS->NewGammaBriB * 1000.0)) + 1000); 138172b676d7Smrg sdcbuf->sdc_result[3] = (CARD32)(((int)(pSiS->NewGammaConR * 1000.0)) + 1000); 138272b676d7Smrg sdcbuf->sdc_result[4] = (CARD32)(((int)(pSiS->NewGammaConG * 1000.0)) + 1000); 138372b676d7Smrg sdcbuf->sdc_result[5] = (CARD32)(((int)(pSiS->NewGammaConB * 1000.0)) + 1000); 138472b676d7Smrg break; 138572b676d7Smrg 138672b676d7Smrg case SDC_CMD_SETGAMMABRIGHTNESS2: /* xv_BRx2, xv_PBx2 */ 138772b676d7Smrg if(sdcbuf->sdc_parm[0] < 100 || sdcbuf->sdc_parm[0] > 10000 || 138872b676d7Smrg sdcbuf->sdc_parm[1] < 100 || sdcbuf->sdc_parm[1] > 10000 || 138972b676d7Smrg sdcbuf->sdc_parm[2] < 100 || sdcbuf->sdc_parm[2] > 10000) { 139072b676d7Smrg sdcbuf->sdc_result_header = SDC_RESULT_INVAL; 139172b676d7Smrg } else if(pSiS->xv_sisdirectunlocked) { 139272b676d7Smrg pSiS->SiS_SD3_Flags |= SiS_SD3_OLDGAMMAINUSE; 139372b676d7Smrg#ifdef SISDUALHEAD 139472b676d7Smrg if(pSiS->DualHeadMode) { 139572b676d7Smrg pSiSEnt->GammaBriR = sdcbuf->sdc_parm[0]; 139672b676d7Smrg pSiSEnt->GammaBriG = sdcbuf->sdc_parm[1]; 139772b676d7Smrg pSiSEnt->GammaBriB = sdcbuf->sdc_parm[2]; 139872b676d7Smrg pSiSEnt->NewGammaBriR = pSiSEnt->NewGammaBriG = pSiSEnt->NewGammaBriB = 0.0; 139972b676d7Smrg pSiSEnt->NewGammaConR = pSiSEnt->NewGammaConG = pSiSEnt->NewGammaConB = 0.0; 140072b676d7Smrg } 140172b676d7Smrg#endif 140272b676d7Smrg } else sdcbuf->sdc_result_header = SDC_RESULT_NOPERM; 140372b676d7Smrg break; 140472b676d7Smrg 140572b676d7Smrg case SDC_CMD_SETNEWGAMMABRICON2: /* no xv pendant */ 140672b676d7Smrg if(sdcbuf->sdc_parm[0] > 2000 || sdcbuf->sdc_parm[1] > 2000 || 140772b676d7Smrg sdcbuf->sdc_parm[2] > 2000 || sdcbuf->sdc_parm[3] > 2000 || 140872b676d7Smrg sdcbuf->sdc_parm[4] > 2000 || sdcbuf->sdc_parm[5] > 2000) { 140972b676d7Smrg sdcbuf->sdc_result_header = SDC_RESULT_INVAL; 141072b676d7Smrg } else if(pSiS->xv_sisdirectunlocked) { 141172b676d7Smrg pSiS->SiS_SD3_Flags &= ~SiS_SD3_OLDGAMMAINUSE; 141272b676d7Smrg#ifdef SISDUALHEAD 141372b676d7Smrg if(pSiS->DualHeadMode) { 141472b676d7Smrg pSiSEnt->NewGammaBriR = ((float)((int)sdcbuf->sdc_parm[0] - 1000)) / 1000.0; 141572b676d7Smrg pSiSEnt->NewGammaBriG = ((float)((int)sdcbuf->sdc_parm[1] - 1000)) / 1000.0; 141672b676d7Smrg pSiSEnt->NewGammaBriB = ((float)((int)sdcbuf->sdc_parm[2] - 1000)) / 1000.0; 141772b676d7Smrg pSiSEnt->NewGammaConR = ((float)((int)sdcbuf->sdc_parm[3] - 1000)) / 1000.0; 141872b676d7Smrg pSiSEnt->NewGammaConG = ((float)((int)sdcbuf->sdc_parm[4] - 1000)) / 1000.0; 141972b676d7Smrg pSiSEnt->NewGammaConB = ((float)((int)sdcbuf->sdc_parm[5] - 1000)) / 1000.0; 142072b676d7Smrg pSiSEnt->GammaBriR = pSiSEnt->GammaBriG = pSiSEnt->GammaBriB = 1000; 142172b676d7Smrg } 142272b676d7Smrg#endif 142372b676d7Smrg } else sdcbuf->sdc_result_header = SDC_RESULT_NOPERM; 142472b676d7Smrg break; 142572b676d7Smrg 142672b676d7Smrg case SDC_CMD_GETGETGAMMACRT2: 142772b676d7Smrg sdcbuf->sdc_result[0] = (ULong)(pSiS->GammaR2 * 1000); 142872b676d7Smrg sdcbuf->sdc_result[1] = (ULong)(pSiS->GammaG2 * 1000); 142972b676d7Smrg sdcbuf->sdc_result[2] = (ULong)(pSiS->GammaB2 * 1000); 143072b676d7Smrg sdcbuf->sdc_result[3] = pSiS->GammaBriR2; 143172b676d7Smrg sdcbuf->sdc_result[4] = pSiS->GammaBriG2; 143272b676d7Smrg sdcbuf->sdc_result[5] = pSiS->GammaBriB2; 143372b676d7Smrg break; 143472b676d7Smrg 143572b676d7Smrg case SDC_CMD_GETGETNEWGAMMACRT2: 143672b676d7Smrg sdcbuf->sdc_result[0] = (ULong)(pSiS->GammaR2 * 1000); 143772b676d7Smrg sdcbuf->sdc_result[1] = (ULong)(pSiS->GammaG2 * 1000); 143872b676d7Smrg sdcbuf->sdc_result[2] = (ULong)(pSiS->GammaB2 * 1000); 143972b676d7Smrg sdcbuf->sdc_result[3] = (CARD32)(((int)(pSiS->NewGammaBriR2 * 1000.0)) + 1000); 144072b676d7Smrg sdcbuf->sdc_result[4] = (CARD32)(((int)(pSiS->NewGammaBriG2 * 1000.0)) + 1000); 144172b676d7Smrg sdcbuf->sdc_result[5] = (CARD32)(((int)(pSiS->NewGammaBriB2 * 1000.0)) + 1000); 144272b676d7Smrg sdcbuf->sdc_result[6] = (CARD32)(((int)(pSiS->NewGammaConR2 * 1000.0)) + 1000); 144372b676d7Smrg sdcbuf->sdc_result[7] = (CARD32)(((int)(pSiS->NewGammaConG2 * 1000.0)) + 1000); 144472b676d7Smrg sdcbuf->sdc_result[8] = (CARD32)(((int)(pSiS->NewGammaConB2 * 1000.0)) + 1000); 144572b676d7Smrg break; 144672b676d7Smrg 144772b676d7Smrg case SDC_CMD_SETGETGAMMACRT2: 144872b676d7Smrg if(sdcbuf->sdc_parm[0] < 100 || sdcbuf->sdc_parm[0] > 10000 || 144972b676d7Smrg sdcbuf->sdc_parm[1] < 100 || sdcbuf->sdc_parm[1] > 10000 || 145072b676d7Smrg sdcbuf->sdc_parm[2] < 100 || sdcbuf->sdc_parm[2] > 10000 || 145172b676d7Smrg sdcbuf->sdc_parm[3] < 100 || sdcbuf->sdc_parm[3] > 10000 || 145272b676d7Smrg sdcbuf->sdc_parm[4] < 100 || sdcbuf->sdc_parm[4] > 10000 || 145372b676d7Smrg sdcbuf->sdc_parm[5] < 100 || sdcbuf->sdc_parm[5] > 10000) { 145472b676d7Smrg sdcbuf->sdc_result_header = SDC_RESULT_INVAL; 145572b676d7Smrg } else if(pSiS->xv_sisdirectunlocked) { 145672b676d7Smrg pSiS->GammaR2 = (float)sdcbuf->sdc_parm[0] / (float)1000; 145772b676d7Smrg pSiS->GammaG2 = (float)sdcbuf->sdc_parm[1] / (float)1000; 145872b676d7Smrg pSiS->GammaB2 = (float)sdcbuf->sdc_parm[2] / (float)1000; 145972b676d7Smrg pSiS->GammaBriR2 = sdcbuf->sdc_parm[3]; 146072b676d7Smrg pSiS->GammaBriG2 = sdcbuf->sdc_parm[4]; 146172b676d7Smrg pSiS->GammaBriB2 = sdcbuf->sdc_parm[5]; 146272b676d7Smrg pSiS->NewGammaBriR2 = pSiS->NewGammaBriG2 = pSiS->NewGammaBriB2 = 0.0; 146372b676d7Smrg pSiS->NewGammaConR2 = pSiS->NewGammaConG2 = pSiS->NewGammaConB2 = 0.0; 146472b676d7Smrg pSiS->SiS_SD3_Flags |= SiS_SD3_OLDGAMMAINUSE; 146572b676d7Smrg SiS_UpdateGammaCRT2(pScrn); 146672b676d7Smrg } else sdcbuf->sdc_result_header = SDC_RESULT_NOPERM; 146772b676d7Smrg break; 146872b676d7Smrg 146972b676d7Smrg case SDC_CMD_SETGETNEWGAMMACRT2: 147072b676d7Smrg if(sdcbuf->sdc_parm[0] < 100 || sdcbuf->sdc_parm[0] > 10000 || 147172b676d7Smrg sdcbuf->sdc_parm[1] < 100 || sdcbuf->sdc_parm[1] > 10000 || 147272b676d7Smrg sdcbuf->sdc_parm[2] < 100 || sdcbuf->sdc_parm[2] > 10000 || 147372b676d7Smrg sdcbuf->sdc_parm[3] > 2000 || sdcbuf->sdc_parm[4] > 2000 || 147472b676d7Smrg sdcbuf->sdc_parm[5] > 2000 || sdcbuf->sdc_parm[6] > 2000 || 147572b676d7Smrg sdcbuf->sdc_parm[7] > 2000 || sdcbuf->sdc_parm[8] > 2000) { 147672b676d7Smrg sdcbuf->sdc_result_header = SDC_RESULT_INVAL; 147772b676d7Smrg } else if(pSiS->xv_sisdirectunlocked) { 147872b676d7Smrg pSiS->GammaR2 = (float)sdcbuf->sdc_parm[0] / (float)1000; 147972b676d7Smrg pSiS->GammaG2 = (float)sdcbuf->sdc_parm[1] / (float)1000; 148072b676d7Smrg pSiS->GammaB2 = (float)sdcbuf->sdc_parm[2] / (float)1000; 148172b676d7Smrg pSiS->NewGammaBriR2 = ((float)((int)sdcbuf->sdc_parm[3] - 1000)) / 1000.0; 148272b676d7Smrg pSiS->NewGammaBriG2 = ((float)((int)sdcbuf->sdc_parm[4] - 1000)) / 1000.0; 148372b676d7Smrg pSiS->NewGammaBriB2 = ((float)((int)sdcbuf->sdc_parm[5] - 1000)) / 1000.0; 148472b676d7Smrg pSiS->NewGammaConR2 = ((float)((int)sdcbuf->sdc_parm[6] - 1000)) / 1000.0; 148572b676d7Smrg pSiS->NewGammaConG2 = ((float)((int)sdcbuf->sdc_parm[7] - 1000)) / 1000.0; 148672b676d7Smrg pSiS->NewGammaConB2 = ((float)((int)sdcbuf->sdc_parm[8] - 1000)) / 1000.0; 148772b676d7Smrg pSiS->GammaBriR2 = pSiS->GammaBriG2 = pSiS->GammaBriB2 = 1000; 148872b676d7Smrg pSiS->SiS_SD3_Flags &= ~SiS_SD3_OLDGAMMAINUSE; 148972b676d7Smrg SiS_UpdateGammaCRT2(pScrn); 149072b676d7Smrg } else sdcbuf->sdc_result_header = SDC_RESULT_NOPERM; 149172b676d7Smrg break; 149272b676d7Smrg 149372b676d7Smrg case SDC_CMD_GETHWCURSORSTATUS: 149472b676d7Smrg sdcbuf->sdc_result[0] = pSiS->HideHWCursor ? 1 : 0; 149572b676d7Smrg break; 149672b676d7Smrg 149772b676d7Smrg case SDC_CMD_SETHWCURSORSTATUS: 149872b676d7Smrg if(pSiS->xv_sisdirectunlocked) { 149972b676d7Smrg Bool VisibleBackup = pSiS->HWCursorIsVisible; 150072b676d7Smrg pSiS->HideHWCursor = sdcbuf->sdc_parm[0] ? TRUE : FALSE; 150172b676d7Smrg if(pSiS->CursorInfoPtr) { 150272b676d7Smrg if(VisibleBackup) { 150372b676d7Smrg if(sdcbuf->sdc_parm[0]) { 150472b676d7Smrg (pSiS->CursorInfoPtr->HideCursor)(pScrn); 150572b676d7Smrg } else { 150672b676d7Smrg (pSiS->CursorInfoPtr->ShowCursor)(pScrn); 150772b676d7Smrg } 150872b676d7Smrg } 150972b676d7Smrg pSiS->HWCursorIsVisible = VisibleBackup; 151072b676d7Smrg } 151172b676d7Smrg } else sdcbuf->sdc_result_header = SDC_RESULT_NOPERM; 151272b676d7Smrg break; 151372b676d7Smrg 151472b676d7Smrg case SDC_CMD_GETPANELMODE: 151572b676d7Smrg { 151672b676d7Smrg int i = 0; 151772b676d7Smrg if(pSiS->SiS_SD_Flags & SiS_SD_SUPPORTSCALE) { 151872b676d7Smrg switch(pSiS->SiS_Pr->UsePanelScaler) { 151972b676d7Smrg case -1: i |= 0x01; break; 152072b676d7Smrg case 1: i |= 0x02; break; 152172b676d7Smrg } 152272b676d7Smrg if(pSiS->SiS_SD_Flags & SiS_SD_SUPPORTCENTER) { 152372b676d7Smrg switch(pSiS->SiS_Pr->CenterScreen) { 152472b676d7Smrg case -1: i |= 0x04; break; 152572b676d7Smrg case 1: i |= 0x08; break; 152672b676d7Smrg } 152772b676d7Smrg } 152872b676d7Smrg } 152972b676d7Smrg sdcbuf->sdc_result[0] = i; 153072b676d7Smrg } 153172b676d7Smrg break; 153272b676d7Smrg 153372b676d7Smrg case SDC_CMD_SETPANELMODE: 153472b676d7Smrg if(pSiS->xv_sisdirectunlocked) { 153572b676d7Smrg int value = sdcbuf->sdc_parm[0]; 153672b676d7Smrg if(pSiS->SiS_SD_Flags & SiS_SD_SUPPORTSCALE) { 153772b676d7Smrg if(value & 0x01) pSiS->SiS_Pr->UsePanelScaler = -1; 153872b676d7Smrg else if(value & 0x02) pSiS->SiS_Pr->UsePanelScaler = 1; 153972b676d7Smrg else pSiS->SiS_Pr->UsePanelScaler = 0; 154072b676d7Smrg if(pSiS->SiS_SD_Flags & SiS_SD_SUPPORTCENTER) { 154172b676d7Smrg if(value & 0x04) pSiS->SiS_Pr->CenterScreen = -1; 154272b676d7Smrg else if(value & 0x08) pSiS->SiS_Pr->CenterScreen = 1; 154372b676d7Smrg else pSiS->SiS_Pr->CenterScreen = 0; 154472b676d7Smrg } 154572b676d7Smrg } 154672b676d7Smrg } else sdcbuf->sdc_result_header = SDC_RESULT_NOPERM; 154772b676d7Smrg break; 154872b676d7Smrg 154972b676d7Smrg case SDC_CMD_GETMERGEDMODEDETAILS: 155072b676d7Smrg#ifdef SISMERGED 155172b676d7Smrg if(pSiS->MergedFB) { 155272b676d7Smrg int clk, hd, hss, hse, ht, vd, vss, vse, vt; 155372b676d7Smrg unsigned int pos, crt1x, crt1y, crt1clk, crt2x, crt2y, crt2clk; 155472b676d7Smrg 155572b676d7Smrg clk = sdcbuf->sdc_parm[0]; 155672b676d7Smrg hd = sdcbuf->sdc_parm[1]; 155772b676d7Smrg hss = sdcbuf->sdc_parm[2]; 155872b676d7Smrg hse = sdcbuf->sdc_parm[3]; 155972b676d7Smrg ht = sdcbuf->sdc_parm[4]; 156072b676d7Smrg vd = sdcbuf->sdc_parm[5]; 156172b676d7Smrg vss = sdcbuf->sdc_parm[6]; 156272b676d7Smrg vse = sdcbuf->sdc_parm[7]; 156372b676d7Smrg vt = sdcbuf->sdc_parm[8]; 156472b676d7Smrg 156572b676d7Smrg SISGetMergedModeDetails(pScrn, 156672b676d7Smrg hd, vd, ht, vt, hss, hse, vss, vse, clk, 156772b676d7Smrg &pos, &crt1x, &crt1y, &crt1clk, &crt2x, &crt2y, &crt2clk); 156872b676d7Smrg 156972b676d7Smrg sdcbuf->sdc_result[0] = pos; 157072b676d7Smrg sdcbuf->sdc_result[1] = crt1x; 157172b676d7Smrg sdcbuf->sdc_result[2] = crt1y; 157272b676d7Smrg sdcbuf->sdc_result[3] = crt1clk; 157372b676d7Smrg sdcbuf->sdc_result[4] = crt2x; 157472b676d7Smrg sdcbuf->sdc_result[5] = crt2y; 157572b676d7Smrg sdcbuf->sdc_result[6] = crt2clk; 157672b676d7Smrg 157772b676d7Smrg switch(pSiS->CRT2Position) { 157872b676d7Smrg case sisLeftOf: sdcbuf->sdc_result[7] = SDC_MMODE_POS_LEFTOF; break; 157972b676d7Smrg case sisRightOf: sdcbuf->sdc_result[7] = SDC_MMODE_POS_RIGHTOF; break; 158072b676d7Smrg case sisAbove: sdcbuf->sdc_result[7] = SDC_MMODE_POS_ABOVE; break; 158172b676d7Smrg case sisBelow: sdcbuf->sdc_result[7] = SDC_MMODE_POS_BELOW; break; 158272b676d7Smrg default: sdcbuf->sdc_result[7] = SDC_MMODE_POS_CLONE; 158372b676d7Smrg } 158472b676d7Smrg 158572b676d7Smrg } else 158672b676d7Smrg#endif 158772b676d7Smrg sdcbuf->sdc_result_header = SDC_RESULT_INVAL; 158872b676d7Smrg break; 158972b676d7Smrg 159072b676d7Smrg case SDC_CMD_GETDEVICENAME: /* In DualHead mode, this returns CRT1 data */ 159172b676d7Smrg { 159272b676d7Smrg SISPtr mypSiS = pSiS; 159372b676d7Smrg sdcbuf->sdc_result[0] = 0; 159472b676d7Smrg#ifdef SISDUALHEAD 159572b676d7Smrg if(pSiS->DualHeadMode) { 159672b676d7Smrg if(pSiSEnt->pScrn_2) mypSiS = SISPTR(pSiSEnt->pScrn_2); 159772b676d7Smrg } 159872b676d7Smrg#endif 159972b676d7Smrg sisutil_prepare_string(sdcbuf, mypSiS->devsectname); 160072b676d7Smrg } 160172b676d7Smrg break; 160272b676d7Smrg 160372b676d7Smrg case SDC_CMD_GETMONITORNAME: /* In DualHead mode, this returns CRT1 data */ 160472b676d7Smrg { 160572b676d7Smrg ScrnInfoPtr mypScrn = pScrn; 160672b676d7Smrg sdcbuf->sdc_result[0] = 0; 160772b676d7Smrg#ifdef SISDUALHEAD 160872b676d7Smrg if(pSiS->DualHeadMode) { 160972b676d7Smrg if(pSiSEnt->pScrn_2) mypScrn = pSiSEnt->pScrn_2; 161072b676d7Smrg } 161172b676d7Smrg#endif 161272b676d7Smrg if(mypScrn->monitor) { 161372b676d7Smrg sisutil_prepare_string(sdcbuf, mypScrn->monitor->id); 161472b676d7Smrg } 161572b676d7Smrg } 161672b676d7Smrg break; 161772b676d7Smrg 161872b676d7Smrg case SDC_CMD_GETDEVICENAME2: /* In DualHead mode, this returns CRT2 data */ 161972b676d7Smrg sdcbuf->sdc_result[0] = 0; 162072b676d7Smrg#ifdef SISDUALHEAD 162172b676d7Smrg if(pSiS->DualHeadMode) { 162272b676d7Smrg if(pSiSEnt->pScrn_1) { 162372b676d7Smrg sisutil_prepare_string(sdcbuf, SISPTR(pSiSEnt->pScrn_1)->devsectname); 162472b676d7Smrg } 162572b676d7Smrg } else 162672b676d7Smrg#endif 162772b676d7Smrg sdcbuf->sdc_result_header = SDC_RESULT_INVAL; 162872b676d7Smrg break; 162972b676d7Smrg 163072b676d7Smrg case SDC_CMD_GETMONITORNAME2: /* In DualHead mode, this returns CRT2 data */ 163172b676d7Smrg sdcbuf->sdc_result[0] = 0; 163272b676d7Smrg#ifdef SISDUALHEAD 163372b676d7Smrg if(pSiS->DualHeadMode) { 163472b676d7Smrg if(pSiSEnt->pScrn_1) { 163572b676d7Smrg if(pSiSEnt->pScrn_1->monitor) { 163672b676d7Smrg sisutil_prepare_string(sdcbuf, pSiSEnt->pScrn_1->monitor->id); 163772b676d7Smrg } 163872b676d7Smrg } 163972b676d7Smrg } else 164072b676d7Smrg#endif 164172b676d7Smrg sdcbuf->sdc_result_header = SDC_RESULT_INVAL; 164272b676d7Smrg break; 164372b676d7Smrg 164472b676d7Smrg case SDC_CMD_SETXVBRIGHTNESS: 164572b676d7Smrg if(pPriv) { 164672b676d7Smrg int val = sdcbuf->sdc_parm[0] - 32768; 164772b676d7Smrg if(val >= -128 && val <= 127) pPriv->brightness = val; 164872b676d7Smrg else sdcbuf->sdc_result_header = SDC_RESULT_INVAL; 164972b676d7Smrg } else sdcbuf->sdc_result_header = SDC_RESULT_INVAL; 165072b676d7Smrg break; 165172b676d7Smrg 165272b676d7Smrg case SDC_CMD_GETXVBRIGHTNESS: 165372b676d7Smrg if(pPriv) { 165472b676d7Smrg sdcbuf->sdc_result[0] = pPriv->brightness + 32768; 165572b676d7Smrg } else sdcbuf->sdc_result_header = SDC_RESULT_INVAL; 165672b676d7Smrg break; 165772b676d7Smrg 165872b676d7Smrg case SDC_CMD_SETXVCONTRAST: 165972b676d7Smrg if(pPriv) { 166072b676d7Smrg int val = sdcbuf->sdc_parm[0] - 32768; 166172b676d7Smrg if(val >= 0 && val <= 7) pPriv->contrast = val; 166272b676d7Smrg else sdcbuf->sdc_result_header = SDC_RESULT_INVAL; 166372b676d7Smrg } else sdcbuf->sdc_result_header = SDC_RESULT_INVAL; 166472b676d7Smrg break; 166572b676d7Smrg 166672b676d7Smrg case SDC_CMD_GETXVCONTRAST: 166772b676d7Smrg if(pPriv) { 166872b676d7Smrg sdcbuf->sdc_result[0] = pPriv->contrast + 32768; 166972b676d7Smrg } else sdcbuf->sdc_result_header = SDC_RESULT_INVAL; 167072b676d7Smrg break; 167172b676d7Smrg 167272b676d7Smrg case SDC_CMD_SETXVHUE: 167372b676d7Smrg if((pPriv) && (pSiS->SiS_SD2_Flags & SiS_SD2_SUPPORTXVHUESAT)) { 167472b676d7Smrg int val = sdcbuf->sdc_parm[0] - 32768; 167572b676d7Smrg if(val >= -8 && val <= 7) pPriv->hue = val; 167672b676d7Smrg else sdcbuf->sdc_result_header = SDC_RESULT_INVAL; 167772b676d7Smrg } else sdcbuf->sdc_result_header = SDC_RESULT_INVAL; 167872b676d7Smrg break; 167972b676d7Smrg 168072b676d7Smrg case SDC_CMD_GETXVHUE: 168172b676d7Smrg if((pPriv) && (pSiS->SiS_SD2_Flags & SiS_SD2_SUPPORTXVHUESAT)) { 168272b676d7Smrg sdcbuf->sdc_result[0] = pPriv->hue + 32768; 168372b676d7Smrg } else sdcbuf->sdc_result_header = SDC_RESULT_INVAL; 168472b676d7Smrg break; 168572b676d7Smrg 168672b676d7Smrg case SDC_CMD_SETXVSATURATION: 168772b676d7Smrg if((pPriv) && (pSiS->SiS_SD2_Flags & SiS_SD2_SUPPORTXVHUESAT)) { 168872b676d7Smrg int val = sdcbuf->sdc_parm[0] - 32768; 168972b676d7Smrg if(val >= -7 && val <= 7) pPriv->saturation = val; 169072b676d7Smrg else sdcbuf->sdc_result_header = SDC_RESULT_INVAL; 169172b676d7Smrg } else sdcbuf->sdc_result_header = SDC_RESULT_INVAL; 169272b676d7Smrg break; 169372b676d7Smrg 169472b676d7Smrg case SDC_CMD_GETXVSATURATION: 169572b676d7Smrg if((pPriv) && (pSiS->SiS_SD2_Flags & SiS_SD2_SUPPORTXVHUESAT)) { 169672b676d7Smrg sdcbuf->sdc_result[0] = pPriv->saturation + 32768; 169772b676d7Smrg } else sdcbuf->sdc_result_header = SDC_RESULT_INVAL; 169872b676d7Smrg break; 169972b676d7Smrg 170072b676d7Smrg case SDC_CMD_SETXVGAMMA: 170172b676d7Smrg if((pPriv) && (pSiS->SiS_SD_Flags & SiS_SD_SUPPORTXVGAMMA1)) { 170272b676d7Smrg if(sdcbuf->sdc_parm[0] < 100 || sdcbuf->sdc_parm[0] > 10000 || 170372b676d7Smrg sdcbuf->sdc_parm[1] < 100 || sdcbuf->sdc_parm[1] > 10000 || 170472b676d7Smrg sdcbuf->sdc_parm[2] < 100 || sdcbuf->sdc_parm[2] > 10000) { 170572b676d7Smrg sdcbuf->sdc_result_header = SDC_RESULT_INVAL; 170672b676d7Smrg } else { 170772b676d7Smrg pSiS->XvGammaRed = sdcbuf->sdc_parm[0]; 170872b676d7Smrg pSiS->XvGammaGreen = sdcbuf->sdc_parm[1]; 170972b676d7Smrg pSiS->XvGammaBlue = sdcbuf->sdc_parm[2]; 171072b676d7Smrg SiSUpdateXvGamma(pSiS, pPriv); 171172b676d7Smrg } 171272b676d7Smrg } else sdcbuf->sdc_result_header = SDC_RESULT_INVAL; 171372b676d7Smrg break; 171472b676d7Smrg 171572b676d7Smrg case SDC_CMD_GETXVGAMMA: 171672b676d7Smrg if((pPriv) && (pSiS->SiS_SD_Flags & SiS_SD_SUPPORTXVGAMMA1)) { 171772b676d7Smrg sdcbuf->sdc_result[0] = pSiS->XvGammaRed; 171872b676d7Smrg sdcbuf->sdc_result[1] = pSiS->XvGammaGreen; 171972b676d7Smrg sdcbuf->sdc_result[2] = pSiS->XvGammaBlue; 172072b676d7Smrg } else sdcbuf->sdc_result_header = SDC_RESULT_INVAL; 172172b676d7Smrg break; 172272b676d7Smrg 172372b676d7Smrg case SDC_CMD_SETXVCOLORKEY: 172472b676d7Smrg if(pPriv) { 172572b676d7Smrg pPriv->colorKey = pSiS->colorKey = sdcbuf->sdc_parm[0]; 172672b676d7Smrg } else sdcbuf->sdc_result_header = SDC_RESULT_INVAL; 172772b676d7Smrg break; 172872b676d7Smrg 172972b676d7Smrg case SDC_CMD_GETXVCOLORKEY: 173072b676d7Smrg if(pPriv) { 173172b676d7Smrg sdcbuf->sdc_result[0] = pPriv->colorKey; 173272b676d7Smrg } else sdcbuf->sdc_result_header = SDC_RESULT_INVAL; 173372b676d7Smrg break; 173472b676d7Smrg 173572b676d7Smrg case SDC_CMD_SETXVAUTOPAINTCOLORKEY: 173672b676d7Smrg if(pPriv) { 173772b676d7Smrg pPriv->autopaintColorKey = sdcbuf->sdc_parm[0] ? 1 : 0; 173872b676d7Smrg } else sdcbuf->sdc_result_header = SDC_RESULT_INVAL; 173972b676d7Smrg break; 174072b676d7Smrg 174172b676d7Smrg case SDC_CMD_GETXVAUTOPAINTCOLORKEY: 174272b676d7Smrg if(pPriv) { 174372b676d7Smrg sdcbuf->sdc_result[0] = pPriv->autopaintColorKey ? 1 : 0; 174472b676d7Smrg } else sdcbuf->sdc_result_header = SDC_RESULT_INVAL; 174572b676d7Smrg break; 174672b676d7Smrg 174772b676d7Smrg case SDC_CMD_SETXVDEFAULTS: 174872b676d7Smrg if(pPriv) { 174972b676d7Smrg SISSetPortDefaults(pScrn, pPriv); 175072b676d7Smrg } else sdcbuf->sdc_result_header = SDC_RESULT_INVAL; 175172b676d7Smrg break; 175272b676d7Smrg 175372b676d7Smrg case SDC_CMD_SETXVDISABLEGFX: 175472b676d7Smrg if(pPriv) { 175572b676d7Smrg pPriv->disablegfx = sdcbuf->sdc_parm[0] ? 1 : 0; 175672b676d7Smrg } else sdcbuf->sdc_result_header = SDC_RESULT_INVAL; 175772b676d7Smrg break; 175872b676d7Smrg 175972b676d7Smrg case SDC_CMD_GETXVDISABLEGFX: 176072b676d7Smrg if(pPriv) { 176172b676d7Smrg sdcbuf->sdc_result[0] = pPriv->disablegfx ? 1 : 0; 176272b676d7Smrg } else sdcbuf->sdc_result_header = SDC_RESULT_INVAL; 176372b676d7Smrg break; 176472b676d7Smrg 176572b676d7Smrg case SDC_CMD_SETXVDISABLEGFXLR: 176672b676d7Smrg if(pPriv) { 176772b676d7Smrg pPriv->disablegfxlr = sdcbuf->sdc_parm[0] ? 1 : 0; 176872b676d7Smrg } else sdcbuf->sdc_result_header = SDC_RESULT_INVAL; 176972b676d7Smrg break; 177072b676d7Smrg 177172b676d7Smrg case SDC_CMD_GETXVDISABLEGFXLR: 177272b676d7Smrg if(pPriv) { 177372b676d7Smrg sdcbuf->sdc_result[0] = pPriv->disablegfxlr ? 1 : 0; 177472b676d7Smrg } else sdcbuf->sdc_result_header = SDC_RESULT_INVAL; 177572b676d7Smrg break; 177672b676d7Smrg 177772b676d7Smrg case SDC_CMD_SETXVSWITCHCRT: 177872b676d7Smrg if((pPriv) && (pSiS->VGAEngine == SIS_315_VGA)) { 177972b676d7Smrg if(pPriv->AllowSwitchCRT) { 178072b676d7Smrg pPriv->crtnum = sdcbuf->sdc_parm[0] ? 1 : 0; 178172b676d7Smrg#ifdef SISDUALHEAD 178272b676d7Smrg if(pPriv->dualHeadMode) pSiSEnt->curxvcrtnum = pPriv->crtnum; 178372b676d7Smrg#endif 178472b676d7Smrg } 178572b676d7Smrg } else sdcbuf->sdc_result_header = SDC_RESULT_INVAL; 178672b676d7Smrg break; 178772b676d7Smrg 178872b676d7Smrg case SDC_CMD_GETXVSWITCHCRT: 178972b676d7Smrg if((pPriv) && (pSiS->VGAEngine == SIS_315_VGA)) { 179072b676d7Smrg#ifdef SISDUALHEAD 179172b676d7Smrg if(pPriv->dualHeadMode) 179272b676d7Smrg sdcbuf->sdc_result[0] = pSiSEnt->curxvcrtnum; 179372b676d7Smrg else 179472b676d7Smrg#endif 179572b676d7Smrg sdcbuf->sdc_result[0] = pPriv->crtnum; 179672b676d7Smrg } else sdcbuf->sdc_result_header = SDC_RESULT_INVAL; 179772b676d7Smrg break; 179872b676d7Smrg 179972b676d7Smrg 180072b676d7Smrg case SDC_CMD_SETTVXPOS: 180172b676d7Smrg { 180272b676d7Smrg int value = sdcbuf->sdc_parm[0] - 32768; 180372b676d7Smrg if((value < -32) || (value > 32)) { 180472b676d7Smrg sdcbuf->sdc_result_header = SDC_RESULT_INVAL; 180572b676d7Smrg } else if(pSiS->xv_sisdirectunlocked) { 180672b676d7Smrg pPriv->tvxpos = value; 180772b676d7Smrg SiS_SetTVxposoffset(pScrn, pPriv->tvxpos); 180872b676d7Smrg pPriv->updatetvxpos = FALSE; 180972b676d7Smrg } else sdcbuf->sdc_result_header = SDC_RESULT_NOPERM; 181072b676d7Smrg } 181172b676d7Smrg break; 181272b676d7Smrg 181372b676d7Smrg case SDC_CMD_GETTVXPOS: 181472b676d7Smrg sdcbuf->sdc_result[0] = SiS_GetTVxposoffset(pScrn) + 32768; 181572b676d7Smrg break; 181672b676d7Smrg 181772b676d7Smrg case SDC_CMD_SETTVYPOS: 181872b676d7Smrg { 181972b676d7Smrg int value = sdcbuf->sdc_parm[0] - 32768; 182072b676d7Smrg if((value < -32) || (value > 32)) { 182172b676d7Smrg sdcbuf->sdc_result_header = SDC_RESULT_INVAL; 182272b676d7Smrg } else if(pSiS->xv_sisdirectunlocked) { 182372b676d7Smrg pPriv->tvypos = value; 182472b676d7Smrg SiS_SetTVyposoffset(pScrn, pPriv->tvypos); 182572b676d7Smrg pPriv->updatetvypos = FALSE; 182672b676d7Smrg } else sdcbuf->sdc_result_header = SDC_RESULT_NOPERM; 182772b676d7Smrg } 182872b676d7Smrg break; 182972b676d7Smrg 183072b676d7Smrg case SDC_CMD_GETTVYPOS: 183172b676d7Smrg sdcbuf->sdc_result[0] = SiS_GetTVyposoffset(pScrn) + 32768; 183272b676d7Smrg break; 183372b676d7Smrg 183472b676d7Smrg case SDC_CMD_SETXVDEINT: 183572b676d7Smrg case SDC_CMD_GETXVDEINT: 183672b676d7Smrg sdcbuf->sdc_result_header = SDC_RESULT_INVAL; 183772b676d7Smrg break; 183872b676d7Smrg 183972b676d7Smrg case SDC_CMD_GETMONGAMMACRT1: 184072b676d7Smrg sdcbuf->sdc_result[0] = pSiS->CRT1MonGamma; 184172b676d7Smrg break; 184272b676d7Smrg 184372b676d7Smrg case SDC_CMD_GETMONGAMMACRT2: 184472b676d7Smrg sdcbuf->sdc_result[0] = pSiS->CRT2MonGamma; 184572b676d7Smrg break; 184672b676d7Smrg 184772b676d7Smrg case SDC_CMD_LOGQUIET: 184872b676d7Smrg pSiS->SCLogQuiet = sdcbuf->sdc_parm[0] ? TRUE : FALSE; 184972b676d7Smrg break; 185072b676d7Smrg 185172b676d7Smrg case SDC_CMD_GETCRT1SATGAIN: 185272b676d7Smrg sdcbuf->sdc_result[0] = SiS_GetSISCRT1SaturationGain(pScrn); 185372b676d7Smrg break; 185472b676d7Smrg 185572b676d7Smrg case SDC_CMD_SETCRT1SATGAIN: 185672b676d7Smrg if(pSiS->xv_sisdirectunlocked) { 185772b676d7Smrg SiS_SetSISCRT1SaturationGain(pScrn, (int)sdcbuf->sdc_parm[0]); 185872b676d7Smrg } else sdcbuf->sdc_result_header = SDC_RESULT_NOPERM; 185972b676d7Smrg break; 186072b676d7Smrg 186172b676d7Smrg default: 186272b676d7Smrg sdcbuf->sdc_result_header = SDC_RESULT_UNDEFCMD; 186372b676d7Smrg } 186472b676d7Smrg 186572b676d7Smrg return Success; 186672b676d7Smrg} 186772b676d7Smrg 186872b676d7Smrg/* Proc */ 186972b676d7Smrg 187072b676d7Smrgstatic int 187172b676d7SmrgSiSProcSiSCtrlQueryVersion(ClientPtr client) 187272b676d7Smrg{ 187372b676d7Smrg xSiSCtrlQueryVersionReply rep; 18747edd284eSmrg#if GET_ABI_MAJOR(ABI_VIDEODRV_VERSION) < 12 187572b676d7Smrg register int n; 18767edd284eSmrg#endif 187772b676d7Smrg 187872b676d7Smrg REQUEST_SIZE_MATCH(xSiSCtrlQueryVersionReq); 187972b676d7Smrg rep.type = X_Reply; 188072b676d7Smrg rep.length = 0; 188172b676d7Smrg rep.sequenceNumber = client->sequence; 188272b676d7Smrg rep.majorVersion = SISCTRL_MAJOR_VERSION; 188372b676d7Smrg rep.minorVersion = SISCTRL_MINOR_VERSION; 188472b676d7Smrg if(client->swapped) { 188574c14cd6Smrg _swaps(&rep.sequenceNumber, n); 188674c14cd6Smrg _swapl(&rep.length, n); 188774c14cd6Smrg _swaps(&rep.majorVersion, n); 188874c14cd6Smrg _swaps(&rep.minorVersion, n); 188972b676d7Smrg } 189072b676d7Smrg WriteToClient(client, sizeof(xSiSCtrlQueryVersionReply), (char *)&rep); 189172b676d7Smrg return (client->noClientException); 189272b676d7Smrg} 189372b676d7Smrg 189472b676d7Smrgstatic int 189572b676d7SmrgSiSProcSiSCtrlCommand(ClientPtr client) 189672b676d7Smrg{ 189772b676d7Smrg REQUEST(xSiSCtrlCommandReq); 189872b676d7Smrg xSiSCtrlCommandReply rep; 189972b676d7Smrg ExtensionEntry *myext; 190072b676d7Smrg xSiSCtrlScreenTable *myctrl; 19017edd284eSmrg#if GET_ABI_MAJOR(ABI_VIDEODRV_VERSION) < 12 190272b676d7Smrg register int n; 19037edd284eSmrg#endif 190472b676d7Smrg int i, ret; 190572b676d7Smrg 190672b676d7Smrg REQUEST_SIZE_MATCH(xSiSCtrlCommandReq); 190772b676d7Smrg 190872b676d7Smrg memcpy(&rep, stuff, sizeof(xSiSCtrlCommandReply)); 190972b676d7Smrg 191072b676d7Smrg /* Get pointer to ExtensionEntry */ 191172b676d7Smrg if(!(myext = CheckExtension(SISCTRL_PROTOCOL_NAME))) return BadMatch; 191272b676d7Smrg 191372b676d7Smrg /* Get pointer to our private */ 191472b676d7Smrg if(!(myctrl = (xSiSCtrlScreenTable *)myext->extPrivate)) return BadMatch; 191572b676d7Smrg 191672b676d7Smrg /* Check if screen index is within out limits */ 191772b676d7Smrg if(rep.screen > myctrl->maxscreens) return BadMatch; 191872b676d7Smrg 191972b676d7Smrg /* Check if this screen has added itself */ 192072b676d7Smrg if(!(myctrl->HandleSiSDirectCommand[rep.screen])) return BadMatch; 192172b676d7Smrg 192272b676d7Smrg /* Finally, execute the command */ 192372b676d7Smrg if((ret = (myctrl->HandleSiSDirectCommand[rep.screen])(&rep)) != Success) 192472b676d7Smrg return ret; 192572b676d7Smrg 192672b676d7Smrg rep.type = X_Reply; 192772b676d7Smrg rep.length = (sizeof(xSiSCtrlCommandReply) - sizeof(xGenericReply)) >> 2; 192872b676d7Smrg rep.sequenceNumber = client->sequence; 192972b676d7Smrg 193072b676d7Smrg if(client->swapped) { 193174c14cd6Smrg _swaps(&rep.sequenceNumber, n); 193274c14cd6Smrg _swapl(&rep.length, n); 193374c14cd6Smrg _swapl(&rep.screen, n); 193474c14cd6Smrg _swapl(&rep.sdc_id, n); 193574c14cd6Smrg _swapl(&rep.sdc_command, n); 193674c14cd6Smrg _swapl(&rep.sdc_result_header, n); 193772b676d7Smrg for(i = 0; i < SDC_NUM_PARM_RESULT; i++) { 193874c14cd6Smrg _swapl(&rep.sdc_parm[i], n); 193974c14cd6Smrg _swapl(&rep.sdc_result[i], n); 194072b676d7Smrg } 194172b676d7Smrg } 194272b676d7Smrg WriteToClient(client, sizeof(xSiSCtrlCommandReply), (char *)&rep); 194372b676d7Smrg return client->noClientException; 194472b676d7Smrg} 194572b676d7Smrg 194672b676d7Smrgstatic int 194772b676d7SmrgSiSProcSiSCtrlDispatch(ClientPtr client) 194872b676d7Smrg{ 194972b676d7Smrg REQUEST(xReq); 195072b676d7Smrg switch(stuff->data) { 195172b676d7Smrg case X_SiSCtrlQueryVersion: 195272b676d7Smrg return SiSProcSiSCtrlQueryVersion(client); 195372b676d7Smrg case X_SiSCtrlCommand: 195472b676d7Smrg return SiSProcSiSCtrlCommand(client); 195572b676d7Smrg } 195672b676d7Smrg return BadRequest; 195772b676d7Smrg} 195872b676d7Smrg 195972b676d7Smrg/* SProc */ 196072b676d7Smrg 196172b676d7Smrgstatic int 196272b676d7SmrgSiSSProcSiSCtrlQueryVersion(ClientPtr client) 196372b676d7Smrg{ 196472b676d7Smrg REQUEST(xSiSCtrlQueryVersionReq); 19657edd284eSmrg#if GET_ABI_MAJOR(ABI_VIDEODRV_VERSION) < 12 196672b676d7Smrg register int n; 19677edd284eSmrg#endif 196874c14cd6Smrg _swaps(&stuff->length, n); 196972b676d7Smrg REQUEST_SIZE_MATCH(xSiSCtrlQueryVersionReq); 197072b676d7Smrg return SiSProcSiSCtrlQueryVersion(client); 197172b676d7Smrg} 197272b676d7Smrg 197372b676d7Smrgstatic int 197472b676d7SmrgSiSSProcSiSCtrlCommand(ClientPtr client) 197572b676d7Smrg{ 197672b676d7Smrg REQUEST(xSiSCtrlCommandReq); 19777edd284eSmrg#if GET_ABI_MAJOR(ABI_VIDEODRV_VERSION) < 12 197872b676d7Smrg register int n; 19797edd284eSmrg#endif 198072b676d7Smrg int i; 198174c14cd6Smrg _swaps(&stuff->length, n); 198274c14cd6Smrg _swapl(&stuff->screen, n); 198374c14cd6Smrg _swapl(&stuff->sdc_id, n); 198474c14cd6Smrg _swapl(&stuff->sdc_command, n); 198574c14cd6Smrg _swapl(&stuff->sdc_result_header, n); 198672b676d7Smrg for(i = 0; i < SDC_NUM_PARM_RESULT; i++) { 198774c14cd6Smrg _swapl(&stuff->sdc_parm[i], n); 198874c14cd6Smrg _swapl(&stuff->sdc_result[i], n); 198972b676d7Smrg } 199072b676d7Smrg REQUEST_SIZE_MATCH(xSiSCtrlCommandReq); 199172b676d7Smrg return SiSProcSiSCtrlCommand(client); 199272b676d7Smrg} 199372b676d7Smrg 199472b676d7Smrgstatic int 199572b676d7SmrgSiSSProcSiSCtrlDispatch(ClientPtr client) 199672b676d7Smrg{ 199772b676d7Smrg REQUEST(xReq); 199872b676d7Smrg switch(stuff->data) { 199972b676d7Smrg case X_SiSCtrlQueryVersion: 200072b676d7Smrg return SiSSProcSiSCtrlQueryVersion(client); 200172b676d7Smrg case X_SiSCtrlCommand: 200272b676d7Smrg return SiSSProcSiSCtrlCommand(client); 200372b676d7Smrg } 200472b676d7Smrg return BadRequest; 200572b676d7Smrg} 200672b676d7Smrg 200772b676d7Smrgstatic void 200872b676d7SmrgSiSCtrlResetProc(ExtensionEntry* extEntry) 200972b676d7Smrg{ 201072b676d7Smrg /* Called by CloseDownExtensions() */ 201172b676d7Smrg /* (CloseDownExtensions() is called BEFORE CloseScreen, 201272b676d7Smrg * which is why we must not use pSiS->SiSCtrlExtEntry 201372b676d7Smrg * in SiSCtrlExtUnregister()) 201472b676d7Smrg */ 201572b676d7Smrg if(extEntry->extPrivate) { 201674c14cd6Smrg free(extEntry->extPrivate); 201772b676d7Smrg extEntry->extPrivate = NULL; 201872b676d7Smrg } 201972b676d7Smrg} 202072b676d7Smrg 202172b676d7Smrgvoid 202272b676d7SmrgSiSCtrlExtInit(ScrnInfoPtr pScrn) 202372b676d7Smrg{ 202472b676d7Smrg SISPtr pSiS = SISPTR(pScrn); 202572b676d7Smrg ExtensionEntry *myext; 202672b676d7Smrg xSiSCtrlScreenTable *myctrl; 202772b676d7Smrg unsigned int version, revision; 202872b676d7Smrg 202972b676d7Smrg if((pSiS->VGAEngine != SIS_300_VGA) && 203072b676d7Smrg (pSiS->VGAEngine != SIS_315_VGA)) 203172b676d7Smrg return; 203272b676d7Smrg 203372b676d7Smrg pSiS->SCLogQuiet = FALSE; 203472b676d7Smrg 203572b676d7Smrg if(!(myext = CheckExtension(SISCTRL_PROTOCOL_NAME))) { 203672b676d7Smrg 203774c14cd6Smrg if(!(myctrl = calloc(sizeof(xSiSCtrlScreenTable), 1))) 203872b676d7Smrg return; 203972b676d7Smrg 204072b676d7Smrg if(!(myext = AddExtension(SISCTRL_PROTOCOL_NAME, 0, 0, 204172b676d7Smrg SiSProcSiSCtrlDispatch, 204272b676d7Smrg SiSSProcSiSCtrlDispatch, 204372b676d7Smrg SiSCtrlResetProc, 204472b676d7Smrg StandardMinorOpcode))) { 204572b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_ERROR, 204672b676d7Smrg "Failed to add SISCTRL extension\n"); 204774c14cd6Smrg free(myctrl); 204872b676d7Smrg return; 204972b676d7Smrg } 205072b676d7Smrg 205172b676d7Smrg myext->extPrivate = (pointer)myctrl; 205272b676d7Smrg 205372b676d7Smrg myctrl->maxscreens = SISCTRL_MAX_SCREENS; 205472b676d7Smrg myctrl->version_major = version = SISCTRL_MAJOR_VERSION; 205572b676d7Smrg myctrl->version_minor = revision = SISCTRL_MINOR_VERSION; 205672b676d7Smrg 205772b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, 205872b676d7Smrg "Initialized SISCTRL extension version %d.%d\n", 205972b676d7Smrg version, revision); 206072b676d7Smrg 206172b676d7Smrg } else { 206272b676d7Smrg 206372b676d7Smrg if(!(myctrl = (xSiSCtrlScreenTable *)myext->extPrivate)) { 206472b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_ERROR, 206572b676d7Smrg "Internal error: Found SISCTRL extension with NULL-private!\n"); 206672b676d7Smrg return; 206772b676d7Smrg } 206872b676d7Smrg 206972b676d7Smrg version = myctrl->version_major; 207072b676d7Smrg revision = myctrl->version_minor; 207172b676d7Smrg } 207272b676d7Smrg 207372b676d7Smrg if(pScrn->scrnIndex < myctrl->maxscreens) { 207472b676d7Smrg 207572b676d7Smrg myctrl->HandleSiSDirectCommand[pScrn->scrnIndex] = SiSHandleSiSDirectCommand; 207672b676d7Smrg 207772b676d7Smrg pSiS->SiSCtrlExtEntry = myext; 207872b676d7Smrg 207972b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, 208072b676d7Smrg "Registered screen %d with SISCTRL extension version %d.%d\n", 208172b676d7Smrg pScrn->scrnIndex, version, revision); 208272b676d7Smrg } else { 208372b676d7Smrg 208472b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, 208572b676d7Smrg "Screen number (%d) too high for SISCTRL extension %d.%d\n", 208672b676d7Smrg pScrn->scrnIndex, version, revision); 208772b676d7Smrg 208872b676d7Smrg } 208972b676d7Smrg 209072b676d7Smrg} 209172b676d7Smrg 209272b676d7Smrgvoid 209372b676d7SmrgSiSCtrlExtUnregister(SISPtr pSiS, int index) 209472b676d7Smrg{ 209572b676d7Smrg ExtensionEntry *myext; 209672b676d7Smrg xSiSCtrlScreenTable *myctrl; 209772b676d7Smrg 209872b676d7Smrg if(!pSiS->SiSCtrlExtEntry) return; 209972b676d7Smrg 210072b676d7Smrg /* Since CloseDownExtensions() is called before 210172b676d7Smrg * our CloseScreen(), we must not use the saved 210272b676d7Smrg * ptr here, but instead check for the extension. 210372b676d7Smrg */ 210472b676d7Smrg 210572b676d7Smrg if((myext = CheckExtension(SISCTRL_PROTOCOL_NAME))) { 210672b676d7Smrg if((myctrl = (xSiSCtrlScreenTable *)myext->extPrivate)) { 210772b676d7Smrg myctrl->HandleSiSDirectCommand[index] = NULL; 210872b676d7Smrg } 210972b676d7Smrg } 211072b676d7Smrg} 211172b676d7Smrg 211272b676d7Smrg/*********************************** 211372b676d7Smrg * Xv attribute interface * 211472b676d7Smrg ***********************************/ 211572b676d7Smrg 211672b676d7Smrg#ifdef XV_SD_DEPRECATED 211772b676d7Smrg 211872b676d7Smrgint 211972b676d7SmrgSISSetPortUtilAttribute(ScrnInfoPtr pScrn, Atom attribute, 212072b676d7Smrg INT32 value, SISPortPrivPtr pPriv) 212172b676d7Smrg{ 212272b676d7Smrg SISPtr pSiS = SISPTR(pScrn); 212372b676d7Smrg#ifdef SISDUALHEAD 212472b676d7Smrg SISEntPtr pSiSEnt = pSiS->entityPrivate;; 212572b676d7Smrg#endif 212672b676d7Smrg 212772b676d7Smrg if(attribute == pSiS->xv_USD) { 212872b676d7Smrg if(pSiS->enablesisctrl) { 212972b676d7Smrg if(value == SIS_DIRECTKEY) { 213072b676d7Smrg pSiS->xv_sisdirectunlocked++; 213172b676d7Smrg } else if(pSiS->xv_sisdirectunlocked) { 213272b676d7Smrg pSiS->xv_sisdirectunlocked--; 213372b676d7Smrg } 213472b676d7Smrg } else { 213572b676d7Smrg pSiS->xv_sisdirectunlocked = 0; 213672b676d7Smrg } 213772b676d7Smrg } else if(attribute == pSiS->xv_SVF) { 213872b676d7Smrg#ifdef SISDUALHEAD 213972b676d7Smrg if(!pPriv->dualHeadMode) 214072b676d7Smrg#endif 214172b676d7Smrg if(pSiS->xv_sisdirectunlocked) { 214272b676d7Smrg SISSwitchCRT2Type(pScrn, (ULong)value, FALSE); 214372b676d7Smrg SISUpdateVideoParms(pSiS, pPriv); 214472b676d7Smrg } 214572b676d7Smrg } else if(attribute == pSiS->xv_CT1) { 214672b676d7Smrg#ifdef SISDUALHEAD 214772b676d7Smrg if(!pPriv->dualHeadMode) 214872b676d7Smrg#endif 214972b676d7Smrg if(pSiS->xv_sisdirectunlocked) { 215072b676d7Smrg SISSwitchCRT1Status(pScrn, (ULong)value, FALSE); 215172b676d7Smrg SISUpdateVideoParms(pSiS, pPriv); 215272b676d7Smrg } 215372b676d7Smrg } else if(attribute == pSiS->xv_RDT) { 215472b676d7Smrg#ifdef SISDUALHEAD 215572b676d7Smrg if(!pPriv->dualHeadMode) 215672b676d7Smrg#endif 215772b676d7Smrg if(pSiS->xv_sisdirectunlocked) { 215872b676d7Smrg SISRedetectCRT2Devices(pScrn); 215972b676d7Smrg } 216072b676d7Smrg } else if(attribute == pSiS->xv_TAF) { 216172b676d7Smrg if(pSiS->xv_sisdirectunlocked) { 216272b676d7Smrg SiS_SetSISTVantiflicker(pScrn, (int)value); 216372b676d7Smrg } 216472b676d7Smrg } else if(attribute == pSiS->xv_TSA) { 216572b676d7Smrg if(pSiS->xv_sisdirectunlocked) { 216672b676d7Smrg SiS_SetSISTVsaturation(pScrn, (int)value); 216772b676d7Smrg } 216872b676d7Smrg } else if(attribute == pSiS->xv_TEE) { 216972b676d7Smrg if(pSiS->xv_sisdirectunlocked) { 217072b676d7Smrg SiS_SetSISTVedgeenhance(pScrn, (int)value); 217172b676d7Smrg } 217272b676d7Smrg } else if(attribute == pSiS->xv_CFI) { 217372b676d7Smrg if(pSiS->xv_sisdirectunlocked) { 217472b676d7Smrg SiS_SetSISTVcfilter(pScrn, value ? 1 : 0); 217572b676d7Smrg } 217672b676d7Smrg } else if(attribute == pSiS->xv_YFI) { 217772b676d7Smrg if(pSiS->xv_sisdirectunlocked) { 217872b676d7Smrg SiS_SetSISTVyfilter(pScrn, value); 217972b676d7Smrg } 218072b676d7Smrg } else if(attribute == pSiS->xv_COC) { 218172b676d7Smrg if(pSiS->xv_sisdirectunlocked) { 218272b676d7Smrg SiS_SetSISTVcolcalib(pScrn, (int)value, TRUE); 218372b676d7Smrg } 218472b676d7Smrg } else if(attribute == pSiS->xv_COF) { 218572b676d7Smrg if(pSiS->xv_sisdirectunlocked) { 218672b676d7Smrg SiS_SetSISTVcolcalib(pScrn, (int)value, FALSE); 218772b676d7Smrg } 218872b676d7Smrg } else if(attribute == pSiS->xv_TCO) { 218972b676d7Smrg if(pSiS->xv_sisdirectunlocked) { 219072b676d7Smrg SiS_SetCHTVcontrast(pScrn, (int)value); 219172b676d7Smrg } 219272b676d7Smrg } else if(attribute == pSiS->xv_TTE) { 219372b676d7Smrg if(pSiS->xv_sisdirectunlocked) { 219472b676d7Smrg SiS_SetCHTVtextenhance(pScrn, (int)value); 219572b676d7Smrg } 219672b676d7Smrg } else if(attribute == pSiS->xv_TCF) { 219772b676d7Smrg if(pSiS->xv_sisdirectunlocked) { 219872b676d7Smrg SiS_SetCHTVchromaflickerfilter(pScrn, (int)value); 219972b676d7Smrg } 220072b676d7Smrg } else if(attribute == pSiS->xv_TLF) { 220172b676d7Smrg if(pSiS->xv_sisdirectunlocked) { 220272b676d7Smrg SiS_SetCHTVlumaflickerfilter(pScrn, (int)value); 220372b676d7Smrg } 220472b676d7Smrg } else if(attribute == pSiS->xv_TCC) { 220572b676d7Smrg if(pSiS->xv_sisdirectunlocked) { 220672b676d7Smrg SiS_SetCHTVcvbscolor(pScrn, value ? 1 : 0); 220772b676d7Smrg } 220872b676d7Smrg } else if(attribute == pSiS->xv_OVR) { 220972b676d7Smrg if(pSiS->xv_sisdirectunlocked) { 221072b676d7Smrg pSiS->UseCHOverScan = -1; 221172b676d7Smrg pSiS->OptTVSOver = FALSE; 221272b676d7Smrg if(value == 3) { 221372b676d7Smrg if(pSiS->SiS_SD_Flags & SiS_SD_SUPPORTSOVER) { 221472b676d7Smrg pSiS->OptTVSOver = TRUE; 221572b676d7Smrg } 221672b676d7Smrg pSiS->UseCHOverScan = 1; 221772b676d7Smrg } else if(value == 2) pSiS->UseCHOverScan = 1; 221872b676d7Smrg else if(value == 1) pSiS->UseCHOverScan = 0; 221972b676d7Smrg } 222072b676d7Smrg } else if(attribute == pSiS->xv_CMD) { 222172b676d7Smrg if(pSiS->xv_sisdirectunlocked) { 222272b676d7Smrg int result = 0; 222372b676d7Smrg pSiS->xv_sd_result = (value & 0xffffff00); 222472b676d7Smrg result = SISCheckModeIndexForCRT2Type(pScrn, (UShort)(value & 0xff), 222572b676d7Smrg (UShort)((value >> 8) & 0xff), 222672b676d7Smrg FALSE); 222772b676d7Smrg pSiS->xv_sd_result |= (result & 0xff); 222872b676d7Smrg } 222972b676d7Smrg } else if(attribute == pSiS->xv_SGA) { 223072b676d7Smrg if(pSiS->xv_sisdirectunlocked) { 223172b676d7Smrg Bool backup = pSiS->XvGamma; 223272b676d7Smrg Bool backup2 = pSiS->CRT2SepGamma; 223372b676d7Smrg pSiS->CRT1gamma = (value & 0x01) ? TRUE : FALSE; 223472b676d7Smrg pSiS->CRT2gamma = (value & 0x02) ? TRUE : FALSE; 223572b676d7Smrg#ifdef SISDUALHEAD 223672b676d7Smrg if(pPriv->dualHeadMode) { 223772b676d7Smrg pSiSEnt->CRT1gamma = pSiS->CRT1gamma; 223872b676d7Smrg pSiSEnt->CRT2gamma = pSiS->CRT2gamma; 223972b676d7Smrg } 224072b676d7Smrg#endif 224172b676d7Smrg if(pSiS->SiS_SD_Flags & SiS_SD_SUPPORTSGRCRT2) { 224272b676d7Smrg pSiS->CRT2SepGamma = (value & 0x08) ? TRUE : FALSE; 224372b676d7Smrg if(pSiS->CRT2SepGamma != backup2) { 224472b676d7Smrg if(pSiS->CRT2SepGamma) { 224572b676d7Smrg SiS_UpdateGammaCRT2(pScrn); 224672b676d7Smrg } 224772b676d7Smrg#ifdef SISGAMMARAMP 224872b676d7Smrg else { 224972b676d7Smrg SISCalculateGammaRamp(pScrn->pScreen, pScrn); 225072b676d7Smrg } 225172b676d7Smrg#endif 225272b676d7Smrg /* ATTN: When disabling CRT2 sep gamma, 225372b676d7Smrg * as long as SISGAMMARAMP is not defined, 225472b676d7Smrg * application needs to reset palette using 225572b676d7Smrg * vidmodextension! (See SiS_SD_CANSETGAMMA) 225672b676d7Smrg * 225772b676d7Smrg * Note: Difference between setting gamma values 225872b676d7Smrg * for CRT1 and CRT2: For CRT1, driver only 225972b676d7Smrg * stores the values, but does nothing with them. 226072b676d7Smrg * For CRT2, the driver will IMMEDIATELY recalc 226172b676d7Smrg * the palette. App needs to calc gamma ramp 226272b676d7Smrg * itself for CRT1, and set it using the 226372b676d7Smrg * VidModExtention. 226472b676d7Smrg */ 226572b676d7Smrg } 226672b676d7Smrg } else pSiS->CRT2SepGamma = FALSE; 226772b676d7Smrg pSiS->XvGamma = (value & 0x04) ? TRUE : FALSE; 226872b676d7Smrg if(pSiS->VGAEngine == SIS_315_VGA) { 226972b676d7Smrg if(backup != pSiS->XvGamma) { 227072b676d7Smrg SiSUpdateXvGamma(pSiS, pPriv); 227172b676d7Smrg } 227272b676d7Smrg } 227372b676d7Smrg } 227472b676d7Smrg } else if(attribute == pSiS->xv_TXS) { 227572b676d7Smrg if((value < -16) || (value > 16)) return BadValue; 227672b676d7Smrg if(pSiS->xv_sisdirectunlocked) { 227772b676d7Smrg SiS_SetTVxscale(pScrn, value); 227872b676d7Smrg } 227972b676d7Smrg } else if(attribute == pSiS->xv_TYS) { 228072b676d7Smrg if((value < -4) || (value > 3)) return BadValue; 228172b676d7Smrg if(pSiS->xv_sisdirectunlocked) { 228272b676d7Smrg SiS_SetTVyscale(pScrn, value); 228372b676d7Smrg } 228472b676d7Smrg } else if(attribute == pSiS->xv_BRR) { 228572b676d7Smrg if((value < 100) || (value > 10000)) return BadValue; 228672b676d7Smrg if(pSiS->xv_sisdirectunlocked) { 228772b676d7Smrg pSiS->GammaBriR = value; 228872b676d7Smrg } 228972b676d7Smrg } else if(attribute == pSiS->xv_BRG) { 229072b676d7Smrg if((value < 100) || (value > 10000)) return BadValue; 229172b676d7Smrg if(pSiS->xv_sisdirectunlocked) { 229272b676d7Smrg pSiS->GammaBriG = value; 229372b676d7Smrg } 229472b676d7Smrg } else if(attribute == pSiS->xv_BRB) { 229572b676d7Smrg if((value < 100) || (value > 10000)) return BadValue; 229672b676d7Smrg if(pSiS->xv_sisdirectunlocked) { 229772b676d7Smrg pSiS->GammaBriB = value; 229872b676d7Smrg } 229972b676d7Smrg } else if(attribute == pSiS->xv_PBR) { 230072b676d7Smrg /* Nop */ 230172b676d7Smrg } else if(attribute == pSiS->xv_PBG) { 230272b676d7Smrg /* Nop */ 230372b676d7Smrg } else if(attribute == pSiS->xv_PBB) { 230472b676d7Smrg /* Nop */ 230572b676d7Smrg } else if(attribute == pSiS->xv_BRR2) { 230672b676d7Smrg if((value < 100) || (value > 10000)) return BadValue; 230772b676d7Smrg if(pSiS->xv_sisdirectunlocked) { 230872b676d7Smrg#ifdef SISDUALHEAD 230972b676d7Smrg if(pPriv->dualHeadMode) pSiSEnt->GammaBriR = value; 231072b676d7Smrg#endif 231172b676d7Smrg } 231272b676d7Smrg } else if(attribute == pSiS->xv_BRG2) { 231372b676d7Smrg if((value < 100) || (value > 10000)) return BadValue; 231472b676d7Smrg if(pSiS->xv_sisdirectunlocked) { 231572b676d7Smrg#ifdef SISDUALHEAD 231672b676d7Smrg if(pPriv->dualHeadMode) pSiSEnt->GammaBriG = value; 231772b676d7Smrg#endif 231872b676d7Smrg } 231972b676d7Smrg } else if(attribute == pSiS->xv_BRB2) { 232072b676d7Smrg if((value < 100) || (value > 10000)) return BadValue; 232172b676d7Smrg if(pSiS->xv_sisdirectunlocked) { 232272b676d7Smrg#ifdef SISDUALHEAD 232372b676d7Smrg if(pPriv->dualHeadMode) pSiSEnt->GammaBriB = value; 232472b676d7Smrg#endif 232572b676d7Smrg } 232672b676d7Smrg } else if(attribute == pSiS->xv_PBR2) { 232772b676d7Smrg /* Nop */ 232872b676d7Smrg } else if(attribute == pSiS->xv_PBG2) { 232972b676d7Smrg /* Nop */ 233072b676d7Smrg } else if(attribute == pSiS->xv_PBB2) { 233172b676d7Smrg /* Nop */ 233272b676d7Smrg } else if(attribute == pSiS->xv_GARC2) { 233372b676d7Smrg if((value < 100) || (value > 10000)) return BadValue; 233472b676d7Smrg if(pSiS->xv_sisdirectunlocked) { 233572b676d7Smrg pSiS->GammaR2 = (float)value / (float)1000; 233672b676d7Smrg SiS_UpdateGammaCRT2(pScrn); 233772b676d7Smrg } 233872b676d7Smrg } else if(attribute == pSiS->xv_GAGC2) { 233972b676d7Smrg if((value < 100) || (value > 10000)) return BadValue; 234072b676d7Smrg if(pSiS->xv_sisdirectunlocked) { 234172b676d7Smrg pSiS->GammaG2 = (float)value / (float)1000; 234272b676d7Smrg SiS_UpdateGammaCRT2(pScrn); 234372b676d7Smrg } 234472b676d7Smrg } else if(attribute == pSiS->xv_GABC2) { 234572b676d7Smrg if((value < 100) || (value > 10000)) return BadValue; 234672b676d7Smrg if(pSiS->xv_sisdirectunlocked) { 234772b676d7Smrg pSiS->GammaB2 = (float)value / (float)1000; 234872b676d7Smrg SiS_UpdateGammaCRT2(pScrn); 234972b676d7Smrg } 235072b676d7Smrg } else if(attribute == pSiS->xv_BRRC2) { 235172b676d7Smrg if((value < 100) || (value > 10000)) return BadValue; 235272b676d7Smrg if(pSiS->xv_sisdirectunlocked) { 235372b676d7Smrg pSiS->GammaBriR2 = value; 235472b676d7Smrg SiS_UpdateGammaCRT2(pScrn); 235572b676d7Smrg } 235672b676d7Smrg } else if(attribute == pSiS->xv_BRGC2) { 235772b676d7Smrg if((value < 100) || (value > 10000)) return BadValue; 235872b676d7Smrg if(pSiS->xv_sisdirectunlocked) { 235972b676d7Smrg pSiS->GammaBriG2 = value; 236072b676d7Smrg SiS_UpdateGammaCRT2(pScrn); 236172b676d7Smrg } 236272b676d7Smrg } else if(attribute == pSiS->xv_BRBC2) { 236372b676d7Smrg if((value < 100) || (value > 10000)) return BadValue; 236472b676d7Smrg if(pSiS->xv_sisdirectunlocked) { 236572b676d7Smrg pSiS->GammaBriB2 = value; 236672b676d7Smrg SiS_UpdateGammaCRT2(pScrn); 236772b676d7Smrg } 236872b676d7Smrg } else if(attribute == pSiS->xv_PBRC2) { 236972b676d7Smrg /* Nop */ 237072b676d7Smrg } else if(attribute == pSiS->xv_PBGC2) { 237172b676d7Smrg /* Nop */ 237272b676d7Smrg } else if(attribute == pSiS->xv_PBBC2) { 237372b676d7Smrg /* Nop */ 237472b676d7Smrg } else if(attribute == pSiS->xv_SHC) { 237572b676d7Smrg if(pSiS->xv_sisdirectunlocked) { 237672b676d7Smrg Bool VisibleBackup = pSiS->HWCursorIsVisible; 237772b676d7Smrg pSiS->HideHWCursor = value ? TRUE : FALSE; 237872b676d7Smrg if(pSiS->CursorInfoPtr) { 237972b676d7Smrg if(VisibleBackup) { 238072b676d7Smrg if(value) { 238172b676d7Smrg (pSiS->CursorInfoPtr->HideCursor)(pScrn); 238272b676d7Smrg } else { 238372b676d7Smrg (pSiS->CursorInfoPtr->ShowCursor)(pScrn); 238472b676d7Smrg } 238572b676d7Smrg } 238672b676d7Smrg pSiS->HWCursorIsVisible = VisibleBackup; 238772b676d7Smrg } 238872b676d7Smrg } 238972b676d7Smrg } else if(attribute == pSiS->xv_PMD) { 239072b676d7Smrg if(pSiS->xv_sisdirectunlocked) { 239172b676d7Smrg if(pSiS->SiS_SD_Flags & SiS_SD_SUPPORTSCALE) { 239272b676d7Smrg if(value & 0x01) pSiS->SiS_Pr->UsePanelScaler = -1; 239372b676d7Smrg else if(value & 0x02) pSiS->SiS_Pr->UsePanelScaler = 1; 239472b676d7Smrg else pSiS->SiS_Pr->UsePanelScaler = 0; 239572b676d7Smrg if(pSiS->SiS_SD_Flags & SiS_SD_SUPPORTCENTER) { 239672b676d7Smrg if(value & 0x04) pSiS->SiS_Pr->CenterScreen = -1; 239772b676d7Smrg else if(value & 0x08) pSiS->SiS_Pr->CenterScreen = 1; 239872b676d7Smrg else pSiS->SiS_Pr->CenterScreen = 0; 239972b676d7Smrg } 240072b676d7Smrg } 240172b676d7Smrg } 240272b676d7Smrg#ifdef TWDEBUG 240372b676d7Smrg } else if(attribute == pSiS->xv_STR) { 240472b676d7Smrg ULong port; 240572b676d7Smrg CARD8 reg; 240672b676d7Smrg switch((value & 0xff000000) >> 24) { 240772b676d7Smrg case 0x00: port = SISSR; break; 240872b676d7Smrg case 0x01: port = SISPART1; break; 240972b676d7Smrg case 0x02: port = SISPART2; break; 241072b676d7Smrg case 0x03: port = SISPART3; break; 241172b676d7Smrg case 0x04: port = SISPART4; break; 241272b676d7Smrg case 0x05: port = SISCR; break; 241372b676d7Smrg case 0x06: port = SISVID; break; 241472b676d7Smrg default: return BadValue; 241572b676d7Smrg } 241672b676d7Smrg outSISIDXREG(port,((value & 0x00ff0000) >> 16), ((value & 0x0000ff00) >> 8)); 241772b676d7Smrg inSISIDXREG(port, ((value & 0x00ff0000) >> 16), reg); 241872b676d7Smrg xf86DrvMsg(0, 0, "SetREG %x -> %x -> %x\n", ((value & 0x00ff0000) >> 16), ((value & 0x0000ff00) >> 8), reg); 241972b676d7Smrg#endif 242072b676d7Smrg } else { 242172b676d7Smrg return BadMatch; 242272b676d7Smrg } 242372b676d7Smrg 242472b676d7Smrg return Success; 242572b676d7Smrg} 242672b676d7Smrg 242772b676d7Smrgint 242872b676d7SmrgSISGetPortUtilAttribute(ScrnInfoPtr pScrn, Atom attribute, 242972b676d7Smrg INT32 *value, SISPortPrivPtr pPriv) 243072b676d7Smrg{ 243172b676d7Smrg SISPtr pSiS = SISPTR(pScrn); 243272b676d7Smrg#ifdef SISDUALHEAD 243372b676d7Smrg SISEntPtr pSiSEnt = pSiS->entityPrivate;; 243472b676d7Smrg#endif 243572b676d7Smrg 243672b676d7Smrg if(attribute == pSiS->xv_QVF) { 243772b676d7Smrg *value = pSiS->VBFlags; 243872b676d7Smrg } else if(attribute == pSiS->xv_GDV) { 243972b676d7Smrg *value = SISDRIVERIVERSION; 244072b676d7Smrg } else if(attribute == pSiS->xv_GHI) { 244172b676d7Smrg *value = (pSiS->ChipFlags & 0xffff) | (pSiS->ChipType << 16) | (pSiS->ChipRev << 24); 244272b676d7Smrg } else if(attribute == pSiS->xv_GBI) { 244372b676d7Smrg *value = (pSiS->PciBus << 16) | (pSiS->PciDevice << 8) | pSiS->PciFunc; 244472b676d7Smrg } else if(attribute == pSiS->xv_QVV) { 244572b676d7Smrg *value = SIS_VBFlagsVersion; 244672b676d7Smrg } else if(attribute == pSiS->xv_QDD) { 244772b676d7Smrg *value = pSiS->detectedCRT2Devices; 244872b676d7Smrg } else if(attribute == pSiS->xv_CT1) { 244972b676d7Smrg *value = pSiS->CRT1isoff ? 0 : 1; 245072b676d7Smrg } else if(attribute == pSiS->xv_GSF) { 245172b676d7Smrg *value = pSiS->SiS_SD_Flags; 245272b676d7Smrg } else if(attribute == pSiS->xv_GSF2) { 245372b676d7Smrg *value = pSiS->SiS_SD2_Flags; 245472b676d7Smrg } else if(attribute == pSiS->xv_USD) { 245572b676d7Smrg *value = pSiS->xv_sisdirectunlocked; 245672b676d7Smrg } else if(attribute == pSiS->xv_TAF) { 245772b676d7Smrg *value = SiS_GetSISTVantiflicker(pScrn); 245872b676d7Smrg } else if(attribute == pSiS->xv_TSA) { 245972b676d7Smrg *value = SiS_GetSISTVsaturation(pScrn); 246072b676d7Smrg } else if(attribute == pSiS->xv_TEE) { 246172b676d7Smrg *value = SiS_GetSISTVedgeenhance(pScrn); 246272b676d7Smrg } else if(attribute == pSiS->xv_CFI) { 246372b676d7Smrg *value = SiS_GetSISTVcfilter(pScrn); 246472b676d7Smrg } else if(attribute == pSiS->xv_YFI) { 246572b676d7Smrg *value = SiS_GetSISTVyfilter(pScrn); 246672b676d7Smrg } else if(attribute == pSiS->xv_COC) { 246772b676d7Smrg *value = SiS_GetSISTVcolcalib(pScrn, TRUE); 246872b676d7Smrg } else if(attribute == pSiS->xv_COF) { 246972b676d7Smrg *value = SiS_GetSISTVcolcalib(pScrn, FALSE); 247072b676d7Smrg } else if(attribute == pSiS->xv_TCO) { 247172b676d7Smrg *value = SiS_GetCHTVcontrast(pScrn); 247272b676d7Smrg } else if(attribute == pSiS->xv_TTE) { 247372b676d7Smrg *value = SiS_GetCHTVtextenhance(pScrn); 247472b676d7Smrg } else if(attribute == pSiS->xv_TCF) { 247572b676d7Smrg *value = SiS_GetCHTVchromaflickerfilter(pScrn); 247672b676d7Smrg } else if(attribute == pSiS->xv_TLF) { 247772b676d7Smrg *value = SiS_GetCHTVlumaflickerfilter(pScrn); 247872b676d7Smrg } else if(attribute == pSiS->xv_TCC) { 247972b676d7Smrg *value = SiS_GetCHTVcvbscolor(pScrn); 248072b676d7Smrg } else if(attribute == pSiS->xv_CMDR) { 248172b676d7Smrg *value = pSiS->xv_sd_result; 248272b676d7Smrg } else if(attribute == pSiS->xv_OVR) { 248372b676d7Smrg /* Changing of CRT2 settings not supported in DHM! */ 248472b676d7Smrg *value = 0; 248572b676d7Smrg if(pSiS->OptTVSOver == 1) *value = 3; 248672b676d7Smrg else if(pSiS->UseCHOverScan == 1) *value = 2; 248772b676d7Smrg else if(pSiS->UseCHOverScan == 0) *value = 1; 248872b676d7Smrg } else if(attribute == pSiS->xv_SGA) { 248972b676d7Smrg *value = 0; 249072b676d7Smrg#ifdef SISDUALHEAD 249172b676d7Smrg if(pPriv->dualHeadMode) { 249272b676d7Smrg if(pSiSEnt->CRT1gamma) *value |= 0x01; 249372b676d7Smrg if(pSiSEnt->CRT2gamma) *value |= 0x02; 249472b676d7Smrg } else { 249572b676d7Smrg#endif 249672b676d7Smrg if(pSiS->CRT1gamma) *value |= 0x01; 249772b676d7Smrg if(pSiS->CRT2gamma) *value |= 0x02; 249872b676d7Smrg if(pSiS->CRT2SepGamma) *value |= 0x08; 249972b676d7Smrg#ifdef SISDUALHEAD 250072b676d7Smrg } 250172b676d7Smrg#endif 250272b676d7Smrg if(pSiS->XvGamma) *value |= 0x04; 250372b676d7Smrg } else if(attribute == pSiS->xv_TXS) { 250472b676d7Smrg *value = SiS_GetTVxscale(pScrn); 250572b676d7Smrg } else if(attribute == pSiS->xv_TYS) { 250672b676d7Smrg *value = SiS_GetTVyscale(pScrn); 250772b676d7Smrg } else if(attribute == pSiS->xv_GSS) { 250872b676d7Smrg *value = (pScrn->virtualX << 16) | pScrn->virtualY; 250972b676d7Smrg } else if(attribute == pSiS->xv_BRR) { 251072b676d7Smrg *value = pSiS->GammaBriR; 251172b676d7Smrg } else if(attribute == pSiS->xv_BRG) { 251272b676d7Smrg *value = pSiS->GammaBriG; 251372b676d7Smrg } else if(attribute == pSiS->xv_BRB) { 251472b676d7Smrg *value = pSiS->GammaBriB; 251572b676d7Smrg } else if(attribute == pSiS->xv_PBR) { 251672b676d7Smrg *value = 1000; 251772b676d7Smrg } else if(attribute == pSiS->xv_PBG) { 251872b676d7Smrg *value = 1000; 251972b676d7Smrg } else if(attribute == pSiS->xv_PBB) { 252072b676d7Smrg *value = 1000; 252172b676d7Smrg } else if(attribute == pSiS->xv_BRR2) { 252272b676d7Smrg#ifdef SISDUALHEAD 252372b676d7Smrg if(pPriv->dualHeadMode) *value = pSiSEnt->GammaBriR; 252472b676d7Smrg else 252572b676d7Smrg#endif 252672b676d7Smrg *value = pSiS->GammaBriR; 252772b676d7Smrg } else if(attribute == pSiS->xv_BRG2) { 252872b676d7Smrg#ifdef SISDUALHEAD 252972b676d7Smrg if(pPriv->dualHeadMode) *value = pSiSEnt->GammaBriG; 253072b676d7Smrg else 253172b676d7Smrg#endif 253272b676d7Smrg *value = pSiS->GammaBriG; 253372b676d7Smrg } else if(attribute == pSiS->xv_BRB2) { 253472b676d7Smrg#ifdef SISDUALHEAD 253572b676d7Smrg if(pPriv->dualHeadMode) *value = pSiSEnt->GammaBriB; 253672b676d7Smrg else 253772b676d7Smrg#endif 253872b676d7Smrg *value = pSiS->GammaBriB; 253972b676d7Smrg } else if(attribute == pSiS->xv_PBR2) { 254072b676d7Smrg *value = 1000; 254172b676d7Smrg } else if(attribute == pSiS->xv_PBG2) { 254272b676d7Smrg *value = 1000; 254372b676d7Smrg } else if(attribute == pSiS->xv_PBB2) { 254472b676d7Smrg *value = 1000; 254572b676d7Smrg } else if(attribute == pSiS->xv_GARC2) { 254672b676d7Smrg *value = (int)(pSiS->GammaR2 * 1000); 254772b676d7Smrg } else if(attribute == pSiS->xv_GAGC2) { 254872b676d7Smrg *value = (int)(pSiS->GammaG2 * 1000); 254972b676d7Smrg } else if(attribute == pSiS->xv_GABC2) { 255072b676d7Smrg *value = (int)(pSiS->GammaB2 * 1000); 255172b676d7Smrg } else if(attribute == pSiS->xv_BRRC2) { 255272b676d7Smrg *value = pSiS->GammaBriR2; 255372b676d7Smrg } else if(attribute == pSiS->xv_BRGC2) { 255472b676d7Smrg *value = pSiS->GammaBriG2; 255572b676d7Smrg } else if(attribute == pSiS->xv_BRBC2) { 255672b676d7Smrg *value = pSiS->GammaBriB2; 255772b676d7Smrg } else if(attribute == pSiS->xv_PBRC2) { 255872b676d7Smrg *value = 1000; 255972b676d7Smrg } else if(attribute == pSiS->xv_PBGC2) { 256072b676d7Smrg *value = 1000; 256172b676d7Smrg } else if(attribute == pSiS->xv_PBBC2) { 256272b676d7Smrg *value = 1000; 256372b676d7Smrg } else if(attribute == pSiS->xv_SHC) { 256472b676d7Smrg *value = pSiS->HideHWCursor ? 1 : 0; 256572b676d7Smrg } else if(attribute == pSiS->xv_PMD) { 256672b676d7Smrg *value = 0; 256772b676d7Smrg if(pSiS->SiS_SD_Flags & SiS_SD_SUPPORTSCALE) { 256872b676d7Smrg switch(pSiS->SiS_Pr->UsePanelScaler) { 256972b676d7Smrg case -1: *value |= 0x01; break; 257072b676d7Smrg case 1: *value |= 0x02; break; 257172b676d7Smrg } 257272b676d7Smrg if(pSiS->SiS_SD_Flags & SiS_SD_SUPPORTCENTER) { 257372b676d7Smrg switch(pSiS->SiS_Pr->CenterScreen) { 257472b676d7Smrg case -1: *value |= 0x04; break; 257572b676d7Smrg case 1: *value |= 0x08; break; 257672b676d7Smrg } 257772b676d7Smrg } 257872b676d7Smrg } 257972b676d7Smrg } else { 258072b676d7Smrg return BadMatch; 258172b676d7Smrg } 258272b676d7Smrg 258372b676d7Smrg return Success; 258472b676d7Smrg} 258572b676d7Smrg 258672b676d7Smrg#endif /* XV_SD_DEPRECATED */ 258772b676d7Smrg 2588