
#include <asm/io.h>
#include <linux/types.h>
#include <linux/version.h>
#include "XGIfb.h"


#include "vb_def.h"
#include "vgatypes.h"
#include "vb_struct.h"
#include "vb_util.h"
#include "vb_table.h"



#define  IndexMask 0xff
#ifndef XGI_MASK_DUAL_CHIP
#define XGI_MASK_DUAL_CHIP	  0x04  /* SR3A */
#endif



unsigned char  XGI_IsLCDDualLink(struct vb_device_info *pVBInfo);
unsigned char  XGI_SetCRT2Group301(unsigned short ModeNo,
			     struct xgi_hw_device_info *HwDeviceExtension,
			     struct vb_device_info *pVBInfo);
unsigned char  XGI_BacklightByDrv(struct vb_device_info *pVBInfo);

unsigned char  XGI_IsLCDON(struct vb_device_info *pVBInfo);
unsigned char  XGI_DisableChISLCD(struct vb_device_info *pVBInfo);
unsigned char  XGI_EnableChISLCD(struct vb_device_info *pVBInfo);
unsigned char  XGI_AjustCRT2Rate(unsigned short ModeNo,
			   unsigned short ModeIdIndex,
			   unsigned short RefreshRateTableIndex,
			   unsigned short *i, struct vb_device_info *pVBInfo);
unsigned char  XGI_SearchModeID(unsigned short ModeNo,
			  unsigned short *ModeIdIndex,
			  struct vb_device_info *pVBInfo);
unsigned char  XGI_GetLCDInfo(unsigned short ModeNo,
			unsigned short ModeIdIndex,
			struct vb_device_info *pVBInfo);
unsigned char  XGISetModeNew(struct xgi_hw_device_info *HwDeviceExtension,
		       unsigned short ModeNo);
unsigned char  XGI_BridgeIsOn(struct vb_device_info *pVBInfo);
unsigned char    XGI_GetModePtr(unsigned short ModeNo,
			unsigned short ModeIdIndex,
			struct vb_device_info *pVBInfo);
unsigned short XGI_GetOffset(unsigned short ModeNo,
			     unsigned short ModeIdIndex,
			     unsigned short RefreshRateTableIndex,
			     struct xgi_hw_device_info *HwDeviceExtension,
			     struct vb_device_info *pVBInfo);
unsigned short XGI_GetRatePtrCRT2(struct xgi_hw_device_info *pXGIHWDE,
				  unsigned short ModeNo,
				  unsigned short ModeIdIndex,
				  struct vb_device_info *pVBInfo);
unsigned short XGI_GetResInfo(unsigned short ModeNo,
			      unsigned short ModeIdIndex,
			      struct vb_device_info *pVBInfo);
unsigned short XGI_GetColorDepth(unsigned short ModeNo,
				 unsigned short ModeIdIndex,
				 struct vb_device_info *pVBInfo);
unsigned short XGI_GetVGAHT2(struct vb_device_info *pVBInfo);
unsigned short XGI_GetVCLK2Ptr(unsigned short ModeNo,
			       unsigned short ModeIdIndex,
			       unsigned short RefreshRateTableIndex,
			       struct xgi_hw_device_info *HwDeviceExtension,
			       struct vb_device_info *pVBInfo);
void     XGI_VBLongWait(struct vb_device_info *pVBInfo);
void     XGI_SaveCRT2Info(unsigned short ModeNo, struct vb_device_info *pVBInfo);
void     XGI_GetCRT2Data(unsigned short ModeNo, unsigned short ModeIdIndex, unsigned short RefreshRateTableIndex, struct vb_device_info *pVBInfo);
void     XGI_GetCRT2ResInfo(unsigned short ModeNo, unsigned short ModeIdIndex, struct vb_device_info *pVBInfo);
void     XGI_PreSetGroup1(unsigned short ModeNo, unsigned short ModeIdIndex, struct xgi_hw_device_info *HwDeviceExtension, unsigned short RefreshRateTableIndex, struct vb_device_info *pVBInfo);
void     XGI_SetGroup1(unsigned short ModeNo, unsigned short ModeIdIndex, struct xgi_hw_device_info *HwDeviceExtension, unsigned short RefreshRateTableIndex, struct vb_device_info *pVBInfo);
void     XGI_SetLockRegs(unsigned short ModeNo, unsigned short ModeIdIndex, struct xgi_hw_device_info *HwDeviceExtension, unsigned short RefreshRateTableIndex, struct vb_device_info *pVBInfo);
void     XGI_SetLCDRegs(unsigned short ModeNo, unsigned short ModeIdIndex, struct xgi_hw_device_info *HwDeviceExtension, unsigned short RefreshRateTableIndex, struct vb_device_info *pVBInfo);
void     XGI_SetGroup2(unsigned short ModeNo, unsigned short ModeIdIndex, unsigned short RefreshRateTableIndex, struct xgi_hw_device_info *HwDeviceExtension, struct vb_device_info *pVBInfo);
void     XGI_SetGroup3(unsigned short ModeNo, unsigned short ModeIdIndex, struct vb_device_info *pVBInfo);
void     XGI_SetGroup4(unsigned short ModeNo, unsigned short ModeIdIndex, unsigned short RefreshRateTableIndex, struct xgi_hw_device_info *HwDeviceExtension, struct vb_device_info *pVBInfo);
void     XGI_SetGroup5(unsigned short ModeNo, unsigned short ModeIdIndex, struct vb_device_info *pVBInfo);
void     *XGI_GetLcdPtr(unsigned short BX,  unsigned short ModeNo, unsigned short ModeIdIndex, unsigned short RefreshRateTableIndex, struct vb_device_info *pVBInfo);
void     *XGI_GetTVPtr(unsigned short BX, unsigned short ModeNo, unsigned short ModeIdIndex, unsigned short RefreshRateTableIndex, struct vb_device_info *pVBInfo);
void     XGI_FirePWDEnable(struct vb_device_info *pVBInfo);
void     XGI_EnableGatingCRT(struct xgi_hw_device_info *HwDeviceExtension, struct vb_device_info *pVBInfo);
void     XGI_DisableGatingCRT(struct xgi_hw_device_info *HwDeviceExtension, struct vb_device_info *pVBInfo);
void     XGI_SetPanelDelay(unsigned short tempbl, struct vb_device_info *pVBInfo);
void     XGI_SetPanelPower(unsigned short tempah, unsigned short tempbl, struct vb_device_info *pVBInfo);
void     XGI_EnablePWD(struct vb_device_info *pVBInfo);
void     XGI_DisablePWD(struct vb_device_info *pVBInfo);
void     XGI_AutoThreshold(struct vb_device_info *pVBInfo);
void     XGI_SetTap4Regs(struct vb_device_info *pVBInfo);

void     XGI_DisplayOn(struct xgi_hw_device_info *, struct vb_device_info *pVBInfo);
void     XGI_DisplayOff(struct xgi_hw_device_info *, struct vb_device_info *pVBInfo);
void     XGI_SetCRT1Group(struct xgi_hw_device_info *HwDeviceExtension, unsigned short ModeNo, unsigned short ModeIdIndex, struct vb_device_info *pVBInfo);
void     XGI_SetXG21CRTC(unsigned short ModeNo, unsigned short ModeIdIndex, unsigned short RefreshRateTableIndex, struct vb_device_info *pVBInfo);
void     XGI_SetXG21LCD(struct vb_device_info *pVBInfo, unsigned short RefreshRateTableIndex, unsigned short ModeNo);
void     XGI_SetXG27CRTC(unsigned short ModeNo, unsigned short ModeIdIndex, unsigned short RefreshRateTableIndex, struct vb_device_info *pVBInfo);
void     XGI_SetXG27LCD(struct vb_device_info *pVBInfo, unsigned short RefreshRateTableIndex, unsigned short ModeNo);
void	 XGI_UpdateXG21CRTC(unsigned short ModeNo, struct vb_device_info *pVBInfo, unsigned short RefreshRateTableIndex);
void     XGI_WaitDisply(struct vb_device_info *pVBInfo);
void     XGI_SenseCRT1(struct vb_device_info *pVBInfo);
void     XGI_SetSeqRegs(unsigned short ModeNo, unsigned short StandTableIndex, unsigned short ModeIdIndex, struct vb_device_info *pVBInfo);
void     XGI_SetMiscRegs(unsigned short StandTableIndex, struct vb_device_info *pVBInfo);
void     XGI_SetCRTCRegs(struct xgi_hw_device_info *HwDeviceExtension, unsigned short StandTableIndex, struct vb_device_info *pVBInfo);
void     XGI_SetATTRegs(unsigned short ModeNo, unsigned short StandTableIndex, unsigned short ModeIdIndex, struct vb_device_info *pVBInfo);
void     XGI_SetGRCRegs(unsigned short StandTableIndex, struct vb_device_info *pVBInfo);
void     XGI_ClearExt1Regs(struct vb_device_info *pVBInfo);

void     XGI_SetSync(unsigned short RefreshRateTableIndex, struct vb_device_info *pVBInfo);
void     XGI_SetCRT1CRTC(unsigned short ModeNo, unsigned short ModeIdIndex, unsigned short RefreshRateTableIndex, struct vb_device_info *pVBInfo, struct xgi_hw_device_info *HwDeviceExtension);
void     XGI_SetCRT1Timing_H(struct vb_device_info *pVBInfo, struct xgi_hw_device_info *HwDeviceExtension);
void     XGI_SetCRT1Timing_V(unsigned short ModeIdIndex, unsigned short ModeNo, struct vb_device_info *pVBInfo);
void     XGI_SetCRT1DE(struct xgi_hw_device_info *HwDeviceExtension, unsigned short ModeNo, unsigned short ModeIdIndex, unsigned short RefreshRateTableIndex, struct vb_device_info *pVBInfo);
void     XGI_SetCRT1VCLK(unsigned short ModeNo, unsigned short ModeIdIndex, struct xgi_hw_device_info *HwDeviceExtension, unsigned short RefreshRateTableIndex, struct vb_device_info *pVBInfo);
void     XGI_SetCRT1FIFO(unsigned short ModeNo, struct xgi_hw_device_info *HwDeviceExtension, struct vb_device_info *pVBInfo);
void     XGI_SetCRT1ModeRegs(struct xgi_hw_device_info *HwDeviceExtension, unsigned short ModeNo, unsigned short ModeIdIndex, unsigned short RefreshRateTableIndex, struct vb_device_info *pVBInfo);
void     XGI_SetVCLKState(struct xgi_hw_device_info *HwDeviceExtension, unsigned short ModeNo, unsigned short RefreshRateTableIndex, struct vb_device_info *pVBInfo);

void     XGI_LoadDAC(unsigned short ModeNo, unsigned short ModeIdIndex, struct vb_device_info *pVBInfo);
void     XGI_WriteDAC(unsigned short dl, unsigned short ah, unsigned short al, unsigned short dh, struct vb_device_info *pVBInfo);
/*void     XGI_ClearBuffer(struct xgi_hw_device_info *HwDeviceExtension, unsigned short ModeNo, struct vb_device_info *pVBInfo);*/
void     XGI_SetLCDAGroup(unsigned short ModeNo, unsigned short ModeIdIndex, struct xgi_hw_device_info *HwDeviceExtension, struct vb_device_info *pVBInfo);
void     XGI_GetLVDSResInfo(unsigned short ModeNo, unsigned short ModeIdIndex,
			    struct vb_device_info *pVBInfo);
void     XGI_GetLVDSData(unsigned short ModeNo, unsigned short ModeIdIndex, unsigned short RefreshRateTableIndex, struct vb_device_info *pVBInfo);
void     XGI_ModCRT1Regs(unsigned short ModeNo, unsigned short ModeIdIndex,
			 unsigned short RefreshRateTableIndex,
			 struct xgi_hw_device_info *HwDeviceExtension,
			 struct vb_device_info *pVBInfo);
void     XGI_SetLVDSRegs(unsigned short ModeNo, unsigned short ModeIdIndex, unsigned short RefreshRateTableIndex, struct vb_device_info *pVBInfo);
void     XGI_UpdateModeInfo(struct xgi_hw_device_info *HwDeviceExtension, struct vb_device_info *pVBInfo);
void     XGI_GetVGAType(struct xgi_hw_device_info *HwDeviceExtension, struct vb_device_info *pVBInfo);
void     XGI_GetVBType(struct vb_device_info *pVBInfo);
void     XGI_GetVBInfo(unsigned short ModeNo, unsigned short ModeIdIndex, struct xgi_hw_device_info *HwDeviceExtension, struct vb_device_info *pVBInfo);
void     XGI_GetTVInfo(unsigned short ModeNo, unsigned short ModeIdIndex, struct vb_device_info *pVBInfo);
void     XGI_SetCRT2ECLK(unsigned short ModeNo, unsigned short ModeIdIndex, unsigned short RefreshRateTableIndex, struct vb_device_info *pVBInfo);
void     InitTo330Pointer(unsigned char, struct vb_device_info *pVBInfo);
void     XGI_GetLCDSync(unsigned short *HSyncWidth, unsigned short *VSyncWidth, struct vb_device_info *pVBInfo);
void     XGI_DisableBridge(struct xgi_hw_device_info *HwDeviceExtension, struct vb_device_info *pVBInfo);
void     XGI_EnableBridge(struct xgi_hw_device_info *HwDeviceExtension, struct vb_device_info *pVBInfo);
void     XGI_SetCRT2VCLK(unsigned short ModeNo, unsigned short ModeIdIndex, unsigned short RefreshRateTableIndex, struct vb_device_info *pVBInfo);
void     XGI_OEM310Setting(unsigned short ModeNo, unsigned short ModeIdIndex, struct vb_device_info *pVBInfo);
void     XGI_SetDelayComp(struct vb_device_info *pVBInfo);
void     XGI_SetLCDCap(struct vb_device_info *pVBInfo);
void     XGI_SetLCDCap_A(unsigned short tempcx, struct vb_device_info *pVBInfo);
void     XGI_SetLCDCap_B(unsigned short tempcx, struct vb_device_info *pVBInfo);
void     SetSpectrum(struct vb_device_info *pVBInfo);
void     XGI_SetAntiFlicker(unsigned short ModeNo, unsigned short ModeIdIndex, struct vb_device_info *pVBInfo);
void     XGI_SetEdgeEnhance(unsigned short ModeNo, unsigned short ModeIdIndex, struct vb_device_info *pVBInfo);
void     XGI_SetPhaseIncr(struct vb_device_info *pVBInfo);
void     XGI_SetYFilter(unsigned short ModeNo, unsigned short ModeIdIndex, struct vb_device_info *pVBInfo);
void     XGI_GetTVPtrIndex2(unsigned short *tempbx, unsigned char* tempcl,
			    unsigned char *tempch, struct vb_device_info *pVBInfo);
unsigned short   XGI_GetTVPtrIndex(struct vb_device_info *pVBInfo);
void     XGI_SetCRT2ModeRegs(unsigned short ModeNo, struct xgi_hw_device_info *, struct vb_device_info *pVBInfo);
void     XGI_CloseCRTC(struct xgi_hw_device_info *, struct vb_device_info *pVBInfo);
void     XGI_OpenCRTC(struct xgi_hw_device_info *, struct vb_device_info *pVBInfo);
void     XGI_GetRAMDAC2DATA(unsigned short ModeNo, unsigned short ModeIdIndex, unsigned short RefreshRateTableIndex, struct vb_device_info *pVBInfo);
void     XGI_UnLockCRT2(struct xgi_hw_device_info *, struct vb_device_info *pVBInfo);
void     XGI_LockCRT2(struct xgi_hw_device_info *, struct vb_device_info *pVBInfo);
void     XGINew_EnableCRT2(struct vb_device_info *pVBInfo);
void     XGINew_LCD_Wait_Time(unsigned char DelayTime, struct vb_device_info *pVBInfo);
void     XGI_LongWait(struct vb_device_info *pVBInfo);
void     XGI_SetCRT1Offset(unsigned short ModeNo, unsigned short ModeIdIndex, unsigned short RefreshRateTableIndex, struct xgi_hw_device_info *HwDeviceExtension, struct vb_device_info *pVBInfo);
void     XGI_GetLCDVCLKPtr(unsigned char *di_0, unsigned char *di_1,
			   struct vb_device_info *pVBInfo);
unsigned char    XGI_GetVCLKPtr(unsigned short RefreshRateTableIndex,
				unsigned short ModeNo,
				unsigned short ModeIdIndex,
				struct vb_device_info *pVBInfo);
void     XGI_GetVCLKLen(unsigned char tempal, unsigned char *di_0,
			unsigned char *di_1, struct vb_device_info *pVBInfo);
unsigned short   XGI_GetLCDCapPtr(struct vb_device_info *pVBInfo);
unsigned short   XGI_GetLCDCapPtr1(struct vb_device_info *pVBInfo);
struct XGI301C_Tap4TimingStruct *XGI_GetTap4Ptr(unsigned short tempcx, struct vb_device_info *pVBInfo);
void     XGI_SetXG21FPBits(struct vb_device_info *pVBInfo);
void     XGI_SetXG27FPBits(struct vb_device_info *pVBInfo);
unsigned char    XGI_XG21GetPSCValue(struct vb_device_info *pVBInfo);
unsigned char    XGI_XG27GetPSCValue(struct vb_device_info *pVBInfo);
void     XGI_XG21BLSignalVDD(unsigned short tempbh, unsigned short tempbl, struct vb_device_info *pVBInfo);
void     XGI_XG27BLSignalVDD(unsigned short tempbh, unsigned short tempbl, struct vb_device_info *pVBInfo);
void     XGI_XG21SetPanelDelay(unsigned short tempbl, struct vb_device_info *pVBInfo);
unsigned char  XGI_XG21CheckLVDSMode(unsigned short ModeNo, unsigned short ModeIdIndex, struct vb_device_info *pVBInfo);
void     XGI_SetXG21LVDSPara(unsigned short ModeNo, unsigned short ModeIdIndex, struct vb_device_info *pVBInfo);
void     XGI_SetXG27LVDSPara(unsigned short ModeNo, unsigned short ModeIdIndex, struct vb_device_info *pVBInfo);
unsigned char  XGI_SetDefaultVCLK(struct vb_device_info *pVBInfo);

extern void ReadVBIOSTablData(unsigned char ChipType, struct vb_device_info *pVBInfo);

/* unsigned short XGINew_flag_clearbuffer; 0: no clear frame buffer 1:clear frame buffer */


unsigned short XGINew_MDA_DAC[] = {
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15,
	0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15,
	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15,
	0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15,
	0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F};

unsigned short XGINew_CGA_DAC[] = {
	0x00, 0x10, 0x04, 0x14, 0x01, 0x11, 0x09, 0x15,
	0x00, 0x10, 0x04, 0x14, 0x01, 0x11, 0x09, 0x15,
	0x2A, 0x3A, 0x2E, 0x3E, 0x2B, 0x3B, 0x2F, 0x3F,
	0x2A, 0x3A, 0x2E, 0x3E, 0x2B, 0x3B, 0x2F, 0x3F,
	0x00, 0x10, 0x04, 0x14, 0x01, 0x11, 0x09, 0x15,
	0x00, 0x10, 0x04, 0x14, 0x01, 0x11, 0x09, 0x15,
	0x2A, 0x3A, 0x2E, 0x3E, 0x2B, 0x3B, 0x2F, 0x3F,
	0x2A, 0x3A, 0x2E, 0x3E, 0x2B, 0x3B, 0x2F, 0x3F};

unsigned short XGINew_EGA_DAC[] = {
	0x00, 0x10, 0x04, 0x14, 0x01, 0x11, 0x05, 0x15,
	0x20, 0x30, 0x24, 0x34, 0x21, 0x31, 0x25, 0x35,
	0x08, 0x18, 0x0C, 0x1C, 0x09, 0x19, 0x0D, 0x1D,
	0x28, 0x38, 0x2C, 0x3C, 0x29, 0x39, 0x2D, 0x3D,
	0x02, 0x12, 0x06, 0x16, 0x03, 0x13, 0x07, 0x17,
	0x22, 0x32, 0x26, 0x36, 0x23, 0x33, 0x27, 0x37,
	0x0A, 0x1A, 0x0E, 0x1E, 0x0B, 0x1B, 0x0F, 0x1F,
	0x2A, 0x3A, 0x2E, 0x3E, 0x2B, 0x3B, 0x2F, 0x3F};

unsigned short XGINew_VGA_DAC[] = {
	0x00, 0x10, 0x04, 0x14, 0x01, 0x11, 0x09, 0x15,
	0x2A, 0x3A, 0x2E, 0x3E, 0x2B, 0x3B, 0x2F, 0x3F,
	0x00, 0x05, 0x08, 0x0B, 0x0E, 0x11, 0x14, 0x18,
	0x1C, 0x20, 0x24, 0x28, 0x2D, 0x32, 0x38, 0x3F,
	0x00, 0x10, 0x1F, 0x2F, 0x3F, 0x1F, 0x27, 0x2F,
	0x37, 0x3F, 0x2D, 0x31, 0x36, 0x3A, 0x3F, 0x00,
	0x07, 0x0E, 0x15, 0x1C, 0x0E, 0x11, 0x15, 0x18,
	0x1C, 0x14, 0x16, 0x18, 0x1A, 0x1C, 0x00, 0x04,
	0x08, 0x0C, 0x10, 0x08, 0x0A, 0x0C, 0x0E, 0x10,
	0x0B, 0x0C, 0x0D, 0x0F, 0x10};


/* --------------------------------------------------------------------- */
/* Function : InitTo330Pointer */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void InitTo330Pointer(unsigned char ChipType, struct vb_device_info *pVBInfo)
{
    pVBInfo->SModeIDTable = (struct XGI_StStruct *) XGI330_SModeIDTable ;
    pVBInfo->StandTable = (struct XGI_StandTableStruct *) XGI330_StandTable ;
    pVBInfo->EModeIDTable = (struct XGI_ExtStruct *) XGI330_EModeIDTable ;
    pVBInfo->RefIndex = (struct XGI_Ext2Struct *) XGI330_RefIndex ;
    pVBInfo->XGINEWUB_CRT1Table = (struct XGI_CRT1TableStruct *) XGI_CRT1Table ;

    /* add for new UNIVGABIOS */
    /* XGINew_UBLCDDataTable = (struct XGI_LCDDataTablStruct *) XGI_LCDDataTable ; */
    /* XGINew_UBTVDataTable = (XGI_TVDataTablStruct *) XGI_TVDataTable ; */


    if ( ChipType >= XG40 )
    {
	pVBInfo->MCLKData = (struct XGI_MCLKDataStruct *) XGI340New_MCLKData;
	pVBInfo->ECLKData = (struct XGI_ECLKDataStruct *) XGI340_ECLKData;
    }
    else
    {
	pVBInfo->MCLKData = (struct XGI_MCLKDataStruct *) XGI330New_MCLKData;
	pVBInfo->ECLKData = (struct XGI_ECLKDataStruct *) XGI330_ECLKData;
    }

    pVBInfo->VCLKData = (struct XGI_VCLKDataStruct *) XGI_VCLKData ;
    pVBInfo->VBVCLKData = (struct XGI_VBVCLKDataStruct *) XGI_VBVCLKData ;
    pVBInfo->ScreenOffset = XGI330_ScreenOffset ;
    pVBInfo->StResInfo = (struct XGI_StResInfoStruct *) XGI330_StResInfo ;
    pVBInfo->ModeResInfo = (struct XGI_ModeResInfoStruct *) XGI330_ModeResInfo ;

    pVBInfo->pOutputSelect = &XGI330_OutputSelect ;
    pVBInfo->pSoftSetting = &XGI330_SoftSetting ;
    pVBInfo->pSR07 = &XGI330_SR07 ;
    pVBInfo->LCDResInfo = 0 ;
    pVBInfo->LCDTypeInfo = 0 ;
    pVBInfo->LCDInfo = 0 ;
    pVBInfo->VBInfo = 0 ;
    pVBInfo->TVInfo = 0;


    pVBInfo->SR15 = XGI340_SR13 ;
    pVBInfo->CR40 = XGI340_cr41 ;
    pVBInfo->SR25 = XGI330_sr25 ;
    pVBInfo->pSR31 = &XGI330_sr31 ;
    pVBInfo->pSR32 = &XGI330_sr32 ;
    pVBInfo->CR6B = XGI340_CR6B ;
    pVBInfo->CR6E = XGI340_CR6E ;
    pVBInfo->CR6F = XGI340_CR6F ;
    pVBInfo->CR89 = XGI340_CR89 ;
    pVBInfo->AGPReg = XGI340_AGPReg ;
    pVBInfo->SR16 = XGI340_SR16 ;
    pVBInfo->pCRCF = &XG40_CRCF ;
    pVBInfo->pXGINew_DRAMTypeDefinition = &XG40_DRAMTypeDefinition ;


    pVBInfo->CR49 = XGI330_CR49 ;
    pVBInfo->pSR1F = &XGI330_SR1F ;
    pVBInfo->pSR21 = &XGI330_SR21 ;
    pVBInfo->pSR22 = &XGI330_SR22 ;
    pVBInfo->pSR23 = &XGI330_SR23 ;
    pVBInfo->pSR24 = &XGI330_SR24 ;
    pVBInfo->pSR33 = &XGI330_SR33 ;



    pVBInfo->pCRT2Data_1_2 = &XGI330_CRT2Data_1_2 ;
    pVBInfo->pCRT2Data_4_D = &XGI330_CRT2Data_4_D ;
    pVBInfo->pCRT2Data_4_E = &XGI330_CRT2Data_4_E ;
    pVBInfo->pCRT2Data_4_10 = &XGI330_CRT2Data_4_10 ;
    pVBInfo->pRGBSenseData = &XGI330_RGBSenseData ;
    pVBInfo->pVideoSenseData = &XGI330_VideoSenseData ;
    pVBInfo->pYCSenseData = &XGI330_YCSenseData ;
    pVBInfo->pRGBSenseData2 = &XGI330_RGBSenseData2 ;
    pVBInfo->pVideoSenseData2 = &XGI330_VideoSenseData2 ;
    pVBInfo->pYCSenseData2 = &XGI330_YCSenseData2 ;

    pVBInfo->NTSCTiming = XGI330_NTSCTiming ;
    pVBInfo->PALTiming = XGI330_PALTiming ;
    pVBInfo->HiTVExtTiming = XGI330_HiTVExtTiming ;
    pVBInfo->HiTVSt1Timing = XGI330_HiTVSt1Timing ;
    pVBInfo->HiTVSt2Timing = XGI330_HiTVSt2Timing ;
    pVBInfo->HiTVTextTiming = XGI330_HiTVTextTiming ;
    pVBInfo->YPbPr750pTiming = XGI330_YPbPr750pTiming ;
    pVBInfo->YPbPr525pTiming = XGI330_YPbPr525pTiming ;
    pVBInfo->YPbPr525iTiming = XGI330_YPbPr525iTiming ;
    pVBInfo->HiTVGroup3Data = XGI330_HiTVGroup3Data ;
    pVBInfo->HiTVGroup3Simu = XGI330_HiTVGroup3Simu ;
    pVBInfo->HiTVGroup3Text = XGI330_HiTVGroup3Text ;
    pVBInfo->Ren525pGroup3 = XGI330_Ren525pGroup3 ;
    pVBInfo->Ren750pGroup3 = XGI330_Ren750pGroup3 ;


    pVBInfo->TimingH = (struct XGI_TimingHStruct *) XGI_TimingH ;
    pVBInfo->TimingV = (struct XGI_TimingVStruct *) XGI_TimingV ;
    pVBInfo->UpdateCRT1 = (struct XGI_XG21CRT1Struct *) XGI_UpdateCRT1Table ;

    pVBInfo->CHTVVCLKUNTSC = XGI330_CHTVVCLKUNTSC ;
    pVBInfo->CHTVVCLKONTSC = XGI330_CHTVVCLKONTSC ;
    pVBInfo->CHTVVCLKUPAL = XGI330_CHTVVCLKUPAL ;
    pVBInfo->CHTVVCLKOPAL = XGI330_CHTVVCLKOPAL ;

    /* 310 customization related */
    if ( ( pVBInfo->VBType & VB_XGI301LV ) || ( pVBInfo->VBType & VB_XGI302LV ) )
        pVBInfo->LCDCapList = XGI_LCDDLCapList ;
    else
        pVBInfo->LCDCapList = XGI_LCDCapList ;

    if ( ( ChipType == XG21 ) || ( ChipType == XG27 ) )
        pVBInfo->XG21_LVDSCapList = XGI21_LCDCapList ;

    pVBInfo->XGI_TVDelayList = XGI301TVDelayList ;
    pVBInfo->XGI_TVDelayList2 = XGI301TVDelayList2 ;


    pVBInfo->pXGINew_I2CDefinition = &XG40_I2CDefinition ;

    if ( ChipType >= XG20 )
    	pVBInfo->pXGINew_CR97 = &XG20_CR97 ;

    if ( ChipType == XG27 )
    {
	pVBInfo->MCLKData = (struct XGI_MCLKDataStruct *) XGI27New_MCLKData;
        pVBInfo->CR40 = XGI27_cr41 ;
    	pVBInfo->pXGINew_CR97 = &XG27_CR97 ;
    	pVBInfo->pSR36 = &XG27_SR36 ;
    	pVBInfo->pCR8F = &XG27_CR8F ;
    	pVBInfo->pCRD0 = XG27_CRD0 ;
    	pVBInfo->pCRDE = XG27_CRDE ;
    	pVBInfo->pSR40 = &XG27_SR40 ;
    	pVBInfo->pSR41 = &XG27_SR41 ;

    }

    if ( ChipType >= XG20 )
    {
    	pVBInfo->pDVOSetting = &XG21_DVOSetting ;
    	pVBInfo->pCR2E = &XG21_CR2E ;
    	pVBInfo->pCR2F = &XG21_CR2F ;
    	pVBInfo->pCR46 = &XG21_CR46 ;
    	pVBInfo->pCR47 = &XG21_CR47 ;
    }

}






/* --------------------------------------------------------------------- */
/* Function : XGISetModeNew */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
unsigned char XGISetModeNew(struct xgi_hw_device_info *HwDeviceExtension,
			    unsigned short ModeNo)
{
    unsigned short ModeIdIndex ;
        /* unsigned char *pVBInfo->FBAddr = HwDeviceExtension->pjVideoMemoryAddress ; */
    struct vb_device_info VBINF;
    struct vb_device_info *pVBInfo = &VBINF;
    pVBInfo->ROMAddr = HwDeviceExtension->pjVirtualRomBase ;
    pVBInfo->BaseAddr = (unsigned long)HwDeviceExtension->pjIOAddress ;
    pVBInfo->IF_DEF_LVDS = 0 ;
    pVBInfo->IF_DEF_CH7005 = 0 ;
    pVBInfo->IF_DEF_LCDA = 1 ;
    pVBInfo->IF_DEF_CH7017 = 0 ;
    pVBInfo->IF_DEF_CH7007 = 0 ;                                /* [Billy] 2007/05/14 */
    pVBInfo->IF_DEF_VideoCapture = 0 ;
    pVBInfo->IF_DEF_ScaleLCD = 0 ;
    pVBInfo->IF_DEF_OEMUtil = 0 ;
    pVBInfo->IF_DEF_PWD = 0 ;


    if ( HwDeviceExtension->jChipType >= XG20 )			/* kuku 2004/06/25 */
    {
    	pVBInfo->IF_DEF_YPbPr = 0 ;
        pVBInfo->IF_DEF_HiVision = 0 ;
        pVBInfo->IF_DEF_CRT2Monitor = 0 ;
        pVBInfo->VBType = 0 ;  /*set VBType default 0*/
    }
    else if ( HwDeviceExtension->jChipType >= XG40 )
    {
        pVBInfo->IF_DEF_YPbPr = 1 ;
        pVBInfo->IF_DEF_HiVision = 1 ;
        pVBInfo->IF_DEF_CRT2Monitor = 1 ;
    }
    else
    {
        pVBInfo->IF_DEF_YPbPr = 1 ;
        pVBInfo->IF_DEF_HiVision = 1 ;
        pVBInfo->IF_DEF_CRT2Monitor = 0 ;
    }

    pVBInfo->P3c4 = pVBInfo->BaseAddr + 0x14 ;
    pVBInfo->P3d4 = pVBInfo->BaseAddr + 0x24 ;
    pVBInfo->P3c0 = pVBInfo->BaseAddr + 0x10 ;
    pVBInfo->P3ce = pVBInfo->BaseAddr + 0x1e ;
    pVBInfo->P3c2 = pVBInfo->BaseAddr + 0x12 ;
    pVBInfo->P3cc = pVBInfo->BaseAddr + 0x1C ;
    pVBInfo->P3ca = pVBInfo->BaseAddr + 0x1a ;
    pVBInfo->P3c6 = pVBInfo->BaseAddr + 0x16 ;
    pVBInfo->P3c7 = pVBInfo->BaseAddr + 0x17 ;
    pVBInfo->P3c8 = pVBInfo->BaseAddr + 0x18 ;
    pVBInfo->P3c9 = pVBInfo->BaseAddr + 0x19 ;
    pVBInfo->P3da = pVBInfo->BaseAddr + 0x2A ;
    pVBInfo->Part0Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_00 ;
    pVBInfo->Part1Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_04 ;
    pVBInfo->Part2Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_10 ;
    pVBInfo->Part3Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_12 ;
    pVBInfo->Part4Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_14 ;
    pVBInfo->Part5Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_14 + 2 ;

    if ( HwDeviceExtension->jChipType == XG21 )  /* for x86 Linux, XG21 LVDS */
    {
        if ( ( XGINew_GetReg1( pVBInfo->P3d4 , 0x38 ) & 0xE0 ) == 0xC0 )
        {
            pVBInfo->IF_DEF_LVDS = 1 ;
        }
    }
    if ( HwDeviceExtension->jChipType == XG27 )
    {
        if ( ( XGINew_GetReg1( pVBInfo->P3d4 , 0x38 ) & 0xE0 ) == 0xC0 )
        {
          if ( XGINew_GetReg1( pVBInfo->P3d4 , 0x30 ) & 0x20 )
          {
            pVBInfo->IF_DEF_LVDS = 1 ;
          }
        }
    }

    if ( HwDeviceExtension->jChipType < XG20 )			/* kuku 2004/06/25 */
    XGI_GetVBType( pVBInfo ) ;

    InitTo330Pointer( HwDeviceExtension->jChipType, pVBInfo ) ;
    if ( ModeNo & 0x80 )
    {
        ModeNo = ModeNo & 0x7F ;
/* XGINew_flag_clearbuffer = 0 ; */
    }
/*    else
    {
        XGINew_flag_clearbuffer = 1 ;
    }
*/
    XGINew_SetReg1( pVBInfo->P3c4 , 0x05 , 0x86 ) ;

    if ( HwDeviceExtension->jChipType < XG20 )			/* kuku 2004/06/25 1.Openkey */
    XGI_UnLockCRT2( HwDeviceExtension , pVBInfo ) ;

    XGI_SearchModeID( ModeNo , &ModeIdIndex, pVBInfo ) ;

    XGI_GetVGAType(HwDeviceExtension,  pVBInfo) ;

    if ( HwDeviceExtension->jChipType < XG20 )			/* kuku 2004/06/25 */
    {
        XGI_GetVBInfo(ModeNo , ModeIdIndex , HwDeviceExtension, pVBInfo ) ;
        XGI_GetTVInfo(ModeNo , ModeIdIndex, pVBInfo ) ;
        XGI_GetLCDInfo(ModeNo , ModeIdIndex, pVBInfo ) ;
        XGI_DisableBridge( HwDeviceExtension,pVBInfo ) ;
/*        XGI_OpenCRTC( HwDeviceExtension, pVBInfo ) ; */

        if ( pVBInfo->VBInfo & ( SetSimuScanMode | SetCRT2ToLCDA ) )
        {
            XGI_SetCRT1Group(HwDeviceExtension , ModeNo , ModeIdIndex, pVBInfo ) ;

            if ( pVBInfo->VBInfo & SetCRT2ToLCDA )
            {
                XGI_SetLCDAGroup(ModeNo , ModeIdIndex , HwDeviceExtension, pVBInfo ) ;
            }
        }
        else
        {
            if ( !( pVBInfo->VBInfo & SwitchToCRT2) )
            {
                XGI_SetCRT1Group( HwDeviceExtension , ModeNo , ModeIdIndex, pVBInfo ) ;
                if ( pVBInfo->VBInfo & SetCRT2ToLCDA )
                {
                    XGI_SetLCDAGroup( ModeNo , ModeIdIndex , HwDeviceExtension, pVBInfo ) ;
                }
            }
        }

        if ( pVBInfo->VBInfo & ( SetSimuScanMode | SwitchToCRT2 ) )
        {
            switch( HwDeviceExtension->ujVBChipID )
            {
                case VB_CHIP_301:
                    XGI_SetCRT2Group301( ModeNo , HwDeviceExtension, pVBInfo ) ;		/*add for CRT2 */
                    break ;

                case VB_CHIP_302:
                    XGI_SetCRT2Group301(ModeNo , HwDeviceExtension, pVBInfo ) ;		/*add for CRT2 */
                    break ;

                default:
                    break ;
            }
        }

        XGI_SetCRT2ModeRegs( ModeNo, HwDeviceExtension,pVBInfo ) ;
        XGI_OEM310Setting( ModeNo, ModeIdIndex,pVBInfo ) ; /*0212*/
        XGI_CloseCRTC( HwDeviceExtension, pVBInfo ) ;
        XGI_EnableBridge( HwDeviceExtension ,pVBInfo) ;
    }	/* !XG20 */
    else
    {
	    if (pVBInfo->IF_DEF_LVDS == 1)
		    if (!XGI_XG21CheckLVDSMode(ModeNo , ModeIdIndex, pVBInfo))
			    return 0;

        if ( ModeNo <= 0x13 )
        {
            pVBInfo->ModeType = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag & ModeInfoFlag;
        }
        else
        {
            pVBInfo->ModeType = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag & ModeInfoFlag;
        }

    	pVBInfo->SetFlag = 0 ;
        if ( pVBInfo->IF_DEF_CH7007 != 1 )
        {
    	    pVBInfo->VBInfo = DisableCRT2Display ;
        }


    	XGI_DisplayOff(HwDeviceExtension, pVBInfo) ;

    	XGI_SetCRT1Group(HwDeviceExtension , ModeNo , ModeIdIndex, pVBInfo ) ;

    	XGI_DisplayOn( HwDeviceExtension, pVBInfo ) ;
    	/*
    	if( HwDeviceExtension->jChipType == XG21 )
    	  XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x09 , ~0x80 , 0x80 ) ;
    	*/
    }


/*
    if ( ModeNo <= 0x13 )
    {
        modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ;
    }
    else
    {
        modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ;
    }
    pVBInfo->ModeType = modeflag&ModeInfoFlag ;
    pVBInfo->SetFlag = 0x00 ;
    pVBInfo->VBInfo = DisableCRT2Display ;
    temp = XGINew_CheckMemorySize(  HwDeviceExtension , ModeNo , ModeIdIndex, pVBInfo ) ;

    if ( temp == 0 )
        return( 0 ) ;

    XGI_DisplayOff( HwDeviceExtension, pVBInfo) ;
    XGI_SetCRT1Group( HwDeviceExtension , ModeNo , ModeIdIndex, pVBInfo ) ;
    XGI_DisplayOn( HwDeviceExtension, pVBInfo) ;
*/

    XGI_UpdateModeInfo( HwDeviceExtension, pVBInfo ) ;

    if ( HwDeviceExtension->jChipType < XG20 )			/* kuku 2004/06/25 */
{
    XGI_LockCRT2( HwDeviceExtension, pVBInfo ) ;
}

    return 1;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_SetCRT1Group */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_SetCRT1Group(struct xgi_hw_device_info *HwDeviceExtension,
		      unsigned short ModeNo,
		      unsigned short ModeIdIndex, struct vb_device_info *pVBInfo)
{
    unsigned short StandTableIndex ,
           RefreshRateTableIndex ,
           b3CC ,
           temp ;

    unsigned short XGINew_P3cc =  pVBInfo->P3cc;

    /* XGINew_CRT1Mode = ModeNo ; // SaveModeID */
    StandTableIndex = XGI_GetModePtr( ModeNo , ModeIdIndex, pVBInfo ) ;
    /* XGI_SetBIOSData(ModeNo , ModeIdIndex ) ; */
    /* XGI_ClearBankRegs( ModeNo , ModeIdIndex ) ; */
    XGI_SetSeqRegs( ModeNo , StandTableIndex , ModeIdIndex, pVBInfo ) ;
    XGI_SetMiscRegs( StandTableIndex,  pVBInfo ) ;
    XGI_SetCRTCRegs( HwDeviceExtension , StandTableIndex,  pVBInfo) ;
    XGI_SetATTRegs( ModeNo , StandTableIndex , ModeIdIndex, pVBInfo ) ;
    XGI_SetGRCRegs(  StandTableIndex, pVBInfo ) ;
    XGI_ClearExt1Regs(pVBInfo) ;

/* if ( pVBInfo->IF_DEF_ExpLink ) */
    if ( HwDeviceExtension->jChipType == XG27 )
    {
      if ( pVBInfo->IF_DEF_LVDS == 0 )
      {
        XGI_SetDefaultVCLK( pVBInfo ) ;
      }
    }

    temp = ~ProgrammingCRT2 ;
    pVBInfo->SetFlag &= temp ;
    pVBInfo->SelectCRT2Rate = 0 ;

    if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
    {
        if ( pVBInfo->VBInfo & ( SetSimuScanMode | SetCRT2ToLCDA | SetInSlaveMode ) )
        {
            pVBInfo->SetFlag |= ProgrammingCRT2 ;
         }
    }

    RefreshRateTableIndex = XGI_GetRatePtrCRT2( HwDeviceExtension, ModeNo , ModeIdIndex, pVBInfo ) ;
    if ( RefreshRateTableIndex != 0xFFFF )
    {
        XGI_SetSync( RefreshRateTableIndex, pVBInfo ) ;
        XGI_SetCRT1CRTC( ModeNo , ModeIdIndex , RefreshRateTableIndex, pVBInfo, HwDeviceExtension ) ;
        XGI_SetCRT1DE( HwDeviceExtension , ModeNo , ModeIdIndex , RefreshRateTableIndex, pVBInfo ) ;
        XGI_SetCRT1Offset( ModeNo , ModeIdIndex , RefreshRateTableIndex , HwDeviceExtension, pVBInfo ) ;
        XGI_SetCRT1VCLK( ModeNo , ModeIdIndex , HwDeviceExtension , RefreshRateTableIndex, pVBInfo ) ;
    }

    if ( ( HwDeviceExtension->jChipType >= XG20 )&&
         ( HwDeviceExtension->jChipType < XG27 ) ) /* fix H/W DCLK/2 bug */
    {
    	if ( ( ModeNo == 0x00 ) | (ModeNo == 0x01) )
    	{
    	    XGINew_SetReg1( pVBInfo->P3c4 , 0x2B , 0x4E) ;
    	    XGINew_SetReg1( pVBInfo->P3c4 , 0x2C , 0xE9) ;
	    b3CC = (unsigned char) XGINew_GetReg2(XGINew_P3cc) ;
    	    XGINew_SetReg3(XGINew_P3cc ,  (b3CC |= 0x0C) ) ;
    	}
    	else if ( ( ModeNo == 0x04) | ( ModeNo == 0x05) | ( ModeNo == 0x0D) )
    	{
    	    XGINew_SetReg1( pVBInfo->P3c4 , 0x2B , 0x1B) ;
    	    XGINew_SetReg1( pVBInfo->P3c4 , 0x2C , 0xE3) ;
	    b3CC = (unsigned char)XGINew_GetReg2(XGINew_P3cc) ;
    	    XGINew_SetReg3(XGINew_P3cc ,  (b3CC |= 0x0C) ) ;
    	}
    }

    if ( HwDeviceExtension->jChipType >= XG21 )
    {
      temp = XGINew_GetReg1( pVBInfo->P3d4 , 0x38 ) ;
      if ( temp & 0xA0 )
      {

        /*XGINew_SetRegAND( pVBInfo->P3d4 , 0x4A , ~0x20 ) ;*/	/* Enable write GPIOF */
        /*XGINew_SetRegAND( pVBInfo->P3d4 , 0x48 , ~0x20 ) ;*/ 	/* P. DWN */
        /* XG21 CRT1 Timing */
        if ( HwDeviceExtension->jChipType == XG27 )
          XGI_SetXG27CRTC( ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo );
        else
        XGI_SetXG21CRTC( ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo );

        XGI_UpdateXG21CRTC( ModeNo , pVBInfo , RefreshRateTableIndex) ;

        if ( HwDeviceExtension->jChipType == XG27 )
          XGI_SetXG27LCD( pVBInfo , RefreshRateTableIndex , ModeNo );
        else
          XGI_SetXG21LCD( pVBInfo , RefreshRateTableIndex , ModeNo );

        if ( pVBInfo->IF_DEF_LVDS == 1 )
        {
          if ( HwDeviceExtension->jChipType == XG27 )
            XGI_SetXG27LVDSPara(ModeNo,ModeIdIndex, pVBInfo );
          else
            XGI_SetXG21LVDSPara(ModeNo,ModeIdIndex, pVBInfo );
        }
        /*XGINew_SetRegOR( pVBInfo->P3d4 , 0x48 , 0x20 ) ;*/	/* P. ON */
      }
    }

    pVBInfo->SetFlag &= ( ~ProgrammingCRT2 ) ;
    XGI_SetCRT1FIFO(  ModeNo , HwDeviceExtension,  pVBInfo ) ;
    XGI_SetCRT1ModeRegs(  HwDeviceExtension , ModeNo , ModeIdIndex , RefreshRateTableIndex , pVBInfo) ;


    /* XGI_LoadCharacter(); //dif ifdef TVFont */

    XGI_LoadDAC( ModeNo , ModeIdIndex, pVBInfo ) ;
    /* XGI_ClearBuffer( HwDeviceExtension , ModeNo, pVBInfo ) ; */
}


/* --------------------------------------------------------------------- */
/* Function : XGI_GetModePtr */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
unsigned char XGI_GetModePtr(unsigned short ModeNo, unsigned short ModeIdIndex,
		     struct vb_device_info *pVBInfo)
{
    unsigned char index ;

    if ( ModeNo <= 0x13 )
        index = pVBInfo->SModeIDTable[ ModeIdIndex ].St_StTableIndex ;
    else
    {
        if ( pVBInfo->ModeType <= 0x02 )
            index = 0x1B ;	/* 02 -> ModeEGA */
        else
            index = 0x0F ;
    }
    return( index ) ;		/* Get pVBInfo->StandTable index */
}


/* --------------------------------------------------------------------- */
/* Function : XGI_SetBIOSData */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
/*unsigned char XGI_SetBIOSData(unsigned short ModeNo, unsigned short ModeIdIndex)
{
    return( 0 ) ;
}
*/

/* --------------------------------------------------------------------- */
/* Function : XGI_ClearBankRegs */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
/*unsigned char XGI_ClearBankRegs(unsigned short ModeNo, unsigned short ModeIdIndex)
{
    return( 0 ) ;
}
*/

/* --------------------------------------------------------------------- */
/* Function : XGI_SetSeqRegs */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_SetSeqRegs(unsigned short ModeNo, unsigned short StandTableIndex,
		    unsigned short ModeIdIndex, struct vb_device_info *pVBInfo)
{
    unsigned char tempah ,
          SRdata ;

    unsigned short i ,
           modeflag ;

    if ( ModeNo <= 0x13 )
        modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ;
    else
        modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ;

    XGINew_SetReg1( pVBInfo->P3c4 , 0x00 , 0x03 ) ;		/* Set SR0 */
    tempah=pVBInfo->StandTable[ StandTableIndex ].SR[ 0 ] ;

    i = SetCRT2ToLCDA ;
    if ( pVBInfo->VBInfo & SetCRT2ToLCDA )
    {
        tempah |= 0x01 ;
    }
    else
    {
        if ( pVBInfo->VBInfo & ( SetCRT2ToTV | SetCRT2ToLCD ) )
        {
            if ( pVBInfo->VBInfo & SetInSlaveMode )
                tempah |= 0x01 ;
        }
    }

    tempah |= 0x20 ;		/* screen off */
    XGINew_SetReg1( pVBInfo->P3c4 , 0x01 , tempah ) ;		/* Set SR1 */

    for( i = 02 ; i <= 04 ; i++ )
    {
        SRdata = pVBInfo->StandTable[ StandTableIndex ].SR[ i - 1 ] ;	/* Get SR2,3,4 from file */
        XGINew_SetReg1( pVBInfo->P3c4 , i , SRdata ) ;				/* Set SR2 3 4 */
    }
}


/* --------------------------------------------------------------------- */
/* Function : XGI_SetMiscRegs */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_SetMiscRegs(unsigned short StandTableIndex, struct vb_device_info *pVBInfo)
{
    unsigned char Miscdata ;

    Miscdata = pVBInfo->StandTable[ StandTableIndex ].MISC ;	/* Get Misc from file */
/*
    if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
    {
        if ( pVBInfo->VBInfo & SetCRT2ToLCDA )
        {
            Miscdata |= 0x0C ;
        }
    }
*/

    XGINew_SetReg3( pVBInfo->P3c2 , Miscdata ) ;		/* Set Misc(3c2) */
}


/* --------------------------------------------------------------------- */
/* Function : XGI_SetCRTCRegs */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_SetCRTCRegs(struct xgi_hw_device_info *HwDeviceExtension,
		     unsigned short StandTableIndex, struct vb_device_info *pVBInfo)
{
    unsigned char CRTCdata ;
    unsigned short i ;

    CRTCdata = (unsigned char)XGINew_GetReg1(pVBInfo->P3d4, 0x11);
    CRTCdata &= 0x7f ;
    XGINew_SetReg1( pVBInfo->P3d4 , 0x11 , CRTCdata ) ;		/* Unlock CRTC */

    for( i = 0 ; i <= 0x18 ; i++ )
    {
        CRTCdata = pVBInfo->StandTable[ StandTableIndex ].CRTC[ i ] ;	/* Get CRTC from file */
        XGINew_SetReg1( pVBInfo->P3d4 , i , CRTCdata ) ;				/* Set CRTC( 3d4 ) */
    }
/*
    if ( ( HwDeviceExtension->jChipType == XGI_630 )&& ( HwDeviceExtension->jChipRevision == 0x30 ) )
    {
        if ( pVBInfo->VBInfo & SetInSlaveMode )
        {
            if ( pVBInfo->VBInfo & ( SetCRT2ToLCD | SetCRT2ToTV ) )
            {
                XGINew_SetReg1( pVBInfo->P3d4 , 0x18 , 0xFE ) ;
            }
        }
    }
*/
}


/* --------------------------------------------------------------------- */
/* Function : */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_SetATTRegs(unsigned short ModeNo, unsigned short StandTableIndex,
		    unsigned short ModeIdIndex, struct vb_device_info *pVBInfo)
{
    unsigned char ARdata ;
    unsigned short i, modeflag;

    if ( ModeNo <= 0x13 )
        modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ;
    else
        modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ;

    for( i = 0 ; i <= 0x13 ; i++ )
    {
        ARdata = pVBInfo->StandTable[ StandTableIndex ].ATTR[ i ] ;
        if ( modeflag & Charx8Dot )	/* ifndef Dot9 */
        {
            if ( i == 0x13 )
            {
                if ( pVBInfo->VBInfo & SetCRT2ToLCDA )
                    ARdata = 0 ;
                else
                {
                    if ( pVBInfo->VBInfo & ( SetCRT2ToTV | SetCRT2ToLCD ) )
                    {
                        if ( pVBInfo->VBInfo & SetInSlaveMode )
                            ARdata = 0 ;
                    }
                }
            }
        }

        XGINew_GetReg2( pVBInfo->P3da ) ;			/* reset 3da */
        XGINew_SetReg3( pVBInfo->P3c0 , i ) ;		/* set index */
        XGINew_SetReg3( pVBInfo->P3c0 , ARdata ) ;	/* set data */
    }

    XGINew_GetReg2( pVBInfo->P3da ) ;			/* reset 3da */
    XGINew_SetReg3( pVBInfo->P3c0 , 0x14 ) ;		/* set index */
    XGINew_SetReg3( pVBInfo->P3c0 , 0x00 ) ;		/* set data */
    XGINew_GetReg2( pVBInfo->P3da ) ;			/* Enable Attribute */
    XGINew_SetReg3( pVBInfo->P3c0 , 0x20 ) ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_SetGRCRegs */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_SetGRCRegs(unsigned short StandTableIndex, struct vb_device_info *pVBInfo)
{
    unsigned char GRdata ;
    unsigned short i ;

    for( i = 0 ; i <= 0x08 ; i++ )
    {
        GRdata = pVBInfo->StandTable[ StandTableIndex ].GRC[ i ] ;	/* Get GR from file */
        XGINew_SetReg1( pVBInfo->P3ce , i , GRdata ) ;			/* Set GR(3ce) */
    }

    if ( pVBInfo->ModeType > ModeVGA )
    {
	GRdata = (unsigned char)XGINew_GetReg1(pVBInfo->P3ce, 0x05);
        GRdata &= 0xBF ;						/* 256 color disable */
        XGINew_SetReg1( pVBInfo->P3ce , 0x05 , GRdata ) ;
    }
}


/* --------------------------------------------------------------------- */
/* Function : XGI_ClearExt1Regs */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_ClearExt1Regs(struct vb_device_info *pVBInfo)
{
    unsigned short i ;

    for( i = 0x0A ; i <= 0x0E ; i++ )
        XGINew_SetReg1( pVBInfo->P3c4 , i , 0x00 ) ;	/* Clear SR0A-SR0E */
}


/* --------------------------------------------------------------------- */
/* Function : XGI_SetDefaultVCLK */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
unsigned char XGI_SetDefaultVCLK(struct vb_device_info *pVBInfo)
{

    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x31 , ~0x30 , 0x20 ) ;
    XGINew_SetReg1( pVBInfo->P3c4 , 0x2B , pVBInfo->VCLKData[ 0 ].SR2B ) ;
    XGINew_SetReg1( pVBInfo->P3c4 , 0x2C , pVBInfo->VCLKData[ 0 ].SR2C ) ;

    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x31 , ~0x30 , 0x10 ) ;
    XGINew_SetReg1( pVBInfo->P3c4 , 0x2B , pVBInfo->VCLKData[ 1 ].SR2B ) ;
    XGINew_SetReg1( pVBInfo->P3c4 , 0x2C , pVBInfo->VCLKData[ 1 ].SR2C ) ;

    XGINew_SetRegAND( pVBInfo->P3c4 , 0x31 , ~0x30 ) ;
    return( 0 ) ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_GetRatePtrCRT2 */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
unsigned short XGI_GetRatePtrCRT2(struct xgi_hw_device_info *pXGIHWDE,
				  unsigned short ModeNo,
				  unsigned short ModeIdIndex,
				  struct vb_device_info *pVBInfo)
{
    short LCDRefreshIndex[] = { 0x00 , 0x00 , 0x03 , 0x01 } ,
           LCDARefreshIndex[] = { 0x00 , 0x00 , 0x03 , 0x01 , 0x01 , 0x01 , 0x01 } ;

    unsigned short RefreshRateTableIndex, i, modeflag, index, temp;

    if ( ModeNo <= 0x13 )
    {
        modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ;
    }
    else
    {
        modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ;
    }

    if ( pVBInfo->IF_DEF_CH7005 == 1 )
    {
        if ( pVBInfo->VBInfo & SetCRT2ToTV )
        {
            if ( modeflag & HalfDCLK )
                return( 0 ) ;
        }
    }

    if ( ModeNo < 0x14 )
        return( 0xFFFF ) ;

    index = XGINew_GetReg1( pVBInfo->P3d4 , 0x33 ) ;
    index = index >> pVBInfo->SelectCRT2Rate ;
    index &= 0x0F ;

    if ( pVBInfo->LCDInfo & LCDNonExpanding )
        index = 0 ;

    if ( index > 0 )
        index-- ;

    if ( pVBInfo->SetFlag & ProgrammingCRT2 )
    {
        if ( pVBInfo->IF_DEF_CH7005 == 1 )
        {
            if ( pVBInfo->VBInfo & SetCRT2ToTV )
            {
                index = 0 ;
            }
        }

        if ( pVBInfo->VBInfo & ( SetCRT2ToLCD | SetCRT2ToLCDA ) )
        {
            if( pVBInfo->IF_DEF_LVDS == 0 )
            {
                if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
                    temp = LCDARefreshIndex[ pVBInfo->LCDResInfo & 0x0F ] ;     /* 301b */
                else
                    temp = LCDRefreshIndex[ pVBInfo->LCDResInfo & 0x0F ] ;

                if ( index > temp )
                {
                    index = temp ;
                }
            }
            else
            {
                index = 0 ;
            }
        }
    }

    RefreshRateTableIndex = pVBInfo->EModeIDTable[ ModeIdIndex ].REFindex ;
    ModeNo = pVBInfo->RefIndex[ RefreshRateTableIndex ].ModeID ;
    if ( pXGIHWDE->jChipType >= XG20 )  /* for XG20, XG21, XG27 */
    {
      /*
      if ( pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_InfoFlag & XG2xNotSupport )
      {
        index++;
      }
      */
      if ( ( pVBInfo->RefIndex[ RefreshRateTableIndex ].XRes == 800 ) &&
           ( pVBInfo->RefIndex[ RefreshRateTableIndex ].YRes == 600 ) )
      {
        index++;
      }
/* Alan 10/19/2007; do the similiar adjustment like XGISearchCRT1Rate() */
      if ( ( pVBInfo->RefIndex[ RefreshRateTableIndex ].XRes == 1024 ) &&
           ( pVBInfo->RefIndex[ RefreshRateTableIndex ].YRes == 768 ) )
      {
        index++;
      }
      if ( ( pVBInfo->RefIndex[ RefreshRateTableIndex ].XRes == 1280 ) &&
           ( pVBInfo->RefIndex[ RefreshRateTableIndex ].YRes == 1024 ) )
      {
        index++;
      }
    }

    i = 0 ;
    do
    {
        if ( pVBInfo->RefIndex[ RefreshRateTableIndex + i ].ModeID != ModeNo )
            break ;
        temp = pVBInfo->RefIndex[ RefreshRateTableIndex + i ].Ext_InfoFlag ;
        temp &= ModeInfoFlag ;
        if ( temp < pVBInfo->ModeType )
            break ;
        i++ ;
        index-- ;

    } while( index != 0xFFFF ) ;
    if ( !( pVBInfo->VBInfo & SetCRT2ToRAMDAC ) )
    {
        if ( pVBInfo->VBInfo & SetInSlaveMode )
        {
            temp = pVBInfo->RefIndex[ RefreshRateTableIndex + i - 1 ].Ext_InfoFlag ;
            if ( temp & InterlaceMode )
            {
                i++ ;
            }
        }
    }
    i-- ;
    if ( ( pVBInfo->SetFlag & ProgrammingCRT2 ) )
    {
        temp = XGI_AjustCRT2Rate( ModeNo , ModeIdIndex , RefreshRateTableIndex , &i, pVBInfo) ;
    }
    return( RefreshRateTableIndex + i ) ;                /*return(0x01|(temp1<<1));   */
}


/* --------------------------------------------------------------------- */
/* Function : XGI_AjustCRT2Rate */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
unsigned char XGI_AjustCRT2Rate(unsigned short ModeNo, unsigned short ModeIdIndex,
				unsigned short RefreshRateTableIndex,
				unsigned short *i, struct vb_device_info *pVBInfo)
{
    unsigned short tempax, tempbx, resinfo, modeflag, infoflag;

    if ( ModeNo <= 0x13 )
    {
        modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ;	/* si+St_ModeFlag */
    }
    else
    {
        modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ;
    }

    resinfo = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_RESINFO ;
    tempbx = pVBInfo->RefIndex[ RefreshRateTableIndex + ( *i ) ].ModeID ;
    tempax = 0 ;

    if ( pVBInfo->IF_DEF_LVDS == 0 )
    {
        if ( pVBInfo->VBInfo & SetCRT2ToRAMDAC )
        {
            tempax |= SupportRAMDAC2 ;

            if ( pVBInfo->VBType & VB_XGI301C )
                tempax |= SupportCRT2in301C ;
        }

        if ( pVBInfo->VBInfo & ( SetCRT2ToLCD | SetCRT2ToLCDA ) )	/* 301b */
        {
            tempax |= SupportLCD ;

            if ( pVBInfo->LCDResInfo != Panel1280x1024 )
            {
                if ( pVBInfo->LCDResInfo != Panel1280x960 )
                {
                    if ( pVBInfo->LCDInfo & LCDNonExpanding )
                    {
                        if ( resinfo >= 9 )
                        {
                            tempax = 0 ;
                            return( 0 ) ;
                        }
                    }
                }
            }
        }

        if ( pVBInfo->VBInfo & SetCRT2ToHiVisionTV )	/* for HiTV */
        {
            if ( ( pVBInfo->VBType & VB_XGI301LV ) && ( pVBInfo->VBExtInfo == VB_YPbPr1080i ) )
            {
                tempax |= SupportYPbPr ;
                if ( pVBInfo->VBInfo & SetInSlaveMode )
                {
                    if ( resinfo == 4 )
                        return( 0 ) ;

                    if ( resinfo == 3 )
                        return( 0 ) ;

                    if ( resinfo > 7 )
                        return( 0 ) ;
                }
            }
            else
            {
                tempax |= SupportHiVisionTV ;
                if ( pVBInfo->VBInfo & SetInSlaveMode )
                {
                    if ( resinfo == 4 )
                        return( 0 ) ;

                    if ( resinfo == 3 )
                    {
                        if ( pVBInfo->SetFlag & TVSimuMode )
                            return( 0 ) ;
                    }

                    if ( resinfo > 7 )
                        return( 0 ) ;
                }
            }
        }
        else
        {
            if ( pVBInfo->VBInfo & ( SetCRT2ToAVIDEO | SetCRT2ToSVIDEO | SetCRT2ToSCART | SetCRT2ToYPbPr | SetCRT2ToHiVisionTV ) )
            {
                tempax |= SupportTV ;

                if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
                {
                    tempax |= SupportTV1024 ;
                }

                if ( !( pVBInfo->VBInfo & SetPALTV ) )
                {
                    if ( modeflag & NoSupportSimuTV )
                    {
                        if ( pVBInfo->VBInfo & SetInSlaveMode )
                        {
                            if ( !( pVBInfo->VBInfo & SetNotSimuMode ) )
                            {
                               return( 0 ) ;
                            }
                        }
                    }
                }
            }
        }
    }
    else		/* for LVDS */
    {
        if ( pVBInfo->IF_DEF_CH7005 == 1 )
        {
            if ( pVBInfo->VBInfo & SetCRT2ToTV )
            {
                tempax |= SupportCHTV ;
            }
        }

        if ( pVBInfo->VBInfo & SetCRT2ToLCD )
        {
            tempax |= SupportLCD ;

            if ( resinfo > 0x08 )
                return( 0 ) ;		/* 1024x768 */

            if ( pVBInfo->LCDResInfo < Panel1024x768 )
            {
                if ( resinfo > 0x07 )
                    return( 0 ) ;	/* 800x600 */

                if ( resinfo == 0x04 )
                    return( 0 ) ;	/* 512x384 */
            }
        }
    }

    for( ; pVBInfo->RefIndex[ RefreshRateTableIndex + ( *i ) ].ModeID == tempbx ; ( *i )-- )
    {
        infoflag = pVBInfo->RefIndex[ RefreshRateTableIndex + ( *i ) ].Ext_InfoFlag ;
        if ( infoflag & tempax )
        {
            return( 1 ) ;
        }
        if ( ( *i ) == 0 )
            break ;
    }

    for( ( *i ) = 0 ; ; ( *i )++ )
    {
        infoflag = pVBInfo->RefIndex[ RefreshRateTableIndex + ( *i ) ].Ext_InfoFlag ;
        if ( pVBInfo->RefIndex[ RefreshRateTableIndex + ( *i ) ].ModeID != tempbx )
        {
            return( 0 ) ;
        }

        if ( infoflag & tempax )
        {
            return( 1 ) ;
        }
    }
    return( 1 ) ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_SetSync */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_SetSync(unsigned short RefreshRateTableIndex, struct vb_device_info *pVBInfo)
{
    unsigned short sync ,
           temp ;

    sync = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_InfoFlag >> 8 ;	/* di+0x00 */
    sync &= 0xC0 ;
    temp = 0x2F ;
    temp |= sync ;
    XGINew_SetReg3( pVBInfo->P3c2 , temp ) ;				/* Set Misc(3c2) */
}


/* --------------------------------------------------------------------- */
/* Function : XGI_SetCRT1CRTC */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_SetCRT1CRTC(unsigned short ModeNo, unsigned short ModeIdIndex,
		     unsigned short RefreshRateTableIndex,
		     struct vb_device_info *pVBInfo,
		     struct xgi_hw_device_info *HwDeviceExtension)
{
    unsigned char index, data;
    unsigned short i;

    index = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_CRT1CRTC ;	/* Get index */
    index = index&IndexMask ;

    data = (unsigned char)XGINew_GetReg1(pVBInfo->P3d4, 0x11);
    data &= 0x7F ;
    XGINew_SetReg1(pVBInfo->P3d4,0x11,data);				/* Unlock CRTC */

    for( i = 0 ; i < 8 ; i++ )
        pVBInfo->TimingH[ 0 ].data[ i ] = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ i ] ;

    for( i = 0 ; i < 7 ; i++ )
        pVBInfo->TimingV[ 0 ].data[ i ] = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ i + 8 ] ;

    XGI_SetCRT1Timing_H( pVBInfo, HwDeviceExtension ) ;



    XGI_SetCRT1Timing_V( ModeIdIndex , ModeNo, pVBInfo ) ;


    if( pVBInfo->ModeType > 0x03 )
        XGINew_SetReg1( pVBInfo->P3d4 , 0x14 , 0x4F ) ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_SetCRT1Timing_H */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_SetCRT1Timing_H(struct vb_device_info *pVBInfo, struct xgi_hw_device_info *HwDeviceExtension)
{
    unsigned char data, data1, pushax;
    unsigned short i, j;

    /* XGINew_SetReg1( pVBInfo->P3d4 , 0x51 , 0 ) ; */
    /* XGINew_SetReg1( pVBInfo->P3d4 , 0x56 , 0 ) ; */
    /* XGINew_SetRegANDOR( pVBInfo->P3d4 ,0x11 , 0x7f , 0x00 ) ; */

    data = (unsigned char)XGINew_GetReg1(pVBInfo->P3d4, 0x11); /* unlock cr0-7 */
    data &= 0x7F ;
    XGINew_SetReg1( pVBInfo->P3d4 , 0x11 , data ) ;

    data = pVBInfo->TimingH[ 0 ].data[ 0 ] ;
    XGINew_SetReg1( pVBInfo->P3d4 , 0 , data ) ;

    for( i = 0x01 ; i <= 0x04 ; i++ )
    {
        data = pVBInfo->TimingH[ 0 ].data[ i ] ;
	XGINew_SetReg1( pVBInfo->P3d4, (unsigned short)(i + 1), data);
    }

    for( i = 0x05 ; i <= 0x06 ; i++ )
    {
        data = pVBInfo->TimingH[ 0 ].data[ i ];
	XGINew_SetReg1(pVBInfo->P3c4, (unsigned short)(i + 6), data);
    }

    j = (unsigned char)XGINew_GetReg1(pVBInfo->P3c4, 0x0e);
    j &= 0x1F ;
    data = pVBInfo->TimingH[ 0 ].data[ 7 ] ;
    data &= 0xE0 ;
    data |= j ;
    XGINew_SetReg1( pVBInfo->P3c4 , 0x0e , data ) ;

    if ( HwDeviceExtension->jChipType >= XG20 )
    {
	data = (unsigned char)XGINew_GetReg1(pVBInfo->P3d4, 0x04);
    	data = data - 1 ;
    	XGINew_SetReg1( pVBInfo->P3d4 , 0x04 , data ) ;
	data = (unsigned char)XGINew_GetReg1(pVBInfo->P3d4, 0x05);
    	data1 = data ;
    	data1 &= 0xE0 ;
    	data &= 0x1F ;
    	if ( data == 0 )
    	{
    	    pushax = data ;
	    data = (unsigned char)XGINew_GetReg1(pVBInfo->P3c4, 0x0c);
    	    data &= 0xFB ;
    	    XGINew_SetReg1( pVBInfo->P3c4 , 0x0c , data ) ;
    	    data = pushax ;
    	}
    	data = data - 1 ;
    	data |= data1 ;
    	XGINew_SetReg1( pVBInfo->P3d4 , 0x05 , data ) ;
	data = (unsigned char)XGINew_GetReg1(pVBInfo->P3c4, 0x0e);
    	data = data >> 5 ;
    	data = data + 3 ;
    	if ( data > 7 )
    	    data = data - 7 ;
    	data = data << 5 ;
    	XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0e , ~0xE0 , data ) ;
    }
}


/* --------------------------------------------------------------------- */
/* Function : XGI_SetCRT1Timing_V */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_SetCRT1Timing_V(unsigned short ModeIdIndex,
			 unsigned short ModeNo,
			 struct vb_device_info *pVBInfo)
{
    unsigned char data;
    unsigned short i, j;

    /* XGINew_SetReg1( pVBInfo->P3d4 , 0x51 , 0 ) ; */
    /* XGINew_SetReg1( pVBInfo->P3d4 , 0x56 , 0 ) ; */
    /* XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x11 , 0x7f , 0x00 ) ; */

    for( i = 0x00 ; i <= 0x01 ; i++ )
    {
        data = pVBInfo->TimingV[ 0 ].data[ i ] ;
	XGINew_SetReg1(pVBInfo->P3d4, (unsigned short)(i + 6), data);
    }

    for( i = 0x02 ; i <= 0x03 ; i++ )
    {
        data = pVBInfo->TimingV[ 0 ].data[ i ] ;
	XGINew_SetReg1(pVBInfo->P3d4, (unsigned short)(i + 0x0e), data);
    }

    for( i = 0x04 ; i <= 0x05 ; i++ )
    {
        data = pVBInfo->TimingV[ 0 ].data[ i ] ;
	XGINew_SetReg1(pVBInfo->P3d4, (unsigned short)(i + 0x11), data);
    }

    j = (unsigned char)XGINew_GetReg1(pVBInfo->P3c4, 0x0a);
    j &= 0xC0 ;
    data = pVBInfo->TimingV[ 0 ].data[ 6 ] ;
    data &= 0x3F ;
    data |= j ;
    XGINew_SetReg1( pVBInfo->P3c4 , 0x0a , data ) ;

    data = pVBInfo->TimingV[ 0 ].data[ 6 ] ;
    data &= 0x80 ;
    data = data >> 2 ;

    if ( ModeNo <= 0x13 )
        i = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ;
    else
        i = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ;

    i &= DoubleScanMode ;
    if ( i )
        data |= 0x80 ;

    j = (unsigned char)XGINew_GetReg1(pVBInfo->P3d4, 0x09);
    j &= 0x5F ;
    data |= j ;
    XGINew_SetReg1( pVBInfo->P3d4 , 0x09 , data ) ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_SetXG21CRTC */
/* Input : Stand or enhance CRTC table */
/* Output : Fill CRT Hsync/Vsync to SR2E/SR2F/SR30/SR33/SR34/SR3F */
/* Description : Set LCD timing */
/* --------------------------------------------------------------------- */
void XGI_SetXG21CRTC(unsigned short ModeNo, unsigned short ModeIdIndex,
		     unsigned short RefreshRateTableIndex,
		     struct vb_device_info *pVBInfo)
{
  unsigned char StandTableIndex, index, Tempax, Tempbx, Tempcx, Tempdx;
  unsigned short Temp1, Temp2, Temp3;

  if ( ModeNo <= 0x13 )
  {
    StandTableIndex = XGI_GetModePtr( ModeNo , ModeIdIndex, pVBInfo ) ;
    Tempax = pVBInfo->StandTable[ StandTableIndex ].CRTC[ 4 ] ;		/* CR04 HRS */
    XGINew_SetReg1( pVBInfo->P3c4 , 0x2E , Tempax ) ;    		/* SR2E [7:0]->HRS */
    Tempbx = pVBInfo->StandTable[ StandTableIndex ].CRTC[ 5 ] ;		/* Tempbx: CR05 HRE */
    Tempbx &= 0x1F ;							/* Tempbx: HRE[4:0] */
    Tempcx = Tempax ;
    Tempcx &=  0xE0 ;							/* Tempcx: HRS[7:5] */
    Tempdx = Tempcx | Tempbx ;						/* Tempdx(HRE): HRS[7:5]HRE[4:0] */
    if ( Tempbx < ( Tempax & 0x1F ) )					/* IF HRE < HRS */
      Tempdx |= 0x20 ;							/* Tempdx: HRE = HRE + 0x20 */
    Tempdx <<= 2 ;							/* Tempdx << 2 */
    XGINew_SetReg1( pVBInfo->P3c4 , 0x2F , Tempdx ) ;    		/* SR2F [7:2]->HRE */
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x30 , 0xE3 , 00 ) ;

    Tempax = pVBInfo->StandTable[ StandTableIndex ].CRTC[ 16 ] ;	/* Tempax: CR16 VRS */
    Tempbx = Tempax ;							/* Tempbx=Tempax */
    Tempax &= 0x01 ;							/* Tempax: VRS[0] */
    XGINew_SetRegOR( pVBInfo->P3c4 , 0x33 , Tempax ) ;   		/* SR33[0]->VRS */
    Tempax = pVBInfo->StandTable[ StandTableIndex ].CRTC[ 7 ] ;		/* Tempax: CR7 VRS */
    Tempdx = Tempbx >> 1 ;						/* Tempdx: VRS[7:1] */
    Tempcx = Tempax & 0x04 ;						/* Tempcx: CR7[2] */
    Tempcx <<= 5 ;							/* Tempcx[7]: VRS[8] */
    Tempdx |= Tempcx ;							/* Tempdx: VRS[8:1] */
    XGINew_SetReg1( pVBInfo->P3c4 , 0x34 , Tempdx ) ;    		/* SR34[7:0]: VRS[8:1] */

    Temp1 = Tempcx << 1 ;						/* Temp1[8]: VRS[8] unsigned char -> unsigned short */
    Temp1 |= Tempbx ;							/* Temp1[8:0]: VRS[8:0] */
    Tempax &= 0x80 ;							/* Tempax[7]: CR7[7] */
    Temp2 = Tempax << 2 ;						/* Temp2[9]: VRS[9] */
    Temp1 |= Temp2 ;							/* Temp1[9:0]: VRS[9:0] */

    Tempax = pVBInfo->StandTable[ StandTableIndex ].CRTC[ 17 ] ;	/* CR16 VRE */
    Tempax &= 0x0F ;							/* Tempax[3:0]: VRE[3:0] */
    Temp2 = Temp1 & 0x3F0 ;						/* Temp2[9:4]: VRS[9:4] */
    Temp2 |= Tempax ;							/* Temp2[9:0]: VRE[9:0] */
    Temp3 = Temp1 & 0x0F ;						/* Temp3[3:0]: VRS[3:0] */
    if ( Tempax < Temp3 )						/* VRE[3:0]<VRS[3:0] */
      Temp2 |= 0x10 ;							/* Temp2: VRE + 0x10 */
    Temp2 &= 0xFF ;							/* Temp2[7:0]: VRE[7:0] */
    Tempax = (unsigned char)Temp2;					/* Tempax[7:0]: VRE[7:0] */
    Tempax <<= 2 ;							/* Tempax << 2: VRE[5:0] */
    Temp1 &= 0x600 ;							/* Temp1[10:9]: VRS[10:9] */
    Temp1 >>= 9 ;							/* [10:9]->[1:0] */
    Tempbx = (unsigned char)Temp1;					/* Tempbx[1:0]: VRS[10:9] */
    Tempax |= Tempbx ;							/* VRE[5:0]VRS[10:9] */
    Tempax &= 0x7F ;
    XGINew_SetReg1( pVBInfo->P3c4 , 0x3F , Tempax ) ;   		/* SR3F D[7:2]->VRE D[1:0]->VRS */
  }
  else
  {
    index = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_CRT1CRTC ;
    Tempax = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 3 ] ;		/* Tempax: CR4 HRS */
    Tempcx = Tempax ;							/* Tempcx: HRS */
    XGINew_SetReg1( pVBInfo->P3c4 , 0x2E , Tempax ) ;  		        /* SR2E[7:0]->HRS */

    Tempdx = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 5 ] ;		/* SRB */
    Tempdx &= 0xC0 ;							/* Tempdx[7:6]: SRB[7:6] */
    Temp1 = Tempdx ;							/* Temp1[7:6]: HRS[9:8] */
    Temp1 <<= 2 ;							/* Temp1[9:8]: HRS[9:8] */
    Temp1 |= Tempax ;							/* Temp1[9:0]: HRS[9:0] */

    Tempax = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 4 ] ;		/* CR5 HRE */
    Tempax &= 0x1F ;							/* Tempax[4:0]: HRE[4:0] */

    Tempbx = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 6 ] ;		/* SRC */
    Tempbx &= 0x04 ;							/* Tempbx[2]: HRE[5] */
    Tempbx <<= 3 ;							/* Tempbx[5]: HRE[5] */
    Tempax |= Tempbx ;							/* Tempax[5:0]: HRE[5:0] */

    Temp2 = Temp1 & 0x3C0 ;						/* Temp2[9:6]: HRS[9:6] */
    Temp2 |= Tempax ;							/* Temp2[9:0]: HRE[9:0] */

    Tempcx &= 0x3F ;							/* Tempcx[5:0]: HRS[5:0] */
    if( Tempax < Tempcx )						/* HRE < HRS */
      Temp2 |= 0x40 ;                                                   /* Temp2 + 0x40 */

    Temp2 &= 0xFF ;
    Tempax = (unsigned char)Temp2;					/* Tempax: HRE[7:0] */
    Tempax <<= 2 ;							/* Tempax[7:2]: HRE[5:0] */
    Tempdx >>= 6 ;							/* Tempdx[7:6]->[1:0] HRS[9:8] */
    Tempax |= Tempdx ;							/* HRE[5:0]HRS[9:8] */
    XGINew_SetReg1( pVBInfo->P3c4 , 0x2F , Tempax ) ;    		/* SR2F D[7:2]->HRE, D[1:0]->HRS */
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x30 , 0xE3 , 00 ) ;

    Tempax = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 10 ] ;		/* CR10 VRS */
    Tempbx = Tempax ;							/* Tempbx: VRS */
    Tempax &= 0x01 ;							/* Tempax[0]: VRS[0] */
    XGINew_SetRegOR( pVBInfo->P3c4 , 0x33 , Tempax ) ;   		/* SR33[0]->VRS[0] */
    Tempax = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 9 ] ;		/* CR7[2][7] VRE */
    Tempcx = Tempbx >> 1 ;				   		/* Tempcx[6:0]: VRS[7:1] */
    Tempdx = Tempax & 0x04 ;						/* Tempdx[2]: CR7[2] */
    Tempdx <<= 5 ;							/* Tempdx[7]: VRS[8] */
    Tempcx |= Tempdx ;							/* Tempcx[7:0]: VRS[8:1] */
    XGINew_SetReg1( pVBInfo->P3c4 , 0x34 , Tempcx ) ;   		/* SR34[8:1]->VRS */

    Temp1 = Tempdx ;							/* Temp1[7]: Tempdx[7] */
    Temp1 <<= 1 ;							/* Temp1[8]: VRS[8] */
    Temp1 |= Tempbx ;							/* Temp1[8:0]: VRS[8:0] */
    Tempax &= 0x80 ;
    Temp2 = Tempax << 2 ;						/* Temp2[9]: VRS[9] */
    Temp1 |= Temp2 ;							/* Temp1[9:0]: VRS[9:0] */
    Tempax = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 14 ] ;		/* Tempax: SRA */
    Tempax &= 0x08 ;							/* Tempax[3]: VRS[3] */
    Temp2 = Tempax ;
    Temp2 <<= 7 ;							/* Temp2[10]: VRS[10] */
    Temp1 |= Temp2 ;							/* Temp1[10:0]: VRS[10:0] */

    Tempax = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 11 ] ;		/* Tempax: CR11 VRE */
    Tempax &= 0x0F ;							/* Tempax[3:0]: VRE[3:0] */
    Tempbx = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 14 ] ;		/* Tempbx: SRA */
    Tempbx &= 0x20 ;							/* Tempbx[5]: VRE[5] */
    Tempbx >>= 1 ;							/* Tempbx[4]: VRE[4] */
    Tempax |= Tempbx ;							/* Tempax[4:0]: VRE[4:0] */
    Temp2 = Temp1 & 0x7E0 ;						/* Temp2[10:5]: VRS[10:5] */
    Temp2 |= Tempax ;							/* Temp2[10:5]: VRE[10:5] */

    Temp3 = Temp1 & 0x1F ;						/* Temp3[4:0]: VRS[4:0] */
    if ( Tempax < Temp3 )						/* VRE < VRS */
      Temp2 |= 0x20 ;							/* VRE + 0x20 */

    Temp2 &= 0xFF ;
    Tempax = (unsigned char)Temp2;					/* Tempax: VRE[7:0] */
    Tempax <<= 2 ;							/* Tempax[7:0]; VRE[5:0]00 */
    Temp1 &= 0x600 ;							/* Temp1[10:9]: VRS[10:9] */
    Temp1 >>= 9 ;  							/* Temp1[1:0]: VRS[10:9] */
    Tempbx = (unsigned char)Temp1;
    Tempax |= Tempbx ;							/* Tempax[7:0]: VRE[5:0]VRS[10:9] */
    Tempax &= 0x7F ;
    XGINew_SetReg1( pVBInfo->P3c4 , 0x3F , Tempax ) ;   		/* SR3F D[7:2]->VRE D[1:0]->VRS */
  }
}

void XGI_SetXG27CRTC(unsigned short ModeNo, unsigned short ModeIdIndex,
		     unsigned short RefreshRateTableIndex,
		     struct vb_device_info *pVBInfo)
{
	unsigned short StandTableIndex, index, Tempax, Tempbx, Tempcx, Tempdx;

  if ( ModeNo <= 0x13 )
  {
    StandTableIndex = XGI_GetModePtr( ModeNo , ModeIdIndex, pVBInfo ) ;
    Tempax = pVBInfo->StandTable[ StandTableIndex ].CRTC[ 4 ] ;		/* CR04 HRS */
    XGINew_SetReg1( pVBInfo->P3c4 , 0x2E , Tempax ) ;    		/* SR2E [7:0]->HRS */
    Tempbx = pVBInfo->StandTable[ StandTableIndex ].CRTC[ 5 ] ;		/* Tempbx: CR05 HRE */
    Tempbx &= 0x1F ;							/* Tempbx: HRE[4:0] */
    Tempcx = Tempax ;
    Tempcx &=  0xE0 ;							/* Tempcx: HRS[7:5] */
    Tempdx = Tempcx | Tempbx ;						/* Tempdx(HRE): HRS[7:5]HRE[4:0] */
    if ( Tempbx < ( Tempax & 0x1F ) )					/* IF HRE < HRS */
      Tempdx |= 0x20 ;							/* Tempdx: HRE = HRE + 0x20 */
    Tempdx <<= 2 ;							/* Tempdx << 2 */
    XGINew_SetReg1( pVBInfo->P3c4 , 0x2F , Tempdx ) ;    		/* SR2F [7:2]->HRE */
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x30 , 0xE3 , 00 ) ;

    Tempax = pVBInfo->StandTable[ StandTableIndex ].CRTC[ 16 ] ;	/* Tempax: CR10 VRS */
    XGINew_SetReg1( pVBInfo->P3c4 , 0x34 , Tempax ) ;   		/* SR34[7:0]->VRS */
    Tempcx = Tempax ;							/* Tempcx=Tempax=VRS[7:0] */
    Tempax = pVBInfo->StandTable[ StandTableIndex ].CRTC[ 7 ] ;		/* Tempax[7][2]: CR7[7][2] VRS[9][8] */
    Tempbx = Tempax ;							/* Tempbx=CR07 */
    Tempax &= 0x04 ;     						/* Tempax[2]: CR07[2] VRS[8] */
    Tempax >>= 2;
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x35 , ~0x01, Tempax ) ;        /* SR35 D[0]->VRS D[8] */
    Tempcx |= (Tempax << 8) ;					        /* Tempcx[8] |= VRS[8] */
    Tempcx |= (Tempbx & 0x80)<<2;					/* Tempcx[9] |= VRS[9] */


    Tempax = pVBInfo->StandTable[ StandTableIndex ].CRTC[ 17 ] ;	/* CR11 VRE */
    Tempax &= 0x0F ;							/* Tempax: VRE[3:0] */
    Tempbx = Tempcx ;							/* Tempbx=Tempcx=VRS[9:0] */
    Tempbx &= 0x3F0 ;    						/* Tempbx[9:4]: VRS[9:4] */
    Tempbx |= Tempax ;							/* Tempbx[9:0]: VRE[9:0] */
    if ( Tempax <= (Tempcx & 0x0F) )					/* VRE[3:0]<=VRS[3:0] */
      Tempbx |= 0x10 ;							/* Tempbx: VRE + 0x10 */
    Tempax = (unsigned char)Tempbx & 0xFF;				/* Tempax[7:0]: VRE[7:0] */
    Tempax <<= 2 ;							/* Tempax << 2: VRE[5:0] */
    Tempcx = (Tempcx&0x600)>>8;                                         /* Tempcx VRS[10:9] */
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x3F , ~0xFC, Tempax ) ;        /* SR3F D[7:2]->VRE D[5:0] */
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x35 , ~0x06, Tempcx ) ;	/* SR35 D[2:1]->VRS[10:9] */
  }
  else
  {
    index = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_CRT1CRTC ;
    Tempax = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 3 ] ;		/* Tempax: CR4 HRS */
    Tempbx = Tempax ;							/* Tempbx: HRS[7:0] */
    XGINew_SetReg1( pVBInfo->P3c4 , 0x2E , Tempax ) ;  		        /* SR2E[7:0]->HRS */

    Tempax = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 5 ] ;		/* SR0B */
    Tempax &= 0xC0 ;							/* Tempax[7:6]: SR0B[7:6]: HRS[9:8]*/
    Tempbx |= (Tempax << 2);					/* Tempbx: HRS[9:0] */

    Tempax = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 4 ] ;		/* CR5 HRE */
    Tempax &= 0x1F ;							/* Tempax[4:0]: HRE[4:0] */
    Tempcx = Tempax ;							/* Tempcx: HRE[4:0] */

    Tempax = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 6 ] ;		/* SRC */
    Tempax &= 0x04 ;							/* Tempax[2]: HRE[5] */
    Tempax <<= 3 ;							    /* Tempax[5]: HRE[5] */
    Tempcx |= Tempax ;							/* Tempcx[5:0]: HRE[5:0] */

    Tempbx = Tempbx & 0x3C0 ;					/* Tempbx[9:6]: HRS[9:6] */
    Tempbx |= Tempcx ;							/* Tempbx: HRS[9:6]HRE[5:0] */

    Tempax = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 3 ] ;		/* Tempax: CR4 HRS */
    Tempax &= 0x3F ;							/* Tempax: HRS[5:0] */
    if( Tempcx <= Tempax )						/* HRE[5:0] < HRS[5:0] */
      Tempbx += 0x40 ;                          /* Tempbx= Tempbx + 0x40 : HRE[9:0]*/

    Tempax = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 5 ] ;		/* SR0B */
    Tempax &= 0xC0 ;							/* Tempax[7:6]: SR0B[7:6]: HRS[9:8]*/
    Tempax >>= 6;                               /* Tempax[1:0]: HRS[9:8]*/
    Tempax |= ((Tempbx << 2) & 0xFF);           /* Tempax[7:2]: HRE[5:0] */
    XGINew_SetReg1( pVBInfo->P3c4 , 0x2F , Tempax ) ;    		/* SR2F [7:2][1:0]: HRE[5:0]HRS[9:8] */
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x30 , 0xE3 , 00 ) ;

    Tempax = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 10 ] ;		/* CR10 VRS */
    XGINew_SetReg1( pVBInfo->P3c4 , 0x34 , Tempax ) ;   		/* SR34[7:0]->VRS[7:0] */

    Tempcx = Tempax ;							/* Tempcx <= VRS[7:0] */
    Tempax = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 9 ] ;		/* CR7[7][2] VRS[9][8] */
    Tempbx = Tempax ;							/* Tempbx <= CR07[7:0] */
    Tempax = Tempax & 0x04 ;					/* Tempax[2]: CR7[2]: VRS[8] */
    Tempax >>= 2 ;							    /* Tempax[0]: VRS[8] */
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x35 , ~0x01 , Tempax ) ;   	/* SR35[0]: VRS[8] */
    Tempcx |= (Tempax<<8) ;						/* Tempcx <= VRS[8:0] */
    Tempcx |= ((Tempbx&0x80)<<2) ;				/* Tempcx <= VRS[9:0] */
    Tempax = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 14 ] ;		/* Tempax: SR0A */
    Tempax &= 0x08;                             /* SR0A[3] VRS[10] */
    Tempcx |= (Tempax<<7) ;        				/* Tempcx <= VRS[10:0] */


    Tempax = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 11 ] ;		/* Tempax: CR11 VRE */
    Tempax &= 0x0F ;							/* Tempax[3:0]: VRE[3:0] */
    Tempbx = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 14 ] ;		/* Tempbx: SR0A */
    Tempbx &= 0x20 ;							/* Tempbx[5]: SR0A[5]: VRE[4] */
    Tempbx >>= 1 ;							    /* Tempbx[4]: VRE[4] */
    Tempax |= Tempbx ;							/* Tempax[4:0]: VRE[4:0] */
    Tempbx = Tempcx ;							/* Tempbx: VRS[10:0] */
    Tempbx &= 0x7E0 ;						    /* Tempbx[10:5]: VRS[10:5] */
    Tempbx |= Tempax ;							/* Tempbx: VRS[10:5]VRE[4:0] */

    if ( Tempbx <= Tempcx )						/* VRE <= VRS */
      Tempbx |= 0x20 ;							/* VRE + 0x20 */

    Tempax = (Tempbx<<2) & 0xFF ;					/* Tempax: Tempax[7:0]; VRE[5:0]00 */
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x3F , ~0xFC , Tempax ) ;	/* SR3F[7:2]:VRE[5:0] */
    Tempax = Tempcx >> 8;
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x35 , ~0x07 , Tempax ) ;	/* SR35[2:0]:VRS[10:8] */
  }
}


/* --------------------------------------------------------------------- */
/* Function : XGI_SetXG21LCD */
/* Input : */
/* Output : FCLK duty cycle, FCLK delay compensation */
/* Description : All values set zero */
/* --------------------------------------------------------------------- */
void XGI_SetXG21LCD(struct vb_device_info *pVBInfo,
		    unsigned short RefreshRateTableIndex,
		    unsigned short ModeNo)
{
	unsigned short Data, Temp, b3CC;
	unsigned short XGI_P3cc;

  XGI_P3cc = pVBInfo->P3cc ;

  XGINew_SetReg1( pVBInfo->P3d4 , 0x2E , 0x00 ) ;
  XGINew_SetReg1( pVBInfo->P3d4 , 0x2F , 0x00 ) ;
  XGINew_SetReg1( pVBInfo->P3d4 , 0x46 , 0x00 ) ;
  XGINew_SetReg1( pVBInfo->P3d4 , 0x47 , 0x00 ) ;
  if ( ((*pVBInfo->pDVOSetting)&0xC0) == 0xC0 )
  {
    XGINew_SetReg1( pVBInfo->P3d4 , 0x2E , *pVBInfo->pCR2E ) ;
    XGINew_SetReg1( pVBInfo->P3d4 , 0x2F , *pVBInfo->pCR2F ) ;
    XGINew_SetReg1( pVBInfo->P3d4 , 0x46 , *pVBInfo->pCR46 ) ;
    XGINew_SetReg1( pVBInfo->P3d4 , 0x47 , *pVBInfo->pCR47 ) ;
  }

  Temp = XGINew_GetReg1( pVBInfo->P3d4 , 0x37 ) ;

  if ( Temp & 0x01 )
  {
    XGINew_SetRegOR( pVBInfo->P3c4 , 0x06 , 0x40 ) ; /* 18 bits FP */
    XGINew_SetRegOR( pVBInfo->P3c4 , 0x09 , 0x40 ) ;
  }

  XGINew_SetRegOR( pVBInfo->P3c4 , 0x1E , 0x01 ) ;   /* Negative blank polarity */

  XGINew_SetRegAND( pVBInfo->P3c4 , 0x30 , ~0x20 ) ;
  XGINew_SetRegAND( pVBInfo->P3c4 , 0x35 , ~0x80 ) ;

  if ( ModeNo <= 0x13 )
  {
    b3CC = (unsigned char) XGINew_GetReg2(XGI_P3cc);
    if ( b3CC & 0x40 )
      XGINew_SetRegOR( pVBInfo->P3c4 , 0x30 , 0x20 ) ; /* Hsync polarity */
    if ( b3CC & 0x80 )
      XGINew_SetRegOR( pVBInfo->P3c4 , 0x35 , 0x80 ) ; /* Vsync polarity */
  }
  else
  {
    Data = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_InfoFlag ;
    if ( Data & 0x4000 )
      XGINew_SetRegOR( pVBInfo->P3c4 , 0x30 , 0x20 ) ; /* Hsync polarity */
    if ( Data & 0x8000 )
      XGINew_SetRegOR( pVBInfo->P3c4 , 0x35 , 0x80 ) ; /* Vsync polarity */
  }
}

void XGI_SetXG27LCD(struct vb_device_info *pVBInfo,
		    unsigned short RefreshRateTableIndex,
		    unsigned short ModeNo)
{
  unsigned short Data , Temp , b3CC ;
  unsigned short XGI_P3cc ;

  XGI_P3cc = pVBInfo->P3cc ;

  XGINew_SetReg1( pVBInfo->P3d4 , 0x2E , 0x00 ) ;
  XGINew_SetReg1( pVBInfo->P3d4 , 0x2F , 0x00 ) ;
  XGINew_SetReg1( pVBInfo->P3d4 , 0x46 , 0x00 ) ;
  XGINew_SetReg1( pVBInfo->P3d4 , 0x47 , 0x00 ) ;

  Temp = XGINew_GetReg1( pVBInfo->P3d4 , 0x37 ) ;
  if ( ( Temp & 0x03 ) == 0 )  /* dual 12 */
  {
    XGINew_SetReg1( pVBInfo->P3d4 , 0x46 , 0x13 ) ;
    XGINew_SetReg1( pVBInfo->P3d4 , 0x47 , 0x13 ) ;
  }

  if ( ((*pVBInfo->pDVOSetting)&0xC0) == 0xC0 )
  {
    XGINew_SetReg1( pVBInfo->P3d4 , 0x2E , *pVBInfo->pCR2E ) ;
    XGINew_SetReg1( pVBInfo->P3d4 , 0x2F , *pVBInfo->pCR2F ) ;
    XGINew_SetReg1( pVBInfo->P3d4 , 0x46 , *pVBInfo->pCR46 ) ;
    XGINew_SetReg1( pVBInfo->P3d4 , 0x47 , *pVBInfo->pCR47 ) ;
  }

  XGI_SetXG27FPBits(pVBInfo);

  XGINew_SetRegOR( pVBInfo->P3c4 , 0x1E , 0x01 ) ;   /* Negative blank polarity */

  XGINew_SetRegAND( pVBInfo->P3c4 , 0x30 , ~0x20 ) ; /* Hsync polarity */
  XGINew_SetRegAND( pVBInfo->P3c4 , 0x35 , ~0x80 ) ; /* Vsync polarity */

  if ( ModeNo <= 0x13 )
  {
    b3CC = (unsigned char) XGINew_GetReg2(XGI_P3cc);
    if ( b3CC & 0x40 )
      XGINew_SetRegOR( pVBInfo->P3c4 , 0x30 , 0x20 ) ; /* Hsync polarity */
    if ( b3CC & 0x80 )
      XGINew_SetRegOR( pVBInfo->P3c4 , 0x35 , 0x80 ) ; /* Vsync polarity */
  }
  else
  {
    Data = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_InfoFlag ;
    if ( Data & 0x4000 )
      XGINew_SetRegOR( pVBInfo->P3c4 , 0x30 , 0x20 ) ; /* Hsync polarity */
    if ( Data & 0x8000 )
      XGINew_SetRegOR( pVBInfo->P3c4 , 0x35 , 0x80 ) ; /* Vsync polarity */
  }
}

/* --------------------------------------------------------------------- */
/* Function : XGI_UpdateXG21CRTC */
/* Input : */
/* Output : CRT1 CRTC */
/* Description : Modify CRT1 Hsync/Vsync to fix LCD mode timing */
/* --------------------------------------------------------------------- */
void XGI_UpdateXG21CRTC(unsigned short ModeNo,
			struct vb_device_info *pVBInfo,
			unsigned short RefreshRateTableIndex)
{
  int i , index = -1;

  XGINew_SetRegAND( pVBInfo->P3d4 , 0x11 , 0x7F ) ;		/* Unlock CR0~7 */
  if ( ModeNo <= 0x13 )
  {
    for( i = 0 ; i < 12 ; i++ )
    {
      if ( ModeNo == pVBInfo->UpdateCRT1[ i ].ModeID )
        index = i ;
    }
  }
  else
  {
    if ( ModeNo == 0x2E && ( pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_CRT1CRTC ==  RES640x480x60 ) )
      index = 12 ;
    else if ( ModeNo == 0x2E && ( pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_CRT1CRTC == RES640x480x72 ) )
      index = 13 ;
    else if ( ModeNo == 0x2F )
      index = 14 ;
    else if ( ModeNo == 0x50 )
      index = 15 ;
    else if ( ModeNo == 0x59 )
      index = 16 ;
  }

  if( index != -1 )
  {
    XGINew_SetReg1( pVBInfo->P3d4 , 0x02 , pVBInfo->UpdateCRT1[ index ].CR02 ) ;
    XGINew_SetReg1( pVBInfo->P3d4 , 0x03 , pVBInfo->UpdateCRT1[ index ].CR03 ) ;
    XGINew_SetReg1( pVBInfo->P3d4 , 0x15 , pVBInfo->UpdateCRT1[ index ].CR15 ) ;
    XGINew_SetReg1( pVBInfo->P3d4 , 0x16 , pVBInfo->UpdateCRT1[ index ].CR16 ) ;
  }
}


/* --------------------------------------------------------------------- */
/* Function : XGI_SetCRT1DE */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_SetCRT1DE(struct xgi_hw_device_info *HwDeviceExtension,
		   unsigned short ModeNo,
		   unsigned short ModeIdIndex,
		   unsigned short RefreshRateTableIndex,
		   struct vb_device_info *pVBInfo)
{
	unsigned short resindex, tempax, tempbx, tempcx, temp, modeflag;

    unsigned char data;

    resindex = XGI_GetResInfo( ModeNo , ModeIdIndex, pVBInfo ) ;

    if ( ModeNo <= 0x13 )
    {
        modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ;
        tempax = pVBInfo->StResInfo[ resindex ].HTotal ;
        tempbx = pVBInfo->StResInfo[ resindex ].VTotal ;
    }
    else
    {
        modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ;
        tempax = pVBInfo->ModeResInfo[ resindex ].HTotal ;
        tempbx = pVBInfo->ModeResInfo[ resindex ].VTotal ;
    }

    if ( modeflag & HalfDCLK )
        tempax = tempax >> 1 ;

    if ( ModeNo > 0x13 )
    {
        if ( modeflag & HalfDCLK )
            tempax = tempax << 1 ;

        temp = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_InfoFlag ;

        if ( temp & InterlaceMode )
            tempbx = tempbx >> 1 ;

        if ( modeflag & DoubleScanMode )
            tempbx = tempbx << 1 ;
    }

    tempcx = 8 ;

    /* if ( !( modeflag & Charx8Dot ) ) */
    /* tempcx = 9 ; */

    tempax /= tempcx ;
    tempax -= 1 ;
    tempbx -= 1 ;
    tempcx = tempax ;
    temp = (unsigned char)XGINew_GetReg1(pVBInfo->P3d4, 0x11);
    data = (unsigned char)XGINew_GetReg1(pVBInfo->P3d4, 0x11);
    data &= 0x7F ;
    XGINew_SetReg1( pVBInfo->P3d4 , 0x11 , data ) ;		/* Unlock CRTC */
    XGINew_SetReg1(pVBInfo->P3d4, 0x01, (unsigned short)(tempcx & 0xff));
    XGINew_SetRegANDOR(pVBInfo->P3d4, 0x0b, ~0x0c, (unsigned short)((tempcx & 0x0ff00) >> 10));
    XGINew_SetReg1(pVBInfo->P3d4, 0x12, (unsigned short)(tempbx & 0xff));
    tempax = 0 ;
    tempbx = tempbx >> 8 ;

    if ( tempbx & 0x01 )
        tempax |= 0x02 ;

    if ( tempbx & 0x02 )
        tempax |= 0x40 ;

    XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x07 , ~0x42 , tempax ) ;
    data = (unsigned char)XGINew_GetReg1(pVBInfo->P3d4, 0x07);
    data &= 0xFF ;
    tempax = 0 ;

    if ( tempbx & 0x04 )
        tempax |= 0x02 ;

    XGINew_SetRegANDOR( pVBInfo->P3d4 ,0x0a , ~0x02 , tempax ) ;
    XGINew_SetReg1( pVBInfo->P3d4 , 0x11 , temp ) ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_GetResInfo */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
unsigned short XGI_GetResInfo(unsigned short ModeNo,
			      unsigned short ModeIdIndex,
			      struct vb_device_info *pVBInfo)
{
	unsigned short resindex;

    if ( ModeNo <= 0x13 )
    {
        resindex = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ResInfo ; 	/* si+St_ResInfo */
    }
    else
    {
        resindex = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_RESINFO ;	/* si+Ext_ResInfo */
    }
    return( resindex ) ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_SetCRT1Offset */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_SetCRT1Offset(unsigned short ModeNo,
		       unsigned short ModeIdIndex,
		       unsigned short RefreshRateTableIndex,
		       struct xgi_hw_device_info *HwDeviceExtension,
		       struct vb_device_info *pVBInfo)
{
    unsigned short temp ,
           ah ,
           al ,
           temp2 ,
           i ,
           DisplayUnit ;

    /* GetOffset */
    temp = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeInfo ;
    temp = temp >> 8 ;
    temp = pVBInfo->ScreenOffset[ temp ] ;

    temp2 = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_InfoFlag ;
    temp2 &= InterlaceMode ;

    if ( temp2 )
        temp = temp << 1;

    temp2 = pVBInfo->ModeType - ModeEGA ;

    switch( temp2 )
    {
        case 0:
            temp2 = 1 ;
            break ;
        case 1:
            temp2 = 2 ;
            break ;
        case 2:
            temp2 = 4 ;
            break ;
        case 3:
            temp2 = 4 ;
            break ;
        case 4:
            temp2 = 6 ;
            break;
        case 5:
            temp2 = 8 ;
            break ;
        default:
            break ;
    }

    if ( ( ModeNo >= 0x26 ) && ( ModeNo <= 0x28 ) )
        temp = temp * temp2 + temp2 / 2 ;
    else
        temp *= temp2 ;

    /* SetOffset */
    DisplayUnit = temp ;
    temp2 = temp ;
    temp = temp >> 8 ;		/* ah */
    temp &= 0x0F ;
    i = XGINew_GetReg1( pVBInfo->P3c4 , 0x0E ) ;
    i &= 0xF0 ;
    i |= temp ;
    XGINew_SetReg1( pVBInfo->P3c4 , 0x0E , i ) ;

    temp = (unsigned char)temp2;
    temp &= 0xFF ;		/* al */
    XGINew_SetReg1( pVBInfo->P3d4 , 0x13 , temp ) ;

    /* SetDisplayUnit */
    temp2 = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_InfoFlag ;
    temp2 &= InterlaceMode ;
    if ( temp2 )
        DisplayUnit >>= 1 ;

    DisplayUnit = DisplayUnit << 5 ;
    ah = ( DisplayUnit & 0xff00 ) >> 8 ;
    al = DisplayUnit & 0x00ff ;
    if ( al == 0 )
        ah += 1 ;
    else
        ah += 2 ;

    if ( HwDeviceExtension->jChipType >= XG20 )
        if ( ( ModeNo == 0x4A ) | (ModeNo == 0x49 ) )
            ah -= 1 ;

    XGINew_SetReg1( pVBInfo->P3c4 , 0x10 , ah ) ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_SetCRT1VCLK */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_SetCRT1VCLK(unsigned short ModeNo, unsigned short ModeIdIndex,
		     struct xgi_hw_device_info *HwDeviceExtension,
		     unsigned short RefreshRateTableIndex,
		     struct vb_device_info *pVBInfo)
{
	unsigned char index, data;
    unsigned short vclkindex ;

    if ( pVBInfo->IF_DEF_LVDS == 1 )
    {
        index = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_CRTVCLK ;
        data = XGINew_GetReg1( pVBInfo->P3c4 , 0x31 ) & 0xCF ;
        XGINew_SetReg1( pVBInfo->P3c4 , 0x31 , data ) ;
        XGINew_SetReg1( pVBInfo->P3c4 , 0x2B , pVBInfo->VCLKData[ index ].SR2B ) ;
        XGINew_SetReg1( pVBInfo->P3c4 , 0x2C , pVBInfo->VCLKData[ index ].SR2C ) ;
        XGINew_SetReg1( pVBInfo->P3c4 , 0x2D , 0x01 ) ;
    }
    else if ( ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) ) && ( pVBInfo->VBInfo & SetCRT2ToLCDA ) )
    {
        vclkindex = XGI_GetVCLK2Ptr( ModeNo , ModeIdIndex , RefreshRateTableIndex , HwDeviceExtension, pVBInfo ) ;
        data = XGINew_GetReg1( pVBInfo->P3c4 , 0x31 ) & 0xCF ;
        XGINew_SetReg1( pVBInfo->P3c4 , 0x31 , data ) ;
        data = pVBInfo->VBVCLKData[ vclkindex ].Part4_A ;
        XGINew_SetReg1( pVBInfo->P3c4 , 0x2B , data ) ;
        data = pVBInfo->VBVCLKData[ vclkindex ].Part4_B ;
        XGINew_SetReg1( pVBInfo->P3c4 , 0x2C , data ) ;
        XGINew_SetReg1( pVBInfo->P3c4 , 0x2D , 0x01 ) ;
    }
    else
    {
        index = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_CRTVCLK ;
        data = XGINew_GetReg1( pVBInfo->P3c4 , 0x31 ) & 0xCF ;
        XGINew_SetReg1( pVBInfo->P3c4 , 0x31 , data ) ;
        XGINew_SetReg1( pVBInfo->P3c4 , 0x2B , pVBInfo->VCLKData[ index ].SR2B ) ;
        XGINew_SetReg1( pVBInfo->P3c4 , 0x2C , pVBInfo->VCLKData[ index ].SR2C ) ;
        XGINew_SetReg1( pVBInfo->P3c4 , 0x2D , 0x01 ) ;
    }

    if ( HwDeviceExtension->jChipType >= XG20 )
    {
    	if ( pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag & HalfDCLK )
    	{
    	data = XGINew_GetReg1( pVBInfo->P3c4 , 0x2B ) ;
    	XGINew_SetReg1( pVBInfo->P3c4 , 0x2B , data ) ;
    	data = XGINew_GetReg1( pVBInfo->P3c4 , 0x2C ) ;
    	index = data ;
    	index &= 0xE0 ;
    	data &= 0x1F ;
    	data = data << 1 ;
    	data += 1 ;
    	data |= index ;
    	XGINew_SetReg1( pVBInfo->P3c4 , 0x2C , data ) ;
    	}
    }
}


/* --------------------------------------------------------------------- */
/* Function : XGI_SetCRT1FIFO */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_SetCRT1FIFO(unsigned short ModeNo,
		     struct xgi_hw_device_info *HwDeviceExtension,
		     struct vb_device_info *pVBInfo)
{
    unsigned short data ;

    data = XGINew_GetReg1( pVBInfo->P3c4 , 0x3D ) ;
    data &= 0xfe ;
    XGINew_SetReg1( pVBInfo->P3c4 , 0x3D , data ) ;	/* diable auto-threshold */

    if ( ModeNo > 0x13 )
    {
        XGINew_SetReg1( pVBInfo->P3c4 , 0x08 , 0x34 ) ;
        data = XGINew_GetReg1( pVBInfo->P3c4 , 0x09 ) ;
        data &= 0xC0 ;
        XGINew_SetReg1( pVBInfo->P3c4 , 0x09 , data | 0x30) ;
        data = XGINew_GetReg1( pVBInfo->P3c4 , 0x3D ) ;
        data |= 0x01 ;
        XGINew_SetReg1( pVBInfo->P3c4 , 0x3D , data ) ;
    }
    else
    {
        if (HwDeviceExtension->jChipType == XG27)
        {
          XGINew_SetReg1( pVBInfo->P3c4 , 0x08 , 0x0E ) ;
          data = XGINew_GetReg1( pVBInfo->P3c4 , 0x09 ) ;
          data &= 0xC0 ;
          XGINew_SetReg1( pVBInfo->P3c4 , 0x09 , data | 0x20 ) ;
        }
        else
        {
          XGINew_SetReg1( pVBInfo->P3c4 , 0x08 , 0xAE ) ;
          data = XGINew_GetReg1( pVBInfo->P3c4 , 0x09 ) ;
          data &= 0xF0 ;
          XGINew_SetReg1( pVBInfo->P3c4 , 0x09 , data ) ;
        }
    }

    if (HwDeviceExtension->jChipType == XG21)
    {
        XGI_SetXG21FPBits(pVBInfo);                 /* Fix SR9[7:6] can't read back */
    }
}


/* --------------------------------------------------------------------- */
/* Function : XGI_SetCRT1ModeRegs */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_SetCRT1ModeRegs(struct xgi_hw_device_info *HwDeviceExtension,
			 unsigned short ModeNo, unsigned short ModeIdIndex,
			 unsigned short RefreshRateTableIndex,
			 struct vb_device_info *pVBInfo)
{
    unsigned short data ,
           data2 ,
           data3 ,
           infoflag = 0 ,
           modeflag ,
           resindex ,
           xres ;

    if ( ModeNo > 0x13 )
    {
        modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ;
        infoflag = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_InfoFlag ;
    }
    else
        modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ;    /* si+St_ModeFlag */

    if ( XGINew_GetReg1( pVBInfo->P3d4 , 0x31 ) & 0x01 )
      XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x1F , 0x3F , 0x00 ) ;

    if ( ModeNo > 0x13 )
        data = infoflag ;
    else
        data = 0 ;

    data2 = 0 ;

    if ( ModeNo > 0x13 )
    {
        if ( pVBInfo->ModeType > 0x02 )
        {
            data2 |= 0x02 ;
            data3 = pVBInfo->ModeType - ModeVGA ;
            data3 = data3 << 2 ;
            data2 |= data3 ;
        }
    }

    data &= InterlaceMode ;

    if ( data )
        data2 |= 0x20 ;

    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x06 , ~0x3F , data2 ) ;
    /* XGINew_SetReg1(pVBInfo->P3c4,0x06,data2); */
    resindex = XGI_GetResInfo( ModeNo , ModeIdIndex, pVBInfo ) ;
    if ( ModeNo <= 0x13 )
        xres = pVBInfo->StResInfo[ resindex ].HTotal ;
    else
        xres = pVBInfo->ModeResInfo[ resindex ].HTotal ;                         /* xres->ax */

    data = 0x0000 ;
    if ( infoflag & InterlaceMode )
    {
        if ( xres == 1024 )
            data = 0x0035 ;
        else if ( xres == 1280 )
            data = 0x0048 ;
    }

    data2 = data & 0x00FF ;
    XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x19 , 0xFF , data2 ) ;
    data2 = ( data & 0xFF00 ) >> 8 ;
    XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x19 , 0xFC , data2 ) ;

    if( modeflag & HalfDCLK )
        XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x01 , 0xF7 , 0x08 ) ;

    data2 = 0 ;

    if ( modeflag & LineCompareOff )
        data2 |= 0x08 ;

    if ( ModeNo > 0x13 )
    {
        if ( pVBInfo->ModeType == ModeEGA )
            data2 |= 0x40 ;
    }

    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0F , ~0x48 , data2 ) ;
    data = 0x60 ;
    if ( pVBInfo->ModeType != ModeText )
    {
        data = data ^ 0x60 ;
        if ( pVBInfo->ModeType != ModeEGA )
        {
            data = data ^ 0xA0 ;
        }
    }
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x21 , 0x1F , data ) ;

    XGI_SetVCLKState( HwDeviceExtension , ModeNo , RefreshRateTableIndex, pVBInfo) ;

    /* if(modeflag&HalfDCLK)//030305 fix lowresolution bug */
    /* if(XGINew_IF_DEF_NEW_LOWRES) */
    /* XGI_VesaLowResolution(ModeNo,ModeIdIndex);//030305 fix lowresolution bug */

    data=XGINew_GetReg1( pVBInfo->P3d4 , 0x31 ) ;

    if (HwDeviceExtension->jChipType == XG27 )
    {
    	if ( data & 0x40 )
    	    data = 0x2c ;
    	else
    	    data = 0x6c ;
    	XGINew_SetReg1( pVBInfo->P3d4 , 0x52 , data ) ;
    	XGINew_SetRegOR( pVBInfo->P3d4 , 0x51 , 0x10 ) ;
    }
    else
    if (HwDeviceExtension->jChipType >= XG20 )
    {
    	if ( data & 0x40 )
    	    data = 0x33 ;
    	else
    	    data = 0x73 ;
    	XGINew_SetReg1( pVBInfo->P3d4 , 0x52 , data ) ;
    	XGINew_SetReg1( pVBInfo->P3d4 , 0x51 , 0x02 ) ;
    }
    else
    {
    if ( data & 0x40 )
        data = 0x2c ;
    else
        data = 0x6c ;
    XGINew_SetReg1( pVBInfo->P3d4 , 0x52 , data ) ;
    }

}


/* --------------------------------------------------------------------- */
/* Function : XGI_SetVCLKState */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_SetVCLKState(struct xgi_hw_device_info *HwDeviceExtension,
		      unsigned short ModeNo,
		      unsigned short RefreshRateTableIndex,
		      struct vb_device_info *pVBInfo)
{
    unsigned short data ,
           data2 = 0 ;
    short VCLK ;

    unsigned char index;

    if ( ModeNo <= 0x13 )
        VCLK = 0 ;
    else
    {
        index = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_CRTVCLK ;
        index &= IndexMask ;
        VCLK = pVBInfo->VCLKData[ index ].CLOCK ;
    }

    data = XGINew_GetReg1( pVBInfo->P3c4 , 0x32 ) ;
    data &= 0xf3 ;
    if ( VCLK >= 200 )
        data |= 0x0c ;	/* VCLK > 200 */

    if ( HwDeviceExtension->jChipType >= XG20 )
        data &= ~0x04 ; /* 2 pixel mode */

    XGINew_SetReg1( pVBInfo->P3c4 , 0x32 , data ) ;

    if ( HwDeviceExtension->jChipType < XG20 )
    {
    data = XGINew_GetReg1( pVBInfo->P3c4 , 0x1F ) ;
    data &= 0xE7 ;
    if ( VCLK < 200 )
        data |= 0x10 ;
    XGINew_SetReg1( pVBInfo->P3c4 , 0x1F , data ) ;
    }

/*  Jong for Adavantech LCD ripple issue
    if ( ( VCLK >= 0 ) && ( VCLK < 135 ) )
        data2 = 0x03 ;
    else if ( ( VCLK >= 135 ) && ( VCLK < 160 ) )
        data2 = 0x02 ;
    else if ( ( VCLK >= 160 ) && ( VCLK < 260 ) )
        data2 = 0x01 ;
    else if ( VCLK > 260 )
          data2 = 0x00 ;
*/
    data2 = 0x00 ;

    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x07 , 0xFC , data2 ) ;
    if (HwDeviceExtension->jChipType >= XG27 )
    {
      XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x40 , 0xFC , data2&0x03 ) ;
    }


}


/* --------------------------------------------------------------------- */
/* Function : XGI_VesaLowResolution */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
/*void XGI_VesaLowResolution(unsigned short ModeNo, unsigned short ModeIdIndex, struct vb_device_info *pVBInfo)
{
    unsigned short modeflag;

    if ( ModeNo > 0x13 )
        modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ;
    else
        modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ;

    if ( ModeNo > 0x13 )
    {
        if ( modeflag & DoubleScanMode )
        {
            if ( modeflag & HalfDCLK )
            {
                if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
                {
                    if ( !( pVBInfo->VBInfo & SetCRT2ToRAMDAC ) )
                    {
                        if ( pVBInfo->VBInfo & SetInSlaveMode )
                        {
                            XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x01 , 0xf7 , 0x00 ) ;
                            XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0f , 0x7f , 0x00 ) ;
                            return ;
                        }
                    }
                }
                XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0f , 0xff , 0x80 ) ;
                XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x01 , 0xf7 , 0x00 ) ;
                return ;
            }
        }
    }
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0f , 0x7f , 0x00 ) ;
}
*/

/* --------------------------------------------------------------------- */
/* Function : XGI_LoadDAC */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_LoadDAC(unsigned short ModeNo,
		 unsigned short ModeIdIndex,
		 struct vb_device_info *pVBInfo)
{
    unsigned short data , data2 , time ,
           i  , j , k , m , n , o ,
           si , di , bx , dl , al , ah , dh ,
           *table = NULL ;

    if ( ModeNo <= 0x13 )
        data = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ;
    else
        data = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ;

    data &= DACInfoFlag ;
    time = 64 ;

    if ( data == 0x00 )
        table = XGINew_MDA_DAC ;
    else if ( data == 0x08 )
        table = XGINew_CGA_DAC ;
    else if ( data == 0x10 )
        table = XGINew_EGA_DAC ;
    else if ( data == 0x18 )
    {
        time = 256 ;
        table = XGINew_VGA_DAC ;
    }

    if ( time == 256 )
        j = 16 ;
    else
        j = time ;

    XGINew_SetReg3( pVBInfo->P3c6 , 0xFF ) ;
    XGINew_SetReg3( pVBInfo->P3c8 , 0x00 ) ;

    for( i = 0 ; i < j ; i++ )
    {
        data = table[ i ] ;

        for( k = 0 ; k < 3 ; k++ )
        {
            data2 = 0 ;

            if ( data & 0x01 )
                data2 = 0x2A ;

            if ( data & 0x02 )
                data2 += 0x15 ;

            XGINew_SetReg3( pVBInfo->P3c9 , data2 ) ;
            data = data >> 2 ;
        }
    }

    if ( time == 256 )
    {
        for( i = 16 ; i < 32 ; i++ )
        {
            data = table[ i ] ;

            for( k = 0 ; k < 3 ; k++ )
                XGINew_SetReg3( pVBInfo->P3c9 , data ) ;
        }

        si = 32 ;

        for( m = 0 ; m < 9 ; m++ )
        {
            di = si ;
            bx = si + 0x04 ;
            dl = 0 ;

            for( n = 0 ; n < 3 ; n++ )
            {
                for( o = 0 ; o < 5 ; o++ )
                {
                    dh = table[ si ] ;
                    ah = table[ di ] ;
                    al = table[ bx ] ;
                    si++ ;
                    XGI_WriteDAC( dl , ah , al , dh, pVBInfo ) ;
                }

                si -= 2 ;

                for( o = 0 ; o < 3 ; o++ )
                {
                    dh = table[ bx ] ;
                    ah = table[ di ] ;
                    al = table[ si ] ;
                    si-- ;
                    XGI_WriteDAC( dl , ah , al , dh, pVBInfo ) ;
                }

                dl++ ;
            }

            si += 5 ;
        }
    }
}


/* --------------------------------------------------------------------- */
/* Function : XGI_WriteDAC */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_WriteDAC(unsigned short dl, unsigned short ah,
		  unsigned short al, unsigned short dh,
		  struct vb_device_info *pVBInfo)
{
    unsigned short temp , bh , bl ;

    bh = ah ;
    bl = al ;

    if ( dl != 0 )
    {
        temp = bh ;
        bh = dh ;
        dh = temp ;
        if ( dl == 1 )
        {
            temp = bl ;
            bl = dh ;
            dh = temp ;
        }
        else
        {
            temp = bl ;
            bl = bh ;
            bh = temp ;
        }
    }
    XGINew_SetReg3(pVBInfo->P3c9, (unsigned short)dh);
    XGINew_SetReg3(pVBInfo->P3c9, (unsigned short)bh);
    XGINew_SetReg3(pVBInfo->P3c9, (unsigned short)bl);
}

/* --------------------------------------------------------------------- */
/* Function : XGI_SetLCDAGroup */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_SetLCDAGroup(unsigned short ModeNo,
		      unsigned short ModeIdIndex,
		      struct xgi_hw_device_info *HwDeviceExtension,
		      struct vb_device_info *pVBInfo)
{
    unsigned short RefreshRateTableIndex ;
    /* unsigned short temp ; */

    /* pVBInfo->SelectCRT2Rate = 0 ; */

    pVBInfo->SetFlag |= ProgrammingCRT2 ;
    RefreshRateTableIndex = XGI_GetRatePtrCRT2( HwDeviceExtension, ModeNo , ModeIdIndex, pVBInfo ) ;
    XGI_GetLVDSResInfo(  ModeNo , ModeIdIndex,  pVBInfo ) ;
    XGI_GetLVDSData( ModeNo , ModeIdIndex , RefreshRateTableIndex,  pVBInfo);
    XGI_ModCRT1Regs( ModeNo , ModeIdIndex , RefreshRateTableIndex , HwDeviceExtension, pVBInfo ) ;
    XGI_SetLVDSRegs( ModeNo , ModeIdIndex , RefreshRateTableIndex, pVBInfo ) ;
    XGI_SetCRT2ECLK( ModeNo , ModeIdIndex , RefreshRateTableIndex, pVBInfo ) ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_GetLVDSResInfo */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_GetLVDSResInfo(unsigned short ModeNo,
			unsigned short ModeIdIndex,
			struct vb_device_info *pVBInfo)
{
    unsigned short resindex , xres , yres , modeflag ;

    if ( ModeNo <= 0x13 )
    {
        modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ResInfo ;	/* si+St_ResInfo */
    }
    else
    {
        modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_RESINFO ;	/* si+Ext_ResInfo */
    }


    /* if ( ModeNo > 0x13 ) */
    /* modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ; */
    /* else */
    /* modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ; */

    if ( ModeNo <= 0x13 )
    {
        resindex = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ResInfo ;	/* si+St_ResInfo */
    }
    else
    {
        resindex = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_RESINFO ;	/* si+Ext_ResInfo */
    }

    /* resindex = XGI_GetResInfo( ModeNo , ModeIdIndex, pVBInfo ) ; */

    if ( ModeNo <= 0x13 )
    {
        xres = pVBInfo->StResInfo[ resindex ].HTotal ;
        yres = pVBInfo->StResInfo[ resindex ].VTotal ;
    }
    else
    {
        xres = pVBInfo->ModeResInfo[ resindex ].HTotal ;
        yres = pVBInfo->ModeResInfo[ resindex ].VTotal ;
    }
    if ( ModeNo > 0x13 )
    {
        if ( modeflag & HalfDCLK )
            xres = xres << 1 ;

        if ( modeflag & DoubleScanMode )
            yres = yres << 1 ;
    }
    /* if ( modeflag & Charx8Dot ) */
    /* { */

    if ( xres == 720 )
        xres = 640 ;

    /* } */
    pVBInfo->VGAHDE = xres ;
    pVBInfo->HDE = xres ;
    pVBInfo->VGAVDE = yres ;
    pVBInfo->VDE = yres ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_GetLVDSData */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_GetLVDSData(unsigned short ModeNo,
		     unsigned short ModeIdIndex,
		     unsigned short RefreshRateTableIndex,
		     struct vb_device_info *pVBInfo)
{
    unsigned short tempbx ;
    struct XGI330_LVDSDataStruct *LCDPtr = NULL ;
    struct XGI330_CHTVDataStruct  *TVPtr = NULL ;

    tempbx = 2 ;

    if ( pVBInfo->VBInfo & ( SetCRT2ToLCD | SetCRT2ToLCDA ) )
    {
	LCDPtr = (struct XGI330_LVDSDataStruct *)XGI_GetLcdPtr(tempbx, ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
        pVBInfo->VGAHT = LCDPtr->VGAHT ;
        pVBInfo->VGAVT = LCDPtr->VGAVT ;
        pVBInfo->HT = LCDPtr->LCDHT ;
        pVBInfo->VT = LCDPtr->LCDVT ;
    }
    if ( pVBInfo->IF_DEF_CH7017 == 1 )
    {
        if ( pVBInfo->VBInfo & SetCRT2ToTV )
        {
	    TVPtr = (struct XGI330_CHTVDataStruct *)XGI_GetTVPtr(tempbx, ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
            pVBInfo->VGAHT = TVPtr->VGAHT ;
            pVBInfo->VGAVT = TVPtr->VGAVT ;
            pVBInfo->HT = TVPtr->LCDHT ;
            pVBInfo->VT = TVPtr->LCDVT ;
        }
    }

    if ( pVBInfo->VBInfo & ( SetCRT2ToLCD | SetCRT2ToLCDA ) )
    {
        if ( !( pVBInfo->LCDInfo & ( SetLCDtoNonExpanding | EnableScalingLCD ) ) )
        {
            if ( ( pVBInfo->LCDResInfo == Panel1024x768 ) || ( pVBInfo->LCDResInfo == Panel1024x768x75 ) )
            {
                pVBInfo->HDE = 1024 ;
                pVBInfo->VDE = 768 ;
            }
            else if ( ( pVBInfo->LCDResInfo == Panel1280x1024 ) || ( pVBInfo->LCDResInfo == Panel1280x1024x75 ) )
            {
                pVBInfo->HDE = 1280 ;
                pVBInfo->VDE = 1024 ;
            }
            else if ( pVBInfo->LCDResInfo == Panel1400x1050 )
            {
                pVBInfo->HDE = 1400 ;
                pVBInfo->VDE = 1050 ;
            }
            else
            {
                pVBInfo->HDE = 1600 ;
                pVBInfo->VDE = 1200 ;
            }
        }
    }
}


/* --------------------------------------------------------------------- */
/* Function : XGI_ModCRT1Regs */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_ModCRT1Regs(unsigned short ModeNo, unsigned short ModeIdIndex,
		     unsigned short RefreshRateTableIndex,
		     struct xgi_hw_device_info *HwDeviceExtension,
		     struct vb_device_info *pVBInfo)
{
    unsigned char index;
    unsigned short tempbx , i ;
    struct XGI_LVDSCRT1HDataStruct  *LCDPtr = NULL;
    struct XGI_LVDSCRT1VDataStruct  *LCDPtr1 = NULL;
    /* struct XGI330_CHTVDataStruct *TVPtr = NULL ; */
    struct XGI_CH7007TV_TimingHStruct *CH7007TV_TimingHPtr = NULL;
    struct XGI_CH7007TV_TimingVStruct *CH7007TV_TimingVPtr = NULL;

    if( ModeNo <= 0x13 )
        index = pVBInfo->SModeIDTable[ ModeIdIndex ].St_CRT2CRTC ;
    else
        index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;

    index= index & IndexMask ;

    if ( ( pVBInfo->IF_DEF_ScaleLCD == 0 ) || ( ( pVBInfo->IF_DEF_ScaleLCD == 1 ) && ( !( pVBInfo->LCDInfo & EnableScalingLCD ) ) ) )
    {
        tempbx = 0 ;

        if ( pVBInfo->VBInfo & ( SetCRT2ToLCD | SetCRT2ToLCDA ) )
        {
	    LCDPtr = (struct XGI_LVDSCRT1HDataStruct *)XGI_GetLcdPtr(tempbx, ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);

            for( i = 0 ; i < 8 ; i++ )
                pVBInfo->TimingH[ 0 ].data[ i ] = LCDPtr[ 0 ].Reg[ i ] ;
        }

        if ( pVBInfo->IF_DEF_CH7007 == 1 )
        {
            if ( pVBInfo->VBInfo & SetCRT2ToTV )
            {
		CH7007TV_TimingHPtr = (struct XGI_CH7007TV_TimingHStruct *)XGI_GetTVPtr(tempbx, ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);

                for( i = 0 ; i < 8 ; i++ )
                    pVBInfo->TimingH[ 0 ].data[ i ] = CH7007TV_TimingHPtr[ 0 ].data[ i ] ;
            }
        }

        /* if ( pVBInfo->IF_DEF_CH7017 == 1 )
        {
            if ( pVBInfo->VBInfo & SetCRT2ToTV )
		TVPtr = ( struct XGI330_CHTVDataStruct *)XGI_GetTVPtr( tempbx , ModeNo , ModeIdIndex , RefreshRateTableIndex, pVBInfo ) ;
        } */

        XGI_SetCRT1Timing_H(pVBInfo,HwDeviceExtension) ;

        if ( pVBInfo->IF_DEF_CH7007 == 1 )
        {
    	    XGINew_SetReg1( pVBInfo->P3c4 , 0x2E , CH7007TV_TimingHPtr[ 0 ].data[ 8 ] ) ;
    	    XGINew_SetReg1( pVBInfo->P3c4 , 0x2F , CH7007TV_TimingHPtr[ 0 ].data[ 9 ] ) ;
        }

        tempbx = 1 ;

        if ( pVBInfo->VBInfo & ( SetCRT2ToLCD | SetCRT2ToLCDA ) )
        {
	    LCDPtr1 = (struct XGI_LVDSCRT1VDataStruct *)XGI_GetLcdPtr(tempbx, ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
            for( i = 0 ; i < 7 ; i++ )
                pVBInfo->TimingV[ 0 ].data[ i ] = LCDPtr1[ 0 ].Reg[ i ] ;
        }

        if ( pVBInfo->IF_DEF_CH7007 == 1 )
        {
            if ( pVBInfo->VBInfo & SetCRT2ToTV )
            {
		CH7007TV_TimingVPtr = (struct XGI_CH7007TV_TimingVStruct *)XGI_GetTVPtr(tempbx, ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);

                for( i = 0 ; i < 7 ; i++ )
                    pVBInfo->TimingV[ 0 ].data[ i ] = CH7007TV_TimingVPtr[ 0 ].data[ i ] ;
            }
        }
        /* if ( pVBInfo->IF_DEF_CH7017 == 1 )
        {
            if ( pVBInfo->VBInfo & SetCRT2ToTV )
		TVPtr = ( struct XGI330_CHTVDataStruct *)XGI_GetTVPtr( tempbx , ModeNo , ModeIdIndex , RefreshRateTableIndex, pVBInfo ) ;
        } */

        XGI_SetCRT1Timing_V( ModeIdIndex , ModeNo , pVBInfo) ;

        if ( pVBInfo->IF_DEF_CH7007 == 1 )
        {
    	    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x33 , ~0x01 , CH7007TV_TimingVPtr[ 0 ].data[ 7 ]&0x01 ) ;
    	    XGINew_SetReg1( pVBInfo->P3c4 , 0x34 , CH7007TV_TimingVPtr[ 0 ].data[8 ] ) ;
    	    XGINew_SetReg1( pVBInfo->P3c4 , 0x3F , CH7007TV_TimingVPtr[ 0 ].data[9 ] ) ;

        }
    }
}



/* --------------------------------------------------------------------- */
/* Function : XGI_SetLVDSRegs */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_SetLVDSRegs(unsigned short ModeNo, unsigned short ModeIdIndex,
		     unsigned short RefreshRateTableIndex,
		     struct vb_device_info *pVBInfo)
{
    unsigned short tempbx , tempax , tempcx , tempdx , push1 , push2 , modeflag ;
    unsigned long temp , temp1 , temp2 , temp3 , push3 ;
    struct XGI330_LCDDataDesStruct  *LCDPtr = NULL ;
    struct XGI330_LCDDataDesStruct2  *LCDPtr1 = NULL ;

    if ( ModeNo > 0x13 )
        modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ;
    else
        modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ;

    if ( !( pVBInfo->SetFlag & Win9xDOSMode ) )
    {
        if ( ( pVBInfo->IF_DEF_CH7017 == 0 ) || ( pVBInfo->VBInfo & ( SetCRT2ToLCD | SetCRT2ToLCDA ) ) )
        {
            if ( pVBInfo->IF_DEF_OEMUtil == 1 )
            {
    	        tempbx = 8 ;
		LCDPtr = (struct XGI330_LCDDataDesStruct *)XGI_GetLcdPtr(tempbx, ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
            }

            if ( ( pVBInfo->IF_DEF_OEMUtil == 0 ) || ( LCDPtr == 0 ) )
            {
                tempbx = 3 ;
                if ( pVBInfo->LCDInfo & EnableScalingLCD )
		    LCDPtr1 = (struct XGI330_LCDDataDesStruct2 *)XGI_GetLcdPtr(tempbx, ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
                else
		    LCDPtr = (struct XGI330_LCDDataDesStruct *)XGI_GetLcdPtr(tempbx, ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
            }

            XGI_GetLCDSync( &tempax , &tempbx ,pVBInfo) ;
            push1 = tempbx ;
            push2 = tempax ;

            /* GetLCDResInfo */
            if ( ( pVBInfo->LCDResInfo == Panel1024x768 ) || ( pVBInfo->LCDResInfo == Panel1024x768x75 ) )
            {
                tempax = 1024 ;
                tempbx = 768 ;
            }
            else if ( ( pVBInfo->LCDResInfo == Panel1280x1024 ) || ( pVBInfo->LCDResInfo == Panel1280x1024x75 ) )
            {
                tempax = 1280 ;
                tempbx = 1024 ;
            }
            else if ( pVBInfo->LCDResInfo == Panel1400x1050 )
            {
                tempax = 1400 ;
                tempbx = 1050 ;
            }
            else
            {
                tempax = 1600 ;
                tempbx = 1200 ;
            }

            if ( pVBInfo->LCDInfo & SetLCDtoNonExpanding )
            {
                pVBInfo->HDE=tempax;
                pVBInfo->VDE=tempbx;
                pVBInfo->VGAHDE=tempax;
                pVBInfo->VGAVDE=tempbx;
            }

            if ( ( pVBInfo->IF_DEF_ScaleLCD == 1 ) && ( pVBInfo->LCDInfo & EnableScalingLCD ) )
            {
                tempax=pVBInfo->HDE;
                tempbx=pVBInfo->VDE;
            }

            tempax = pVBInfo->HT ;

            if ( pVBInfo->LCDInfo & EnableScalingLCD )
                tempbx = LCDPtr1->LCDHDES ;
            else
                tempbx = LCDPtr->LCDHDES ;

            tempcx = pVBInfo->HDE ;
            tempbx = tempbx & 0x0fff ;
            tempcx += tempbx ;

            if ( tempcx >= tempax )
                tempcx -= tempax ;

            XGINew_SetReg1( pVBInfo->Part1Port , 0x1A , tempbx & 0x07 ) ;

            tempcx = tempcx >> 3 ;
            tempbx = tempbx >> 3 ;

	    XGINew_SetReg1(pVBInfo->Part1Port, 0x16, (unsigned short)(tempbx & 0xff));
	    XGINew_SetReg1(pVBInfo->Part1Port, 0x17, (unsigned short)(tempcx & 0xff));

            tempax = pVBInfo->HT ;

            if ( pVBInfo->LCDInfo & EnableScalingLCD )
                tempbx = LCDPtr1->LCDHRS ;
            else
                tempbx = LCDPtr->LCDHRS ;

            tempcx = push2 ;

            if ( pVBInfo->LCDInfo & EnableScalingLCD )
                tempcx = LCDPtr1->LCDHSync ;

            tempcx += tempbx ;

            if ( tempcx >= tempax )
                tempcx -= tempax ;

            tempax = tempbx & 0x07 ;
            tempax = tempax >> 5 ;
            tempcx = tempcx >> 3 ;
            tempbx = tempbx >> 3 ;

            tempcx &= 0x1f ;
            tempax |= tempcx ;

            XGINew_SetReg1( pVBInfo->Part1Port , 0x15 , tempax ) ;
	    XGINew_SetReg1(pVBInfo->Part1Port, 0x14, (unsigned short)(tempbx & 0xff));

            tempax = pVBInfo->VT ;
            if ( pVBInfo->LCDInfo & EnableScalingLCD )
                tempbx = LCDPtr1->LCDVDES ;
            else
                tempbx = LCDPtr->LCDVDES ;
            tempcx = pVBInfo->VDE ;

            tempbx = tempbx & 0x0fff ;
            tempcx += tempbx ;
            if ( tempcx >= tempax )
                tempcx -= tempax ;

	    XGINew_SetReg1(pVBInfo->Part1Port, 0x1b, (unsigned short)(tempbx & 0xff));
	    XGINew_SetReg1(pVBInfo->Part1Port, 0x1c, (unsigned short)(tempcx & 0xff));

            tempbx = ( tempbx >> 8 ) & 0x07 ;
            tempcx = ( tempcx >> 8 ) & 0x07 ;

	    XGINew_SetReg1(pVBInfo->Part1Port, 0x1d, (unsigned short)((tempcx << 3) | tempbx));

            tempax = pVBInfo->VT ;
            if ( pVBInfo->LCDInfo & EnableScalingLCD )
                tempbx = LCDPtr1->LCDVRS ;
            else
                tempbx = LCDPtr->LCDVRS ;

            /* tempbx = tempbx >> 4 ; */
              tempcx = push1 ;

            if ( pVBInfo->LCDInfo & EnableScalingLCD )
                tempcx = LCDPtr1->LCDVSync ;

            tempcx += tempbx ;
            if ( tempcx >= tempax )
                tempcx -= tempax ;

	    XGINew_SetReg1(pVBInfo->Part1Port, 0x18, (unsigned short)(tempbx & 0xff));
	    XGINew_SetRegANDOR(pVBInfo->Part1Port, 0x19, ~0x0f, (unsigned short)(tempcx & 0x0f));

            tempax = ( ( tempbx >> 8 ) & 0x07 ) << 3 ;

            tempbx = pVBInfo->VGAVDE ;
            if ( tempbx != pVBInfo->VDE )
                tempax |= 0x40 ;

            if ( pVBInfo->LCDInfo & EnableLVDSDDA )
                tempax |= 0x40 ;

            XGINew_SetRegANDOR( pVBInfo->Part1Port , 0x1a , 0x07 , tempax ) ;

            tempcx = pVBInfo->VGAVT ;
            tempbx = pVBInfo->VDE ;
            tempax = pVBInfo->VGAVDE ;
            tempcx -= tempax ;

            temp = tempax ;            /* 0430 ylshieh */
            temp1 = ( temp << 18 ) / tempbx ;

	    tempdx = (unsigned short)((temp << 18) % tempbx);

            if ( tempdx != 0 )
            temp1 += 1 ;

            temp2 = temp1 ;
            push3 = temp2 ;

	    XGINew_SetReg1(pVBInfo->Part1Port, 0x37, (unsigned short)(temp2 & 0xff));
	    XGINew_SetReg1(pVBInfo->Part1Port, 0x36, (unsigned short)((temp2 >> 8) & 0xff));

	    tempbx = (unsigned short)(temp2 >> 16);
            tempax = tempbx & 0x03 ;

            tempbx = pVBInfo->VGAVDE ;
            if ( tempbx == pVBInfo->VDE )
                tempax |= 0x04 ;

            XGINew_SetReg1( pVBInfo->Part1Port , 0x35 , tempax ) ;

            if ( pVBInfo->VBType & VB_XGI301C )
            {
                temp2 = push3 ;
		XGINew_SetReg1(pVBInfo->Part4Port, 0x3c, (unsigned short)(temp2 & 0xff));
		XGINew_SetReg1(pVBInfo->Part4Port, 0x3b, (unsigned short)((temp2 >> 8) & 0xff));
		tempbx = (unsigned short)(temp2 >> 16);
		XGINew_SetRegANDOR(pVBInfo->Part4Port, 0x3a, ~0xc0, (unsigned short)((tempbx & 0xff) << 6));

                tempcx = pVBInfo->VGAVDE ;
                if ( tempcx == pVBInfo->VDE )
                    XGINew_SetRegANDOR( pVBInfo->Part4Port , 0x30 , ~0x0c , 0x00 ) ;
                else
                    XGINew_SetRegANDOR( pVBInfo->Part4Port , 0x30 , ~0x0c , 0x08 ) ;
            }

            tempcx = pVBInfo->VGAHDE ;
            tempbx = pVBInfo->HDE ;

            temp1 = tempcx << 16 ;

	    tempax = (unsigned short)(temp1 / tempbx);

            if ( ( tempbx & 0xffff ) == ( tempcx & 0xffff ) )
                tempax = 65535 ;

            temp3 = tempax ;
            temp1 = pVBInfo->VGAHDE << 16 ;

            temp1 /= temp3 ;
            temp3 = temp3 << 16 ;
            temp1 -= 1 ;

            temp3 = ( temp3 & 0xffff0000 ) + ( temp1 & 0xffff ) ;

	    tempax = (unsigned short)(temp3 & 0xff);
            XGINew_SetReg1( pVBInfo->Part1Port , 0x1f , tempax ) ;

            temp1 = pVBInfo->VGAVDE << 18 ;
            temp1 = temp1 / push3 ;
	    tempbx = (unsigned short)(temp1 & 0xffff);

            if ( pVBInfo->LCDResInfo == Panel1024x768 )
                tempbx -= 1 ;

            tempax = ( ( tempbx >> 8 ) & 0xff ) << 3 ;
	    tempax |= (unsigned short)((temp3 >> 8) & 0x07);
	    XGINew_SetReg1(pVBInfo->Part1Port, 0x20, (unsigned short)(tempax & 0xff));
	    XGINew_SetReg1(pVBInfo->Part1Port, 0x21, (unsigned short)(tempbx & 0xff));

            temp3 = temp3 >> 16 ;

            if ( modeflag & HalfDCLK )
                temp3 = temp3 >> 1 ;

	    XGINew_SetReg1(pVBInfo->Part1Port , 0x22, (unsigned short)((temp3 >> 8) & 0xff));
	    XGINew_SetReg1(pVBInfo->Part1Port , 0x23, (unsigned short)(temp3 & 0xff));
        }
    }
}


/* --------------------------------------------------------------------- */
/* Function : XGI_SetCRT2ECLK */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_SetCRT2ECLK(unsigned short ModeNo, unsigned short ModeIdIndex, unsigned short RefreshRateTableIndex, struct vb_device_info *pVBInfo)
{
    unsigned char di_0, di_1, tempal;
    int i ;

    tempal = XGI_GetVCLKPtr( RefreshRateTableIndex , ModeNo , ModeIdIndex, pVBInfo ) ;
    XGI_GetVCLKLen( tempal , &di_0 , &di_1, pVBInfo ) ;
    XGI_GetLCDVCLKPtr( &di_0 , &di_1, pVBInfo ) ;

    for( i = 0 ; i < 4 ; i++ )
    {
	XGINew_SetRegANDOR(pVBInfo->P3d4, 0x31, ~0x30, (unsigned short)(0x10 * i));
        if ( pVBInfo->IF_DEF_CH7007 == 1 )
        {
            XGINew_SetReg1( pVBInfo->P3c4 , 0x2b , di_0 ) ;
            XGINew_SetReg1( pVBInfo->P3c4 , 0x2c , di_1 ) ;
        }
        else if ( ( !( pVBInfo->VBInfo & SetCRT2ToLCDA ) ) && ( !( pVBInfo->VBInfo & SetInSlaveMode ) ) )
        {
            XGINew_SetReg1( pVBInfo->P3c4 , 0x2e , di_0 ) ;
            XGINew_SetReg1( pVBInfo->P3c4 , 0x2f , di_1 ) ;
        }
        else
        {
            XGINew_SetReg1( pVBInfo->P3c4 , 0x2b , di_0 ) ;
            XGINew_SetReg1( pVBInfo->P3c4 , 0x2c , di_1 ) ;
        }
    }
}


/* --------------------------------------------------------------------- */
/* Function : XGI_UpdateModeInfo */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_UpdateModeInfo(struct xgi_hw_device_info *HwDeviceExtension, struct vb_device_info *pVBInfo)
{
    unsigned short tempcl ,
           tempch ,
           temp ,
           tempbl ,
           tempax ;

    if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
    {
        tempcl = 0 ;
        tempch = 0 ;
        temp = XGINew_GetReg1( pVBInfo->P3c4 , 0x01 ) ;

        if ( !( temp & 0x20 ) )
        {
            temp = XGINew_GetReg1( pVBInfo->P3d4 , 0x17 ) ;
            if ( temp & 0x80 )
            {
                if ( ( HwDeviceExtension->jChipType >= XG20 ) || ( HwDeviceExtension->jChipType >= XG40 ) )
                    temp = XGINew_GetReg1( pVBInfo->P3d4 , 0x53 ) ;
                else
                    temp = XGINew_GetReg1( pVBInfo->P3d4 , 0x63 ) ;

                if ( !( temp & 0x40 ) )
                    tempcl |= ActiveCRT1 ;
            }
        }

        temp = XGINew_GetReg1( pVBInfo->Part1Port , 0x2e ) ;
        temp &= 0x0f ;

        if ( !( temp == 0x08 ) )
        {
            tempax = XGINew_GetReg1( pVBInfo->Part1Port , 0x13 ) ;	/* Check ChannelA by Part1_13 [2003/10/03] */
            if ( tempax & 0x04 )
               	tempcl = tempcl | ActiveLCD ;

            temp &= 0x05 ;

            if ( !( tempcl & ActiveLCD ) )
            	if ( temp == 0x01 )
                    tempcl |= ActiveCRT2 ;

            if ( temp == 0x04 )
                tempcl |= ActiveLCD ;

            if ( temp == 0x05 )
            {
                temp = XGINew_GetReg1( pVBInfo->Part2Port , 0x00 ) ;

                if( !( temp & 0x08 ) )
                    tempch |= ActiveAVideo ;

                if ( !( temp & 0x04 ) )
                    tempch |= ActiveSVideo ;

                if ( temp & 0x02 )
                    tempch |= ActiveSCART ;

                if ( pVBInfo->VBInfo & SetCRT2ToHiVisionTV )
                {
                    if ( temp & 0x01 )
                        tempch |= ActiveHiTV ;
                }

                if ( pVBInfo->VBInfo & SetCRT2ToYPbPr )
                {
                    temp = XGINew_GetReg1( pVBInfo->Part2Port , 0x4d ) ;

                    if ( temp & 0x10 )
                        tempch |= ActiveYPbPr ;
                }

                if ( tempch != 0 )
                    tempcl |= ActiveTV ;
            }
        }

        temp = XGINew_GetReg1( pVBInfo->P3d4 , 0x3d ) ;
        if ( tempcl & ActiveLCD )
        {
            if ( ( pVBInfo->SetFlag & ReserveTVOption ) )
            {
                if ( temp & ActiveTV )
                    tempcl |= ActiveTV ;
            }
        }
        temp = tempcl ;
        tempbl = ~ModeSwitchStatus ;
        XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x3d , tempbl , temp ) ;

        if ( !( pVBInfo->SetFlag & ReserveTVOption ) )
            XGINew_SetReg1( pVBInfo->P3d4 , 0x3e , tempch ) ;
    }
    else
    {
        return ;
    }
}


/* --------------------------------------------------------------------- */
/* Function : XGI_GetVGAType */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_GetVGAType(struct xgi_hw_device_info *HwDeviceExtension, struct vb_device_info *pVBInfo)
{
    /*
    if ( HwDeviceExtension->jChipType >= XG20 )
    {
        pVBInfo->Set_VGAType = XG20;
    }
    else if ( HwDeviceExtension->jChipType >= XG40 )
    {
        pVBInfo->Set_VGAType = VGA_XGI340 ;
    }
    */
    pVBInfo->Set_VGAType = HwDeviceExtension->jChipType;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_GetVBType */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_GetVBType(struct vb_device_info *pVBInfo)
{
    unsigned short flag , tempbx , tempah ;

    if ( pVBInfo->IF_DEF_CH7007 == 1 )
    {
        pVBInfo->VBType = VB_CH7007 ;
        return;
    }
    if ( pVBInfo->IF_DEF_LVDS == 0 )
    {
        tempbx = VB_XGI302B ;
        flag = XGINew_GetReg1( pVBInfo->Part4Port , 0x00 ) ;
        if ( flag != 0x02 )
        {
            tempbx = VB_XGI301 ;
            flag = XGINew_GetReg1( pVBInfo->Part4Port , 0x01 ) ;
            if ( flag >= 0xB0 )
            {
                tempbx = VB_XGI301B ;
                if ( flag >= 0xC0 )
                {
                    tempbx = VB_XGI301C ;
                    if ( flag >= 0xD0 )
                    {
                        tempbx = VB_XGI301LV ;
                        if ( flag >= 0xE0 )
                        {
                            tempbx = VB_XGI302LV ;
                            tempah = XGINew_GetReg1( pVBInfo->Part4Port , 0x39 ) ;
                            if ( tempah != 0xFF )
                                tempbx = VB_XGI301C ;
                        }
                    }
                }

                if ( tempbx & ( VB_XGI301B | VB_XGI302B ) )
                {
                    flag = XGINew_GetReg1( pVBInfo->Part4Port , 0x23 ) ;

                    if ( !( flag & 0x02 ) )
                        tempbx = tempbx | VB_NoLCD ;
                }
            }
        }
        pVBInfo->VBType = tempbx ;
    }
/*
    else if ( pVBInfo->IF_DEF_CH7017 == 1 )
        pVBInfo->VBType = VB_CH7017 ;
    else  //LVDS
        pVBInfo->VBType = VB_LVDS_NS ;
*/

}


/* --------------------------------------------------------------------- */
/* Function : XGI_GetVBInfo */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_GetVBInfo(unsigned short ModeNo, unsigned short ModeIdIndex, struct xgi_hw_device_info *HwDeviceExtension, struct vb_device_info *pVBInfo)
{
    unsigned short tempax ,
           push ,
           tempbx ,
           temp ,
           modeflag ;

    if ( ModeNo <= 0x13 )
    {
        modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ;
    }
    else
    {
        modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ;
    }

    pVBInfo->SetFlag = 0 ;
    pVBInfo->ModeType = modeflag & ModeInfoFlag ;
    tempbx = 0 ;

    if ( pVBInfo->VBType & 0xFFFF )
    {
        temp = XGINew_GetReg1( pVBInfo->P3d4 , 0x30 ) ;           /* Check Display Device */
        tempbx = tempbx | temp ;
        temp = XGINew_GetReg1( pVBInfo->P3d4 , 0x31 ) ;
        push = temp ;
        push = push << 8 ;
        tempax = temp << 8 ;
        tempbx = tempbx | tempax ;
        temp = ( SetCRT2ToDualEdge | SetCRT2ToYPbPr | SetCRT2ToLCDA | SetInSlaveMode | DisableCRT2Display ) ;
        temp = 0xFFFF ^ temp ;
        tempbx &= temp ;

        temp = XGINew_GetReg1( pVBInfo->P3d4 , 0x38 ) ;

        if ( pVBInfo->IF_DEF_LCDA == 1 )
        {

            if ( ( pVBInfo->Set_VGAType >= XG20 ) || ( pVBInfo->Set_VGAType >= XG40 ))
            {
                if ( pVBInfo->IF_DEF_LVDS == 0 )
                {
                    /* if ( ( pVBInfo->VBType & VB_XGI302B ) || ( pVBInfo->VBType & VB_XGI301LV ) || ( pVBInfo->VBType & VB_XGI302LV ) || ( pVBInfo->VBType & VB_XGI301C ) ) */
                    if ( pVBInfo->VBType & ( VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
                    {
                        if ( temp & EnableDualEdge )
                        {
                            tempbx |= SetCRT2ToDualEdge ;

                            if ( temp & SetToLCDA )
                                tempbx |= SetCRT2ToLCDA ;
                        }
                    }
                }
                else if ( pVBInfo->IF_DEF_CH7017 == 1 )
                {
                    if ( pVBInfo->VBType & VB_CH7017 )
                    {
                        if ( temp & EnableDualEdge )
                        {
                            tempbx |= SetCRT2ToDualEdge ;

                            if ( temp & SetToLCDA )
                                tempbx |= SetCRT2ToLCDA ;
                        }
                    }
                }
            }
        }

        if ( pVBInfo->IF_DEF_YPbPr == 1 )
        {
            if ( ( ( pVBInfo->IF_DEF_LVDS == 0 ) && ( ( pVBInfo->VBType & VB_XGI301LV ) || ( pVBInfo->VBType & VB_XGI302LV ) || ( pVBInfo->VBType & VB_XGI301C ) ) )
            || ( ( pVBInfo->IF_DEF_CH7017 == 1 ) && ( pVBInfo->VBType&VB_CH7017 ) ) || ( (pVBInfo->IF_DEF_CH7007 == 1) && (pVBInfo->VBType&VB_CH7007) ) )    /* [Billy] 07/05/04 */
            {
                if ( temp & SetYPbPr )	/* temp = CR38 */
                {
                    if ( pVBInfo->IF_DEF_HiVision == 1 )
                    {
                        temp = XGINew_GetReg1( pVBInfo->P3d4 , 0x35 ) ;  /* shampoo add for new scratch */
                        temp &= YPbPrMode ;
                        tempbx |= SetCRT2ToHiVisionTV ;

                        if ( temp != YPbPrMode1080i ) {
                            tempbx &= ( ~SetCRT2ToHiVisionTV ) ;
                            tempbx |= SetCRT2ToYPbPr ; }
                    }

                    /* tempbx |= SetCRT2ToYPbPr ; */
                }
            }
        }

        tempax = push ;  /* restore CR31 */

        if ( pVBInfo->IF_DEF_LVDS == 0 )
        {
            if ( pVBInfo->IF_DEF_YPbPr == 1 )
            {
                if ( pVBInfo->IF_DEF_HiVision == 1 )
                    temp = 0x09FC ;
                else
                    temp = 0x097C ;
            }
            else
            {
                if ( pVBInfo->IF_DEF_HiVision == 1 )
                    temp = 0x01FC ;
                else
                    temp = 0x017C ;
            }
        }
        else	/* 3nd party chip */
        {
            if ( pVBInfo->IF_DEF_CH7017 == 1 )
                temp = ( SetCRT2ToTV | SetCRT2ToLCD | SetCRT2ToLCDA ) ;
            else if ( pVBInfo->IF_DEF_CH7007 == 1 )  /* [Billy] 07/05/03 */
            {
                temp = SetCRT2ToTV ;
            }
            else
                temp = SetCRT2ToLCD ;
        }

        if ( !( tempbx & temp ) )
        {
            tempax |= DisableCRT2Display ;
            tempbx = 0 ;
        }

        if ( pVBInfo->IF_DEF_LCDA == 1 )	/* Select Display Device */
        {
            if ( !( pVBInfo->VBType & VB_NoLCD ) )
            {
                if ( tempbx & SetCRT2ToLCDA )
                {
                    if ( tempbx & SetSimuScanMode )
                        tempbx &= ( ~( SetCRT2ToLCD | SetCRT2ToRAMDAC | SwitchToCRT2 ) ) ;
                    else
                        tempbx &= ( ~( SetCRT2ToLCD | SetCRT2ToRAMDAC | SetCRT2ToTV | SwitchToCRT2 ) ) ;
                }
            }
        }

        /* shampoo add */
        if ( !( tempbx & ( SwitchToCRT2 | SetSimuScanMode ) ) )	/* for driver abnormal */
        {
            if ( pVBInfo->IF_DEF_CRT2Monitor == 1 )
            {
                if ( tempbx & SetCRT2ToRAMDAC )
                {
                    tempbx &= ( 0xFF00 | SetCRT2ToRAMDAC | SwitchToCRT2 | SetSimuScanMode ) ;
                    tempbx &= ( 0x00FF | ( ~SetCRT2ToYPbPr ) ) ;
                }
            }
            else
                tempbx &= ( ~( SetCRT2ToRAMDAC | SetCRT2ToLCD | SetCRT2ToTV ) ) ;
        }

        if ( !( pVBInfo->VBType & VB_NoLCD ) )
        {
            if ( tempbx & SetCRT2ToLCD )
            {
                tempbx &= ( 0xFF00 | SetCRT2ToLCD | SwitchToCRT2 | SetSimuScanMode ) ;
                tempbx &= ( 0x00FF | ( ~SetCRT2ToYPbPr ) ) ;
            }
        }

        if ( tempbx & SetCRT2ToSCART )
        {
            tempbx &= ( 0xFF00 | SetCRT2ToSCART | SwitchToCRT2 | SetSimuScanMode ) ;
            tempbx &= ( 0x00FF | ( ~SetCRT2ToYPbPr ) ) ;
        }

        if ( pVBInfo->IF_DEF_YPbPr == 1 )
        {
            if ( tempbx & SetCRT2ToYPbPr )
                tempbx &= ( 0xFF00 | SwitchToCRT2 | SetSimuScanMode ) ;
        }

        if ( pVBInfo->IF_DEF_HiVision == 1 )
        {
            if ( tempbx & SetCRT2ToHiVisionTV )
                tempbx &= ( 0xFF00 | SetCRT2ToHiVisionTV | SwitchToCRT2 | SetSimuScanMode ) ;
        }

        if ( tempax & DisableCRT2Display )	/* Set Display Device Info */
        {
            if ( !( tempbx & ( SwitchToCRT2 | SetSimuScanMode ) ) )
                tempbx = DisableCRT2Display ;
        }

        if ( !( tempbx & DisableCRT2Display ) )
        {
            if ( ( !( tempbx & DriverMode ) ) || ( !( modeflag & CRT2Mode ) ) )
            {
                if ( pVBInfo->IF_DEF_LCDA == 1 )
      	        {
                    if ( !( tempbx & SetCRT2ToLCDA ) )
                        tempbx |= ( SetInSlaveMode | SetSimuScanMode ) ;
                }

                if ( pVBInfo->IF_DEF_VideoCapture == 1 )
                {
                    if ( ( ( HwDeviceExtension->jChipType == XG40 ) && ( pVBInfo->Set_VGAType == XG40 ) )
                    || ( ( HwDeviceExtension->jChipType == XG41 ) && ( pVBInfo->Set_VGAType == XG41 ) )
                    || ( ( HwDeviceExtension->jChipType == XG42 ) && ( pVBInfo->Set_VGAType == XG42 ) )
                    || ( ( HwDeviceExtension->jChipType == XG45 ) && ( pVBInfo->Set_VGAType == XG45 ) ) )
                    {
                        if ( ModeNo <= 13 )
                        {
                            if ( !( tempbx & SetCRT2ToRAMDAC ) )	/*CRT2 not need to support*/
                            {
                                tempbx &= ( 0x00FF | ( ~SetInSlaveMode ) ) ;
                                pVBInfo->SetFlag |= EnableVCMode ;
                            }
                        }
                    }
                }
            }

            /*LCD+TV can't support in slave mode (Force LCDA+TV->LCDB)*/
            if ( ( tempbx & SetInSlaveMode ) && ( tempbx & SetCRT2ToLCDA ) )
            {
                tempbx ^= ( SetCRT2ToLCD | SetCRT2ToLCDA | SetCRT2ToDualEdge ) ;
                pVBInfo->SetFlag |= ReserveTVOption ;
            }
        }
    }

    pVBInfo->VBInfo = tempbx ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_GetTVInfo */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_GetTVInfo(unsigned short ModeNo, unsigned short ModeIdIndex, struct vb_device_info *pVBInfo)
{
    unsigned short temp ,
           tempbx = 0 ,
           resinfo = 0 ,
           modeflag ,
           index1 ;

    tempbx = 0 ;
    resinfo = 0 ;

    if ( pVBInfo->VBInfo & SetCRT2ToTV )
    {
        if ( ModeNo <= 0x13 )
        {
            modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ;	/* si+St_ModeFlag */
            resinfo = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ResInfo ;	/* si+St_ResInfo */
        }
        else
        {
            modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ;
            resinfo = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_RESINFO ; /* si+Ext_ResInfo */
        }

        if ( pVBInfo->VBInfo & SetCRT2ToTV )
        {
            temp = XGINew_GetReg1( pVBInfo->P3d4 , 0x35 ) ;
            tempbx = temp;
            if ( tempbx & SetPALTV )
            {
                tempbx &= ( SetCHTVOverScan | SetPALMTV | SetPALNTV | SetPALTV ) ;
                if ( tempbx & SetPALMTV )
                    tempbx &= ~SetPALTV ; /* set to NTSC if PAL-M */
            }
            else
                tempbx &= ( SetCHTVOverScan | SetNTSCJ | SetPALTV ) ;
/*
            if ( pVBInfo->IF_DEF_LVDS == 0 )
            {
                index1 = XGINew_GetReg1( pVBInfo->P3d4 , 0x38 ) ; //PAL-M/PAL-N Info
                temp2 = ( index1 & 0xC0 ) >> 5 ; 	        //00:PAL, 01:PAL-M, 10:PAL-N
                tempbx |= temp2 ;
                if ( temp2 & 0x02 )          //PAL-M
                    tempbx &= ( ~SetPALTV ) ;
            }
*/
        }

        if ( pVBInfo->IF_DEF_CH7017 == 1 )
        {
            tempbx = XGINew_GetReg1( pVBInfo->P3d4 , 0x35 ) ;

            if ( tempbx & TVOverScan )
                tempbx |= SetCHTVOverScan ;
        }

        if ( pVBInfo->IF_DEF_CH7007 == 1 ) /* [Billy] 07/05/04 */
        {
            tempbx = XGINew_GetReg1( pVBInfo->P3d4 , 0x35 ) ;

            if ( tempbx & TVOverScan )
            {
                tempbx |= SetCHTVOverScan ;
            }
        }


        if ( pVBInfo->IF_DEF_LVDS == 0 )
        {
            if ( pVBInfo->VBInfo & SetCRT2ToSCART )
                tempbx |= SetPALTV ;
        }

        if ( pVBInfo->IF_DEF_YPbPr == 1 )
        {
            if ( pVBInfo->VBInfo & SetCRT2ToYPbPr )
            {
                index1 = XGINew_GetReg1( pVBInfo->P3d4 , 0x35 ) ;
                index1 &= YPbPrMode ;

                if ( index1 == YPbPrMode525i )
                    tempbx |= SetYPbPrMode525i ;

                if ( index1 == YPbPrMode525p )
                    tempbx = tempbx | SetYPbPrMode525p;
                if ( index1 == YPbPrMode750p)
                    tempbx = tempbx | SetYPbPrMode750p;
            }
        }

        if ( pVBInfo->IF_DEF_HiVision == 1 )
        {
            if ( pVBInfo->VBInfo & SetCRT2ToHiVisionTV )
            {
                tempbx = tempbx | SetYPbPrMode1080i | SetPALTV ;
            }
        }

        if ( pVBInfo->IF_DEF_LVDS == 0 )
        {      /* shampoo */
            if ( ( pVBInfo->VBInfo & SetInSlaveMode ) && ( !( pVBInfo->VBInfo & SetNotSimuMode ) ) )
                tempbx |= TVSimuMode ;

            if ( !( tempbx & SetPALTV ) && ( modeflag > 13 ) && ( resinfo == 8 ) ) /* NTSC 1024x768, */
                tempbx |= NTSC1024x768 ;

            tempbx |= RPLLDIV2XO ;

            if ( pVBInfo->VBInfo & SetCRT2ToHiVisionTV )
            {
                if ( pVBInfo->VBInfo & SetInSlaveMode )
                    tempbx &=( ~RPLLDIV2XO ) ;
            }
            else
            {
                if ( tempbx & ( SetYPbPrMode525p | SetYPbPrMode750p ) )
                    tempbx &= ( ~RPLLDIV2XO ) ;
                else if ( !( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) ) )
                {
                    if ( tempbx & TVSimuMode )
                        tempbx &= ( ~RPLLDIV2XO ) ;
                }
            }
        }
    }
    pVBInfo->TVInfo = tempbx ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_GetLCDInfo */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
unsigned char XGI_GetLCDInfo(unsigned short ModeNo, unsigned short ModeIdIndex,
			     struct vb_device_info *pVBInfo)
{
    unsigned short temp ,
           tempax ,
           tempbx ,
           modeflag ,
           resinfo = 0 ,
           LCDIdIndex ;

    pVBInfo->LCDResInfo = 0 ;
    pVBInfo->LCDTypeInfo = 0 ;
    pVBInfo->LCDInfo = 0 ;

    if ( ModeNo <= 0x13 )
    {
        modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ;  /* si+St_ModeFlag // */
    }
    else
    {
        modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ;
        resinfo = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_RESINFO ; /* si+Ext_ResInfo// */
    }

    temp = XGINew_GetReg1( pVBInfo->P3d4 , 0x36 ) ; /* Get LCD Res.Info */
    tempbx = temp & 0x0F ;

    if ( tempbx == 0 )
        tempbx = Panel1024x768 ; /* default */

    /* LCD75 [2003/8/22] Vicent */
    if ( ( tempbx == Panel1024x768 ) || ( tempbx == Panel1280x1024 ) )
    {
        if ( pVBInfo->VBInfo & DriverMode )
        {
            tempax = XGINew_GetReg1( pVBInfo->P3d4 , 0x33 ) ;
            if ( pVBInfo->VBInfo & SetCRT2ToLCDA )
                tempax &= 0x0F ;
            else
                tempax = tempax >> 4 ;

            if ( ( resinfo == 6 ) || ( resinfo == 9 ) )
            {
                if ( tempax >= 3 )
      	            tempbx |= PanelRef75Hz ;
            }
            else if ( ( resinfo == 7 ) || ( resinfo == 8 ) )
            {
      	        if ( tempax >= 4 )
      	            tempbx |= PanelRef75Hz ;
            }
        }
    }

    pVBInfo->LCDResInfo = tempbx ;

    /* End of LCD75 */

    if( pVBInfo->IF_DEF_OEMUtil == 1 )
    {
        pVBInfo->LCDTypeInfo = ( temp & 0xf0 ) >> 4 ;
    }

    if ( !( pVBInfo->VBInfo & ( SetCRT2ToLCD | SetCRT2ToLCDA ) ) )
    {
        return 0;
    }

    tempbx = 0 ;

    temp = XGINew_GetReg1( pVBInfo->P3d4 , 0x37 ) ;

    temp &= ( ScalingLCD | LCDNonExpanding | LCDSyncBit | SetPWDEnable ) ;

    if ( ( pVBInfo->IF_DEF_ScaleLCD == 1 ) && ( temp & LCDNonExpanding ) )
        temp &= ~EnableScalingLCD ;

    tempbx |= temp ;

    LCDIdIndex = XGI_GetLCDCapPtr1(pVBInfo) ;

    tempax = pVBInfo->LCDCapList[ LCDIdIndex ].LCD_Capability ;

    if ( pVBInfo->IF_DEF_LVDS == 0 )	/* shampoo */
    {
        if ( ( ( pVBInfo->VBType & VB_XGI302LV ) || ( pVBInfo->VBType & VB_XGI301C ) ) && ( tempax & LCDDualLink ) )
        {
            tempbx |= SetLCDDualLink ;
        }
    }

    if ( pVBInfo->IF_DEF_CH7017 == 1 )
    {
        if ( tempax & LCDDualLink )
        {
            tempbx |= SetLCDDualLink ;
        }
    }

    if ( pVBInfo->IF_DEF_LVDS == 0 )
    {
        if ( ( pVBInfo->LCDResInfo == Panel1400x1050 ) && ( pVBInfo->VBInfo & SetCRT2ToLCD ) && ( ModeNo > 0x13 ) && ( resinfo == 9 ) && ( !( tempbx & EnableScalingLCD ) ) )
            tempbx |= SetLCDtoNonExpanding ;	/* set to center in 1280x1024 LCDB for Panel1400x1050 */
    }

/*
    if ( tempax & LCDBToA )
    {
        tempbx |= SetLCDBToA ;
    }
*/

    if ( pVBInfo->IF_DEF_ExpLink == 1 )
    {
        if ( modeflag & HalfDCLK )
        {
            /* if ( !( pVBInfo->LCDInfo&LCDNonExpanding ) ) */
            if ( !( tempbx & SetLCDtoNonExpanding ) )
            {
                tempbx |= EnableLVDSDDA ;
            }
            else
            {
                if ( ModeNo > 0x13 )
                {
                    if ( pVBInfo->LCDResInfo == Panel1024x768 )
                    {
                        if ( resinfo == 4 )
                        {                                /* 512x384  */
                            tempbx |= EnableLVDSDDA ;
                        }
                    }
                }
            }
        }
    }

    if ( pVBInfo->VBInfo & SetInSlaveMode )
    {
        if ( pVBInfo->VBInfo & SetNotSimuMode )
        {
            tempbx |= LCDVESATiming ;
        }
    }
    else
    {
        tempbx |= LCDVESATiming ;
    }

    pVBInfo->LCDInfo = tempbx ;

    if ( pVBInfo->IF_DEF_PWD == 1 )
    {
        if ( pVBInfo->LCDInfo & SetPWDEnable )
        {
            if ( ( pVBInfo->VBType & VB_XGI302LV ) || ( pVBInfo->VBType & VB_XGI301C ) )
            {
                if ( !( tempax & PWDEnable ) )
                {
                    pVBInfo->LCDInfo &= ~SetPWDEnable ;
                }
            }
        }
    }

    if ( pVBInfo->IF_DEF_LVDS == 0 )
    {
        if ( tempax & ( LockLCDBToA | StLCDBToA ) )
        {
            if ( pVBInfo->VBInfo & SetInSlaveMode )
            {
                if ( !( tempax & LockLCDBToA ) )
                {
                    if ( ModeNo <= 0x13 )
                    {
                        pVBInfo->VBInfo &= ~( SetSimuScanMode | SetInSlaveMode | SetCRT2ToLCD ) ;
                        pVBInfo->VBInfo |= SetCRT2ToLCDA | SetCRT2ToDualEdge ;
                    }
                }
            }
        }
    }

/*
    if ( pVBInfo->IF_DEF_LVDS == 0 )
    {
        if ( tempax & ( LockLCDBToA | StLCDBToA ) )
        {
            if ( pVBInfo->VBInfo & SetInSlaveMode )
            {
                if ( !( ( !( tempax & LockLCDBToA ) ) && ( ModeNo > 0x13 ) ) )
                {
                    pVBInfo->VBInfo&=~(SetSimuScanMode|SetInSlaveMode|SetCRT2ToLCD);
                    pVBInfo->VBInfo|=SetCRT2ToLCDA|SetCRT2ToDualEdge;
                }
            }
        }
    }
*/

    return( 1 ) ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_SearchModeID */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
unsigned char XGI_SearchModeID(unsigned short ModeNo,
			       unsigned short *ModeIdIndex,
			       struct vb_device_info *pVBInfo)
{



#ifdef LINUX /* chiawen for linux solution */

    if ( ModeNo <= 5 )
        ModeNo |= 1 ;
    if ( ModeNo <= 0x13 )
    {
	/* for (*ModeIdIndex=0;*ModeIdIndex<sizeof(pVBInfo->SModeIDTable)/sizeof(struct XGI_StStruct);(*ModeIdIndex)++) */
        for( *ModeIdIndex = 0 ; ; ( *ModeIdIndex )++ )
        {
		if (pVBInfo->SModeIDTable[*ModeIdIndex].St_ModeID == ModeNo)
			break;
		if (pVBInfo->SModeIDTable[*ModeIdIndex].St_ModeID == 0xFF)
			return 0;
        }

        if ( ModeNo == 0x07 )
            ( *ModeIdIndex )++ ; /* 400 lines */

        if ( ModeNo <= 3 )
            ( *ModeIdIndex ) += 2 ; /* 400 lines */
        /* else 350 lines */
    }
    else
    {
	/* for (*ModeIdIndex=0;*ModeIdIndex<sizeof(pVBInfo->EModeIDTable)/sizeof(struct XGI_ExtStruct);(*ModeIdIndex)++) */
        for( *ModeIdIndex = 0 ; ; ( *ModeIdIndex )++ )
        {
		if (pVBInfo->EModeIDTable[*ModeIdIndex].Ext_ModeID == ModeNo)
			break;
		if (pVBInfo->EModeIDTable[*ModeIdIndex].Ext_ModeID == 0xFF)
			return 0;
        }
    }

#endif

    return 1;
}




/* win2000 MM adapter not support standard mode! */

/* --------------------------------------------------------------------- */
/* Function : */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
unsigned char XGINew_CheckMemorySize(struct xgi_hw_device_info *HwDeviceExtension,
				     unsigned short ModeNo,
				     unsigned short ModeIdIndex,
				     struct vb_device_info *pVBInfo)
{
    unsigned short memorysize ,
           modeflag ,
           temp ,
           temp1 ,
           tmp ;

/*  if ( ( HwDeviceExtension->jChipType == XGI_650 ) ||
         ( HwDeviceExtension->jChipType == XGI_650M ) )
    {
	return 1;
    } */

    if ( ModeNo <= 0x13 )
    {
        modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ;
    }
    else  {
        modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ;
    }

    /* ModeType = modeflag&ModeInfoFlag ; // Get mode type */

    memorysize = modeflag & MemoryInfoFlag ;
    memorysize = memorysize > MemorySizeShift ;
    memorysize++ ;					/* Get memory size */

    temp = XGINew_GetReg1( pVBInfo->P3c4 , 0x14 ) ;	/* Get DRAM Size */
    tmp = temp ;

    if ( HwDeviceExtension->jChipType == XG40 )
    {
        temp = 1 << ( ( temp & 0x0F0 ) >> 4 ) ;		/* memory size per channel SR14[7:4] */
        if ( ( tmp & 0x0c ) == 0x0C )			/* Qual channels */
        {
            temp <<= 2 ;
        }
        else if ( ( tmp & 0x0c ) == 0x08 )		/* Dual channels */
        {
            temp <<= 1 ;
        }
    }
    else if ( HwDeviceExtension->jChipType == XG42 )
    {
    	temp = 1 << ( ( temp & 0x0F0 ) >> 4 ) ;		/* memory size per channel SR14[7:4] */
        if ( ( tmp & 0x04 ) == 0x04 )			/* Dual channels */
        {
            temp <<= 1 ;
        }
    }
    else if ( HwDeviceExtension->jChipType == XG45 )
    {
    	temp = 1 << ( ( temp & 0x0F0 ) >> 4 ) ;		/* memory size per channel SR14[7:4] */
    	if ( ( tmp & 0x0c ) == 0x0C )			/* Qual channels */
        {
            temp <<= 2 ;
        }
        else if ( ( tmp & 0x0c ) == 0x08 )		/* triple channels */
        {
            temp1 = temp ;
            temp <<= 1 ;
            temp += temp1 ;
        }
        else if ( ( tmp & 0x0c ) == 0x04 )		/* Dual channels */
        {
            temp <<= 1 ;
        }
    }
    if (temp < memorysize)
	    return 0;
    else
	    return 1;
}


/* --------------------------------------------------------------------- */
/* Function : XGINew_IsLowResolution */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
/*void XGINew_IsLowResolution(unsigned short ModeNo, unsigned short ModeIdIndex, unsigned char XGINew_CheckMemorySize(struct xgi_hw_device_info *HwDeviceExtension, unsigned short ModeNo, unsigned short ModeIdIndex, struct vb_device_info *pVBInfo)
{
    unsigned short data ;
    unsigned short ModeFlag ;

    data = XGINew_GetReg1( pVBInfo->P3c4 , 0x0F ) ;
    data &= 0x7F ;
    XGINew_SetReg1( pVBInfo->P3c4 , 0x0F , data ) ;

    if ( ModeNo > 0x13 )
    {
        ModeFlag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ;
        if ( ( ModeFlag & HalfDCLK ) && ( ModeFlag & DoubleScanMode ) )
        {
            data = XGINew_GetReg1( pVBInfo->P3c4 , 0x0F ) ;
            data |= 0x80 ;
            XGINew_SetReg1( pVBInfo->P3c4 , 0x0F , data ) ;
            data = XGINew_GetReg1( pVBInfo->P3c4 , 0x01 ) ;
            data &= 0xF7 ;
            XGINew_SetReg1( pVBInfo->P3c4 , 0x01 , data ) ;
        }
    }
}

*/

/* --------------------------------------------------------------------- */
/* Function : XGI_DisplayOn */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_DisplayOn(struct xgi_hw_device_info *pXGIHWDE, struct vb_device_info *pVBInfo)
{

    XGINew_SetRegANDOR(pVBInfo->P3c4,0x01,0xDF,0x00);
    if ( pXGIHWDE->jChipType == XG21 )
    {
       if ( pVBInfo->IF_DEF_LVDS == 1 )
       {
         if (!(XGI_XG21GetPSCValue( pVBInfo )&0x1))
         {
            XGI_XG21BLSignalVDD( 0x01 , 0x01, pVBInfo ) ; /* LVDS VDD on */
            XGI_XG21SetPanelDelay( 2,pVBInfo ) ;
         }
         if (!(XGI_XG21GetPSCValue( pVBInfo )&0x20))
         {
            XGI_XG21BLSignalVDD( 0x20 , 0x20, pVBInfo ) ; /* LVDS signal on */
         }
         XGI_XG21SetPanelDelay( 3,pVBInfo ) ;
         XGI_XG21BLSignalVDD( 0x02 , 0x02, pVBInfo ) ; /* LVDS backlight on */
       }
       else
       {
            XGI_XG21BLSignalVDD( 0x20 , 0x20, pVBInfo ) ; /* DVO/DVI signal on */
       }

    }

    if (pVBInfo->IF_DEF_CH7007 == 1) /* [Billy] 07/05/23 For CH7007 */
    {

    }


    if ( pXGIHWDE->jChipType == XG27 )
    {
       if ( pVBInfo->IF_DEF_LVDS == 1 )
       {
         if (!(XGI_XG27GetPSCValue( pVBInfo )&0x1))
         {
            XGI_XG27BLSignalVDD( 0x01 , 0x01, pVBInfo ) ; /* LVDS VDD on */
            XGI_XG21SetPanelDelay( 2,pVBInfo ) ;
         }
         if (!(XGI_XG27GetPSCValue( pVBInfo )&0x20))
         {
            XGI_XG27BLSignalVDD( 0x20 , 0x20, pVBInfo ) ; /* LVDS signal on */
         }
         XGI_XG21SetPanelDelay( 3,pVBInfo ) ;
         XGI_XG27BLSignalVDD( 0x02 , 0x02, pVBInfo ) ; /* LVDS backlight on */
       }
       else
       {
            XGI_XG27BLSignalVDD( 0x20 , 0x20, pVBInfo ) ; /* DVO/DVI signal on */
       }

    }
}


/* --------------------------------------------------------------------- */
/* Function : XGI_DisplayOff */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_DisplayOff(struct xgi_hw_device_info *pXGIHWDE, struct vb_device_info *pVBInfo)
{

    if ( pXGIHWDE->jChipType == XG21 )
    {
       if ( pVBInfo->IF_DEF_LVDS == 1 )
       {
         XGI_XG21BLSignalVDD( 0x02 , 0x00, pVBInfo ) ; /* LVDS backlight off */
         XGI_XG21SetPanelDelay( 3,pVBInfo ) ;
       }
       else
       {
            XGI_XG21BLSignalVDD( 0x20 , 0x00, pVBInfo ) ; /* DVO/DVI signal off */
       }
    }

    if (pVBInfo->IF_DEF_CH7007 == 1) /*[Billy] 07/05/23 For CH7007 */
    {
       /* if( IsCH7007TVMode( pVBInfo ) == 0 ) */
       {
       }
    }


    if ( pXGIHWDE->jChipType == XG27 )
    {
       if ((XGI_XG27GetPSCValue( pVBInfo )&0x2))
       {
         XGI_XG27BLSignalVDD( 0x02 , 0x00, pVBInfo ) ; /* LVDS backlight off */
         XGI_XG21SetPanelDelay( 3,pVBInfo ) ;
       }

       if ( pVBInfo->IF_DEF_LVDS == 0 )
       {
            XGI_XG27BLSignalVDD( 0x20 , 0x00, pVBInfo ) ; /* DVO/DVI signal off */
       }
    }

    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x01 , 0xDF , 0x20 ) ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_WaitDisply */
/* Input : */
/* Output : */
/* Description : chiawen for sensecrt1 */
/* --------------------------------------------------------------------- */
void XGI_WaitDisply(struct vb_device_info *pVBInfo)
{
    while( ( XGINew_GetReg2( pVBInfo->P3da ) & 0x01 ) )
        break ;

    while( !( XGINew_GetReg2( pVBInfo->P3da ) & 0x01 ) )
        break ;
}

/* --------------------------------------------------------------------- */
/* Function : XGI_SenseCRT1 */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */

void XGI_SenseCRT1(struct vb_device_info *pVBInfo)
{
	unsigned char CRTCData[17] = {
		0x5F , 0x4F , 0x50 , 0x82 , 0x55 , 0x81 ,
		0x0B , 0x3E , 0xE9 , 0x0B , 0xDF , 0xE7 ,
		0x04 , 0x00 , 0x00 , 0x05 , 0x00 };

	unsigned char SR01 = 0, SR1F = 0, SR07 = 0, SR06 = 0;

	unsigned char CR17, CR63, SR31;
	unsigned short temp ;
	unsigned char DAC_TEST_PARMS[3] = { 0x0F, 0x0F, 0x0F } ;

    int i ;
    XGINew_SetReg1( pVBInfo->P3c4 , 0x05 , 0x86 ) ;

    /* [2004/05/06] Vicent to fix XG42 single LCD sense to CRT+LCD */
    XGINew_SetReg1( pVBInfo->P3d4 , 0x57 , 0x4A ) ;
    XGINew_SetReg1(pVBInfo->P3d4, 0x53, (unsigned char)(XGINew_GetReg1(pVBInfo->P3d4, 0x53) | 0x02));

    SR31 = (unsigned char)XGINew_GetReg1(pVBInfo->P3c4, 0x31);
    CR63 = (unsigned char)XGINew_GetReg1(pVBInfo->P3d4, 0x63);
    SR01 = (unsigned char)XGINew_GetReg1(pVBInfo->P3c4, 0x01);

    XGINew_SetReg1(pVBInfo->P3c4, 0x01, (unsigned char)(SR01 & 0xDF));
    XGINew_SetReg1(pVBInfo->P3d4, 0x63, (unsigned char)(CR63 & 0xBF));

    CR17 = (unsigned char)XGINew_GetReg1(pVBInfo->P3d4, 0x17);
    XGINew_SetReg1(pVBInfo->P3d4, 0x17, (unsigned char)(CR17 | 0x80)) ;

    SR1F = (unsigned char)XGINew_GetReg1(pVBInfo->P3c4, 0x1F);
    XGINew_SetReg1(pVBInfo->P3c4, 0x1F, (unsigned char)(SR1F | 0x04));

    SR07 = (unsigned char)XGINew_GetReg1(pVBInfo->P3c4, 0x07);
    XGINew_SetReg1(pVBInfo->P3c4, 0x07, (unsigned char)(SR07 & 0xFB));
    SR06 = (unsigned char)XGINew_GetReg1(pVBInfo->P3c4, 0x06);
    XGINew_SetReg1(pVBInfo->P3c4, 0x06, (unsigned char)(SR06 & 0xC3));

    XGINew_SetReg1( pVBInfo->P3d4 , 0x11 , 0x00 ) ;

    for( i = 0 ; i < 8 ; i++ )
	    XGINew_SetReg1(pVBInfo->P3d4, (unsigned short)i, CRTCData[i]);

    for( i = 8 ; i < 11 ; i++ )
	    XGINew_SetReg1(pVBInfo->P3d4, (unsigned short)(i + 8), CRTCData[i]);

    for( i = 11 ; i < 13 ; i++ )
	    XGINew_SetReg1(pVBInfo->P3d4, (unsigned short)(i + 4), CRTCData[i]);

    for( i = 13 ; i < 16 ; i++ )
	    XGINew_SetReg1(pVBInfo->P3c4, (unsigned short)(i - 3), CRTCData[i]);

    XGINew_SetReg1(pVBInfo->P3c4, 0x0E, (unsigned char)(CRTCData[16] & 0xE0));

    XGINew_SetReg1( pVBInfo->P3c4 , 0x31 , 0x00 ) ;
    XGINew_SetReg1( pVBInfo->P3c4 , 0x2B , 0x1B ) ;
    XGINew_SetReg1( pVBInfo->P3c4 , 0x2C , 0xE1 ) ;

    XGINew_SetReg3( pVBInfo->P3c8 , 0x00 ) ;

    for( i = 0 ; i < 256 ; i++ )
    {
	XGINew_SetReg3((pVBInfo->P3c8 + 1), (unsigned char)DAC_TEST_PARMS[0]);
	XGINew_SetReg3((pVBInfo->P3c8 + 1), (unsigned char)DAC_TEST_PARMS[1]);
	XGINew_SetReg3((pVBInfo->P3c8 + 1), (unsigned char)DAC_TEST_PARMS[2]);
    }

    XGI_VBLongWait( pVBInfo ) ;
    XGI_VBLongWait( pVBInfo ) ;
    XGI_VBLongWait( pVBInfo ) ;

    XGINew_LCD_Wait_Time( 0x01 , pVBInfo ) ;

    XGI_WaitDisply( pVBInfo ) ;
    temp = XGINew_GetReg2( pVBInfo->P3c2 ) ;

    if( temp & 0x10 )
    {
        XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x32 , 0xDF , 0x20 ) ;
    }
    else
    {
        XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x32 , 0xDF , 0x00 ) ;
    }

    /* alan, avoid display something, set BLACK DAC if not restore DAC */
    XGINew_SetReg3( pVBInfo->P3c8 , 0x00 ) ;

    for( i = 0 ; i < 256 ; i++ )
    {
      XGINew_SetReg3( ( pVBInfo->P3c8 + 1 ) , 0 ) ;
      XGINew_SetReg3( ( pVBInfo->P3c8 + 1 ) , 0 ) ;
      XGINew_SetReg3( ( pVBInfo->P3c8 + 1 ) , 0 ) ;
    }

    XGINew_SetReg1( pVBInfo->P3c4 , 0x01 , SR01 ) ;
    XGINew_SetReg1( pVBInfo->P3d4 , 0x63 , CR63 ) ;
    XGINew_SetReg1( pVBInfo->P3c4 , 0x31 , SR31 ) ;

    /* [2004/05/11] Vicent */
    XGINew_SetReg1(pVBInfo->P3d4, 0x53,
		   (unsigned char)(XGINew_GetReg1(pVBInfo->P3d4, 0x53) & 0xFD));
    XGINew_SetReg1(pVBInfo->P3c4, 0x1F, (unsigned char)SR1F);
}










/* --------------------------------------------------------------------- */
/* Function : XGI_WaitDisplay */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_WaitDisplay(struct vb_device_info *pVBInfo)
{
    while( !( XGINew_GetReg2( pVBInfo->P3da ) & 0x01 ) ) ;

    while( XGINew_GetReg2( pVBInfo->P3da ) & 0x01 ) ;
}




/* --------------------------------------------------------------------- */
/* Function : XGI_SetCRT2Group301 */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
unsigned char XGI_SetCRT2Group301(unsigned short ModeNo,
				  struct xgi_hw_device_info *HwDeviceExtension,
				  struct vb_device_info *pVBInfo)
{
    unsigned short tempbx ,
           ModeIdIndex ,
           RefreshRateTableIndex ;

    tempbx=pVBInfo->VBInfo ;
    pVBInfo->SetFlag |= ProgrammingCRT2 ;
    XGI_SearchModeID( ModeNo , &ModeIdIndex,  pVBInfo ) ;
    pVBInfo->SelectCRT2Rate = 4 ;
    RefreshRateTableIndex = XGI_GetRatePtrCRT2( HwDeviceExtension, ModeNo , ModeIdIndex, pVBInfo ) ;
    XGI_SaveCRT2Info( ModeNo, pVBInfo ) ;
    XGI_GetCRT2ResInfo( ModeNo , ModeIdIndex, pVBInfo) ;
    XGI_GetCRT2Data( ModeNo , ModeIdIndex , RefreshRateTableIndex, pVBInfo ) ;
    XGI_PreSetGroup1( ModeNo , ModeIdIndex , HwDeviceExtension , RefreshRateTableIndex, pVBInfo ) ;
    XGI_SetGroup1( ModeNo , ModeIdIndex , HwDeviceExtension , RefreshRateTableIndex, pVBInfo ) ;
    XGI_SetLockRegs( ModeNo , ModeIdIndex , HwDeviceExtension , RefreshRateTableIndex, pVBInfo ) ;
    XGI_SetGroup2(  ModeNo , ModeIdIndex , RefreshRateTableIndex , HwDeviceExtension, pVBInfo ) ;
    XGI_SetLCDRegs(ModeNo , ModeIdIndex , HwDeviceExtension , RefreshRateTableIndex, pVBInfo ) ;
    XGI_SetTap4Regs(pVBInfo) ;
    XGI_SetGroup3(ModeNo, ModeIdIndex, pVBInfo);
    XGI_SetGroup4( ModeNo , ModeIdIndex , RefreshRateTableIndex , HwDeviceExtension, pVBInfo ) ;
    XGI_SetCRT2VCLK( ModeNo , ModeIdIndex , RefreshRateTableIndex, pVBInfo ) ;
    XGI_SetGroup5( ModeNo , ModeIdIndex, pVBInfo) ;
    XGI_AutoThreshold( pVBInfo) ;
    return 1 ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_AutoThreshold */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_AutoThreshold(struct vb_device_info *pVBInfo)
{
    if ( !( pVBInfo->SetFlag & Win9xDOSMode ) )
      XGINew_SetRegOR( pVBInfo->Part1Port , 0x01 , 0x40 ) ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_SaveCRT2Info */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_SaveCRT2Info(unsigned short ModeNo, struct vb_device_info *pVBInfo)
{
    unsigned short temp1 ,
           temp2 ;

    XGINew_SetReg1( pVBInfo->P3d4 , 0x34 , ModeNo ) ;  /* reserve CR34 for CRT1 Mode No */
    temp1 = ( pVBInfo->VBInfo&SetInSlaveMode ) >> 8 ;
    temp2 = ~( SetInSlaveMode >> 8 ) ;
    XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x31 , temp2 , temp1 ) ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_GetCRT2ResInfo */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_GetCRT2ResInfo(unsigned short ModeNo,
			unsigned short ModeIdIndex,
			struct vb_device_info *pVBInfo)
{
    unsigned short xres ,
           yres ,
           modeflag ,
           resindex ;

    resindex = XGI_GetResInfo( ModeNo , ModeIdIndex, pVBInfo) ;
    if ( ModeNo <= 0x13 )
    {
        xres = pVBInfo->StResInfo[ resindex ].HTotal ;
        yres = pVBInfo->StResInfo[ resindex ].VTotal ;
     /* modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag; si+St_ResInfo */
    }
    else
    {
        xres = pVBInfo->ModeResInfo[ resindex ].HTotal ;			/* xres->ax */
        yres = pVBInfo->ModeResInfo[ resindex ].VTotal ;			/* yres->bx */
        modeflag = pVBInfo->EModeIDTable[ ModeIdIndex].Ext_ModeFlag ;		/* si+St_ModeFlag */

/*        if ( pVBInfo->IF_DEF_FSTN )
        {
            xres *= 2 ;
            yres *= 2 ;
        }
        else
        {
*/
            if ( modeflag & HalfDCLK )
                xres *= 2;

            if ( modeflag & DoubleScanMode )
                yres *= 2 ;
/* } */
    }

    if ( pVBInfo->VBInfo & SetCRT2ToLCD )
    {
        if ( pVBInfo->IF_DEF_LVDS == 0 )
        {
            if ( pVBInfo->LCDResInfo == Panel1600x1200 )
            {
                if ( !( pVBInfo->LCDInfo & LCDVESATiming ) )
                {
                    if ( yres == 1024 )
                        yres = 1056 ;
	        }
            }

            if ( pVBInfo->LCDResInfo == Panel1280x1024 )
            {
	        if ( yres == 400 )
	            yres = 405 ;
	        else if ( yres == 350 )
	            yres = 360 ;

	        if ( pVBInfo->LCDInfo & LCDVESATiming )
	        {
	            if ( yres == 360 )
	                yres = 375 ;
	        }
            }

            if ( pVBInfo->LCDResInfo == Panel1024x768 )
            {
	        if ( !( pVBInfo->LCDInfo & LCDVESATiming ) )
	        {
	            if ( !( pVBInfo->LCDInfo & LCDNonExpanding ) )
	            {
	                if ( yres == 350 )
	                    yres = 357 ;
	                else if ( yres == 400 )
	                    yres = 420 ;
	                else if ( yres == 480 )
	                    yres = 525 ;
	            }
                }
            }
        }

        if ( xres == 720 )
            xres = 640 ;
    }

    pVBInfo->VGAHDE = xres ;
    pVBInfo->HDE = xres ;
    pVBInfo->VGAVDE = yres ;
    pVBInfo->VDE = yres ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_IsLCDDualLink */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
unsigned char XGI_IsLCDDualLink(struct vb_device_info *pVBInfo)
{

    if ( ( ( ( pVBInfo->VBInfo & SetCRT2ToLCD ) | SetCRT2ToLCDA ) ) && ( pVBInfo->LCDInfo & SetLCDDualLink ) ) /* shampoo0129 */
        return ( 1 ) ;

    return( 0 ) ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_GetCRT2Data */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_GetCRT2Data(unsigned short ModeNo, unsigned short ModeIdIndex, unsigned short RefreshRateTableIndex, struct vb_device_info *pVBInfo)
{
    unsigned short tempax = 0,
           tempbx ,
           modeflag ,
           resinfo ;

    struct XGI_LCDDataStruct *LCDPtr = NULL ;
    struct XGI_TVDataStruct  *TVPtr = NULL ;

    if ( ModeNo <= 0x13 )
    {
        modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ;      /* si+St_ResInfo */
        resinfo = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ResInfo ;
    }
    else
    {
        modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ;     /* si+Ext_ResInfo */
        resinfo = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_RESINFO ;
    }

    pVBInfo->NewFlickerMode = 0 ;
    pVBInfo->RVBHRS = 50 ;

    if ( pVBInfo->VBInfo & SetCRT2ToRAMDAC )
    {
        XGI_GetRAMDAC2DATA( ModeNo , ModeIdIndex , RefreshRateTableIndex,pVBInfo ) ;
        return ;
    }

    tempbx = 4 ;

    if ( pVBInfo->VBInfo & ( SetCRT2ToLCD | SetCRT2ToLCDA ) )
    {
	LCDPtr = (struct XGI_LCDDataStruct *)XGI_GetLcdPtr(tempbx, ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);

        pVBInfo->RVBHCMAX = LCDPtr->RVBHCMAX ;
        pVBInfo->RVBHCFACT = LCDPtr->RVBHCFACT ;
        pVBInfo->VGAHT = LCDPtr->VGAHT ;
        pVBInfo->VGAVT = LCDPtr->VGAVT ;
        pVBInfo->HT = LCDPtr->LCDHT ;
        pVBInfo->VT = LCDPtr->LCDVT ;

        if ( pVBInfo->LCDResInfo == Panel1024x768 )
        {
            tempax = 1024 ;
            tempbx = 768 ;

            if ( !( pVBInfo->LCDInfo & LCDVESATiming ) )
            {
                if ( pVBInfo->VGAVDE == 357 )
                    tempbx = 527 ;
	        else if ( pVBInfo->VGAVDE == 420 )
	            tempbx = 620 ;
	        else if ( pVBInfo->VGAVDE == 525 )
	            tempbx = 775 ;
	        else if ( pVBInfo->VGAVDE == 600 )
	            tempbx = 775 ;
                /* else if(pVBInfo->VGAVDE==350) tempbx=560; */
                /* else if(pVBInfo->VGAVDE==400) tempbx=640; */
	        else
	          tempbx = 768 ;
            }
            else
                tempbx = 768 ;
        }
        else if ( pVBInfo->LCDResInfo == Panel1024x768x75 )
        {
            tempax = 1024 ;
            tempbx = 768 ;
        }
        else if ( pVBInfo->LCDResInfo == Panel1280x1024 )
        {
            tempax = 1280 ;
            if ( pVBInfo->VGAVDE == 360 )
                tempbx = 768 ;
            else if ( pVBInfo->VGAVDE == 375 )
                tempbx = 800 ;
            else if ( pVBInfo->VGAVDE == 405 )
                tempbx = 864 ;
            else
                tempbx = 1024 ;
        }
        else if ( pVBInfo->LCDResInfo == Panel1280x1024x75 )
        {
            tempax = 1280 ;
            tempbx = 1024 ;
        }
        else if ( pVBInfo->LCDResInfo == Panel1280x960 )
        {
            tempax = 1280 ;
            if ( pVBInfo->VGAVDE == 350 )
                tempbx = 700 ;
            else if ( pVBInfo->VGAVDE == 400 )
                tempbx = 800 ;
            else if ( pVBInfo->VGAVDE == 1024 )
                tempbx = 960 ;
            else
                tempbx = 960 ;
        }
        else if ( pVBInfo->LCDResInfo == Panel1400x1050 )
        {
            tempax = 1400 ;
            tempbx = 1050 ;

            if ( pVBInfo->VGAVDE == 1024 )
            {
                tempax = 1280 ;
                tempbx = 1024 ;
            }
        }
        else if ( pVBInfo->LCDResInfo == Panel1600x1200 )
        {
            tempax = 1600 ;
            tempbx = 1200 ;  /* alan 10/14/2003 */
            if ( !( pVBInfo->LCDInfo & LCDVESATiming ) )
            {
              if ( pVBInfo->VGAVDE == 350 )
                tempbx = 875 ;
              else if ( pVBInfo->VGAVDE == 400 )
                tempbx = 1000 ;
            }
        }

        if ( pVBInfo->LCDInfo & LCDNonExpanding )
        {
            tempax = pVBInfo->VGAHDE ;
            tempbx = pVBInfo->VGAVDE ;
        }

        pVBInfo->HDE = tempax ;
        pVBInfo->VDE = tempbx ;
        return ;
    }

    if ( pVBInfo->VBInfo & ( SetCRT2ToTV ) )
    {
        tempbx = 4 ;
	TVPtr = (struct XGI_TVDataStruct *)XGI_GetTVPtr(tempbx, ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);

        pVBInfo->RVBHCMAX = TVPtr->RVBHCMAX ;
        pVBInfo->RVBHCFACT = TVPtr->RVBHCFACT ;
        pVBInfo->VGAHT = TVPtr->VGAHT ;
        pVBInfo->VGAVT = TVPtr->VGAVT ;
        pVBInfo->HDE = TVPtr->TVHDE ;
        pVBInfo->VDE = TVPtr->TVVDE ;
        pVBInfo->RVBHRS = TVPtr->RVBHRS ;
        pVBInfo->NewFlickerMode = TVPtr->FlickerMode ;

        if ( pVBInfo->VBInfo & SetCRT2ToHiVisionTV )
        {
            if ( resinfo == 0x08 )
                pVBInfo->NewFlickerMode = 0x40 ;
            else if ( resinfo == 0x09 )
                pVBInfo->NewFlickerMode = 0x40 ;
            else if ( resinfo == 0x12 )
                pVBInfo->NewFlickerMode = 0x40 ;

            if ( pVBInfo->VGAVDE == 350 )
                pVBInfo->TVInfo |= TVSimuMode ;

            tempax = ExtHiTVHT ;
            tempbx = ExtHiTVVT ;

            if ( pVBInfo->VBInfo & SetInSlaveMode )
            {
	        if ( pVBInfo->TVInfo & TVSimuMode )
	        {
	            tempax = StHiTVHT ;
	            tempbx = StHiTVVT ;

	            if ( !( modeflag & Charx8Dot ) )
	            {
	                tempax = StHiTextTVHT ;
	                tempbx = StHiTextTVVT ;
	            }
	        }
            }
        }
        else if ( pVBInfo->VBInfo & SetCRT2ToYPbPr )
        {
            if ( pVBInfo->TVInfo & SetYPbPrMode750p )
            {
                tempax = YPbPrTV750pHT ;	/* Ext750pTVHT */
                tempbx = YPbPrTV750pVT ;	/* Ext750pTVVT */
            }

            if ( pVBInfo->TVInfo & SetYPbPrMode525p )
            {
                tempax = YPbPrTV525pHT ;	/* Ext525pTVHT */
                tempbx = YPbPrTV525pVT ;	/* Ext525pTVVT */
            }
            else if ( pVBInfo->TVInfo & SetYPbPrMode525i )
            {
                tempax = YPbPrTV525iHT ;	/* Ext525iTVHT */
                tempbx = YPbPrTV525iVT ;	/* Ext525iTVVT */
                if ( pVBInfo->TVInfo & NTSC1024x768 )
                    tempax = NTSC1024x768HT ;
            }
        }
        else
        {
            tempax = PALHT ;
            tempbx = PALVT ;
            if ( !( pVBInfo->TVInfo & SetPALTV ) )
            {
                tempax = NTSCHT ;
	        tempbx = NTSCVT ;
	        if ( pVBInfo->TVInfo & NTSC1024x768 )
	            tempax = NTSC1024x768HT ;
            }
        }

        pVBInfo->HT = tempax ;
        pVBInfo->VT = tempbx ;
        return ;
    }
}


/* --------------------------------------------------------------------- */
/* Function : XGI_SetCRT2VCLK */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_SetCRT2VCLK(unsigned short ModeNo, unsigned short ModeIdIndex, unsigned short RefreshRateTableIndex, struct vb_device_info *pVBInfo)
{
	unsigned char di_0, di_1, tempal;

    tempal = XGI_GetVCLKPtr( RefreshRateTableIndex , ModeNo , ModeIdIndex, pVBInfo ) ;
    XGI_GetVCLKLen( tempal, &di_0 , &di_1, pVBInfo ) ;
    XGI_GetLCDVCLKPtr( &di_0 , &di_1, pVBInfo ) ;

    if ( pVBInfo->VBType & VB_XGI301 ) /* shampoo 0129 */
    {				/* 301 */
        XGINew_SetReg1(pVBInfo->Part4Port , 0x0A , 0x10 ) ;
        XGINew_SetReg1(pVBInfo->Part4Port , 0x0B , di_1 ) ;
        XGINew_SetReg1(pVBInfo->Part4Port , 0x0A , di_0 ) ;
    }
    else
    {				/* 301b/302b/301lv/302lv */
        XGINew_SetReg1( pVBInfo->Part4Port , 0x0A , di_0 ) ;
        XGINew_SetReg1( pVBInfo->Part4Port , 0x0B , di_1 ) ;
    }

    XGINew_SetReg1( pVBInfo->Part4Port , 0x00 , 0x12 ) ;

    if ( pVBInfo->VBInfo & SetCRT2ToRAMDAC )
        XGINew_SetRegOR( pVBInfo->Part4Port , 0x12 , 0x28 ) ;
    else
        XGINew_SetRegOR( pVBInfo->Part4Port , 0x12 , 0x08 ) ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_GETLCDVCLKPtr */
/* Input : */
/* Output : al -> VCLK Index */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_GetLCDVCLKPtr(unsigned char *di_0, unsigned char *di_1,
		       struct vb_device_info *pVBInfo)
{
    unsigned short index ;

    if ( pVBInfo->VBInfo & ( SetCRT2ToLCD | SetCRT2ToLCDA ) )
    {
        if ( pVBInfo->IF_DEF_ScaleLCD == 1 )
        {
            if ( pVBInfo->LCDInfo & EnableScalingLCD )
                return ;
        }

        /* index = XGI_GetLCDCapPtr(pVBInfo) ; */
        index = XGI_GetLCDCapPtr1( pVBInfo) ;

        if ( pVBInfo->VBInfo & SetCRT2ToLCD )
        {	/* LCDB */
            *di_0 = pVBInfo->LCDCapList[ index ].LCUCHAR_VCLKData1 ;
            *di_1 = pVBInfo->LCDCapList[ index ].LCUCHAR_VCLKData2 ;
        }
        else
        {	/* LCDA */
            *di_0 = pVBInfo->LCDCapList[ index ].LCDA_VCLKData1 ;
            *di_1 = pVBInfo->LCDCapList[ index ].LCDA_VCLKData2 ;
        }
    }
    return ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_GetVCLKPtr */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
unsigned char XGI_GetVCLKPtr(unsigned short RefreshRateTableIndex,
			     unsigned short ModeNo, unsigned short ModeIdIndex,
			     struct vb_device_info *pVBInfo)
{

    unsigned short index ,
           modeflag ;
    unsigned short tempbx ;
    unsigned char tempal;
    unsigned char *CHTVVCLKPtr = NULL;

    if ( ModeNo <= 0x13 )
        modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ;      /* si+St_ResInfo */
    else
        modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;    /* si+Ext_ResInfo */


    if ( ( pVBInfo->SetFlag & ProgrammingCRT2 ) && ( !( pVBInfo->LCDInfo & EnableScalingLCD ) ) )
    {   /* {LCDA/LCDB} */
        index = XGI_GetLCDCapPtr(pVBInfo) ;
        tempal = pVBInfo->LCDCapList[ index ].LCD_VCLK ;

        if ( pVBInfo->VBInfo & ( SetCRT2ToLCD | SetCRT2ToLCDA ) )
            return tempal ;

	/* {TV} */
        if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV| VB_XGI302LV| VB_XGI301C ) )
        {
            if(pVBInfo->VBInfo&SetCRT2ToHiVisionTV)
           {
                tempal = HiTVVCLKDIV2;
                if(!(pVBInfo->TVInfo & RPLLDIV2XO))
                    tempal = HiTVVCLK;
	        if(pVBInfo->TVInfo & TVSimuMode)
                {
                    tempal = HiTVSimuVCLK;
                    if(!(modeflag & Charx8Dot))
              	        tempal = HiTVTextVCLK;

                 }
                 return tempal;
             }

            if ( pVBInfo->TVInfo & SetYPbPrMode750p )
            {
                tempal = YPbPr750pVCLK ;
                return tempal ;
            }

            if ( pVBInfo->TVInfo & SetYPbPrMode525p )
            {
                tempal = YPbPr525pVCLK ;
                return tempal ;
            }

            tempal = NTSC1024VCLK ;

            if ( !( pVBInfo->TVInfo & NTSC1024x768 ) )
            {
                tempal = TVVCLKDIV2 ;
                if ( !( pVBInfo->TVInfo & RPLLDIV2XO ) )
                    tempal = TVVCLK ;
            }

            if ( pVBInfo->VBInfo & SetCRT2ToTV )
                return tempal ;
        }
        /*else
        if((pVBInfo->IF_DEF_CH7017==1)&&(pVBInfo->VBType&VB_CH7017))
        {
            if(ModeNo<=0x13)
                *tempal = pVBInfo->SModeIDTable[ModeIdIndex].St_CRT2CRTC;
            else
                *tempal = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
            *tempal = *tempal & 0x1F;

            tempbx = 0;
            if(pVBInfo->TVInfo & SetPALTV)
                tempbx = tempbx + 2;
            if(pVBInfo->TVInfo & SetCHTVOverScan)
                tempbx++;
            tempbx = tempbx << 1;
        }  */
    }	/* {End of VB} */

    if((pVBInfo->IF_DEF_CH7007==1)&&(pVBInfo->VBType&VB_CH7007)) /* [Billy] 07/05/08 CH7007 */
    {
       /* VideoDebugPrint((0, "XGI_GetVCLKPtr: pVBInfo->IF_DEF_CH7007==1\n")); */
       if ( (pVBInfo->VBInfo & SetCRT2ToTV) )
       {
           if( ModeNo <= 0x13 )
           {
              tempal = pVBInfo->SModeIDTable[ ModeIdIndex ].St_CRT2CRTC ;
           }
           else
           {
              tempal = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
           }

           tempal = tempal & 0x0F;
           tempbx = 0;

           if(pVBInfo->TVInfo & SetPALTV)
           {
              tempbx = tempbx + 2;
           }
           if(pVBInfo->TVInfo & SetCHTVOverScan)
           {
              tempbx++;
           }
           /** tempbx = tempbx << 1; CH7007 ? **/

/*[Billy]07/05/29 CH7007*/
           if ( pVBInfo->IF_DEF_CH7007 == 1 )
           {
             switch( tempbx )
             {
               case 0:
                   CHTVVCLKPtr = XGI7007_CHTVVCLKUNTSC ;
                   break ;
               case 1:
                   CHTVVCLKPtr = XGI7007_CHTVVCLKONTSC ;
                   break ;
               case 2:
                   CHTVVCLKPtr = XGI7007_CHTVVCLKUPAL ;
                   break ;
               case 3:
                   CHTVVCLKPtr = XGI7007_CHTVVCLKOPAL ;
                   break ;
               default:
                   break ;

             }
           }
           /*else
           {
            switch( tempbx )
            {
               case 0:
                   CHTVVCLKPtr = pVBInfo->CHTVVCLKUNTSC ;
                   break ;
               case 1:
                   CHTVVCLKPtr = pVBInfo->CHTVVCLKONTSC ;
                   break ;
               case 2:
                   CHTVVCLKPtr = pVBInfo->CHTVVCLKUPAL ;
                   break ;
               case 3:
                   CHTVVCLKPtr = pVBInfo->CHTVVCLKOPAL ;
                   break ;
               default:
                   break ;
            }
           }*/

           tempal = CHTVVCLKPtr[ tempal ] ;
           return tempal ;
       }

    }

    tempal = (unsigned char)XGINew_GetReg2((pVBInfo->P3ca + 0x02));
    tempal = tempal >> 2 ;
    tempal &= 0x03 ;

    if ( ( pVBInfo->LCDInfo & EnableScalingLCD ) && ( modeflag & Charx8Dot ) )  /* for Dot8 Scaling LCD */
        tempal = tempal ^ tempal ;                   /* ; set to VCLK25MHz always */

    if ( ModeNo <= 0x13 )
        return tempal ;

    tempal = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_CRTVCLK ;
    return tempal ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_GetVCLKLen */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_GetVCLKLen(unsigned char tempal, unsigned char *di_0,
		    unsigned char *di_1, struct vb_device_info *pVBInfo)
{
    if ( pVBInfo->IF_DEF_CH7007 == 1 ) /* [Billy] 2007/05/16 */
    {
       /* VideoDebugPrint((0, "XGI_GetVCLKLen: pVBInfo->IF_DEF_CH7007==1\n")); */
	*di_0 = (unsigned char)XGI_CH7007VCLKData[tempal].SR2B;
	*di_1 = (unsigned char)XGI_CH7007VCLKData[tempal].SR2C;
    }
    else if ( pVBInfo->VBType & ( VB_XGI301 | VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
    {
        if ( ( !( pVBInfo->VBInfo & SetCRT2ToLCDA ) ) && ( pVBInfo->SetFlag & ProgrammingCRT2 ) )
        {
	    *di_0 = (unsigned char)XGI_VBVCLKData[tempal].SR2B;
            *di_1 = XGI_VBVCLKData[ tempal ].SR2C ;
        }
    }
    else
    {
        *di_0 = XGI_VCLKData[ tempal ].SR2B ;
        *di_1 = XGI_VCLKData[ tempal ].SR2C ;
    }
}


/* --------------------------------------------------------------------- */
/* Function : XGI_SetCRT2Offset */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_SetCRT2Offset(unsigned short ModeNo,
		       unsigned short ModeIdIndex,
		       unsigned short RefreshRateTableIndex,
		       struct xgi_hw_device_info *HwDeviceExtension,
		       struct vb_device_info *pVBInfo)
{
    unsigned short offset ;
    unsigned char temp;

    if ( pVBInfo->VBInfo & SetInSlaveMode )
    {
        return ;
    }

    offset = XGI_GetOffset(  ModeNo , ModeIdIndex , RefreshRateTableIndex , HwDeviceExtension, pVBInfo ) ;
    temp = (unsigned char)(offset & 0xFF);
    XGINew_SetReg1( pVBInfo->Part1Port , 0x07 , temp ) ;
    temp = (unsigned char)((offset & 0xFF00) >> 8);
    XGINew_SetReg1(pVBInfo->Part1Port , 0x09 , temp);
    temp = (unsigned char)(((offset >> 3) & 0xFF) + 1) ;
    XGINew_SetReg1(pVBInfo->Part1Port, 0x03, temp);
}


/* --------------------------------------------------------------------- */
/* Function : XGI_GetOffset */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
unsigned short XGI_GetOffset(unsigned short ModeNo, unsigned short ModeIdIndex, unsigned short RefreshRateTableIndex, struct xgi_hw_device_info *HwDeviceExtension, struct vb_device_info *pVBInfo)
{
    unsigned short temp ,
           colordepth ,
           modeinfo ,
           index ,
           infoflag ,
           ColorDepth[] = { 0x01 , 0x02 , 0x04 } ;

    modeinfo = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeInfo ;
    if ( ModeNo <= 0x14 )
        infoflag = 0 ;
    else
        infoflag = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_InfoFlag ;


    index = ( modeinfo >> 8 ) & 0xFF ;

    temp = pVBInfo->ScreenOffset[ index ] ;

    if ( infoflag & InterlaceMode )
    {
        temp = temp << 1 ;
    }

    colordepth = XGI_GetColorDepth( ModeNo , ModeIdIndex, pVBInfo ) ;

    if ( ( ModeNo >= 0x7C ) && ( ModeNo <= 0x7E ) )
    {
        temp = ModeNo - 0x7C ;
	colordepth = ColorDepth[ temp ] ;
	temp = 0x6B ;
	if ( infoflag & InterlaceMode )
	{
            temp = temp << 1 ;
	}
	return( temp * colordepth ) ;
    }
    else
        return( temp * colordepth ) ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_SetCRT2FIFO */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_SetCRT2FIFO(struct vb_device_info *pVBInfo)
{
    XGINew_SetReg1( pVBInfo->Part1Port , 0x01 , 0x3B ) ;			/* threshold high ,disable auto threshold */
    XGINew_SetRegANDOR( pVBInfo->Part1Port , 0x02 , ~( 0x3F ) , 0x04 ) ;	/* threshold low default 04h */
}


/* --------------------------------------------------------------------- */
/* Function : XGI_PreSetGroup1 */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_PreSetGroup1(unsigned short ModeNo, unsigned short ModeIdIndex,
		      struct xgi_hw_device_info *HwDeviceExtension,
		      unsigned short RefreshRateTableIndex,
		      struct vb_device_info *pVBInfo)
{
    unsigned short tempcx = 0 ,
           CRT1Index = 0 ,
           resinfo = 0 ;

    if ( ModeNo > 0x13 )
    {
        CRT1Index = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_CRT1CRTC ;
        CRT1Index &= IndexMask ;
        resinfo = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_RESINFO ;
    }

    XGI_SetCRT2Offset( ModeNo , ModeIdIndex , RefreshRateTableIndex , HwDeviceExtension, pVBInfo ) ;
    XGI_SetCRT2FIFO(pVBInfo) ;
    /* XGI_SetCRT2Sync(ModeNo,RefreshRateTableIndex); */

    for( tempcx = 4 ; tempcx < 7 ; tempcx++ )
    {
        XGINew_SetReg1( pVBInfo->Part1Port , tempcx , 0x0 ) ;
    }

    XGINew_SetReg1( pVBInfo->Part1Port , 0x50 , 0x00 ) ;
    XGINew_SetReg1( pVBInfo->Part1Port , 0x02 , 0x44 ) ;	/* temp 0206 */
}


/* --------------------------------------------------------------------- */
/* Function : XGI_SetGroup1 */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_SetGroup1(unsigned short ModeNo, unsigned short ModeIdIndex,
		   struct xgi_hw_device_info *HwDeviceExtension,
		   unsigned short RefreshRateTableIndex,
		   struct vb_device_info *pVBInfo)
{
    unsigned short temp = 0 ,
           tempax = 0 ,
           tempbx = 0 ,
           tempcx = 0 ,
           pushbx = 0 ,
           CRT1Index = 0 ,
           modeflag ,
           resinfo = 0 ;

    if ( ModeNo > 0x13 )
    {
        CRT1Index = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_CRT1CRTC ;
        CRT1Index &= IndexMask ;
        resinfo = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_RESINFO ;
    }

    if ( ModeNo <= 0x13 )
    {
        modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ;
    }
    else
    {
        modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ;
    }

    /* bainy change table name */
    if ( modeflag & HalfDCLK )
    {
        temp = ( pVBInfo->VGAHT / 2 - 1 ) & 0x0FF ;			/* BTVGA2HT 0x08,0x09 */
        XGINew_SetReg1( pVBInfo->Part1Port , 0x08 , temp ) ;
        temp = ( ( ( pVBInfo->VGAHT / 2 - 1 ) & 0xFF00 ) >> 8 ) << 4 ;
        XGINew_SetRegANDOR( pVBInfo->Part1Port , 0x09 , ~0x0F0 , temp ) ;
        temp = ( pVBInfo->VGAHDE / 2 + 16 ) & 0x0FF ;			/* BTVGA2HDEE 0x0A,0x0C */
        XGINew_SetReg1( pVBInfo->Part1Port , 0x0A , temp ) ;
        tempcx = ( ( pVBInfo->VGAHT - pVBInfo->VGAHDE ) / 2 ) >> 2 ;
        pushbx = pVBInfo->VGAHDE / 2 + 16 ;
        tempcx = tempcx >> 1 ;
        tempbx = pushbx + tempcx ;					/* bx BTVGA@HRS 0x0B,0x0C */
        tempcx += tempbx ;

  	if ( pVBInfo->VBInfo & SetCRT2ToRAMDAC )
  	{
            tempbx = pVBInfo->XGINEWUB_CRT1Table[ CRT1Index ].CR[ 4 ] ;
            tempbx |= ( ( pVBInfo->XGINEWUB_CRT1Table[ CRT1Index ].CR[ 14 ] & 0xC0 ) << 2 ) ;
            tempbx = ( tempbx - 3 ) << 3 ;				/* (VGAHRS-3)*8 */
            tempcx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[ 5 ] ;
            tempcx &= 0x1F ;
            temp = pVBInfo->XGINEWUB_CRT1Table[ CRT1Index ].CR[ 15 ] ;
            temp = ( temp & 0x04 ) << ( 5 - 2 ) ;			/* VGAHRE D[5] */
            tempcx = ( ( tempcx | temp ) - 3 ) << 3 ;			/* (VGAHRE-3)*8 */
        }

        tempbx += 4 ;
        tempcx += 4 ;

        if ( tempcx > ( pVBInfo->VGAHT / 2 ) )
            tempcx = pVBInfo->VGAHT / 2 ;

        temp = tempbx & 0x00FF ;

        XGINew_SetReg1( pVBInfo->Part1Port , 0x0B , temp ) ;
    }
    else
    {
        temp = ( pVBInfo->VGAHT - 1 ) & 0x0FF ;				/* BTVGA2HT 0x08,0x09 */
        XGINew_SetReg1( pVBInfo->Part1Port , 0x08 , temp ) ;
        temp = ( ( ( pVBInfo->VGAHT - 1 ) & 0xFF00 ) >> 8 ) << 4 ;
        XGINew_SetRegANDOR( pVBInfo->Part1Port , 0x09 , ~0x0F0 , temp ) ;
        temp = ( pVBInfo->VGAHDE + 16 ) & 0x0FF ;				/* BTVGA2HDEE 0x0A,0x0C */
        XGINew_SetReg1( pVBInfo->Part1Port , 0x0A , temp ) ;
        tempcx = ( pVBInfo->VGAHT - pVBInfo->VGAHDE ) >> 2 ;		/* cx */
        pushbx = pVBInfo->VGAHDE + 16 ;
        tempcx = tempcx >> 1 ;
        tempbx = pushbx + tempcx ;					/* bx BTVGA@HRS 0x0B,0x0C */
        tempcx += tempbx ;

        if ( pVBInfo->VBInfo & SetCRT2ToRAMDAC )
        {
            tempbx = pVBInfo->XGINEWUB_CRT1Table[ CRT1Index ].CR[ 3 ] ;
            tempbx |= ( ( pVBInfo->XGINEWUB_CRT1Table[ CRT1Index ].CR[ 5 ] & 0xC0 ) << 2 ) ;
            tempbx = ( tempbx - 3 ) << 3 ;				/* (VGAHRS-3)*8 */
            tempcx = pVBInfo->XGINEWUB_CRT1Table[ CRT1Index ].CR[ 4 ] ;
            tempcx &= 0x1F ;
            temp = pVBInfo->XGINEWUB_CRT1Table[ CRT1Index ].CR[ 6 ] ;
            temp = ( temp & 0x04 ) << ( 5 - 2 ) ;			/* VGAHRE D[5] */
            tempcx = ( ( tempcx | temp ) - 3 ) << 3 ;			/* (VGAHRE-3)*8 */
            tempbx += 16 ;
            tempcx += 16 ;
        }

        if ( tempcx > pVBInfo->VGAHT )
            tempcx = pVBInfo->VGAHT ;

        temp = tempbx & 0x00FF ;
        XGINew_SetReg1( pVBInfo->Part1Port , 0x0B , temp ) ;
    }

    tempax = ( tempax & 0x00FF ) | ( tempbx & 0xFF00 ) ;
    tempbx = pushbx ;
    tempbx = ( tempbx & 0x00FF ) | ( ( tempbx & 0xFF00 ) << 4 ) ;
    tempax |= ( tempbx & 0xFF00 ) ;
    temp = ( tempax & 0xFF00 ) >> 8 ;
    XGINew_SetReg1( pVBInfo->Part1Port , 0x0C , temp ) ;
    temp = tempcx & 0x00FF ;
    XGINew_SetReg1( pVBInfo->Part1Port , 0x0D , temp ) ;
    tempcx = ( pVBInfo->VGAVT - 1 ) ;
    temp = tempcx & 0x00FF ;

    if ( pVBInfo->IF_DEF_CH7005 == 1 )
    {
        if ( pVBInfo->VBInfo & 0x0C )
        {
            temp-- ;
	}
    }

    XGINew_SetReg1( pVBInfo->Part1Port , 0x0E , temp ) ;
    tempbx = pVBInfo->VGAVDE - 1 ;
    temp = tempbx & 0x00FF ;
    XGINew_SetReg1( pVBInfo->Part1Port , 0x0F , temp ) ;
    temp = ( ( tempbx & 0xFF00 ) << 3 ) >> 8 ;
    temp |= ( ( tempcx & 0xFF00 ) >> 8 ) ;
    XGINew_SetReg1( pVBInfo->Part1Port , 0x12 , temp ) ;

    tempax = pVBInfo->VGAVDE ;
    tempbx = pVBInfo->VGAVDE ;
    tempcx = pVBInfo->VGAVT ;
    tempbx = ( pVBInfo->VGAVT + pVBInfo->VGAVDE ) >> 1 ;				/* BTVGA2VRS 0x10,0x11 */
    tempcx = ( ( pVBInfo->VGAVT - pVBInfo->VGAVDE ) >> 4 ) + tempbx + 1 ;		/* BTVGA2VRE 0x11 */

    if ( pVBInfo->VBInfo & SetCRT2ToRAMDAC )
    {
        tempbx = pVBInfo->XGINEWUB_CRT1Table[ CRT1Index ].CR[ 10 ] ;
        temp = pVBInfo->XGINEWUB_CRT1Table[ CRT1Index ].CR[ 9 ] ;

        if ( temp & 0x04 )
            tempbx |= 0x0100 ;

        if ( temp & 0x080 )
            tempbx |= 0x0200 ;

        temp = pVBInfo->XGINEWUB_CRT1Table[ CRT1Index ].CR[ 14 ] ;

        if ( temp & 0x08 )
            tempbx |= 0x0400 ;

        temp = pVBInfo->XGINEWUB_CRT1Table[ CRT1Index ].CR[ 11 ] ;
        tempcx = ( tempcx & 0xFF00 ) | ( temp & 0x00FF ) ;
    }

    temp = tempbx & 0x00FF ;
    XGINew_SetReg1( pVBInfo->Part1Port , 0x10 , temp ) ;
    temp = ( ( tempbx & 0xFF00 ) >> 8 ) << 4 ;
    temp = ( ( tempcx & 0x000F ) | ( temp ) ) ;
    XGINew_SetReg1( pVBInfo->Part1Port , 0x11 , temp ) ;
    tempax = 0 ;

    if ( modeflag & DoubleScanMode )
        tempax |= 0x80 ;

    if ( modeflag & HalfDCLK )
        tempax |= 0x40 ;

    XGINew_SetRegANDOR( pVBInfo->Part1Port , 0x2C , ~0x0C0 , tempax ) ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_SetLockRegs */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void  XGI_SetLockRegs(unsigned short ModeNo, unsigned short ModeIdIndex,
		      struct xgi_hw_device_info *HwDeviceExtension,
		      unsigned short RefreshRateTableIndex,
		      struct vb_device_info *pVBInfo)
{
    unsigned short push1 ,
           push2 ,
           tempax ,
           tempbx = 0 ,
           tempcx ,
           temp ,
           resinfo ,
           modeflag ,
           CRT1Index ;

    if ( ModeNo <= 0x13 )
    {
        modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ;	/* si+St_ResInfo */
        resinfo = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ResInfo ;
    }
    else
    {
        modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ;	/* si+Ext_ResInfo */
        resinfo = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_RESINFO ;
        CRT1Index = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_CRT1CRTC ;
        CRT1Index &= IndexMask;
    }

    if ( !( pVBInfo->VBInfo & SetInSlaveMode ) )
    {
        return ;
    }

    temp = 0xFF ;							/* set MAX HT */
    XGINew_SetReg1( pVBInfo->Part1Port , 0x03 , temp ) ;
    /* if ( modeflag & Charx8Dot ) tempcx = 0x08 ; */
    /* else */
    tempcx=0x08;

    if ( pVBInfo->VBType & ( VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
        modeflag |= Charx8Dot ;

    tempax = pVBInfo->VGAHDE ;						/* 0x04 Horizontal Display End */

    if ( modeflag & HalfDCLK )
        tempax = tempax >> 1 ;

    tempax = ( tempax / tempcx ) - 1 ;
    tempbx |= ( ( tempax & 0x00FF ) << 8 ) ;
    temp = tempax & 0x00FF ;
    XGINew_SetReg1( pVBInfo->Part1Port , 0x04 , temp ) ;

    temp = ( tempbx & 0xFF00 ) >> 8 ;

    if ( pVBInfo->VBInfo & SetCRT2ToTV )
    {
        if ( !( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) ) )
            temp += 2 ;

        if ( pVBInfo->VBInfo & SetCRT2ToHiVisionTV )
        {
            if ( pVBInfo->VBType & VB_XGI301LV )
            {
                if ( pVBInfo->VBExtInfo == VB_YPbPr1080i )
                {
                    if ( resinfo == 7 )
                        temp -= 2 ;
                }
            }
            else
                if ( resinfo == 7 )
                    temp -= 2 ;
        }
    }

    XGINew_SetReg1( pVBInfo->Part1Port , 0x05 , temp ) ;			/* 0x05 Horizontal Display Start */
    XGINew_SetReg1( pVBInfo->Part1Port , 0x06 , 0x03 ) ;			/* 0x06 Horizontal Blank end */

    if ( !( pVBInfo->VBInfo & DisableCRT2Display ) )
    {                            					/* 030226 bainy */
        if ( pVBInfo->VBInfo & SetCRT2ToTV )
            tempax = pVBInfo->VGAHT ;
        else
            tempax = XGI_GetVGAHT2( pVBInfo) ;
    }

    if ( tempax >= pVBInfo->VGAHT )
    {
        tempax = pVBInfo->VGAHT ;
    }

    if ( modeflag & HalfDCLK )
    {
        tempax = tempax >> 1 ;
    }

    tempax = ( tempax / tempcx ) - 5 ;
    tempcx = tempax ;				/* 20030401 0x07 horizontal Retrace Start */
    if ( pVBInfo->VBInfo & SetCRT2ToHiVisionTV )
    {
        temp = ( tempbx & 0x00FF ) - 1 ;
        if ( !( modeflag & HalfDCLK ) )
        {
            temp -= 6 ;
            if ( pVBInfo->TVInfo & TVSimuMode )
            {
                temp -= 4 ;
                if ( ModeNo > 0x13 )
                    temp -= 10 ;
            }
        }
    }
    else
    {
        /* tempcx = tempbx & 0x00FF ; */
        tempbx = ( tempbx & 0xFF00 ) >> 8 ;
        tempcx = ( tempcx + tempbx ) >> 1 ;
        temp = ( tempcx & 0x00FF ) + 2 ;

        if ( pVBInfo->VBInfo & SetCRT2ToTV )
        {
            temp -= 1 ;
            if ( !( modeflag & HalfDCLK ) )
            {
                if ( ( modeflag & Charx8Dot ) )
                {
                    temp += 4 ;
                    if ( pVBInfo->VGAHDE >= 800 )
                    {
                        temp -= 6 ;
                    }
                }
            }
        }
        else
        {
            if ( !( modeflag & HalfDCLK ) )
            {
                temp -= 4 ;
                if ( pVBInfo->LCDResInfo != Panel1280x960 )
                {
                    if( pVBInfo->VGAHDE >= 800 )
                    {
                        temp -= 7 ;
                        if ( pVBInfo->ModeType == ModeEGA )
                        {
                            if ( pVBInfo->VGAVDE == 1024 )
                            {
                                temp += 15 ;
                                if ( pVBInfo->LCDResInfo != Panel1280x1024 )
                                {
                                    temp += 7 ;
                                }
                            }
                        }

                        if ( pVBInfo->VGAHDE >= 1280 )
                        {
                            if ( pVBInfo->LCDResInfo != Panel1280x960 )
                            {
                                if ( pVBInfo->LCDInfo & LCDNonExpanding )
                                {
                                    temp += 28 ;
                                }
                            }
                        }
                    }
                }
            }
        }
    }

    XGINew_SetReg1( pVBInfo->Part1Port , 0x07 , temp ) ;		/* 0x07 Horizontal Retrace Start */
    XGINew_SetReg1( pVBInfo->Part1Port , 0x08 , 0 ) ;		/* 0x08 Horizontal Retrace End */

    if ( pVBInfo->VBInfo & SetCRT2ToTV )
    {
        if ( pVBInfo->TVInfo & TVSimuMode )
        {
            if ( ( ModeNo == 0x06 ) || ( ModeNo == 0x10 ) || ( ModeNo == 0x11 ) || ( ModeNo == 0x13 ) || ( ModeNo == 0x0F ) )
            {
                XGINew_SetReg1( pVBInfo->Part1Port , 0x07 , 0x5b ) ;
                XGINew_SetReg1( pVBInfo->Part1Port , 0x08 , 0x03 ) ;
            }

            if ( ( ModeNo == 0x00 ) || ( ModeNo == 0x01 ) )
            {
                if ( pVBInfo->TVInfo & SetNTSCTV )
                {
                    XGINew_SetReg1( pVBInfo->Part1Port , 0x07 , 0x2A ) ;
                    XGINew_SetReg1( pVBInfo->Part1Port , 0x08 , 0x61 ) ;
                }
                else
                {
                    XGINew_SetReg1( pVBInfo->Part1Port , 0x07 , 0x2A ) ;
                    XGINew_SetReg1( pVBInfo->Part1Port , 0x08 , 0x41 ) ;
                    XGINew_SetReg1( pVBInfo->Part1Port , 0x0C , 0xF0 ) ;
                }
            }

            if ( ( ModeNo == 0x02 ) || ( ModeNo == 0x03 ) || ( ModeNo == 0x07 ) )
            {
                if ( pVBInfo->TVInfo & SetNTSCTV )
                {
                    XGINew_SetReg1( pVBInfo->Part1Port , 0x07 , 0x54 ) ;
                    XGINew_SetReg1( pVBInfo->Part1Port , 0x08 , 0x00 ) ;
                }
                else
                {
                    XGINew_SetReg1( pVBInfo->Part1Port , 0x07 , 0x55 ) ;
                    XGINew_SetReg1( pVBInfo->Part1Port , 0x08 , 0x00 ) ;
                    XGINew_SetReg1( pVBInfo->Part1Port , 0x0C , 0xF0 ) ;
                }
            }

            if ( ( ModeNo == 0x04 ) || ( ModeNo == 0x05 ) || ( ModeNo == 0x0D ) || ( ModeNo == 0x50 ) )
            {
                if ( pVBInfo->TVInfo & SetNTSCTV )
                {
                    XGINew_SetReg1( pVBInfo->Part1Port , 0x07 , 0x30 ) ;
                    XGINew_SetReg1( pVBInfo->Part1Port , 0x08 , 0x03 ) ;
                }
                else
                {
                    XGINew_SetReg1( pVBInfo->Part1Port , 0x07 , 0x2f ) ;
                    XGINew_SetReg1( pVBInfo->Part1Port , 0x08 , 0x02 ) ;
                }
            }
        }
    }

    XGINew_SetReg1( pVBInfo->Part1Port , 0x18 , 0x03 ) ;				/* 0x18 SR0B */
    XGINew_SetRegANDOR( pVBInfo->Part1Port , 0x19 , 0xF0 , 0x00 ) ;
    XGINew_SetReg1( pVBInfo->Part1Port , 0x09 , 0xFF ) ;				/* 0x09 Set Max VT */

    tempbx = pVBInfo->VGAVT ;
    push1 = tempbx ;
    tempcx = 0x121 ;
    tempbx = pVBInfo->VGAVDE ;							/* 0x0E Virtical Display End */

    if ( tempbx == 357 )
        tempbx = 350 ;
    if ( tempbx == 360 )
        tempbx =350 ;
    if ( tempbx == 375 )
        tempbx = 350 ;
    if ( tempbx == 405 )
        tempbx = 400 ;
    if ( tempbx == 525 )
        tempbx = 480 ;

    push2 = tempbx ;

    if ( pVBInfo->VBInfo & SetCRT2ToLCD )
    {
        if ( pVBInfo->LCDResInfo == Panel1024x768 )
        {
            if ( !( pVBInfo->LCDInfo & LCDVESATiming ) )
            {
                if ( tempbx == 350 )
                    tempbx += 5 ;
		if ( tempbx == 480 )
		    tempbx += 5 ;
            }
        }
    }
    tempbx-- ;
    temp = tempbx & 0x00FF ;
    tempbx-- ;
    temp = tempbx & 0x00FF ;
    XGINew_SetReg1( pVBInfo->Part1Port , 0x10 ,temp ) ;				/* 0x10 vertical Blank Start */
    tempbx = push2 ;
    tempbx-- ;
    temp = tempbx & 0x00FF ;
    XGINew_SetReg1( pVBInfo->Part1Port , 0x0E , temp ) ;

    if ( tempbx & 0x0100 )
    {
        tempcx |= 0x0002 ;
    }

    tempax = 0x000B ;

    if ( modeflag & DoubleScanMode )
    {
        tempax |= 0x08000 ;
    }

    if ( tempbx & 0x0200 )
    {
        tempcx |= 0x0040 ;
    }

    temp = ( tempax & 0xFF00 ) >> 8 ;
    XGINew_SetReg1( pVBInfo->Part1Port , 0x0B , temp ) ;

    if ( tempbx & 0x0400 )
    {
        tempcx |= 0x0600 ;
    }

    XGINew_SetReg1( pVBInfo->Part1Port , 0x11 , 0x00 ) ;				/* 0x11 Vertival Blank End */

    tempax = push1 ;
    tempax -= tempbx ;								/* 0x0C Vertical Retrace Start */
    tempax = tempax >> 2 ;
    push1 = tempax ;								/* push ax */

    if ( resinfo != 0x09 )
    {
        tempax = tempax << 1 ;
        tempbx += tempax ;
    }

    if ( pVBInfo->VBInfo & SetCRT2ToHiVisionTV )
    {
        if ( pVBInfo->VBType & VB_XGI301LV )
        {
            if ( pVBInfo->TVInfo & SetYPbPrMode1080i )
                tempbx -= 10 ;
            else
            {
                if ( pVBInfo->TVInfo & TVSimuMode )
                {
                    if ( pVBInfo->TVInfo & SetPALTV )
                    {
                        if ( pVBInfo->VBType & VB_XGI301LV )
                        {
                            if ( !( pVBInfo->TVInfo & ( SetYPbPrMode525p | SetYPbPrMode750p | SetYPbPrMode1080i ) ) )
                                tempbx += 40 ;
                        }
                        else
                            tempbx += 40 ;
                    }
                }
            }
        }
        else
            tempbx -= 10 ;
    }
    else
    {
        if ( pVBInfo->TVInfo & TVSimuMode )
        {
            if ( pVBInfo->TVInfo & SetPALTV )
            {
                if ( pVBInfo->VBType & VB_XGI301LV )
                {
                    if ( !( pVBInfo->TVInfo & ( SetYPbPrMode525p | SetYPbPrMode750p | SetYPbPrMode1080i ) ) )
                        tempbx += 40 ;
                }
                else
                    tempbx += 40 ;
            }
        }
    }
    tempax = push1 ;
    tempax = tempax >> 2 ;
    tempax++ ;
    tempax += tempbx ;
    push1 = tempax ;						/* push ax */

    if ( ( pVBInfo->TVInfo & SetPALTV ) )
    {
        if ( tempbx <= 513 )
        {
            if ( tempax >= 513 )
            {
                tempbx = 513 ;
            }
        }
    }

    temp = tempbx & 0x00FF ;
    XGINew_SetReg1( pVBInfo->Part1Port , 0x0C , temp ) ;
    tempbx-- ;
    temp = tempbx & 0x00FF ;
    XGINew_SetReg1( pVBInfo->Part1Port , 0x10 , temp ) ;

    if ( tempbx & 0x0100 )
    {
        tempcx |= 0x0008 ;
    }

    if ( tempbx & 0x0200 )
    {
        XGINew_SetRegANDOR( pVBInfo->Part1Port , 0x0B , 0x0FF , 0x20 ) ;
    }

    tempbx++ ;

    if ( tempbx & 0x0100 )
    {
        tempcx |= 0x0004 ;
    }

    if ( tempbx & 0x0200 )
    {
        tempcx |= 0x0080 ;
    }

    if ( tempbx & 0x0400 )
    {
        tempcx |= 0x0C00 ;
    }

    tempbx = push1 ;						/* pop ax */
    temp = tempbx & 0x00FF ;
    temp &= 0x0F ;
    XGINew_SetReg1( pVBInfo->Part1Port , 0x0D , temp ) ;		/* 0x0D vertical Retrace End */

    if ( tempbx & 0x0010 )
    {
        tempcx |= 0x2000 ;
    }

    temp = tempcx & 0x00FF ;
    XGINew_SetReg1( pVBInfo->Part1Port , 0x0A , temp ) ;		/* 0x0A CR07 */
    temp = ( tempcx & 0x0FF00 ) >> 8 ;
    XGINew_SetReg1( pVBInfo->Part1Port , 0x17 , temp ) ;		/* 0x17 SR0A */
    tempax = modeflag ;
    temp = ( tempax & 0xFF00 ) >> 8 ;

    temp = ( temp >> 1 ) & 0x09 ;

    if ( pVBInfo->VBType & ( VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
        temp |= 0x01 ;

    XGINew_SetReg1( pVBInfo->Part1Port , 0x16 , temp ) ;			/* 0x16 SR01 */
    XGINew_SetReg1( pVBInfo->Part1Port , 0x0F , 0 ) ;			/* 0x0F CR14 */
    XGINew_SetReg1( pVBInfo->Part1Port , 0x12 , 0 ) ;			/* 0x12 CR17 */

    if ( pVBInfo->LCDInfo & LCDRGB18Bit )
        temp = 0x80 ;
    else
        temp = 0x00 ;

    XGINew_SetReg1( pVBInfo->Part1Port , 0x1A , temp ) ;			/* 0x1A SR0E */

    return ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_SetGroup2 */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_SetGroup2(unsigned short ModeNo, unsigned short ModeIdIndex, unsigned short RefreshRateTableIndex,
		   struct xgi_hw_device_info *HwDeviceExtension, struct vb_device_info *pVBInfo)
{
    unsigned short i ,
           j ,
           tempax ,
           tempbx ,
           tempcx ,
           temp ,
           push1 ,
           push2 ,
           modeflag ,
           resinfo ,
           crt2crtc ;
    unsigned char *TimingPoint ;

    unsigned long longtemp ,
          tempeax ,
          tempebx ,
          temp2 ,
          tempecx ;

    if ( ModeNo <= 0x13 )
    {
        modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ;		/* si+St_ResInfo */
        resinfo = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ResInfo ;
        crt2crtc = pVBInfo->SModeIDTable[ ModeIdIndex ].St_CRT2CRTC ;
    }
    else
    {
        modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ;		/* si+Ext_ResInfo */
        resinfo = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_RESINFO ;
        crt2crtc = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_CRT2CRTC ;
    }

    tempax = 0 ;

    if ( !( pVBInfo->VBInfo & SetCRT2ToAVIDEO ) )
        tempax |= 0x0800 ;

    if ( !( pVBInfo->VBInfo & SetCRT2ToSVIDEO ) )
        tempax |= 0x0400 ;

    if ( pVBInfo->VBInfo & SetCRT2ToSCART )
        tempax |= 0x0200 ;

    if ( !( pVBInfo->TVInfo & SetPALTV ) )
        tempax |= 0x1000 ;

    if ( pVBInfo->VBInfo & SetCRT2ToHiVisionTV )
        tempax |= 0x0100 ;

    if ( pVBInfo->TVInfo & ( SetYPbPrMode525p | SetYPbPrMode750p ) )
        tempax &= 0xfe00 ;

    tempax = ( tempax & 0xff00 ) >> 8 ;

    XGINew_SetReg1( pVBInfo->Part2Port , 0x0 , tempax ) ;
    TimingPoint = pVBInfo->NTSCTiming ;

    if ( pVBInfo->TVInfo & SetPALTV )
    {
        TimingPoint = pVBInfo->PALTiming ;
    }

    if ( pVBInfo->VBInfo & SetCRT2ToHiVisionTV )
    {
        TimingPoint = pVBInfo->HiTVExtTiming ;

        if ( pVBInfo->VBInfo & SetInSlaveMode )
            TimingPoint = pVBInfo->HiTVSt2Timing ;

        if ( pVBInfo->SetFlag & TVSimuMode )
            TimingPoint = pVBInfo->HiTVSt1Timing ;

        if ( !(modeflag & Charx8Dot) )
            TimingPoint = pVBInfo->HiTVTextTiming ;
    }

    if ( pVBInfo->VBInfo & SetCRT2ToYPbPr )
    {
        if ( pVBInfo->TVInfo & SetYPbPrMode525i )
            TimingPoint = pVBInfo->YPbPr525iTiming ;

        if ( pVBInfo->TVInfo & SetYPbPrMode525p )
    	    TimingPoint = pVBInfo->YPbPr525pTiming ;

        if ( pVBInfo->TVInfo & SetYPbPrMode750p )
    	    TimingPoint = pVBInfo->YPbPr750pTiming ;
    }

    for( i = 0x01 , j = 0 ; i <= 0x2D ; i++ , j++ )
    {
        XGINew_SetReg1( pVBInfo->Part2Port , i , TimingPoint[ j ] ) ;
    }

    for( i = 0x39 ; i <= 0x45 ; i++ , j++ )
    {
        XGINew_SetReg1( pVBInfo->Part2Port , i , TimingPoint[ j ] ) ;	/* di->temp2[j] */
    }

    if ( pVBInfo->VBInfo & SetCRT2ToTV )
    {
        XGINew_SetRegANDOR( pVBInfo->Part2Port , 0x3A , 0x1F , 0x00 ) ;
    }

    temp = pVBInfo->NewFlickerMode ;
    temp &= 0x80 ;
    XGINew_SetRegANDOR( pVBInfo->Part2Port , 0x0A , 0xFF , temp ) ;

    if ( pVBInfo->VBInfo & SetCRT2ToHiVisionTV )
        tempax = 950 ;

    if ( pVBInfo->TVInfo & SetPALTV )
        tempax = 520 ;
    else
        tempax = 440 ;

    if ( pVBInfo->VDE <= tempax )
    {
        tempax -= pVBInfo->VDE ;
        tempax = tempax >> 2 ;
        tempax = ( tempax & 0x00FF ) | ( ( tempax & 0x00FF ) << 8 ) ;
        push1 = tempax ;
        temp = ( tempax & 0xFF00 ) >> 8 ;
	temp += (unsigned short)TimingPoint[0];

        if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
        {
            if ( pVBInfo->VBInfo & ( SetCRT2ToAVIDEO | SetCRT2ToSVIDEO | SetCRT2ToSCART | SetCRT2ToYPbPr ) )
            {
                tempcx=pVBInfo->VGAHDE;
                if ( tempcx >= 1024 )
                {
                    temp = 0x17 ;		/* NTSC */
                    if ( pVBInfo->TVInfo & SetPALTV )
                        temp = 0x19 ;		/* PAL */
                }
            }
        }

        XGINew_SetReg1( pVBInfo->Part2Port , 0x01 , temp ) ;
        tempax = push1 ;
        temp = ( tempax & 0xFF00 ) >> 8 ;
        temp += TimingPoint[ 1 ] ;

        if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
        {
            if ( ( pVBInfo->VBInfo & ( SetCRT2ToAVIDEO | SetCRT2ToSVIDEO | SetCRT2ToSCART | SetCRT2ToYPbPr ) ) )
            {
                tempcx = pVBInfo->VGAHDE ;
                if ( tempcx >= 1024 )
                {
                    temp = 0x1D ;		/* NTSC */
                    if ( pVBInfo->TVInfo & SetPALTV )
                        temp = 0x52 ;		/* PAL */
                }
            }
        }
        XGINew_SetReg1( pVBInfo->Part2Port , 0x02 , temp ) ;
    }

    /* 301b */
    tempcx = pVBInfo->HT ;

    if ( XGI_IsLCDDualLink( pVBInfo ) )
        tempcx = tempcx >> 1 ;

    tempcx -= 2 ;
    temp = tempcx & 0x00FF ;
    XGINew_SetReg1( pVBInfo->Part2Port , 0x1B , temp ) ;

    temp = ( tempcx & 0xFF00 ) >> 8 ;
    XGINew_SetRegANDOR( pVBInfo->Part2Port , 0x1D , ~0x0F , temp ) ;

    tempcx = pVBInfo->HT >> 1 ;
    push1 = tempcx ;				/* push cx */
    tempcx += 7 ;

    if ( pVBInfo->VBInfo & SetCRT2ToHiVisionTV )
    {
        tempcx -= 4 ;
    }

    temp = tempcx & 0x00FF ;
    temp = temp << 4 ;
    XGINew_SetRegANDOR( pVBInfo->Part2Port , 0x22 , 0x0F , temp ) ;

    tempbx = TimingPoint[ j ] | ( ( TimingPoint[ j + 1 ] ) << 8 ) ;
    tempbx += tempcx ;
    push2 = tempbx ;
    temp = tempbx & 0x00FF ;
    XGINew_SetReg1( pVBInfo->Part2Port , 0x24 , temp ) ;
    temp = ( tempbx & 0xFF00 ) >> 8 ;
    temp = temp << 4 ;
    XGINew_SetRegANDOR(pVBInfo->Part2Port,0x25,0x0F,temp);

    tempbx=push2;
    tempbx=tempbx+8;
    if ( pVBInfo->VBInfo & SetCRT2ToHiVisionTV )
    {
        tempbx=tempbx-4;
        tempcx=tempbx;
    }

    temp = ( tempbx & 0x00FF ) << 4 ;
    XGINew_SetRegANDOR( pVBInfo->Part2Port , 0x29 , 0x0F , temp ) ;

    j += 2 ;
    tempcx += ( TimingPoint[ j ] | ( ( TimingPoint[ j + 1 ] ) << 8 ) ) ;
    temp = tempcx & 0x00FF ;
    XGINew_SetReg1( pVBInfo->Part2Port , 0x27 , temp ) ;
    temp = ( ( tempcx & 0xFF00 ) >> 8 ) << 4 ;
    XGINew_SetRegANDOR( pVBInfo->Part2Port , 0x28 , 0x0F , temp ) ;

    tempcx += 8 ;
    if ( pVBInfo->VBInfo & SetCRT2ToHiVisionTV )
    {
        tempcx -= 4 ;
    }

    temp = tempcx & 0xFF ;
    temp = temp << 4 ;
    XGINew_SetRegANDOR( pVBInfo->Part2Port , 0x2A , 0x0F , temp ) ;

    tempcx = push1 ;					/* pop cx */
    j += 2 ;
    temp = TimingPoint[ j ] | ( ( TimingPoint[ j + 1 ] ) << 8 ) ;
    tempcx -= temp ;
    temp = tempcx & 0x00FF ;
    temp = temp << 4 ;
    XGINew_SetRegANDOR( pVBInfo->Part2Port , 0x2D , 0x0F ,temp ) ;

    tempcx -= 11 ;

    if ( !( pVBInfo->VBInfo & SetCRT2ToTV ) )
    {
        tempax = XGI_GetVGAHT2( pVBInfo) ;
        tempcx = tempax - 1 ;
    }
    temp = tempcx & 0x00FF ;
    XGINew_SetReg1( pVBInfo->Part2Port , 0x2E , temp ) ;

    tempbx = pVBInfo->VDE ;

    if ( pVBInfo->VGAVDE == 360 )
        tempbx = 746 ;
    if ( pVBInfo->VGAVDE == 375 )
        tempbx = 746 ;
    if ( pVBInfo->VGAVDE == 405 )
        tempbx = 853 ;

    if ( pVBInfo->VBInfo & SetCRT2ToTV )
    {
        if ( pVBInfo->VBType & ( VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
        {
            if ( !( pVBInfo->TVInfo & ( SetYPbPrMode525p | SetYPbPrMode750p ) ) )
                tempbx = tempbx >> 1 ;
        }
        else
            tempbx = tempbx >> 1 ;
    }

    tempbx -= 2 ;
    temp = tempbx & 0x00FF ;

    if ( pVBInfo->VBInfo & SetCRT2ToHiVisionTV )
    {
        if ( pVBInfo->VBType & VB_XGI301LV )
        {
            if ( pVBInfo->TVInfo & SetYPbPrMode1080i )
            {
                if ( pVBInfo->VBInfo & SetInSlaveMode )
                {
                    if ( ModeNo == 0x2f )
                        temp += 1 ;
                }
            }
        }
        else
        {
            if ( pVBInfo->VBInfo & SetInSlaveMode )
            {
                if ( ModeNo == 0x2f )
                    temp += 1 ;
            }
        }
    }

    XGINew_SetReg1( pVBInfo->Part2Port , 0x2F , temp ) ;

    temp = ( tempcx & 0xFF00 ) >> 8 ;
    temp |= ( ( tempbx & 0xFF00 ) >> 8 ) << 6 ;

    if ( !( pVBInfo->VBInfo & SetCRT2ToHiVisionTV ) )
    {
        if ( pVBInfo->VBType & VB_XGI301LV )
        {
            if ( pVBInfo->TVInfo & SetYPbPrMode1080i )
            {
                temp |= 0x10 ;

                if ( !( pVBInfo->VBInfo & SetCRT2ToSVIDEO ) )
                    temp |= 0x20 ;
            }
        }
        else
        {
            temp |= 0x10 ;
            if ( !( pVBInfo->VBInfo & SetCRT2ToSVIDEO ) )
                temp |= 0x20 ;
        }
    }

    XGINew_SetReg1( pVBInfo->Part2Port , 0x30 , temp ) ;

    if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )	/* TV gatingno */
    {
        tempbx = pVBInfo->VDE ;
        tempcx = tempbx - 2 ;

        if ( pVBInfo->VBInfo & SetCRT2ToTV )
        {
            if ( !( pVBInfo->TVInfo & ( SetYPbPrMode525p | SetYPbPrMode750p ) ) )
                tempbx = tempbx >> 1 ;
        }

        if ( pVBInfo->VBType & ( VB_XGI302LV | VB_XGI301C ) )
        {
            temp=0;
            if( tempcx & 0x0400 )
                temp |= 0x20 ;

            if ( tempbx & 0x0400 )
                temp |= 0x40 ;

            XGINew_SetReg1( pVBInfo->Part4Port , 0x10 , temp ) ;
        }

        temp = ( ( ( tempbx - 3 ) & 0x0300 ) >> 8 ) << 5 ;
        XGINew_SetReg1( pVBInfo->Part2Port , 0x46 , temp ) ;
        temp = ( tempbx - 3 ) & 0x00FF ;
        XGINew_SetReg1( pVBInfo->Part2Port , 0x47 , temp ) ;
    }

    tempbx = tempbx & 0x00FF ;

    if ( !( modeflag & HalfDCLK ) )
    {
        tempcx = pVBInfo->VGAHDE ;
        if ( tempcx >= pVBInfo->HDE )
        {
            tempbx |= 0x2000 ;
            tempax &= 0x00FF ;
        }
    }

    tempcx = 0x0101 ;

    if( pVBInfo->VBInfo & SetCRT2ToTV ) { /*301b*/
        if(pVBInfo->VGAHDE>=1024)
        {
	    tempcx=0x1920;
            if(pVBInfo->VGAHDE>=1280)
            {
	        tempcx=0x1420;
	        tempbx=tempbx&0xDFFF;
            }
        }
    }

    if ( !( tempbx & 0x2000 ) )
    {
        if ( modeflag & HalfDCLK )
        {
            tempcx = ( tempcx & 0xFF00 ) | ( ( tempcx & 0x00FF ) << 1 ) ;
	}

        push1 = tempbx ;
        tempeax = pVBInfo->VGAHDE ;
        tempebx = ( tempcx & 0xFF00 ) >> 8 ;
        longtemp = tempeax * tempebx ;
        tempecx = tempcx & 0x00FF ;
        longtemp = longtemp / tempecx ;

	/* 301b */
        tempecx = 8 * 1024 ;

        if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
        {
            tempecx = tempecx * 8 ;
        }

        longtemp = longtemp * tempecx ;
        tempecx = pVBInfo->HDE ;
        temp2 = longtemp % tempecx ;
        tempeax = longtemp / tempecx ;
        if ( temp2 != 0 )
        {
            tempeax += 1 ;
        }

	tempax = (unsigned short)tempeax;

	/* 301b */
        if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
        {
            tempcx = ( ( tempax & 0xFF00 ) >> 5 ) >> 8 ;
        }
        /* end 301b */

        tempbx = push1 ;
	tempbx = (unsigned short)(((tempeax & 0x0000FF00) & 0x1F00) | (tempbx & 0x00FF));
	tempax = (unsigned short)(((tempeax & 0x000000FF) << 8) | (tempax & 0x00FF));
        temp = ( tempax & 0xFF00 ) >> 8 ;
    }
    else
    {
        temp = ( tempax & 0x00FF ) >> 8 ;
    }

    XGINew_SetReg1( pVBInfo->Part2Port , 0x44 , temp ) ;
    temp = ( tempbx & 0xFF00 ) >> 8 ;
    XGINew_SetRegANDOR( pVBInfo->Part2Port , 0x45 , ~0x03F , temp ) ;
    temp = tempcx & 0x00FF ;

    if ( tempbx & 0x2000 )
        temp = 0 ;

    if ( !( pVBInfo->VBInfo & SetCRT2ToLCD ) )
        temp |= 0x18 ;

    XGINew_SetRegANDOR(pVBInfo->Part2Port,0x46,~0x1F,temp);
    if ( pVBInfo->TVInfo & SetPALTV )
    {
        tempbx = 0x0382 ;
        tempcx = 0x007e ;
    }
    else
    {
        tempbx = 0x0369 ;
        tempcx = 0x0061 ;
    }

    temp = tempbx & 0x00FF ;
    XGINew_SetReg1( pVBInfo->Part2Port , 0x4b , temp ) ;
    temp = tempcx & 0x00FF ;
    XGINew_SetReg1( pVBInfo->Part2Port , 0x4c , temp ) ;

    temp = ( ( tempcx & 0xFF00 ) >> 8 ) & 0x03 ;
    temp = temp << 2 ;
    temp |= ( ( tempbx & 0xFF00 ) >> 8 ) & 0x03 ;

    if ( pVBInfo->VBInfo & SetCRT2ToYPbPr )
    {
        temp |= 0x10 ;

        if ( pVBInfo->TVInfo & SetYPbPrMode525p )
            temp |= 0x20 ;

        if ( pVBInfo->TVInfo & SetYPbPrMode750p )
            temp |= 0x60 ;
    }

    XGINew_SetReg1( pVBInfo->Part2Port , 0x4d , temp ) ;
    temp=XGINew_GetReg1( pVBInfo->Part2Port , 0x43 ) ;		/* 301b change */
    XGINew_SetReg1( pVBInfo->Part2Port , 0x43, (unsigned short)( temp - 3 ) ) ;

    if ( !( pVBInfo->TVInfo & ( SetYPbPrMode525p | SetYPbPrMode750p ) ) )
    {
        if ( pVBInfo->TVInfo & NTSC1024x768 )
        {
            TimingPoint = XGI_NTSC1024AdjTime ;
            for( i = 0x1c , j = 0 ; i <= 0x30 ; i++ , j++ )
            {
                XGINew_SetReg1( pVBInfo->Part2Port , i , TimingPoint[ j ] ) ;
            }
            XGINew_SetReg1( pVBInfo->Part2Port , 0x43 , 0x72 ) ;
        }
    }

    /* [ycchen] 01/14/03 Modify for 301C PALM Support */
    if ( pVBInfo->VBType & VB_XGI301C )
    {
        if ( pVBInfo->TVInfo & SetPALMTV )
	    XGINew_SetRegANDOR( pVBInfo->Part2Port , 0x4E , ~0x08 , 0x08 ) ;	/* PALM Mode */
    }

    if ( pVBInfo->TVInfo & SetPALMTV )
    {
	tempax = (unsigned char)XGINew_GetReg1(pVBInfo->Part2Port, 0x01);
        tempax-- ;
        XGINew_SetRegAND( pVBInfo->Part2Port , 0x01 , tempax ) ;

        /* if ( !( pVBInfo->VBType & VB_XGI301C ) ) */
        XGINew_SetRegAND( pVBInfo->Part2Port , 0x00 , 0xEF ) ;
    }

    if ( pVBInfo->VBInfo & SetCRT2ToHiVisionTV )
    {
        if ( !( pVBInfo->VBInfo & SetInSlaveMode ) )
        {
            XGINew_SetReg1( pVBInfo->Part2Port , 0x0B , 0x00 ) ;
        }
    }

    if ( pVBInfo->VBInfo & SetCRT2ToTV )
    {
        return ;
    }
}


/* --------------------------------------------------------------------- */
/* Function : XGI_SetLCDRegs */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void  XGI_SetLCDRegs(unsigned short ModeNo, unsigned short ModeIdIndex, struct xgi_hw_device_info *HwDeviceExtension, unsigned short RefreshRateTableIndex, struct vb_device_info *pVBInfo)
{
    unsigned short push1 ,
           push2 ,
           pushbx ,
           tempax ,
           tempbx ,
           tempcx ,
           temp ,
           tempah ,
           tempbh ,
           tempch ,
           resinfo ,
           modeflag ,
           CRT1Index ;

    struct XGI_LCDDesStruct *LCDBDesPtr = NULL ;


    if ( ModeNo <= 0x13 )
    {
        modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ;	/* si+St_ResInfo */
        resinfo = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ResInfo ;
    }
    else
    {
        modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ;	/* si+Ext_ResInfo */
        resinfo = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_RESINFO ;
        CRT1Index = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_CRT1CRTC ;
        CRT1Index &= IndexMask ;
    }

    if ( !( pVBInfo->VBInfo & SetCRT2ToLCD ) )
    {
        return ;
    }

    tempbx = pVBInfo->HDE ;			/* RHACTE=HDE-1 */

    if ( XGI_IsLCDDualLink( pVBInfo ) )
        tempbx = tempbx >> 1 ;

    tempbx -= 1 ;
    temp = tempbx & 0x00FF ;
    XGINew_SetReg1( pVBInfo->Part2Port , 0x2C , temp ) ;
    temp = ( tempbx & 0xFF00 ) >> 8 ;
    temp = temp << 4 ;
    XGINew_SetRegANDOR( pVBInfo->Part2Port , 0x2B , 0x0F , temp ) ;
    temp = 0x01 ;

    if ( pVBInfo->LCDResInfo == Panel1280x1024 )
    {
        if ( pVBInfo->ModeType == ModeEGA )
        {
            if ( pVBInfo->VGAHDE >= 1024 )
            {
                temp = 0x02 ;
                if ( pVBInfo->LCDInfo & LCDVESATiming )
                    temp = 0x01 ;
            }
        }
    }

    XGINew_SetReg1( pVBInfo->Part2Port , 0x0B , temp ) ;
    tempbx = pVBInfo->VDE ;			/* RTVACTEO=(VDE-1)&0xFF */
    push1 = tempbx ;
    tempbx-- ;
    temp = tempbx & 0x00FF ;
    XGINew_SetReg1( pVBInfo->Part2Port , 0x03 , temp ) ;
    temp = ( ( tempbx & 0xFF00 ) >> 8 ) & 0x07 ;
    XGINew_SetRegANDOR( pVBInfo->Part2Port , 0x0C , ~0x07 , temp ) ;

    tempcx = pVBInfo->VT - 1 ;
    push2 = tempcx + 1 ;
    temp = tempcx & 0x00FF ;			/* RVTVT=VT-1 */
    XGINew_SetReg1( pVBInfo->Part2Port , 0x19 , temp ) ;
    temp = ( tempcx & 0xFF00 ) >> 8 ;
    temp = temp << 5 ;
    XGINew_SetReg1( pVBInfo->Part2Port , 0x1A , temp ) ;
    XGINew_SetRegANDOR( pVBInfo->Part2Port , 0x09 , 0xF0 , 0x00 ) ;
    XGINew_SetRegANDOR( pVBInfo->Part2Port , 0x0A , 0xF0 , 0x00 ) ;
    XGINew_SetRegANDOR( pVBInfo->Part2Port , 0x17 , 0xFB , 0x00 ) ;
    XGINew_SetRegANDOR( pVBInfo->Part2Port , 0x18 , 0xDF , 0x00 ) ;

    /* Customized LCDB Des no add */
    tempbx = 5 ;
    LCDBDesPtr = (struct XGI_LCDDesStruct *)XGI_GetLcdPtr(tempbx, ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
    tempah = pVBInfo->LCDResInfo ;
    tempah &= PanelResInfo ;

    if ( ( tempah == Panel1024x768 ) || ( tempah == Panel1024x768x75 ) )
    {
        tempbx = 1024 ;
        tempcx = 768 ;
    }
    else if ( ( tempah == Panel1280x1024 ) || ( tempah == Panel1280x1024x75 ) )
    {
        tempbx = 1280 ;
        tempcx = 1024 ;
    }
    else if ( tempah == Panel1400x1050 )
    {
        tempbx = 1400 ;
        tempcx = 1050 ;
    }
    else
    {
        tempbx = 1600 ;
        tempcx = 1200 ;
    }

    if ( pVBInfo->LCDInfo & EnableScalingLCD )
    {
        tempbx = pVBInfo->HDE ;
        tempcx = pVBInfo->VDE ;
    }

    pushbx = tempbx ;
    tempax = pVBInfo->VT ;
    pVBInfo->LCDHDES = LCDBDesPtr->LCDHDES ;
    pVBInfo->LCDHRS = LCDBDesPtr->LCDHRS ;
    pVBInfo->LCDVDES = LCDBDesPtr->LCDVDES ;
    pVBInfo->LCDVRS = LCDBDesPtr->LCDVRS ;
    tempbx = pVBInfo->LCDVDES ;
    tempcx += tempbx ;

    if ( tempcx >= tempax )
        tempcx -= tempax ;	/* lcdvdes */

    temp = tempbx & 0x00FF ;	/* RVEQ1EQ=lcdvdes */
    XGINew_SetReg1( pVBInfo->Part2Port , 0x05 , temp ) ;
    temp = tempcx & 0x00FF ;
    XGINew_SetReg1( pVBInfo->Part2Port , 0x06 , temp ) ;
    tempch = ( ( tempcx & 0xFF00 ) >> 8 ) & 0x07 ;
    tempbh = ( ( tempbx & 0xFF00 ) >> 8 ) & 0x07 ;
    tempah = tempch ;
    tempah = tempah << 3 ;
    tempah |= tempbh ;
    XGINew_SetReg1( pVBInfo->Part2Port , 0x02 , tempah ) ;

    /* getlcdsync() */
    XGI_GetLCDSync( &tempax , &tempbx,pVBInfo ) ;
    tempcx = tempbx ;
    tempax = pVBInfo->VT ;
    tempbx = pVBInfo->LCDVRS ;

    /* if ( SetLCD_Info & EnableScalingLCD ) */
    tempcx += tempbx ;
    if ( tempcx >= tempax )
        tempcx -= tempax ;

    temp = tempbx & 0x00FF ;	/* RTVACTEE=lcdvrs */
    XGINew_SetReg1( pVBInfo->Part2Port , 0x04 , temp ) ;
    temp = ( tempbx & 0xFF00 ) >> 8 ;
    temp = temp << 4 ;
    temp |= ( tempcx & 0x000F ) ;
    XGINew_SetReg1( pVBInfo->Part2Port , 0x01 , temp ) ;
    tempcx = pushbx ;
    tempax = pVBInfo->HT ;
    tempbx = pVBInfo->LCDHDES ;
    tempbx &= 0x0FFF ;

    if ( XGI_IsLCDDualLink(  pVBInfo ) )
    {
        tempax = tempax >> 1 ;
        tempbx = tempbx >> 1 ;
        tempcx = tempcx >> 1 ;
    }

    if ( pVBInfo->VBType & VB_XGI302LV )
        tempbx += 1 ;

    if ( pVBInfo->VBType & VB_XGI301C )  /* tap4 */
        tempbx += 1 ;

    tempcx += tempbx ;

    if ( tempcx >= tempax )
        tempcx -= tempax ;

    temp = tempbx & 0x00FF ;
    XGINew_SetReg1( pVBInfo->Part2Port , 0x1F , temp ) ;	/* RHBLKE=lcdhdes */
    temp = ( ( tempbx & 0xFF00 ) >> 8 ) << 4 ;
    XGINew_SetReg1( pVBInfo->Part2Port , 0x20 , temp ) ;
    temp = tempcx & 0x00FF ;
    XGINew_SetReg1( pVBInfo->Part2Port , 0x23 , temp ) ;	/* RHEQPLE=lcdhdee */
    temp = ( tempcx & 0xFF00 ) >> 8 ;
    XGINew_SetReg1( pVBInfo->Part2Port , 0x25 , temp ) ;

    /* getlcdsync() */
    XGI_GetLCDSync( &tempax , &tempbx ,pVBInfo) ;
    tempcx = tempax ;
    tempax = pVBInfo->HT ;
    tempbx = pVBInfo->LCDHRS ;
    /* if ( SetLCD_Info & EnableScalingLCD) */
    if ( XGI_IsLCDDualLink( pVBInfo) )
    {
        tempax = tempax >> 1 ;
        tempbx = tempbx >> 1 ;
        tempcx = tempcx >> 1 ;
    }

    if ( pVBInfo->VBType & VB_XGI302LV )
        tempbx += 1 ;

    tempcx += tempbx ;

    if ( tempcx >= tempax )
        tempcx -= tempax ;

    temp = tempbx & 0x00FF ;	/* RHBURSTS=lcdhrs */
    XGINew_SetReg1( pVBInfo->Part2Port , 0x1C , temp ) ;

    temp = ( tempbx & 0xFF00 ) >> 8 ;
    temp = temp << 4 ;
    XGINew_SetRegANDOR( pVBInfo->Part2Port , 0x1D , ~0x0F0 , temp ) ;
    temp = tempcx & 0x00FF ;	/* RHSYEXP2S=lcdhre */
    XGINew_SetReg1( pVBInfo->Part2Port , 0x21 , temp ) ;

    if ( !( pVBInfo->LCDInfo & LCDVESATiming ) )
    {
        if ( pVBInfo->VGAVDE == 525 )
        {
            if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
            {
                temp = 0xC6 ;
            }
            else
                temp = 0xC4 ;

            XGINew_SetReg1( pVBInfo->Part2Port , 0x2f , temp ) ;
            XGINew_SetReg1( pVBInfo->Part2Port , 0x30 , 0xB3 ) ;
        }

        if ( pVBInfo->VGAVDE == 420 )
        {
            if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
            {
                temp = 0x4F ;
            }
            else
                temp = 0x4E ;
            XGINew_SetReg1( pVBInfo->Part2Port , 0x2f , temp ) ;
        }
    }
}


/* --------------------------------------------------------------------- */
/* Function : XGI_GetTap4Ptr */
/* Input : */
/* Output : di -> Tap4 Reg. Setting Pointer */
/* Description : */
/* --------------------------------------------------------------------- */
struct XGI301C_Tap4TimingStruct *XGI_GetTap4Ptr(unsigned short tempcx,
					 struct vb_device_info *pVBInfo)
{
    unsigned short tempax ,
           tempbx ,
           i ;

    struct XGI301C_Tap4TimingStruct *Tap4TimingPtr ;

    if ( tempcx == 0 )
    {
        tempax = pVBInfo->VGAHDE ;
        tempbx = pVBInfo->HDE ;
    }
    else
    {
        tempax = pVBInfo->VGAVDE ;
        tempbx = pVBInfo->VDE ;
    }

    if ( tempax < tempbx )
        return &EnlargeTap4Timing[ 0 ] ;
    else if( tempax == tempbx )
        return &NoScaleTap4Timing[ 0 ] ; 	/* 1:1 */
    else
        Tap4TimingPtr = NTSCTap4Timing ; 	/* NTSC */

    if ( pVBInfo->TVInfo & SetPALTV )
        Tap4TimingPtr = PALTap4Timing ;


    if ( pVBInfo->VBInfo & SetCRT2ToYPbPr )
    {
        if ( pVBInfo->TVInfo & SetYPbPrMode525i )
            Tap4TimingPtr = YPbPr525iTap4Timing ;
        if ( pVBInfo->TVInfo & SetYPbPrMode525p )
            Tap4TimingPtr = YPbPr525pTap4Timing ;
        if ( pVBInfo->TVInfo & SetYPbPrMode750p )
            Tap4TimingPtr = YPbPr750pTap4Timing ;
    }

    if ( pVBInfo->VBInfo & SetCRT2ToHiVisionTV )
        Tap4TimingPtr = HiTVTap4Timing ;

    i = 0 ;
    while( Tap4TimingPtr[ i ].DE != 0xFFFF )
    {
        if ( Tap4TimingPtr[ i ].DE == tempax )
            break ;
        i++ ;
    }
    return &Tap4TimingPtr[ i ] ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_SetTap4Regs */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_SetTap4Regs(struct vb_device_info *pVBInfo)
{
    unsigned short i ,
           j ;

    struct XGI301C_Tap4TimingStruct *Tap4TimingPtr ;

    if ( !( pVBInfo->VBType & VB_XGI301C ) )
        return ;

#ifndef Tap4
    XGINew_SetRegAND( pVBInfo->Part2Port , 0x4E , 0xEB ) ;	/* Disable Tap4 */
#else            /* Tap4 Setting */

    Tap4TimingPtr = XGI_GetTap4Ptr( 0 , pVBInfo) ;  /* Set Horizontal Scaling */
    for( i = 0x80 , j = 0 ; i <= 0xBF ; i++ , j++ )
        XGINew_SetReg1( pVBInfo->Part2Port , i , Tap4TimingPtr->Reg[ j ] ) ;

    if ( ( pVBInfo->VBInfo & SetCRT2ToTV ) && ( !( pVBInfo->VBInfo & SetCRT2ToHiVisionTV ) ) )
    {
        Tap4TimingPtr = XGI_GetTap4Ptr( 1 , pVBInfo);	/* Set Vertical Scaling */
        for( i = 0xC0 , j = 0 ; i < 0xFF ; i++ , j++ )
            XGINew_SetReg1( pVBInfo->Part2Port , i , Tap4TimingPtr->Reg[ j ] ) ;
    }

    if ( ( pVBInfo->VBInfo & SetCRT2ToTV ) && ( !( pVBInfo->VBInfo & SetCRT2ToHiVisionTV ) ) )
        XGINew_SetRegANDOR( pVBInfo->Part2Port , 0x4E , ~0x14 , 0x04 ) ;	/* Enable V.Scaling */
    else
        XGINew_SetRegANDOR( pVBInfo->Part2Port , 0x4E , ~0x14 , 0x10 ) ;	/* Enable H.Scaling */
#endif
}

/* --------------------------------------------------------------------- */
/* Function : XGI_SetGroup3 */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_SetGroup3(unsigned short ModeNo, unsigned short ModeIdIndex, struct vb_device_info *pVBInfo)
{
    unsigned short i;
    unsigned char *tempdi;
    unsigned short  modeflag;

    if(ModeNo<=0x13)
    {
        modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;      /* si+St_ResInfo */
    }
    else
    {
        modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;     /* si+Ext_ResInfo */
    }


    XGINew_SetReg1(pVBInfo->Part3Port,0x00,0x00);
    if(pVBInfo->TVInfo&SetPALTV)
    {
        XGINew_SetReg1(pVBInfo->Part3Port,0x13,0xFA);
        XGINew_SetReg1(pVBInfo->Part3Port,0x14,0xC8);
    }
    else
    {
        XGINew_SetReg1(pVBInfo->Part3Port,0x13,0xF5);
        XGINew_SetReg1(pVBInfo->Part3Port,0x14,0xB7);
    }

    if(!(pVBInfo->VBInfo&SetCRT2ToTV))
    {
        return;
    }

    if(pVBInfo->TVInfo&SetPALMTV)
    {
        XGINew_SetReg1(pVBInfo->Part3Port,0x13,0xFA);
        XGINew_SetReg1(pVBInfo->Part3Port,0x14,0xC8);
        XGINew_SetReg1(pVBInfo->Part3Port,0x3D,0xA8);
    }

    if((pVBInfo->VBInfo&SetCRT2ToHiVisionTV)|| (pVBInfo->VBInfo&SetCRT2ToYPbPr))
    {
        if(pVBInfo->TVInfo & SetYPbPrMode525i)
        {
            return;
        }
        tempdi=pVBInfo->HiTVGroup3Data;
        if(pVBInfo->SetFlag&TVSimuMode)
        {
            tempdi=pVBInfo->HiTVGroup3Simu;
            if(!(modeflag&Charx8Dot))
            {
                tempdi=pVBInfo->HiTVGroup3Text;
            }
        }

        if(pVBInfo->TVInfo & SetYPbPrMode525p)
        {
            tempdi=pVBInfo->Ren525pGroup3;
        }
        if(pVBInfo->TVInfo & SetYPbPrMode750p)
        {
             tempdi=pVBInfo->Ren750pGroup3;
        }

        for(i=0;i<=0x3E;i++)
        {
            XGINew_SetReg1(pVBInfo->Part3Port,i,tempdi[i]);
        }
        if(pVBInfo->VBType&VB_XGI301C)  /* Marcovision */
        {
            if(pVBInfo->TVInfo & SetYPbPrMode525p)
            {
                XGINew_SetReg1(pVBInfo->Part3Port,0x28,0x3f);
            }
        }
    }
    return;
}  /* {end of XGI_SetGroup3} */


/* --------------------------------------------------------------------- */
/* Function : XGI_SetGroup4 */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_SetGroup4(unsigned short ModeNo, unsigned short ModeIdIndex, unsigned short RefreshRateTableIndex, struct xgi_hw_device_info *HwDeviceExtension, struct vb_device_info *pVBInfo)
{
    unsigned short tempax ,
           tempcx ,
           tempbx ,
           modeflag ,
           temp ,
           temp2 ;

    unsigned long tempebx ,
          tempeax ,
          templong ;


    if ( ModeNo <= 0x13 )
    {
        modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ;	/* si+St_ResInfo */
    }
    else
    {
        modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ;	/* si+Ext_ResInfo */
    }

    temp = pVBInfo->RVBHCFACT ;
    XGINew_SetReg1( pVBInfo->Part4Port , 0x13 , temp ) ;

    tempbx = pVBInfo->RVBHCMAX ;
    temp = tempbx & 0x00FF ;
    XGINew_SetReg1( pVBInfo->Part4Port , 0x14 , temp ) ;
    temp2 = ( ( tempbx & 0xFF00 ) >> 8 ) << 7 ;
    tempcx = pVBInfo->VGAHT - 1 ;
    temp = tempcx & 0x00FF ;
    XGINew_SetReg1( pVBInfo->Part4Port , 0x16 , temp ) ;

    temp =( ( tempcx & 0xFF00 ) >> 8 ) << 3 ;
    temp2 |= temp ;

    tempcx = pVBInfo->VGAVT - 1 ;
    if ( !( pVBInfo->VBInfo & SetCRT2ToTV ) )
    {
        tempcx -= 5 ;
    }

    temp = tempcx & 0x00FF ;
    XGINew_SetReg1( pVBInfo->Part4Port , 0x17 , temp ) ;
    temp = temp2 | ( ( tempcx & 0xFF00 ) >> 8 ) ;
    XGINew_SetReg1( pVBInfo->Part4Port , 0x15 , temp ) ;
    XGINew_SetRegOR( pVBInfo->Part4Port , 0x0D , 0x08 ) ;
    tempcx = pVBInfo->VBInfo ;
    tempbx = pVBInfo->VGAHDE ;

    if ( modeflag & HalfDCLK )
    {
        tempbx = tempbx >> 1 ;
    }

    if ( XGI_IsLCDDualLink( pVBInfo ) )
        tempbx = tempbx >> 1 ;

    if(tempcx&SetCRT2ToHiVisionTV)
    {
        temp=0;
        if(tempbx<=1024)
            temp=0xA0;
       if(tempbx == 1280)
          temp = 0xC0;
    }
    else if(tempcx&SetCRT2ToTV)
    {
         temp=0xA0;
         if(tempbx <= 800)
             temp=0x80;
    }
    else
    {
	 temp=0x80;
	 if(pVBInfo->VBInfo&SetCRT2ToLCD)
	 {
	     temp=0;
	     if(tempbx>800)
	         temp=0x60;
	 }
    }

    if ( pVBInfo->TVInfo & ( SetYPbPrMode525p | SetYPbPrMode750p ) )
    {
        temp = 0x00 ;
        if ( pVBInfo->VGAHDE == 1280 )
            temp = 0x40 ;
        if ( pVBInfo->VGAHDE == 1024 )
	    temp = 0x20 ;
    }
    XGINew_SetRegANDOR( pVBInfo->Part4Port , 0x0E , ~0xEF , temp ) ;

    tempebx = pVBInfo->VDE ;

    if ( tempcx & SetCRT2ToHiVisionTV )
    {
        if ( !( temp & 0xE000 ) )
            tempbx = tempbx >> 1 ;
    }

    tempcx = pVBInfo->RVBHRS ;
    temp = tempcx & 0x00FF ;
    XGINew_SetReg1( pVBInfo->Part4Port , 0x18 , temp );

    tempeax = pVBInfo->VGAVDE ;
    tempcx |= 0x04000 ;


    if ( tempeax <= tempebx )
    {
        tempcx=(tempcx&(~0x4000));
        tempeax = pVBInfo->VGAVDE ;
    }
    else
    {
        tempeax -= tempebx ;
    }


    templong = ( tempeax * 256 * 1024 ) % tempebx ;
    tempeax = ( tempeax * 256 * 1024 ) / tempebx ;
    tempebx = tempeax ;

    if ( templong != 0 )
    {
        tempebx++ ;
    }


    temp = (unsigned short)(tempebx & 0x000000FF);
    XGINew_SetReg1( pVBInfo->Part4Port , 0x1B , temp ) ;

    temp = (unsigned short)((tempebx & 0x0000FF00) >> 8);
    XGINew_SetReg1( pVBInfo->Part4Port , 0x1A , temp ) ;
    tempbx = (unsigned short)(tempebx >> 16);
    temp = tempbx & 0x00FF ;
    temp = temp << 4 ;
    temp |= ( ( tempcx & 0xFF00 ) >> 8 ) ;
    XGINew_SetReg1( pVBInfo->Part4Port , 0x19 , temp ) ;

    /* 301b */
    if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
    {
        temp = 0x0028 ;
        XGINew_SetReg1( pVBInfo->Part4Port , 0x1C , temp ) ;
        tempax = pVBInfo->VGAHDE ;
        if ( modeflag & HalfDCLK )
        {
            tempax = tempax >> 1 ;
        }

        if ( XGI_IsLCDDualLink( pVBInfo ) )
            tempax = tempax >> 1 ;

        /* if((pVBInfo->VBInfo&(SetCRT2ToLCD))||((pVBInfo->TVInfo&SetYPbPrMode525p)||(pVBInfo->TVInfo&SetYPbPrMode750p))) { */
        if ( pVBInfo->VBInfo & SetCRT2ToLCD )
        {
            if ( tempax > 800 )
                tempax -= 800 ;
        }
        else
        {
            if ( pVBInfo->VGAHDE > 800 )
            {
                if ( pVBInfo->VGAHDE == 1024 )
                    tempax = ( tempax * 25 / 32 ) - 1 ;
                else
                    tempax = ( tempax * 20 / 32 ) - 1 ;
            }
        }
        tempax -= 1 ;

/*
        if ( pVBInfo->VBInfo & ( SetCRT2ToTV | SetCRT2ToHiVisionTV ) )
        {
            if ( pVBInfo->VBType & VB_XGI301LV )
            {
                if ( !( pVBInfo->TVInfo & ( SetYPbPrMode525p | SetYPbPrMode750p | SetYPbPrMode1080i ) ) )
                {
                    if ( pVBInfo->VGAHDE > 800 )
                    {
                        if ( pVBInfo->VGAHDE == 1024 )
                            tempax = ( tempax * 25 / 32 ) - 1 ;
                        else
                            tempax = ( tempax * 20 / 32 ) - 1 ;
                    }
                }
            }
            else
            {
                if ( pVBInfo->VGAHDE > 800 )
                {
                    if ( pVBInfo->VGAHDE == 1024 )
                        tempax = ( tempax * 25 / 32 ) - 1 ;
                    else
                        tempax = ( tempax * 20 / 32 ) - 1 ;
                }
            }
        }
*/

        temp = ( tempax & 0xFF00 ) >> 8 ;
        temp = ( ( temp & 0x0003 ) << 4 ) ;
        XGINew_SetReg1( pVBInfo->Part4Port , 0x1E , temp ) ;
        temp = ( tempax & 0x00FF ) ;
        XGINew_SetReg1( pVBInfo->Part4Port , 0x1D , temp ) ;

        if ( pVBInfo->VBInfo & ( SetCRT2ToTV | SetCRT2ToHiVisionTV ) )
        {
            if ( pVBInfo->VGAHDE > 800 )
            {
                XGINew_SetRegOR( pVBInfo->Part4Port , 0x1E , 0x08 ) ;
            }
        }
        temp = 0x0036 ;

        if ( pVBInfo->VBInfo & SetCRT2ToTV )
        {
            if ( !( pVBInfo->TVInfo & ( NTSC1024x768 | SetYPbPrMode525p | SetYPbPrMode750p | SetYPbPrMode1080i ) ) )
            {
                temp |= 0x0001 ;
                if ( ( pVBInfo->VBInfo & SetInSlaveMode ) && ( !( pVBInfo->TVInfo & TVSimuMode ) ) )
                    temp &= ( ~0x0001 ) ;
            }
        }

        XGINew_SetRegANDOR( pVBInfo->Part4Port , 0x1F , 0x00C0 , temp ) ;
        tempbx = pVBInfo->HT ;
        if ( XGI_IsLCDDualLink( pVBInfo ) )
            tempbx = tempbx >> 1 ;
        tempbx = ( tempbx >> 1 ) - 2 ;
        temp = ( ( tempbx & 0x0700 ) >> 8 ) << 3 ;
        XGINew_SetRegANDOR( pVBInfo->Part4Port , 0x21 , 0x00C0 , temp ) ;
        temp = tempbx & 0x00FF ;
        XGINew_SetReg1( pVBInfo->Part4Port , 0x22 , temp ) ;
    }
    /* end 301b */

    if ( pVBInfo->ISXPDOS == 0 )
        XGI_SetCRT2VCLK( ModeNo , ModeIdIndex , RefreshRateTableIndex, pVBInfo ) ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_SetGroup5 */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_SetGroup5(unsigned short ModeNo, unsigned short ModeIdIndex, struct vb_device_info *pVBInfo)
{
    unsigned short Pindex ,
           Pdata ;

    Pindex = pVBInfo->Part5Port ;
    Pdata = pVBInfo->Part5Port + 1 ;
    if ( pVBInfo->ModeType == ModeVGA )
    {
        if ( !( pVBInfo->VBInfo & ( SetInSlaveMode | LoadDACFlag | CRT2DisplayFlag ) ) )
        {
            XGINew_EnableCRT2(pVBInfo) ;
            /* LoadDAC2(pVBInfo->Part5Port,ModeNo,ModeIdIndex); */
        }
    }
    return ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_GetLcdPtr */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void *XGI_GetLcdPtr(unsigned short BX,
		    unsigned short ModeNo,
		    unsigned short ModeIdIndex,
		    unsigned short RefreshRateTableIndex,
		    struct vb_device_info *pVBInfo)
{
    unsigned short i ,
           tempdx ,
           tempcx ,
           tempbx ,
           tempal ,
           modeflag ,
           table ;

    struct XGI330_LCDDataTablStruct *tempdi = 0 ;


    tempbx = BX;

    if ( ModeNo <= 0x13 )
    {
        modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ;
        tempal = pVBInfo->SModeIDTable[ ModeIdIndex ].St_CRT2CRTC ;
    }
    else
    {
        modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ;
        tempal = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_CRT2CRTC ;
    }

    tempal = tempal & 0x0f ;

    if ( tempbx <= 1 )		/* ExpLink */
    {
        if ( ModeNo <= 0x13 )
        {
            tempal = pVBInfo->SModeIDTable[ ModeIdIndex ].St_CRT2CRTC ; /* find no Ext_CRT2CRTC2 */
        }
        else
        {
            tempal= pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_CRT2CRTC ;
        }

        if ( pVBInfo->VBInfo & SetCRT2ToLCDA )
        {
            if ( ModeNo <= 0x13 )
                tempal = pVBInfo->SModeIDTable[ ModeIdIndex ].St_CRT2CRTC2 ;
            else
                tempal= pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_CRT2CRTC2 ;
        }

        if ( tempbx & 0x01 )
            tempal = ( tempal >> 4 ) ;

        tempal = ( tempal & 0x0f ) ;
    }

    tempcx = LCDLenList[ tempbx ] ;	/* mov cl,byte ptr cs:LCDLenList[bx] */

    if ( pVBInfo->LCDInfo & EnableScalingLCD )	/* ScaleLCD */
    {
        if ( ( tempbx == 5 ) || ( tempbx ) == 7 )
            tempcx = LCDDesDataLen2 ;
        else if ( ( tempbx == 3 ) || ( tempbx == 8 ) )
            tempcx = LVDSDesDataLen2 ;
    }
    /* mov di, word ptr cs:LCDDataList[bx] */
    /* tempdi=pVideoMemory[LCDDataList+tempbx*2]|(pVideoMemory[LCDDataList+tempbx*2+1]<<8); */

    switch( tempbx )
    {
        case 0:
            tempdi = XGI_EPLLCDCRT1Ptr_H ;
            break ;
        case 1:
            tempdi = XGI_EPLLCDCRT1Ptr_V ;
             break ;
        case 2:
            tempdi = XGI_EPLLCDDataPtr ;
            break ;
        case 3:
            tempdi = XGI_EPLLCDDesDataPtr ;
            break ;
        case 4:
            tempdi = XGI_LCDDataTable ;
            break ;
        case 5:
            tempdi = XGI_LCDDesDataTable ;
            break ;
        case 6:
            tempdi = XGI_EPLCHLCDRegPtr ;
            break ;
        case 7:
        case 8:
        case 9:
            tempdi = 0 ;
            break ;
        default:
        break ;
    }

    if ( tempdi == 0x00 )  /* OEMUtil */
        return 0 ;

    table = tempbx ;
    i = 0 ;

    while( tempdi[ i ].PANELID != 0xff )
    {
        tempdx = pVBInfo->LCDResInfo ;
        if ( tempbx & 0x0080 )     /* OEMUtil */
        {
            tempbx &= ( ~0x0080 ) ;
            tempdx = pVBInfo->LCDTypeInfo ;
        }

        if ( pVBInfo->LCDInfo & EnableScalingLCD )
        tempdx &= ( ~PanelResInfo ) ;

        if ( tempdi[ i ].PANELID == tempdx )
        {
            tempbx = tempdi[ i ].MASK ;
            tempdx = pVBInfo->LCDInfo ;

            if ( ModeNo <= 0x13 )         /* alan 09/10/2003 */
                tempdx |= SetLCDStdMode ;

            if ( modeflag & HalfDCLK )
                tempdx |= SetLCDLowResolution ;

            tempbx &= tempdx;
            if ( tempbx == tempdi[ i ].CAP )
                break ;
        }
        i++ ;
    }

    if ( table == 0 )
    {
        switch( tempdi[ i ].DATAPTR )
        {
            case 0:
                return &XGI_LVDSCRT11024x768_1_H[ tempal ] ;
                break ;
            case 1:
                return &XGI_LVDSCRT11024x768_2_H[ tempal ] ;
                break ;
            case 2:
                return &XGI_LVDSCRT11280x1024_1_H[ tempal ] ;
                break ;
            case 3:
                return &XGI_LVDSCRT11280x1024_2_H[ tempal ] ;
                break ;
            case 4:
                return &XGI_LVDSCRT11400x1050_1_H[ tempal ] ;
                break ;
            case 5:
                return &XGI_LVDSCRT11400x1050_2_H[ tempal ] ;
                break ;
            case 6:
                return &XGI_LVDSCRT11600x1200_1_H[ tempal ] ;
                break ;
            case 7:
                return &XGI_LVDSCRT11024x768_1_Hx75[ tempal ] ;
                break ;
            case 8:
                return &XGI_LVDSCRT11024x768_2_Hx75[ tempal ] ;
                break ;
            case 9:
                return &XGI_LVDSCRT11280x1024_1_Hx75[ tempal ] ;
                break ;
            case 10:
                return &XGI_LVDSCRT11280x1024_2_Hx75[ tempal ] ;
                break ;
            default:
                break ;
        }
    }
    else if ( table == 1 )
    {
        switch( tempdi[ i ].DATAPTR )
        {
            case 0:
                return &XGI_LVDSCRT11024x768_1_V[ tempal ] ;
                break ;
            case 1:
                return &XGI_LVDSCRT11024x768_2_V[ tempal ] ;
                break ;
            case 2:
                return &XGI_LVDSCRT11280x1024_1_V[ tempal ] ;
                break ;
            case 3:
                return &XGI_LVDSCRT11280x1024_2_V[ tempal ] ;
                break ;
            case 4:
                return &XGI_LVDSCRT11400x1050_1_V[ tempal ] ;
                break ;
            case 5:
                return &XGI_LVDSCRT11400x1050_2_V[ tempal ] ;
                break ;
            case 6:
                return &XGI_LVDSCRT11600x1200_1_V[ tempal ] ;
                break ;
            case 7:
                return &XGI_LVDSCRT11024x768_1_Vx75[ tempal ] ;
                break ;
            case 8:
                return &XGI_LVDSCRT11024x768_2_Vx75[ tempal ] ;
                break ;
            case 9:
                return &XGI_LVDSCRT11280x1024_1_Vx75[ tempal ] ;
                break ;
            case 10:
                return &XGI_LVDSCRT11280x1024_2_Vx75[ tempal ] ;
                break ;
            default:
                break ;
        }
    }
    else if ( table == 2 )
    {
        switch( tempdi[ i ].DATAPTR )
        {
            case 0:
                return &XGI_LVDS1024x768Data_1[ tempal ] ;
                break ;
            case 1:
                return &XGI_LVDS1024x768Data_2[ tempal ] ;
                break ;
            case 2:
                return &XGI_LVDS1280x1024Data_1[ tempal ] ;
                break ;
            case 3:
                return &XGI_LVDS1280x1024Data_2[ tempal ] ;
                break ;
            case 4:
                return &XGI_LVDS1400x1050Data_1[ tempal ] ;
                break ;
            case 5:
                return &XGI_LVDS1400x1050Data_2[ tempal ] ;
                break ;
            case 6:
                return &XGI_LVDS1600x1200Data_1[ tempal ] ;
                break ;
            case 7:
                return &XGI_LVDSNoScalingData[ tempal ] ;
                break ;
            case 8:
                return &XGI_LVDS1024x768Data_1x75[ tempal ] ;
                break ;
            case 9:
                return &XGI_LVDS1024x768Data_2x75[ tempal ] ;
                break ;
            case 10:
                return &XGI_LVDS1280x1024Data_1x75[ tempal ] ;
                break ;
            case 11:
                return &XGI_LVDS1280x1024Data_2x75[ tempal ] ;
                break ;
            case 12:
                return &XGI_LVDSNoScalingDatax75[ tempal ] ;
                break ;
            default:
                break ;
        }
    }
    else if ( table == 3 )
    {
        switch( tempdi[ i ].DATAPTR )
        {
            case 0:
                return &XGI_LVDS1024x768Des_1[ tempal ] ;
                break ;
            case 1:
                return &XGI_LVDS1024x768Des_3[ tempal ] ;
                break ;
            case 2:
                return &XGI_LVDS1024x768Des_2[ tempal ] ;
                break ;
            case 3:
                return &XGI_LVDS1280x1024Des_1[ tempal ] ;
                break ;
            case 4:
                return &XGI_LVDS1280x1024Des_2[ tempal ] ;
                break ;
            case 5:
                return &XGI_LVDS1400x1050Des_1[ tempal ] ;
                break ;
            case 6:
                return &XGI_LVDS1400x1050Des_2[ tempal ] ;
                break ;
            case 7:
                return &XGI_LVDS1600x1200Des_1[ tempal ] ;
                break ;
            case 8:
                return &XGI_LVDSNoScalingDesData[ tempal ] ;
                break ;
            case 9:
                return &XGI_LVDS1024x768Des_1x75[ tempal ] ;
                break ;
            case 10:
                return &XGI_LVDS1024x768Des_3x75[ tempal ] ;
                break ;
            case 11:
                return &XGI_LVDS1024x768Des_2x75[ tempal ] ;
                break;
            case 12:
                return &XGI_LVDS1280x1024Des_1x75[ tempal ] ;
                break ;
            case 13:
                return &XGI_LVDS1280x1024Des_2x75[ tempal ] ;
                break ;
            case 14:
                return &XGI_LVDSNoScalingDesDatax75[ tempal ] ;
                break ;
            default:
                break ;
        }
    }
    else if ( table == 4 )
    {
        switch( tempdi[ i ].DATAPTR )
        {
            case 0:
                return &XGI_ExtLCD1024x768Data[ tempal ] ;
                break ;
            case 1:
                return &XGI_StLCD1024x768Data[ tempal ] ;
                break ;
            case 2:
                return &XGI_CetLCD1024x768Data[ tempal ] ;
                break ;
            case 3:
                return &XGI_ExtLCD1280x1024Data[ tempal ] ;
                break ;
            case 4:
                return &XGI_StLCD1280x1024Data[ tempal ] ;
                break ;
            case 5:
                return &XGI_CetLCD1280x1024Data[ tempal ] ;
                break ;
            case 6:
                return &XGI_ExtLCD1400x1050Data[ tempal ] ;
                break ;
            case 7:
                return &XGI_StLCD1400x1050Data[ tempal ] ;
                break ;
            case 8:
                return &XGI_CetLCD1400x1050Data[ tempal ] ;
                break ;
            case 9:
                return &XGI_ExtLCD1600x1200Data[ tempal ] ;
                break  ;
            case 10:
                return &XGI_StLCD1600x1200Data[ tempal ] ;
                break ;
            case 11:
                return &XGI_NoScalingData[ tempal ] ;
                break ;
            case 12:
                return &XGI_ExtLCD1024x768x75Data[ tempal ] ;
                break ;
            case 13:
                return &XGI_ExtLCD1024x768x75Data[ tempal ] ;
                break ;
            case 14:
                return &XGI_CetLCD1024x768x75Data[ tempal ] ;
                break ;
            case 15:
                 return &XGI_ExtLCD1280x1024x75Data[ tempal ] ;
                break ;
            case 16:
                return &XGI_StLCD1280x1024x75Data[ tempal ] ;
                break;
            case 17:
                return &XGI_CetLCD1280x1024x75Data[ tempal ] ;
                break;
            case 18:
                return &XGI_NoScalingDatax75[ tempal ] ;
                break ;
            default:
                break ;
        }
    }
    else if ( table == 5 )
    {
        switch( tempdi[ i ].DATAPTR )
        {
            case 0:
                return &XGI_ExtLCDDes1024x768Data[ tempal ] ;
                break ;
            case 1:
                return &XGI_StLCDDes1024x768Data[ tempal ] ;
                break ;
            case 2:
                return &XGI_CetLCDDes1024x768Data[ tempal ] ;
                break ;
            case 3:
                if ( ( pVBInfo->VBType & VB_XGI301LV ) || ( pVBInfo->VBType & VB_XGI302LV ) )
                    return &XGI_ExtLCDDLDes1280x1024Data[ tempal ] ;
                else
                    return &XGI_ExtLCDDes1280x1024Data[ tempal ] ;
                break ;
            case 4:
                if ( ( pVBInfo->VBType & VB_XGI301LV ) || ( pVBInfo->VBType & VB_XGI302LV ) )
                    return &XGI_StLCDDLDes1280x1024Data[ tempal ] ;
                else
                    return &XGI_StLCDDes1280x1024Data[ tempal ] ;
                break ;
            case 5:
                if ( ( pVBInfo->VBType & VB_XGI301LV ) || ( pVBInfo->VBType & VB_XGI302LV ) )
                    return &XGI_CetLCDDLDes1280x1024Data[ tempal ] ;
                else
                    return &XGI_CetLCDDes1280x1024Data[ tempal ] ;
                break ;
            case 6:
                if ( ( pVBInfo->VBType & VB_XGI301LV ) || ( pVBInfo->VBType & VB_XGI302LV ) )
                    return &XGI_ExtLCDDLDes1400x1050Data[ tempal ] ;
                else
                    return &XGI_ExtLCDDes1400x1050Data[ tempal ] ;
                break ;
            case 7:
                if ( ( pVBInfo->VBType & VB_XGI301LV ) || ( pVBInfo->VBType & VB_XGI302LV ) )
                    return &XGI_StLCDDLDes1400x1050Data[ tempal ] ;
                else
                    return &XGI_StLCDDes1400x1050Data[ tempal ] ;
                break ;
            case 8:
                return &XGI_CetLCDDes1400x1050Data[ tempal ] ;
                break ;
            case 9:
                return &XGI_CetLCDDes1400x1050Data2[ tempal ] ;
                break ;
            case 10:
                if ( ( pVBInfo->VBType & VB_XGI301LV ) || ( pVBInfo->VBType & VB_XGI302LV ) )
                    return &XGI_ExtLCDDLDes1600x1200Data[ tempal ] ;
                else
                    return &XGI_ExtLCDDes1600x1200Data[ tempal ] ;
                break ;
            case 11:
                if ( ( pVBInfo->VBType & VB_XGI301LV ) || ( pVBInfo->VBType & VB_XGI302LV ) )
                    return &XGI_StLCDDLDes1600x1200Data[ tempal ] ;
                else
                    return &XGI_StLCDDes1600x1200Data[ tempal ] ;
                break ;
            case 12:
                return &XGI_NoScalingDesData[ tempal ] ;
                break;
            case 13:
                return &XGI_ExtLCDDes1024x768x75Data[ tempal ] ;
                break ;
            case 14:
                return &XGI_StLCDDes1024x768x75Data[ tempal ] ;
                break ;
            case 15:
                return &XGI_CetLCDDes1024x768x75Data[ tempal ] ;
                break ;
            case 16:
                if ( ( pVBInfo->VBType & VB_XGI301LV ) || ( pVBInfo->VBType & VB_XGI302LV ) )
                    return &XGI_ExtLCDDLDes1280x1024x75Data[ tempal ] ;
                else
                    return &XGI_ExtLCDDes1280x1024x75Data[ tempal ] ;
                break ;
            case 17:
                if ( ( pVBInfo->VBType & VB_XGI301LV ) || ( pVBInfo->VBType & VB_XGI302LV ) )
                    return &XGI_StLCDDLDes1280x1024x75Data[ tempal ] ;
                else
                    return &XGI_StLCDDes1280x1024x75Data[ tempal ] ;
                break ;
            case 18:
                if ( ( pVBInfo->VBType & VB_XGI301LV ) || ( pVBInfo->VBType & VB_XGI302LV ) )
                    return &XGI_CetLCDDLDes1280x1024x75Data[ tempal ] ;
                else
                    return &XGI_CetLCDDes1280x1024x75Data[ tempal ] ;
                break ;
            case 19:
                return &XGI_NoScalingDesDatax75[ tempal ] ;
                break ;
            default:
                break ;
        }
    }
    else if ( table == 6 )
    {
        switch( tempdi[ i ].DATAPTR )
        {
            case 0:
                return &XGI_CH7017LV1024x768[ tempal ] ;
                break ;
            case 1:
                return &XGI_CH7017LV1400x1050[ tempal ] ;
                break ;
            default:
                break ;
        }
    }
    return 0 ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_GetTVPtr */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void *XGI_GetTVPtr(unsigned short BX, unsigned short ModeNo,
		   unsigned short ModeIdIndex,
		   unsigned short RefreshRateTableIndex,
		   struct vb_device_info *pVBInfo)
{
    unsigned short i , tempdx , tempbx , tempal , modeflag , table ;
    struct XGI330_TVDataTablStruct *tempdi = 0 ;

    tempbx = BX ;

    if ( ModeNo <= 0x13 )
    {
        modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ;
        tempal = pVBInfo->SModeIDTable[ ModeIdIndex ].St_CRT2CRTC ;
    }
    else
    {
        modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ;
        tempal = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_CRT2CRTC ;
    }

    tempal = tempal & 0x3f ;
    table = tempbx ;

    switch( tempbx )
    {
        case 0:
            tempdi = 0 ;	/*EPLCHTVCRT1Ptr_H;*/
            if ( pVBInfo->IF_DEF_CH7007 == 1 )
            {
                tempdi = XGI_EPLCHTVCRT1Ptr;
            }
            break ;
        case 1:
            tempdi = 0 ;	/*EPLCHTVCRT1Ptr_V;*/
            if ( pVBInfo->IF_DEF_CH7007 == 1 )
            {
                tempdi = XGI_EPLCHTVCRT1Ptr;
            }
            break ;
        case 2:
            tempdi = XGI_EPLCHTVDataPtr ;
            break ;
        case 3:
            tempdi = 0 ;
            break ;
        case 4:
            tempdi = XGI_TVDataTable ;
            break ;
        case 5:
            tempdi = 0 ;
            break ;
        case 6:
            tempdi = XGI_EPLCHTVRegPtr ;
            break ;
        default:
            break ;
    }

    if ( tempdi == 0x00 )  /* OEMUtil */
        return( 0 ) ;

    tempdx = pVBInfo->TVInfo ;

    if ( pVBInfo->VBInfo & SetInSlaveMode )
        tempdx = tempdx | SetTVLockMode ;

    if ( modeflag & HalfDCLK )
        tempdx = tempdx | SetTVLowResolution ;

    i = 0 ;

    while( tempdi[ i ].MASK != 0xffff )
    {
        if ( ( tempdx & tempdi[ i ].MASK ) == tempdi[ i ].CAP )
            break ;
        i++ ;
    }

    if ( table == 0x00 ) /* 07/05/22 */
    {
    }
    else if ( table == 0x01 )
    {
    }
    else if ( table == 0x04 )
    {
        switch( tempdi[ i ].DATAPTR )
        {
            case 0:
                return &XGI_ExtPALData[ tempal ] ;
		break ;
            case 1:
                return &XGI_ExtNTSCData[ tempal ] ;
 		break ;
      	    case 2:
      	   	return &XGI_StPALData[ tempal ] ;
 		break ;
            case 3:
           	return &XGI_StNTSCData[ tempal ] ;
 		break ;
      	    case 4:
      	   	return &XGI_ExtHiTVData[ tempal ] ;
 		break ;
      	    case 5:
      	   	return &XGI_St2HiTVData[ tempal ] ;
 		break ;
      	    case 6:
      	   	return &XGI_ExtYPbPr525iData[ tempal ] ;
 		break ;
      	    case 7:
      	   	return &XGI_ExtYPbPr525pData[ tempal ] ;
 		break ;
      	    case 8:
      	   	return &XGI_ExtYPbPr750pData[ tempal ] ;
 		break ;
      	    case 9:
      	   	return &XGI_StYPbPr525iData[ tempal ] ;
 		break ;
      	    case 10:
      	   	return &XGI_StYPbPr525pData[ tempal ] ;
 		break ;
      	    case 11:
      	   	return &XGI_StYPbPr750pData[ tempal ] ;
             	break;
            case 12: 	/* avoid system hang */
      	   	return &XGI_ExtNTSCData[ tempal ] ;
             	break ;
            case 13:
      	   	return &XGI_St1HiTVData[ tempal ] ;
             	break ;
            default:
                break ;
        }
    }
    else if( table == 0x02 )
    {
        switch( tempdi[ i ].DATAPTR )
        {
            case 0:
                return &XGI_CHTVUNTSCData[ tempal ] ;
                break ;
            case 1:
      	        return &XGI_CHTVONTSCData[ tempal ] ;
                break ;
            case 2:
                return &XGI_CHTVUPALData[ tempal ] ;
                break ;
            case 3:
                return &XGI_CHTVOPALData[ tempal ] ;
                break ;
            default:
                break ;
        }
    }
    else if( table == 0x06 )
    {
    }
    return( 0 ) ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_BacklightByDrv */
/* Input : */
/* Output : 1 -> Skip backlight control */
/* Description : */
/* --------------------------------------------------------------------- */
unsigned char XGI_BacklightByDrv(struct vb_device_info *pVBInfo)
{
    unsigned char tempah ;

    tempah = (unsigned char)XGINew_GetReg1(pVBInfo->P3d4, 0x3A) ;
    if (tempah & BacklightControlBit)
	    return 1;
    else
	    return 0;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_FirePWDDisable */
/* Input : */
/* Output : */
/* Description : Turn off VDD & Backlight : Fire disable procedure */
/* --------------------------------------------------------------------- */
/*
void XGI_FirePWDDisable(struct vb_device_info *pVBInfo)
{
    XGINew_SetRegANDOR( pVBInfo->Part1Port , 0x26 , 0x00 , 0xFC ) ;
}
*/

/* --------------------------------------------------------------------- */
/* Function : XGI_FirePWDEnable */
/* Input : */
/* Output : */
/* Description : Turn on VDD & Backlight : Fire enable procedure */
/* --------------------------------------------------------------------- */
void XGI_FirePWDEnable(struct vb_device_info *pVBInfo)
{
    XGINew_SetRegANDOR( pVBInfo->Part1Port , 0x26 , 0x03 , 0xFC ) ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_EnableGatingCRT */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_EnableGatingCRT(struct xgi_hw_device_info *HwDeviceExtension, struct vb_device_info *pVBInfo)
{
    XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x63 , 0xBF , 0x40 ) ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_DisableGatingCRT */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_DisableGatingCRT(struct xgi_hw_device_info *HwDeviceExtension, struct vb_device_info *pVBInfo)
{

    XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x63 , 0xBF , 0x00 ) ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_SetPanelDelay */
/* Input : */
/* Output : */
/* Description : */
/* I/P : bl : 1 ; T1 : the duration between CPL on and signal on */
/* : bl : 2 ; T2 : the duration signal on and Vdd on */
/* : bl : 3 ; T3 : the duration between CPL off and signal off */
/* : bl : 4 ; T4 : the duration signal off and Vdd off */
/* --------------------------------------------------------------------- */
void XGI_SetPanelDelay(unsigned short tempbl, struct vb_device_info *pVBInfo)
{
    unsigned short index ;

    index = XGI_GetLCDCapPtr(pVBInfo) ;

    if ( tempbl == 1 )
        XGINew_LCD_Wait_Time( pVBInfo->LCDCapList[ index ].PSC_S1, pVBInfo ) ;

    if ( tempbl == 2 )
        XGINew_LCD_Wait_Time( pVBInfo->LCDCapList[ index ].PSC_S2, pVBInfo ) ;

    if ( tempbl == 3 )
        XGINew_LCD_Wait_Time( pVBInfo->LCDCapList[ index ].PSC_S3, pVBInfo ) ;

    if ( tempbl == 4 )
        XGINew_LCD_Wait_Time( pVBInfo->LCDCapList[ index ].PSC_S4, pVBInfo ) ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_SetPanelPower */
/* Input : */
/* Output : */
/* Description : */
/* I/O : ah = 0011b = 03h ; Backlight on, Power on */
/* = 0111b = 07h ; Backlight on, Power off */
/* = 1011b = 0Bh ; Backlight off, Power on */
/* = 1111b = 0Fh ; Backlight off, Power off */
/* --------------------------------------------------------------------- */
void XGI_SetPanelPower(unsigned short tempah, unsigned short tempbl, struct vb_device_info *pVBInfo)
{
    if ( pVBInfo->VBType & ( VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
        XGINew_SetRegANDOR( pVBInfo->Part4Port , 0x26 , tempbl , tempah ) ;
    else
        XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x11 , tempbl , tempah ) ;
}

unsigned char XG21GPIODataTransfer(unsigned char ujDate)
{
    unsigned char  ujRet = 0;
    unsigned char  i = 0;

    for (i=0; i<8; i++)
	{
    	ujRet = ujRet << 1;
	/* ujRet |= GETBITS(ujDate >> i, 0:0); */
        ujRet |= (ujDate >> i) & 1;
    }

	return ujRet;
}

/*----------------------------------------------------------------------------*/
/* output                                                                     */
/*      bl[5] : LVDS signal                                                   */
/*      bl[1] : LVDS backlight                                                */
/*      bl[0] : LVDS VDD                                                      */
/*----------------------------------------------------------------------------*/
unsigned char XGI_XG21GetPSCValue(struct vb_device_info *pVBInfo)
{
    unsigned char CR4A, temp;

    CR4A = XGINew_GetReg1( pVBInfo->P3d4 , 0x4A ) ;
    XGINew_SetRegAND( pVBInfo->P3d4 , 0x4A , ~0x23 ) ; /* enable GPIO write */

    temp = XGINew_GetReg1( pVBInfo->P3d4 , 0x48 ) ;

    temp = XG21GPIODataTransfer(temp);
    temp &= 0x23;
    XGINew_SetReg1( pVBInfo->P3d4 , 0x4A , CR4A ) ;
    return temp;
}

/*----------------------------------------------------------------------------*/
/* output                                                                     */
/*      bl[5] : LVDS signal                                                   */
/*      bl[1] : LVDS backlight                                                */
/*      bl[0] : LVDS VDD                                                      */
/*----------------------------------------------------------------------------*/
unsigned char XGI_XG27GetPSCValue(struct vb_device_info *pVBInfo)
{
    unsigned char CR4A, CRB4, temp;

    CR4A = XGINew_GetReg1( pVBInfo->P3d4 , 0x4A ) ;
    XGINew_SetRegAND( pVBInfo->P3d4 , 0x4A , ~0x0C ) ; /* enable GPIO write */

    temp = XGINew_GetReg1( pVBInfo->P3d4 , 0x48 ) ;

    temp &= 0x0C;
    temp >>= 2;
    XGINew_SetReg1( pVBInfo->P3d4 , 0x4A , CR4A ) ;
    CRB4 = XGINew_GetReg1( pVBInfo->P3d4 , 0xB4 ) ;
    temp |= ((CRB4&0x04)<<3);
    return temp;
}
/*----------------------------------------------------------------------------*/
/* input                                                                      */
/*      bl[5] : 1;LVDS signal on                                              */
/*      bl[1] : 1;LVDS backlight on                                           */
/*      bl[0] : 1:LVDS VDD on                                                 */
/*      bh: 100000b : clear bit 5, to set bit5                                */
/*          000010b : clear bit 1, to set bit1                                */
/*          000001b : clear bit 0, to set bit0                                */
/*----------------------------------------------------------------------------*/
void XGI_XG21BLSignalVDD(unsigned short tempbh, unsigned short tempbl, struct vb_device_info *pVBInfo)
{
    unsigned char CR4A, temp;

    CR4A = XGINew_GetReg1( pVBInfo->P3d4 , 0x4A ) ;
    tempbh &= 0x23;
    tempbl &= 0x23;
    XGINew_SetRegAND( pVBInfo->P3d4 , 0x4A , ~tempbh ) ; /* enable GPIO write */

    if (tempbh&0x20)
    {
      temp = (tempbl>>4)&0x02;

      XGINew_SetRegANDOR( pVBInfo->P3d4 , 0xB4 , ~0x02 , temp) ; /* CR B4[1] */

    }

    temp = XGINew_GetReg1( pVBInfo->P3d4 , 0x48 ) ;

    temp = XG21GPIODataTransfer(temp);
    temp &= ~tempbh;
    temp |= tempbl;
    XGINew_SetReg1( pVBInfo->P3d4 , 0x48 , temp ) ;
}

void XGI_XG27BLSignalVDD(unsigned short tempbh, unsigned short tempbl, struct vb_device_info *pVBInfo)
{
    unsigned char CR4A, temp;
    unsigned short tempbh0, tempbl0;

    tempbh0 = tempbh;
    tempbl0 = tempbl;
    tempbh0 &= 0x20;
    tempbl0 &= 0x20;
    tempbh0 >>= 3;
    tempbl0 >>= 3;

    if (tempbh&0x20)
    {
      temp = (tempbl>>4)&0x02;

      XGINew_SetRegANDOR( pVBInfo->P3d4 , 0xB4 , ~0x02 , temp) ; /* CR B4[1] */

    }
    XGINew_SetRegANDOR( pVBInfo->P3d4 , 0xB4 , ~tempbh0 , tempbl0 ) ;

    CR4A = XGINew_GetReg1( pVBInfo->P3d4 , 0x4A ) ;
    tempbh &= 0x03;
    tempbl &= 0x03;
    tempbh <<= 2;
    tempbl <<= 2;                                       /* GPIOC,GPIOD */
    XGINew_SetRegAND( pVBInfo->P3d4 , 0x4A , ~tempbh ) ; /* enable GPIO write */
    XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x48 , ~tempbh , tempbl ) ;
}

/* --------------------------------------------------------------------- */
unsigned short XGI_GetLVDSOEMTableIndex(struct vb_device_info *pVBInfo)
{
    unsigned short index ;

    index = XGINew_GetReg1( pVBInfo->P3d4 , 0x36 ) ;
    if (index < sizeof(XGI21_LCDCapList)/sizeof(struct XGI21_LVDSCapStruct))
	    return index;
    return 0;
}

/* --------------------------------------------------------------------- */
/* Function : XGI_XG21SetPanelDelay */
/* Input : */
/* Output : */
/* Description : */
/* I/P : bl : 1 ; T1 : the duration between CPL on and signal on */
/* : bl : 2 ; T2 : the duration signal on and Vdd on */
/* : bl : 3 ; T3 : the duration between CPL off and signal off */
/* : bl : 4 ; T4 : the duration signal off and Vdd off */
/* --------------------------------------------------------------------- */
void XGI_XG21SetPanelDelay(unsigned short tempbl, struct vb_device_info *pVBInfo)
{
    unsigned short index ;

    index = XGI_GetLVDSOEMTableIndex( pVBInfo );
    if ( tempbl == 1 )
        XGINew_LCD_Wait_Time( pVBInfo->XG21_LVDSCapList[ index ].PSC_S1, pVBInfo ) ;

    if ( tempbl == 2 )
        XGINew_LCD_Wait_Time( pVBInfo->XG21_LVDSCapList[ index ].PSC_S2, pVBInfo ) ;

    if ( tempbl == 3 )
        XGINew_LCD_Wait_Time( pVBInfo->XG21_LVDSCapList[ index ].PSC_S3, pVBInfo ) ;

    if ( tempbl == 4 )
        XGINew_LCD_Wait_Time( pVBInfo->XG21_LVDSCapList[ index ].PSC_S4, pVBInfo ) ;
}

unsigned char XGI_XG21CheckLVDSMode(unsigned short ModeNo,
				    unsigned short ModeIdIndex,
				    struct vb_device_info *pVBInfo)
{
    unsigned short xres ,
           yres ,
           colordepth ,
           modeflag ,
           resindex ,
           lvdstableindex;

    resindex = XGI_GetResInfo( ModeNo , ModeIdIndex, pVBInfo ) ;
    if ( ModeNo <= 0x13 )
    {
        xres = pVBInfo->StResInfo[ resindex ].HTotal ;
        yres = pVBInfo->StResInfo[ resindex ].VTotal ;
        modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;    /* si+St_ResInfo */
    }
    else
    {
        xres = pVBInfo->ModeResInfo[ resindex ].HTotal ;			  /* xres->ax */
        yres = pVBInfo->ModeResInfo[ resindex ].VTotal ;			  /* yres->bx */
        modeflag = pVBInfo->EModeIDTable[ ModeIdIndex].Ext_ModeFlag ; /* si+St_ModeFlag */
    }

    if ( !( modeflag & Charx8Dot ) )
    {
        xres /= 9;
        xres *= 8;
    }

    if ( ModeNo > 0x13 )
    {
        if ( ( ModeNo>0x13 ) && ( modeflag & HalfDCLK ) )
        {
          xres *=  2 ;
        }
        if ( ( ModeNo>0x13 ) && ( modeflag & DoubleScanMode ) )
        {
          yres *=  2 ;
        }
    }

    lvdstableindex = XGI_GetLVDSOEMTableIndex( pVBInfo );
    if ( xres > (pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHDE) )
	    return 0;

    if ( yres > (pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVDE) )
	    return 0;

    if ( ModeNo > 0x13 )
    {
      if ( ( xres != (pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHDE) ) ||
           ( yres != (pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVDE)) )
      {
          colordepth = XGI_GetColorDepth( ModeNo , ModeIdIndex, pVBInfo ) ;
	  if (colordepth > 2)
		  return 0;

      }
    }
    return 1;
}

void XGI_SetXG21FPBits(struct vb_device_info *pVBInfo)
{
    unsigned char temp;

    temp = XGINew_GetReg1( pVBInfo->P3d4  , 0x37 ) ;  /* D[0] 1: 18bit */
    temp = ( temp & 1 ) << 6;
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x06 , ~0x40 , temp ) ;      /* SR06[6] 18bit Dither */
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x09 , ~0xc0 , temp | 0x80 ) ;  /* SR09[7] enable FP output, SR09[6] 1: sigle 18bits, 0: dual 12bits */

}

void XGI_SetXG27FPBits(struct vb_device_info *pVBInfo)
{
    unsigned char temp;

    temp = XGINew_GetReg1( pVBInfo->P3d4  , 0x37 ) ;  /* D[1:0] 01: 18bit, 00: dual 12, 10: single 24 */
    temp = ( temp & 3 ) << 6;
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x06 , ~0xc0 , temp & 0x80 ) ;  /* SR06[7]0: dual 12/1: single 24 [6] 18bit Dither <= 0 h/w recommend */
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x09 , ~0xc0 , temp | 0x80 ) ;  /* SR09[7] enable FP output, SR09[6] 1: sigle 18bits, 0: 24bits */

}

void XGI_SetXG21LVDSPara(unsigned short ModeNo, unsigned short ModeIdIndex,
			 struct vb_device_info *pVBInfo)
{
    unsigned char temp, Miscdata;
    unsigned short xres ,
           yres ,
           modeflag ,
           resindex ,
           lvdstableindex ;
    unsigned short LVDSHT,LVDSHBS,LVDSHRS,LVDSHRE,LVDSHBE;
    unsigned short LVDSVT,LVDSVBS,LVDSVRS,LVDSVRE,LVDSVBE;
    unsigned short value;

    lvdstableindex = XGI_GetLVDSOEMTableIndex( pVBInfo );

    temp = (unsigned char) ((pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDS_Capability & (LCDPolarity << 8)) >> 8);
    temp &= LCDPolarity;
    Miscdata = (unsigned char) XGINew_GetReg2(pVBInfo->P3cc) ;

    XGINew_SetReg3( pVBInfo->P3c2 , (Miscdata & 0x3F) | temp ) ;

    temp = (unsigned char) (pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDS_Capability & LCDPolarity) ;
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x35 , ~0x80 , temp&0x80 ) ;      /* SR35[7] FP VSync polarity */
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x30 , ~0x20 , (temp&0x40)>>1 ) ;   /* SR30[5] FP HSync polarity */

    XGI_SetXG21FPBits(pVBInfo);
    resindex = XGI_GetResInfo( ModeNo , ModeIdIndex, pVBInfo ) ;
    if ( ModeNo <= 0x13 )
    {
        xres = pVBInfo->StResInfo[ resindex ].HTotal ;
        yres = pVBInfo->StResInfo[ resindex ].VTotal ;
        modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;    /* si+St_ResInfo */
    }
    else
    {
        xres = pVBInfo->ModeResInfo[ resindex ].HTotal ;			  /* xres->ax */
        yres = pVBInfo->ModeResInfo[ resindex ].VTotal ;			  /* yres->bx */
        modeflag = pVBInfo->EModeIDTable[ ModeIdIndex].Ext_ModeFlag ; /* si+St_ModeFlag */
    }

    if (!( modeflag & Charx8Dot ))
      xres = xres * 8 / 9;

    LVDSHT = pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHT;

    LVDSHBS = xres + ( pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHDE - xres ) / 2 ;
    if ( ( ModeNo<=0x13 ) && ( modeflag & HalfDCLK ) )
    {
      LVDSHBS -=  xres/4 ;
    }
    if (LVDSHBS > LVDSHT) LVDSHBS -= LVDSHT ;

    LVDSHRS = LVDSHBS + pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHFP ;
    if (LVDSHRS > LVDSHT) LVDSHRS -= LVDSHT ;

    LVDSHRE = LVDSHRS + pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHSYNC ;
    if (LVDSHRE > LVDSHT) LVDSHRE -= LVDSHT ;

    LVDSHBE = LVDSHBS + LVDSHT - pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHDE ;

    LVDSVT = pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVT;

    LVDSVBS = yres + ( pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVDE - yres ) / 2 ;
    if ( ( ModeNo>0x13 ) && ( modeflag & DoubleScanMode ) )
    {
      LVDSVBS +=  yres/2 ;
    }
    if (LVDSVBS > LVDSVT) LVDSVBS -= LVDSVT ;

    LVDSVRS = LVDSVBS + pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVFP ;
    if (LVDSVRS > LVDSVT) LVDSVRS -= LVDSVT ;

    LVDSVRE = LVDSVRS + pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVSYNC ;
    if (LVDSVRE > LVDSVT) LVDSVRE -= LVDSVT ;

    LVDSVBE = LVDSVBS + LVDSVT - pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVDE ;

    temp = (unsigned char)XGINew_GetReg1(pVBInfo->P3d4, 0x11) ;
    XGINew_SetReg1( pVBInfo->P3d4 , 0x11 , temp & 0x7f ) ;		/* Unlock CRTC */

    if (!( modeflag & Charx8Dot ))
    {
        XGINew_SetRegOR( pVBInfo->P3c4 , 0x1 , 0x1 ) ;
    }

    /* HT SR0B[1:0] CR00 */
    value = ( LVDSHT >> 3 ) - 5;
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0B , ~0x03 , ( value & 0x300 ) >> 8 ) ;
    XGINew_SetReg1( pVBInfo->P3d4 , 0x0 , (value & 0xFF) ) ;

    /* HBS SR0B[5:4] CR02 */
    value = ( LVDSHBS >> 3 ) - 1;
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0B , ~0x30 , ( value & 0x300 ) >> 4 ) ;
    XGINew_SetReg1( pVBInfo->P3d4 , 0x2 , (value & 0xFF) ) ;

    /* HBE SR0C[1:0] CR05[7] CR03[4:0] */
    value = ( LVDSHBE >> 3 ) - 1;
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0C , ~0x03 , ( value & 0xC0 ) >> 6 ) ;
    XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x05 , ~0x80 , ( value & 0x20 ) << 2 ) ;
    XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x03 , ~0x1F , value & 0x1F ) ;

    /* HRS SR0B[7:6] CR04 */
    value = ( LVDSHRS >> 3 ) + 2;
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0B , ~0xC0 , ( value & 0x300 ) >> 2 ) ;
    XGINew_SetReg1( pVBInfo->P3d4 , 0x4 , (value & 0xFF) ) ;

    /* Panel HRS SR2F[1:0] SR2E[7:0]  */
    value--;
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x2F , ~0x03 , ( value & 0x300 ) >> 8 ) ;
    XGINew_SetReg1( pVBInfo->P3c4 , 0x2E , (value & 0xFF) ) ;

    /* HRE SR0C[2] CR05[4:0] */
    value = ( LVDSHRE >> 3 ) + 2;
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0C , ~0x04 , ( value & 0x20 ) >> 3 ) ;
    XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x05 , ~0x1F , value & 0x1F ) ;

    /* Panel HRE SR2F[7:2]  */
    value--;
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x2F , ~0xFC , value << 2 ) ;

    /* VT SR0A[0] CR07[5][0] CR06 */
    value = LVDSVT - 2 ;
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0A , ~0x01 , ( value & 0x400 ) >> 10 ) ;
    XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x07 , ~0x20 , ( value & 0x200 ) >> 4 ) ;
    XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x07 , ~0x01 , ( value & 0x100 ) >> 8 ) ;
    XGINew_SetReg1( pVBInfo->P3d4 , 0x06 , (value & 0xFF) ) ;

    /* VBS SR0A[2] CR09[5] CR07[3] CR15 */
    value = LVDSVBS - 1 ;
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0A , ~0x04 , ( value & 0x400 ) >> 8 ) ;
    XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x09 , ~0x20 , ( value & 0x200 ) >> 4 ) ;
    XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x07 , ~0x08 , ( value & 0x100 ) >> 5 ) ;
    XGINew_SetReg1( pVBInfo->P3d4 , 0x15 , (value & 0xFF) ) ;

    /* VBE SR0A[4] CR16 */
    value = LVDSVBE - 1;
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0A , ~0x10 , ( value & 0x100 ) >> 4 ) ;
    XGINew_SetReg1( pVBInfo->P3d4 , 0x16 , (value & 0xFF) ) ;

    /* VRS SR0A[3] CR7[7][2] CR10 */
    value = LVDSVRS - 1 ;
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0A , ~0x08 , ( value & 0x400 ) >> 7 ) ;
    XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x07 , ~0x80 , ( value & 0x200 ) >> 2 ) ;
    XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x07 , ~0x04 , ( value & 0x100 ) >> 6 ) ;
    XGINew_SetReg1( pVBInfo->P3d4 , 0x10 , (value & 0xFF) ) ;

    /* Panel VRS SR3F[1:0] SR34[7:0] SR33[0] */
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x3F , ~0x03 , ( value & 0x600 ) >> 9 ) ;
    XGINew_SetReg1( pVBInfo->P3c4 , 0x34 , (value >> 1) & 0xFF ) ;
    XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x33 , ~0x01 , value & 0x01 ) ;

    /* VRE SR0A[5] CR11[3:0] */
    value = LVDSVRE - 1;
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0A , ~0x20 , ( value & 0x10 ) << 1 ) ;
    XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x11 , ~0x0F , value & 0x0F ) ;

    /* Panel VRE SR3F[7:2] */ /* SR3F[7] has to be 0, h/w bug */
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x3F , ~0xFC , ( value << 2 ) & 0x7C ) ;

    for ( temp=0, value = 0; temp < 3; temp++)
    {

        XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x31 , ~0x30 , value ) ;
        XGINew_SetReg1( pVBInfo->P3c4 , 0x2B , pVBInfo->XG21_LVDSCapList[lvdstableindex].VCLKData1) ;
        XGINew_SetReg1( pVBInfo->P3c4 , 0x2C , pVBInfo->XG21_LVDSCapList[lvdstableindex].VCLKData2) ;
        value += 0x10;
    }

    if (!( modeflag & Charx8Dot ))
    {
        XGINew_GetReg2( pVBInfo->P3da ) ;           /* reset 3da */
        XGINew_SetReg3( pVBInfo->P3c0 , 0x13 ) ;    /* set index */
        XGINew_SetReg3( pVBInfo->P3c0 , 0x00 ) ;    /* set data, panning = 0, shift left 1 dot*/

        XGINew_GetReg2( pVBInfo->P3da ) ;           /* Enable Attribute */
        XGINew_SetReg3( pVBInfo->P3c0 , 0x20 ) ;

        XGINew_GetReg2( pVBInfo->P3da ) ;           /* reset 3da */
    }


}

/* no shadow case */
void XGI_SetXG27LVDSPara(unsigned short ModeNo, unsigned short ModeIdIndex,
			 struct vb_device_info *pVBInfo)
{
    unsigned char temp, Miscdata;
    unsigned short xres ,
           yres ,
           modeflag ,
           resindex ,
           lvdstableindex ;
    unsigned short LVDSHT,LVDSHBS,LVDSHRS,LVDSHRE,LVDSHBE;
    unsigned short LVDSVT,LVDSVBS,LVDSVRS,LVDSVRE,LVDSVBE;
    unsigned short value;

    lvdstableindex = XGI_GetLVDSOEMTableIndex( pVBInfo );
    temp = (unsigned char) ((pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDS_Capability & (LCDPolarity << 8)) >> 8);
    temp &= LCDPolarity;
    Miscdata = (unsigned char) XGINew_GetReg2(pVBInfo->P3cc);

    XGINew_SetReg3( pVBInfo->P3c2 , (Miscdata & 0x3F) | temp ) ;

    temp = (unsigned char) (pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDS_Capability & LCDPolarity) ;
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x35 , ~0x80 , temp&0x80 ) ;      /* SR35[7] FP VSync polarity */
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x30 , ~0x20 , (temp&0x40)>>1 ) ;   /* SR30[5] FP HSync polarity */

    XGI_SetXG27FPBits(pVBInfo);
    resindex = XGI_GetResInfo( ModeNo , ModeIdIndex, pVBInfo ) ;
    if ( ModeNo <= 0x13 )
    {
        xres = pVBInfo->StResInfo[ resindex ].HTotal ;
        yres = pVBInfo->StResInfo[ resindex ].VTotal ;
        modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;    /* si+St_ResInfo */
    }
    else
    {
        xres = pVBInfo->ModeResInfo[ resindex ].HTotal ;			  /* xres->ax */
        yres = pVBInfo->ModeResInfo[ resindex ].VTotal ;			  /* yres->bx */
        modeflag = pVBInfo->EModeIDTable[ ModeIdIndex].Ext_ModeFlag ; /* si+St_ModeFlag */
    }

    if (!( modeflag & Charx8Dot ))
      xres = xres * 8 / 9;

    LVDSHT = pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHT;

    LVDSHBS = xres + ( pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHDE - xres ) / 2 ;
    if ( ( ModeNo<=0x13 ) && ( modeflag & HalfDCLK ) )
    {
      LVDSHBS -=  xres/4 ;
    }
    if (LVDSHBS > LVDSHT) LVDSHBS -= LVDSHT ;

    LVDSHRS = LVDSHBS + pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHFP ;
    if (LVDSHRS > LVDSHT) LVDSHRS -= LVDSHT ;

    LVDSHRE = LVDSHRS + pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHSYNC ;
    if (LVDSHRE > LVDSHT) LVDSHRE -= LVDSHT ;

    LVDSHBE = LVDSHBS + LVDSHT - pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHDE ;

    LVDSVT = pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVT;

    LVDSVBS = yres + ( pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVDE - yres ) / 2 ;
    if ( ( ModeNo>0x13 ) && ( modeflag & DoubleScanMode ) )
    {
      LVDSVBS +=  yres/2 ;
    }
    if (LVDSVBS > LVDSVT) LVDSVBS -= LVDSVT ;

    LVDSVRS = LVDSVBS + pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVFP ;
    if (LVDSVRS > LVDSVT) LVDSVRS -= LVDSVT ;

    LVDSVRE = LVDSVRS + pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVSYNC ;
    if (LVDSVRE > LVDSVT) LVDSVRE -= LVDSVT ;

    LVDSVBE = LVDSVBS + LVDSVT - pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVDE ;

    temp = (unsigned char)XGINew_GetReg1(pVBInfo->P3d4, 0x11) ;
    XGINew_SetReg1( pVBInfo->P3d4 , 0x11 , temp & 0x7f ) ;		/* Unlock CRTC */

    if (!( modeflag & Charx8Dot ))
    {
        XGINew_SetRegOR( pVBInfo->P3c4 , 0x1 , 0x1 ) ;
    }

    /* HT SR0B[1:0] CR00 */
    value = ( LVDSHT >> 3 ) - 5;
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0B , ~0x03 , ( value & 0x300 ) >> 8 ) ;
    XGINew_SetReg1( pVBInfo->P3d4 , 0x0 , (value & 0xFF) ) ;

    /* HBS SR0B[5:4] CR02 */
    value = ( LVDSHBS >> 3 ) - 1;
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0B , ~0x30 , ( value & 0x300 ) >> 4 ) ;
    XGINew_SetReg1( pVBInfo->P3d4 , 0x2 , (value & 0xFF) ) ;

    /* HBE SR0C[1:0] CR05[7] CR03[4:0] */
    value = ( LVDSHBE >> 3 ) - 1;
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0C , ~0x03 , ( value & 0xC0 ) >> 6 ) ;
    XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x05 , ~0x80 , ( value & 0x20 ) << 2 ) ;
    XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x03 , ~0x1F , value & 0x1F ) ;

    /* HRS SR0B[7:6] CR04 */
    value = ( LVDSHRS >> 3 ) + 2;
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0B , ~0xC0 , ( value & 0x300 ) >> 2 ) ;
    XGINew_SetReg1( pVBInfo->P3d4 , 0x4 , (value & 0xFF) ) ;

    /* Panel HRS SR2F[1:0] SR2E[7:0]  */
    value--;
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x2F , ~0x03 , ( value & 0x300 ) >> 8 ) ;
    XGINew_SetReg1( pVBInfo->P3c4 , 0x2E , (value & 0xFF) ) ;

    /* HRE SR0C[2] CR05[4:0] */
    value = ( LVDSHRE >> 3 ) + 2;
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0C , ~0x04 , ( value & 0x20 ) >> 3 ) ;
    XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x05 , ~0x1F , value & 0x1F ) ;

    /* Panel HRE SR2F[7:2]  */
    value--;
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x2F , ~0xFC , value << 2 ) ;

    /* VT SR0A[0] CR07[5][0] CR06 */
    value = LVDSVT - 2 ;
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0A , ~0x01 , ( value & 0x400 ) >> 10 ) ;
    XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x07 , ~0x20 , ( value & 0x200 ) >> 4 ) ;
    XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x07 , ~0x01 , ( value & 0x100 ) >> 8 ) ;
    XGINew_SetReg1( pVBInfo->P3d4 , 0x06 , (value & 0xFF) ) ;

    /* VBS SR0A[2] CR09[5] CR07[3] CR15 */
    value = LVDSVBS - 1 ;
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0A , ~0x04 , ( value & 0x400 ) >> 8 ) ;
    XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x09 , ~0x20 , ( value & 0x200 ) >> 4 ) ;
    XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x07 , ~0x08 , ( value & 0x100 ) >> 5 ) ;
    XGINew_SetReg1( pVBInfo->P3d4 , 0x15 , (value & 0xFF) ) ;

    /* VBE SR0A[4] CR16 */
    value = LVDSVBE - 1;
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0A , ~0x10 , ( value & 0x100 ) >> 4 ) ;
    XGINew_SetReg1( pVBInfo->P3d4 , 0x16 , (value & 0xFF) ) ;

    /* VRS SR0A[3] CR7[7][2] CR10 */
    value = LVDSVRS - 1 ;
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0A , ~0x08 , ( value & 0x400 ) >> 7 ) ;
    XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x07 , ~0x80 , ( value & 0x200 ) >> 2 ) ;
    XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x07 , ~0x04 , ( value & 0x100 ) >> 6 ) ;
    XGINew_SetReg1( pVBInfo->P3d4 , 0x10 , (value & 0xFF) ) ;

    /* Panel VRS SR35[2:0] SR34[7:0] */
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x35 , ~0x07 , ( value & 0x700 ) >> 8 ) ;
    XGINew_SetReg1( pVBInfo->P3c4 , 0x34 , value & 0xFF ) ;

    /* VRE SR0A[5] CR11[3:0] */
    value = LVDSVRE - 1;
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0A , ~0x20 , ( value & 0x10 ) << 1 ) ;
    XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x11 , ~0x0F , value & 0x0F ) ;

    /* Panel VRE SR3F[7:2] */
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x3F , ~0xFC , ( value << 2 ) & 0xFC ) ;

    for ( temp=0, value = 0; temp < 3; temp++)
    {

        XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x31 , ~0x30 , value ) ;
        XGINew_SetReg1( pVBInfo->P3c4 , 0x2B , pVBInfo->XG21_LVDSCapList[lvdstableindex].VCLKData1) ;
        XGINew_SetReg1( pVBInfo->P3c4 , 0x2C , pVBInfo->XG21_LVDSCapList[lvdstableindex].VCLKData2) ;
        value += 0x10;
    }

    if (!( modeflag & Charx8Dot ))
    {
        XGINew_GetReg2( pVBInfo->P3da ) ;           /* reset 3da */
        XGINew_SetReg3( pVBInfo->P3c0 , 0x13 ) ;    /* set index */
        XGINew_SetReg3( pVBInfo->P3c0 , 0x00 ) ;    /* set data, panning = 0, shift left 1 dot*/

        XGINew_GetReg2( pVBInfo->P3da ) ;           /* Enable Attribute */
        XGINew_SetReg3( pVBInfo->P3c0 , 0x20 ) ;

        XGINew_GetReg2( pVBInfo->P3da ) ;           /* reset 3da */
    }


}

/* --------------------------------------------------------------------- */
/* Function : XGI_IsLCDON */
/* Input : */
/* Output : 0 : Skip PSC Control */
/* 1: Disable PSC */
/* Description : */
/* --------------------------------------------------------------------- */
unsigned char XGI_IsLCDON(struct vb_device_info *pVBInfo)
{
    unsigned short tempax ;

    tempax = pVBInfo->VBInfo ;
    if ( tempax & SetCRT2ToDualEdge )
	    return 0;
    else if ( tempax & ( DisableCRT2Display | SwitchToCRT2 | SetSimuScanMode ) )
	    return 1;

    return 0;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_EnablePWD */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_EnablePWD(struct vb_device_info *pVBInfo)
{
    unsigned short index ,
           temp ;

    index = XGI_GetLCDCapPtr(pVBInfo) ;
    temp = pVBInfo->LCDCapList[ index ].PWD_2B ;
    XGINew_SetReg1( pVBInfo->Part4Port , 0x2B , temp ) ;
    XGINew_SetReg1( pVBInfo->Part4Port , 0x2C , pVBInfo->LCDCapList[ index ].PWD_2C ) ;
    XGINew_SetReg1( pVBInfo->Part4Port , 0x2D , pVBInfo->LCDCapList[ index ].PWD_2D ) ;
    XGINew_SetReg1( pVBInfo->Part4Port , 0x2E , pVBInfo->LCDCapList[ index ].PWD_2E ) ;
    XGINew_SetReg1( pVBInfo->Part4Port , 0x2F , pVBInfo->LCDCapList[ index ].PWD_2F ) ;
    XGINew_SetRegOR( pVBInfo->Part4Port , 0x27 , 0x80 ) ; 	/* enable PWD */
}


/* --------------------------------------------------------------------- */
/* Function : XGI_DisablePWD */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_DisablePWD(struct vb_device_info *pVBInfo)
{
    XGINew_SetRegAND( pVBInfo->Part4Port , 0x27 , 0x7F ) ;	/* disable PWD */
}


/* --------------------------------------------------------------------- */
/* Function : XGI_DisableChISLCD */
/* Input : */
/* Output : 0 -> Not LCD Mode */
/* Description : */
/* --------------------------------------------------------------------- */
unsigned char XGI_DisableChISLCD(struct vb_device_info *pVBInfo)
{
    unsigned short tempbx ,
           tempah ;

    tempbx = pVBInfo->SetFlag & ( DisableChA | DisableChB ) ;
    tempah = ~((unsigned short) XGINew_GetReg1(pVBInfo->Part1Port, 0x2E));

    if ( tempbx & ( EnableChA | DisableChA ) )
    {
        if ( !( tempah & 0x08 ) )		/* Chk LCDA Mode */
		return 0 ;
    }

    if ( !( tempbx & ( EnableChB | DisableChB ) ) )
	    return 0;

    if ( tempah & 0x01 )       /* Chk LCDB Mode */
	    return 1;

    return 0;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_EnableChISLCD */
/* Input : */
/* Output : 0 -> Not LCD mode */
/* Description : */
/* --------------------------------------------------------------------- */
unsigned char XGI_EnableChISLCD(struct vb_device_info *pVBInfo)
{
    unsigned short tempbx ,
           tempah ;


    tempbx = pVBInfo->SetFlag & ( EnableChA | EnableChB ) ;
    tempah = ~( (unsigned short)XGINew_GetReg1( pVBInfo->Part1Port , 0x2E ) ) ;

    if ( tempbx & ( EnableChA | DisableChA ) )
    {
        if ( !( tempah & 0x08 ) )		/* Chk LCDA Mode */
		return 0;
    }

    if ( !( tempbx & ( EnableChB | DisableChB ) ) )
	    return 0;

    if ( tempah & 0x01 )       /* Chk LCDB Mode */
	    return 1;

    return 0;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_GetLCDCapPtr */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
unsigned short XGI_GetLCDCapPtr(struct vb_device_info *pVBInfo)
{
    unsigned char tempal ,
          tempah ,
          tempbl ,
          i ;

    tempah = XGINew_GetReg1( pVBInfo->P3d4 , 0x36 ) ;
    tempal = tempah & 0x0F ;
    tempah = tempah & 0xF0 ;
    i = 0 ;
    tempbl =  pVBInfo->LCDCapList[ i ].LCD_ID ;

    while( tempbl != 0xFF )
    {
        if ( tempbl & 0x80 )   /* OEMUtil */
        {
            tempal = tempah ;
            tempbl = tempbl & ~( 0x80 ) ;
        }

        if ( tempal == tempbl )
            break ;

        i++ ;

        tempbl = pVBInfo->LCDCapList[ i ].LCD_ID ;
    }

    return i ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_GetLCDCapPtr1 */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
unsigned short XGI_GetLCDCapPtr1(struct vb_device_info *pVBInfo)
{
    unsigned short tempah ,
           tempal ,
           tempbl ,
           i ;

    tempal = pVBInfo->LCDResInfo ;
    tempah = pVBInfo->LCDTypeInfo ;

    i = 0 ;
    tempbl =  pVBInfo->LCDCapList[ i ].LCD_ID;

    while( tempbl != 0xFF )
    {
        if ( ( tempbl & 0x80 ) && ( tempbl != 0x80 ) )
        {
            tempal = tempah ;
            tempbl &= ~0x80 ;
        }

        if ( tempal == tempbl )
            break ;

        i++ ;
        tempbl = pVBInfo->LCDCapList[ i ].LCD_ID ;
    }

    if ( tempbl == 0xFF )
    {
        pVBInfo->LCDResInfo = Panel1024x768 ;
        pVBInfo->LCDTypeInfo = 0 ;
        i = 0 ;
    }

    return i ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_GetLCDSync */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_GetLCDSync(unsigned short *HSyncWidth , unsigned short *VSyncWidth,
		    struct vb_device_info *pVBInfo)
{
    unsigned short Index ;

    Index = XGI_GetLCDCapPtr(pVBInfo) ;
    *HSyncWidth = pVBInfo->LCDCapList[ Index ].LCD_HSyncWidth ;
    *VSyncWidth = pVBInfo->LCDCapList[ Index ].LCD_VSyncWidth ;

    return ;
}



/* --------------------------------------------------------------------- */
/* Function : XGI_EnableBridge */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_EnableBridge(struct xgi_hw_device_info *HwDeviceExtension, struct vb_device_info *pVBInfo)
{
    unsigned short tempbl ,
           tempah ;

    if ( pVBInfo->SetFlag == Win9xDOSMode )
    {
        if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
        {
            XGI_DisplayOn( HwDeviceExtension, pVBInfo) ;
            return ;
        }
        else  /* LVDS or CH7017 */
            return ;
    }


    if ( HwDeviceExtension->jChipType < XG40 )
    {
        if ( !XGI_DisableChISLCD(pVBInfo) )
        {
            if ( ( XGI_EnableChISLCD(pVBInfo) ) || ( pVBInfo->VBInfo & ( SetCRT2ToLCD | SetCRT2ToLCDA ) ) )
            {
                if ( pVBInfo->LCDInfo & SetPWDEnable )
                {
                    XGI_EnablePWD( pVBInfo);
                }
                else
                {
                    pVBInfo->LCDInfo &= ( ~SetPWDEnable ) ;
                    if ( pVBInfo->VBType & ( VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
                    {
                        tempbl = 0xFD ;
                        tempah = 0x02 ;
                    }
                    else
                    {
                        tempbl = 0xFB ;
                        tempah = 0x00 ;
                    }

                    XGI_SetPanelPower( tempah , tempbl, pVBInfo ) ;
                    XGI_SetPanelDelay( 1,pVBInfo ) ;
                }
            }
        }
    }	/* Not 340 */



    if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
    {
        if ( !( pVBInfo->SetFlag & DisableChA ) )
        {
            if ( pVBInfo->SetFlag & EnableChA )
            {
                XGINew_SetReg1( pVBInfo->Part1Port , 0x1E , 0x20 ) ;  /* Power on */
            }
            else
            {
                if ( pVBInfo->VBInfo & SetCRT2ToDualEdge ) /* SetCRT2ToLCDA ) */
                {
                    XGINew_SetReg1(pVBInfo->Part1Port,0x1E,0x20);  /* Power on */
                }
            }
        }

        if ( !( pVBInfo->SetFlag & DisableChB ) )
        {
            if ( ( pVBInfo->SetFlag & EnableChB ) || ( pVBInfo->VBInfo & ( SetCRT2ToLCD | SetCRT2ToTV | SetCRT2ToRAMDAC ) ) )
            {
		tempah = (unsigned char)XGINew_GetReg1(pVBInfo->P3c4, 0x32);
                tempah &= 0xDF;
                if ( pVBInfo->VBInfo & SetInSlaveMode )
                {
                    if ( !( pVBInfo->VBInfo & SetCRT2ToRAMDAC ) )
                        tempah |= 0x20 ;
                }
                XGINew_SetReg1( pVBInfo->P3c4 , 0x32 , tempah ) ;
                XGINew_SetRegOR( pVBInfo->P3c4 , 0x1E , 0x20 ) ;

		tempah = (unsigned char)XGINew_GetReg1(pVBInfo->Part1Port, 0x2E);

                if ( !( tempah & 0x80 ) )
                    XGINew_SetRegOR( pVBInfo->Part1Port , 0x2E , 0x80 ) ;   	/* BVBDOENABLE = 1 */

                XGINew_SetRegAND( pVBInfo->Part1Port , 0x00 , 0x7F ) ;     	/* BScreenOFF = 0 */
            }
        }

        if ( ( pVBInfo->SetFlag & ( EnableChA | EnableChB ) ) || ( !( pVBInfo->VBInfo & DisableCRT2Display ) ) )
        {
            XGINew_SetRegANDOR( pVBInfo->Part2Port , 0x00 , ~0xE0 , 0x20 ) ;   /* shampoo 0129 */
            if ( pVBInfo->VBType & ( VB_XGI302LV | VB_XGI301C ) )
            {
                if ( !XGI_DisableChISLCD(pVBInfo) )
                {
                    if ( XGI_EnableChISLCD( pVBInfo) || ( pVBInfo->VBInfo & ( SetCRT2ToLCD | SetCRT2ToLCDA ) ) )
                        XGINew_SetRegAND( pVBInfo->Part4Port ,0x2A , 0x7F ) ;  	/* LVDS PLL power on */
                }
                XGINew_SetRegAND( pVBInfo->Part4Port , 0x30 , 0x7F ) ;		/* LVDS Driver power on */
            }
        }

        tempah = 0x00 ;

        if ( !( pVBInfo->VBInfo & DisableCRT2Display ) )
        {
            tempah = 0xc0 ;

            if ( !( pVBInfo->VBInfo & SetSimuScanMode ) )
            {
                if ( pVBInfo->VBInfo & SetCRT2ToLCDA )
                {
                    if ( pVBInfo->VBInfo & SetCRT2ToDualEdge )
                    {
                        tempah = tempah & 0x40;
                        if ( pVBInfo->VBInfo & SetCRT2ToLCDA )
                            tempah = tempah ^ 0xC0 ;

                        if ( pVBInfo->SetFlag & DisableChB )
                            tempah &= 0xBF ;

                        if ( pVBInfo->SetFlag & DisableChA )
                            tempah &= 0x7F ;

                        if ( pVBInfo->SetFlag & EnableChB )
                            tempah |= 0x40 ;

                        if ( pVBInfo->SetFlag & EnableChA )
                            tempah |= 0x80 ;
                    }
                }
            }
        }

        XGINew_SetRegOR( pVBInfo->Part4Port , 0x1F , tempah ) ;          /* EnablePart4_1F */

        if ( pVBInfo->SetFlag & Win9xDOSMode )
        {
            XGI_DisplayOn( HwDeviceExtension, pVBInfo) ;
            return ;
        }

        if ( !( pVBInfo->SetFlag & DisableChA ) )
        {
            XGI_VBLongWait( pVBInfo) ;
            if ( !( pVBInfo->SetFlag & GatingCRT ) )
            {
                XGI_DisableGatingCRT( HwDeviceExtension, pVBInfo ) ;
                XGI_DisplayOn( HwDeviceExtension, pVBInfo) ;
                XGI_VBLongWait( pVBInfo) ;
            }
        }
    }	/* 301 */
    else 	/* LVDS */
    {
        if ( pVBInfo->VBInfo & ( SetCRT2ToTV | SetCRT2ToLCD | SetCRT2ToLCDA ) )
            XGINew_SetRegOR( pVBInfo->Part1Port , 0x1E , 0x20 ) ;      	/* enable CRT2 */



	tempah = (unsigned char)XGINew_GetReg1(pVBInfo->Part1Port, 0x2E);
        if ( !( tempah & 0x80 ) )
            XGINew_SetRegOR( pVBInfo->Part1Port , 0x2E , 0x80 ) ;	/* BVBDOENABLE = 1 */

        XGINew_SetRegAND(pVBInfo->Part1Port,0x00,0x7F);
        XGI_DisplayOn( HwDeviceExtension, pVBInfo);
    } /* End of VB */


    if ( HwDeviceExtension->jChipType < XG40 )
    {
        if ( !XGI_EnableChISLCD(pVBInfo) )
        {
            if ( pVBInfo->VBInfo & ( SetCRT2ToLCD | SetCRT2ToLCDA ) )
            {
                if ( XGI_BacklightByDrv(pVBInfo) )
                    return ;
            }
            else
                return ;
        }

        if ( pVBInfo->LCDInfo & SetPWDEnable )
        {
            XGI_FirePWDEnable(pVBInfo) ;
            return ;
        }

        XGI_SetPanelDelay( 2,pVBInfo ) ;

        if ( pVBInfo->VBType & ( VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
        {
            tempah = 0x01 ;
            tempbl = 0xFE ;		/* turn on backlght */
        }
        else
        {
            tempbl = 0xF7 ;
            tempah = 0x00 ;
        }
        XGI_SetPanelPower( tempah , tempbl , pVBInfo) ;
    }
}


/* --------------------------------------------------------------------- */
/* Function : XGI_DisableBridge */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_DisableBridge(struct xgi_hw_device_info *HwDeviceExtension, struct vb_device_info *pVBInfo)
{
    unsigned short tempax ,
           tempbx ,
           tempah = 0 ,
           tempbl = 0 ;

    if ( pVBInfo->SetFlag == Win9xDOSMode )
        return ;


    if ( HwDeviceExtension->jChipType < XG40 )
    {
        if ( ( !( pVBInfo->VBInfo & ( SetCRT2ToLCD | SetCRT2ToLCDA ) ) ) || ( XGI_DisableChISLCD(pVBInfo) ) )
        {
            if ( !XGI_IsLCDON(pVBInfo) )
            {
                if ( pVBInfo->LCDInfo & SetPWDEnable )
                    XGI_EnablePWD( pVBInfo) ;
                else
                {
                    pVBInfo->LCDInfo &= ~SetPWDEnable ;
                    XGI_DisablePWD(pVBInfo) ;
                    if ( pVBInfo->VBType & ( VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
                    {
                        tempbx = 0xFE ;  /* not 01h */
                        tempax = 0 ;
                    }
                    else
                    {
                        tempbx = 0xF7 ;  /* not 08h */
                        tempax = 0x08 ;
                    }
                    XGI_SetPanelPower( tempax , tempbx , pVBInfo) ;
                    XGI_SetPanelDelay( 3,pVBInfo ) ;
                }
            }	/* end if(!XGI_IsLCDON(pVBInfo)) */
        }
    }

/*  if ( CH7017 )
    {
        if ( !( pVBInfo->VBInfo & ( SetCRT2ToLCD | SetCRT2toLCDA ) ) || ( XGI_DisableChISLCD(pVBInfo) ) )
        {
            if ( !XGI_IsLCDON(pVBInfo) )
            {
                if ( DISCHARGE )
                {
                    tempbx = XGINew_GetCH7005( 0x61 ) ;
                    if ( tempbx < 0x01 )   //first time we power up
                        XGINew_SetCH7005( 0x0066 ) ;	//and disable power sequence
                    else
                        XGINew_SetCH7005( 0x5f66 ) ; //leave VDD on - disable power
                }
            }
        }
    }        */

    if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B| VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
    {
        tempah = 0x3F ;
        if ( !( pVBInfo->VBInfo & ( DisableCRT2Display | SetSimuScanMode ) ) )
        {
            if ( pVBInfo->VBInfo & SetCRT2ToLCDA )
            {
                if ( pVBInfo->VBInfo & SetCRT2ToDualEdge )
                {
                    tempah = 0x7F;			/* Disable Channel A */
                    if ( !( pVBInfo->VBInfo & SetCRT2ToLCDA ) )
                        tempah = 0xBF ;		/* Disable Channel B */

                    if ( pVBInfo->SetFlag & DisableChB )
                        tempah &= 0xBF ;		/* force to disable Cahnnel */

                    if ( pVBInfo->SetFlag & DisableChA )
                        tempah &= 0x7F ;		/* Force to disable Channel B */
                }
            }
        }

        XGINew_SetRegAND( pVBInfo->Part4Port , 0x1F , tempah ) ;   /* disable part4_1f */

        if ( pVBInfo->VBType & ( VB_XGI302LV | VB_XGI301C ) )
        {
            if ( ( ( pVBInfo->VBInfo & ( SetCRT2ToLCD | SetCRT2ToLCDA ) ) ) || ( XGI_DisableChISLCD(pVBInfo) ) || ( XGI_IsLCDON(pVBInfo) ) )
                XGINew_SetRegOR( pVBInfo->Part4Port , 0x30 , 0x80 ) ;  /* LVDS Driver power down */
        }

        if ( ( pVBInfo->SetFlag & DisableChA ) || ( pVBInfo->VBInfo & ( DisableCRT2Display | SetCRT2ToLCDA | SetSimuScanMode ) ) )
        {
            if ( pVBInfo->SetFlag & GatingCRT )
                XGI_EnableGatingCRT( HwDeviceExtension, pVBInfo ) ;
            XGI_DisplayOff( HwDeviceExtension, pVBInfo) ;
        }

        if ( pVBInfo->VBInfo & SetCRT2ToLCDA )
        {
            if ( ( pVBInfo->SetFlag & DisableChA ) || ( pVBInfo->VBInfo & SetCRT2ToLCDA ) )
                XGINew_SetRegAND( pVBInfo->Part1Port , 0x1e , 0xdf ) ; 	/* Power down */
        }

        XGINew_SetRegAND( pVBInfo->P3c4 , 0x32 , 0xdf ) ; 		/* disable TV as primary VGA swap */

        if ( ( pVBInfo->VBInfo & ( SetSimuScanMode | SetCRT2ToDualEdge  ) ) )
            XGINew_SetRegAND(pVBInfo->Part2Port,0x00,0xdf);

        if ( ( pVBInfo->SetFlag & DisableChB ) || ( pVBInfo->VBInfo & ( DisableCRT2Display | SetSimuScanMode ) )
        || ( ( !( pVBInfo->VBInfo & SetCRT2ToLCDA ) ) && ( pVBInfo->VBInfo & ( SetCRT2ToRAMDAC | SetCRT2ToLCD | SetCRT2ToTV ) ) ) )
            XGINew_SetRegOR( pVBInfo->Part1Port , 0x00 , 0x80 ) ; 	/* BScreenOff=1 */

        if ( ( pVBInfo->SetFlag & DisableChB ) || ( pVBInfo->VBInfo & ( DisableCRT2Display | SetSimuScanMode ) )
        || ( !( pVBInfo->VBInfo & SetCRT2ToLCDA ) ) || ( pVBInfo->VBInfo & ( SetCRT2ToRAMDAC | SetCRT2ToLCD | SetCRT2ToTV ) ) )
        {
            tempah= XGINew_GetReg1( pVBInfo->Part1Port , 0x00 ) ;   	/* save Part1 index 0 */
            XGINew_SetRegOR( pVBInfo->Part1Port , 0x00 , 0x10 ) ; 	/* BTDAC = 1, avoid VB reset */
            XGINew_SetRegAND( pVBInfo->Part1Port , 0x1E , 0xDF ) ;	/* disable CRT2 */
            XGINew_SetReg1( pVBInfo->Part1Port , 0x00 , tempah ) ;	/* restore Part1 index 0 */
        }
    }
    else /* {301} */
    {
        if ( pVBInfo->VBInfo & ( SetCRT2ToLCD | SetCRT2ToTV ) )
        {
            XGINew_SetRegOR( pVBInfo->Part1Port , 0x00 , 0x80 ) ; 	/* BScreenOff=1 */
            XGINew_SetRegAND( pVBInfo->Part1Port , 0x1E , 0xDF ) ;	/* Disable CRT2 */
            XGINew_SetRegAND( pVBInfo->P3c4 , 0x32 , 0xDF ) ;	/* Disable TV asPrimary VGA swap */
        }

        if ( pVBInfo->VBInfo & ( DisableCRT2Display | SetCRT2ToLCDA | SetSimuScanMode ) )
            XGI_DisplayOff( HwDeviceExtension, pVBInfo) ;
    }




    if ( HwDeviceExtension->jChipType < XG40 )
    {
        if ( !( pVBInfo->VBInfo & ( SetCRT2ToLCD | SetCRT2ToLCDA ) ) || ( XGI_DisableChISLCD(pVBInfo) ) || ( XGI_IsLCDON(pVBInfo) ) )
        {
            if ( pVBInfo->LCDInfo & SetPWDEnable )
            {
                if ( pVBInfo->LCDInfo & SetPWDEnable )
                    XGI_BacklightByDrv(pVBInfo) ;
                else
                {
                    XGI_SetPanelDelay( 4 ,pVBInfo) ;
                    if ( pVBInfo->VBType & VB_XGI301LV )
                    {
                        tempbl = 0xFD ;
                        tempah = 0x00 ;
                    }
                    else
                    {
                        tempbl = 0xFB ;
                        tempah = 0x04 ;
                    }
                }
            }
            XGI_SetPanelPower( tempah , tempbl , pVBInfo) ;
        }
    }
}


/* --------------------------------------------------------------------- */
/* Function : XGI_GetTVPtrIndex */
/* Input : */
/* Output : */
/* Description : bx 0 : ExtNTSC */
/* 1 : StNTSC */
/* 2 : ExtPAL */
/* 3 : StPAL */
/* 4 : ExtHiTV */
/* 5 : StHiTV */
/* 6 : Ext525i */
/* 7 : St525i */
/* 8 : Ext525p */
/* 9 : St525p */
/* A : Ext750p */
/* B : St750p */
/* --------------------------------------------------------------------- */
unsigned short XGI_GetTVPtrIndex(struct vb_device_info *pVBInfo)
{
    unsigned short tempbx = 0 ;

    if ( pVBInfo->TVInfo & SetPALTV )
        tempbx = 2 ;
    if ( pVBInfo->TVInfo & SetYPbPrMode1080i )
        tempbx = 4 ;
    if ( pVBInfo->TVInfo & SetYPbPrMode525i )
        tempbx = 6 ;
    if ( pVBInfo->TVInfo & SetYPbPrMode525p )
        tempbx = 8 ;
    if ( pVBInfo->TVInfo & SetYPbPrMode750p )
        tempbx = 10 ;
    if ( pVBInfo->TVInfo & TVSimuMode )
        tempbx++ ;

    return tempbx ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_OEM310Setting */
/* Input : */
/* Output : */
/* Description : Customized Param. for 301 */
/* --------------------------------------------------------------------- */
void XGI_OEM310Setting(unsigned short ModeNo, unsigned short ModeIdIndex, struct vb_device_info *pVBInfo)
{
    if ( pVBInfo->SetFlag & Win9xDOSMode )
        return ;

    /* GetPart1IO(); */
    XGI_SetDelayComp(pVBInfo) ;

    if ( pVBInfo->VBInfo & ( SetCRT2ToLCD | SetCRT2ToLCDA ) )
        XGI_SetLCDCap(pVBInfo) ;

    if ( pVBInfo->VBInfo & SetCRT2ToTV )
    {
        /* GetPart2IO() */
        XGI_SetPhaseIncr(pVBInfo) ;
        XGI_SetYFilter( ModeNo , ModeIdIndex,pVBInfo ) ;
        XGI_SetAntiFlicker( ModeNo , ModeIdIndex,pVBInfo ) ;

        if ( pVBInfo->VBType&VB_XGI301)
            XGI_SetEdgeEnhance( ModeNo , ModeIdIndex ,pVBInfo) ;
    }
}


/* --------------------------------------------------------------------- */
/* Function : XGI_SetDelayComp */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_SetDelayComp(struct vb_device_info *pVBInfo)
{
    unsigned short index ;

    unsigned char  tempah ,
           tempbl ,
           tempbh ;

    if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
    {
        if ( pVBInfo->VBInfo & ( SetCRT2ToLCD | SetCRT2ToLCDA | SetCRT2ToTV | SetCRT2ToRAMDAC ) )
        {
            tempbl = 0;
            tempbh = 0;

            index = XGI_GetTVPtrIndex(pVBInfo ) ;           /* Get TV Delay */
            tempbl = pVBInfo->XGI_TVDelayList[ index ] ;

            if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
                tempbl = pVBInfo->XGI_TVDelayList2[ index ] ;

            if ( pVBInfo->VBInfo & SetCRT2ToDualEdge )
                tempbl = tempbl >> 4 ;
/*
            if ( pVBInfo->VBInfo & SetCRT2ToRAMDAC )
                tempbl = CRT2Delay1 ;			// Get CRT2 Delay

            if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
                tempbl = CRT2Delay2 ;
*/
            if ( pVBInfo->VBInfo & ( SetCRT2ToLCD | SetCRT2ToLCDA ) )
            {
                index = XGI_GetLCDCapPtr(pVBInfo) ; 		/* Get LCD Delay */
                tempbh=pVBInfo->LCDCapList[ index ].LCD_DelayCompensation ;

                if ( !( pVBInfo->VBInfo & SetCRT2ToLCDA ) )
                     tempbl = tempbh ;
            }

            tempbl  &= 0x0F ;
            tempbh  &= 0xF0 ;
            tempah = XGINew_GetReg1( pVBInfo->Part1Port , 0x2D ) ;

            if ( pVBInfo->VBInfo & ( SetCRT2ToRAMDAC | SetCRT2ToLCD | SetCRT2ToTV ) )  /* Channel B */
            {
                tempah &= 0xF0 ;
                tempah |= tempbl ;
            }

            if ( pVBInfo->VBInfo & SetCRT2ToLCDA )		/* Channel A */
            {
                tempah &= 0x0F ;
                tempah |= tempbh ;
            }
            XGINew_SetReg1(pVBInfo->Part1Port,0x2D,tempah);
        }
    }
    else if ( pVBInfo->IF_DEF_LVDS == 1 )
    {
        tempbl = 0;
        tempbh = 0;
        if ( pVBInfo->VBInfo & SetCRT2ToLCD )
        {
            tempah = pVBInfo->LCDCapList[ XGI_GetLCDCapPtr(pVBInfo) ].LCD_DelayCompensation ;		/* / Get LCD Delay */
            tempah &= 0x0f ;
            tempah = tempah << 4 ;
            XGINew_SetRegANDOR( pVBInfo->Part1Port , 0x2D , 0x0f , tempah ) ;
        }
    }
}


/* --------------------------------------------------------------------- */
/* Function : XGI_SetLCDCap */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_SetLCDCap(struct vb_device_info *pVBInfo)
{
    unsigned short tempcx ;

    tempcx = pVBInfo->LCDCapList[ XGI_GetLCDCapPtr(pVBInfo) ].LCD_Capability ;

    if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
    {
        if ( pVBInfo->VBType & ( VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
        {        				/* 301LV/302LV only */
            /* Set 301LV Capability */
		XGINew_SetReg1(pVBInfo->Part4Port, 0x24, (unsigned char)(tempcx & 0x1F));
	}
        /* VB Driving */
	XGINew_SetRegANDOR(pVBInfo->Part4Port, 0x0D,
			   ~((EnableVBCLKDRVLOW | EnablePLLSPLOW) >> 8),
			   (unsigned short)((tempcx & (EnableVBCLKDRVLOW | EnablePLLSPLOW)) >> 8));
    }

    if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
    {
        if ( pVBInfo->VBInfo & SetCRT2ToLCD )
            XGI_SetLCDCap_B( tempcx,pVBInfo ) ;
        else if ( pVBInfo->VBInfo & SetCRT2ToLCDA )
            XGI_SetLCDCap_A( tempcx,pVBInfo ) ;

        if ( pVBInfo->VBType & ( VB_XGI302LV | VB_XGI301C ) )
        {
            if ( tempcx & EnableSpectrum )
                SetSpectrum( pVBInfo) ;
        }
    }
    else      /* LVDS,CH7017 */
        XGI_SetLCDCap_A( tempcx, pVBInfo ) ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_SetLCDCap_A */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_SetLCDCap_A(unsigned short tempcx, struct vb_device_info *pVBInfo)
{
    unsigned short temp ;

    temp = XGINew_GetReg1( pVBInfo->P3d4 , 0x37 ) ;

    if ( temp & LCDRGB18Bit )
    {
	XGINew_SetRegANDOR(pVBInfo->Part1Port, 0x19, 0x0F,
			   (unsigned short)(0x20 | (tempcx & 0x00C0))); /* Enable Dither */
        XGINew_SetRegANDOR( pVBInfo->Part1Port , 0x1A , 0x7F , 0x80 ) ;
    }
    else
    {
	XGINew_SetRegANDOR(pVBInfo->Part1Port, 0x19, 0x0F,
			   (unsigned short)(0x30 | (tempcx & 0x00C0)));
        XGINew_SetRegANDOR( pVBInfo->Part1Port , 0x1A , 0x7F , 0x00 ) ;
    }

/*
    if ( tempcx & EnableLCD24bpp )	// 24bits
    {
	XGINew_SetRegANDOR(pVBInfo->Part1Port,0x19, 0x0F,(unsigned short)(0x30|(tempcx&0x00C0)) );
        XGINew_SetRegANDOR(pVBInfo->Part1Port,0x1A,0x7F,0x00);
    }
    else
    {
	XGINew_SetRegANDOR(pVBInfo->Part1Port,0x19, 0x0F,(unsigned short)(0x20|(tempcx&0x00C0)) ); // Enable Dither
        XGINew_SetRegANDOR(pVBInfo->Part1Port,0x1A,0x7F,0x80);
    }
*/
}


/* --------------------------------------------------------------------- */
/* Function : XGI_SetLCDCap_B */
/* Input : cx -> LCD Capability */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_SetLCDCap_B(unsigned short tempcx, struct vb_device_info *pVBInfo)
{
    if ( tempcx & EnableLCD24bpp )	/* 24bits */
	    XGINew_SetRegANDOR(pVBInfo->Part2Port, 0x1A, 0xE0,
			       (unsigned short)(((tempcx & 0x00ff) >> 6) | 0x0c));
    else
	    XGINew_SetRegANDOR(pVBInfo->Part2Port, 0x1A, 0xE0,
			       (unsigned short)(((tempcx & 0x00ff) >> 6) | 0x18)); /* Enable Dither */
}


/* --------------------------------------------------------------------- */
/* Function : SetSpectrum */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void SetSpectrum(struct vb_device_info *pVBInfo)
{
    unsigned short index ;

    index = XGI_GetLCDCapPtr(pVBInfo) ;

    XGINew_SetRegAND( pVBInfo->Part4Port , 0x30 , 0x8F ) ;   /* disable down spectrum D[4] */
    XGI_LongWait(pVBInfo) ;
    XGINew_SetRegOR( pVBInfo->Part4Port , 0x30 , 0x20 ) ;	 /* reset spectrum */
    XGI_LongWait(pVBInfo) ;

    XGINew_SetReg1( pVBInfo->Part4Port , 0x31 , pVBInfo->LCDCapList[ index ].Spectrum_31 ) ;
    XGINew_SetReg1( pVBInfo->Part4Port , 0x32 , pVBInfo->LCDCapList[ index ].Spectrum_32 ) ;
    XGINew_SetReg1( pVBInfo->Part4Port , 0x33 , pVBInfo->LCDCapList[ index ].Spectrum_33 ) ;
    XGINew_SetReg1( pVBInfo->Part4Port , 0x34 , pVBInfo->LCDCapList[ index ].Spectrum_34 ) ;
    XGI_LongWait(pVBInfo) ;
    XGINew_SetRegOR( pVBInfo->Part4Port , 0x30 , 0x40 ) ; /* enable spectrum */
}


/* --------------------------------------------------------------------- */
/* Function : XGI_SetAntiFlicker */
/* Input : */
/* Output : */
/* Description : Set TV Customized Param. */
/* --------------------------------------------------------------------- */
void XGI_SetAntiFlicker(unsigned short ModeNo, unsigned short ModeIdIndex,
			struct vb_device_info *pVBInfo)
{
    unsigned short tempbx ,
           index ;

    unsigned char tempah ;

    if (pVBInfo->TVInfo & ( SetYPbPrMode525p | SetYPbPrMode750p ) )
        return ;

    tempbx = XGI_GetTVPtrIndex(pVBInfo ) ;
    tempbx &= 0xFE ;

    if ( ModeNo <= 0x13 )
    {
        index = pVBInfo->SModeIDTable[ ModeIdIndex ].VB_StTVFlickerIndex ;
    }
    else
    {
        index = pVBInfo->EModeIDTable[ ModeIdIndex ].VB_ExtTVFlickerIndex ;
    }

    tempbx += index ;
    tempah = TVAntiFlickList[ tempbx ] ;
    tempah = tempah << 4 ;

    XGINew_SetRegANDOR( pVBInfo->Part2Port , 0x0A , 0x8F , tempah ) ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_SetEdgeEnhance */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_SetEdgeEnhance(unsigned short ModeNo, unsigned short ModeIdIndex, struct vb_device_info *pVBInfo)
{
    unsigned short tempbx ,
           index ;

    unsigned char tempah ;


    tempbx = XGI_GetTVPtrIndex(pVBInfo ) ;
    tempbx &= 0xFE ;

    if ( ModeNo <= 0x13 )
    {
        index = pVBInfo->SModeIDTable[ ModeIdIndex ].VB_StTVEdgeIndex ;
    }
    else
    {
        index = pVBInfo->EModeIDTable[ ModeIdIndex ].VB_ExtTVEdgeIndex ;
    }

    tempbx += index ;
    tempah = TVEdgeList[ tempbx ] ;
    tempah = tempah << 5 ;

    XGINew_SetRegANDOR( pVBInfo->Part2Port , 0x3A , 0x1F , tempah ) ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_SetPhaseIncr */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_SetPhaseIncr(struct vb_device_info *pVBInfo)
{
    unsigned short tempbx ;

    unsigned char tempcl ,
          tempch ;

    unsigned long tempData ;

    XGI_GetTVPtrIndex2( &tempbx , &tempcl , &tempch, pVBInfo ) ; /* bx, cl, ch */
    tempData = TVPhaseList[ tempbx ] ;

    XGINew_SetReg1(pVBInfo->Part2Port, 0x31,
		   (unsigned short)(tempData & 0x000000FF));
    XGINew_SetReg1(pVBInfo->Part2Port, 0x32,
		   (unsigned short)((tempData & 0x0000FF00) >> 8));
    XGINew_SetReg1(pVBInfo->Part2Port, 0x33,
		   (unsigned short)((tempData & 0x00FF0000) >> 16));
    XGINew_SetReg1(pVBInfo->Part2Port, 0x34,
		   (unsigned short)((tempData & 0xFF000000) >> 24));
}


/* --------------------------------------------------------------------- */
/* Function : XGI_SetYFilter */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_SetYFilter(unsigned short ModeNo, unsigned short ModeIdIndex,
		    struct vb_device_info *pVBInfo)
{
    unsigned short tempbx ,
           index ;

    unsigned char tempcl ,
          tempch ,
          tempal ,
          *filterPtr ;

    XGI_GetTVPtrIndex2( &tempbx , &tempcl , &tempch, pVBInfo ) ; /* bx, cl, ch */

    switch( tempbx )
    {
        case 0x00:
        case 0x04:
            filterPtr = NTSCYFilter1 ;
            break ;

        case 0x01:
            filterPtr = PALYFilter1 ;
            break ;

        case 0x02:
        case 0x05:
        case 0x0D:
            filterPtr = PALMYFilter1 ;
            break ;

        case 0x03:
            filterPtr = PALNYFilter1 ;
            break ;

        case 0x08:
        case 0x0C:
            filterPtr = NTSCYFilter2 ;
            break ;

        case 0x0A:
            filterPtr = PALMYFilter2 ;
            break ;

        case 0x0B:
            filterPtr = PALNYFilter2 ;
            break ;

        case 0x09:
            filterPtr = PALYFilter2 ;
            break ;

        default:
            return ;
    }

    if ( ModeNo <= 0x13 )
        tempal = pVBInfo->SModeIDTable[ ModeIdIndex ].VB_StTVYFilterIndex ;
    else
        tempal = pVBInfo->EModeIDTable[ ModeIdIndex ].VB_ExtTVYFilterIndex ;

    if ( tempcl == 0 )
        index = tempal * 4;
    else
        index = tempal * 7;

    if ( ( tempcl == 0 ) && ( tempch == 1 ) )
    {
        XGINew_SetReg1( pVBInfo->Part2Port , 0x35 , 0 ) ;
        XGINew_SetReg1( pVBInfo->Part2Port , 0x36 , 0 ) ;
        XGINew_SetReg1( pVBInfo->Part2Port , 0x37 , 0 ) ;
        XGINew_SetReg1( pVBInfo->Part2Port , 0x38 , filterPtr[ index++ ] ) ;
    }
    else
    {
        XGINew_SetReg1( pVBInfo->Part2Port , 0x35 , filterPtr[ index++ ] ) ;
        XGINew_SetReg1( pVBInfo->Part2Port , 0x36 , filterPtr[ index++ ] ) ;
        XGINew_SetReg1( pVBInfo->Part2Port , 0x37 , filterPtr[ index++ ] ) ;
        XGINew_SetReg1( pVBInfo->Part2Port , 0x38 , filterPtr[ index++ ] ) ;
    }

    if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
    {
        XGINew_SetReg1( pVBInfo->Part2Port , 0x48 , filterPtr[ index++ ] ) ;
        XGINew_SetReg1( pVBInfo->Part2Port , 0x49 , filterPtr[ index++ ] ) ;
        XGINew_SetReg1( pVBInfo->Part2Port , 0x4A , filterPtr[ index++ ] ) ;
    }
}


/* --------------------------------------------------------------------- */
/* Function : XGI_GetTVPtrIndex2 */
/* Input : */
/* Output : bx 0 : NTSC */
/* 1 : PAL */
/* 2 : PALM */
/* 3 : PALN */
/* 4 : NTSC1024x768 */
/* 5 : PAL-M 1024x768 */
/* 6-7: reserved */
/* cl 0 : YFilter1 */
/* 1 : YFilter2 */
/* ch 0 : 301A */
/* 1 : 301B/302B/301LV/302LV */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_GetTVPtrIndex2(unsigned short *tempbx, unsigned char *tempcl,
			unsigned char *tempch, struct vb_device_info *pVBInfo)
{
    *tempbx = 0 ;
    *tempcl = 0 ;
    *tempch = 0 ;

    if ( pVBInfo->TVInfo & SetPALTV )
        *tempbx = 1 ;

    if ( pVBInfo->TVInfo & SetPALMTV )
        *tempbx = 2 ;

    if ( pVBInfo->TVInfo & SetPALNTV )
        *tempbx = 3 ;

    if ( pVBInfo->TVInfo & NTSC1024x768 )
    {
        *tempbx = 4 ;
        if ( pVBInfo->TVInfo & SetPALMTV )
            *tempbx = 5 ;
    }

    if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
    {
        if ( ( !( pVBInfo->VBInfo & SetInSlaveMode ) ) || ( pVBInfo->TVInfo & TVSimuMode ) )
        {
            *tempbx += 8 ;
            *tempcl += 1 ;
        }
    }

    if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
        (*tempch)++ ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_SetCRT2ModeRegs */
/* Input : */
/* Output : */
/* Description : Origin code for crt2group */
/* --------------------------------------------------------------------- */
void XGI_SetCRT2ModeRegs(unsigned short ModeNo,
			 struct xgi_hw_device_info *HwDeviceExtension,
			 struct vb_device_info *pVBInfo)
{
    unsigned short tempbl ;
    short  tempcl ;

    unsigned char  tempah ;

    /* XGINew_SetReg1( pVBInfo->Part1Port , 0x03 , 0x00 ) ; // fix write part1 index 0 BTDRAM bit Bug */
    tempah=0;
    if ( !( pVBInfo->VBInfo & DisableCRT2Display ) )
    {
        tempah=XGINew_GetReg1( pVBInfo->Part1Port , 0x00 ) ;
        tempah &= ~0x10 ;	/* BTRAMDAC */
        tempah |=  0x40 ;	/* BTRAM */

        if ( pVBInfo->VBInfo & ( SetCRT2ToRAMDAC | SetCRT2ToTV | SetCRT2ToLCD ) )
        {
            tempah=0x40;	/* BTDRAM */
            if ( ModeNo > 0x13 )
            {
                tempcl = pVBInfo->ModeType ;
                tempcl -= ModeVGA ;
                if ( tempcl >= 0 )
                {
                    tempah = ( 0x008 >> tempcl ) ;	/* BT Color */
                    if ( tempah == 0 )
                        tempah = 1 ;
                    tempah |= 0x040 ;
                }
            }
            if ( pVBInfo->VBInfo & SetInSlaveMode )
                tempah ^= 0x50 ;	/* BTDAC */
        }
    }

/*	0210 shampoo
    if ( pVBInfo->VBInfo & DisableCRT2Display )
    {
        tempah = 0 ;
    }

    XGINew_SetReg1( pVBInfo->Part1Port , 0x00 , tempah ) ;
    if ( pVBInfo->VBInfo & ( SetCRT2ToRAMDAC | SetCRT2ToTV | SetCRT2ToLCD ) )
    {
        tempcl = pVBInfo->ModeType ;
        if ( ModeNo > 0x13 )
        {
            tempcl -= ModeVGA ;
            if ( ( tempcl > 0 ) || ( tempcl == 0 ) )
            {
                tempah=(0x008>>tempcl) ;
                if ( tempah == 0 )
                    tempah = 1 ;
                tempah |= 0x040;
            }
        }
        else
        {
            tempah = 0x040 ;
        }

        if ( pVBInfo->VBInfo & SetInSlaveMode )
        {
            tempah = ( tempah ^ 0x050 ) ;
        }
    }
*/

    XGINew_SetReg1( pVBInfo->Part1Port , 0x00 , tempah ) ;
    tempah = 0x08 ;
    tempbl = 0xf0 ;

    if ( pVBInfo->VBInfo & DisableCRT2Display )
        XGINew_SetRegANDOR( pVBInfo->Part1Port , 0x2e , tempbl , tempah ) ;
    else
    {
        tempah = 0x00 ;
        tempbl = 0xff ;

        if ( pVBInfo->VBInfo & ( SetCRT2ToRAMDAC | SetCRT2ToTV | SetCRT2ToLCD | SetCRT2ToLCDA ) )
        {
            if ( ( pVBInfo->VBInfo & SetCRT2ToLCDA ) && ( !( pVBInfo->VBInfo & SetSimuScanMode ) ) )
            {
                tempbl &= 0xf7 ;
                tempah |= 0x01 ;
                XGINew_SetRegANDOR( pVBInfo->Part1Port , 0x2e , tempbl , tempah ) ;
            }
            else
            {
                if ( pVBInfo->VBInfo & SetCRT2ToLCDA )
                {
                    tempbl &= 0xf7 ;
                    tempah |= 0x01 ;
                }

                if ( pVBInfo->VBInfo & ( SetCRT2ToRAMDAC | SetCRT2ToTV | SetCRT2ToLCD ) )
                {
                    tempbl &= 0xf8 ;
                    tempah = 0x01 ;

                    if ( !( pVBInfo->VBInfo & SetInSlaveMode ) )
                        tempah |= 0x02 ;

                    if ( !( pVBInfo->VBInfo & SetCRT2ToRAMDAC ) )
                    {
                        tempah = tempah ^ 0x05 ;
                        if ( !( pVBInfo->VBInfo & SetCRT2ToLCD ) )
                            tempah = tempah ^ 0x01 ;
                    }

                    if ( !( pVBInfo->VBInfo & SetCRT2ToDualEdge ) )
                        tempah |= 0x08 ;
                    XGINew_SetRegANDOR( pVBInfo->Part1Port , 0x2e , tempbl , tempah ) ;
                }
                else
                    XGINew_SetRegANDOR( pVBInfo->Part1Port , 0x2e , tempbl , tempah ) ;
            }
        }
        else
            XGINew_SetRegANDOR( pVBInfo->Part1Port , 0x2e , tempbl , tempah ) ;
    }

    if ( pVBInfo->VBInfo & ( SetCRT2ToRAMDAC | SetCRT2ToTV | SetCRT2ToLCD | SetCRT2ToLCDA ) )
    {
        tempah &= ( ~0x08 ) ;
        if ( ( pVBInfo->ModeType == ModeVGA ) && ( !( pVBInfo->VBInfo & SetInSlaveMode ) ) )
        {
            tempah |= 0x010 ;
        }
        tempah |= 0x080 ;

        if ( pVBInfo->VBInfo & SetCRT2ToTV )
        {
            /* if ( !( pVBInfo->TVInfo & ( SetYPbPrMode525p | SetYPbPrMode750p ) ) ) */
            /* { */
            tempah |= 0x020 ;
            if ( ModeNo > 0x13 )
            {
                if ( pVBInfo->VBInfo & DriverMode )
                    tempah = tempah ^ 0x20 ;
            }
        /* } */
        }

        XGINew_SetRegANDOR( pVBInfo->Part4Port , 0x0D , ~0x0BF , tempah ) ;
        tempah = 0 ;

        if ( pVBInfo->LCDInfo & SetLCDDualLink )
            tempah |= 0x40 ;

        if ( pVBInfo->VBInfo & SetCRT2ToTV )
        {
            /* if ( ( !( pVBInfo->VBInfo & SetCRT2ToHiVisionTV ) ) && ( !( pVBInfo->TVInfo & ( SetYPbPrMode525p | SetYPbPrMode750p ) ) ) ) */
            /* { */
                if ( pVBInfo->TVInfo & RPLLDIV2XO )
                    tempah |= 0x40 ;
            /* } */
        }

        if ( ( pVBInfo->LCDResInfo == Panel1280x1024 ) || ( pVBInfo->LCDResInfo == Panel1280x1024x75 ) )
            tempah |= 0x80 ;

        if ( pVBInfo->LCDResInfo == Panel1280x960 )
            tempah |= 0x80 ;

        XGINew_SetReg1( pVBInfo->Part4Port , 0x0C , tempah ) ;
    }

    if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
    {
        tempah = 0 ;
        tempbl = 0xfb ;

        if ( pVBInfo->VBInfo & SetCRT2ToDualEdge )
        {
            tempbl=0xff;
            if ( pVBInfo->VBInfo & SetCRT2ToLCDA )
                tempah |= 0x04 ; /* shampoo 0129 */
        }

        XGINew_SetRegANDOR( pVBInfo->Part1Port , 0x13 , tempbl , tempah ) ;
        tempah = 0x00 ;
        tempbl = 0xcf ;
        if ( !( pVBInfo->VBInfo & DisableCRT2Display ) )
        {
            if ( pVBInfo->VBInfo & SetCRT2ToDualEdge )
                tempah |= 0x30 ;
        }

        XGINew_SetRegANDOR( pVBInfo->Part1Port , 0x2c , tempbl , tempah ) ;
        tempah = 0 ;
        tempbl = 0x3f ;

        if ( !( pVBInfo->VBInfo & DisableCRT2Display ) )
        {
            if ( pVBInfo->VBInfo & SetCRT2ToDualEdge )
                tempah |= 0xc0 ;
        }
        XGINew_SetRegANDOR( pVBInfo->Part4Port , 0x21 , tempbl , tempah ) ;
    }

    tempah = 0 ;
    tempbl = 0x7f ;
    if ( !( pVBInfo->VBInfo & SetCRT2ToLCDA ) )
    {
        tempbl = 0xff ;
        if ( !( pVBInfo->VBInfo & SetCRT2ToDualEdge ) )
            tempah |= 0x80 ;
    }

    XGINew_SetRegANDOR( pVBInfo->Part4Port , 0x23 , tempbl , tempah ) ;

    if ( pVBInfo->VBType & ( VB_XGI302LV | VB_XGI301C ) )
    {
        if ( pVBInfo->LCDInfo & SetLCDDualLink )
        {
            XGINew_SetRegOR( pVBInfo->Part4Port , 0x27 , 0x20 ) ;
            XGINew_SetRegOR( pVBInfo->Part4Port , 0x34 , 0x10 ) ;
        }
    }
}


/* --------------------------------------------------------------------- */
/* Function : XGI_CloseCRTC */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_CloseCRTC(struct xgi_hw_device_info *HwDeviceExtension, struct vb_device_info *pVBInfo)
{
    unsigned short tempbx ;

    tempbx = 0 ;

    if ( pVBInfo->VBInfo & SetCRT2ToLCDA )
        tempbx = 0x08A0 ;


}


/* --------------------------------------------------------------------- */
/* Function : XGI_OpenCRTC */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_OpenCRTC(struct xgi_hw_device_info *HwDeviceExtension, struct vb_device_info *pVBInfo)
{
    unsigned short tempbx ;

    tempbx = 0 ;


}


/* --------------------------------------------------------------------- */
/* Function : XGI_GetRAMDAC2DATA */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_GetRAMDAC2DATA(unsigned short ModeNo, unsigned short ModeIdIndex, unsigned short RefreshRateTableIndex, struct vb_device_info *pVBInfo)
{
    unsigned short tempax ,
           tempbx ,
           temp1 ,
           temp2 ,
           modeflag = 0 ,
           tempcx ,
           StandTableIndex ,
           CRT1Index ;

    pVBInfo->RVBHCMAX = 1 ;
    pVBInfo->RVBHCFACT = 1 ;

    if ( ModeNo <= 0x13 )
    {
        modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ;
        StandTableIndex = XGI_GetModePtr( ModeNo , ModeIdIndex, pVBInfo ) ;
        tempax = pVBInfo->StandTable[ StandTableIndex ].CRTC[ 0 ] ;
        tempbx = pVBInfo->StandTable[StandTableIndex ].CRTC[ 6 ] ;
        temp1 = pVBInfo->StandTable[ StandTableIndex ].CRTC[ 7 ] ;
    }
    else
    {
        modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ;
        CRT1Index = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_CRT1CRTC ;
        CRT1Index &= IndexMask ;
	temp1 = (unsigned short)pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[0];
	temp2 = (unsigned short)pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[5];
	tempax = ( temp1 & 0xFF ) | ( ( temp2 & 0x03 ) << 8 ) ;
	tempbx = (unsigned short)pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[8];
	tempcx = (unsigned short)pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[14] << 8;
	tempcx &= 0x0100 ;
	tempcx = tempcx << 2 ;
	tempbx |= tempcx;
	temp1 = (unsigned short)pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[9];
    }

    if ( temp1 & 0x01 )
        tempbx |= 0x0100 ;

    if ( temp1 & 0x20 )
        tempbx |= 0x0200 ;
    tempax += 5 ;

    if ( modeflag & Charx8Dot )
        tempax *= 8 ;
    else
        tempax *= 9 ;

    pVBInfo->VGAHT = tempax ;
    pVBInfo->HT = tempax ;
    tempbx++ ;
    pVBInfo->VGAVT = tempbx ;
    pVBInfo->VT = tempbx ;
}



/* --------------------------------------------------------------------- */
/* Function : XGI_GetColorDepth */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
unsigned short XGI_GetColorDepth(unsigned short ModeNo, unsigned short ModeIdIndex, struct vb_device_info *pVBInfo)
{
    unsigned short ColorDepth[ 6 ] = { 1 , 2 , 4 , 4 , 6 , 8 } ;
    short index ;
    unsigned short modeflag ;

    if ( ModeNo <= 0x13 )
    {
        modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ;
    }
    else
    {
        modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ;
    }

    index=(modeflag&ModeInfoFlag)-ModeEGA;

    if ( index < 0 )
        index = 0 ;

    return( ColorDepth[ index ] ) ;
}



/* --------------------------------------------------------------------- */
/* Function : XGI_UnLockCRT2 */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_UnLockCRT2(struct xgi_hw_device_info *HwDeviceExtension,  struct vb_device_info *pVBInfo)
{

    XGINew_SetRegANDOR( pVBInfo->Part1Port , 0x2f , 0xFF , 0x01 ) ;

}


/* --------------------------------------------------------------------- */
/* Function : XGI_LockCRT2 */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_LockCRT2(struct xgi_hw_device_info *HwDeviceExtension,  struct vb_device_info *pVBInfo)
{

    XGINew_SetRegANDOR( pVBInfo->Part1Port , 0x2F , 0xFE , 0x00 ) ;


}


/* --------------------------------------------------------------------- */
/* Function : XGINew_EnableCRT2 */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGINew_EnableCRT2(struct vb_device_info *pVBInfo)
{
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x1E , 0xFF , 0x20 ) ;
}



/* --------------------------------------------------------------------- */
/* Function : */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGINew_LCD_Wait_Time(unsigned char DelayTime, struct vb_device_info *pVBInfo)
{
    unsigned short i ,
           j ;

    unsigned long temp ,
          flag ;

    flag = 0 ;
//printk("XGINew_LCD_Wait_Time");
//return;
    for( i = 0 ; i < DelayTime ; i++ )
    {
        for( j = 0 ; j < 66 ; j++ )
        {

            temp =  XGINew_GetReg3( 0x61 ) ;

            //temp &= 0x10000000;
            temp &= 0x10;
            if ( temp == flag )
                continue ;

            flag = temp ;
        }
    }
}




/* --------------------------------------------------------------------- */
/* Function : XGI_BridgeIsOn */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
unsigned char XGI_BridgeIsOn(struct vb_device_info *pVBInfo)
{
    unsigned short flag ;

    if ( pVBInfo->IF_DEF_LVDS == 1 )
    {
        return( 1 ) ;
    }
    else
    {
        flag = XGINew_GetReg1( pVBInfo->Part4Port , 0x00 ) ;
        if ( ( flag == 1 ) || ( flag == 2 ) )
            return( 1 ) ;	/* 301b */
        else
            return( 0 ) ;
    }
}



/* --------------------------------------------------------------------- */
/* Function : XGI_LongWait */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_LongWait(struct vb_device_info *pVBInfo)
{
    unsigned short i ;

    i = XGINew_GetReg1( pVBInfo->P3c4 , 0x1F ) ;

    if ( !( i & 0xC0 ) )
    {
        for( i = 0 ; i < 0xFFFF ; i++ )
        {
            if ( !( XGINew_GetReg2( pVBInfo->P3da ) & 0x08 ) )
                break ;
        }

        for( i = 0 ; i < 0xFFFF ; i++ )
        {
            if ( ( XGINew_GetReg2( pVBInfo->P3da ) & 0x08 ) )
                break ;
	}
    }
}


/* --------------------------------------------------------------------- */
/* Function : XGI_VBLongWait */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_VBLongWait(struct vb_device_info *pVBInfo)
{
    unsigned short tempal ,
           temp ,
           i ,
           j ;
return ;
    if ( !( pVBInfo->VBInfo & SetCRT2ToTV ) )
    {
        temp = 0 ;
        for( i = 0 ; i < 3 ; i++ )
        {
            for( j = 0 ; j < 100 ; j++ )
            {
                tempal = XGINew_GetReg2( pVBInfo->P3da ) ;
                if ( temp & 0x01 )
                {			/* VBWaitMode2 */
                    if ( ( tempal & 0x08 ) )
                    {
                        continue ;
                    }

                    if ( !( tempal & 0x08 ) )
                    {
                        break ;
                    }
                }
                else
                {			/* VBWaitMode1 */
                    if ( !( tempal & 0x08 ) )
                    {
                        continue ;
                    }

                    if ( ( tempal & 0x08 ) )
                    {
                        break ;
                    }
                }
            }
            temp = temp ^ 0x01 ;
        }
    }
    else
    {
        XGI_LongWait(pVBInfo) ;
    }
    return ;
}




/* --------------------------------------------------------------------- */
/* Function : XGI_GetVGAHT2 */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
unsigned short XGI_GetVGAHT2(struct vb_device_info *pVBInfo)
{
    unsigned long tempax ,
          tempbx ;

    tempbx = ( ( pVBInfo->VGAVT - pVBInfo->VGAVDE ) * pVBInfo->RVBHCMAX ) & 0xFFFF ;
    tempax = ( pVBInfo->VT - pVBInfo->VDE ) * pVBInfo->RVBHCFACT ;
    tempax = ( tempax * pVBInfo->HT ) /tempbx ;

    return( (unsigned short)tempax ) ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_GetVCLK2Ptr */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
unsigned short XGI_GetVCLK2Ptr(unsigned short ModeNo,
			       unsigned short ModeIdIndex,
			       unsigned short RefreshRateTableIndex,
			       struct xgi_hw_device_info *HwDeviceExtension,
			       struct vb_device_info *pVBInfo)
{
    unsigned short tempbx ;

    unsigned short LCDXlat1VCLK[ 4 ] = { VCLK65 + 2 , VCLK65 + 2 , VCLK65 + 2 , VCLK65 + 2 } ;
    unsigned short LCDXlat2VCLK[ 4 ] = { VCLK108_2 + 5 , VCLK108_2 + 5 , VCLK108_2 + 5 , VCLK108_2 + 5 } ;
    unsigned short LVDSXlat1VCLK[ 4 ] = { VCLK40 , VCLK40 , VCLK40 , VCLK40 } ;
    unsigned short LVDSXlat2VCLK[ 4 ] = { VCLK65 + 2 , VCLK65 + 2 , VCLK65 + 2 , VCLK65 + 2 } ;
    unsigned short LVDSXlat3VCLK[ 4 ] = { VCLK65 + 2 , VCLK65 + 2 , VCLK65 + 2 , VCLK65 + 2 } ;

    unsigned short CRT2Index , VCLKIndex ;
    unsigned short modeflag , resinfo ;
    unsigned char *CHTVVCLKPtr = NULL ;

    if ( ModeNo <= 0x13 )
    {
        modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ;      /* si+St_ResInfo */
        resinfo = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ResInfo ;
        CRT2Index = pVBInfo->SModeIDTable[ ModeIdIndex ].St_CRT2CRTC ;
    }
    else
    {
        modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ;     /* si+Ext_ResInfo */
        resinfo = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_RESINFO ;
        CRT2Index = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_CRT2CRTC ;
    }

    if ( pVBInfo->IF_DEF_LVDS == 0 )
    {
        CRT2Index = CRT2Index >> 6 ;        /*  for LCD */
        if ( ( ( pVBInfo->VBInfo & SetCRT2ToLCD ) | SetCRT2ToLCDA ) )	 /*301b*/
        {
            if ( pVBInfo->LCDResInfo != Panel1024x768 )
            {
                VCLKIndex = LCDXlat2VCLK[ CRT2Index ] ;
            }
            else
            {
                 VCLKIndex = LCDXlat1VCLK[ CRT2Index ] ;
            }
        }
        else	/* for TV */
        {
            if ( pVBInfo->VBInfo & SetCRT2ToTV )
            {
                if ( pVBInfo->VBInfo & SetCRT2ToHiVisionTV )
                {
                    if ( pVBInfo->SetFlag & RPLLDIV2XO )
                    {
                        VCLKIndex = HiTVVCLKDIV2 ;


                            VCLKIndex += 25 ;

                    }
                    else
                    {
                        VCLKIndex = HiTVVCLK ;


                            VCLKIndex += 25 ;

                    }

                    if ( pVBInfo->SetFlag & TVSimuMode )
                    {
                        if( modeflag & Charx8Dot )
                        {
                            VCLKIndex = HiTVSimuVCLK ;


                                VCLKIndex += 25 ;

                        }
                        else
                        {
                            VCLKIndex = HiTVTextVCLK ;


                                VCLKIndex += 25 ;

                        }
                    }

                    if ( pVBInfo->VBType & VB_XGI301LV )	/* 301lv */
                    {
                        if ( !( pVBInfo->VBExtInfo == VB_YPbPr1080i ) )
                        {
                            VCLKIndex = YPbPr750pVCLK ;
                            if ( !( pVBInfo->VBExtInfo == VB_YPbPr750p ) )
                            {
                                VCLKIndex = YPbPr525pVCLK ;
                                if ( !( pVBInfo->VBExtInfo == VB_YPbPr525p ) )
                                {
                                    VCLKIndex = YPbPr525iVCLK_2 ;
                                    if ( !( pVBInfo->SetFlag & RPLLDIV2XO ) )
                                        VCLKIndex = YPbPr525iVCLK ;
                                }
                            }
                        }
                    }
                }
                else
                {
                    if ( pVBInfo->VBInfo & SetCRT2ToTV )
                    {
                        if ( pVBInfo->SetFlag & RPLLDIV2XO )
			{
                            VCLKIndex = TVVCLKDIV2 ;


                            VCLKIndex += 25 ;

                        }
                        else
                        {
                            VCLKIndex = TVVCLK ;


                            VCLKIndex += 25 ;

                        }
                    }
                }
            }
            else
            {	/* for CRT2 */
		VCLKIndex = (unsigned char)XGINew_GetReg2((pVBInfo->P3ca + 0x02));	/* Port 3cch */
		VCLKIndex = ( ( VCLKIndex >> 2 ) & 0x03 ) ;
                if ( ModeNo > 0x13 )
                {
                    VCLKIndex = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_CRTVCLK ;	/* di+Ext_CRTVCLK */
                    VCLKIndex &= IndexMask ;
                }
            }
        }
    }
    else
    {		/* LVDS */
        if ( ModeNo <= 0x13 )
            VCLKIndex = CRT2Index ;
	else
	    VCLKIndex = CRT2Index ;

        if ( pVBInfo->IF_DEF_CH7005 == 1 )
        {
            if ( !( pVBInfo->VBInfo & SetCRT2ToLCD ) )
            {
                VCLKIndex &= 0x1f ;
		tempbx = 0 ;

                if ( pVBInfo->VBInfo & SetPALTV )
                    tempbx += 2 ;

                if ( pVBInfo->VBInfo & SetCHTVOverScan )
                    tempbx += 1 ;

                switch( tempbx )
                {
                    case 0:
                        CHTVVCLKPtr = pVBInfo->CHTVVCLKUNTSC ;
                        break ;
                    case 1:
                        CHTVVCLKPtr = pVBInfo->CHTVVCLKONTSC ;
                        break;
                    case 2:
                        CHTVVCLKPtr = pVBInfo->CHTVVCLKUPAL ;
                        break ;
                    case 3:
                        CHTVVCLKPtr = pVBInfo->CHTVVCLKOPAL ;
                        break ;
                    default:
                        break ;
                }

                VCLKIndex = CHTVVCLKPtr[ VCLKIndex ] ;
            }
        }
        else
        {
            VCLKIndex = VCLKIndex >> 6 ;
            if ( ( pVBInfo->LCDResInfo == Panel800x600 ) || ( pVBInfo->LCDResInfo == Panel320x480 ) )
                VCLKIndex = LVDSXlat1VCLK[ VCLKIndex ] ;
            else if ( ( pVBInfo->LCDResInfo == Panel1024x768 ) || ( pVBInfo->LCDResInfo == Panel1024x768x75 ) )
                VCLKIndex = LVDSXlat2VCLK[ VCLKIndex ] ;
            else
                VCLKIndex = LVDSXlat3VCLK[ VCLKIndex ] ;
        }
    }
    /* VCLKIndex = VCLKIndex&IndexMask ; */



    return( VCLKIndex ) ;
}

