From a737574ac99c8eb4ac0b98afc073b8c73031d94d Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Mon, 7 Sep 2009 09:00:39 +1000 Subject: [PATCH] Remove xgi-xg20-21-27.patch (#23752) Patch was basis for f9f7b2a7457744f9abc99626ee992a6886a6fbe5 but should be in the repo itself. X.Org Bug 23752 Signed-off-by: Peter Hutterer --- xgi-xg20-21-27.patch | 46676 ----------------------------------------- 1 file changed, 46676 deletions(-) delete mode 100644 xgi-xg20-21-27.patch diff --git a/xgi-xg20-21-27.patch b/xgi-xg20-21-27.patch deleted file mode 100644 index a55070d..0000000 --- a/xgi-xg20-21-27.patch +++ /dev/null @@ -1,46676 +0,0 @@ -diff --git a/src/init.c b/src/init.c -index cc12b4f..12f3c80 100644 ---- a/src/init.c -+++ b/src/init.c -@@ -1,1032 +1,1073 @@ --/* -- * Mode initializing code (CRT1 section) -- * (Universal module for Linux kernel framebuffer and XFree86 4.x) -- * -- * Copyright (C) 2001-2004 by Thomas Winischhofer, Vienna, Austria -- * -- * If distributed as part of the Linux kernel, the following license terms -- * apply: -- * -- * * This program is free software; you can redistribute it and/or modify -- * * it under the terms of the GNU General Public License as published by -- * * the Free Software Foundation; either version 2 of the named License, -- * * or any later version. -- * * -- * * This program is distributed in the hope that it will be useful, -- * * but WITHOUT ANY WARRANTY; without even the implied warranty of -- * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- * * GNU General Public License for more details. -- * * -- * * You should have received a copy of the GNU General Public License -- * * along with this program; if not, write to the Free Software -- * * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA -- * -- * Otherwise, the following license terms apply: -- * -- * * Redistribution and use in source and binary forms, with or without -- * * modification, are permitted provided that the following conditions -- * * are met: -- * * 1) Redistributions of source code must retain the above copyright -- * * notice, this list of conditions and the following disclaimer. -- * * 2) Redistributions in binary form must reproduce the above copyright -- * * notice, this list of conditions and the following disclaimer in the -- * * documentation and/or other materials provided with the distribution. -- * * 3) The name of the author may not be used to endorse or promote products -- * * derived from this software without specific prior written permission. -- * * -- * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESSED OR -- * * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -- * * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -- * * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, -- * * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -- * * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -- * * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -- * * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -- * * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -- * * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -- * -- * Author: Thomas Winischhofer -- * -- * Formerly based on non-functional code-fragements for 300 series by XGI, Inc. -- * Used by permission. -- * -- * TW says: This code looks awful, I know. But please don't do anything about -- * this otherwise debugging will be hell. -- * The code is extremely fragile as regards the different chipsets, different -- * video bridges and combinations thereof. If anything is changed, extreme -- * care has to be taken that that change doesn't break it for other chipsets, -- * bridges or combinations thereof. -- * All comments in this file are by me, regardless if they are marked TW or not. -- * -- */ -- --#ifdef HAVE_CONFIG_H --#include "config.h" --#endif -- --#include "init.h" --#include "vgatypes.h" --#include "vb_def.h" --#include "vb_setmode.h" -- --/*********************************************/ --/* HELPER: Get ModeID */ --/*********************************************/ -- --USHORT --XGI_GetModeID(ULONG VBFlags, int HDisplay, int VDisplay, -- int Depth, int LCDwidth, int LCDheight) --{ -- USHORT ModeIndex = 0; -- -- switch(HDisplay) -- { -- case 320: -- if(VDisplay == 200) -- ModeIndex = ModeIndex_320x200[Depth]; -- else if(VDisplay == 240) -- ModeIndex = ModeIndex_320x240[Depth]; -- -- break; -- case 400: -- if(VDisplay == 300) ModeIndex = ModeIndex_400x300[Depth]; -- break; -- case 512: -- if(VDisplay == 384) ModeIndex = ModeIndex_512x384[Depth]; -- break; -- case 640: -- if(VDisplay == 480) ModeIndex = ModeIndex_640x480[Depth]; -- else if(VDisplay == 400) ModeIndex = ModeIndex_640x400[Depth]; -- break; -- case 720: -- if(!(VBFlags & CRT1_LCDA)) { -- if(VDisplay == 480) ModeIndex = ModeIndex_720x480[Depth]; -- else if(VDisplay == 576) ModeIndex = ModeIndex_720x576[Depth]; -- } -- break; -- case 768: -- if(!(VBFlags & CRT1_LCDA)) { -- if(VDisplay == 576) ModeIndex = ModeIndex_768x576[Depth]; -- } -- break; -- case 800: -- if(VDisplay == 600) ModeIndex = ModeIndex_800x600[Depth]; -- else if(!(VBFlags & CRT1_LCDA)) { -- if(VDisplay == 480) ModeIndex = ModeIndex_800x480[Depth]; -- } -- break; -- case 848: -- if(!(VBFlags & CRT1_LCDA)) { -- if(VDisplay == 480) ModeIndex = ModeIndex_848x480[Depth]; -- } -- break; -- case 856: -- if(!(VBFlags & CRT1_LCDA)) { -- if(VDisplay == 480) ModeIndex = ModeIndex_856x480[Depth]; -- } -- break; -- case 1024: -- if(VDisplay == 768) ModeIndex = ModeIndex_1024x768[Depth]; -- else if(!(VBFlags & CRT1_LCDA)) { -- if(VDisplay == 576) ModeIndex = ModeIndex_1024x576[Depth]; -- } -- break; -- case 1152: -- if(!(VBFlags & CRT1_LCDA)) { -- if(VDisplay == 864) ModeIndex = ModeIndex_1152x864[Depth]; -- } -- break; -- case 1280: -- if(VDisplay == 1024) ModeIndex = ModeIndex_1280x1024[Depth]; -- else if(VDisplay == 720) { -- if((VBFlags & CRT1_LCDA) && (LCDwidth == 1280) && (LCDheight == 720)) { -- ModeIndex = ModeIndex_1280x720[Depth]; -- } else if(!(VBFlags & CRT1_LCDA)) { -- ModeIndex = ModeIndex_1280x720[Depth]; -- } -- } else if(!(VBFlags & CRT1_LCDA)) { -- if(VDisplay == 960) ModeIndex = ModeIndex_1280x960[Depth]; -- else if(VDisplay == 768) { -- ModeIndex = ModeIndex_310_1280x768[Depth]; -- } -- } -- break; -- case 1360: -- if(!(VBFlags & CRT1_LCDA)) { -- if(VDisplay == 768) ModeIndex = ModeIndex_1360x768[Depth]; -- } -- break; -- case 1400: -- break; -- case 1600: -- if(VDisplay == 1200) ModeIndex = ModeIndex_1600x1200[Depth]; -- break; -- case 1680: -- break; -- case 1920: -- if(!(VBFlags & CRT1_LCDA)) { -- if(VDisplay == 1440) ModeIndex = ModeIndex_1920x1440[Depth]; -- } -- break; -- case 2048: -- if(!(VBFlags & CRT1_LCDA)) { -- if(VDisplay == 1536) { -- ModeIndex = ModeIndex_310_2048x1536[Depth]; -- } -- } -- break; -- } -- -- return(ModeIndex); --} -- --/*********************************************/ --/* HELPER: SetReg, GetReg */ --/*********************************************/ -- --void --XGI_SetReg(XGIIOADDRESS port, USHORT index, USHORT data) --{ -- outb(port,index); -- outb(port + 1,data); --} -- --void --XGI_SetRegByte(XGIIOADDRESS port, USHORT data) --{ -- outb(port,data); --} -- --void --XGI_SetRegShort(XGIIOADDRESS port, USHORT data) --{ -- outw(port,data); --} -- --void --XGI_SetRegLong(XGIIOADDRESS port, ULONG data) --{ -- outl(port,data); --} -- --UCHAR --XGI_GetReg(XGIIOADDRESS port, USHORT index) --{ -- outb(port,index); -- return inb(port + 1); --} -- --UCHAR --XGI_GetRegByte(XGIIOADDRESS port) --{ -- return inb(port); --} -- --USHORT --XGI_GetRegShort(XGIIOADDRESS port) --{ -- return inw(port); --} -- --ULONG --XGI_GetRegLong(XGIIOADDRESS port) --{ -- return inl(port); --} -- --void --XGI_SetRegANDOR(XGIIOADDRESS Port,USHORT Index,USHORT DataAND,USHORT DataOR) --{ -- USHORT temp; -- -- temp = XGI_GetReg(Port,Index); -- temp = (temp & (DataAND)) | DataOR; -- XGI_SetReg(Port,Index,temp); --} -- --void --XGI_SetRegAND(XGIIOADDRESS Port,USHORT Index,USHORT DataAND) --{ -- USHORT temp; -- -- temp = XGI_GetReg(Port,Index); -- temp &= DataAND; -- XGI_SetReg(Port,Index,temp); --} -- --void --XGI_SetRegOR(XGIIOADDRESS Port,USHORT Index,USHORT DataOR) --{ -- USHORT temp; -- -- temp = XGI_GetReg(Port,Index); -- temp |= DataOR; -- XGI_SetReg(Port,Index,temp); --} -- --/*********************************************/ --/* HELPER: DisplayOn, DisplayOff */ --/*********************************************/ -- --void --XGI_New_DisplayOn(VB_DEVICE_INFO *XGI_Pr) --{ -- XGI_SetRegAND(XGI_Pr->P3c4,0x01,0xDF); --} -- --void --XGI_New_DisplayOff(VB_DEVICE_INFO *XGI_Pr) --{ -- XGI_SetRegOR(XGI_Pr->P3c4,0x01,0x20); --} -- --/*********************************************/ --/* HELPER: Init PCI & Engines */ --/*********************************************/ -- --static void --XGIInitPCIetc(VB_DEVICE_INFO *XGI_Pr, PXGI_HW_DEVICE_INFO HwInfo) --{ -- switch(HwInfo->jChipType) { -- case XG40: -- case XG42: -- case XG20: -- XGI_SetReg(XGI_Pr->P3c4,0x20,0xa1); -- /* - Enable 2D (0x40) -- * - Enable 3D (0x02) -- * - Enable 3D vertex command fetch (0x10) -- * - Enable 3D command parser (0x08) -- * - Enable 3D G/L transformation engine (0x80) -- */ -- XGI_SetRegOR(XGI_Pr->P3c4, 0x1E, -- SR1E_ENABLE_3D_TRANSFORM_ENGINE -- | SR1E_ENABLE_2D -- | SR1E_ENABLE_3D_AGP_VERTEX_FETCH -- | SR1E_ENABLE_3D_COMMAND_PARSER -- | SR1E_ENABLE_3D); -- break; -- } --} -- --/*********************************************/ --/* HELPER: GetVBType */ --/*********************************************/ -- --void --XGI_New_GetVBType(VB_DEVICE_INFO *XGI_Pr, PXGI_HW_DEVICE_INFO HwInfo) --{ -- USHORT flag=0, rev=0, nolcd=0; -- -- XGI_Pr->VBType = 0; -- -- flag = XGI_GetReg(XGI_Pr->Part4Port,0x00); --PDEBUG(ErrorF("GetVBType: part4_0: %x \n",flag)); //yilin -- if(flag > 3) return; -- -- rev = XGI_GetReg(XGI_Pr->Part4Port,0x01); --PDEBUG(ErrorF("GetVBType: part4_1: %x \n",rev)); //yilin -- -- if(flag >= 2) { -- XGI_Pr->VBType = VB_XGI302B; -- } else if(flag == 1) { -- if(rev >= 0xC0) { -- XGI_Pr->VBType = VB_XGI301C; -- } else if(rev >= 0xB0) { -- XGI_Pr->VBType = VB_XGI301B; -- /* Check if 30xB DH version (no LCD support, use Panel Link instead) */ -- nolcd = XGI_GetReg(XGI_Pr->Part4Port,0x23); -- if(!(nolcd & 0x02)) XGI_Pr->VBType |= VB_NoLCD; -- } else { -- XGI_Pr->VBType = VB_XGI301; -- } -- } -- if(XGI_Pr->VBType & (VB_XGI301B | VB_XGI301C | VB_XGI302B)) { -- if(rev >= 0xE0) { -- flag = XGI_GetReg(XGI_Pr->Part4Port,0x39); -- if(flag == 0xff) XGI_Pr->VBType = VB_XGI302LV; -- else XGI_Pr->VBType = VB_XGI302ELV; -- } else if(rev >= 0xD0) { -- XGI_Pr->VBType = VB_XGI301LV; -- } -- } --PDEBUG(ErrorF("GetVBType: XGI_Pr->VBType=%x \n",XGI_Pr->VBType)); //yilin --} -- --/*********************************************/ --/* HELPER: SearchModeID */ --/*********************************************/ -- --BOOLEAN --XGI_SearchModeID(const XGI_StStruct *SModeIDTable, -- const XGI_ExtStruct *EModeIDTable, -- unsigned char VGAINFO, USHORT *ModeNo, USHORT *ModeIdIndex) --{ -- if (*ModeNo <= 0x13) { -- if ((*ModeNo) <= 0x05) -- (*ModeNo) |= 0x01; -- -- for (*ModeIdIndex = 0; /* emtpy */; (*ModeIdIndex)++) { -- if (SModeIDTable[*ModeIdIndex].St_ModeID == (*ModeNo)) -- break; -- -- if (SModeIDTable[*ModeIdIndex].St_ModeID == 0xFF) -- return FALSE; -- } -- -- if (*ModeNo == 0x07) { -- if (VGAINFO & 0x10) -- (*ModeIdIndex)++; /* 400 lines */ -- /* else 350 lines */ -- } -- -- if (*ModeNo <= 0x03) { -- if (!(VGAINFO & 0x80)) -- (*ModeIdIndex)++; -- -- if (VGAINFO & 0x10) -- (*ModeIdIndex)++; /* 400 lines */ -- /* else 350 lines */ -- } -- /* else 200 lines */ -- } -- else { -- -- for (*ModeIdIndex = 0; /* emtpy */; (*ModeIdIndex)++) { -- if (EModeIDTable[*ModeIdIndex].Ext_ModeID == (*ModeNo)) -- break; -- -- if (EModeIDTable[*ModeIdIndex].Ext_ModeID == 0xFF) -- return FALSE; -- } -- } -- -- return TRUE; --} -- --/*********************************************/ --/* HELPER: GetModePtr */ --/*********************************************/ -- --UCHAR --XGI_GetModePtr(const XGI_StStruct *SModeIDTable, unsigned ModeType, -- USHORT ModeNo, USHORT ModeIdIndex) --{ -- return (ModeNo <= 0x13) -- ? SModeIDTable[ModeIdIndex].St_StTableIndex -- : ((ModeType <= 0x02) ? 0x1B /* 02 -> ModeEGA */ : 0x0F); --} -- -- --/*********************************************/ --/* HELPER: LowModeTests */ --/*********************************************/ -- --static BOOLEAN --XGI_DoLowModeTest(VB_DEVICE_INFO *XGI_Pr, USHORT ModeNo, PXGI_HW_DEVICE_INFO HwInfo) --{ -- USHORT temp,temp1,temp2; -- -- if((ModeNo != 0x03) && (ModeNo != 0x10) && (ModeNo != 0x12)) -- return(1); -- temp = XGI_GetReg(XGI_Pr->P3d4,0x11); -- XGI_SetRegOR(XGI_Pr->P3d4,0x11,0x80); -- temp1 = XGI_GetReg(XGI_Pr->P3d4,0x00); -- XGI_SetReg(XGI_Pr->P3d4,0x00,0x55); -- temp2 = XGI_GetReg(XGI_Pr->P3d4,0x00); -- XGI_SetReg(XGI_Pr->P3d4,0x00,temp1); -- XGI_SetReg(XGI_Pr->P3d4,0x11,temp); -- if (temp2 == 0x55) -- return(0); -- else -- return(1); --} -- --static void --XGI_SetLowModeTest(VB_DEVICE_INFO *XGI_Pr, USHORT ModeNo, PXGI_HW_DEVICE_INFO HwInfo) --{ -- if(XGI_DoLowModeTest(XGI_Pr, ModeNo, HwInfo)) { -- XGI_Pr->SetFlag |= LowModeTests; -- } --} -- --static void --XGI_HandleCRT1(VB_DEVICE_INFO *XGI_Pr) --{ -- XGI_SetRegAND(XGI_Pr->P3d4, 0x53, 0xbf); --} -- --/*********************************************/ --/* HELPER: GetOffset */ --/*********************************************/ -- --USHORT --XGI_New_GetOffset(VB_DEVICE_INFO *XGI_Pr,USHORT ModeNo,USHORT ModeIdIndex, -- USHORT RefreshRateTableIndex,PXGI_HW_DEVICE_INFO HwInfo) --{ -- USHORT xres, temp, colordepth, infoflag; -- -- infoflag = XGI_Pr->RefIndex[RefreshRateTableIndex].Ext_InfoFlag; -- xres = XGI_Pr->RefIndex[RefreshRateTableIndex].XRes; -- -- colordepth = XGI_GetColorDepth(ModeNo, ModeIdIndex, XGI_Pr); -- -- temp = xres / 16; -- if(infoflag & InterlaceMode) temp <<= 1; -- temp *= colordepth; -- if(xres % 16) { -- colordepth >>= 1; -- temp += colordepth; -- } -- -- return(temp); --} -- --/*********************************************/ --/* RESET VCLK */ --/*********************************************/ -- --static void --XGI_ResetCRT1VCLK(VB_DEVICE_INFO *XGI_Pr, PXGI_HW_DEVICE_INFO HwInfo) --{ -- XGI_SetRegANDOR(XGI_Pr->P3c4,0x31,0xCF,0x20); -- XGI_SetReg(XGI_Pr->P3c4,0x2B,XGI_Pr->VCLKData[1].SR2B); -- XGI_SetReg(XGI_Pr->P3c4,0x2C,XGI_Pr->VCLKData[1].SR2C); -- XGI_SetReg(XGI_Pr->P3c4,0x2D,0x80); -- XGI_SetRegANDOR(XGI_Pr->P3c4,0x31,0xcf,0x10); -- XGI_SetReg(XGI_Pr->P3c4,0x2B,XGI_Pr->VCLKData[0].SR2B); -- XGI_SetReg(XGI_Pr->P3c4,0x2C,XGI_Pr->VCLKData[0].SR2C); -- XGI_SetReg(XGI_Pr->P3c4,0x2D,0x80); --} -- --/*********************************************/ --/* CRTC/2 */ --/*********************************************/ -- --static void --XGI_New_SetCRT1CRTC(VB_DEVICE_INFO *XGI_Pr, USHORT ModeNo, USHORT ModeIdIndex, -- USHORT RefreshRateTableIndex, -- PXGI_HW_DEVICE_INFO HwInfo) --{ -- UCHAR index; -- USHORT temp,i,j,modeflag; -- -- XGI_SetRegAND(XGI_Pr->P3d4,0x11,0x7f); /* unlock cr0-7 */ -- -- if(ModeNo <= 0x13) { -- modeflag = XGI_Pr->SModeIDTable[ModeIdIndex].St_ModeFlag; -- } else { -- modeflag = XGI_Pr->EModeIDTable[ModeIdIndex].Ext_ModeFlag; -- } -- -- index = XGI_Pr->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC; -- -- for(i=0,j=0;i<=7;i++,j++) { -- XGI_SetReg(XGI_Pr->P3d4,j,XGI_Pr->XGINEWUB_CRT1Table[index].CR[i]); -- } -- for(j=0x10;i<=10;i++,j++) { -- XGI_SetReg(XGI_Pr->P3d4,j,XGI_Pr->XGINEWUB_CRT1Table[index].CR[i]); -- } -- for(j=0x15;i<=12;i++,j++) { -- XGI_SetReg(XGI_Pr->P3d4,j,XGI_Pr->XGINEWUB_CRT1Table[index].CR[i]); -- } -- for(j=0x0A;i<=15;i++,j++) { -- XGI_SetReg(XGI_Pr->P3c4,j,XGI_Pr->XGINEWUB_CRT1Table[index].CR[i]); -- } -- -- temp = XGI_Pr->XGINEWUB_CRT1Table[index].CR[16] & 0xE0; -- XGI_SetReg(XGI_Pr->P3c4,0x0E,temp); -- -- temp = ((XGI_Pr->XGINEWUB_CRT1Table[index].CR[16]) & 0x01) << 5; -- if(modeflag & DoubleScanMode) temp |= 0x80; -- XGI_SetRegANDOR(XGI_Pr->P3d4,0x09,0x5F,temp); -- -- if(XGI_Pr->ModeType > ModeVGA) XGI_SetReg(XGI_Pr->P3d4,0x14,0x4F); --} -- --/*********************************************/ --/* OFFSET & PITCH */ --/*********************************************/ --/* (partly overruled by SetPitch() in XF86) */ --/*********************************************/ -- --static void --XGI_New_SetCRT1Offset(VB_DEVICE_INFO *XGI_Pr, USHORT ModeNo, USHORT ModeIdIndex, -- USHORT RefreshRateTableIndex, -- PXGI_HW_DEVICE_INFO HwInfo) --{ -- USHORT temp, DisplayUnit, infoflag; -- -- infoflag = XGI_Pr->RefIndex[RefreshRateTableIndex].Ext_InfoFlag; -- -- DisplayUnit = XGI_New_GetOffset(XGI_Pr,ModeNo,ModeIdIndex, -- RefreshRateTableIndex,HwInfo); -- -- temp = (DisplayUnit >> 8) & 0x0f; -- XGI_SetRegANDOR(XGI_Pr->P3c4,0x0E,0xF0,temp); -- -- temp = DisplayUnit & 0xFF; -- XGI_SetReg(XGI_Pr->P3d4,0x13,temp); -- -- if(infoflag & InterlaceMode) DisplayUnit >>= 1; -- -- DisplayUnit <<= 5; -- temp = (DisplayUnit & 0xff00) >> 8; -- if(DisplayUnit & 0xff) temp++; -- temp++; -- XGI_SetReg(XGI_Pr->P3c4,0x10,temp); --} -- --/*********************************************/ --/* VCLK */ --/*********************************************/ -- --static void --XGI_New_SetCRT1VCLK(VB_DEVICE_INFO *XGI_Pr, USHORT ModeNo, USHORT ModeIdIndex, -- PXGI_HW_DEVICE_INFO HwInfo, USHORT RefreshRateTableIndex) --{ -- USHORT index=0, clka, clkb; -- -- if((XGI_Pr->VBType & VB_XGI301BLV302BLV) && (XGI_Pr->VBInfo & SetCRT2ToLCDA)) { -- clka = XGI_Pr->VBVCLKData[index].Part4_A; -- clkb = XGI_Pr->VBVCLKData[index].Part4_B; -- } else { -- clka = XGI_Pr->VCLKData[index].SR2B; -- clkb = XGI_Pr->VCLKData[index].SR2C; -- } -- -- XGI_SetRegAND(XGI_Pr->P3c4,0x31,0xCF); -- XGI_SetReg(XGI_Pr->P3c4,0x2B,clka); -- XGI_SetReg(XGI_Pr->P3c4,0x2C,clkb); -- XGI_SetReg(XGI_Pr->P3c4,0x2D,0x01); --} -- --/*********************************************/ --/* MODE REGISTERS */ --/*********************************************/ -- --static void --XGI_New_SetVCLKState(VB_DEVICE_INFO *XGI_Pr, PXGI_HW_DEVICE_INFO HwInfo, -- USHORT ModeNo, USHORT RefreshRateTableIndex, -- USHORT ModeIdIndex) --{ -- USHORT data=0, VCLK=0, index=0; -- -- if(ModeNo > 0x13) { -- VCLK = XGI_Pr->VCLKData[index].CLOCK; -- } -- -- if(VCLK >= 166) -- data |= 0x0c; -- -- XGI_SetRegANDOR(XGI_Pr->P3c4,0x32,0xf3,data); -- -- if(VCLK >= 166) { -- XGI_SetRegAND(XGI_Pr->P3c4,0x1f,0xe7); -- } -- -- /* DAC speed */ -- XGI_SetRegANDOR(XGI_Pr->P3c4,0x07,0xE8,0x10); --} -- --static void --XGI_New_SetCRT1ModeRegs(VB_DEVICE_INFO *XGI_Pr, PXGI_HW_DEVICE_INFO HwInfo, -- USHORT ModeNo,USHORT ModeIdIndex,USHORT RefreshRateTableIndex) --{ -- USHORT data,infoflag=0,modeflag; -- USHORT resindex = 0,xres; -- -- if(ModeNo > 0x13) { -- modeflag = XGI_Pr->EModeIDTable[ModeIdIndex].Ext_ModeFlag; -- infoflag = XGI_Pr->RefIndex[RefreshRateTableIndex].Ext_InfoFlag; -- xres = XGI_Pr->ModeResInfo[resindex].HTotal; -- } else { -- modeflag = XGI_Pr->SModeIDTable[ModeIdIndex].St_ModeFlag; -- xres = XGI_Pr->StResInfo[resindex].HTotal; -- } -- -- /* Disable DPMS */ -- XGI_SetRegAND(XGI_Pr->P3c4,0x1F,0x3F); -- -- data = 0; -- if(ModeNo > 0x13) { -- if(XGI_Pr->ModeType > 0x02) { -- data |= 0x02; -- data |= ((XGI_Pr->ModeType - ModeVGA) << 2); -- } -- if(infoflag & InterlaceMode) data |= 0x20; -- } -- XGI_SetRegANDOR(XGI_Pr->P3c4,0x06,0xC0,data); -- -- data = 0; -- if(infoflag & InterlaceMode) { -- if(xres <= 800) data = 0x0020; -- else if(xres <= 1024) data = 0x0035; -- else data = 0x0048; -- } -- XGI_SetReg(XGI_Pr->P3d4,0x19,(data & 0xFF)); -- XGI_SetRegANDOR(XGI_Pr->P3d4,0x1a,0xFC,(data >> 8)); -- -- if(modeflag & HalfDCLK) { -- XGI_SetRegOR(XGI_Pr->P3c4,0x01,0x08); -- } -- -- data = 0; -- if(modeflag & LineCompareOff) data = 0x08; -- -- XGI_SetRegANDOR(XGI_Pr->P3c4,0x0F,0xB7,data); -- if(XGI_Pr->ModeType == ModeEGA) { -- if(ModeNo > 0x13) { -- XGI_SetRegOR(XGI_Pr->P3c4,0x0F,0x40); -- } -- } -- -- XGI_SetRegAND(XGI_Pr->P3c4,0x31,0xfb); -- -- data = 0x60; -- if(XGI_Pr->ModeType != ModeText) { -- data ^= 0x60; -- if(XGI_Pr->ModeType != ModeEGA) { -- data ^= 0xA0; -- } -- } -- XGI_SetRegANDOR(XGI_Pr->P3c4,0x21,0x1F,data); -- -- XGI_New_SetVCLKState(XGI_Pr, HwInfo, ModeNo, RefreshRateTableIndex, ModeIdIndex); --} -- --/*********************************************/ --/* LOAD DAC */ --/*********************************************/ -- --extern const uint8_t XGI_MDA_DAC[]; --extern const uint8_t XGI_CGA_DAC[]; --extern const uint8_t XGI_EGA_DAC[]; --extern const uint8_t XGI_VGA_DAC[]; -- --void --XGI_New_LoadDAC(VB_DEVICE_INFO *XGI_Pr, PXGI_HW_DEVICE_INFO HwInfo, -- USHORT ModeNo, USHORT ModeIdIndex) --{ -- USHORT data,data2; -- USHORT time,i,j,k,m,n,o; -- USHORT si,di,bx,dl,al,ah,dh; -- USHORT shiftflag; -- XGIIOADDRESS DACAddr, DACData; -- const uint8_t *table = NULL; -- -- if(ModeNo <= 0x13) { -- data = XGI_Pr->SModeIDTable[ModeIdIndex].St_ModeFlag; -- } else { -- data = XGI_Pr->EModeIDTable[ModeIdIndex].Ext_ModeFlag; -- } -- -- data &= DACInfoFlag; -- time = 64; -- if(data == 0x00) table = XGI_MDA_DAC; -- if(data == 0x08) table = XGI_CGA_DAC; -- if(data == 0x10) table = XGI_EGA_DAC; -- if(data == 0x18) { -- time = 256; -- table = XGI_VGA_DAC; -- } -- if(time == 256) j = 16; -- else j = time; -- -- if( ( (XGI_Pr->VBInfo & SetCRT2ToLCD) && /* 301B-DH LCD */ -- (XGI_Pr->VBType & VB_NoLCD) ) || -- (XGI_Pr->VBInfo & SetCRT2ToLCDA) || /* LCDA */ -- (!(XGI_Pr->SetFlag & ProgrammingCRT2)) ) { /* Programming CRT1 */ -- DACAddr = XGI_Pr->P3c8; -- DACData = XGI_Pr->P3c9; -- shiftflag = 0; -- XGI_SetRegByte(XGI_Pr->P3c6,0xFF); -- } else { -- shiftflag = 1; -- DACAddr = XGI_Pr->Part5Port; -- DACData = XGI_Pr->Part5Port + 1; -- } -- -- XGI_SetRegByte(DACAddr,0x00); -- -- for(i=0; i>= 2; -- } -- } -- -- if(time == 256) { -- for(i = 16; i < 32; i++) { -- data = table[i]; -- if(shiftflag) data <<= 2; -- for(k = 0; k < 3; k++) XGI_SetRegByte(DACData, data); -- } -- si = 32; -- for(m = 0; m < 9; m++) { -- di = si; -- bx = si + 4; -- 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(DACData, shiftflag, dl, ah, al, dh); -- } -- si -= 2; -- for(o = 0; o < 3; o++) { -- dh = table[bx]; -- ah = table[di]; -- al = table[si]; -- si--; -- XGI_WriteDAC(DACData, shiftflag, dl, ah, al, dh); -- } -- dl++; -- } /* for n < 3 */ -- si += 5; -- } /* for m < 9 */ -- } --} -- --/*********************************************/ --/* SET CRT1 REGISTER GROUP */ --/*********************************************/ -- --static void --XGI_New_SetCRT1Group(VB_DEVICE_INFO *XGI_Pr, PXGI_HW_DEVICE_INFO HwInfo, -- USHORT ModeNo, USHORT ModeIdIndex) --{ -- const USHORT StandTableIndex = XGI_GetModePtr(XGI_Pr->SModeIDTable, -- XGI_Pr->ModeType, -- ModeNo, ModeIdIndex); -- USHORT RefreshRateTableIndex = 0; -- -- --/* -- if(XGI_Pr->SetFlag & LowModeTests) { -- if(XGI_Pr->VBInfo & (SetSimuScanMode | SwitchToCRT2)) { -- XGI_New_DisableBridge(XGI_Pr, HwInfo); -- } -- } --*/ -- XGI_SetSeqRegs(StandTableIndex, XGI_Pr); -- XGI_SetMiscRegs(StandTableIndex, XGI_Pr); -- XGI_SetCRTCRegs(StandTableIndex, XGI_Pr); -- XGI_SetATTRegs(ModeNo, StandTableIndex, ModeIdIndex, XGI_Pr); -- XGI_SetGRCRegs(StandTableIndex, XGI_Pr); -- XGI_ClearExt1Regs(ModeNo, XGI_Pr); -- XGI_ResetCRT1VCLK(XGI_Pr, HwInfo); -- -- XGI_Pr->SetFlag &= (~ProgrammingCRT2); -- --#ifdef LINUX_XF86 -- xf86DrvMsgVerb(0, X_PROBED, 4, "(init: VBType=0x%04x, VBInfo=0x%04x)\n", -- XGI_Pr->VBType, XGI_Pr->VBInfo); --#endif -- -- if(XGI_Pr->VBInfo & SetSimuScanMode) { -- if(XGI_Pr->VBInfo & SetInSlaveMode) { -- XGI_Pr->SetFlag |= ProgrammingCRT2; -- } -- } -- -- if(XGI_Pr->VBInfo & SetCRT2ToLCDA) { -- XGI_Pr->SetFlag |= ProgrammingCRT2; -- } -- -- if(!(XGI_Pr->VBInfo & SetCRT2ToLCDA)) { -- XGI_Pr->SetFlag &= ~ProgrammingCRT2; -- } -- -- if(RefreshRateTableIndex != 0xFFFF) { -- XGI_SetSync(RefreshRateTableIndex, XGI_Pr); -- XGI_New_SetCRT1CRTC(XGI_Pr, ModeNo, ModeIdIndex, RefreshRateTableIndex, HwInfo); -- XGI_New_SetCRT1Offset(XGI_Pr, ModeNo, ModeIdIndex, RefreshRateTableIndex, HwInfo); -- XGI_New_SetCRT1VCLK(XGI_Pr, ModeNo, ModeIdIndex, HwInfo, RefreshRateTableIndex); -- } -- -- XGI_New_SetCRT1ModeRegs(XGI_Pr, HwInfo, ModeNo, ModeIdIndex, RefreshRateTableIndex); -- -- XGI_New_LoadDAC(XGI_Pr, HwInfo, ModeNo, ModeIdIndex); --} -- -- --/*********************************************/ --/* XFree86: SET SCREEN PITCH */ --/*********************************************/ -- --#ifdef LINUX_XF86 --static void --XGI_SetPitchCRT1(VB_DEVICE_INFO *XGI_Pr, ScrnInfoPtr pScrn) --{ -- XGIPtr pXGI = XGIPTR(pScrn); -- UShort HDisplay = pXGI->scrnPitch >> 3; -- -- XGI_SetReg(XGI_Pr->P3d4,0x13,(HDisplay & 0xFF)); -- XGI_SetRegANDOR(XGI_Pr->P3c4,0x0E,0xF0,(HDisplay>>8)); --} --#endif -- --/*********************************************/ --/* XFree86: XGIBIOSSetMode() */ --/* for non-Dual-Head mode */ --/*********************************************/ -- --#ifdef LINUX_XF86 --BOOLEAN --XGIBIOSSetMode(VB_DEVICE_INFO *XGI_Pr, PXGI_HW_DEVICE_INFO HwInfo, -- ScrnInfoPtr pScrn, DisplayModePtr mode) --{ -- XGIPtr pXGI = XGIPTR(pScrn); -- UShort ModeNo=0; -- BOOLEAN SetModeRet = FALSE ; -- UShort HDisplay = pXGI->scrnOffset >> 3 ; -- -- ModeNo = XGI_CalcModeIndex(pScrn, mode, pXGI->VBFlags); -- if(!ModeNo) return FALSE; -- -- xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 3, "Setting standard mode 0x%x\n", ModeNo); -- --#if XGI_USING_BIOS_SETMODE -- PDEBUG(ErrorF("XGI_USING_BIOS_SETMODE \n")); -- if ((pXGI->pVbe != NULL) && (pXGI->pVbe->pInt10 != NULL)) { -- xf86Int10InfoPtr pInt = pXGI->pVbe->pInt10; -- -- if (xf86LoadSubModule(pScrn, "int10")) { -- pInt->num = 0x10; -- pInt->ax = 0x80 | ModeNo; -- -- /* ah = 0, set mode */ -- xf86ExecX86int10(pInt); -- SetModeRet = ((pInt->ax & 0x7f) == ModeNo); -- } -- } -- else --#endif -- { -- PDEBUG(ErrorF("XGI_USING_C_code_SETMODE \n")); -- SetModeRet = XGISetModeNew(HwInfo, XGI_Pr, ModeNo); -- PDEBUG(ErrorF("out_of_C_code_SETMODE \n")); -- } -- -- -- /* SetPitch: Adapt to virtual size & position */ -- if (ModeNo > 0x13) { -- XGI_SetReg(XGI_Pr->Part1Port, 0x2f, 1); //yilin for crt2pitch it shoude modify if not colone mode -- XGI_SetReg(XGI_Pr->Part1Port, 0x07, (HDisplay & 0xFF)); -- XGI_SetRegANDOR(XGI_Pr->Part1Port, 0x09, 0xF0, (HDisplay>>8)); -- -- XGI_SetReg(XGI_Pr->P3d4,0x13,(HDisplay & 0xFF)); -- XGI_SetRegANDOR(XGI_Pr->P3c4,0x0E,0xF0,(HDisplay>>8)); -- } -- -- return SetModeRet; --} -- --/*********************************************/ --/* XFree86: XGIBIOSSetModeCRT1() */ --/* for Dual-Head modes */ --/*********************************************/ -- --BOOLEAN --XGIBIOSSetModeCRT1(VB_DEVICE_INFO *XGI_Pr, PXGI_HW_DEVICE_INFO HwInfo, -- ScrnInfoPtr pScrn, DisplayModePtr mode) --{ -- XGIPtr pXGI = XGIPTR(pScrn); -- USHORT ModeIdIndex, ModeNo=0; -- UCHAR backupreg=0; -- unsigned vga_info; -- XGIEntPtr pXGIEnt = ENTITY_PRIVATE(pXGI); -- UCHAR backupcr30, backupcr31, backupcr38, backupcr35, backupp40d=0; -- -- -- ModeNo = XGI_CalcModeIndex(pScrn, mode, pXGI->VBFlags); -- if(!ModeNo) return FALSE; -- -- xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 3, -- "Setting standard mode 0x%x on CRT1\n", ModeNo); -- --#if (defined(i386) || defined(__i386) || defined(__i386__) || defined(__AMD64__)) -- vga_info = XGI_GetSetBIOSScratch(pScrn, 0x489, 0xff); --#else -- vga_info = 0x11; --#endif -- XGIInitPCIetc(XGI_Pr, HwInfo); -- -- XGI_SetReg(XGI_Pr->P3c4,0x05,0x86); -- -- if (!XGI_SearchModeID(XGI_Pr->SModeIDTable, XGI_Pr->EModeIDTable, -- vga_info, &ModeNo, &ModeIdIndex)) { -- return FALSE; -- } -- -- /* Determine VBType */ -- XGI_New_GetVBType(XGI_Pr, HwInfo); -- -- if (XGI_Pr->VBType & VB_XGI301BLV302BLV) { -- backupreg = XGI_GetReg(XGI_Pr->P3d4,0x38); -- } -- -- /* Get VB information (connectors, connected devices) */ -- /* (We don't care if the current mode is a CRT2 mode) */ -- XGI_SetLowModeTest(XGI_Pr, ModeNo, HwInfo); -- -- /* Set mode on CRT1 */ -- XGI_New_SetCRT1Group(XGI_Pr, HwInfo, ModeNo, ModeIdIndex); -- /* SetPitch: Adapt to virtual size & position */ -- XGI_SetPitchCRT1(XGI_Pr, pScrn); -- -- -- /* Reset CRT2 if changing mode on CRT1 */ -- if(IS_DUAL_HEAD(pXGI)) { -- if(pXGIEnt->CRT2ModeNo != -1) { -- xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 3, -- "(Re-)Setting mode for CRT2\n"); -- backupcr30 = XGI_GetReg(XGI_Pr->P3d4,0x30); -- backupcr31 = XGI_GetReg(XGI_Pr->P3d4,0x31); -- backupcr35 = XGI_GetReg(XGI_Pr->P3d4,0x35); -- backupcr38 = XGI_GetReg(XGI_Pr->P3d4,0x38); -- if(XGI_Pr->VBType & VB_XGIVB) { -- /* Backup LUT-enable */ -- if(pXGIEnt->CRT2ModeSet) { -- backupp40d = XGI_GetReg(XGI_Pr->Part4Port,0x0d) & 0x08; -- } -- } -- if(XGI_Pr->VBInfo & SetCRT2ToLCDA) { -- XGI_SetReg(XGI_Pr->P3d4,0x30,pXGIEnt->CRT2CR30); -- XGI_SetReg(XGI_Pr->P3d4,0x31,pXGIEnt->CRT2CR31); -- XGI_SetReg(XGI_Pr->P3d4,0x35,pXGIEnt->CRT2CR35); -- XGI_SetReg(XGI_Pr->P3d4,0x38,pXGIEnt->CRT2CR38); -- } -- -- XGI_SetReg(XGI_Pr->P3d4,0x30,backupcr30); -- XGI_SetReg(XGI_Pr->P3d4,0x31,backupcr31); -- XGI_SetReg(XGI_Pr->P3d4,0x35,backupcr35); -- XGI_SetReg(XGI_Pr->P3d4,0x38,backupcr38); -- if(XGI_Pr->VBType & VB_XGIVB) { -- XGI_SetRegANDOR(XGI_Pr->Part4Port,0x0d, ~0x08, backupp40d); -- } -- } -- } -- -- /* Warning: From here, the custom mode entries in XGI_Pr are -- * possibly overwritten -- */ -- -- XGI_HandleCRT1(XGI_Pr); -- -- XGI_New_DisplayOn(XGI_Pr); -- XGI_SetRegByte(XGI_Pr->P3c6,0xFF); -- -- /* Backup/Set ModeNo in BIOS scratch area */ -- XGI_GetSetModeID(pScrn,ModeNo); -- -- return TRUE; --} --#endif /* Linux_XF86 */ -+/* -+ * Mode initializing code (CRT1 section) -+ * (Universal module for Linux kernel framebuffer and XFree86 4.x) -+ * -+ * Copyright (C) 2001-2004 by Thomas Winischhofer, Vienna, Austria -+ * -+ * If distributed as part of the Linux kernel, the following license terms -+ * apply: -+ * -+ * * This program is free software; you can redistribute it and/or modify -+ * * it under the terms of the GNU General Public License as published by -+ * * the Free Software Foundation; either version 2 of the named License, -+ * * or any later version. -+ * * -+ * * This program is distributed in the hope that it will be useful, -+ * * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * * GNU General Public License for more details. -+ * * -+ * * You should have received a copy of the GNU General Public License -+ * * along with this program; if not, write to the Free Software -+ * * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA -+ * -+ * Otherwise, the following license terms apply: -+ * -+ * * Redistribution and use in source and binary forms, with or without -+ * * modification, are permitted provided that the following conditions -+ * * are met: -+ * * 1) Redistributions of source code must retain the above copyright -+ * * notice, this list of conditions and the following disclaimer. -+ * * 2) Redistributions in binary form must reproduce the above copyright -+ * * notice, this list of conditions and the following disclaimer in the -+ * * documentation and/or other materials provided with the distribution. -+ * * 3) The name of the author may not be used to endorse or promote products -+ * * derived from this software without specific prior written permission. -+ * * -+ * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESSED OR -+ * * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -+ * * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -+ * * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, -+ * * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -+ * * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -+ * * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -+ * * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -+ * * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -+ * * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -+ * -+ * Author: Thomas Winischhofer -+ * -+ * Formerly based on non-functional code-fragements for 300 series by XGI, Inc. -+ * Used by permission. -+ * -+ * TW says: This code looks awful, I know. But please don't do anything about -+ * this otherwise debugging will be hell. -+ * The code is extremely fragile as regards the different chipsets, different -+ * video bridges and combinations thereof. If anything is changed, extreme -+ * care has to be taken that that change doesn't break it for other chipsets, -+ * bridges or combinations thereof. -+ * All comments in this file are by me, regardless if they are marked TW or not. -+ * -+ */ -+ -+#ifdef HAVE_CONFIG_H -+#include "config.h" -+#endif -+ -+#include "init.h" -+#include "vgatypes.h" -+#include "vb_def.h" -+#include "vb_setmode.h" -+ -+/*********************************************/ -+/* HELPER: Get ModeID */ -+/*********************************************/ -+/* Jong 09/18/2007; patch to GIT */ -+/* VGAEngine is not used; FSTN is always FALSE */ -+USHORT -+XGI_GetModeID(ULONG VBFlags, int HDisplay, int VDisplay, -+ int Depth, int LCDwidth, int LCDheight) -+{ -+ USHORT ModeIndex = 0; -+ -+ switch(HDisplay) -+ { -+ case 320: -+ if(VDisplay == 200) -+ ModeIndex = ModeIndex_320x200[Depth]; -+ else if(VDisplay == 240) -+ { -+ ModeIndex = ModeIndex_320x240[Depth]; -+ } -+ break; -+ case 400: -+ if(VDisplay == 300) ModeIndex = ModeIndex_400x300[Depth]; -+ break; -+ case 512: -+ if(VDisplay == 384) ModeIndex = ModeIndex_512x384[Depth]; -+ break; -+ case 640: -+ if(VDisplay == 480) ModeIndex = ModeIndex_640x480[Depth]; -+ else if(VDisplay == 400) ModeIndex = ModeIndex_640x400[Depth]; -+ break; -+ case 720: -+ if(!(VBFlags & CRT1_LCDA)) { -+ if(VDisplay == 480) ModeIndex = ModeIndex_720x480[Depth]; -+ else if(VDisplay == 576) ModeIndex = ModeIndex_720x576[Depth]; -+ } -+ break; -+ case 768: -+ if(!(VBFlags & CRT1_LCDA)) { -+ if(VDisplay == 576) ModeIndex = ModeIndex_768x576[Depth]; -+ } -+ break; -+ case 800: -+ if(VDisplay == 600) ModeIndex = ModeIndex_800x600[Depth]; -+ else if(!(VBFlags & CRT1_LCDA)) { -+ if(VDisplay == 480) ModeIndex = ModeIndex_800x480[Depth]; -+ } -+ break; -+ case 848: -+ if(!(VBFlags & CRT1_LCDA)) { -+ if(VDisplay == 480) ModeIndex = ModeIndex_848x480[Depth]; -+ } -+ break; -+ case 856: -+ if(!(VBFlags & CRT1_LCDA)) { -+ if(VDisplay == 480) ModeIndex = ModeIndex_856x480[Depth]; -+ } -+ break; -+ case 1024: -+ if(VDisplay == 768) ModeIndex = ModeIndex_1024x768[Depth]; -+ else if(!(VBFlags & CRT1_LCDA)) { -+ if(VDisplay == 576) ModeIndex = ModeIndex_1024x576[Depth]; -+ } -+ break; -+ case 1152: -+ if(!(VBFlags & CRT1_LCDA)) { -+ if(VDisplay == 864) ModeIndex = ModeIndex_1152x864[Depth]; -+ } -+ break; -+ case 1280: -+ if(VDisplay == 1024) ModeIndex = ModeIndex_1280x1024[Depth]; -+ else if(VDisplay == 720) { -+ if((VBFlags & CRT1_LCDA) && (LCDwidth == 1280) && (LCDheight == 720)) { -+ ModeIndex = ModeIndex_1280x720[Depth]; -+ } else if(!(VBFlags & CRT1_LCDA)) { -+ ModeIndex = ModeIndex_1280x720[Depth]; -+ } -+ } else if(!(VBFlags & CRT1_LCDA)) { -+ if(VDisplay == 960) ModeIndex = ModeIndex_1280x960[Depth]; -+ else if(VDisplay == 768) { -+ ModeIndex = ModeIndex_310_1280x768[Depth]; -+ } -+ } -+ break; -+ case 1360: -+ if(!(VBFlags & CRT1_LCDA)) { -+ if(VDisplay == 768) ModeIndex = ModeIndex_1360x768[Depth]; -+ } -+ break; -+ case 1400: -+ break; -+ case 1600: -+ if(VDisplay == 1200) ModeIndex = ModeIndex_1600x1200[Depth]; -+ break; -+ case 1680: -+ break; -+ case 1920: -+ if(!(VBFlags & CRT1_LCDA)) { -+ if(VDisplay == 1440) ModeIndex = ModeIndex_1920x1440[Depth]; -+ } -+ break; -+ case 2048: -+ if(!(VBFlags & CRT1_LCDA)) { -+ if(VDisplay == 1536) { -+ ModeIndex = ModeIndex_310_2048x1536[Depth]; -+ } -+ } -+ break; -+ } -+ -+ return(ModeIndex); -+} -+ -+/*********************************************/ -+/* HELPER: SetReg, GetReg */ -+/*********************************************/ -+ -+void -+XGI_SetReg(XGIIOADDRESS port, USHORT index, USHORT data) -+{ -+ outb(port,index); -+ outb(port + 1,data); -+} -+ -+void -+XGI_SetRegByte(XGIIOADDRESS port, USHORT data) -+{ -+ outb(port,data); -+} -+ -+void -+XGI_SetRegShort(XGIIOADDRESS port, USHORT data) -+{ -+ outw(port,data); -+} -+ -+void -+XGI_SetRegLong(XGIIOADDRESS port, ULONG data) -+{ -+ outl(port,data); -+} -+ -+UCHAR -+XGI_GetReg(XGIIOADDRESS port, USHORT index) -+{ -+ outb(port,index); -+ return inb(port + 1); -+} -+ -+UCHAR -+XGI_GetRegByte(XGIIOADDRESS port) -+{ -+ return inb(port); -+} -+ -+USHORT -+XGI_GetRegShort(XGIIOADDRESS port) -+{ -+ return inw(port); -+} -+ -+ULONG -+XGI_GetRegLong(XGIIOADDRESS port) -+{ -+ return inl(port); -+} -+ -+void -+XGI_SetRegANDOR(XGIIOADDRESS Port,USHORT Index,USHORT DataAND,USHORT DataOR) -+{ -+ USHORT temp; -+ -+ temp = XGI_GetReg(Port,Index); -+ temp = (temp & (DataAND)) | DataOR; -+ XGI_SetReg(Port,Index,temp); -+} -+ -+void -+XGI_SetRegAND(XGIIOADDRESS Port,USHORT Index,USHORT DataAND) -+{ -+ USHORT temp; -+ -+ temp = XGI_GetReg(Port,Index); -+ temp &= DataAND; -+ XGI_SetReg(Port,Index,temp); -+} -+ -+void -+XGI_SetRegOR(XGIIOADDRESS Port,USHORT Index,USHORT DataOR) -+{ -+ USHORT temp; -+ -+ temp = XGI_GetReg(Port,Index); -+ temp |= DataOR; -+ XGI_SetReg(Port,Index,temp); -+} -+ -+/*********************************************/ -+/* HELPER: DisplayOn, DisplayOff */ -+/*********************************************/ -+ -+void -+XGI_New_DisplayOn(VB_DEVICE_INFO *XGI_Pr) -+{ -+ XGI_SetRegAND(XGI_Pr->P3c4,0x01,0xDF); -+} -+ -+void -+XGI_New_DisplayOff(VB_DEVICE_INFO *XGI_Pr) -+{ -+ XGI_SetRegOR(XGI_Pr->P3c4,0x01,0x20); -+} -+ -+/*********************************************/ -+/* HELPER: Init PCI & Engines */ -+/*********************************************/ -+ -+static void -+XGIInitPCIetc(VB_DEVICE_INFO *XGI_Pr, PXGI_HW_DEVICE_INFO HwInfo) -+{ -+ CARD8 bForce=0x00; /* Jong 01/07/2008; force to disable 2D */ -+ -+ switch(HwInfo->jChipType) { -+ case XG40: -+ case XG42: -+ case XG20: -+ case XG21: -+ XGI_SetReg(XGI_Pr->P3c4,0x20,0xa1); -+ /* - Enable 2D (0x40) -+ * - Enable 3D (0x02) -+ * - Enable 3D vertex command fetch (0x10) -+ * - Enable 3D command parser (0x08) -+ * - Enable 3D G/L transformation engine (0x80) -+ */ -+ XGI_SetRegOR(XGI_Pr->P3c4, 0x1E, -+ SR1E_ENABLE_3D_TRANSFORM_ENGINE -+ | SR1E_ENABLE_2D -+ | SR1E_ENABLE_3D_AGP_VERTEX_FETCH -+ | SR1E_ENABLE_3D_COMMAND_PARSER -+ | SR1E_ENABLE_3D); -+ -+ /* Jong 01/07/2008; support forcing to disable 2D engine */ -+ if(HwInfo->jChipType == XG21) -+ { -+ inXGIIDXREG(XGI_Pr->P3c4, 0x3A, bForce) ; -+ bForce &= 0x40; -+ -+ if(bForce != 0x00) -+ XGI_SetRegAND(XGI_Pr->P3c4,0x1E,0xBF); -+ } -+ -+ break; -+ } -+} -+ -+/*********************************************/ -+/* HELPER: GetVBType */ -+/*********************************************/ -+ -+void -+XGI_New_GetVBType(VB_DEVICE_INFO *XGI_Pr, PXGI_HW_DEVICE_INFO HwInfo) -+{ -+ USHORT flag=0, rev=0, nolcd=0; -+ -+ XGI_Pr->VBType = 0; -+ -+ flag = XGI_GetReg(XGI_Pr->Part4Port,0x00); -+PDEBUG(ErrorF("GetVBType: part4_0: %x \n",flag)); //yilin -+ if(flag > 3) return; -+ -+ rev = XGI_GetReg(XGI_Pr->Part4Port,0x01); -+PDEBUG(ErrorF("GetVBType: part4_1: %x \n",rev)); //yilin -+ -+ if(flag >= 2) { -+ XGI_Pr->VBType = VB_XGI302B; -+ } else if(flag == 1) { -+ if(rev >= 0xC0) { -+ XGI_Pr->VBType = VB_XGI301C; -+ } else if(rev >= 0xB0) { -+ XGI_Pr->VBType = VB_XGI301B; -+ /* Check if 30xB DH version (no LCD support, use Panel Link instead) */ -+ nolcd = XGI_GetReg(XGI_Pr->Part4Port,0x23); -+ if(!(nolcd & 0x02)) XGI_Pr->VBType |= VB_NoLCD; -+ } else { -+ XGI_Pr->VBType = VB_XGI301; -+ } -+ } -+ if(XGI_Pr->VBType & (VB_XGI301B | VB_XGI301C | VB_XGI302B)) { -+ if(rev >= 0xE0) { -+ flag = XGI_GetReg(XGI_Pr->Part4Port,0x39); -+ if(flag == 0xff) XGI_Pr->VBType = VB_XGI302LV; -+ else XGI_Pr->VBType = VB_XGI302ELV; -+ } else if(rev >= 0xD0) { -+ XGI_Pr->VBType = VB_XGI301LV; -+ } -+ } -+PDEBUG(ErrorF("GetVBType: XGI_Pr->VBType=%x \n",XGI_Pr->VBType)); //yilin -+} -+ -+/*********************************************/ -+/* HELPER: SearchModeID */ -+/*********************************************/ -+ -+BOOLEAN -+XGI_SearchModeID(const XGI_StStruct *SModeIDTable, -+ const XGI_ExtStruct *EModeIDTable, -+ unsigned char VGAINFO, USHORT *ModeNo, USHORT *ModeIdIndex) -+{ -+ if (*ModeNo <= 0x13) { -+ if ((*ModeNo) <= 0x05) -+ (*ModeNo) |= 0x01; -+ -+ for (*ModeIdIndex = 0; /* emtpy */; (*ModeIdIndex)++) { -+ if (SModeIDTable[*ModeIdIndex].St_ModeID == (*ModeNo)) -+ break; -+ -+ if (SModeIDTable[*ModeIdIndex].St_ModeID == 0xFF) -+ return FALSE; -+ } -+ -+ if (*ModeNo == 0x07) { -+ if (VGAINFO & 0x10) -+ (*ModeIdIndex)++; /* 400 lines */ -+ /* else 350 lines */ -+ } -+ -+ if (*ModeNo <= 0x03) { -+ if (!(VGAINFO & 0x80)) -+ (*ModeIdIndex)++; -+ -+ if (VGAINFO & 0x10) -+ (*ModeIdIndex)++; /* 400 lines */ -+ /* else 350 lines */ -+ } -+ /* else 200 lines */ -+ } -+ else { -+ -+ for (*ModeIdIndex = 0; /* emtpy */; (*ModeIdIndex)++) { -+ if (EModeIDTable[*ModeIdIndex].Ext_ModeID == (*ModeNo)) -+ break; -+ -+ if (EModeIDTable[*ModeIdIndex].Ext_ModeID == 0xFF) -+ return FALSE; -+ } -+ } -+ -+ return TRUE; -+} -+ -+/*********************************************/ -+/* HELPER: GetModePtr */ -+/*********************************************/ -+ -+UCHAR -+XGI_GetModePtr(const XGI_StStruct *SModeIDTable, unsigned ModeType, -+ USHORT ModeNo, USHORT ModeIdIndex) -+{ -+ return (ModeNo <= 0x13) -+ ? SModeIDTable[ModeIdIndex].St_StTableIndex -+ : ((ModeType <= 0x02) ? 0x1B /* 02 -> ModeEGA */ : 0x0F); -+} -+ -+ -+/*********************************************/ -+/* HELPER: LowModeTests */ -+/*********************************************/ -+ -+static BOOLEAN -+XGI_DoLowModeTest(VB_DEVICE_INFO *XGI_Pr, USHORT ModeNo, PXGI_HW_DEVICE_INFO HwInfo) -+{ -+ USHORT temp,temp1,temp2; -+ -+ if((ModeNo != 0x03) && (ModeNo != 0x10) && (ModeNo != 0x12)) -+ return(1); -+ temp = XGI_GetReg(XGI_Pr->P3d4,0x11); -+ XGI_SetRegOR(XGI_Pr->P3d4,0x11,0x80); -+ temp1 = XGI_GetReg(XGI_Pr->P3d4,0x00); -+ XGI_SetReg(XGI_Pr->P3d4,0x00,0x55); -+ temp2 = XGI_GetReg(XGI_Pr->P3d4,0x00); -+ XGI_SetReg(XGI_Pr->P3d4,0x00,temp1); -+ XGI_SetReg(XGI_Pr->P3d4,0x11,temp); -+ if (temp2 == 0x55) -+ return(0); -+ else -+ return(1); -+} -+ -+static void -+XGI_SetLowModeTest(VB_DEVICE_INFO *XGI_Pr, USHORT ModeNo, PXGI_HW_DEVICE_INFO HwInfo) -+{ -+ if(XGI_DoLowModeTest(XGI_Pr, ModeNo, HwInfo)) { -+ XGI_Pr->SetFlag |= LowModeTests; -+ } -+} -+ -+static void -+XGI_HandleCRT1(VB_DEVICE_INFO *XGI_Pr) -+{ -+ XGI_SetRegAND(XGI_Pr->P3d4, 0x53, 0xbf); -+} -+ -+/*********************************************/ -+/* HELPER: GetOffset */ -+/*********************************************/ -+ -+USHORT -+XGI_New_GetOffset(VB_DEVICE_INFO *XGI_Pr,USHORT ModeNo,USHORT ModeIdIndex, -+ USHORT RefreshRateTableIndex,PXGI_HW_DEVICE_INFO HwInfo) -+{ -+ USHORT xres, temp, colordepth, infoflag; -+ -+ infoflag = XGI_Pr->RefIndex[RefreshRateTableIndex].Ext_InfoFlag; -+ xres = XGI_Pr->RefIndex[RefreshRateTableIndex].XRes; -+ -+ colordepth = XGI_GetColorDepth(ModeNo, ModeIdIndex, XGI_Pr); -+ -+ temp = xres / 16; -+ if(infoflag & InterlaceMode) temp <<= 1; -+ temp *= colordepth; -+ if(xres % 16) { -+ colordepth >>= 1; -+ temp += colordepth; -+ } -+ -+ return(temp); -+} -+ -+/*********************************************/ -+/* RESET VCLK */ -+/*********************************************/ -+ -+static void -+XGI_ResetCRT1VCLK(VB_DEVICE_INFO *XGI_Pr, PXGI_HW_DEVICE_INFO HwInfo) -+{ -+ XGI_SetRegANDOR(XGI_Pr->P3c4,0x31,0xCF,0x20); -+ XGI_SetReg(XGI_Pr->P3c4,0x2B,XGI_Pr->VCLKData[1].SR2B); -+ XGI_SetReg(XGI_Pr->P3c4,0x2C,XGI_Pr->VCLKData[1].SR2C); -+ XGI_SetReg(XGI_Pr->P3c4,0x2D,0x80); -+ XGI_SetRegANDOR(XGI_Pr->P3c4,0x31,0xcf,0x10); -+ XGI_SetReg(XGI_Pr->P3c4,0x2B,XGI_Pr->VCLKData[0].SR2B); -+ XGI_SetReg(XGI_Pr->P3c4,0x2C,XGI_Pr->VCLKData[0].SR2C); -+ XGI_SetReg(XGI_Pr->P3c4,0x2D,0x80); -+} -+ -+/*********************************************/ -+/* CRTC/2 */ -+/*********************************************/ -+ -+static void -+XGI_New_SetCRT1CRTC(VB_DEVICE_INFO *XGI_Pr, USHORT ModeNo, USHORT ModeIdIndex, -+ USHORT RefreshRateTableIndex, -+ PXGI_HW_DEVICE_INFO HwInfo) -+{ -+ UCHAR index; -+ USHORT temp,i,j,modeflag; -+ -+ XGI_SetRegAND(XGI_Pr->P3d4,0x11,0x7f); /* unlock cr0-7 */ -+ -+ if(ModeNo <= 0x13) { -+ modeflag = XGI_Pr->SModeIDTable[ModeIdIndex].St_ModeFlag; -+ } else { -+ modeflag = XGI_Pr->EModeIDTable[ModeIdIndex].Ext_ModeFlag; -+ } -+ -+ index = XGI_Pr->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC; -+ -+ for(i=0,j=0;i<=7;i++,j++) { -+ XGI_SetReg(XGI_Pr->P3d4,j,XGI_Pr->XGINEWUB_CRT1Table[index].CR[i]); -+ } -+ for(j=0x10;i<=10;i++,j++) { -+ XGI_SetReg(XGI_Pr->P3d4,j,XGI_Pr->XGINEWUB_CRT1Table[index].CR[i]); -+ } -+ for(j=0x15;i<=12;i++,j++) { -+ XGI_SetReg(XGI_Pr->P3d4,j,XGI_Pr->XGINEWUB_CRT1Table[index].CR[i]); -+ } -+ for(j=0x0A;i<=15;i++,j++) { -+ XGI_SetReg(XGI_Pr->P3c4,j,XGI_Pr->XGINEWUB_CRT1Table[index].CR[i]); -+ } -+ -+ temp = XGI_Pr->XGINEWUB_CRT1Table[index].CR[16] & 0xE0; -+ XGI_SetReg(XGI_Pr->P3c4,0x0E,temp); -+ -+ temp = ((XGI_Pr->XGINEWUB_CRT1Table[index].CR[16]) & 0x01) << 5; -+ if(modeflag & DoubleScanMode) temp |= 0x80; -+ XGI_SetRegANDOR(XGI_Pr->P3d4,0x09,0x5F,temp); -+ -+ if(XGI_Pr->ModeType > ModeVGA) XGI_SetReg(XGI_Pr->P3d4,0x14,0x4F); -+} -+ -+/*********************************************/ -+/* OFFSET & PITCH */ -+/*********************************************/ -+/* (partly overruled by SetPitch() in XF86) */ -+/*********************************************/ -+ -+static void -+XGI_New_SetCRT1Offset(VB_DEVICE_INFO *XGI_Pr, USHORT ModeNo, USHORT ModeIdIndex, -+ USHORT RefreshRateTableIndex, -+ PXGI_HW_DEVICE_INFO HwInfo) -+{ -+ USHORT temp, DisplayUnit, infoflag; -+ -+ infoflag = XGI_Pr->RefIndex[RefreshRateTableIndex].Ext_InfoFlag; -+ -+ DisplayUnit = XGI_New_GetOffset(XGI_Pr,ModeNo,ModeIdIndex, -+ RefreshRateTableIndex,HwInfo); -+ -+ temp = (DisplayUnit >> 8) & 0x0f; -+ XGI_SetRegANDOR(XGI_Pr->P3c4,0x0E,0xF0,temp); -+ -+ temp = DisplayUnit & 0xFF; -+ XGI_SetReg(XGI_Pr->P3d4,0x13,temp); -+ -+ if(infoflag & InterlaceMode) DisplayUnit >>= 1; -+ -+ DisplayUnit <<= 5; -+ temp = (DisplayUnit & 0xff00) >> 8; -+ if(DisplayUnit & 0xff) temp++; -+ temp++; -+ XGI_SetReg(XGI_Pr->P3c4,0x10,temp); -+} -+ -+/*********************************************/ -+/* VCLK */ -+/*********************************************/ -+ -+static void -+XGI_New_SetCRT1VCLK(VB_DEVICE_INFO *XGI_Pr, USHORT ModeNo, USHORT ModeIdIndex, -+ PXGI_HW_DEVICE_INFO HwInfo, USHORT RefreshRateTableIndex) -+{ -+ USHORT index=0, clka, clkb; -+ -+ if((XGI_Pr->VBType & VB_XGI301BLV302BLV) && (XGI_Pr->VBInfo & SetCRT2ToLCDA)) { -+ clka = XGI_Pr->VBVCLKData[index].Part4_A; -+ clkb = XGI_Pr->VBVCLKData[index].Part4_B; -+ } else { -+ clka = XGI_Pr->VCLKData[index].SR2B; -+ clkb = XGI_Pr->VCLKData[index].SR2C; -+ } -+ -+ XGI_SetRegAND(XGI_Pr->P3c4,0x31,0xCF); -+ XGI_SetReg(XGI_Pr->P3c4,0x2B,clka); -+ XGI_SetReg(XGI_Pr->P3c4,0x2C,clkb); -+ XGI_SetReg(XGI_Pr->P3c4,0x2D,0x01); -+} -+ -+/*********************************************/ -+/* MODE REGISTERS */ -+/*********************************************/ -+ -+static void -+XGI_New_SetVCLKState(VB_DEVICE_INFO *XGI_Pr, PXGI_HW_DEVICE_INFO HwInfo, -+ USHORT ModeNo, USHORT RefreshRateTableIndex, -+ USHORT ModeIdIndex) -+{ -+ USHORT data=0, VCLK=0, index=0; -+ -+ if(ModeNo > 0x13) { -+ VCLK = XGI_Pr->VCLKData[index].CLOCK; -+ } -+ -+ if(VCLK >= 166) -+ data |= 0x0c; -+ -+ XGI_SetRegANDOR(XGI_Pr->P3c4,0x32,0xf3,data); -+ -+ if(VCLK >= 166) { -+ XGI_SetRegAND(XGI_Pr->P3c4,0x1f,0xe7); -+ } -+ -+ /* DAC speed */ -+ XGI_SetRegANDOR(XGI_Pr->P3c4,0x07,0xE8,0x10); -+} -+ -+static void -+XGI_New_SetCRT1ModeRegs(VB_DEVICE_INFO *XGI_Pr, PXGI_HW_DEVICE_INFO HwInfo, -+ USHORT ModeNo,USHORT ModeIdIndex,USHORT RefreshRateTableIndex) -+{ -+ USHORT data,infoflag=0,modeflag; -+ USHORT resindex = 0,xres; -+ -+ if(ModeNo > 0x13) { -+ modeflag = XGI_Pr->EModeIDTable[ModeIdIndex].Ext_ModeFlag; -+ infoflag = XGI_Pr->RefIndex[RefreshRateTableIndex].Ext_InfoFlag; -+ xres = XGI_Pr->ModeResInfo[resindex].HTotal; -+ } else { -+ modeflag = XGI_Pr->SModeIDTable[ModeIdIndex].St_ModeFlag; -+ xres = XGI_Pr->StResInfo[resindex].HTotal; -+ } -+ -+ /* Disable DPMS */ -+ XGI_SetRegAND(XGI_Pr->P3c4,0x1F,0x3F); -+ -+ data = 0; -+ if(ModeNo > 0x13) { -+ if(XGI_Pr->ModeType > 0x02) { -+ data |= 0x02; -+ data |= ((XGI_Pr->ModeType - ModeVGA) << 2); -+ } -+ if(infoflag & InterlaceMode) data |= 0x20; -+ } -+ XGI_SetRegANDOR(XGI_Pr->P3c4,0x06,0xC0,data); -+ -+ data = 0; -+ if(infoflag & InterlaceMode) { -+ if(xres <= 800) data = 0x0020; -+ else if(xres <= 1024) data = 0x0035; -+ else data = 0x0048; -+ } -+ XGI_SetReg(XGI_Pr->P3d4,0x19,(data & 0xFF)); -+ XGI_SetRegANDOR(XGI_Pr->P3d4,0x1a,0xFC,(data >> 8)); -+ -+ if(modeflag & HalfDCLK) { -+ XGI_SetRegOR(XGI_Pr->P3c4,0x01,0x08); -+ } -+ -+ data = 0; -+ if(modeflag & LineCompareOff) data = 0x08; -+ -+ XGI_SetRegANDOR(XGI_Pr->P3c4,0x0F,0xB7,data); -+ if(XGI_Pr->ModeType == ModeEGA) { -+ if(ModeNo > 0x13) { -+ XGI_SetRegOR(XGI_Pr->P3c4,0x0F,0x40); -+ } -+ } -+ -+ XGI_SetRegAND(XGI_Pr->P3c4,0x31,0xfb); -+ -+ data = 0x60; -+ if(XGI_Pr->ModeType != ModeText) { -+ data ^= 0x60; -+ if(XGI_Pr->ModeType != ModeEGA) { -+ data ^= 0xA0; -+ } -+ } -+ XGI_SetRegANDOR(XGI_Pr->P3c4,0x21,0x1F,data); -+ -+ XGI_New_SetVCLKState(XGI_Pr, HwInfo, ModeNo, RefreshRateTableIndex, ModeIdIndex); -+} -+ -+/*********************************************/ -+/* LOAD DAC */ -+/*********************************************/ -+ -+extern const uint8_t XGI_MDA_DAC[]; -+extern const uint8_t XGI_CGA_DAC[]; -+extern const uint8_t XGI_EGA_DAC[]; -+extern const uint8_t XGI_VGA_DAC[]; -+ -+void -+XGI_New_LoadDAC(VB_DEVICE_INFO *XGI_Pr, PXGI_HW_DEVICE_INFO HwInfo, -+ USHORT ModeNo, USHORT ModeIdIndex) -+{ -+ USHORT data,data2; -+ USHORT time,i,j,k,m,n,o; -+ USHORT si,di,bx,dl,al,ah,dh; -+ USHORT shiftflag; -+ XGIIOADDRESS DACAddr, DACData; -+ const uint8_t *table = NULL; -+ -+ if(ModeNo <= 0x13) { -+ data = XGI_Pr->SModeIDTable[ModeIdIndex].St_ModeFlag; -+ } else { -+ data = XGI_Pr->EModeIDTable[ModeIdIndex].Ext_ModeFlag; -+ } -+ -+ data &= DACInfoFlag; -+ time = 64; -+ if(data == 0x00) table = XGI_MDA_DAC; -+ if(data == 0x08) table = XGI_CGA_DAC; -+ if(data == 0x10) table = XGI_EGA_DAC; -+ if(data == 0x18) { -+ time = 256; -+ table = XGI_VGA_DAC; -+ } -+ if(time == 256) j = 16; -+ else j = time; -+ -+ if( ( (XGI_Pr->VBInfo & SetCRT2ToLCD) && /* 301B-DH LCD */ -+ (XGI_Pr->VBType & VB_NoLCD) ) || -+ (XGI_Pr->VBInfo & SetCRT2ToLCDA) || /* LCDA */ -+ (!(XGI_Pr->SetFlag & ProgrammingCRT2)) ) { /* Programming CRT1 */ -+ DACAddr = XGI_Pr->P3c8; -+ DACData = XGI_Pr->P3c9; -+ shiftflag = 0; -+ XGI_SetRegByte(XGI_Pr->P3c6,0xFF); -+ } else { -+ shiftflag = 1; -+ DACAddr = XGI_Pr->Part5Port; -+ DACData = XGI_Pr->Part5Port + 1; -+ } -+ -+ XGI_SetRegByte(DACAddr,0x00); -+ -+ for(i=0; i>= 2; -+ } -+ } -+ -+ if(time == 256) { -+ for(i = 16; i < 32; i++) { -+ data = table[i]; -+ if(shiftflag) data <<= 2; -+ for(k = 0; k < 3; k++) XGI_SetRegByte(DACData, data); -+ } -+ si = 32; -+ for(m = 0; m < 9; m++) { -+ di = si; -+ bx = si + 4; -+ 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(DACData, shiftflag, dl, ah, al, dh); -+ } -+ si -= 2; -+ for(o = 0; o < 3; o++) { -+ dh = table[bx]; -+ ah = table[di]; -+ al = table[si]; -+ si--; -+ XGI_WriteDAC(DACData, shiftflag, dl, ah, al, dh); -+ } -+ dl++; -+ } /* for n < 3 */ -+ si += 5; -+ } /* for m < 9 */ -+ } -+} -+ -+/*********************************************/ -+/* SET CRT1 REGISTER GROUP */ -+/*********************************************/ -+ -+static void -+XGI_New_SetCRT1Group(VB_DEVICE_INFO *XGI_Pr, PXGI_HW_DEVICE_INFO HwInfo, -+ USHORT ModeNo, USHORT ModeIdIndex) -+{ -+ const USHORT StandTableIndex = XGI_GetModePtr(XGI_Pr->SModeIDTable, -+ XGI_Pr->ModeType, -+ ModeNo, ModeIdIndex); -+ USHORT RefreshRateTableIndex = 0; -+ -+ -+/* -+ if(XGI_Pr->SetFlag & LowModeTests) { -+ if(XGI_Pr->VBInfo & (SetSimuScanMode | SwitchToCRT2)) { -+ XGI_New_DisableBridge(XGI_Pr, HwInfo); -+ } -+ } -+*/ -+ XGI_SetSeqRegs(StandTableIndex, XGI_Pr); -+ XGI_SetMiscRegs(StandTableIndex, XGI_Pr); -+ XGI_SetCRTCRegs(StandTableIndex, XGI_Pr); -+ XGI_SetATTRegs(ModeNo, StandTableIndex, ModeIdIndex, XGI_Pr); -+ XGI_SetGRCRegs(StandTableIndex, XGI_Pr); -+ XGI_ClearExt1Regs(ModeNo, XGI_Pr); -+ XGI_ResetCRT1VCLK(XGI_Pr, HwInfo); -+ -+ XGI_Pr->SetFlag &= (~ProgrammingCRT2); -+ -+#ifdef LINUX_XF86 -+ xf86DrvMsgVerb(0, X_PROBED, 4, "(init: VBType=0x%04x, VBInfo=0x%04x)\n", -+ XGI_Pr->VBType, XGI_Pr->VBInfo); -+#endif -+ -+ if(XGI_Pr->VBInfo & SetSimuScanMode) { -+ if(XGI_Pr->VBInfo & SetInSlaveMode) { -+ XGI_Pr->SetFlag |= ProgrammingCRT2; -+ } -+ } -+ -+ if(XGI_Pr->VBInfo & SetCRT2ToLCDA) { -+ XGI_Pr->SetFlag |= ProgrammingCRT2; -+ } -+ -+ if(!(XGI_Pr->VBInfo & SetCRT2ToLCDA)) { -+ XGI_Pr->SetFlag &= ~ProgrammingCRT2; -+ } -+ -+ if(RefreshRateTableIndex != 0xFFFF) { -+ XGI_SetSync(RefreshRateTableIndex, XGI_Pr); -+ XGI_New_SetCRT1CRTC(XGI_Pr, ModeNo, ModeIdIndex, RefreshRateTableIndex, HwInfo); -+ XGI_New_SetCRT1Offset(XGI_Pr, ModeNo, ModeIdIndex, RefreshRateTableIndex, HwInfo); -+ XGI_New_SetCRT1VCLK(XGI_Pr, ModeNo, ModeIdIndex, HwInfo, RefreshRateTableIndex); -+ } -+ -+ XGI_New_SetCRT1ModeRegs(XGI_Pr, HwInfo, ModeNo, ModeIdIndex, RefreshRateTableIndex); -+ -+ XGI_New_LoadDAC(XGI_Pr, HwInfo, ModeNo, ModeIdIndex); -+} -+ -+ -+/*********************************************/ -+/* XFree86: SET SCREEN PITCH */ -+/*********************************************/ -+ -+#ifdef LINUX_XF86 -+static void -+XGI_SetPitchCRT1(VB_DEVICE_INFO *XGI_Pr, ScrnInfoPtr pScrn) -+{ -+ XGIPtr pXGI = XGIPTR(pScrn); -+ UShort HDisplay = pXGI->scrnPitch >> 3; -+ -+ XGI_SetReg(XGI_Pr->P3d4,0x13,(HDisplay & 0xFF)); -+ XGI_SetRegANDOR(XGI_Pr->P3c4,0x0E,0xF0,(HDisplay>>8)); -+} -+#endif -+ -+/*********************************************/ -+/* XFree86: XGIBIOSSetMode() */ -+/* for non-Dual-Head mode */ -+/*********************************************/ -+ -+#ifdef LINUX_XF86 -+BOOLEAN -+XGIBIOSSetMode(VB_DEVICE_INFO *XGI_Pr, PXGI_HW_DEVICE_INFO HwInfo, -+ ScrnInfoPtr pScrn, DisplayModePtr mode) -+{ -+ XGIPtr pXGI = XGIPTR(pScrn); -+ UShort ModeNo=0; -+ BOOLEAN SetModeRet = FALSE ; -+ UShort HDisplay = pXGI->scrnOffset >> 3 ; -+ -+ ModeNo = XGI_CalcModeIndex(pScrn, mode, pXGI->VBFlags); -+ if(!ModeNo) return FALSE; -+ -+ xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 3, "Setting standard mode 0x%x\n", ModeNo); -+ -+#if XGI_USING_BIOS_SETMODE -+ PDEBUG(ErrorF("XGI_USING_BIOS_SETMODE \n")); -+ if ((pXGI->pVbe != NULL) && (pXGI->pVbe->pInt10 != NULL)) { -+ xf86Int10InfoPtr pInt = pXGI->pVbe->pInt10; -+ -+ if (xf86LoadSubModule(pScrn, "int10")) { -+ pInt->num = 0x10; -+ pInt->ax = 0x80 | ModeNo; -+ -+ /* ah = 0, set mode */ -+ xf86ExecX86int10(pInt); -+ SetModeRet = ((pInt->ax & 0x7f) == ModeNo); -+ } -+ } -+ else -+#endif -+ { -+ PDEBUG(ErrorF("XGI_USING_C_code_SETMODE \n")); -+ /* Jong 08/21/2007; support external modeline in X configuration file */ -+ /* ------------------------------------------------------------------ */ -+ HwInfo->BPP = pScrn->bitsPerPixel; -+ HwInfo->Frequency = mode->VRefresh; -+ HwInfo->Horizontal_ACTIVE = mode->HDisplay; -+ HwInfo->Vertical_ACTIVE = mode->VDisplay; -+ HwInfo->Interlace=FALSE; -+ -+ if(mode->type == M_T_USERDEF) /* custom mode */ -+ { -+ HwInfo->SpecifyTiming = TRUE; -+ HwInfo->Horizontal_FP = mode->HSyncStart - mode->HDisplay; /* HSyncStart - HDisplay */ -+ HwInfo->Horizontal_BP = mode->HTotal - mode->HSyncEnd; /* HTotal - HSyncEnd */ -+ HwInfo->Horizontal_SYNC = mode->HSyncEnd - mode->HSyncStart; /* HSyncEnd - HSyncStart */ -+ HwInfo->Vertical_FP = mode->VSyncStart - mode->VDisplay; -+ HwInfo->Vertical_BP = mode->VTotal - mode->VSyncEnd; -+ HwInfo->Vertical_SYNC = mode->VSyncEnd - mode->VSyncStart; -+ HwInfo->DCLK = mode->Clock; -+ } -+ else -+ { -+ HwInfo->SpecifyTiming = FALSE; -+ } -+ /* ------------------------------------------------------------------ */ -+ -+ SetModeRet = XGISetModeNew(HwInfo, XGI_Pr, ModeNo); -+ PDEBUG(ErrorF("out_of_C_code_SETMODE \n")); -+ } -+ -+ -+ /* SetPitch: Adapt to virtual size & position */ -+ if (ModeNo > 0x13) { -+ XGI_SetReg(XGI_Pr->Part1Port, 0x2f, 1); //yilin for crt2pitch it shoude modify if not colone mode -+ XGI_SetReg(XGI_Pr->Part1Port, 0x07, (HDisplay & 0xFF)); -+ XGI_SetRegANDOR(XGI_Pr->Part1Port, 0x09, 0xF0, (HDisplay>>8)); -+ -+ XGI_SetReg(XGI_Pr->P3d4,0x13,(HDisplay & 0xFF)); -+ XGI_SetRegANDOR(XGI_Pr->P3c4,0x0E,0xF0,(HDisplay>>8)); -+ } -+ -+ return SetModeRet; -+} -+ -+/*********************************************/ -+/* XFree86: XGIBIOSSetModeCRT1() */ -+/* for Dual-Head modes */ -+/*********************************************/ -+ -+BOOLEAN -+XGIBIOSSetModeCRT1(VB_DEVICE_INFO *XGI_Pr, PXGI_HW_DEVICE_INFO HwInfo, -+ ScrnInfoPtr pScrn, DisplayModePtr mode) -+{ -+ XGIPtr pXGI = XGIPTR(pScrn); -+ USHORT ModeIdIndex, ModeNo=0; -+ UCHAR backupreg=0; -+ unsigned vga_info; -+ XGIEntPtr pXGIEnt = ENTITY_PRIVATE(pXGI); -+ UCHAR backupcr30, backupcr31, backupcr38, backupcr35, backupp40d=0; -+ -+ -+ ModeNo = XGI_CalcModeIndex(pScrn, mode, pXGI->VBFlags); -+ if(!ModeNo) return FALSE; -+ -+ xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 3, -+ "Setting standard mode 0x%x on CRT1\n", ModeNo); -+ -+#if (defined(i386) || defined(__i386) || defined(__i386__) || defined(__AMD64__)) -+ vga_info = XGI_GetSetBIOSScratch(pScrn, 0x489, 0xff); -+#else -+ vga_info = 0x11; -+#endif -+ XGIInitPCIetc(XGI_Pr, HwInfo); -+ -+ XGI_SetReg(XGI_Pr->P3c4,0x05,0x86); -+ -+ if (!XGI_SearchModeID(XGI_Pr->SModeIDTable, XGI_Pr->EModeIDTable, -+ vga_info, &ModeNo, &ModeIdIndex)) { -+ return FALSE; -+ } -+ -+ /* Determine VBType */ -+ XGI_New_GetVBType(XGI_Pr, HwInfo); -+ -+ if (XGI_Pr->VBType & VB_XGI301BLV302BLV) { -+ backupreg = XGI_GetReg(XGI_Pr->P3d4,0x38); -+ } -+ -+ /* Get VB information (connectors, connected devices) */ -+ /* (We don't care if the current mode is a CRT2 mode) */ -+ XGI_SetLowModeTest(XGI_Pr, ModeNo, HwInfo); -+ -+ /* Set mode on CRT1 */ -+ XGI_New_SetCRT1Group(XGI_Pr, HwInfo, ModeNo, ModeIdIndex); -+ /* SetPitch: Adapt to virtual size & position */ -+ XGI_SetPitchCRT1(XGI_Pr, pScrn); -+ -+ -+ /* Reset CRT2 if changing mode on CRT1 */ -+ if(IS_DUAL_HEAD(pXGI)) { -+ if(pXGIEnt->CRT2ModeNo != -1) { -+ xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 3, -+ "(Re-)Setting mode for CRT2\n"); -+ backupcr30 = XGI_GetReg(XGI_Pr->P3d4,0x30); -+ backupcr31 = XGI_GetReg(XGI_Pr->P3d4,0x31); -+ backupcr35 = XGI_GetReg(XGI_Pr->P3d4,0x35); -+ backupcr38 = XGI_GetReg(XGI_Pr->P3d4,0x38); -+ if(XGI_Pr->VBType & VB_XGIVB) { -+ /* Backup LUT-enable */ -+ if(pXGIEnt->CRT2ModeSet) { -+ backupp40d = XGI_GetReg(XGI_Pr->Part4Port,0x0d) & 0x08; -+ } -+ } -+ if(XGI_Pr->VBInfo & SetCRT2ToLCDA) { -+ XGI_SetReg(XGI_Pr->P3d4,0x30,pXGIEnt->CRT2CR30); -+ XGI_SetReg(XGI_Pr->P3d4,0x31,pXGIEnt->CRT2CR31); -+ XGI_SetReg(XGI_Pr->P3d4,0x35,pXGIEnt->CRT2CR35); -+ XGI_SetReg(XGI_Pr->P3d4,0x38,pXGIEnt->CRT2CR38); -+ } -+ -+ XGI_SetReg(XGI_Pr->P3d4,0x30,backupcr30); -+ XGI_SetReg(XGI_Pr->P3d4,0x31,backupcr31); -+ XGI_SetReg(XGI_Pr->P3d4,0x35,backupcr35); -+ XGI_SetReg(XGI_Pr->P3d4,0x38,backupcr38); -+ if(XGI_Pr->VBType & VB_XGIVB) { -+ XGI_SetRegANDOR(XGI_Pr->Part4Port,0x0d, ~0x08, backupp40d); -+ } -+ } -+ } -+ -+ /* Warning: From here, the custom mode entries in XGI_Pr are -+ * possibly overwritten -+ */ -+ -+ XGI_HandleCRT1(XGI_Pr); -+ -+ XGI_New_DisplayOn(XGI_Pr); -+ XGI_SetRegByte(XGI_Pr->P3c6,0xFF); -+ -+ /* Backup/Set ModeNo in BIOS scratch area */ -+ XGI_GetSetModeID(pScrn,ModeNo); -+ -+ return TRUE; -+} -+#endif /* Linux_XF86 */ -diff --git a/src/init.h b/src/init.h -index 5e668dc..32f61ee 100644 ---- a/src/init.h -+++ b/src/init.h -@@ -84,6 +84,7 @@ - /* Mode numbers */ - static const USHORT ModeIndex_320x200[] = {0x59, 0x41, 0x00, 0x4f}; - static const USHORT ModeIndex_320x240[] = {0x50, 0x56, 0x00, 0x53}; -+static const USHORT ModeIndex_320x240_FSTN[] = {0x5a, 0x5b, 0x00, 0x00}; /* FSTN */ - static const USHORT ModeIndex_400x300[] = {0x51, 0x57, 0x00, 0x54}; - static const USHORT ModeIndex_512x384[] = {0x52, 0x58, 0x00, 0x5c}; - static const USHORT ModeIndex_640x400[] = {0x2f, 0x5d, 0x00, 0x5e}; -diff --git a/src/osdef.h b/src/osdef.h -diff --git a/src/valid_mode.h b/src/valid_mode.h -diff --git a/src/vb_def.h b/src/vb_def.h -index ff7d15d..5f43dd5 100644 ---- a/src/vb_def.h -+++ b/src/vb_def.h -@@ -456,6 +456,11 @@ - #define VB_XGI301LV 0x0008 - #define VB_XGI302LV 0x0010 - #define VB_LVDS_NS 0x0001 /* 3rd party chip */ -+ -+/* Jong 10/04/2007; merge code */ -+#define VB_CH7017 0x0002 -+#define VB_CH7007 0x0080 /* [Billy] 07/05/03 */ -+ - /* #define VB_LVDS_SI 0x0004 */ - - #define ModeInfoFlag 0x0007 -@@ -973,6 +978,19 @@ - #define CHTVVCLK26_2 0x57 - #define CHTVVCLK39 0x58 - #define CHTVVCLK36 0x59 -+ -+/* Jong 10/04/2007; merge code */ -+#define CH7007TVVCLK30_2 0x00 /* [Billy] 2007/05/18 For CH7007 */ -+#define CH7007TVVCLK28_1 0x01 -+#define CH7007TVVCLK43_6 0x02 -+#define CH7007TVVCLK26_4 0x03 -+#define CH7007TVVCLK24_6 0x04 -+#define CH7007TVVCLK47_8 0x05 -+#define CH7007TVVCLK31_5 0x06 -+#define CH7007TVVCLK26_2 0x07 -+#define CH7007TVVCLK39 0x08 -+#define CH7007TVVCLK36 0x09 -+ - #define RES320x200 0x00 - #define RES320x240 0x01 - #define RES400x300 0x02 -diff --git a/src/vb_ext.c b/src/vb_ext.c -index fa2a4f3..e8a16ce 100644 ---- a/src/vb_ext.c -+++ b/src/vb_ext.c -@@ -76,6 +76,25 @@ static int XGINew_Is301B(PVB_DEVICE_INFO pVBInfo) - return !(XGI_GetReg((XGIIOADDRESS)pVBInfo->Part4Port, 0x01) > 0x0B0); - } - -+/* --------------------------------------------------------------------- */ -+/* Function : XGI_Is301C */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+BOOLEAN XGI_Is301C( PVB_DEVICE_INFO pVBInfo ) -+{ -+ if ( ( XGI_GetReg( (XGIIOADDRESS) pVBInfo->Part4Port , 0x01 ) & 0xF0 ) == 0xC0 ) -+ return( 1 ) ; -+ -+ if ( XGI_GetReg( (XGIIOADDRESS) pVBInfo->Part4Port , 0x01 ) >= 0xD0 ) -+ { -+ if ( XGI_GetReg( (XGIIOADDRESS) pVBInfo->Part4Port , 0x39 ) == 0xE0 ) -+ return( 1 ) ; -+ } -+ -+ return( 0 ) ; -+} - - /* --------------------------------------------------------------------- */ - /* Function : XGINew_Sense */ -diff --git a/src/vb_ext.h b/src/vb_ext.h -index 3477fce..9aaf447 100644 ---- a/src/vb_ext.h -+++ b/src/vb_ext.h -@@ -27,7 +27,34 @@ - #ifndef _VBEXT_ - #define _VBEXT_ - -+/* Jong 10/04/2007; merge code */ -+struct DWORDREGS { -+ ULONG Eax, Ebx, Ecx, Edx, Esi, Edi, Ebp; -+}; -+ -+/* Jong 10/04/2007; merge code */ -+struct WORDREGS { -+ USHORT ax, hi_ax, bx, hi_bx, cx, hi_cx, dx, hi_dx, si, hi_si, di ,hi_di, bp, hi_bp; -+}; -+ -+/* Jong 10/04/2007; merge code */ -+struct BYTEREGS { -+ UCHAR al, ah, hi_al, hi_ah, bl, bh, hi_bl, hi_bh, cl, ch, hi_cl, hi_ch, dl, dh, hi_dl, hi_dh; -+}; -+ -+/* Jong 10/04/2007; merge code */ -+typedef union _X86_REGS { -+ struct DWORDREGS e; -+ struct WORDREGS x; -+ struct BYTEREGS h; -+} X86_REGS, *PX86_REGS; -+ - extern void XGI_GetSenseStatus(PXGI_HW_DEVICE_INFO HwDeviceExtension, - PVB_DEVICE_INFO pVBInfo); - -+/* Jong 10/04/2007; merge code */ -+extern void XGINew_SetModeScratch ( PXGI_HW_DEVICE_INFO HwDeviceExtension , PVB_DEVICE_INFO pVBInfo ) ; -+extern void ReadVBIOSTablData( UCHAR ChipType , PVB_DEVICE_INFO pVBInfo); -+extern USHORT XGINew_SenseLCD(PXGI_HW_DEVICE_INFO,PVB_DEVICE_INFO pVBInfo); -+ - #endif -diff --git a/src/vb_init.c b/src/vb_init.c -index 9ba85bb..7e4ba77 100644 ---- a/src/vb_init.c -+++ b/src/vb_init.c -@@ -1,2960 +1,3742 @@ --/* Copyright (C) 2003-2006 by XGI Technology, Taiwan. -- * -- * All Rights Reserved. -- * -- * Permission is hereby granted, free of charge, to any person obtaining -- * a copy of this software and associated documentation files (the -- * "Software"), to deal in the Software without restriction, including -- * without limitation on the rights to use, copy, modify, merge, -- * publish, distribute, sublicense, and/or sell copies of the Software, -- * and to permit persons to whom the Software is furnished to do so, -- * subject to the following conditions: -- * -- * The above copyright notice and this permission notice (including the -- * next paragraph) shall be included in all copies or substantial -- * portions of the Software. -- * -- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -- * NON-INFRINGEMENT. IN NO EVENT SHALL XGI AND/OR -- * ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -- * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -- * DEALINGS IN THE SOFTWARE. -- */ --#ifdef HAVE_CONFIG_H --#include "config.h" --#endif -- --#include "osdef.h" --#include "vgatypes.h" -- -- --#ifdef LINUX_KERNEL --#include --#include --#include /* udelay */ --#include "XGIfb.h" --#endif -- --#include "vb_def.h" --#include "vb_struct.h" --#include "vb_setmode.h" --#include "vb_init.h" --#include "vb_ext.h" -- --#ifdef LINUX_XF86 --#include "xf86.h" --#include "xf86PciInfo.h" --#include "xgi.h" --#include "xgi_regs.h" --#endif -- --#ifdef LINUX_KERNEL --#include --#include --#endif -- -- -- -- --static UCHAR XGINew_ChannelAB; --static UCHAR XGINew_DataBusWidth; -- --USHORT XGINew_DRAMType[17][5]={{0x0C,0x0A,0x02,0x40,0x39},{0x0D,0x0A,0x01,0x40,0x48}, -- {0x0C,0x09,0x02,0x20,0x35},{0x0D,0x09,0x01,0x20,0x44}, -- {0x0C,0x08,0x02,0x10,0x31},{0x0D,0x08,0x01,0x10,0x40}, -- {0x0C,0x0A,0x01,0x20,0x34},{0x0C,0x09,0x01,0x08,0x32}, -- {0x0B,0x08,0x02,0x08,0x21},{0x0C,0x08,0x01,0x08,0x30}, -- {0x0A,0x08,0x02,0x04,0x11},{0x0B,0x0A,0x01,0x10,0x28}, -- {0x09,0x08,0x02,0x02,0x01},{0x0B,0x09,0x01,0x08,0x24}, -- {0x0B,0x08,0x01,0x04,0x20},{0x0A,0x08,0x01,0x02,0x10}, -- {0x09,0x08,0x01,0x01,0x00}}; -- --static const USHORT XGINew_SDRDRAM_TYPE[13][5]= --{ -- { 2,12, 9,64,0x35}, -- { 1,13, 9,64,0x44}, -- { 2,12, 8,32,0x31}, -- { 2,11, 9,32,0x25}, -- { 1,12, 9,32,0x34}, -- { 1,13, 8,32,0x40}, -- { 2,11, 8,16,0x21}, -- { 1,12, 8,16,0x30}, -- { 1,11, 9,16,0x24}, -- { 1,11, 8, 8,0x20}, -- { 2, 9, 8, 4,0x01}, -- { 1,10, 8, 4,0x10}, -- { 1, 9, 8, 2,0x00} --}; -- --static const USHORT XGINew_DDRDRAM_TYPE[4][5]= --{ -- { 2,12, 9,64,0x35}, -- { 2,12, 8,32,0x31}, -- { 2,11, 8,16,0x21}, -- { 2, 9, 8, 4,0x01} --}; -- --static const USHORT XGINew_DDRDRAM_TYPE340[4][5]= --{ -- { 2,13, 9,64,0x45}, -- { 2,12, 9,32,0x35}, -- { 2,12, 8,16,0x31}, -- { 2,11, 8, 8,0x21} --}; -- --static void XGINew_SetDRAMSize_340(PXGI_HW_DEVICE_INFO, PVB_DEVICE_INFO); --static void XGINew_SetDRAMSize_XG45(PXGI_HW_DEVICE_INFO, PVB_DEVICE_INFO); --static void XGINew_SetMemoryClock(PXGI_HW_DEVICE_INFO, PVB_DEVICE_INFO); --static void XGINew_SetDRAMModeRegister340(PXGI_HW_DEVICE_INFO, PVB_DEVICE_INFO); --static void XGINew_SetDRAMDefaultRegister340(PXGI_HW_DEVICE_INFO, USHORT, -- PVB_DEVICE_INFO); --static void XGINew_SetDRAMDefaultRegisterXG45(PXGI_HW_DEVICE_INFO, USHORT, -- PVB_DEVICE_INFO); --static UCHAR XGINew_Get340DRAMType(PXGI_HW_DEVICE_INFO, PVB_DEVICE_INFO); -- --static int XGINew_SetDDRChannel(int index, UCHAR ChannelNo, -- UCHAR XGINew_ChannelAB, const USHORT DRAMTYPE_TABLE[][5], -- PVB_DEVICE_INFO pVBInfo); -- --static void XGINew_SetDRAMSizingType(int index , -- const USHORT DRAMTYPE_TABLE[][5], PVB_DEVICE_INFO pVBInfo); --static USHORT XGINew_SetDRAMSizeReg(int index, -- const USHORT DRAMTYPE_TABLE[][5], PVB_DEVICE_INFO pVBInfo); -- --static int XGINew_SetRank(int index, UCHAR RankNo, UCHAR XGINew_ChannelAB, -- const USHORT DRAMTYPE_TABLE[][5], PVB_DEVICE_INFO pVBInfo); -- --static int XGINew_CheckRanks(int RankNo, int index, -- const USHORT DRAMTYPE_TABLE[][5], PVB_DEVICE_INFO pVBInfo); --static int XGINew_CheckRank(int RankNo, int index, -- const USHORT DRAMTYPE_TABLE[][5], PVB_DEVICE_INFO pVBInfo); --static int XGINew_CheckDDRRank(int RankNo, int index, -- const USHORT DRAMTYPE_TABLE[][5], PVB_DEVICE_INFO pVBInfo); --static int XGINew_CheckDDRRanks(int RankNo, int index, -- const USHORT DRAMTYPE_TABLE[][5], PVB_DEVICE_INFO pVBInfo); -- --static int XGINew_CheckBanks(int index, const USHORT DRAMTYPE_TABLE[][5], -- PVB_DEVICE_INFO pVBInfo); --static int XGINew_CheckColumn(int index, const USHORT DRAMTYPE_TABLE[][5], -- PVB_DEVICE_INFO pVBInfo); -- --static int XGINew_DDRSizing340(PXGI_HW_DEVICE_INFO, PVB_DEVICE_INFO); --static int XGINew_DDRSizingXG45(PXGI_HW_DEVICE_INFO, PVB_DEVICE_INFO); --static int XGINew_SDRSizing(PVB_DEVICE_INFO); --static int XGINew_DDRSizing(PVB_DEVICE_INFO); -- --static void XGINew_DDR_MRS(PVB_DEVICE_INFO pVBInfo); --static void XGINew_SDR_MRS(PVB_DEVICE_INFO pVBInfo); --static void XGINew_DDR1x_MRS_340(PXGI_HW_DEVICE_INFO HwDeviceExtension, -- USHORT P3c4, PVB_DEVICE_INFO pVBInfo); --static void XGINew_DDR2x_MRS_340(PXGI_HW_DEVICE_INFO HwDeviceExtension, -- USHORT P3c4, PVB_DEVICE_INFO pVBInfo); --static void XGINew_DDR2_MRS_340(PXGI_HW_DEVICE_INFO HwDeviceExtension, -- USHORT P3c4, PVB_DEVICE_INFO pVBInfo); --static void XGINew_DDR1x_DefaultRegister(PXGI_HW_DEVICE_INFO HwDeviceExtension, -- USHORT Port, PVB_DEVICE_INFO pVBInfo); --static void XGINew_DDR2x_DefaultRegister(PXGI_HW_DEVICE_INFO HwDeviceExtension, -- USHORT Port, PVB_DEVICE_INFO pVBInfo); --static void XGINew_DDR2_DefaultRegister(PXGI_HW_DEVICE_INFO HwDeviceExtension, -- USHORT Port, PVB_DEVICE_INFO pVBInfo); -- --static void XGINew_DisableChannelInterleaving(int index, -- const USHORT XGINew_DDRDRAM_TYPE[][5], PVB_DEVICE_INFO pVBInfo); -- --static void DualChipInit(PXGI_HW_DEVICE_INFO, PVB_DEVICE_INFO); -- --static void XGINew_DisableRefresh(PXGI_HW_DEVICE_INFO ,PVB_DEVICE_INFO); --static void XGINew_EnableRefresh(PXGI_HW_DEVICE_INFO, PVB_DEVICE_INFO); -- --static void XGINew_Delay15us(ULONG); --static void SetPowerConsume(PXGI_HW_DEVICE_INFO, USHORT); --static void XGINew_DDR1x_MRS_XG20(USHORT, PVB_DEVICE_INFO); --static void XGINew_SetDRAMModeRegister_XG20(PXGI_HW_DEVICE_INFO, PVB_DEVICE_INFO); --static void XGINew_ChkSenseStatus(PXGI_HW_DEVICE_INFO, PVB_DEVICE_INFO); -- --static int XGINew_ReadWriteRest( USHORT StopAddr, USHORT StartAddr, -- PVB_DEVICE_INFO pVBInfo); --static int XGI45New_ReadWriteRest(USHORT StopAddr, USHORT StartAddr, -- PVB_DEVICE_INFO pVBInfo); --static UCHAR XGINew_CheckFrequence(PVB_DEVICE_INFO pVBInfo); --static void XGINew_CheckChannel(PXGI_HW_DEVICE_INFO HwDeviceExtension, -- PVB_DEVICE_INFO pVBInfo); -- --static int XGINew_RAMType; /*int ModeIDOffset,StandTable,CRT1Table,ScreenOffset,REFIndex;*/ --static ULONG UNIROM; /* UNIROM */ -- -- --#ifdef LINUX_KERNEL --void DelayUS(ULONG MicroSeconds) --{ -- udelay(MicroSeconds); --} --#endif -- --/* --------------------------------------------------------------------- */ --/* Function : XGIInitNew */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --BOOLEAN XGIInitNew(PXGI_HW_DEVICE_INFO HwDeviceExtension, -- PVB_DEVICE_INFO pVBInfo) --{ --#ifndef LINUX_XF86 -- USHORT Mclockdata[ 30 ] , Eclockdata[ 30 ] ; -- UCHAR j , SR11 , SR17 = 0 , SR18 = 0 , SR19 = 0 ; -- UCHAR CR37 = 0 , CR38 = 0 , CR79 = 0 , CR7A = 0 , -- CR7B = 0 , CR36 = 0 , CR78 = 0 , CR3C = 0 , -- CR3D = 0 , CR3E = 0 , CR3F = 0 , CR35 = 0 ; --#endif -- UCHAR i , temp = 0 , temp1 , -- VBIOSVersion[ 5 ] ; -- ULONG base,ChipsetID,VendorID,GraphicVendorID; -- PUCHAR volatile pVideoMemory; -- -- /* ULONG j, k ; */ -- -- PXGI_DSReg pSR ; -- -- ULONG Temp ; -- -- -- XGINew_InitVBIOSData(HwDeviceExtension, pVBInfo); -- -- pVideoMemory = ( PUCHAR )pVBInfo->ROMAddr; -- -- -- Newdebugcode( 0x99 ) ; -- -- /* if ( pVBInfo->ROMAddr == 0 ) */ -- /* return( FALSE ) ; */ -- -- if ( pVBInfo->FBAddr == 0 ) -- return( FALSE ) ; -- -- if ( pVBInfo->BaseAddr == 0 ) -- return( FALSE ) ; -- -- XGI_SetRegByte((XGIIOADDRESS) ( USHORT )( pVBInfo->BaseAddr + 0x12 ) , 0x67 ) ; /* 3c2 <- 67 ,ynlai */ -- -- -- if ( !HwDeviceExtension->bIntegratedMMEnabled ) -- return( FALSE ) ; /* alan */ -- -- -- -- XGI_MemoryCopy( VBIOSVersion , HwDeviceExtension->szVBIOSVer , 4 ) ; -- -- VBIOSVersion[ 4 ] = 0x0 ; -- -- -- /* ReadVBIOSData */ -- ReadVBIOSTablData( HwDeviceExtension->jChipType , pVBInfo) ; -- -- /* 1.Openkey */ -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x05 , 0x86 ) ; -- -- -- -- /* 2.Reset Extended register */ -- -- for( i = 0x06 ; i < 0x20 ; i++ ) -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , i , 0 ) ; -- -- for( i = 0x21 ; i <= 0x27 ; i++ ) -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , i , 0 ) ; -- -- /* for( i = 0x06 ; i <= 0x27 ; i++ ) */ -- /* XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , i , 0 ) ; */ -- -- -- if(( HwDeviceExtension->jChipType == XG20 ) || ( HwDeviceExtension->jChipType >= XG40)) -- { -- for( i = 0x31 ; i <= 0x3B ; i++ ) -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , i , 0 ) ; -- } -- else -- { -- for( i = 0x31 ; i <= 0x3D ; i++ ) -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , i , 0 ) ; -- } -- -- if ( HwDeviceExtension->jChipType == XG42 ) /* [Hsuan] 2004/08/20 Auto over driver for XG42 */ -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x3B , 0xC0 ) ; -- -- /* for( i = 0x30 ; i <= 0x3F ; i++ ) */ -- /* XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4 , i , 0 ) ; */ -- -- for( i = 0x79 ; i <= 0x7C ; i++ ) -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4 , i , 0 ) ; /* shampoo 0208 */ -- -- -- -- if ( HwDeviceExtension->jChipType == XG20 ) -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x97, pVBInfo->CR97); -- -- /* 3.SetMemoryClock */ -- if (!(pVBInfo->SoftSetting & SoftDRAMType)) { -- if ( HwDeviceExtension->jChipType == XG20 ) -- { -- temp = ( UCHAR )XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0x97 ) ; -- } -- else if (HwDeviceExtension->jChipType == XG45) -- { -- temp = 0x02 ; -- } -- else -- { -- temp = ( UCHAR )XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x3A ) ; -- } -- } -- -- -- if ( HwDeviceExtension->jChipType == XG20 ) -- XGINew_RAMType = temp & 0x01 ; -- else -- { -- XGINew_RAMType = temp & 0x03 ; /* alan */ -- } -- -- /* Get DRAM type */ -- if ( HwDeviceExtension->jChipType == XG45 ) -- { } -- else if ( HwDeviceExtension->jChipType >= XG40 ) -- XGINew_RAMType = ( int )XGINew_Get340DRAMType( HwDeviceExtension , pVBInfo) ; -- -- if ( UNIROM == 1 ) XGINew_RAMType = 0; -- -- -- if ( HwDeviceExtension->jChipType < XG40 ) -- XGINew_SetMemoryClock( HwDeviceExtension , pVBInfo ) ; -- -- /* 4.SetDefExt1Regs begin */ -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x07, pVBInfo->SR07); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x11, 0x0F); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x1F, pVBInfo->SR1F); -- /* XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x20, 0x20); */ -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x20, 0xA0); /* alan, 2001/6/26 Frame buffer can read/write SR20 */ -- -- -- /* SR11 = 0x0F ; */ -- /* XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x11 , SR11 ) ; */ -- -- -- if ( (HwDeviceExtension->jChipType != XG20) || (HwDeviceExtension->jChipType != XG45) ) /* kuku 2004/06/25 */ -- { -- /* Set AGP Rate */ -- temp1 = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x3B ) ; -- temp1 &= 0x02 ; -- if ( temp1 == 0x02 ) -- { -- XGI_SetRegLong((XGIIOADDRESS) 0xcf8 , 0x80000000 ) ; -- ChipsetID = XGI_GetRegLong((XGIIOADDRESS) 0x0cfc ) ; -- XGI_SetRegLong((XGIIOADDRESS) 0xcf8 , 0x8000002C ) ; -- VendorID = XGI_GetRegLong((XGIIOADDRESS) 0x0cfc ) ; -- VendorID &= 0x0000FFFF ; -- XGI_SetRegLong((XGIIOADDRESS) 0xcf8 , 0x8001002C ) ; -- GraphicVendorID = XGI_GetRegLong((XGIIOADDRESS) 0x0cfc ) ; -- GraphicVendorID &= 0x0000FFFF; -- -- if ( ChipsetID == 0x7301039 ) -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0x5F , 0x09 ) ; -- -- ChipsetID &= 0x0000FFFF ; -- -- if ( ( ChipsetID == 0x700E ) || ( ChipsetID == 0x1022 ) || ( ChipsetID == 0x1106 ) || ( ChipsetID == 0x10DE ) ) -- { -- if ( ChipsetID == 0x1106 ) -- { -- if ( ( VendorID == 0x1019 ) && ( GraphicVendorID == 0x1019 ) ) -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0x5F , 0x0D ) ; -- else -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0x5F , 0x0B ) ; -- } -- else -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0x5F , 0x0B ) ; -- } -- } -- -- if ( HwDeviceExtension->jChipType >= XG40 ) -- { -- /* Set AGP customize registers (in SetDefAGPRegs) Start */ -- for( i = 0x47 ; i <= 0x4C ; i++ ) -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4 , i , pVBInfo->AGPReg[ i - 0x47 ] ) ; -- -- for( i = 0x70 ; i <= 0x71 ; i++ ) -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4 , i , pVBInfo->AGPReg[ 6 + i - 0x70 ] ) ; -- -- for( i = 0x74 ; i <= 0x77 ; i++ ) -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4 , i , pVBInfo->AGPReg[ 8 + i - 0x74 ] ) ; -- /* Set AGP customize registers (in SetDefAGPRegs) End */ -- /*[Hsuan]2004/12/14 AGP Input Delay Adjustment on 850 */ -- XGI_SetRegLong((XGIIOADDRESS) 0xcf8 , 0x80000000 ) ; -- ChipsetID = XGI_GetRegLong((XGIIOADDRESS) 0x0cfc ) ; -- if ( ChipsetID == 0x25308086 ) -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0x77 , 0xF0 ) ; -- -- HwDeviceExtension->pQueryVGAConfigSpace( HwDeviceExtension , 0x50 , 0 , &Temp ) ; /* Get */ -- Temp >>= 20 ; -- Temp &= 0xF ; -- -- if ( Temp == 1 ) -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0x48 , 0x20 ) ; /* CR48 */ -- } -- -- if ( HwDeviceExtension->jChipType < XG40 ) -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0x49 , pVBInfo->CR49[ 0 ] ) ; -- } /* != XG20 */ -- -- /* Set PCI */ -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x23, pVBInfo->SR23); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x24, pVBInfo->SR24); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x25, pVBInfo->SR25[0]); -- -- if ( HwDeviceExtension->jChipType != XG20 ) /* kuku 2004/06/25 */ -- { -- /* Set VB */ -- XGI_UnLockCRT2( HwDeviceExtension, pVBInfo) ; -- XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part0Port , 0x3F , 0xEF , 0x00 ) ; /* alan, disable VideoCapture */ -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port , 0x00 , 0x00 ) ; -- temp1 = ( UCHAR )XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0x7B ) ; /* chk if BCLK>=100MHz */ -- temp = ( UCHAR )( ( temp1 >> 4 ) & 0x0F ) ; -- -- -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x02, -- pVBInfo->CRT2Data_1_2); -- -- -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port , 0x2E , 0x08 ) ; /* use VB */ -- } /* != XG20 */ -- -- -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x27 , 0x1F ) ; -- -- /* Not DDR */ -- if ((HwDeviceExtension->jChipType == XG42) -- && XGINew_Get340DRAMType(HwDeviceExtension, pVBInfo) != 0) { -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x31, (pVBInfo->SR31 & 0x3F) | 0x40); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x32, (pVBInfo->SR32 & 0xFC) | 0x01); -- } -- else { -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x31, pVBInfo->SR31); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x32, pVBInfo->SR32); -- } -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x33, pVBInfo->SR33); -- -- -- -- if ( HwDeviceExtension->jChipType >= XG40 ) -- SetPowerConsume ( HwDeviceExtension , pVBInfo->P3c4); -- -- if ( HwDeviceExtension->jChipType != XG20 ) /* kuku 2004/06/25 */ -- { -- if ( XGI_BridgeIsOn( pVBInfo ) == 1 ) -- { -- { -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x00, 0x1C); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x0D, pVBInfo->CRT2Data_4_D); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x0E, pVBInfo->CRT2Data_4_E); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x10, pVBInfo->CRT2Data_4_10); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x0F, 0x3F); -- } -- -- XGI_LockCRT2( HwDeviceExtension, pVBInfo ) ; -- } -- } /* != XG20 */ -- -- if ( HwDeviceExtension->jChipType < XG40 ) -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0x83 , 0x00 ) ; -- -- -- -- if ( HwDeviceExtension->jChipType >= XG40 ) -- { -- if (HwDeviceExtension->jChipType == XG45) -- XGINew_SetDRAMDefaultRegisterXG45( HwDeviceExtension , pVBInfo->P3d4, pVBInfo ) ; -- else -- XGINew_SetDRAMDefaultRegister340( HwDeviceExtension , pVBInfo->P3d4, pVBInfo ) ; -- -- if ( HwDeviceExtension->bSkipDramSizing == TRUE ) -- { -- pSR = HwDeviceExtension->pSR ; -- if ( pSR!=NULL ) -- { -- while( pSR->jIdx != 0xFF ) -- { -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , pSR->jIdx , pSR->jVal ) ; -- pSR++ ; -- } -- } -- /* XGINew_SetDRAMModeRegister340( pVBInfo ) ; */ -- } /* SkipDramSizing */ -- else -- { --/* if ( HwDeviceExtension->jChipType == XG20 ) -- { -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x13 , pVBInfo->SR15[0][XGINew_RAMType] ) ; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , pVBInfo->SR15[1][XGINew_RAMType] ) ; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x20 , 0x20 ) ; -- } -- else*/ -- if ( HwDeviceExtension->jChipType == XG45 ) -- XGINew_SetDRAMSize_XG45( HwDeviceExtension , pVBInfo) ; -- else -- XGINew_SetDRAMSize_340( HwDeviceExtension , pVBInfo) ; -- } -- } /* XG40 */ -- -- -- -- -- /* SetDefExt2Regs begin */ --/* -- AGP = 1 ; -- temp =( UCHAR )XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x3A ) ; -- temp &= 0x30 ; -- if ( temp == 0x30 ) -- AGP = 0 ; -- -- if ( AGP == 0 ) -- pVBInfo->SR21 &= 0xEF ; -- -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x21 , pVBInfo->SR21 ) ; -- if ( AGP == 1 ) -- pVBInfo->SR22 &= 0x20; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x22 , pVBInfo->SR22 ) ; --*/ -- -- base = 0x80000000; -- XGI_SetRegLong(0xcf8, base); -- Temp = (XGI_GetRegLong(0xcfc) & 0x0000FFFF); -- if (Temp == 0x1039) { -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x22, pVBInfo->SR22 & 0xFE); -- } -- else { -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x22, pVBInfo->SR22); -- } -- -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x21, pVBInfo->SR21); -- -- if ( HwDeviceExtension->jChipType == XG40 ) /* Initialize seconary chip */ -- { -- if ( CheckDualChip(pVBInfo) ) -- DualChipInit( HwDeviceExtension , pVBInfo) ; -- /* SetDefExt2Regs end */ -- } -- -- if ( HwDeviceExtension->bSkipSense == FALSE ) -- { -- XGI_SenseCRT1(pVBInfo) ; -- /* XGINew_DetectMonitor( HwDeviceExtension ) ; */ -- XGI_GetSenseStatus( HwDeviceExtension , pVBInfo ) ; /* sense CRT2 */ -- } -- -- XGINew_ChkSenseStatus ( HwDeviceExtension , pVBInfo ) ; -- XGINew_SetModeScratch ( HwDeviceExtension , pVBInfo ) ; -- -- Newdebugcode( 0x88 ) ; -- -- /* Johnson@062403. To save time for power management. */ -- /* DelayMS(1000); */ -- /* ~Johnson@062403. */ -- /* XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0x32 , 0x28 ) ; //0207 temp */ -- /* XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0x36 , 0x02 ) ; //0207 temp */ -- -- return( TRUE ) ; --} /* end of init */ -- -- -- --/* --------------------------------------------------------------------- */ --/* Function : DualChipInit */ --/* Input : */ --/* Output : */ --/* Description : Initialize the secondary chip. */ --/* --------------------------------------------------------------------- */ --void DualChipInit( PXGI_HW_DEVICE_INFO HwDeviceExtension ,PVB_DEVICE_INFO pVBInfo) --{ --#ifdef LINUX_XF86 -- USHORT BaseAddr2nd = (USHORT)(ULONG)HwDeviceExtension->pj2ndIOAddress ; --#else -- USHORT BaseAddr2nd = (USHORT)HwDeviceExtension->pj2ndIOAddress ; --#endif -- USHORT XGINew_P3C3 = pVBInfo->BaseAddr + VIDEO_SUBSYSTEM_ENABLE_PORT ; -- USHORT XGINew_P3CC = pVBInfo->BaseAddr + MISC_OUTPUT_REG_READ_PORT ; -- USHORT XGINew_2ndP3C3 = BaseAddr2nd + VIDEO_SUBSYSTEM_ENABLE_PORT ; -- USHORT XGINew_2ndP3D4 = BaseAddr2nd + CRTC_ADDRESS_PORT_COLOR ; -- USHORT XGINew_2ndP3C4 = BaseAddr2nd + SEQ_ADDRESS_PORT ; -- USHORT XGINew_2ndP3C2 = BaseAddr2nd + MISC_OUTPUT_REG_WRITE_PORT ; -- ULONG Temp ; -- UCHAR tempal , i ; -- -- pVBInfo->ROMAddr = HwDeviceExtension->pjVirtualRomBase ; -- pVBInfo->BaseAddr = (USHORT)HwDeviceExtension->pjIOAddress ; -- /* Programming Congiguration Space in Secondary Chip */ -- /* set CRA1 D[6] = 1 */ -- XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4 , 0xA1 , 0xBF , 0x40 ) ; -- -- /* Write 2nd Chip Configuration Info into Configuration Space */ -- /* Command CNFG04 */ -- HwDeviceExtension->pQueryVGAConfigSpace( HwDeviceExtension , PCI_COMMAND , 0 , &Temp ) ; /* Get */ -- HwDeviceExtension->pQueryVGAConfigSpace( HwDeviceExtension , PCI_COMMAND + 0x80 , 1 , &Temp ) ; /* Set */ -- /* Latency Timer CNFG0C */ -- HwDeviceExtension->pQueryVGAConfigSpace( HwDeviceExtension , 0x0c , 0 , &Temp ) ; /* Get */ -- HwDeviceExtension->pQueryVGAConfigSpace( HwDeviceExtension , 0x0c + 0x80 , 1 , &Temp ) ; /* Set */ -- /* Linear space */ -- HwDeviceExtension->pQueryVGAConfigSpace( HwDeviceExtension , 0x10 , 0 , &Temp ) ; /* Get */ -- HwDeviceExtension->pQueryVGAConfigSpace( HwDeviceExtension , 0x10 + 0x80 , 1 , &Temp ) ; /* Set */ -- /* MMIO space */ -- HwDeviceExtension->pQueryVGAConfigSpace( HwDeviceExtension , 0x14 , 0 , &Temp ) ; /* Get */ -- Temp += 0x40000; -- HwDeviceExtension->pQueryVGAConfigSpace( HwDeviceExtension , 0x14 + 0x80 , 1 , &Temp ) ; /* Set */ -- /* Relocated IO space */ -- HwDeviceExtension->pQueryVGAConfigSpace( HwDeviceExtension , 0x18 , 0 , &Temp ) ; /* Get */ -- Temp += 0x80; -- HwDeviceExtension->pQueryVGAConfigSpace( HwDeviceExtension , 0x18 + 0x80 , 1 , &Temp ) ; /* Set */ -- /* Miscellaneous reg(input port 3cch,output port 3c2h) */ -- tempal = XGI_GetRegByte((XGIIOADDRESS) XGINew_P3CC ) ; /* 3cc */ -- XGI_SetRegByte((XGIIOADDRESS) XGINew_2ndP3C2 , tempal ) ; -- /* VGA enable reg(port 3C3h) */ -- tempal = XGI_GetRegByte((XGIIOADDRESS) XGINew_P3C3 ) ; /* 3c3 */ -- XGI_SetRegByte((XGIIOADDRESS) XGINew_2ndP3C3 , tempal ) ; -- SetPowerConsume ( HwDeviceExtension , XGINew_2ndP3D4); -- /* ----- CRA0=42, CRA1=81, CRA2=60, CRA3=20, CRA4=50, CRA5=40, CRA8=88 -----// */ -- /* ----- CRA9=10, CRAA=80, CRAB=01, CRAC=F1, CRAE=80, CRAF=45, CRB7=24 -----// */ -- /* primary chip */ -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0xA0 , 0x72 ) ; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0xA1 , 0x81 ) ; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0xA2 , 0x60 ) ; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0xA3 , 0x20 ) ; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0xA4 , 0x50 ) ; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0xA5 , 0x40 ) ; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0xA8 , 0x88 ) ; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0xA9 , 0x10 ) ; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0xAA , 0x80 ) ; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0xAB , 0x01 ) ; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0xAC , 0xF1 ) ; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0xAE , 0x80 ) ; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0xAF , 0x45 ) ; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0xB7 , 0x24 ) ; -- -- /* secondary chip */ -- XGI_SetReg((XGIIOADDRESS) XGINew_2ndP3D4 , 0xA0 , 0x72 ) ; -- XGI_SetReg((XGIIOADDRESS) XGINew_2ndP3D4 , 0xA1 , 0x81 ) ; -- XGI_SetReg((XGIIOADDRESS) XGINew_2ndP3D4 , 0xA2 , 0x60 ) ; -- XGI_SetReg((XGIIOADDRESS) XGINew_2ndP3D4 , 0xA3 , 0x20 ) ; -- XGI_SetReg((XGIIOADDRESS) XGINew_2ndP3D4 , 0xA4 , 0x50 ) ; -- XGI_SetReg((XGIIOADDRESS) XGINew_2ndP3D4 , 0xA5 , 0x40 ) ; -- XGI_SetReg((XGIIOADDRESS) XGINew_2ndP3D4 , 0xA8 , 0x88 ) ; -- XGI_SetReg((XGIIOADDRESS) XGINew_2ndP3D4 , 0xA9 , 0x10 ) ; -- XGI_SetReg((XGIIOADDRESS) XGINew_2ndP3D4 , 0xAA , 0x80 ) ; -- XGI_SetReg((XGIIOADDRESS) XGINew_2ndP3D4 , 0xAB , 0x01 ) ; -- XGI_SetReg((XGIIOADDRESS) XGINew_2ndP3D4 , 0xAC , 0xF1 ) ; -- XGI_SetReg((XGIIOADDRESS) XGINew_2ndP3D4 , 0xAE , 0x80 ) ; -- XGI_SetReg((XGIIOADDRESS) XGINew_2ndP3D4 , 0xAF , 0x45 ) ; -- XGI_SetReg((XGIIOADDRESS) XGINew_2ndP3D4 , 0xB7 , 0x24 ) ; -- -- /* 06/20/2003 [christine] CRT threshold setting request */ -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0x78 , 0x40 ) ; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0x79 , 0x0C ) ; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0x7A , 0x34 ) ; -- -- /* OpenKey in 2nd chip */ -- XGI_SetReg((XGIIOADDRESS) XGINew_2ndP3C4 , 0x05 , 0x86 ) ; -- -- /* Set PCI registers */ -- tempal = (UCHAR)XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x06 ) ; -- XGI_SetReg((XGIIOADDRESS) XGINew_2ndP3C4 , 0x06 , tempal ) ; -- -- for( i = 0x20 ; i <= 0x25 ; i++ ) -- { -- tempal = ( UCHAR )XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4 , i ) ; -- XGI_SetReg((XGIIOADDRESS) XGINew_2ndP3C4 , i , tempal ) ; -- } -- for(i = 0x31; i <= 0x32; i++ ) -- { -- tempal = ( UCHAR )XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4 , i ) ; -- XGI_SetReg((XGIIOADDRESS) XGINew_2ndP3C4 , i , tempal ) ; -- } -- XGINew_SetDRAMDefaultRegister340( HwDeviceExtension , XGINew_2ndP3D4 , pVBInfo) ; -- -- for(i = 0x13; i <= 0x14; i++ ) -- { -- tempal = ( UCHAR )XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4 , i ) ; -- XGI_SetReg((XGIIOADDRESS) XGINew_2ndP3C4 , i , tempal ) ; -- } -- -- /* Close key in 2nd chip */ -- XGI_SetReg((XGIIOADDRESS) XGINew_2ndP3C4 , 0x05 , 0x00 ) ; --} -- -- -- -- --/* ============== alan ====================== */ -- --/* --------------------------------------------------------------------- */ --/* Function : XGINew_Get340DRAMType */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --UCHAR XGINew_Get340DRAMType( PXGI_HW_DEVICE_INFO HwDeviceExtension , PVB_DEVICE_INFO pVBInfo) --{ -- UCHAR data ; -- -- if ( HwDeviceExtension->jChipType != XG20 ) -- { -- if (pVBInfo->SoftSetting & SoftDRAMType) { -- return (pVBInfo->SoftSetting & 0x07); -- } -- else -- { -- data = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x39 ) & 0x02 ; -- -- if ( data == 0 ) -- data = ( XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x3A ) & 0x02 ) >> 1 ; -- -- return( data ) ; -- } -- } -- else -- { -- data = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0x97 ) & 0x01 ; -- -- if ( data == 1 ) -- data ++ ; -- -- return( data ); -- } --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGINew_Delay15us */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --/* --void XGINew_Delay15us(ULONG ulMicrsoSec) --{ --} --*/ -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGINew_SDR_MRS */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --void XGINew_SDR_MRS(PVB_DEVICE_INFO pVBInfo) --{ -- USHORT data ; -- -- data = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x16 ) ; -- data &= 0x3F ; /* SR16 D7=0,D6=0 */ -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x16 , data ) ; /* enable mode register set(MRS) low */ -- /* XGINew_Delay15us( 0x100 ) ; */ -- data |= 0x80 ; /* SR16 D7=1,D6=0 */ -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x16 , data ) ; /* enable mode register set(MRS) high */ -- /* XGINew_Delay15us( 0x100 ) ; */ --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGINew_DDR1x_MRS_340 */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --void XGINew_DDR1x_MRS_340(PXGI_HW_DEVICE_INFO HwDeviceExtension, USHORT P3c4, -- PVB_DEVICE_INFO pVBInfo) --{ -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x18 , 0x01 ) ; -- if ( HwDeviceExtension->jChipType == XG42 ) /* XG42 BA0 & BA1 layout change */ -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x19 , 0x40 ) ; -- else -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x19 , 0x20 ) ; -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x16 , 0x00 ) ; -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x16 , 0x80 ) ; -- -- /* Samsung F Die */ -- if (pVBInfo->DRAMTypeDefinition != 0x0C) { -- DelayUS( 3000 ) ; /* Delay 67 x 3 Delay15us */ -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x18 , 0x00 ) ; -- if ( HwDeviceExtension->jChipType == XG42 ) -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x19 , 0x40 ) ; -- else -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x19 , 0x20 ) ; -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x16 , 0x00 ) ; -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x16 , 0x80 ) ; -- } -- -- DelayUS( 60 ) ; -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x18 , pVBInfo->SR15[ 2 ][ XGINew_RAMType ] ) ; /* SR18 */ -- -- if (HwDeviceExtension->jChipType == XG45) -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x19 , 0x01 ) ; /*TSop DRAM DLL pin jump to A9*/ -- else -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x19 , 0x02 ) ; /*TSop DRAM DLL pin jump to A9*/ -- -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x16 , pVBInfo->SR16[ 0 ] ) ; -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x16 , pVBInfo->SR16[ 1 ] ) ; -- DelayUS( 1000 ) ; -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x1B , 0x03 ) ; -- DelayUS( 500 ) ; -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x18 , pVBInfo->SR15[ 2 ][ XGINew_RAMType ] ) ; /* SR18 */ -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x19 , 0x00 ) ; -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x16 , pVBInfo->SR16[ 2 ] ) ; -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x16 , pVBInfo->SR16[ 3 ] ) ; -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x1B , 0x00 ) ; --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGINew_DDR2x_MRS_340 */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --void XGINew_DDR2x_MRS_340(PXGI_HW_DEVICE_INFO HwDeviceExtension, USHORT P3c4, -- PVB_DEVICE_INFO pVBInfo) --{ -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x18 , 0x00 ) ; -- if ( HwDeviceExtension->jChipType == XG42 ) /*XG42 BA0 & BA1 layout change*/ -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x19 , 0x40 ) ; -- else -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x19 , 0x20 ) ; -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x16 , 0x00 ) ; -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x16 , 0x80 ) ; -- -- /* Samsung F Die */ -- if (pVBInfo->DRAMTypeDefinition != 0x0C) { -- DelayUS( 3000 ) ; /* Delay 67 x 3 Delay15us */ -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x18 , 0x00 ) ; -- if ( HwDeviceExtension->jChipType == XG42 ) -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x19 , 0x40 ) ; -- else -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x19 , 0x20 ) ; -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x16 , 0x00 ) ; -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x16 , 0x80 ) ; -- } -- -- DelayUS( 60 ) ; -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x18 , pVBInfo->SR15[ 2 ][ XGINew_RAMType ] ) ; /* SR18 */ -- /* XGI_SetReg((XGIIOADDRESS) P3c4 , 0x18 , 0x31 ) ; */ -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x19 , 0x02 ) ; /*TSop DRAM DLL pin jump to A9*/ -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x16 , pVBInfo->SR16[ 0 ] ) ; -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x16 , pVBInfo->SR16[ 1 ] ) ; -- DelayUS( 1000 ) ; -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x1B , 0x03 ) ; -- DelayUS( 500 ) ; -- /* XGI_SetReg((XGIIOADDRESS) P3c4 , 0x18 , 0x31 ) ; */ -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x18 , pVBInfo->SR15[ 2 ][ XGINew_RAMType ] ) ; /* SR18 */ -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x19 , 0x00 ) ; -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x16 , pVBInfo->SR16[ 2 ] ) ; -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x16 , pVBInfo->SR16[ 3 ] ) ; -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x1B , 0x00 ) ; --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGINew_DDR2_MRS_340 */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --void XGINew_DDR2_MRS_340(PXGI_HW_DEVICE_INFO HwDeviceExtension, USHORT P3c4, -- PVB_DEVICE_INFO pVBInfo) --{ -- USHORT P3d4 = P3c4 + 0x10 ; -- UCHAR data ; -- -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x28 , 0x64 ) ; /* SR28 */ -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x29 , 0x63 ) ; /* SR29 */ -- DelayUS( 200 ) ; -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x18 , 0x00 ) ; -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x19 , 0x20 ) ; -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x16 , 0x00 ) ; -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x16 , 0x80 ) ; -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x18 , 0xC5 ) ; -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x19 , 0x23 ) ; -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x16 , 0x00 ) ; -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x16 , 0x80 ) ; -- DelayUS( 2 ) ; -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x97 , 0x11 ) ; /* CR97 */ -- -- if( P3c4 != pVBInfo->P3c4 ) -- { -- data = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x28 ) ; -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x28 , data ) ; /* SR28 */ -- data = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x29 ) ; -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x29 , data ) ; /* SR29 */ -- data = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x2A ) ; -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x2A , data ) ; /* SR2A */ -- -- data = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x2E ) ; -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x2e , data ) ; /* SR2E */ -- data = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x2F ) ; -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x2f , data ) ; /* SR2F */ -- data = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x30 ) ; -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x30 , data ) ; /* SR30 */ -- } -- else -- XGINew_SetMemoryClock( HwDeviceExtension , pVBInfo ) ; -- -- DelayUS( 1000 ) ; -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x18 , 0xC5 ) ; -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x19 , 0x23 ) ; -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x16 , 0x00 ) ; -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x16 , 0x80 ) ; -- DelayUS( 1 ) ; -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x1B , 0x04 ) ; /* SR1B */ -- DelayUS( 5) ; -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x1B , 0x00 ) ; /* SR1B */ -- DelayUS( 5 ) ; -- /* XGI_SetReg((XGIIOADDRESS) P3c4 , 0x18 , 0x72 ) ; */ -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x18 , pVBInfo->SR15[ 2 ][ XGINew_RAMType ] ) ; /* SR18 */ -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x19 , 0x06 ) ; -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x16 , 0x05 ) ; -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x16 , 0x85 ) ; -- DelayUS( 1 ) ; --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGINew_DDR1x_DefaultRegister */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --void XGINew_DDR1x_DefaultRegister(PXGI_HW_DEVICE_INFO HwDeviceExtension, -- USHORT Port, PVB_DEVICE_INFO pVBInfo) --{ -- USHORT P3d4 = Port , -- P3c4 = Port - 0x10 ; --#ifndef LINUX_XF86 -- UCHAR data ; --#endif -- if ( HwDeviceExtension->jChipType == XG20 ) -- { -- XGINew_SetMemoryClock( HwDeviceExtension , pVBInfo ) ; -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x82 , pVBInfo->CR40[ 11 ][ XGINew_RAMType ] ) ; /* CR82 */ -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x85 , pVBInfo->CR40[ 12 ][ XGINew_RAMType ] ) ; /* CR85 */ -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x86 , pVBInfo->CR40[ 13 ][ XGINew_RAMType ] ) ; /* CR86 */ -- -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x98 , 0x01 ) ; -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x9A , 0x02 ) ; -- -- XGINew_DDR1x_MRS_XG20( P3c4 , pVBInfo) ; -- } -- else -- { -- XGINew_SetMemoryClock( HwDeviceExtension , pVBInfo ) ; -- -- switch( HwDeviceExtension->jChipType ) -- { -- case XG41: -- case XG42: -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x82 , pVBInfo->CR40[ 11 ][ XGINew_RAMType ] ) ; /* CR82 */ -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x85 , pVBInfo->CR40[ 12 ][ XGINew_RAMType ] ) ; /* CR85 */ -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x86 , pVBInfo->CR40[ 13 ][ XGINew_RAMType ] ) ; /* CR86 */ -- break ; -- default: -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x82 , 0x88 ) ; -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x86 , 0x00 ) ; -- XGI_GetReg((XGIIOADDRESS) P3d4 , 0x86 ) ; /* Insert read command for delay */ -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x86 , 0x88 ) ; -- XGI_GetReg((XGIIOADDRESS) P3d4 , 0x86 ) ; -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x86 , pVBInfo->CR40[ 13 ][ XGINew_RAMType ] ) ; -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x82 , 0x77 ) ; -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x85 , 0x00 ) ; -- XGI_GetReg((XGIIOADDRESS) P3d4 , 0x85 ) ; /* Insert read command for delay */ -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x85 , 0x88 ) ; -- XGI_GetReg((XGIIOADDRESS) P3d4 , 0x85 ) ; /* Insert read command for delay */ -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x85 , pVBInfo->CR40[ 12 ][ XGINew_RAMType ] ) ; /* CR85 */ -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x82 , pVBInfo->CR40[ 11 ][ XGINew_RAMType ] ) ; /* CR82 */ -- break ; -- } -- if (HwDeviceExtension->jChipType != XG45) -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x97 , 0x00 ) ; -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x98 , 0x01 ) ; -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x9A , 0x02 ) ; -- XGINew_DDR1x_MRS_340( HwDeviceExtension , P3c4 , pVBInfo ) ; -- } --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGINew_DDR2x_DefaultRegister */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --void XGINew_DDR2x_DefaultRegister(PXGI_HW_DEVICE_INFO HwDeviceExtension, -- USHORT Port, PVB_DEVICE_INFO pVBInfo) --{ -- USHORT P3d4 = Port , -- P3c4 = Port - 0x10 ; -- --#ifndef LINUX_XF86 -- UCHAR data ; --#endif -- -- XGINew_SetMemoryClock( HwDeviceExtension , pVBInfo ) ; -- -- /* 20040906 Hsuan modify CR82, CR85, CR86 for XG42 */ -- switch( HwDeviceExtension->jChipType ) -- { -- case XG41: -- case XG42: -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x82 , pVBInfo->CR40[ 11 ][ XGINew_RAMType ] ) ; /* CR82 */ -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x85 , pVBInfo->CR40[ 12 ][ XGINew_RAMType ] ) ; /* CR85 */ -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x86 , pVBInfo->CR40[ 13 ][ XGINew_RAMType ] ) ; /* CR86 */ -- break ; -- default: -- /* keep following setting sequence, each setting in the same reg insert idle */ -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x82 , 0x88 ) ; -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x86 , 0x00 ) ; -- XGI_GetReg((XGIIOADDRESS) P3d4 , 0x86 ) ; /* Insert read command for delay */ -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x86 , 0x88 ) ; -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x82 , 0x77 ) ; -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x85 , 0x00 ) ; -- XGI_GetReg((XGIIOADDRESS) P3d4 , 0x85 ) ; /* Insert read command for delay */ -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x85 , 0x88 ) ; -- XGI_GetReg((XGIIOADDRESS) P3d4 , 0x85 ) ; /* Insert read command for delay */ -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x85 , pVBInfo->CR40[ 12 ][ XGINew_RAMType ] ) ; /* CR85 */ -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x82 , pVBInfo->CR40[ 11 ][ XGINew_RAMType ] ) ; /* CR82 */ -- } -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x97 , 0x11 ) ; -- if ( HwDeviceExtension->jChipType == XG42 ) -- { -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x98 , 0x01 ) ; -- } -- else -- { -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x98 , 0x03 ) ; -- } -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x9A , 0x02 ) ; -- -- XGINew_DDR2x_MRS_340( HwDeviceExtension , P3c4 , pVBInfo ) ; --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGINew_DDR2_DefaultRegister */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --void XGINew_DDR2_DefaultRegister(PXGI_HW_DEVICE_INFO HwDeviceExtension, -- USHORT Port, PVB_DEVICE_INFO pVBInfo) --{ -- USHORT P3d4 = Port , -- P3c4 = Port - 0x10 ; -- -- /* keep following setting sequence, each setting in the same reg insert idle */ -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x82 , 0x77 ) ; -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x86 , 0x00 ) ; -- XGI_GetReg((XGIIOADDRESS) P3d4 , 0x86 ) ; /* Insert read command for delay */ -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x86 , 0x88 ) ; -- XGI_GetReg((XGIIOADDRESS) P3d4 , 0x86 ) ; /* Insert read command for delay */ -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x86 , pVBInfo->CR40[ 13 ][ XGINew_RAMType ] ) ; /* CR86 */ -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x82 , 0x77 ) ; -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x85 , 0x00 ) ; -- XGI_GetReg((XGIIOADDRESS) P3d4 , 0x85 ) ; /* Insert read command for delay */ -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x85 , 0x88 ) ; -- XGI_GetReg((XGIIOADDRESS) P3d4 , 0x85 ) ; /* Insert read command for delay */ -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x85 , pVBInfo->CR40[ 12 ][ XGINew_RAMType ] ) ; /* CR85 */ -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x82 , pVBInfo->CR40[ 11 ][ XGINew_RAMType ] ) ; /* CR82 */ -- -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x98 , 0x03 ) ; -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x9A , 0x02 ) ; -- XGINew_DDR2_MRS_340( HwDeviceExtension , P3c4, pVBInfo ) ; --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGINew_SetDRAMDefaultRegister340 */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --void XGINew_SetDRAMDefaultRegister340( PXGI_HW_DEVICE_INFO HwDeviceExtension , USHORT Port , PVB_DEVICE_INFO pVBInfo) --{ -- UCHAR temp , temp1 , temp2 , temp3 , -- i , j , k ; -- -- USHORT P3d4 = Port , -- P3c4 = Port - 0x10 ; -- -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x6D , pVBInfo->CR40[ 8 ][ XGINew_RAMType ] ) ; -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x68 , pVBInfo->CR40[ 5 ][ XGINew_RAMType ] ) ; -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x69 , pVBInfo->CR40[ 6 ][ XGINew_RAMType ] ) ; -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x6A , pVBInfo->CR40[ 7 ][ XGINew_RAMType ] ) ; -- -- temp2 = 0 ; -- for( i = 0 ; i < 4 ; i++ ) -- { -- temp = pVBInfo->CR6B[ XGINew_RAMType ][ i ] ; /* CR6B DQS fine tune delay */ -- for( j = 0 ; j < 4 ; j++ ) -- { -- temp1 = ( ( temp >> ( 2 * j ) ) & 0x03 ) << 2 ; -- temp2 |= temp1 ; -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x6B , temp2 ) ; -- XGI_GetReg((XGIIOADDRESS) P3d4 , 0x6B ) ; /* Insert read command for delay */ -- temp2 &= 0xF0 ; -- temp2 += 0x10 ; -- } -- } -- -- temp2 = 0 ; -- for( i = 0 ; i < 4 ; i++ ) -- { -- temp = pVBInfo->CR6E[ XGINew_RAMType ][ i ] ; /* CR6E DQM fine tune delay */ -- for( j = 0 ; j < 4 ; j++ ) -- { -- temp1 = ( ( temp >> ( 2 * j ) ) & 0x03 ) << 2 ; -- temp2 |= temp1 ; -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x6E , temp2 ) ; -- XGI_GetReg((XGIIOADDRESS) P3d4 , 0x6E ) ; /* Insert read command for delay */ -- temp2 &= 0xF0 ; -- temp2 += 0x10 ; -- } -- } -- -- temp3 = 0 ; -- for( k = 0 ; k < 4 ; k++ ) -- { -- XGI_SetRegANDOR((XGIIOADDRESS) P3d4 , 0x6E , 0xFC , temp3 ) ; /* CR6E_D[1:0] select channel */ -- temp2 = 0 ; -- for( i = 0 ; i < 8 ; i++ ) -- { -- temp = pVBInfo->CR6F[ XGINew_RAMType ][ 8 * k + i ] ; /* CR6F DQ fine tune delay */ -- for( j = 0 ; j < 4 ; j++ ) -- { -- temp1 = ( temp >> ( 2 * j ) ) & 0x03 ; -- temp2 |= temp1 ; -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x6F , temp2 ) ; -- XGI_GetReg((XGIIOADDRESS) P3d4 , 0x6F ) ; /* Insert read command for delay */ -- temp2 &= 0xF8 ; -- temp2 += 0x08 ; -- } -- } -- temp3 += 0x01 ; -- } -- -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x80 , pVBInfo->CR40[ 9 ][ XGINew_RAMType ] ) ; /* CR80 */ -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x81 , pVBInfo->CR40[ 10 ][ XGINew_RAMType ] ) ; /* CR81 */ -- -- temp2 = 0x80 ; -- temp = pVBInfo->CR89[ XGINew_RAMType ][ 0 ] ; /* CR89 terminator type select */ -- for( j = 0 ; j < 4 ; j++ ) -- { -- temp1 = ( temp >> ( 2 * j ) ) & 0x03 ; -- temp2 |= temp1 ; -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x89 , temp2 ) ; -- XGI_GetReg((XGIIOADDRESS) P3d4 , 0x89 ) ; /* Insert read command for delay */ -- temp2 &= 0xF0 ; -- temp2 += 0x10 ; -- } -- -- temp = pVBInfo->CR89[ XGINew_RAMType ][ 1 ] ; -- temp1 = temp & 0x03 ; -- temp2 |= temp1 ; -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x89 , temp2 ) ; -- -- temp = pVBInfo->CR40[ 3 ][ XGINew_RAMType ] ; -- temp1 = temp & 0x0F ; -- temp2 = ( temp >> 4 ) & 0x07 ; -- temp3 = temp & 0x80 ; -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x45 , temp1 ) ; /* CR45 */ -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x99 , temp2 ) ; /* CR99 */ -- XGI_SetRegOR((XGIIOADDRESS) P3d4 , 0x40 , temp3 ) ; /* CR40_D[7] */ -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x41 , pVBInfo->CR40[ 0 ][ XGINew_RAMType ] ) ; /* CR41 */ -- -- for( j = 0 ; j <= 6 ; j++ ) -- XGI_SetReg((XGIIOADDRESS) P3d4 , ( 0x90 + j ) , pVBInfo->CR40[ 14 + j ][ XGINew_RAMType ] ) ; /* CR90 - CR96 */ -- -- for( j = 0 ; j <= 2 ; j++ ) -- XGI_SetReg((XGIIOADDRESS) P3d4 , ( 0xC3 + j ) , pVBInfo->CR40[ 21 + j ][ XGINew_RAMType ] ) ; /* CRC3 - CRC5 */ -- -- for( j = 0 ; j < 2 ; j++ ) -- XGI_SetReg((XGIIOADDRESS) P3d4 , ( 0x8A + j ) , pVBInfo->CR40[ 1 + j ][ XGINew_RAMType ] ) ; /* CR8A - CR8B */ -- -- if ( ( HwDeviceExtension->jChipType == XG41 ) || ( HwDeviceExtension->jChipType == XG42 ) ) -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x8C , 0x87 ) ; -- -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x59 , pVBInfo->CR40[ 4 ][ XGINew_RAMType ] ) ; /* CR59 */ -- -- XGI_SetReg((XGIIOADDRESS) P3d4, 0x83, 0x09); /* CR83 */ -- XGI_SetReg((XGIIOADDRESS) P3d4, 0x87, 0x00); /* CR87 */ -- XGI_SetReg((XGIIOADDRESS) P3d4, 0xCF, pVBInfo->CRCF); /* CRCF */ -- XGI_SetReg((XGIIOADDRESS) P3c4, 0x1A, 0x87); /* SR1A */ -- -- temp = XGINew_Get340DRAMType( HwDeviceExtension, pVBInfo) ; -- if( temp == 0 ) -- XGINew_DDR1x_DefaultRegister( HwDeviceExtension, P3d4, pVBInfo ) ; -- else if ( temp == 0x02 ) -- XGINew_DDR2x_DefaultRegister( HwDeviceExtension, P3d4, pVBInfo ) ; -- else -- XGINew_DDR2_DefaultRegister( HwDeviceExtension, P3d4, pVBInfo ) ; -- -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x1B , pVBInfo->SR15[ 3 ][ XGINew_RAMType ] ) ; /* SR1B */ --} -- --/* --------------------------------------------------------------------- */ --/* Function : XGINew_SetDRAMDefaultRegisterXG45 */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --void XGINew_SetDRAMDefaultRegisterXG45( PXGI_HW_DEVICE_INFO HwDeviceExtension , USHORT Port , PVB_DEVICE_INFO pVBInfo) --{ -- UCHAR temp , temp1 , temp2 , -- i , j , k ; -- -- USHORT P3d4 = Port , -- P3c4 = Port - 0x10 ; -- -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x6D , pVBInfo->CR40[ 8 ][ XGINew_RAMType ] ) ; -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x6E , pVBInfo->XG45CR6E[ XGINew_RAMType ] ) ; -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x6F , pVBInfo->XG45CR6F[ XGINew_RAMType ] ) ; -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x68 , pVBInfo->CR40[ 5 ][ XGINew_RAMType ] ) ; -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x69 , pVBInfo->CR40[ 6 ][ XGINew_RAMType ] ) ; -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x6A , pVBInfo->CR40[ 7 ][ XGINew_RAMType ] ) ; -- -- temp = 0x00 ; -- for ( j = 0 ; j < 24 ; j ++ ) -- { -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x6B , temp ); -- temp += 0x08 ; -- } -- -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x80 , pVBInfo->CR40[ 9 ][ XGINew_RAMType ] ) ; /* CR80 */ -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x81 , pVBInfo->CR40[ 10 ][ XGINew_RAMType ] ) ; /* CR81 */ -- -- temp2 = 0x80 ; -- temp = pVBInfo->CR89[ XGINew_RAMType ][ 0 ] ; /* CR89 terminator type select */ -- for( j = 0 ; j < 4 ; j++ ) -- { -- temp1 = ( temp >> ( 2 * j ) ) & 0x03 ; -- temp2 |= temp1 ; -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x89 , temp2 ) ; -- XGI_GetReg((XGIIOADDRESS) P3d4 , 0x89 ) ; /* Insert read command for delay */ -- temp2 &= 0xF0 ; -- temp2 += 0x10 ; -- } -- -- temp = pVBInfo->CR89[ XGINew_RAMType ][ 1 ] ; -- temp1 = temp & 0x03 ; -- temp2 |= temp1 ; -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x89 , temp2 ) ; -- -- temp = 0x00 ; -- for ( j = 0 ; j < 3 ; j ++ ) -- { -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x40 , temp ); -- temp += 0x40 ; -- } -- -- temp = 0x00 ; -- for ( j = 0 ; j < 24 ; j ++ ) -- { -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x41 , temp ); -- temp += 0x08 ; -- } -- -- temp = 0x00 ; -- for ( j = 0 ; j < 24 ; j ++ ) -- { -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x42 , temp ); -- temp += 0x08 ; -- } -- -- for ( k = 0 ; k < 2 ; k ++ ) -- { -- XGI_SetRegANDOR((XGIIOADDRESS) P3d4 , 0x43 , ~0x04 , k * 0x04 ); -- -- for ( i = 0 ; i < 3 ; i ++ ) -- { -- -- XGI_SetRegANDOR((XGIIOADDRESS) P3d4 , 0x43 , ~0x03 , i * 0x01 ); -- -- for ( j = 0 ; j < 32 ; j ++ ) -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x44 , j * 0x08 ); -- } -- } -- -- for ( j = 0 ; j < 3 ; j ++ ) -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x45 , j * 0x08 ) ; /* CR45 */ -- -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x97 , 0x84 ) ; -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x98 , 0x01 ) ; -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x99 , 0x22 ) ; -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x9A , 0x02 ) ; -- -- for( j = 0 ; j <= 6 ; j++ ) -- XGI_SetReg((XGIIOADDRESS) P3d4 , ( 0x90 + j ) , pVBInfo->CR40[ 14 + j ][ XGINew_RAMType ] ) ; /* CR90 - CR96 */ -- -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x59 , pVBInfo->CR40[ 4 ][ XGINew_RAMType ] ) ; /* CR59 */ -- -- for( j = 0 ; j <= 2 ; j++ ) -- XGI_SetReg((XGIIOADDRESS) P3d4 , ( 0xC3 + j ) , pVBInfo->CR40[ 21 + j ][ XGINew_RAMType ] ) ; /* CRC3 - CRC5 */ -- -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0xC8 , 0x04 ) ; -- -- for( j = 0 ; j < 2 ; j++ ) -- XGI_SetReg((XGIIOADDRESS) P3d4 , ( 0x8A + j ) , pVBInfo->CR40[ 1 + j ][ XGINew_RAMType ] ) ; /* CR8A - CR8B */ -- -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x8C , 0x40 ) ; -- -- if ( ( HwDeviceExtension->jChipType == XG41 ) || ( HwDeviceExtension->jChipType == XG42 ) ) -- XGI_SetReg((XGIIOADDRESS) P3d4 , 0x8C , 0x87 ) ; -- -- XGI_SetReg((XGIIOADDRESS) P3d4, 0xCF, pVBInfo->CRCF); /* CRCF */ -- XGI_SetReg((XGIIOADDRESS) P3d4, 0x83, 0x09); /* CR83 */ -- XGI_SetReg((XGIIOADDRESS) P3d4, 0x87, 0x00); /* CR87 */ -- XGI_SetReg((XGIIOADDRESS) P3d4, 0x8D, 0x87); /* CR8D */ -- -- XGINew_DDR1x_DefaultRegister( HwDeviceExtension, P3d4, pVBInfo ) ; -- -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x1A , 0x87 ) ; /* SR1A */ -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x1B , pVBInfo->SR15[ 3 ][ XGINew_RAMType ] ) ; /* SR1B */ --} -- --/* --------------------------------------------------------------------- */ --/* Function : XGINew_DDR_MRS */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --void XGINew_DDR_MRS(PVB_DEVICE_INFO pVBInfo) --{ -- USHORT data ; -- -- PUCHAR volatile pVideoMemory = ( PUCHAR )pVBInfo->ROMAddr ; -- -- /* SR16 <- 1F,DF,2F,AF */ -- /* yriver modified SR16 <- 0F,DF,0F,AF */ -- /* enable DLL of DDR SD/SGRAM , SR16 D4=1 */ -- data = pVideoMemory[ 0xFB ] ; -- /* data = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x16 ) ; */ -- -- data &= 0x0F ; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x16 , data ) ; -- data |= 0xC0 ; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x16 , data ) ; -- data &= 0x0F ; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x16 , data ) ; -- data |= 0x80 ; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x16 , data ) ; -- data &= 0x0F ; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x16 , data ) ; -- data |= 0xD0 ; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x16 , data ) ; -- data &= 0x0F ; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x16 , data ) ; -- data |= 0xA0 ; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x16 , data ) ; --/* -- else { -- data &= 0x0F; -- data |= 0x10; -- XGI_SetReg((XGIIOADDRESS)pVBInfo->P3c4,0x16,data); -- -- if (!(pVBInfo->SR15[1][XGINew_RAMType] & 0x10)) -- { -- data &= 0x0F; -- } -- -- data |= 0xC0; -- XGI_SetReg((XGIIOADDRESS)pVBInfo->P3c4,0x16,data); -- -- -- data &= 0x0F; -- data |= 0x20; -- XGI_SetReg((XGIIOADDRESS)pVBInfo->P3c4,0x16,data); -- if (!(pVBInfo->SR15[1][XGINew_RAMType] & 0x10)) -- { -- data &= 0x0F; -- } -- -- data |= 0x80; -- XGI_SetReg((XGIIOADDRESS)pVBInfo->P3c4,0x16,data); -- } --*/ --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGINew_SetDRAMSize_340 */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --void XGINew_SetDRAMSize_340( PXGI_HW_DEVICE_INFO HwDeviceExtension , PVB_DEVICE_INFO pVBInfo) --{ -- USHORT data ; -- -- pVBInfo->ROMAddr = HwDeviceExtension->pjVirtualRomBase ; -- pVBInfo->FBAddr = HwDeviceExtension->pjVideoMemoryAddress ; -- XGISetModeNew(HwDeviceExtension, pVBInfo, 0x2e); -- -- data = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x21 ) ; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x21 , ( USHORT )( data & 0xDF ) ) ; /* disable read cache */ -- -- data = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x1 ) ; -- data |= 0x20 ; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x01 , data ) ; /* Turn OFF Display */ -- -- XGINew_DDRSizing340( HwDeviceExtension, pVBInfo ) ; -- -- data=XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x21 ) ; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x21 , ( USHORT )( data | 0x20 ) ) ; /* enable read cache */ --} -- -- --/*--------------------------------------------------------------------- */ --/* Function : XGINew_SetDRAMSize_XG45 */ --/*Input : */ --/*Output : */ --/*Description : */ --/*--------------------------------------------------------------------- */ --void XGINew_SetDRAMSize_XG45( PXGI_HW_DEVICE_INFO HwDeviceExtension , PVB_DEVICE_INFO pVBInfo) --{ -- USHORT data ; -- -- pVBInfo->ROMAddr = HwDeviceExtension->pjVirtualRomBase ; -- pVBInfo->FBAddr = HwDeviceExtension->pjVideoMemoryAddress ; -- XGISetModeNew(HwDeviceExtension, pVBInfo, 0x2e); -- -- data = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x21 ) ; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x21 , ( USHORT )( data & 0xDF ) ) ; /*disable read cache*/ -- -- data = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x1 ) ; -- data |= 0x20 ; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x01 , data ) ; /*Turn OFF Display*/ -- -- XGINew_DDRSizingXG45( HwDeviceExtension, pVBInfo ) ; -- -- data=XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x21 ) ; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x21 , ( USHORT )( data | 0x20 ) ) ; /*enable read cache*/ --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGINew_SetDRAMModeRegister340 */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ -- --void XGINew_SetDRAMModeRegister340(PXGI_HW_DEVICE_INFO HwDeviceExtension, -- PVB_DEVICE_INFO pVBInfo) --{ -- UCHAR data ; -- -- ReadVBIOSTablData( HwDeviceExtension->jChipType , pVBInfo) ; -- -- if (HwDeviceExtension->jChipType == XG45) -- XGINew_DDR1x_MRS_340( HwDeviceExtension, pVBInfo->P3c4, pVBInfo ) ; -- else -- { -- if ( XGINew_Get340DRAMType( HwDeviceExtension, pVBInfo) == 0 ) -- { -- data = ( XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x39 ) & 0x02 ) >> 1 ; -- if ( data == 0x01 ) -- XGINew_DDR2x_MRS_340( HwDeviceExtension, pVBInfo->P3c4, pVBInfo ) ; -- else -- XGINew_DDR1x_MRS_340( HwDeviceExtension, pVBInfo->P3c4, pVBInfo ) ; -- } -- else -- XGINew_DDR2_MRS_340( HwDeviceExtension, pVBInfo->P3c4, pVBInfo); -- } -- -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x1B , 0x03 ) ; --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGINew_DisableRefresh */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --void XGINew_DisableRefresh( PXGI_HW_DEVICE_INFO HwDeviceExtension , PVB_DEVICE_INFO pVBInfo) --{ -- USHORT data ; -- -- -- data = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x1B ) ; -- data &= 0xF8 ; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x1B , data ) ; -- --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGINew_EnableRefresh */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --void XGINew_EnableRefresh( PXGI_HW_DEVICE_INFO HwDeviceExtension , PVB_DEVICE_INFO pVBInfo) --{ -- -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x1B , pVBInfo->SR15[ 3 ][ XGINew_RAMType ] ) ; /* SR1B */ -- -- --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGINew_DisableChannelInterleaving */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --void XGINew_DisableChannelInterleaving(int index, -- const USHORT XGINew_DDRDRAM_TYPE[][5], -- PVB_DEVICE_INFO pVBInfo) --{ -- USHORT data ; -- -- data = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x15 ) ; -- data &= 0x1F ; -- -- switch( XGINew_DDRDRAM_TYPE[ index ][ 3 ] ) -- { -- case 64: -- data |= 0 ; -- break ; -- case 32: -- data |= 0x20 ; -- break ; -- case 16: -- data |= 0x40 ; -- break ; -- case 4: -- data |= 0x60 ; -- break ; -- default: -- break ; -- } -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x15 , data ) ; --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGINew_SetDRAMSizingType */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --void XGINew_SetDRAMSizingType(int index , const USHORT DRAMTYPE_TABLE[][5], -- PVB_DEVICE_INFO pVBInfo) --{ -- USHORT data ; -- -- data = DRAMTYPE_TABLE[ index ][ 4 ] ; -- XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3c4 , 0x13 , 0x80 , data ) ; -- /* should delay 50 ns */ --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGINew_SetRank */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --int XGINew_SetRank(int index, UCHAR RankNo, UCHAR XGINew_ChannelAB, -- const USHORT DRAMTYPE_TABLE[][5], PVB_DEVICE_INFO pVBInfo) --{ -- USHORT data ; -- int RankSize ; -- -- if ( ( RankNo == 2 ) && ( DRAMTYPE_TABLE[ index ][ 0 ] == 2 ) ) -- return 0 ; -- -- RankSize = DRAMTYPE_TABLE[ index ][ 3 ] / 2 * XGINew_DataBusWidth / 32 ; -- -- if ( ( RankNo * RankSize ) <= 128 ) -- { -- data = 0 ; -- -- while( ( RankSize >>= 1 ) > 0 ) -- { -- data += 0x10 ; -- } -- data |= ( RankNo - 1 ) << 2 ; -- data |= ( XGINew_DataBusWidth / 64 ) & 2 ; -- data |= XGINew_ChannelAB ; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , data ) ; -- /* should delay */ -- XGINew_SDR_MRS( pVBInfo ) ; -- return( 1 ) ; -- } -- else -- return( 0 ) ; --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGINew_SetDDRChannel */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --int XGINew_SetDDRChannel(int index, UCHAR ChannelNo, UCHAR XGINew_ChannelAB, -- const USHORT DRAMTYPE_TABLE[][5], -- PVB_DEVICE_INFO pVBInfo) --{ -- USHORT data ; -- int RankSize ; -- -- RankSize = DRAMTYPE_TABLE[index][3]/2 * XGINew_DataBusWidth/32; -- /* RankSize = DRAMTYPE_TABLE[ index ][ 3 ] ; */ -- if ( ChannelNo * RankSize <= 128 ) -- { -- data = 0 ; -- while( ( RankSize >>= 1 ) > 0 ) -- { -- data += 0x10 ; -- } -- -- if ( ChannelNo == 2 ) -- data |= 0x0C ; -- -- data |= ( XGINew_DataBusWidth / 32 ) & 2 ; -- data |= XGINew_ChannelAB ; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , data ) ; -- /* should delay */ -- XGINew_DDR_MRS( pVBInfo ) ; -- return( 1 ) ; -- } -- else -- return( 0 ) ; --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGINew_CheckColumn */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --int XGINew_CheckColumn(int index, const USHORT DRAMTYPE_TABLE[][5], -- PVB_DEVICE_INFO pVBInfo) --{ -- int i ; -- ULONG Increment , Position ; -- -- /* Increment = 1 << ( DRAMTYPE_TABLE[ index ][ 2 ] + XGINew_DataBusWidth / 64 + 1 ) ; */ -- Increment = 1 << ( 10 + XGINew_DataBusWidth / 64 ) ; -- -- for( i = 0 , Position = 0 ; i < 2 ; i++ ) -- { -- *( ( PULONG )( pVBInfo->FBAddr + Position ) ) = Position ; -- Position += Increment ; -- } -- -- for( i = 0 , Position = 0 ; i < 2 ; i++ ) -- { -- /* if ( pVBInfo->FBAddr[ Position ] != Position ) */ -- if ( ( *( PULONG )( pVBInfo->FBAddr + Position ) ) != Position ) -- return( 0 ) ; -- Position += Increment ; -- } -- return( 1 ) ; --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGINew_CheckBanks */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --int XGINew_CheckBanks(int index, const USHORT DRAMTYPE_TABLE[][5], -- PVB_DEVICE_INFO pVBInfo) --{ -- int i ; -- ULONG Increment , Position ; -- -- Increment = 1 << ( DRAMTYPE_TABLE[ index ][ 2 ] + XGINew_DataBusWidth / 64 + 2 ) ; -- -- for( i = 0 , Position = 0 ; i < 4 ; i++ ) -- { -- /* pVBInfo->FBAddr[ Position ] = Position ; */ -- *( ( PULONG )( pVBInfo->FBAddr + Position ) ) = Position ; -- Position += Increment ; -- } -- -- for( i = 0 , Position = 0 ; i < 4 ; i++ ) -- { -- /* if (pVBInfo->FBAddr[ Position ] != Position ) */ -- if ( ( *( PULONG )( pVBInfo->FBAddr + Position ) ) != Position ) -- return( 0 ) ; -- Position += Increment ; -- } -- return( 1 ) ; --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGINew_CheckRank */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --int XGINew_CheckRank(int RankNo, int index, const USHORT DRAMTYPE_TABLE[][5], -- PVB_DEVICE_INFO pVBInfo) --{ -- int i ; -- ULONG Increment , Position ; -- -- Increment = 1 << ( DRAMTYPE_TABLE[ index ][ 2 ] + DRAMTYPE_TABLE[ index ][ 1 ] + -- DRAMTYPE_TABLE[ index ][ 0 ] + XGINew_DataBusWidth / 64 + RankNo ) ; -- -- for( i = 0 , Position = 0 ; i < 2 ; i++ ) -- { -- /* pVBInfo->FBAddr[ Position ] = Position ; */ -- /* *( ( PULONG )( pVBInfo->FBAddr ) ) = Position ; */ -- *( ( PULONG )( pVBInfo->FBAddr + Position ) ) = Position ; -- Position += Increment ; -- } -- -- for( i = 0 , Position = 0 ; i < 2 ; i++ ) -- { -- /* if ( pVBInfo->FBAddr[ Position ] != Position ) */ -- /* if ( ( *( PULONG )( pVBInfo->FBAddr ) ) != Position ) */ -- if ( ( *( PULONG )( pVBInfo->FBAddr + Position ) ) != Position ) -- return( 0 ) ; -- Position += Increment ; -- } -- return( 1 ); --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGINew_CheckDDRRank */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --int XGINew_CheckDDRRank(int RankNo, int index, -- const USHORT DRAMTYPE_TABLE[][5], -- PVB_DEVICE_INFO pVBInfo) --{ -- ULONG Increment , Position ; -- USHORT data ; -- -- Increment = 1 << ( DRAMTYPE_TABLE[ index ][ 2 ] + DRAMTYPE_TABLE[ index ][ 1 ] + -- DRAMTYPE_TABLE[ index ][ 0 ] + XGINew_DataBusWidth / 64 + RankNo ) ; -- -- Increment += Increment / 2 ; -- -- Position = 0; -- *( ( PULONG )( pVBInfo->FBAddr + Position + 0 ) ) = 0x01234567 ; -- *( ( PULONG )( pVBInfo->FBAddr + Position + 1 ) ) = 0x456789AB ; -- *( ( PULONG )( pVBInfo->FBAddr + Position + 2 ) ) = 0x55555555 ; -- *( ( PULONG )( pVBInfo->FBAddr + Position + 3 ) ) = 0x55555555 ; -- *( ( PULONG )( pVBInfo->FBAddr + Position + 4 ) ) = 0xAAAAAAAA ; -- *( ( PULONG )( pVBInfo->FBAddr + Position + 5 ) ) = 0xAAAAAAAA ; -- -- if ( ( *( PULONG )( pVBInfo->FBAddr + 1 ) ) == 0x456789AB ) -- return( 1 ) ; -- -- if ( ( *( PULONG )( pVBInfo->FBAddr + 0 ) ) == 0x01234567 ) -- return( 0 ) ; -- -- data = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 ) ; -- data &= 0xF3 ; -- data |= 0x0E ; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , data ) ; -- data = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x15 ) ; -- data += 0x20 ; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x15 , data ) ; -- -- return( 1 ) ; --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGINew_CheckRanks */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --int XGINew_CheckRanks(int RankNo, int index, const USHORT DRAMTYPE_TABLE[][5], -- PVB_DEVICE_INFO pVBInfo) --{ -- int r ; -- -- for( r = RankNo ; r >= 1 ; r-- ) -- { -- if ( !XGINew_CheckRank( r , index , DRAMTYPE_TABLE, pVBInfo ) ) -- return( 0 ) ; -- } -- -- if ( !XGINew_CheckBanks( index , DRAMTYPE_TABLE, pVBInfo ) ) -- return( 0 ) ; -- -- if ( !XGINew_CheckColumn( index , DRAMTYPE_TABLE, pVBInfo ) ) -- return( 0 ) ; -- -- return( 1 ) ; --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGINew_CheckDDRRanks */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --int XGINew_CheckDDRRanks(int RankNo, int index, -- const USHORT DRAMTYPE_TABLE[][5], -- PVB_DEVICE_INFO pVBInfo) --{ -- int r ; -- -- for( r = RankNo ; r >= 1 ; r-- ) -- { -- if ( !XGINew_CheckDDRRank( r , index , DRAMTYPE_TABLE, pVBInfo ) ) -- return( 0 ) ; -- } -- -- if ( !XGINew_CheckBanks( index , DRAMTYPE_TABLE, pVBInfo ) ) -- return( 0 ) ; -- -- if ( !XGINew_CheckColumn( index , DRAMTYPE_TABLE, pVBInfo ) ) -- return( 0 ) ; -- -- return( 1 ) ; --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --int XGINew_SDRSizing(PVB_DEVICE_INFO pVBInfo) --{ -- int i ; -- UCHAR j ; -- -- for( i = 0 ; i < 13 ; i++ ) -- { -- XGINew_SetDRAMSizingType( i , XGINew_SDRDRAM_TYPE , pVBInfo) ; -- -- for( j = 2 ; j > 0 ; j-- ) -- { -- if ( !XGINew_SetRank( i , ( UCHAR )j , XGINew_ChannelAB , XGINew_SDRDRAM_TYPE , pVBInfo) ) -- continue ; -- else -- { -- if ( XGINew_CheckRanks( j , i , XGINew_SDRDRAM_TYPE, pVBInfo) ) -- return( 1 ) ; -- } -- } -- } -- return( 0 ) ; --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGINew_SetDRAMSizeReg */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --USHORT XGINew_SetDRAMSizeReg(int index, const USHORT DRAMTYPE_TABLE[][5], -- PVB_DEVICE_INFO pVBInfo) --{ -- USHORT data = 0 , memsize = 0 ; -- int RankSize ; -- UCHAR ChannelNo ; -- -- RankSize = DRAMTYPE_TABLE[ index ][ 3 ] * XGINew_DataBusWidth / 32 ; -- data = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x13 ) ; -- data &= 0x80 ; -- -- if ( data == 0x80 ) -- RankSize *= 2 ; -- -- data = 0 ; -- -- if( XGINew_ChannelAB == 3 ) -- ChannelNo = 4 ; -- else -- ChannelNo = XGINew_ChannelAB ; -- -- if ( ChannelNo * RankSize <= 256 ) -- { -- while( ( RankSize >>= 1 ) > 0 ) -- { -- data += 0x10 ; -- } -- -- memsize = data >> 4 ; -- -- /* [2004/03/25] Vicent, Fix DRAM Sizing Error */ -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , ( XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 ) & 0x0F ) | ( data & 0xF0 ) ) ; -- -- /* data |= XGINew_ChannelAB << 2 ; */ -- /* data |= ( XGINew_DataBusWidth / 64 ) << 1 ; */ -- /* XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , data ) ; */ -- -- /* should delay */ -- /* XGINew_SetDRAMModeRegister340( pVBInfo ) ; */ -- } -- return( memsize ) ; --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGINew_ReadWriteRest */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --int XGINew_ReadWriteRest( USHORT StopAddr, USHORT StartAddr, -- PVB_DEVICE_INFO pVBInfo) --{ -- int i ; -- ULONG Position = 0 ; -- -- *( ( PULONG )( pVBInfo->FBAddr + Position ) ) = Position ; -- -- for( i = StartAddr ; i <= StopAddr ; i++ ) -- { -- Position = 1 << i ; -- *( ( PULONG )( pVBInfo->FBAddr + Position ) ) = Position ; -- } -- -- DelayUS( 500 ) ; /* [Vicent] 2004/04/16. Fix #1759 Memory Size error in Multi-Adapter. */ -- -- Position = 0 ; -- -- if ( ( *( PULONG )( pVBInfo->FBAddr + Position ) ) != Position ) -- return( 0 ) ; -- -- for( i = StartAddr ; i <= StopAddr ; i++ ) -- { -- Position = 1 << i ; -- if ( ( *( PULONG )( pVBInfo->FBAddr + Position ) ) != Position ) -- return( 0 ) ; -- } -- return( 1 ) ; --} -- -- --/*--------------------------------------------------------------------- */ --/* Function : XGI45New_ReadWriteRest */ --/* Input : */ --/* Output : */ --/* Description : return 0 : fail, 1 : pass */ --/*--------------------------------------------------------------------- */ --int XGI45New_ReadWriteRest(USHORT StopAddr, USHORT StartAddr, -- PVB_DEVICE_INFO pVBInfo) --{ -- int i ; -- ULONG Position = 0 ; -- -- *( ( PULONG )( pVBInfo->FBAddr + Position ) ) = Position ; -- -- for( i = StartAddr ; i <= StopAddr ; i++ ) -- { -- Position = 1 << i ; -- *( ( PULONG )( pVBInfo->FBAddr + Position ) ) = Position ; -- } -- -- if ( XGINew_ChannelAB == 4 ) -- { -- Position = ( 1 << StopAddr ) + ( 1 << ( StopAddr - 1 ) ); -- *( ( PULONG )( pVBInfo->FBAddr + Position ) ) = Position ; -- } -- -- DelayUS( 500 ) ; /* [Vicent] 2004/04/16. Fix #1759 Memory Size error in Multi-Adapter. */ -- -- Position = 0 ; -- -- if ( ( *( PULONG )( pVBInfo->FBAddr + Position ) ) != Position ) -- return( 0 ) ; -- -- for( i = StartAddr ; i <= StopAddr ; i++ ) -- { -- Position = 1 << i ; -- if ( ( *( PULONG )( pVBInfo->FBAddr + Position ) ) != Position ) -- return( 0 ) ; -- } -- -- if ( XGINew_ChannelAB == 4 ) -- { -- Position = ( 1 << StopAddr ) + ( 1 << ( StopAddr - 1 ) ); -- if( ( *( PULONG )( pVBInfo->FBAddr + Position ) ) != Position ); -- return( 0 ) ; -- } -- return( 1 ) ; --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGINew_CheckFrequence */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --UCHAR XGINew_CheckFrequence(PVB_DEVICE_INFO pVBInfo) --{ -- UCHAR data ; -- -- data = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0x97 ) ; -- -- if ( ( data & 0x10 ) == 0 ) -- { -- data = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x39 ) ; -- data = ( data & 0x02 ) >> 1 ; -- return( data ) ; -- } -- else -- return( data & 0x01 ) ; --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGINew_CheckChannel */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --void XGINew_CheckChannel(PXGI_HW_DEVICE_INFO HwDeviceExtension, -- PVB_DEVICE_INFO pVBInfo) --{ -- UCHAR i, data ; -- -- switch( HwDeviceExtension->jChipType ) -- { -- case XG20: -- data = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0x97 ) ; -- data = data & 0x01; -- XGINew_ChannelAB = 1 ; /* XG20 "JUST" one channel */ -- -- if ( data == 0 ) /* Single_32_16 */ -- { -- XGINew_DataBusWidth = 32 ; /* 32 bits */ -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x13 , 0xB1 ) ; /* 22bit + 2 rank + 32bit */ -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , 0x52 ) ; -- -- if ( XGINew_ReadWriteRest( 24 , 23 , pVBInfo ) == 1 ) -- return ; -- -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x13 , 0x31 ) ; /* 22bit + 1 rank + 32bit */ -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , 0x42 ) ; -- -- if ( XGINew_ReadWriteRest( 23 , 23 , pVBInfo ) == 1 ) -- return ; -- -- XGINew_DataBusWidth = 16 ; /* 16 bits */ -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x13 , 0xB1 ) ; /* 22bit + 2 rank + 16bit */ -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , 0x41 ) ; -- -- if ( XGINew_ReadWriteRest( 23 , 22 , pVBInfo ) == 1 ) -- return ; -- else -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x13 , 0x31 ) ; -- -- } -- else /* Dual_16_8 */ -- { -- XGINew_DataBusWidth = 16 ; /* 16 bits */ -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x13 , 0xB1 ) ; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , 0x41 ) ; -- -- if ( XGINew_ReadWriteRest( 23 , 22 , pVBInfo ) == 1 ) -- return ; -- -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x13 , 0x31 ) ; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , 0x31 ) ; -- -- if ( XGINew_ReadWriteRest( 22 , 22 , pVBInfo ) == 1 ) -- return ; -- -- XGINew_DataBusWidth = 8 ; /* 8 bits */ -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x13 , 0xB1 ) ; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , 0x30 ) ; -- -- if ( XGINew_ReadWriteRest( 22 , 21 , pVBInfo ) == 1 ) -- return ; -- else -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x13 , 0x31 ) ; -- } -- break ; -- -- case XG41: -- if ( XGINew_CheckFrequence(pVBInfo) == 1 ) -- { -- XGINew_DataBusWidth = 32 ; /* 32 bits */ -- XGINew_ChannelAB = 3 ; /* Quad Channel */ -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x13 , 0xA1 ) ; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , 0x4C ) ; -- -- if ( XGINew_ReadWriteRest( 25 , 23 , pVBInfo ) == 1 ) -- return ; -- -- XGINew_ChannelAB = 2 ; /* Dual channels */ -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , 0x48 ) ; -- -- if ( XGINew_ReadWriteRest( 24 , 23 , pVBInfo ) == 1 ) -- return ; -- -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , 0x49 ) ; -- -- if ( XGINew_ReadWriteRest( 24 , 23 , pVBInfo ) == 1 ) -- return ; -- -- XGINew_ChannelAB = 3 ; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x13 , 0x21 ) ; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , 0x3C ) ; -- -- if ( XGINew_ReadWriteRest( 24 , 23 , pVBInfo ) == 1 ) -- return ; -- -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , 0x38 ) ; -- -- if ( XGINew_ReadWriteRest( 8 , 4 , pVBInfo ) == 1 ) -- return ; -- else -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , 0x39 ) ; -- } -- else -- { /* DDR */ -- XGINew_DataBusWidth = 64 ; /* 64 bits */ -- XGINew_ChannelAB = 2 ; /* Dual channels */ -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x13 , 0xA1 ) ; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , 0x5A ) ; -- -- if ( XGINew_ReadWriteRest( 25 , 24 , pVBInfo ) == 1 ) -- return ; -- -- XGINew_ChannelAB = 1 ; /* Single channels */ -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , 0x52 ) ; -- -- if ( XGINew_ReadWriteRest( 24 , 23 , pVBInfo ) == 1 ) -- return ; -- -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , 0x53 ) ; -- -- if ( XGINew_ReadWriteRest( 24 , 23 , pVBInfo ) == 1 ) -- return ; -- -- XGINew_ChannelAB = 2 ; /* Dual channels */ -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x13 , 0x21 ) ; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , 0x4A ) ; -- -- if ( XGINew_ReadWriteRest( 24 , 23 , pVBInfo ) == 1 ) -- return ; -- -- XGINew_ChannelAB = 1 ; /* Single channels */ -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , 0x42 ) ; -- -- if ( XGINew_ReadWriteRest( 8 , 4 , pVBInfo ) == 1 ) -- return ; -- else -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , 0x43 ) ; -- } -- -- break ; -- -- case XG42: --/* -- XG42 SR14 D[3] Reserve -- D[2] = 1, Dual Channel -- = 0, Single Channel -- -- It's Different from Other XG40 Series. --*/ -- if ( XGINew_CheckFrequence(pVBInfo) == 1 ) /* DDRII, DDR2x */ -- { -- XGINew_DataBusWidth = 32 ; /* 32 bits */ -- XGINew_ChannelAB = 2 ; /* 2 Channel */ -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x13 , 0xA1 ) ; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , 0x44 ) ; -- -- if ( XGINew_ReadWriteRest( 24 , 23 , pVBInfo ) == 1 ) -- return ; -- -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x13 , 0x21 ) ; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , 0x34 ) ; -- if ( XGINew_ReadWriteRest( 23 , 22 , pVBInfo ) == 1 ) -- return ; -- -- XGINew_ChannelAB = 1 ; /* Single Channel */ -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x13 , 0xA1 ) ; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , 0x40 ) ; -- -- if ( XGINew_ReadWriteRest( 23 , 22 , pVBInfo ) == 1 ) -- return ; -- else -- { -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x13 , 0x21 ) ; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , 0x30 ) ; -- } -- } -- else -- { /* DDR */ -- XGINew_DataBusWidth = 64 ; /* 64 bits */ -- XGINew_ChannelAB = 1 ; /* 1 channels */ -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x13 , 0xA1 ) ; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , 0x52 ) ; -- -- if ( XGINew_ReadWriteRest( 24 , 23 , pVBInfo ) == 1 ) -- return ; -- else -- { -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x13 , 0x21 ) ; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , 0x42 ) ; -- } -- } -- -- break ; -- -- case XG45: -- -- XGINew_DataBusWidth = 64 ; /* 64 bits */ -- XGINew_ChannelAB = 4 ; /* 3+1 Channel */ -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x13 , 0x21 ) ; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , 0x4C ) ; -- -- if ( XGI45New_ReadWriteRest( 25 , 24 , pVBInfo ) == 1 ) -- return ; -- -- XGINew_ChannelAB = 3 ; /* 3 Channel */ -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x13 , 0xA1 ) ; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , 0x58 ) ; -- -- if ( XGI45New_ReadWriteRest( 26 , 24 , pVBInfo ) == 1 ) -- return ; -- -- XGINew_ChannelAB = 2 ; /* 2 Channel */ -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x13 , 0xA1 ) ; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , 0x54 ) ; -- -- if ( XGI45New_ReadWriteRest( 25 , 24 , pVBInfo ) == 1 ) -- return ; -- -- XGINew_ChannelAB = 1 ; /* 1 Channel */ -- for ( i = 0; i <= 2; i++) -- { -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x13 , 0xA1 ) ; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , 0x50+i ) ; -- -- if ( XGI45New_ReadWriteRest( 24 , 23 , pVBInfo ) == 1 ) -- return ; -- } -- -- XGINew_ChannelAB = 3 ; /* 3 Channel */ -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x13 , 0x21 ) ; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , 0x58 ) ; -- -- if ( XGI45New_ReadWriteRest( 25 , 24 , pVBInfo ) == 1 ) -- return ; -- -- XGINew_ChannelAB = 2 ; /* 2 Channel */ -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x13 , 0x21 ) ; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , 0x54 ) ; -- -- if ( XGI45New_ReadWriteRest( 24 , 23 , pVBInfo ) == 1 ) -- return ; -- -- XGINew_ChannelAB = 1 ; /* 1 Channel */ -- for ( i = 0; i <= 2; i++) -- { -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x13 , 0x21 ) ; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , 0x50+i ) ; -- -- if ( XGI45New_ReadWriteRest( 23 , 22 , pVBInfo ) == 1 ) -- return ; -- } -- break ; -- -- default: /* XG40 */ -- -- if ( XGINew_CheckFrequence(pVBInfo) == 1 ) /* DDRII */ -- { -- XGINew_DataBusWidth = 32 ; /* 32 bits */ -- XGINew_ChannelAB = 3 ; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x13 , 0xA1 ) ; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , 0x4C ) ; -- -- if ( XGINew_ReadWriteRest( 25 , 23 , pVBInfo ) == 1 ) -- return ; -- -- XGINew_ChannelAB = 2 ; /* 2 channels */ -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , 0x48 ) ; -- -- if ( XGINew_ReadWriteRest( 24 , 23 , pVBInfo ) == 1 ) -- return ; -- -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x13 , 0x21 ) ; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , 0x3C ) ; -- -- if ( XGINew_ReadWriteRest( 24 , 23 , pVBInfo ) == 1 ) -- XGINew_ChannelAB = 3 ; /* 4 channels */ -- else -- { -- XGINew_ChannelAB = 2 ; /* 2 channels */ -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , 0x38 ) ; -- } -- } -- else -- { /* DDR */ -- XGINew_DataBusWidth = 64 ; /* 64 bits */ -- XGINew_ChannelAB = 2 ; /* 2 channels */ -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x13 , 0xA1 ) ; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , 0x5A ) ; -- -- if ( XGINew_ReadWriteRest( 25 , 24 , pVBInfo ) == 1 ) -- return ; -- else -- { -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x13 , 0x21 ) ; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , 0x4A ) ; -- } -- } -- break ; -- } --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGINew_DDRSizing340 */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --int XGINew_DDRSizing340( PXGI_HW_DEVICE_INFO HwDeviceExtension, PVB_DEVICE_INFO pVBInfo) --{ -- int i ; -- USHORT memsize , addr ; -- -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x15 , 0x00 ) ; /* noninterleaving */ -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x1C , 0x00 ) ; /* nontiling */ -- XGINew_CheckChannel( HwDeviceExtension, pVBInfo ) ; -- -- for( i = 0 ; i < 4 ; i++ ) -- { -- XGINew_SetDRAMSizingType( i , XGINew_DDRDRAM_TYPE340, pVBInfo ) ; -- memsize = XGINew_SetDRAMSizeReg( i , XGINew_DDRDRAM_TYPE340, pVBInfo ) ; -- if ( memsize == 0 ) -- continue ; -- -- addr = memsize + ( XGINew_ChannelAB - 2 ) + 20 ; -- if ( ( HwDeviceExtension->ulVideoMemorySize - 1 ) < ( ULONG )( 1 << addr ) ) -- continue ; -- -- if ( XGINew_ReadWriteRest( addr , 9, pVBInfo ) == 1 ) -- return( 1 ) ; -- } -- return( 0 ) ; --} -- -- --/*--------------------------------------------------------------------- */ --/* Function : XGINew_DDRSizingXG45 */ --/* Input : */ --/* Output : */ --/* Description : */ --/*--------------------------------------------------------------------- */ --int XGINew_DDRSizingXG45( PXGI_HW_DEVICE_INFO HwDeviceExtension, PVB_DEVICE_INFO pVBInfo) --{ -- int i ; -- USHORT memsize , addr ; -- -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x15 , 0x00 ) ; /* noninterleaving */ -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x1C , 0x00 ) ; /* nontiling */ -- XGINew_CheckChannel( HwDeviceExtension, pVBInfo ) ; -- -- for( i = 0 ; i < 4 ; i++ ) -- { -- XGINew_SetDRAMSizingType( i , XGINew_DDRDRAM_TYPE340, pVBInfo ) ; -- memsize = XGINew_SetDRAMSizeReg( i , XGINew_DDRDRAM_TYPE340, pVBInfo ) ; -- if ( memsize == 0 ) -- continue ; -- -- addr = memsize + ( XGINew_ChannelAB - 2 ) + 20 ; -- if ( ( HwDeviceExtension->ulVideoMemorySize - 1 ) < ( ULONG )( 1 << addr ) ) -- continue ; -- -- if ( XGI45New_ReadWriteRest( addr , 9, pVBInfo ) == 1 ) -- return( 1 ) ; -- } -- return( 0 ) ; --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGINew_DDRSizing */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --int XGINew_DDRSizing(PVB_DEVICE_INFO pVBInfo) --{ -- int i ; -- UCHAR j ; -- -- for( i = 0 ; i < 4 ; i++ ) -- { -- XGINew_SetDRAMSizingType( i , XGINew_DDRDRAM_TYPE, pVBInfo ) ; -- XGINew_DisableChannelInterleaving( i , XGINew_DDRDRAM_TYPE , pVBInfo) ; -- for( j = 2 ; j > 0 ; j-- ) -- { -- XGINew_SetDDRChannel( i , j , XGINew_ChannelAB , XGINew_DDRDRAM_TYPE , pVBInfo ) ; -- if ( !XGINew_SetRank( i , ( UCHAR )j , XGINew_ChannelAB , XGINew_DDRDRAM_TYPE, pVBInfo ) ) -- continue ; -- else -- { -- if ( XGINew_CheckDDRRanks( j , i , XGINew_DDRDRAM_TYPE, pVBInfo ) ) -- return( 1 ) ; -- } -- } -- } -- return( 0 ) ; --} -- --/* --------------------------------------------------------------------- */ --/* Function : XGINew_SetMemoryClock */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --void XGINew_SetMemoryClock( PXGI_HW_DEVICE_INFO HwDeviceExtension, PVB_DEVICE_INFO pVBInfo) --{ --#ifndef LINUX_XF86 -- UCHAR tempal ; --#endif -- -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x28 , pVBInfo->MCLKData[ XGINew_RAMType ].SR28 ) ; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x29 , pVBInfo->MCLKData[ XGINew_RAMType ].SR29 ) ; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x2A , pVBInfo->MCLKData[ XGINew_RAMType ].SR2A ) ; -- -- -- -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x2E , pVBInfo->ECLKData[ XGINew_RAMType ].SR2E ) ; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x2F , pVBInfo->ECLKData[ XGINew_RAMType ].SR2F ) ; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x30 , pVBInfo->ECLKData[ XGINew_RAMType ].SR30 ) ; -- -- /* [Vicent] 2004/07/07, When XG42 ECLK = MCLK = 207MHz, Set SR32 D[1:0] = 10b */ -- /* [Hsuan] 2004/08/20, Modify SR32 value, when MCLK=207MHZ, ELCK=250MHz, Set SR32 D[1:0] = 10b */ -- if ( HwDeviceExtension->jChipType == XG42 ) -- { -- if ( ( pVBInfo->MCLKData[ XGINew_RAMType ].SR28 == 0x1C ) && ( pVBInfo->MCLKData[ XGINew_RAMType ].SR29 == 0x01 ) -- && ( ( ( pVBInfo->ECLKData[ XGINew_RAMType ].SR2E == 0x1C ) && ( pVBInfo->ECLKData[ XGINew_RAMType ].SR2F == 0x01 ) ) -- || ( ( pVBInfo->ECLKData[ XGINew_RAMType ].SR2E == 0x22 ) && ( pVBInfo->ECLKData[ XGINew_RAMType ].SR2F == 0x01 ) ) ) ) -- { -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x32 , ( ( UCHAR )XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x32 ) & 0xFC ) | 0x02 ) ; -- } -- } --} -- -- --/* --------------------------------------------------------------------- */ --/* input : dx ,valid value : CR or second chip's CR */ --/* */ --/* SetPowerConsume : */ --/* Description: reduce 40/43 power consumption in first chip or */ --/* in second chip, assume CR A1 D[6]="1" in this case */ --/* output : none */ --/* --------------------------------------------------------------------- */ --void SetPowerConsume ( PXGI_HW_DEVICE_INFO HwDeviceExtension , USHORT XGI_P3d4Port ) --{ -- ULONG lTemp ; -- UCHAR bTemp; -- -- HwDeviceExtension->pQueryVGAConfigSpace( HwDeviceExtension , 0x08 , 0 , &lTemp ) ; /* Get */ -- if ((lTemp&0xFF)==0) -- { -- /* set CR58 D[5]=0 D[3]=0 */ -- XGI_SetRegAND((XGIIOADDRESS) XGI_P3d4Port , 0x58 , 0xD7 ) ; -- bTemp = (UCHAR) XGI_GetReg((XGIIOADDRESS) XGI_P3d4Port , 0xCB ) ; -- if (bTemp&0x20) -- { -- if (!(bTemp&0x10)) -- { -- XGI_SetRegANDOR((XGIIOADDRESS) XGI_P3d4Port , 0x58 , 0xD7 , 0x20 ) ; /* CR58 D[5]=1 D[3]=0 */ -- } -- else -- { -- XGI_SetRegANDOR((XGIIOADDRESS) XGI_P3d4Port , 0x58 , 0xD7 , 0x08 ) ; /* CR58 D[5]=0 D[3]=1 */ -- } -- -- } -- -- } --} -- -- --void XGINew_InitVBIOSData(PXGI_HW_DEVICE_INFO HwDeviceExtension, PVB_DEVICE_INFO pVBInfo) --{ -- -- /* ULONG ROMAddr = (ULONG)HwDeviceExtension->pjVirtualRomBase; */ -- pVBInfo->ROMAddr = HwDeviceExtension->pjVirtualRomBase ; -- pVBInfo->FBAddr = HwDeviceExtension->pjVideoMemoryAddress ; -- pVBInfo->BaseAddr = ( USHORT )HwDeviceExtension->pjIOAddress ; -- pVBInfo->RelIO = HwDeviceExtension->pjIOAddress - 0x30; -- pVBInfo->ISXPDOS = 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->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 ; -- -- pVBInfo->IF_DEF_LCDA = 1 ; -- 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 ; -- } -- 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 ; -- } -- -- if (HwDeviceExtension->jChipType != XG20) { -- /* alan, disable VideoCapture */ -- XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part0Port, 0x3F, 0xEF, 0x00); -- } -- -- XGI_GetVBType( pVBInfo ) ; /* Run XGI_GetVBType before InitTo330Pointer */ -- InitTo330Pointer(HwDeviceExtension->jChipType,pVBInfo); --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : ReadVBIOSTablData */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --void ReadVBIOSTablData( UCHAR ChipType , PVB_DEVICE_INFO pVBInfo) --{ --#ifndef LINUX_XF86 -- ULONG ulOffset ; -- UCHAR temp , index , l ; --#endif -- PUCHAR volatile pVideoMemory = ( PUCHAR )pVBInfo->ROMAddr ; -- ULONG i ; -- UCHAR j , k ; -- ULONG ii , jj ; -- -- i = pVideoMemory[ 0x1CF ] | ( pVideoMemory[ 0x1D0 ] << 8 ) ; /* UniROM */ -- if ( i != 0 ) -- UNIROM = 1 ; -- -- ii = 0x90 ; -- for( jj = 0x00 ; jj < 0x08 ; jj++ ) -- { -- pVBInfo->MCLKData[ jj ].SR28 = pVideoMemory[ ii ] ; -- pVBInfo->MCLKData[ jj ].SR29 = pVideoMemory[ ii + 1] ; -- pVBInfo->MCLKData[ jj ].SR2A = pVideoMemory[ ii + 2] ; -- pVBInfo->MCLKData[ jj ].CLOCK = pVideoMemory[ ii + 3 ] | ( pVideoMemory[ ii + 4 ] << 8 ) ; -- ii += 0x05 ; -- } -- -- ii = 0xB8 ; -- for( jj = 0x00 ; jj < 0x08 ; jj++ ) -- { -- pVBInfo->ECLKData[ jj ].SR2E = pVideoMemory[ ii ] ; -- pVBInfo->ECLKData[ jj ].SR2F=pVideoMemory[ ii + 1 ] ; -- pVBInfo->ECLKData[ jj ].SR30= pVideoMemory[ ii + 2 ] ; -- pVBInfo->ECLKData[ jj ].CLOCK= pVideoMemory[ ii + 3 ] | ( pVideoMemory[ ii + 4 ] << 8 ) ; -- ii += 0x05 ; -- } -- -- /* Volari customize data area start */ -- /* if ( ChipType == XG40 ) */ -- if ( ChipType >= XG40 ) -- { -- ii = 0xE0 ; -- for( jj = 0x00 ; jj < 0x03 ; jj++ ) -- { -- pVBInfo->SR15[ jj ][ 0 ] = pVideoMemory[ ii ] ; /* SR13, SR14, and SR18 */ -- pVBInfo->SR15[ jj ][ 1 ] = pVideoMemory[ ii + 1 ] ; -- pVBInfo->SR15[ jj ][ 2 ] = pVideoMemory[ ii + 2 ] ; -- pVBInfo->SR15[ jj ][ 3 ] = pVideoMemory[ ii + 3 ] ; -- pVBInfo->SR15[ jj ][ 4 ] = pVideoMemory[ ii + 4 ] ; -- pVBInfo->SR15[ jj ][ 5 ] = pVideoMemory[ ii + 5 ] ; -- pVBInfo->SR15[ jj ][ 6 ] = pVideoMemory[ ii + 6 ] ; -- pVBInfo->SR15[ jj ][ 7 ] = pVideoMemory[ ii + 7 ] ; -- ii += 0x08 ; -- } -- ii = 0x110 ; -- jj = 0x03 ; -- pVBInfo->SR15[ jj ][ 0 ] = pVideoMemory[ ii ] ; /* SR1B */ -- pVBInfo->SR15[ jj ][ 1 ] = pVideoMemory[ ii + 1 ] ; -- pVBInfo->SR15[ jj ][ 2 ] = pVideoMemory[ ii + 2 ] ; -- pVBInfo->SR15[ jj ][ 3 ] = pVideoMemory[ ii + 3 ] ; -- pVBInfo->SR15[ jj ][ 4 ] = pVideoMemory[ ii + 4 ] ; -- pVBInfo->SR15[ jj ][ 5 ] = pVideoMemory[ ii + 5 ] ; -- pVBInfo->SR15[ jj ][ 6 ] = pVideoMemory[ ii + 6 ] ; -- pVBInfo->SR15[ jj ][ 7 ] = pVideoMemory[ ii + 7 ] ; -- -- pVBInfo->SR07 = pVideoMemory[0x74]; -- pVBInfo->SR1F = pVideoMemory[0x75]; -- pVBInfo->SR21 = pVideoMemory[0x76]; -- pVBInfo->SR22 = pVideoMemory[0x77]; -- pVBInfo->SR23 = pVideoMemory[0x78]; -- pVBInfo->SR24 = pVideoMemory[0x79]; -- pVBInfo->SR25[0] = pVideoMemory[0x7A]; -- pVBInfo->SR31 = pVideoMemory[0x7B]; -- pVBInfo->SR32 = pVideoMemory[0x7C]; -- pVBInfo->SR33 = pVideoMemory[0x7D]; -- ii = 0xF8 ; -- -- for( jj = 0 ; jj < 3 ; jj++ ) -- { -- pVBInfo->CR40[ jj ][ 0 ] = pVideoMemory[ ii ] ; -- pVBInfo->CR40[ jj ][ 1 ] = pVideoMemory[ ii + 1 ] ; -- pVBInfo->CR40[ jj ][ 2 ] = pVideoMemory[ ii + 2 ] ; -- pVBInfo->CR40[ jj ][ 3 ] = pVideoMemory[ ii + 3 ] ; -- pVBInfo->CR40[ jj ][ 4 ] = pVideoMemory[ ii + 4 ] ; -- pVBInfo->CR40[ jj ][ 5 ] = pVideoMemory[ ii + 5 ] ; -- pVBInfo->CR40[ jj ][ 6 ] = pVideoMemory[ ii + 6 ] ; -- pVBInfo->CR40[ jj ][ 7 ] = pVideoMemory[ ii + 7 ] ; -- ii += 0x08 ; -- } -- -- ii = 0x118 ; -- for( j = 3 ; j < 24 ; j++ ) -- { -- pVBInfo->CR40[ j ][ 0 ] = pVideoMemory[ ii ] ; -- pVBInfo->CR40[ j ][ 1 ] = pVideoMemory[ ii + 1 ] ; -- pVBInfo->CR40[ j ][ 2 ] = pVideoMemory[ ii + 2 ] ; -- pVBInfo->CR40[ j ][ 3 ] = pVideoMemory[ ii + 3 ] ; -- pVBInfo->CR40[ j ][ 4 ] = pVideoMemory[ ii + 4 ] ; -- pVBInfo->CR40[ j ][ 5 ] = pVideoMemory[ ii + 5 ] ; -- pVBInfo->CR40[ j ][ 6 ] = pVideoMemory[ ii + 6 ] ; -- pVBInfo->CR40[ j ][ 7 ] = pVideoMemory[ ii + 7 ] ; -- ii += 0x08 ; -- } -- -- i = pVideoMemory[ 0x1C0 ] | ( pVideoMemory[ 0x1C1 ] << 8 ) ; -- -- for( j = 0 ; j < 8 ; j++ ) -- { -- for( k = 0 ; k < 4 ; k++ ) -- pVBInfo->CR6B[ j ][ k ] = pVideoMemory[ i + 4 * j + k ] ; -- } -- -- i = pVideoMemory[ 0x1C2 ] | ( pVideoMemory[ 0x1C3 ] << 8 ) ; -- -- if (ChipType == XG45) -- { -- for( j = 0 ; j < 8 ; j++ ) -- { -- pVBInfo->XG45CR6E[ j ] = pVideoMemory[i] ; -- } -- } -- else -- { -- for( j = 0 ; j < 8 ; j++ ) -- { -- for( k = 0 ; k < 4 ; k++ ) -- pVBInfo->CR6E[ j ][ k ] = pVideoMemory[ i + 4 * j + k ] ; -- } -- } -- -- i = pVideoMemory[ 0x1C4 ] | ( pVideoMemory[ 0x1C5 ] << 8 ) ; -- if (ChipType == XG45) -- { -- for( j = 0 ; j < 8 ; j++ ) -- { -- pVBInfo->XG45CR6F[ j ] = pVideoMemory[i] ; -- } -- } -- else -- { -- for( j = 0 ; j < 8 ; j++ ) -- { -- for( k = 0 ; k < 32 ; k++ ) -- pVBInfo->CR6F[ j ][ k ] = pVideoMemory[ i + 32 * j + k ] ; -- } -- } -- -- i = pVideoMemory[ 0x1C6 ] | ( pVideoMemory[ 0x1C7 ] << 8 ) ; -- -- for( j = 0 ; j < 8 ; j++ ) -- { -- for( k = 0 ; k < 2 ; k++ ) -- pVBInfo->CR89[ j ][ k ] = pVideoMemory[ i + 2 * j + k ] ; -- } -- -- i = pVideoMemory[ 0x1C8 ] | ( pVideoMemory[ 0x1C9 ] << 8 ) ; -- for( j = 0 ; j < 12 ; j++ ) -- pVBInfo->AGPReg[ j ] = pVideoMemory[ i + j ] ; -- -- i = pVideoMemory[ 0x1CF ] | ( pVideoMemory[ 0x1D0 ] << 8 ) ; -- for( j = 0 ; j < 4 ; j++ ) -- pVBInfo->SR16[ j ] = pVideoMemory[ i + j ] ; -- -- pVBInfo->CRCF = pVideoMemory[0x1CA]; -- pVBInfo->DRAMTypeDefinition = pVideoMemory[0x1CB]; -- pVBInfo->I2CDefinition = pVideoMemory[0x1D1]; -- if ( ChipType == XG20 ) -- pVBInfo->CR97 = pVideoMemory[0x1D2]; -- } -- /* Volari customize data area end */ --} -- --/* --------------------------------------------------------------------- */ --/* Function : XGINew_DDR1x_MRS_XG20 */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --void XGINew_DDR1x_MRS_XG20( USHORT P3c4 , PVB_DEVICE_INFO pVBInfo) --{ -- -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x18 , 0x01 ) ; -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x19 , 0x40 ) ; -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x16 , 0x00 ) ; -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x16 , 0x80 ) ; -- DelayUS( 60 ) ; -- -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x18 , 0x00 ) ; -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x19 , 0x40 ) ; -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x16 , 0x00 ) ; -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x16 , 0x80 ) ; -- DelayUS( 60 ) ; -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x18 , pVBInfo->SR15[ 2 ][ XGINew_RAMType ] ) ; /* SR18 */ -- /* XGI_SetReg((XGIIOADDRESS) P3c4 , 0x18 , 0x31 ) ; */ -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x19 , 0x01 ) ; -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x16 , 0x03 ) ; -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x16 , 0x83 ) ; -- DelayUS( 1000 ) ; -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x1B , 0x03 ) ; -- DelayUS( 500 ) ; -- /* XGI_SetReg((XGIIOADDRESS) P3c4 , 0x18 , 0x31 ) ; */ -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x18 , pVBInfo->SR15[ 2 ][ XGINew_RAMType ] ) ; /* SR18 */ -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x19 , 0x00 ) ; -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x16 , 0x03 ) ; -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x16 , 0x83 ) ; -- XGI_SetReg((XGIIOADDRESS) P3c4 , 0x1B , 0x00 ) ; --} -- --/* --------------------------------------------------------------------- */ --/* Function : XGINew_SetDRAMModeRegister_XG20 */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --void XGINew_SetDRAMModeRegister_XG20(PXGI_HW_DEVICE_INFO HwDeviceExtension, -- PVB_DEVICE_INFO pVBInfo) --{ --#ifndef LINUX_XF86 -- UCHAR data ; --#endif -- -- ReadVBIOSTablData( HwDeviceExtension->jChipType , pVBInfo) ; -- -- if ( XGINew_Get340DRAMType( HwDeviceExtension, pVBInfo) == 0 ) -- XGINew_DDR1x_MRS_XG20( pVBInfo->P3c4, pVBInfo ) ; -- else -- XGINew_DDR2x_MRS_340( HwDeviceExtension, pVBInfo->P3c4, pVBInfo ) ; -- -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x1B , 0x03 ) ; --} -- --/* -------------------------------------------------------- */ --/* Function : XGINew_ChkSenseStatus */ --/* Input : */ --/* Output : */ --/* Description : */ --/* -------------------------------------------------------- */ --void XGINew_ChkSenseStatus ( PXGI_HW_DEVICE_INFO HwDeviceExtension , PVB_DEVICE_INFO pVBInfo) --{ -- USHORT tempbx=0 , temp , tempcx , CR3CData; -- -- temp = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0x32 ) ; -- -- if ( temp & Monitor1Sense ) -- tempbx |= ActiveCRT1 ; -- if ( temp & LCDSense ) -- tempbx |= ActiveLCD ; -- if ( temp & Monitor2Sense ) -- tempbx |= ActiveCRT2 ; -- if ( temp & TVSense ) -- { -- tempbx |= ActiveTV ; -- if ( temp & AVIDEOSense ) -- tempbx |= ( ActiveAVideo << 8 ); -- if ( temp & SVIDEOSense ) -- tempbx |= ( ActiveSVideo << 8 ); -- if ( temp & SCARTSense ) -- tempbx |= ( ActiveSCART << 8 ); -- if ( temp & HiTVSense ) -- tempbx |= ( ActiveHiTV << 8 ); -- if ( temp & YPbPrSense ) -- tempbx |= ( ActiveYPbPr << 8 ); -- } -- -- tempcx = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0x3d ) ; -- tempcx |= ( XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0x3e ) << 8 ) ; -- -- if ( tempbx & tempcx ) -- { -- CR3CData = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0x3c ) ; -- if ( !( CR3CData & DisplayDeviceFromCMOS ) ) -- { -- tempcx = 0x1FF0 ; -- if (pVBInfo->SoftSetting & ModeSoftSetting) { -- tempbx = 0x1FF0 ; -- } -- } -- } -- else -- { -- tempcx = 0x1FF0 ; -- if (pVBInfo->SoftSetting & ModeSoftSetting) { -- tempbx = 0x1FF0 ; -- } -- } -- -- tempbx &= tempcx ; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x3d , ( tempbx & 0x00FF ) ) ; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x3e , ( ( tempbx & 0xFF00 ) >> 8 )) ; --} --/* -------------------------------------------------------- */ --/* Function : XGINew_SetModeScratch */ --/* Input : */ --/* Output : */ --/* Description : */ --/* -------------------------------------------------------- */ --void XGINew_SetModeScratch ( PXGI_HW_DEVICE_INFO HwDeviceExtension , PVB_DEVICE_INFO pVBInfo ) --{ -- USHORT temp , tempcl = 0 , tempch = 0 , CR31Data , CR38Data; -- -- temp = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0x3d ) ; -- temp |= XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0x3e ) << 8 ; -- temp |= ( XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0x31 ) & ( DriverMode >> 8) ) << 8 ; -- -- if ( pVBInfo->IF_DEF_CRT2Monitor == 1) -- { -- if ( temp & ActiveCRT2 ) -- tempcl = SetCRT2ToRAMDAC ; -- } -- -- if ( temp & ActiveLCD ) -- { -- tempcl |= SetCRT2ToLCD ; -- if ( temp & DriverMode ) -- { -- if ( temp & ActiveTV ) -- { -- tempch = SetToLCDA | EnableDualEdge ; -- temp ^= SetCRT2ToLCD ; -- -- if ( ( temp >> 8 ) & ActiveAVideo ) -- tempcl |= SetCRT2ToAVIDEO ; -- if ( ( temp >> 8 ) & ActiveSVideo ) -- tempcl |= SetCRT2ToSVIDEO ; -- if ( ( temp >> 8 ) & ActiveSCART ) -- tempcl |= SetCRT2ToSCART ; -- -- if ( pVBInfo->IF_DEF_HiVision == 1 ) -- { -- if ( ( temp >> 8 ) & ActiveHiTV ) -- tempcl |= SetCRT2ToHiVisionTV ; -- } -- -- if ( pVBInfo->IF_DEF_YPbPr == 1 ) -- { -- if ( ( temp >> 8 ) & ActiveYPbPr ) -- tempch |= SetYPbPr ; -- } -- } -- } -- } -- else -- { -- if ( ( temp >> 8 ) & ActiveAVideo ) -- tempcl |= SetCRT2ToAVIDEO ; -- if ( ( temp >> 8 ) & ActiveSVideo ) -- tempcl |= SetCRT2ToSVIDEO ; -- if ( ( temp >> 8 ) & ActiveSCART ) -- tempcl |= SetCRT2ToSCART ; -- -- if ( pVBInfo->IF_DEF_HiVision == 1 ) -- { -- if ( ( temp >> 8 ) & ActiveHiTV ) -- tempcl |= SetCRT2ToHiVisionTV ; -- } -- -- if ( pVBInfo->IF_DEF_YPbPr == 1 ) -- { -- if ( ( temp >> 8 ) & ActiveYPbPr ) -- tempch |= SetYPbPr ; -- } -- } -- -- -- tempcl |= SetSimuScanMode ; -- if ( (!( temp & ActiveCRT1 )) && ( ( temp & ActiveLCD ) || ( temp & ActiveTV ) || ( temp & ActiveCRT2 ) ) ) -- tempcl ^= ( SetSimuScanMode | SwitchToCRT2 ) ; -- if ( ( temp & ActiveLCD ) && ( temp & ActiveTV ) ) -- tempcl ^= ( SetSimuScanMode | SwitchToCRT2 ) ; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x30 , tempcl ) ; -- -- CR31Data = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0x31 ) ; -- CR31Data &= ~( SetNotSimuMode >> 8 ) ; -- if ( !( temp & ActiveCRT1 ) ) -- CR31Data |= ( SetNotSimuMode >> 8 ) ; -- CR31Data &= ~( DisableCRT2Display >> 8 ) ; -- if (!( ( temp & ActiveLCD ) || ( temp & ActiveTV ) || ( temp & ActiveCRT2 ) ) ) -- CR31Data |= ( DisableCRT2Display >> 8 ) ; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x31 , CR31Data ) ; -- -- CR38Data = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0x38 ) ; -- CR38Data &= ~SetYPbPr ; -- CR38Data |= tempch ; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x38 , CR38Data ) ; -- --} -+/* Copyright (C) 2003-2006 by XGI Technology, Taiwan. -+ * -+ * All Rights Reserved. -+ * -+ * Permission is hereby granted, free of charge, to any person obtaining -+ * a copy of this software and associated documentation files (the -+ * "Software"), to deal in the Software without restriction, including -+ * without limitation on the rights to use, copy, modify, merge, -+ * publish, distribute, sublicense, and/or sell copies of the Software, -+ * and to permit persons to whom the Software is furnished to do so, -+ * subject to the following conditions: -+ * -+ * The above copyright notice and this permission notice (including the -+ * next paragraph) shall be included in all copies or substantial -+ * portions of the Software. -+ * -+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -+ * NON-INFRINGEMENT. IN NO EVENT SHALL XGI AND/OR -+ * ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -+ * DEALINGS IN THE SOFTWARE. -+ */ -+#ifdef HAVE_CONFIG_H -+#include "config.h" -+#endif -+ -+#include "osdef.h" -+#include "vgatypes.h" -+ -+ -+#ifdef LINUX_KERNEL -+#include -+#include -+#include /* udelay */ -+#include "XGIfb.h" -+#endif -+ -+#include "vb_def.h" -+#include "vb_struct.h" -+#include "vb_setmode.h" -+#include "vb_init.h" -+#include "vb_ext.h" -+ -+#ifdef LINUX_XF86 -+#include "xf86.h" -+#include "xf86PciInfo.h" -+#include "xgi.h" -+#include "xgi_regs.h" -+#endif -+ -+#ifdef LINUX_KERNEL -+#include -+#include -+#endif -+ -+ -+ -+ -+static UCHAR XGINew_ChannelAB; -+static UCHAR XGINew_DataBusWidth; -+ -+USHORT XGINew_DRAMType[17][5]={{0x0C,0x0A,0x02,0x40,0x39},{0x0D,0x0A,0x01,0x40,0x48}, -+ {0x0C,0x09,0x02,0x20,0x35},{0x0D,0x09,0x01,0x20,0x44}, -+ {0x0C,0x08,0x02,0x10,0x31},{0x0D,0x08,0x01,0x10,0x40}, -+ {0x0C,0x0A,0x01,0x20,0x34},{0x0C,0x09,0x01,0x08,0x32}, -+ {0x0B,0x08,0x02,0x08,0x21},{0x0C,0x08,0x01,0x08,0x30}, -+ {0x0A,0x08,0x02,0x04,0x11},{0x0B,0x0A,0x01,0x10,0x28}, -+ {0x09,0x08,0x02,0x02,0x01},{0x0B,0x09,0x01,0x08,0x24}, -+ {0x0B,0x08,0x01,0x04,0x20},{0x0A,0x08,0x01,0x02,0x10}, -+ {0x09,0x08,0x01,0x01,0x00}}; -+ -+static const USHORT XGINew_SDRDRAM_TYPE[13][5]= -+{ -+ { 2,12, 9,64,0x35}, -+ { 1,13, 9,64,0x44}, -+ { 2,12, 8,32,0x31}, -+ { 2,11, 9,32,0x25}, -+ { 1,12, 9,32,0x34}, -+ { 1,13, 8,32,0x40}, -+ { 2,11, 8,16,0x21}, -+ { 1,12, 8,16,0x30}, -+ { 1,11, 9,16,0x24}, -+ { 1,11, 8, 8,0x20}, -+ { 2, 9, 8, 4,0x01}, -+ { 1,10, 8, 4,0x10}, -+ { 1, 9, 8, 2,0x00} -+}; -+ -+static const USHORT XGINew_DDRDRAM_TYPE[4][5]= -+{ -+ { 2,12, 9,64,0x35}, -+ { 2,12, 8,32,0x31}, -+ { 2,11, 8,16,0x21}, -+ { 2, 9, 8, 4,0x01} -+}; -+ -+static const USHORT XGINew_DDRDRAM_TYPE340[4][5]= -+{ -+ { 2,13, 9,64,0x45}, -+ { 2,12, 9,32,0x35}, -+ { 2,12, 8,16,0x31}, -+ { 2,11, 8, 8,0x21} -+}; -+ -+/* Jong 10/05/2007; merge code */ -+USHORT XGINew_DDRDRAM_TYPE20[12][5]= -+{ -+{ 2,14,11,128,0x5D}, -+{ 2,14,10,64,0x59}, -+{ 2,13,11,64,0x4D}, -+{ 2,14, 9,32,0x55}, -+{ 2,13,10,32,0x49}, -+{ 2,12,11,32,0x3D}, -+{ 2,14, 8,16,0x51}, -+{ 2,13, 9,16,0x45}, -+{ 2,12,10,16,0x39}, -+{ 2,13, 8, 8,0x41}, -+{ 2,12, 9, 8,0x35}, -+{ 2,12, 8, 4,0x31} -+}; -+ -+static void XGINew_SetDRAMSize_340(PXGI_HW_DEVICE_INFO, PVB_DEVICE_INFO); -+static void XGINew_SetDRAMSize_XG45(PXGI_HW_DEVICE_INFO, PVB_DEVICE_INFO); -+static void XGINew_SetMemoryClock(PXGI_HW_DEVICE_INFO, PVB_DEVICE_INFO); -+static void XGINew_SetDRAMModeRegister340(PXGI_HW_DEVICE_INFO, PVB_DEVICE_INFO); -+static void XGINew_SetDRAMDefaultRegister340(PXGI_HW_DEVICE_INFO, USHORT, -+ PVB_DEVICE_INFO); -+static void XGINew_SetDRAMDefaultRegisterXG45(PXGI_HW_DEVICE_INFO, USHORT, -+ PVB_DEVICE_INFO); -+static UCHAR XGINew_Get340DRAMType(PXGI_HW_DEVICE_INFO, PVB_DEVICE_INFO); -+ -+static int XGINew_SetDDRChannel(int index, UCHAR ChannelNo, -+ UCHAR XGINew_ChannelAB, const USHORT DRAMTYPE_TABLE[][5], -+ PVB_DEVICE_INFO pVBInfo); -+ -+static void XGINew_SetDRAMSizingType(int index , -+ const USHORT DRAMTYPE_TABLE[][5], PVB_DEVICE_INFO pVBInfo); -+static USHORT XGINew_SetDRAMSizeReg(int index, -+ const USHORT DRAMTYPE_TABLE[][5], PVB_DEVICE_INFO pVBInfo); -+ -+static int XGINew_SetRank(int index, UCHAR RankNo, UCHAR XGINew_ChannelAB, -+ const USHORT DRAMTYPE_TABLE[][5], PVB_DEVICE_INFO pVBInfo); -+ -+static int XGINew_CheckRanks(int RankNo, int index, -+ const USHORT DRAMTYPE_TABLE[][5], PVB_DEVICE_INFO pVBInfo); -+static int XGINew_CheckRank(int RankNo, int index, -+ const USHORT DRAMTYPE_TABLE[][5], PVB_DEVICE_INFO pVBInfo); -+static int XGINew_CheckDDRRank(int RankNo, int index, -+ const USHORT DRAMTYPE_TABLE[][5], PVB_DEVICE_INFO pVBInfo); -+static int XGINew_CheckDDRRanks(int RankNo, int index, -+ const USHORT DRAMTYPE_TABLE[][5], PVB_DEVICE_INFO pVBInfo); -+ -+static int XGINew_CheckBanks(int index, const USHORT DRAMTYPE_TABLE[][5], -+ PVB_DEVICE_INFO pVBInfo); -+static int XGINew_CheckColumn(int index, const USHORT DRAMTYPE_TABLE[][5], -+ PVB_DEVICE_INFO pVBInfo); -+ -+static int XGINew_DDRSizing340(PXGI_HW_DEVICE_INFO, PVB_DEVICE_INFO); -+static int XGINew_DDRSizingXG45(PXGI_HW_DEVICE_INFO, PVB_DEVICE_INFO); -+static int XGINew_SDRSizing(PVB_DEVICE_INFO); -+static int XGINew_DDRSizing(PVB_DEVICE_INFO); -+ -+/* Jong 10/05/2007; merge code */ -+static void XGINew_GetXG21Sense(PXGI_HW_DEVICE_INFO HwDeviceExtension, PVB_DEVICE_INFO pVBInfo) ; -+static UCHAR GetXG21FPBits(PVB_DEVICE_INFO pVBInfo); -+static void XGINew_GetXG27Sense(PXGI_HW_DEVICE_INFO HwDeviceExtension, PVB_DEVICE_INFO pVBInfo) ; -+static UCHAR GetXG27FPBits(PVB_DEVICE_INFO pVBInfo); -+ -+static void XGINew_DDR_MRS(PVB_DEVICE_INFO pVBInfo); -+static void XGINew_SDR_MRS(PVB_DEVICE_INFO pVBInfo); -+static void XGINew_DDR1x_MRS_340(PXGI_HW_DEVICE_INFO HwDeviceExtension, -+ USHORT P3c4, PVB_DEVICE_INFO pVBInfo); -+static void XGINew_DDR2x_MRS_340(PXGI_HW_DEVICE_INFO HwDeviceExtension, -+ USHORT P3c4, PVB_DEVICE_INFO pVBInfo); -+static void XGINew_DDR2_MRS_340(PXGI_HW_DEVICE_INFO HwDeviceExtension, -+ USHORT P3c4, PVB_DEVICE_INFO pVBInfo); -+static void XGINew_DDR1x_DefaultRegister(PXGI_HW_DEVICE_INFO HwDeviceExtension, -+ USHORT Port, PVB_DEVICE_INFO pVBInfo); -+static void XGINew_DDR2x_DefaultRegister(PXGI_HW_DEVICE_INFO HwDeviceExtension, -+ USHORT Port, PVB_DEVICE_INFO pVBInfo); -+static void XGINew_DDR2_DefaultRegister(PXGI_HW_DEVICE_INFO HwDeviceExtension, -+ USHORT Port, PVB_DEVICE_INFO pVBInfo); -+ -+static void XGINew_DisableChannelInterleaving(int index, -+ const USHORT XGINew_DDRDRAM_TYPE[][5], PVB_DEVICE_INFO pVBInfo); -+ -+static void DualChipInit(PXGI_HW_DEVICE_INFO, PVB_DEVICE_INFO); -+ -+static void XGINew_DisableRefresh(PXGI_HW_DEVICE_INFO ,PVB_DEVICE_INFO); -+static void XGINew_EnableRefresh(PXGI_HW_DEVICE_INFO, PVB_DEVICE_INFO); -+ -+static void XGINew_Delay15us(ULONG); -+static void SetPowerConsume(PXGI_HW_DEVICE_INFO, USHORT); -+static void XGINew_DDR1x_MRS_XG20(USHORT, PVB_DEVICE_INFO); -+static void XGINew_SetDRAMModeRegister_XG20(PXGI_HW_DEVICE_INFO, PVB_DEVICE_INFO); -+static void XGINew_ChkSenseStatus(PXGI_HW_DEVICE_INFO, PVB_DEVICE_INFO); -+ -+static int XGINew_ReadWriteRest( USHORT StopAddr, USHORT StartAddr, -+ PVB_DEVICE_INFO pVBInfo); -+static int XGI45New_ReadWriteRest(USHORT StopAddr, USHORT StartAddr, -+ PVB_DEVICE_INFO pVBInfo); -+static UCHAR XGINew_CheckFrequence(PVB_DEVICE_INFO pVBInfo); -+static void XGINew_CheckChannel(PXGI_HW_DEVICE_INFO HwDeviceExtension, -+ PVB_DEVICE_INFO pVBInfo); -+ -+static int XGINew_RAMType; /*int ModeIDOffset,StandTable,CRT1Table,ScreenOffset,REFIndex;*/ -+static ULONG UNIROM; /* UNIROM */ -+ -+ -+#ifdef LINUX_KERNEL -+void DelayUS(ULONG MicroSeconds) -+{ -+ udelay(MicroSeconds); -+} -+#endif -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGIInitNew */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+BOOLEAN XGIInitNew(PXGI_HW_DEVICE_INFO HwDeviceExtension, -+ PVB_DEVICE_INFO pVBInfo) -+{ -+#ifndef LINUX_XF86 -+ USHORT Mclockdata[ 30 ] , Eclockdata[ 30 ] ; -+ UCHAR j , SR11 , SR17 = 0 , SR18 = 0 , SR19 = 0 ; -+ UCHAR CR37 = 0 , CR38 = 0 , CR79 = 0 , CR7A = 0 , -+ CR7B = 0 , CR36 = 0 , CR78 = 0 , CR3C = 0 , -+ CR3D = 0 , CR3E = 0 , CR3F = 0 , CR35 = 0 ; -+#endif -+ UCHAR i , temp = 0 , temp1 , -+ VBIOSVersion[ 5 ] ; -+ ULONG base,ChipsetID,VendorID,GraphicVendorID; -+ PUCHAR volatile pVideoMemory; -+ -+ /* ULONG j, k ; */ -+ -+ PXGI_DSReg pSR ; -+ -+ ULONG Temp ; -+ -+ -+ XGINew_InitVBIOSData(HwDeviceExtension, pVBInfo); -+ -+ pVideoMemory = ( PUCHAR )pVBInfo->ROMAddr; -+ -+ -+ Newdebugcode( 0x99 ) ; -+ -+ /* if ( pVBInfo->ROMAddr == 0 ) */ -+ /* return( FALSE ) ; */ -+ -+ if ( pVBInfo->FBAddr == 0 ) -+ return( FALSE ) ; -+ -+ if ( pVBInfo->BaseAddr == 0 ) -+ return( FALSE ) ; -+ -+ XGI_SetRegByte((XGIIOADDRESS) ( USHORT )( pVBInfo->BaseAddr + 0x12 ) , 0x67 ) ; /* 3c2 <- 67 ,ynlai */ -+ -+ -+ if ( !HwDeviceExtension->bIntegratedMMEnabled ) -+ return( FALSE ) ; /* alan */ -+ -+ -+ -+ XGI_MemoryCopy( VBIOSVersion , HwDeviceExtension->szVBIOSVer , 4 ) ; -+ -+ VBIOSVersion[ 4 ] = 0x0 ; -+ -+ -+ /* ReadVBIOSData */ -+ ReadVBIOSTablData( HwDeviceExtension->jChipType , pVBInfo) ; -+ -+ /* 1.Openkey */ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x05 , 0x86 ) ; -+ -+ -+ -+ /* 2.Reset Extended register */ -+ -+ for( i = 0x06 ; i < 0x20 ; i++ ) -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , i , 0 ) ; -+ -+ for( i = 0x21 ; i <= 0x27 ; i++ ) -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , i , 0 ) ; -+ -+ /* for( i = 0x06 ; i <= 0x27 ; i++ ) */ -+ /* XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , i , 0 ) ; */ -+ -+ -+ if(( HwDeviceExtension->jChipType == XG20 ) || ( HwDeviceExtension->jChipType >= XG40)) -+ { -+ for( i = 0x31 ; i <= 0x3B ; i++ ) -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , i , 0 ) ; -+ } -+ else -+ { -+ for( i = 0x31 ; i <= 0x3D ; i++ ) -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , i , 0 ) ; -+ } -+ -+ if ( HwDeviceExtension->jChipType == XG42 ) /* [Hsuan] 2004/08/20 Auto over driver for XG42 */ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x3B , 0xC0 ) ; -+ -+ /* for( i = 0x30 ; i <= 0x3F ; i++ ) */ -+ /* XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4 , i , 0 ) ; */ -+ -+ for( i = 0x79 ; i <= 0x7C ; i++ ) -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4 , i , 0 ) ; /* shampoo 0208 */ -+ -+ /* Jong 10/01/2007; SetDefPCIRegs */ /* alan 12/07/2006 */ -+ if ( HwDeviceExtension->jChipType == XG27 ) -+ { -+ for( i = 0xD0 ; i <= 0xDB ; i++ ) -+ XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4 , i , pVBInfo->pCRD0[i-0xd0] ) ; -+ for( i = 0xDE ; i <= 0xDF ; i++ ) -+ XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4 , i , pVBInfo->pCRDE[i-0xdE] ) ; -+ } -+ -+ -+ if ( HwDeviceExtension->jChipType >= XG20 ) -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x97, pVBInfo->CR97); -+ -+ /* 3.SetMemoryClock */ -+ if (!(pVBInfo->SoftSetting & SoftDRAMType)) { -+ if (( HwDeviceExtension->jChipType == XG20 )||( HwDeviceExtension->jChipType == XG21 )||( HwDeviceExtension->jChipType == XG27 )) -+ { -+ temp = ( UCHAR )XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0x97 ) ; -+ } -+ else if (HwDeviceExtension->jChipType == XG45) -+ { -+ temp = 0x02 ; -+ } -+ else -+ { -+ temp = ( UCHAR )XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x3A ) ; -+ } -+ } -+ -+ -+ if ( HwDeviceExtension->jChipType == XG20 ) -+ XGINew_RAMType = temp & 0x01 ; -+ else -+ { -+ XGINew_RAMType = temp & 0x03 ; /* alan */ -+ } -+ -+ /* Get DRAM type */ -+ if ( HwDeviceExtension->jChipType == XG45 ) -+ { } -+ else if ( HwDeviceExtension->jChipType >= XG40 ) -+ XGINew_RAMType = ( int )XGINew_Get340DRAMType( HwDeviceExtension , pVBInfo) ; -+ -+ if ( UNIROM == 1 ) XGINew_RAMType = 0; -+ -+ if ( HwDeviceExtension->jChipType < XG40 ) -+ XGINew_SetMemoryClock( HwDeviceExtension , pVBInfo ) ; -+ -+ /* 4.SetDefExt1Regs begin */ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x07, pVBInfo->SR07); -+ -+ /* Jong 10/01/2007; add for ??? */ -+ if ( HwDeviceExtension->jChipType == XG27 ) -+ { -+ XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3c4 , 0x40 , *pVBInfo->pSR40 ) ; -+ XGI_SetReg( (XGIIOADDRESS)pVBInfo->P3c4 , 0x41 , *pVBInfo->pSR41 ) ; -+ } -+ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x11, 0x0F); -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x1F, pVBInfo->SR1F); -+ /* XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x20, 0x20); */ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x20, 0xA0); /* alan, 2001/6/26 Frame buffer can read/write SR20 */ -+ -+ /* Jong 10/01/2007; added for ??? */ -+ XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3c4 , 0x36 , 0x70 ) ; /* Hsuan, 2006/01/01 H/W request for slow corner chip */ -+ if ( HwDeviceExtension->jChipType == XG27 ) /* Alan 12/07/2006 */ -+ XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3c4 , 0x36 , *pVBInfo->pSR36 ) ; -+ -+ /* SR11 = 0x0F ; */ -+ /* XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x11 , SR11 ) ; */ -+ -+ -+ if ( (HwDeviceExtension->jChipType != XG20) -+ &&(HwDeviceExtension->jChipType != XG21) -+ &&(HwDeviceExtension->jChipType != XG27) -+ &&(HwDeviceExtension->jChipType != XG45) ) /* kuku 2004/06/25 */ -+ { -+ /* Set AGP Rate */ -+ temp1 = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x3B ) ; -+ temp1 &= 0x02 ; -+ if ( temp1 == 0x02 ) -+ { -+ XGI_SetRegLong((XGIIOADDRESS) 0xcf8 , 0x80000000 ) ; -+ ChipsetID = XGI_GetRegLong((XGIIOADDRESS) 0x0cfc ) ; -+ XGI_SetRegLong((XGIIOADDRESS) 0xcf8 , 0x8000002C ) ; -+ VendorID = XGI_GetRegLong((XGIIOADDRESS) 0x0cfc ) ; -+ VendorID &= 0x0000FFFF ; -+ XGI_SetRegLong((XGIIOADDRESS) 0xcf8 , 0x8001002C ) ; -+ GraphicVendorID = XGI_GetRegLong((XGIIOADDRESS) 0x0cfc ) ; -+ GraphicVendorID &= 0x0000FFFF; -+ -+ if ( ChipsetID == 0x7301039 ) -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0x5F , 0x09 ) ; -+ -+ ChipsetID &= 0x0000FFFF ; -+ -+ if ( ( ChipsetID == 0x700E ) || ( ChipsetID == 0x1022 ) || ( ChipsetID == 0x1106 ) || ( ChipsetID == 0x10DE ) ) -+ { -+ if ( ChipsetID == 0x1106 ) -+ { -+ if ( ( VendorID == 0x1019 ) && ( GraphicVendorID == 0x1019 ) ) -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0x5F , 0x0D ) ; -+ else -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0x5F , 0x0B ) ; -+ } -+ else -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0x5F , 0x0B ) ; -+ } -+ } -+ -+ if ( HwDeviceExtension->jChipType >= XG40 ) -+ { -+ /* Set AGP customize registers (in SetDefAGPRegs) Start */ -+ for( i = 0x47 ; i <= 0x4C ; i++ ) -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4 , i , pVBInfo->AGPReg[ i - 0x47 ] ) ; -+ -+ for( i = 0x70 ; i <= 0x71 ; i++ ) -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4 , i , pVBInfo->AGPReg[ 6 + i - 0x70 ] ) ; -+ -+ for( i = 0x74 ; i <= 0x77 ; i++ ) -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4 , i , pVBInfo->AGPReg[ 8 + i - 0x74 ] ) ; -+ /* Set AGP customize registers (in SetDefAGPRegs) End */ -+ /*[Hsuan]2004/12/14 AGP Input Delay Adjustment on 850 */ -+ XGI_SetRegLong((XGIIOADDRESS) 0xcf8 , 0x80000000 ) ; -+ ChipsetID = XGI_GetRegLong((XGIIOADDRESS) 0x0cfc ) ; -+ if ( ChipsetID == 0x25308086 ) -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0x77 , 0xF0 ) ; -+ -+ HwDeviceExtension->pQueryVGAConfigSpace( HwDeviceExtension , 0x50 , 0 , &Temp ) ; /* Get */ -+ Temp >>= 20 ; -+ Temp &= 0xF ; -+ -+ if ( Temp == 1 ) -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0x48 , 0x20 ) ; /* CR48 */ -+ } -+ -+ if ( HwDeviceExtension->jChipType < XG40 ) -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0x49 , pVBInfo->CR49[ 0 ] ) ; -+ } /* != XG20 */ -+ -+ /* Set PCI */ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x23, pVBInfo->SR23); -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x24, pVBInfo->SR24); -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x25, pVBInfo->SR25[0]); -+ -+ if ( (HwDeviceExtension->jChipType != XG20) && -+ (HwDeviceExtension->jChipType != XG21) && -+ (HwDeviceExtension->jChipType != XG27) ) /* kuku 2004/06/25 */ -+ { -+ /* Set VB */ -+ XGI_UnLockCRT2( HwDeviceExtension, pVBInfo) ; -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part0Port , 0x3F , 0xEF , 0x00 ) ; /* alan, disable VideoCapture */ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port , 0x00 , 0x00 ) ; -+ temp1 = ( UCHAR )XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0x7B ) ; /* chk if BCLK>=100MHz */ -+ temp = ( UCHAR )( ( temp1 >> 4 ) & 0x0F ) ; -+ -+ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x02, -+ pVBInfo->CRT2Data_1_2); -+ -+ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port , 0x2E , 0x08 ) ; /* use VB */ -+ } /* != XG20 */ -+ -+ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x27 , 0x1F ) ; -+ -+ /* Not DDR */ -+ if ((HwDeviceExtension->jChipType == XG42) -+ && XGINew_Get340DRAMType(HwDeviceExtension, pVBInfo) != 0) { -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x31, (pVBInfo->SR31 & 0x3F) | 0x40); -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x32, (pVBInfo->SR32 & 0xFC) | 0x01); -+ } -+ else { -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x31, pVBInfo->SR31); -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x32, pVBInfo->SR32); -+ } -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x33, pVBInfo->SR33); -+ -+ -+ -+ if ( HwDeviceExtension->jChipType >= XG40 ) -+ SetPowerConsume ( HwDeviceExtension , pVBInfo->P3c4); -+ -+ if ( (HwDeviceExtension->jChipType != XG20) && -+ (HwDeviceExtension->jChipType != XG21) && -+ (HwDeviceExtension->jChipType != XG27) ) /* kuku 2004/06/25 */ -+ { -+ if ( XGI_BridgeIsOn( pVBInfo ) == 1 ) -+ { -+ { -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x00, 0x1C); -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x0D, pVBInfo->CRT2Data_4_D); -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x0E, pVBInfo->CRT2Data_4_E); -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x10, pVBInfo->CRT2Data_4_10); -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x0F, 0x3F); -+ } -+ -+ XGI_LockCRT2( HwDeviceExtension, pVBInfo ) ; -+ } -+ } /* != XG20 */ -+ -+ if ( HwDeviceExtension->jChipType < XG40 ) -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0x83 , 0x00 ) ; -+ -+ -+ /* Jong 10/01/2007; added for ??? */ -+ if ( HwDeviceExtension->bSkipSense == FALSE ) -+ { -+ XGI_SenseCRT1(pVBInfo) ; -+ /* XGINew_DetectMonitor( HwDeviceExtension ) ; */ -+ if ( ( HwDeviceExtension->jChipType == XG21 ) && (pVBInfo->IF_DEF_CH7007) ) -+ { -+ XGI_GetSenseStatus( HwDeviceExtension , pVBInfo ) ; /* sense CRT2 */ -+ } -+ if ( HwDeviceExtension->jChipType == XG21 ) -+ { -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3d4 , 0x32 , ~Monitor1Sense , Monitor1Sense ) ; /* Z9 default has CRT */ -+ temp = GetXG21FPBits( pVBInfo ) ; -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3d4 , 0x37 , ~0x01, temp ) ; -+ } -+ if ( HwDeviceExtension->jChipType == XG27 ) -+ { -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3d4 , 0x32 , ~Monitor1Sense , Monitor1Sense ) ; /* Z9 default has CRT */ -+ temp = GetXG27FPBits( pVBInfo ) ; -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3d4 , 0x37 , ~0x03, temp ) ; -+ } -+ } -+ -+ if ( HwDeviceExtension->jChipType >= XG40 ) -+ { -+ if (HwDeviceExtension->jChipType == XG45) -+ XGINew_SetDRAMDefaultRegisterXG45( HwDeviceExtension , pVBInfo->P3d4, pVBInfo ) ; -+ else -+ XGINew_SetDRAMDefaultRegister340( HwDeviceExtension , pVBInfo->P3d4, pVBInfo ) ; -+ -+ if ( HwDeviceExtension->bSkipDramSizing == TRUE ) -+ { -+ pSR = HwDeviceExtension->pSR ; -+ if ( pSR!=NULL ) -+ { -+ while( pSR->jIdx != 0xFF ) -+ { -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , pSR->jIdx , pSR->jVal ) ; -+ pSR++ ; -+ } -+ } -+ /* XGINew_SetDRAMModeRegister340( pVBInfo ) ; */ -+ } /* SkipDramSizing */ -+ else -+ { -+/* if ( HwDeviceExtension->jChipType == XG20 ) -+ { -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x13 , pVBInfo->SR15[0][XGINew_RAMType] ) ; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , pVBInfo->SR15[1][XGINew_RAMType] ) ; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x20 , 0x20 ) ; -+ } -+ else*/ -+ if ( HwDeviceExtension->jChipType == XG45 ) -+ XGINew_SetDRAMSize_XG45( HwDeviceExtension , pVBInfo) ; -+ else -+ XGINew_SetDRAMSize_340( HwDeviceExtension , pVBInfo) ; -+ } -+ } /* XG40 */ -+ -+ -+ -+ -+ /* SetDefExt2Regs begin */ -+/* -+ AGP = 1 ; -+ temp =( UCHAR )XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x3A ) ; -+ temp &= 0x30 ; -+ if ( temp == 0x30 ) -+ AGP = 0 ; -+ -+ if ( AGP == 0 ) -+ pVBInfo->SR21 &= 0xEF ; -+ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x21 , pVBInfo->SR21 ) ; -+ if ( AGP == 1 ) -+ pVBInfo->SR22 &= 0x20; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x22 , pVBInfo->SR22 ) ; -+*/ -+ -+ base = 0x80000000; -+ XGI_SetRegLong(0xcf8, base); -+ Temp = (XGI_GetRegLong(0xcfc) & 0x0000FFFF); -+ if (Temp == 0x1039) { -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x22, pVBInfo->SR22 & 0xFE); -+ } -+ else { -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x22, pVBInfo->SR22); -+ } -+ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x21, pVBInfo->SR21); -+ -+ if ( HwDeviceExtension->jChipType == XG40 ) /* Initialize seconary chip */ -+ { -+ if ( CheckDualChip(pVBInfo) ) -+ DualChipInit( HwDeviceExtension , pVBInfo) ; -+ /* SetDefExt2Regs end */ -+ } -+ -+ /* Jong 10/01/2007; be removed and recoded */ -+#if 0 -+ if ( HwDeviceExtension->bSkipSense == FALSE ) -+ { -+ XGI_SenseCRT1(pVBInfo) ; -+ /* XGINew_DetectMonitor( HwDeviceExtension ) ; */ -+ XGI_GetSenseStatus( HwDeviceExtension , pVBInfo ) ; /* sense CRT2 */ -+ } -+#endif -+ -+ XGINew_ChkSenseStatus ( HwDeviceExtension , pVBInfo ) ; -+ XGINew_SetModeScratch ( HwDeviceExtension , pVBInfo ) ; -+ -+ Newdebugcode( 0x88 ) ; -+ -+ /* Johnson@062403. To save time for power management. */ -+ /* DelayMS(1000); */ -+ /* ~Johnson@062403. */ -+ /* XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0x32 , 0x28 ) ; //0207 temp */ -+ /* XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0x36 , 0x02 ) ; //0207 temp */ -+ -+ return( TRUE ) ; -+} /* end of init */ -+ -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : DualChipInit */ -+/* Input : */ -+/* Output : */ -+/* Description : Initialize the secondary chip. */ -+/* --------------------------------------------------------------------- */ -+void DualChipInit( PXGI_HW_DEVICE_INFO HwDeviceExtension ,PVB_DEVICE_INFO pVBInfo) -+{ -+#ifdef LINUX_XF86 -+ USHORT BaseAddr2nd = (USHORT)(ULONG)HwDeviceExtension->pj2ndIOAddress ; -+#else -+ USHORT BaseAddr2nd = (USHORT)HwDeviceExtension->pj2ndIOAddress ; -+#endif -+ USHORT XGINew_P3C3 = pVBInfo->BaseAddr + VIDEO_SUBSYSTEM_ENABLE_PORT ; -+ USHORT XGINew_P3CC = pVBInfo->BaseAddr + MISC_OUTPUT_REG_READ_PORT ; -+ USHORT XGINew_2ndP3C3 = BaseAddr2nd + VIDEO_SUBSYSTEM_ENABLE_PORT ; -+ USHORT XGINew_2ndP3D4 = BaseAddr2nd + CRTC_ADDRESS_PORT_COLOR ; -+ USHORT XGINew_2ndP3C4 = BaseAddr2nd + SEQ_ADDRESS_PORT ; -+ USHORT XGINew_2ndP3C2 = BaseAddr2nd + MISC_OUTPUT_REG_WRITE_PORT ; -+ ULONG Temp ; -+ UCHAR tempal , i ; -+ -+ pVBInfo->ROMAddr = HwDeviceExtension->pjVirtualRomBase ; -+ pVBInfo->BaseAddr = (USHORT)HwDeviceExtension->pjIOAddress ; -+ /* Programming Congiguration Space in Secondary Chip */ -+ /* set CRA1 D[6] = 1 */ -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4 , 0xA1 , 0xBF , 0x40 ) ; -+ -+ /* Write 2nd Chip Configuration Info into Configuration Space */ -+ /* Command CNFG04 */ -+ HwDeviceExtension->pQueryVGAConfigSpace( HwDeviceExtension , PCI_COMMAND , 0 , &Temp ) ; /* Get */ -+ HwDeviceExtension->pQueryVGAConfigSpace( HwDeviceExtension , PCI_COMMAND + 0x80 , 1 , &Temp ) ; /* Set */ -+ /* Latency Timer CNFG0C */ -+ HwDeviceExtension->pQueryVGAConfigSpace( HwDeviceExtension , 0x0c , 0 , &Temp ) ; /* Get */ -+ HwDeviceExtension->pQueryVGAConfigSpace( HwDeviceExtension , 0x0c + 0x80 , 1 , &Temp ) ; /* Set */ -+ /* Linear space */ -+ HwDeviceExtension->pQueryVGAConfigSpace( HwDeviceExtension , 0x10 , 0 , &Temp ) ; /* Get */ -+ HwDeviceExtension->pQueryVGAConfigSpace( HwDeviceExtension , 0x10 + 0x80 , 1 , &Temp ) ; /* Set */ -+ /* MMIO space */ -+ HwDeviceExtension->pQueryVGAConfigSpace( HwDeviceExtension , 0x14 , 0 , &Temp ) ; /* Get */ -+ Temp += 0x40000; -+ HwDeviceExtension->pQueryVGAConfigSpace( HwDeviceExtension , 0x14 + 0x80 , 1 , &Temp ) ; /* Set */ -+ /* Relocated IO space */ -+ HwDeviceExtension->pQueryVGAConfigSpace( HwDeviceExtension , 0x18 , 0 , &Temp ) ; /* Get */ -+ Temp += 0x80; -+ HwDeviceExtension->pQueryVGAConfigSpace( HwDeviceExtension , 0x18 + 0x80 , 1 , &Temp ) ; /* Set */ -+ /* Miscellaneous reg(input port 3cch,output port 3c2h) */ -+ tempal = XGI_GetRegByte((XGIIOADDRESS) XGINew_P3CC ) ; /* 3cc */ -+ XGI_SetRegByte((XGIIOADDRESS) XGINew_2ndP3C2 , tempal ) ; -+ /* VGA enable reg(port 3C3h) */ -+ tempal = XGI_GetRegByte((XGIIOADDRESS) XGINew_P3C3 ) ; /* 3c3 */ -+ XGI_SetRegByte((XGIIOADDRESS) XGINew_2ndP3C3 , tempal ) ; -+ SetPowerConsume ( HwDeviceExtension , XGINew_2ndP3D4); -+ /* ----- CRA0=42, CRA1=81, CRA2=60, CRA3=20, CRA4=50, CRA5=40, CRA8=88 -----// */ -+ /* ----- CRA9=10, CRAA=80, CRAB=01, CRAC=F1, CRAE=80, CRAF=45, CRB7=24 -----// */ -+ /* primary chip */ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0xA0 , 0x72 ) ; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0xA1 , 0x81 ) ; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0xA2 , 0x60 ) ; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0xA3 , 0x20 ) ; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0xA4 , 0x50 ) ; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0xA5 , 0x40 ) ; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0xA8 , 0x88 ) ; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0xA9 , 0x10 ) ; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0xAA , 0x80 ) ; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0xAB , 0x01 ) ; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0xAC , 0xF1 ) ; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0xAE , 0x80 ) ; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0xAF , 0x45 ) ; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0xB7 , 0x24 ) ; -+ -+ /* secondary chip */ -+ XGI_SetReg((XGIIOADDRESS) XGINew_2ndP3D4 , 0xA0 , 0x72 ) ; -+ XGI_SetReg((XGIIOADDRESS) XGINew_2ndP3D4 , 0xA1 , 0x81 ) ; -+ XGI_SetReg((XGIIOADDRESS) XGINew_2ndP3D4 , 0xA2 , 0x60 ) ; -+ XGI_SetReg((XGIIOADDRESS) XGINew_2ndP3D4 , 0xA3 , 0x20 ) ; -+ XGI_SetReg((XGIIOADDRESS) XGINew_2ndP3D4 , 0xA4 , 0x50 ) ; -+ XGI_SetReg((XGIIOADDRESS) XGINew_2ndP3D4 , 0xA5 , 0x40 ) ; -+ XGI_SetReg((XGIIOADDRESS) XGINew_2ndP3D4 , 0xA8 , 0x88 ) ; -+ XGI_SetReg((XGIIOADDRESS) XGINew_2ndP3D4 , 0xA9 , 0x10 ) ; -+ XGI_SetReg((XGIIOADDRESS) XGINew_2ndP3D4 , 0xAA , 0x80 ) ; -+ XGI_SetReg((XGIIOADDRESS) XGINew_2ndP3D4 , 0xAB , 0x01 ) ; -+ XGI_SetReg((XGIIOADDRESS) XGINew_2ndP3D4 , 0xAC , 0xF1 ) ; -+ XGI_SetReg((XGIIOADDRESS) XGINew_2ndP3D4 , 0xAE , 0x80 ) ; -+ XGI_SetReg((XGIIOADDRESS) XGINew_2ndP3D4 , 0xAF , 0x45 ) ; -+ XGI_SetReg((XGIIOADDRESS) XGINew_2ndP3D4 , 0xB7 , 0x24 ) ; -+ -+ /* 06/20/2003 [christine] CRT threshold setting request */ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0x78 , 0x40 ) ; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0x79 , 0x0C ) ; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0x7A , 0x34 ) ; -+ -+ /* OpenKey in 2nd chip */ -+ XGI_SetReg((XGIIOADDRESS) XGINew_2ndP3C4 , 0x05 , 0x86 ) ; -+ -+ /* Set PCI registers */ -+ tempal = (UCHAR)XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x06 ) ; -+ XGI_SetReg((XGIIOADDRESS) XGINew_2ndP3C4 , 0x06 , tempal ) ; -+ -+ for( i = 0x20 ; i <= 0x25 ; i++ ) -+ { -+ tempal = ( UCHAR )XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4 , i ) ; -+ XGI_SetReg((XGIIOADDRESS) XGINew_2ndP3C4 , i , tempal ) ; -+ } -+ for(i = 0x31; i <= 0x32; i++ ) -+ { -+ tempal = ( UCHAR )XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4 , i ) ; -+ XGI_SetReg((XGIIOADDRESS) XGINew_2ndP3C4 , i , tempal ) ; -+ } -+ XGINew_SetDRAMDefaultRegister340( HwDeviceExtension , XGINew_2ndP3D4 , pVBInfo) ; -+ -+ for(i = 0x13; i <= 0x14; i++ ) -+ { -+ tempal = ( UCHAR )XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4 , i ) ; -+ XGI_SetReg((XGIIOADDRESS) XGINew_2ndP3C4 , i , tempal ) ; -+ } -+ -+ /* Close key in 2nd chip */ -+ XGI_SetReg((XGIIOADDRESS) XGINew_2ndP3C4 , 0x05 , 0x00 ) ; -+} -+ -+ -+ -+ -+/* ============== alan ====================== */ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGINew_Get340DRAMType */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+UCHAR XGINew_Get340DRAMType( PXGI_HW_DEVICE_INFO HwDeviceExtension , PVB_DEVICE_INFO pVBInfo) -+{ -+ UCHAR data, temp ; /* Jong 10/05/2007; merge code */ -+ -+ if ( HwDeviceExtension->jChipType < XG20 ) -+ { -+ if (pVBInfo->SoftSetting & SoftDRAMType) { -+ return (pVBInfo->SoftSetting & 0x07); -+ } -+ else -+ { -+ data = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x39 ) & 0x02 ; -+ -+ if ( data == 0 ) -+ data = ( XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x3A ) & 0x02 ) >> 1 ; -+ -+ return( data ) ; -+ } -+ } -+ else if ( HwDeviceExtension->jChipType == XG27 ) -+ { -+ if ( pVBInfo->SoftSetting & SoftDRAMType ) -+ { -+ data = pVBInfo->SoftSetting & 0x07 ; -+ return( data ) ; -+ } -+ temp = XGI_GetReg( (XGIIOADDRESS) pVBInfo->P3c4 , 0x3B ) ; -+ -+ if (( temp & 0x88 )==0x80) /* SR3B[7][3]MAA15 MAA11 (Power on Trapping) */ -+ data = 0 ; /*DDR*/ -+ else -+ data = 1 ; /*DDRII*/ -+ return( data ) ; -+ } -+ else if ( HwDeviceExtension->jChipType == XG21 ) -+ { -+ XGI_SetRegAND( (XGIIOADDRESS) pVBInfo->P3d4 , 0xB4 , ~0x02 ) ; /* Independent GPIO control */ -+ DelayUS(800); -+ XGI_SetRegOR( (XGIIOADDRESS) pVBInfo->P3d4 , 0x4A , 0x80 ) ; /* Enable GPIOH read */ -+ temp = XGI_GetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x48 ) ; /* GPIOF 0:DVI 1:DVO */ -+ -+ /* HOTPLUG_SUPPORT */ -+ /* for current XG20 & XG21, GPIOH is floating, driver will fix DDR temporarily */ -+ if ( temp & 0x01 ) /* DVI read GPIOH */ -+ data = 1 ; /*DDRII*/ -+ else -+ data = 0 ; /*DDR*/ -+ -+ /*~HOTPLUG_SUPPORT */ -+ XGI_SetRegOR( (XGIIOADDRESS) pVBInfo->P3d4 , 0xB4 , 0x02 ) ; -+ return( data ) ; -+ } -+ else -+ { -+ data = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0x97 ) & 0x01 ; -+ -+ if ( data == 1 ) -+ data ++ ; -+ -+ return( data ); -+ } -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGINew_Delay15us */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+/* -+void XGINew_Delay15us(ULONG ulMicrsoSec) -+{ -+} -+*/ -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGINew_SDR_MRS */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+void XGINew_SDR_MRS(PVB_DEVICE_INFO pVBInfo) -+{ -+ USHORT data ; -+ -+ data = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x16 ) ; -+ data &= 0x3F ; /* SR16 D7=0,D6=0 */ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x16 , data ) ; /* enable mode register set(MRS) low */ -+ /* XGINew_Delay15us( 0x100 ) ; */ -+ data |= 0x80 ; /* SR16 D7=1,D6=0 */ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x16 , data ) ; /* enable mode register set(MRS) high */ -+ /* XGINew_Delay15us( 0x100 ) ; */ -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGINew_DDR1x_MRS_340 */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+void XGINew_DDR1x_MRS_340(PXGI_HW_DEVICE_INFO HwDeviceExtension, USHORT P3c4, -+ PVB_DEVICE_INFO pVBInfo) -+{ -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x18 , 0x01 ) ; -+ if ( HwDeviceExtension->jChipType == XG42 ) /* XG42 BA0 & BA1 layout change */ -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x19 , 0x40 ) ; -+ else -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x19 , 0x20 ) ; -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x16 , 0x00 ) ; -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x16 , 0x80 ) ; -+ -+ /* Samsung F Die */ -+ if (pVBInfo->DRAMTypeDefinition != 0x0C) { -+ DelayUS( 3000 ) ; /* Delay 67 x 3 Delay15us */ -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x18 , 0x00 ) ; -+ if ( HwDeviceExtension->jChipType == XG42 ) -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x19 , 0x40 ) ; -+ else -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x19 , 0x20 ) ; -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x16 , 0x00 ) ; -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x16 , 0x80 ) ; -+ } -+ -+ DelayUS( 60 ) ; -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x18 , pVBInfo->SR15[ 2 ][ XGINew_RAMType ] ) ; /* SR18 */ -+ -+ if (HwDeviceExtension->jChipType == XG45) -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x19 , 0x01 ) ; /*TSop DRAM DLL pin jump to A9*/ -+ else -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x19 , 0x02 ) ; /*TSop DRAM DLL pin jump to A9*/ -+ -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x16 , pVBInfo->SR16[ 0 ] ) ; -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x16 , pVBInfo->SR16[ 1 ] ) ; -+ DelayUS( 1000 ) ; -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x1B , 0x03 ) ; -+ DelayUS( 500 ) ; -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x18 , pVBInfo->SR15[ 2 ][ XGINew_RAMType ] ) ; /* SR18 */ -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x19 , 0x00 ) ; -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x16 , pVBInfo->SR16[ 2 ] ) ; -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x16 , pVBInfo->SR16[ 3 ] ) ; -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x1B , 0x00 ) ; -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGINew_DDR2x_MRS_340 */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+void XGINew_DDR2x_MRS_340(PXGI_HW_DEVICE_INFO HwDeviceExtension, USHORT P3c4, -+ PVB_DEVICE_INFO pVBInfo) -+{ -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x18 , 0x00 ) ; -+ if ( HwDeviceExtension->jChipType == XG42 ) /*XG42 BA0 & BA1 layout change*/ -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x19 , 0x40 ) ; -+ else -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x19 , 0x20 ) ; -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x16 , 0x00 ) ; -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x16 , 0x80 ) ; -+ -+ /* Samsung F Die */ -+ if (pVBInfo->DRAMTypeDefinition != 0x0C) { -+ DelayUS( 3000 ) ; /* Delay 67 x 3 Delay15us */ -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x18 , 0x00 ) ; -+ if ( HwDeviceExtension->jChipType == XG42 ) -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x19 , 0x40 ) ; -+ else -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x19 , 0x20 ) ; -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x16 , 0x00 ) ; -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x16 , 0x80 ) ; -+ } -+ -+ DelayUS( 60 ) ; -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x18 , pVBInfo->SR15[ 2 ][ XGINew_RAMType ] ) ; /* SR18 */ -+ /* XGI_SetReg((XGIIOADDRESS) P3c4 , 0x18 , 0x31 ) ; */ -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x19 , 0x02 ) ; /*TSop DRAM DLL pin jump to A9*/ -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x16 , pVBInfo->SR16[ 0 ] ) ; -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x16 , pVBInfo->SR16[ 1 ] ) ; -+ DelayUS( 1000 ) ; -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x1B , 0x03 ) ; -+ DelayUS( 500 ) ; -+ /* XGI_SetReg((XGIIOADDRESS) P3c4 , 0x18 , 0x31 ) ; */ -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x18 , pVBInfo->SR15[ 2 ][ XGINew_RAMType ] ) ; /* SR18 */ -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x19 , 0x00 ) ; -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x16 , pVBInfo->SR16[ 2 ] ) ; -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x16 , pVBInfo->SR16[ 3 ] ) ; -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x1B , 0x00 ) ; -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGINew_DDR2_MRS_340 */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+void XGINew_DDR2_MRS_340(PXGI_HW_DEVICE_INFO HwDeviceExtension, USHORT P3c4, -+ PVB_DEVICE_INFO pVBInfo) -+{ -+ USHORT P3d4 = P3c4 + 0x10 ; -+ UCHAR data ; -+ -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x28 , 0x64 ) ; /* SR28 */ -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x29 , 0x63 ) ; /* SR29 */ -+ DelayUS( 200 ) ; -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x18 , 0x00 ) ; -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x19 , 0x20 ) ; -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x16 , 0x00 ) ; -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x16 , 0x80 ) ; -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x18 , 0xC5 ) ; -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x19 , 0x23 ) ; -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x16 , 0x00 ) ; -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x16 , 0x80 ) ; -+ DelayUS( 2 ) ; -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x97 , 0x11 ) ; /* CR97 */ -+ -+ if( P3c4 != pVBInfo->P3c4 ) -+ { -+ data = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x28 ) ; -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x28 , data ) ; /* SR28 */ -+ data = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x29 ) ; -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x29 , data ) ; /* SR29 */ -+ data = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x2A ) ; -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x2A , data ) ; /* SR2A */ -+ -+ data = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x2E ) ; -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x2e , data ) ; /* SR2E */ -+ data = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x2F ) ; -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x2f , data ) ; /* SR2F */ -+ data = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x30 ) ; -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x30 , data ) ; /* SR30 */ -+ } -+ else -+ XGINew_SetMemoryClock( HwDeviceExtension , pVBInfo ) ; -+ -+ DelayUS( 1000 ) ; -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x18 , 0xC5 ) ; -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x19 , 0x23 ) ; -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x16 , 0x00 ) ; -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x16 , 0x80 ) ; -+ DelayUS( 1 ) ; -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x1B , 0x04 ) ; /* SR1B */ -+ DelayUS( 5) ; -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x1B , 0x00 ) ; /* SR1B */ -+ DelayUS( 5 ) ; -+ /* XGI_SetReg((XGIIOADDRESS) P3c4 , 0x18 , 0x72 ) ; */ -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x18 , pVBInfo->SR15[ 2 ][ XGINew_RAMType ] ) ; /* SR18 */ -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x19 , 0x06 ) ; -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x16 , 0x05 ) ; -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x16 , 0x85 ) ; -+ DelayUS( 1 ) ; -+} -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGINew_DDRII_Bootup_XG27 */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+void XGINew_DDRII_Bootup_XG27( PXGI_HW_DEVICE_INFO HwDeviceExtension , USHORT P3c4 , PVB_DEVICE_INFO pVBInfo) -+{ -+ USHORT P3d4 = P3c4 + 0x10 ; -+ UCHAR data ; -+ XGINew_RAMType = ( int )XGINew_GetXG20DRAMType( HwDeviceExtension , pVBInfo ) ; -+ XGINew_SetMemoryClock( HwDeviceExtension , pVBInfo ) ; -+ -+ /* Set Double Frequency */ -+ /* XGINew_SetReg1( P3d4 , 0x97 , 0x11 ) ; */ /* CR97 */ -+ XGI_SetReg( (XGIIOADDRESS) P3d4 , 0x97 , pVBInfo->CR97 ) ; /* CR97 */ -+ -+ DelayUS( 200 ) ; -+ -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x18 , 0x00 ) ; /* Set SR18 */ /*EMRS2*/ -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x19 , 0x80 ) ; /* Set SR19 */ -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x16 , 0x20 ) ; /* Set SR16 */ -+ DelayUS( 15 ) ; -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x16 , 0xA0 ) ; /* Set SR16 */ -+ DelayUS( 15 ) ; -+ -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x18 , 0x00 ) ; /* Set SR18 */ /*EMRS3*/ -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x19 , 0xC0 ) ; /* Set SR19 */ -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x16 , 0x20 ) ; /* Set SR16 */ -+ DelayUS( 15 ) ; -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x16 , 0xA0 ) ; /* Set SR16 */ -+ DelayUS( 15) ; -+ -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x18 , 0x00 ) ; /* Set SR18 */ /*EMRS1*/ -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x19 , 0x40 ) ; /* Set SR19 */ -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x16 , 0x20 ) ; /* Set SR16 */ -+ DelayUS( 30 ) ; -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x16 , 0xA0 ) ; /* Set SR16 */ -+ DelayUS( 15 ) ; -+ -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x18 , 0x42 ) ; /* Set SR18 */ /*MRS, DLL Enable*/ -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x19 , 0x0A ) ; /* Set SR19 */ -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x16 , 0x00 ) ; /* Set SR16 */ -+ DelayUS( 30 ) ; -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x16 , 0x00 ) ; /* Set SR16 */ -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x16 , 0x80 ) ; /* Set SR16 */ -+ /* DelayUS( 15 ) ; */ -+ -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x1B , 0x04 ) ; /* Set SR1B */ -+ DelayUS( 60 ) ; -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x1B , 0x00 ) ; /* Set SR1B */ -+ -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x18 , 0x42 ) ; /* Set SR18 */ /*MRS, DLL Reset*/ -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x19 , 0x08 ) ; /* Set SR19 */ -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x16 , 0x00 ) ; /* Set SR16 */ -+ -+ DelayUS( 30 ) ; -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x16 , 0x83 ) ; /* Set SR16 */ -+ DelayUS( 15 ) ; -+ -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x18 , 0x80 ) ; /* Set SR18 */ /*MRS, ODT*/ -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x19 , 0x46 ) ; /* Set SR19 */ -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x16 , 0x20 ) ; /* Set SR16 */ -+ DelayUS( 30 ) ; -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x16 , 0xA0 ) ; /* Set SR16 */ -+ DelayUS( 15 ) ; -+ -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x18 , 0x00 ) ; /* Set SR18 */ /*EMRS*/ -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x19 , 0x40 ) ; /* Set SR19 */ -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x16 , 0x20 ) ; /* Set SR16 */ -+ DelayUS( 30 ) ; -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x16 , 0xA0 ) ; /* Set SR16 */ -+ DelayUS( 15 ) ; -+ -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x1B , 0x04 ) ; /* Set SR1B refresh control 000:close; 010:open */ -+ DelayUS( 200 ) ; -+} -+/* --------------------------------------------------------------------- */ -+/* Function : XGINew_DDR2_MRS_XG20 */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+void XGINew_DDR2_MRS_XG20( PXGI_HW_DEVICE_INFO HwDeviceExtension , USHORT P3c4 , PVB_DEVICE_INFO pVBInfo) -+{ -+ USHORT P3d4 = P3c4 + 0x10 ; -+ UCHAR data ; -+ -+ XGINew_RAMType = ( int )XGINew_GetXG20DRAMType( HwDeviceExtension , pVBInfo ) ; -+ XGINew_SetMemoryClock( HwDeviceExtension , pVBInfo ) ; -+ -+ XGI_SetReg( (XGIIOADDRESS) P3d4 , 0x97 , 0x11 ) ; /* CR97 */ -+ -+ DelayUS( 200 ) ; -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x18 , 0x00 ) ; /* EMRS2 */ -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x19 , 0x80 ) ; -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x16 , 0x05 ) ; -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x16 , 0x85 ) ; -+ -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x18 , 0x00 ) ; /* EMRS3 */ -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x19 , 0xC0 ) ; -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x16 , 0x05 ) ; -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x16 , 0x85 ) ; -+ -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x18 , 0x00 ) ; /* EMRS1 */ -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x19 , 0x40 ) ; -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x16 , 0x05 ) ; -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x16 , 0x85 ) ; -+ -+ /* XGINew_SetReg1( P3c4 , 0x18 , 0x52 ) ;*/ /* MRS1 */ -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x18 , 0x42 ) ; /* MRS1 */ -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x19 , 0x02 ) ; -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x16 , 0x05 ) ; -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x16 , 0x85 ) ; -+ -+ DelayUS( 15 ) ; -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x1B , 0x04 ) ; /* SR1B */ -+ DelayUS( 30 ) ; -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x1B , 0x00 ) ; /* SR1B */ -+ DelayUS( 100 ) ; -+ -+ /*XGINew_SetReg1( P3c4 , 0x18 , 0x52 ) ;*/ /* MRS2 */ -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x18 , 0x42 ) ; /* MRS1 */ -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x19 , 0x00 ) ; -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x16 , 0x05 ) ; -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x16 , 0x85 ) ; -+ -+ DelayUS( 200 ) ; -+} -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGINew_DDR2_MRS_XG27 */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+void XGINew_DDR2_MRS_XG27( PXGI_HW_DEVICE_INFO HwDeviceExtension , USHORT P3c4 , PVB_DEVICE_INFO pVBInfo) -+{ -+ USHORT P3d4 = P3c4 + 0x10 ; -+ UCHAR data ; -+ -+ XGINew_RAMType = ( int )XGINew_GetXG20DRAMType( HwDeviceExtension , pVBInfo ) ; -+ XGINew_SetMemoryClock( HwDeviceExtension , pVBInfo ) ; -+ -+ XGI_SetReg( (XGIIOADDRESS) P3d4 , 0x97 , 0x11 ) ; /* CR97 */ -+ DelayUS( 200 ) ; -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x18 , 0x00 ) ; /* EMRS2 */ -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x19 , 0x80 ) ; -+ -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x16 , 0x10 ) ; -+ DelayUS( 15 ) ; /* 06/11/23 XG27 A0 for CKE enable*/ -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x16 , 0x90 ) ; -+ -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x18 , 0x00 ) ; /* EMRS3 */ -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x19 , 0xC0 ) ; -+ -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x16 , 0x00 ) ; -+ DelayUS( 15 ) ; /*06/11/22 XG27 A0*/ -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x16 , 0x80 ) ; -+ -+ -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x18 , 0x00 ) ; /* EMRS1 */ -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x19 , 0x40 ) ; -+ -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x16 , 0x00 ) ; -+ DelayUS( 15 ) ; /*06/11/22 XG27 A0 */ -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x16 , 0x80 ) ; -+ -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x18 , 0x42 ) ; /* MRS1 */ -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x19 , 0x06 ) ; /*[Billy]06/11/22 DLL Reset for XG27 Hynix DRAM*/ -+ -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x16 , 0x00 ) ; -+ DelayUS( 15 ) ; /*06/11/23 XG27 A0*/ -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x16 , 0x80 ) ; -+ -+ DelayUS( 30 ) ; /*06/11/23 XG27 A0 Start Auto-PreCharge*/ -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x1B , 0x04 ) ; /* SR1B */ -+ DelayUS( 60 ) ; -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x1B , 0x00 ) ; /* SR1B */ -+ -+ -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x18 , 0x42 ) ; /* MRS1 */ -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x19 , 0x04 ) ; /* DLL without Reset for XG27 Hynix DRAM*/ -+ -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x16 , 0x00 ) ; -+ DelayUS( 30 ) ; -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x16 , 0x80 ) ; -+ -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x18 , 0x80 ); /*XG27 OCD ON */ -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x19 , 0x46 ); -+ -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x16 , 0x00 ) ; -+ DelayUS( 30 ) ; -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x16 , 0x80 ) ; -+ -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x18 , 0x00 ); -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x19 , 0x40 ); -+ -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x16 , 0x00 ) ; -+ DelayUS( 30 ) ; -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x16 , 0x80 ) ; -+ -+ DelayUS( 15 ) ; /*Start Auto-PreCharge*/ -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x1B , 0x04 ) ; /* SR1B */ -+ DelayUS( 200 ) ; -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x1B , 0x03 ) ; /* SR1B */ -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGINew_DDR1x_DefaultRegister */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+void XGINew_DDR1x_DefaultRegister(PXGI_HW_DEVICE_INFO HwDeviceExtension, -+ USHORT Port, PVB_DEVICE_INFO pVBInfo) -+{ -+ USHORT P3d4 = Port , -+ P3c4 = Port - 0x10 ; -+#ifndef LINUX_XF86 -+ UCHAR data ; -+#endif -+ if ( HwDeviceExtension->jChipType >= XG20 ) -+ { -+ XGINew_SetMemoryClock( HwDeviceExtension , pVBInfo ) ; -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x82 , pVBInfo->CR40[ 11 ][ XGINew_RAMType ] ) ; /* CR82 */ -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x85 , pVBInfo->CR40[ 12 ][ XGINew_RAMType ] ) ; /* CR85 */ -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x86 , pVBInfo->CR40[ 13 ][ XGINew_RAMType ] ) ; /* CR86 */ -+ -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x98 , 0x01 ) ; -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x9A , 0x02 ) ; -+ -+ XGINew_DDR1x_MRS_XG20( P3c4 , pVBInfo) ; -+ } -+ else -+ { -+ XGINew_SetMemoryClock( HwDeviceExtension , pVBInfo ) ; -+ -+ switch( HwDeviceExtension->jChipType ) -+ { -+ case XG41: -+ case XG42: -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x82 , pVBInfo->CR40[ 11 ][ XGINew_RAMType ] ) ; /* CR82 */ -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x85 , pVBInfo->CR40[ 12 ][ XGINew_RAMType ] ) ; /* CR85 */ -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x86 , pVBInfo->CR40[ 13 ][ XGINew_RAMType ] ) ; /* CR86 */ -+ break ; -+ default: -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x82 , 0x88 ) ; -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x86 , 0x00 ) ; -+ XGI_GetReg((XGIIOADDRESS) P3d4 , 0x86 ) ; /* Insert read command for delay */ -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x86 , 0x88 ) ; -+ XGI_GetReg((XGIIOADDRESS) P3d4 , 0x86 ) ; -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x86 , pVBInfo->CR40[ 13 ][ XGINew_RAMType ] ) ; -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x82 , 0x77 ) ; -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x85 , 0x00 ) ; -+ XGI_GetReg((XGIIOADDRESS) P3d4 , 0x85 ) ; /* Insert read command for delay */ -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x85 , 0x88 ) ; -+ XGI_GetReg((XGIIOADDRESS) P3d4 , 0x85 ) ; /* Insert read command for delay */ -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x85 , pVBInfo->CR40[ 12 ][ XGINew_RAMType ] ) ; /* CR85 */ -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x82 , pVBInfo->CR40[ 11 ][ XGINew_RAMType ] ) ; /* CR82 */ -+ break ; -+ } -+ if (HwDeviceExtension->jChipType != XG45) -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x97 , 0x00 ) ; -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x98 , 0x01 ) ; -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x9A , 0x02 ) ; -+ XGINew_DDR1x_MRS_340( HwDeviceExtension , P3c4 , pVBInfo ) ; -+ } -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGINew_DDR2x_DefaultRegister */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+void XGINew_DDR2x_DefaultRegister(PXGI_HW_DEVICE_INFO HwDeviceExtension, -+ USHORT Port, PVB_DEVICE_INFO pVBInfo) -+{ -+ USHORT P3d4 = Port , -+ P3c4 = Port - 0x10 ; -+ -+#ifndef LINUX_XF86 -+ UCHAR data ; -+#endif -+ -+ XGINew_SetMemoryClock( HwDeviceExtension , pVBInfo ) ; -+ -+ /* 20040906 Hsuan modify CR82, CR85, CR86 for XG42 */ -+ switch( HwDeviceExtension->jChipType ) -+ { -+ case XG41: -+ case XG42: -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x82 , pVBInfo->CR40[ 11 ][ XGINew_RAMType ] ) ; /* CR82 */ -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x85 , pVBInfo->CR40[ 12 ][ XGINew_RAMType ] ) ; /* CR85 */ -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x86 , pVBInfo->CR40[ 13 ][ XGINew_RAMType ] ) ; /* CR86 */ -+ break ; -+ default: -+ /* keep following setting sequence, each setting in the same reg insert idle */ -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x82 , 0x88 ) ; -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x86 , 0x00 ) ; -+ XGI_GetReg((XGIIOADDRESS) P3d4 , 0x86 ) ; /* Insert read command for delay */ -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x86 , 0x88 ) ; -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x82 , 0x77 ) ; -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x85 , 0x00 ) ; -+ XGI_GetReg((XGIIOADDRESS) P3d4 , 0x85 ) ; /* Insert read command for delay */ -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x85 , 0x88 ) ; -+ XGI_GetReg((XGIIOADDRESS) P3d4 , 0x85 ) ; /* Insert read command for delay */ -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x85 , pVBInfo->CR40[ 12 ][ XGINew_RAMType ] ) ; /* CR85 */ -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x82 , pVBInfo->CR40[ 11 ][ XGINew_RAMType ] ) ; /* CR82 */ -+ } -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x97 , 0x11 ) ; -+ if ( HwDeviceExtension->jChipType == XG42 ) -+ { -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x98 , 0x01 ) ; -+ } -+ else -+ { -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x98 , 0x03 ) ; -+ } -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x9A , 0x02 ) ; -+ -+ XGINew_DDR2x_MRS_340( HwDeviceExtension , P3c4 , pVBInfo ) ; -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGINew_DDR2_DefaultRegister */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+void XGINew_DDR2_DefaultRegister(PXGI_HW_DEVICE_INFO HwDeviceExtension, -+ USHORT Port, PVB_DEVICE_INFO pVBInfo) -+{ -+ USHORT P3d4 = Port , -+ P3c4 = Port - 0x10 ; -+ -+ /* keep following setting sequence, each setting in the same reg insert idle */ -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x82 , 0x77 ) ; -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x86 , 0x00 ) ; -+ XGI_GetReg((XGIIOADDRESS) P3d4 , 0x86 ) ; /* Insert read command for delay */ -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x86 , 0x88 ) ; -+ XGI_GetReg((XGIIOADDRESS) P3d4 , 0x86 ) ; /* Insert read command for delay */ -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x86 , pVBInfo->CR40[ 13 ][ XGINew_RAMType ] ) ; /* CR86 */ -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x82 , 0x77 ) ; -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x85 , 0x00 ) ; -+ XGI_GetReg((XGIIOADDRESS) P3d4 , 0x85 ) ; /* Insert read command for delay */ -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x85 , 0x88 ) ; -+ XGI_GetReg((XGIIOADDRESS) P3d4 , 0x85 ) ; /* Insert read command for delay */ -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x85 , pVBInfo->CR40[ 12 ][ XGINew_RAMType ] ) ; /* CR85 */ -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x82 , pVBInfo->CR40[ 11 ][ XGINew_RAMType ] ) ; /* CR82 */ -+ -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x98 , 0x03 ) ; -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x9A , 0x02 ) ; -+ -+ /* Jong 10/01/2007 */ -+ if ( HwDeviceExtension->jChipType == XG27 ) -+ XGINew_DDRII_Bootup_XG27( HwDeviceExtension , P3c4 , pVBInfo) ; -+ else if ( HwDeviceExtension->jChipType >= XG20 ) -+ XGINew_DDR2_MRS_XG20( HwDeviceExtension , P3c4, pVBInfo ) ; -+ else -+ XGINew_DDR2_MRS_340( HwDeviceExtension , P3c4, pVBInfo ) ; -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGINew_SetDRAMDefaultRegister340 */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+void XGINew_SetDRAMDefaultRegister340( PXGI_HW_DEVICE_INFO HwDeviceExtension , USHORT Port , PVB_DEVICE_INFO pVBInfo) -+{ -+ UCHAR temp , temp1 , temp2 , temp3 , -+ i , j , k ; -+ -+ USHORT P3d4 = Port , -+ P3c4 = Port - 0x10 ; -+ -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x6D , pVBInfo->CR40[ 8 ][ XGINew_RAMType ] ) ; -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x68 , pVBInfo->CR40[ 5 ][ XGINew_RAMType ] ) ; -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x69 , pVBInfo->CR40[ 6 ][ XGINew_RAMType ] ) ; -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x6A , pVBInfo->CR40[ 7 ][ XGINew_RAMType ] ) ; -+ -+ temp2 = 0 ; -+ for( i = 0 ; i < 4 ; i++ ) -+ { -+ temp = pVBInfo->CR6B[ XGINew_RAMType ][ i ] ; /* CR6B DQS fine tune delay */ -+ for( j = 0 ; j < 4 ; j++ ) -+ { -+ temp1 = ( ( temp >> ( 2 * j ) ) & 0x03 ) << 2 ; -+ temp2 |= temp1 ; -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x6B , temp2 ) ; -+ XGI_GetReg((XGIIOADDRESS) P3d4 , 0x6B ) ; /* Insert read command for delay */ -+ temp2 &= 0xF0 ; -+ temp2 += 0x10 ; -+ } -+ } -+ -+ temp2 = 0 ; -+ for( i = 0 ; i < 4 ; i++ ) -+ { -+ temp = pVBInfo->CR6E[ XGINew_RAMType ][ i ] ; /* CR6E DQM fine tune delay */ -+ for( j = 0 ; j < 4 ; j++ ) -+ { -+ temp1 = ( ( temp >> ( 2 * j ) ) & 0x03 ) << 2 ; -+ temp2 |= temp1 ; -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x6E , temp2 ) ; -+ XGI_GetReg((XGIIOADDRESS) P3d4 , 0x6E ) ; /* Insert read command for delay */ -+ temp2 &= 0xF0 ; -+ temp2 += 0x10 ; -+ } -+ } -+ -+ temp3 = 0 ; -+ for( k = 0 ; k < 4 ; k++ ) -+ { -+ XGI_SetRegANDOR((XGIIOADDRESS) P3d4 , 0x6E , 0xFC , temp3 ) ; /* CR6E_D[1:0] select channel */ -+ temp2 = 0 ; -+ for( i = 0 ; i < 8 ; i++ ) -+ { -+ temp = pVBInfo->CR6F[ XGINew_RAMType ][ 8 * k + i ] ; /* CR6F DQ fine tune delay */ -+ for( j = 0 ; j < 4 ; j++ ) -+ { -+ temp1 = ( temp >> ( 2 * j ) ) & 0x03 ; -+ temp2 |= temp1 ; -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x6F , temp2 ) ; -+ XGI_GetReg((XGIIOADDRESS) P3d4 , 0x6F ) ; /* Insert read command for delay */ -+ temp2 &= 0xF8 ; -+ temp2 += 0x08 ; -+ } -+ } -+ temp3 += 0x01 ; -+ } -+ -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x80 , pVBInfo->CR40[ 9 ][ XGINew_RAMType ] ) ; /* CR80 */ -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x81 , pVBInfo->CR40[ 10 ][ XGINew_RAMType ] ) ; /* CR81 */ -+ -+ temp2 = 0x80 ; -+ temp = pVBInfo->CR89[ XGINew_RAMType ][ 0 ] ; /* CR89 terminator type select */ -+ for( j = 0 ; j < 4 ; j++ ) -+ { -+ temp1 = ( temp >> ( 2 * j ) ) & 0x03 ; -+ temp2 |= temp1 ; -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x89 , temp2 ) ; -+ XGI_GetReg((XGIIOADDRESS) P3d4 , 0x89 ) ; /* Insert read command for delay */ -+ temp2 &= 0xF0 ; -+ temp2 += 0x10 ; -+ } -+ -+ temp = pVBInfo->CR89[ XGINew_RAMType ][ 1 ] ; -+ temp1 = temp & 0x03 ; -+ temp2 |= temp1 ; -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x89 , temp2 ) ; -+ -+ temp = pVBInfo->CR40[ 3 ][ XGINew_RAMType ] ; -+ temp1 = temp & 0x0F ; -+ temp2 = ( temp >> 4 ) & 0x07 ; -+ temp3 = temp & 0x80 ; -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x45 , temp1 ) ; /* CR45 */ -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x99 , temp2 ) ; /* CR99 */ -+ XGI_SetRegOR((XGIIOADDRESS) P3d4 , 0x40 , temp3 ) ; /* CR40_D[7] */ -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x41 , pVBInfo->CR40[ 0 ][ XGINew_RAMType ] ) ; /* CR41 */ -+ -+ /* Jong 10/01/2007; */ -+ if ( HwDeviceExtension->jChipType == XG27 ) -+ XGI_SetReg( (XGIIOADDRESS) P3d4 , 0x8F , *pVBInfo->pCR8F ) ; /* CR8F */ -+ -+ for( j = 0 ; j <= 6 ; j++ ) -+ XGI_SetReg((XGIIOADDRESS) P3d4 , ( 0x90 + j ) , pVBInfo->CR40[ 14 + j ][ XGINew_RAMType ] ) ; /* CR90 - CR96 */ -+ -+ for( j = 0 ; j <= 2 ; j++ ) -+ XGI_SetReg((XGIIOADDRESS) P3d4 , ( 0xC3 + j ) , pVBInfo->CR40[ 21 + j ][ XGINew_RAMType ] ) ; /* CRC3 - CRC5 */ -+ -+ for( j = 0 ; j < 2 ; j++ ) -+ XGI_SetReg((XGIIOADDRESS) P3d4 , ( 0x8A + j ) , pVBInfo->CR40[ 1 + j ][ XGINew_RAMType ] ) ; /* CR8A - CR8B */ -+ -+ if ( ( HwDeviceExtension->jChipType == XG41 ) || ( HwDeviceExtension->jChipType == XG42 ) ) -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x8C , 0x87 ) ; -+ -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x59 , pVBInfo->CR40[ 4 ][ XGINew_RAMType ] ) ; /* CR59 */ -+ -+ XGI_SetReg((XGIIOADDRESS) P3d4, 0x83, 0x09); /* CR83 */ -+ XGI_SetReg((XGIIOADDRESS) P3d4, 0x87, 0x00); /* CR87 */ -+ XGI_SetReg((XGIIOADDRESS) P3d4, 0xCF, pVBInfo->CRCF); /* CRCF */ -+ -+ /* Jong 10/01/2007 */ -+ if ( XGINew_RAMType ) -+ { -+ /*XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x17 , 0xC0 ) ;*/ /* SR17 DDRII */ -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x17 , 0x80 ) ; /* SR17 DDRII */ -+ if ( HwDeviceExtension->jChipType == XG27 ) -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x17 , 0x02 ) ; /* SR17 DDRII */ -+ -+ } -+ else -+ XGI_SetReg( (XGIIOADDRESS) P3c4 , 0x17 , 0x00 ) ; /* SR17 DDR */ -+ -+ XGI_SetReg((XGIIOADDRESS) P3c4, 0x1A, 0x87); /* SR1A */ -+ -+ temp = XGINew_Get340DRAMType( HwDeviceExtension, pVBInfo) ; -+ if( temp == 0 ) -+ XGINew_DDR1x_DefaultRegister( HwDeviceExtension, P3d4, pVBInfo ) ; -+ else if ( temp == 0x02 ) -+ XGINew_DDR2x_DefaultRegister( HwDeviceExtension, P3d4, pVBInfo ) ; -+ else -+ XGINew_DDR2_DefaultRegister( HwDeviceExtension, P3d4, pVBInfo ) ; -+ -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x1B , pVBInfo->SR15[ 3 ][ XGINew_RAMType ] ) ; /* SR1B */ -+} -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGINew_SetDRAMDefaultRegisterXG45 */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+void XGINew_SetDRAMDefaultRegisterXG45( PXGI_HW_DEVICE_INFO HwDeviceExtension , USHORT Port , PVB_DEVICE_INFO pVBInfo) -+{ -+ UCHAR temp , temp1 , temp2 , -+ i , j , k ; -+ -+ USHORT P3d4 = Port , -+ P3c4 = Port - 0x10 ; -+ -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x6D , pVBInfo->CR40[ 8 ][ XGINew_RAMType ] ) ; -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x6E , pVBInfo->XG45CR6E[ XGINew_RAMType ] ) ; -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x6F , pVBInfo->XG45CR6F[ XGINew_RAMType ] ) ; -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x68 , pVBInfo->CR40[ 5 ][ XGINew_RAMType ] ) ; -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x69 , pVBInfo->CR40[ 6 ][ XGINew_RAMType ] ) ; -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x6A , pVBInfo->CR40[ 7 ][ XGINew_RAMType ] ) ; -+ -+ temp = 0x00 ; -+ for ( j = 0 ; j < 24 ; j ++ ) -+ { -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x6B , temp ); -+ temp += 0x08 ; -+ } -+ -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x80 , pVBInfo->CR40[ 9 ][ XGINew_RAMType ] ) ; /* CR80 */ -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x81 , pVBInfo->CR40[ 10 ][ XGINew_RAMType ] ) ; /* CR81 */ -+ -+ temp2 = 0x80 ; -+ temp = pVBInfo->CR89[ XGINew_RAMType ][ 0 ] ; /* CR89 terminator type select */ -+ for( j = 0 ; j < 4 ; j++ ) -+ { -+ temp1 = ( temp >> ( 2 * j ) ) & 0x03 ; -+ temp2 |= temp1 ; -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x89 , temp2 ) ; -+ XGI_GetReg((XGIIOADDRESS) P3d4 , 0x89 ) ; /* Insert read command for delay */ -+ temp2 &= 0xF0 ; -+ temp2 += 0x10 ; -+ } -+ -+ temp = pVBInfo->CR89[ XGINew_RAMType ][ 1 ] ; -+ temp1 = temp & 0x03 ; -+ temp2 |= temp1 ; -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x89 , temp2 ) ; -+ -+ temp = 0x00 ; -+ for ( j = 0 ; j < 3 ; j ++ ) -+ { -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x40 , temp ); -+ temp += 0x40 ; -+ } -+ -+ temp = 0x00 ; -+ for ( j = 0 ; j < 24 ; j ++ ) -+ { -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x41 , temp ); -+ temp += 0x08 ; -+ } -+ -+ temp = 0x00 ; -+ for ( j = 0 ; j < 24 ; j ++ ) -+ { -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x42 , temp ); -+ temp += 0x08 ; -+ } -+ -+ for ( k = 0 ; k < 2 ; k ++ ) -+ { -+ XGI_SetRegANDOR((XGIIOADDRESS) P3d4 , 0x43 , ~0x04 , k * 0x04 ); -+ -+ for ( i = 0 ; i < 3 ; i ++ ) -+ { -+ -+ XGI_SetRegANDOR((XGIIOADDRESS) P3d4 , 0x43 , ~0x03 , i * 0x01 ); -+ -+ for ( j = 0 ; j < 32 ; j ++ ) -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x44 , j * 0x08 ); -+ } -+ } -+ -+ for ( j = 0 ; j < 3 ; j ++ ) -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x45 , j * 0x08 ) ; /* CR45 */ -+ -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x97 , 0x84 ) ; -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x98 , 0x01 ) ; -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x99 , 0x22 ) ; -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x9A , 0x02 ) ; -+ -+ for( j = 0 ; j <= 6 ; j++ ) -+ XGI_SetReg((XGIIOADDRESS) P3d4 , ( 0x90 + j ) , pVBInfo->CR40[ 14 + j ][ XGINew_RAMType ] ) ; /* CR90 - CR96 */ -+ -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x59 , pVBInfo->CR40[ 4 ][ XGINew_RAMType ] ) ; /* CR59 */ -+ -+ for( j = 0 ; j <= 2 ; j++ ) -+ XGI_SetReg((XGIIOADDRESS) P3d4 , ( 0xC3 + j ) , pVBInfo->CR40[ 21 + j ][ XGINew_RAMType ] ) ; /* CRC3 - CRC5 */ -+ -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0xC8 , 0x04 ) ; -+ -+ for( j = 0 ; j < 2 ; j++ ) -+ XGI_SetReg((XGIIOADDRESS) P3d4 , ( 0x8A + j ) , pVBInfo->CR40[ 1 + j ][ XGINew_RAMType ] ) ; /* CR8A - CR8B */ -+ -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x8C , 0x40 ) ; -+ -+ if ( ( HwDeviceExtension->jChipType == XG41 ) || ( HwDeviceExtension->jChipType == XG42 ) ) -+ XGI_SetReg((XGIIOADDRESS) P3d4 , 0x8C , 0x87 ) ; -+ -+ XGI_SetReg((XGIIOADDRESS) P3d4, 0xCF, pVBInfo->CRCF); /* CRCF */ -+ XGI_SetReg((XGIIOADDRESS) P3d4, 0x83, 0x09); /* CR83 */ -+ XGI_SetReg((XGIIOADDRESS) P3d4, 0x87, 0x00); /* CR87 */ -+ XGI_SetReg((XGIIOADDRESS) P3d4, 0x8D, 0x87); /* CR8D */ -+ -+ XGINew_DDR1x_DefaultRegister( HwDeviceExtension, P3d4, pVBInfo ) ; -+ -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x1A , 0x87 ) ; /* SR1A */ -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x1B , pVBInfo->SR15[ 3 ][ XGINew_RAMType ] ) ; /* SR1B */ -+} -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGINew_DDR_MRS */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+void XGINew_DDR_MRS(PVB_DEVICE_INFO pVBInfo) -+{ -+ USHORT data ; -+ -+ PUCHAR volatile pVideoMemory = ( PUCHAR )pVBInfo->ROMAddr ; -+ -+ /* SR16 <- 1F,DF,2F,AF */ -+ /* yriver modified SR16 <- 0F,DF,0F,AF */ -+ /* enable DLL of DDR SD/SGRAM , SR16 D4=1 */ -+ data = pVideoMemory[ 0xFB ] ; -+ /* data = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x16 ) ; */ -+ -+ data &= 0x0F ; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x16 , data ) ; -+ data |= 0xC0 ; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x16 , data ) ; -+ data &= 0x0F ; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x16 , data ) ; -+ data |= 0x80 ; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x16 , data ) ; -+ data &= 0x0F ; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x16 , data ) ; -+ data |= 0xD0 ; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x16 , data ) ; -+ data &= 0x0F ; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x16 , data ) ; -+ data |= 0xA0 ; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x16 , data ) ; -+/* -+ else { -+ data &= 0x0F; -+ data |= 0x10; -+ XGI_SetReg((XGIIOADDRESS)pVBInfo->P3c4,0x16,data); -+ -+ if (!(pVBInfo->SR15[1][XGINew_RAMType] & 0x10)) -+ { -+ data &= 0x0F; -+ } -+ -+ data |= 0xC0; -+ XGI_SetReg((XGIIOADDRESS)pVBInfo->P3c4,0x16,data); -+ -+ -+ data &= 0x0F; -+ data |= 0x20; -+ XGI_SetReg((XGIIOADDRESS)pVBInfo->P3c4,0x16,data); -+ if (!(pVBInfo->SR15[1][XGINew_RAMType] & 0x10)) -+ { -+ data &= 0x0F; -+ } -+ -+ data |= 0x80; -+ XGI_SetReg((XGIIOADDRESS)pVBInfo->P3c4,0x16,data); -+ } -+*/ -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGINew_SetDRAMSize_340 */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+void XGINew_SetDRAMSize_340( PXGI_HW_DEVICE_INFO HwDeviceExtension , PVB_DEVICE_INFO pVBInfo) -+{ -+ USHORT data ; -+ -+ pVBInfo->ROMAddr = HwDeviceExtension->pjVirtualRomBase ; -+ pVBInfo->FBAddr = HwDeviceExtension->pjVideoMemoryAddress ; -+ XGISetModeNew(HwDeviceExtension, pVBInfo, 0x2e); -+ -+ data = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x21 ) ; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x21 , ( USHORT )( data & 0xDF ) ) ; /* disable read cache */ -+ -+ /* Jong 10/03/2007; add support for DVO, XG27, ...*/ -+ XGI_DisplayOff(HwDeviceExtension, pVBInfo ); -+ /* data = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x1 ) ; -+ data |= 0x20 ; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x01 , data ) ; */ /* Turn OFF Display */ -+ -+ XGINew_DDRSizing340( HwDeviceExtension, pVBInfo ) ; -+ -+ data=XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x21 ) ; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x21 , ( USHORT )( data | 0x20 ) ) ; /* enable read cache */ -+} -+ -+ -+/*--------------------------------------------------------------------- */ -+/* Function : XGINew_SetDRAMSize_XG45 */ -+/*Input : */ -+/*Output : */ -+/*Description : */ -+/*--------------------------------------------------------------------- */ -+void XGINew_SetDRAMSize_XG45( PXGI_HW_DEVICE_INFO HwDeviceExtension , PVB_DEVICE_INFO pVBInfo) -+{ -+ USHORT data ; -+ -+ pVBInfo->ROMAddr = HwDeviceExtension->pjVirtualRomBase ; -+ pVBInfo->FBAddr = HwDeviceExtension->pjVideoMemoryAddress ; -+ XGISetModeNew(HwDeviceExtension, pVBInfo, 0x2e); -+ -+ data = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x21 ) ; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x21 , ( USHORT )( data & 0xDF ) ) ; /*disable read cache*/ -+ -+ data = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x1 ) ; -+ data |= 0x20 ; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x01 , data ) ; /*Turn OFF Display*/ -+ -+ XGINew_DDRSizingXG45( HwDeviceExtension, pVBInfo ) ; -+ -+ data=XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x21 ) ; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x21 , ( USHORT )( data | 0x20 ) ) ; /*enable read cache*/ -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGINew_SetDRAMModeRegister340 */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+ -+void XGINew_SetDRAMModeRegister340(PXGI_HW_DEVICE_INFO HwDeviceExtension, -+ PVB_DEVICE_INFO pVBInfo) -+{ -+ UCHAR data ; -+ -+ ReadVBIOSTablData( HwDeviceExtension->jChipType , pVBInfo) ; -+ -+ if (HwDeviceExtension->jChipType == XG45) -+ XGINew_DDR1x_MRS_340( HwDeviceExtension, pVBInfo->P3c4, pVBInfo ) ; -+ else -+ { -+ if ( XGINew_Get340DRAMType( HwDeviceExtension, pVBInfo) == 0 ) -+ { -+ data = ( XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x39 ) & 0x02 ) >> 1 ; -+ if ( data == 0x01 ) -+ XGINew_DDR2x_MRS_340( HwDeviceExtension, pVBInfo->P3c4, pVBInfo ) ; -+ else -+ XGINew_DDR1x_MRS_340( HwDeviceExtension, pVBInfo->P3c4, pVBInfo ) ; -+ } -+ else -+ XGINew_DDR2_MRS_340( HwDeviceExtension, pVBInfo->P3c4, pVBInfo); -+ } -+ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x1B , 0x03 ) ; -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGINew_DisableRefresh */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+void XGINew_DisableRefresh( PXGI_HW_DEVICE_INFO HwDeviceExtension , PVB_DEVICE_INFO pVBInfo) -+{ -+ USHORT data ; -+ -+ -+ data = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x1B ) ; -+ data &= 0xF8 ; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x1B , data ) ; -+ -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGINew_EnableRefresh */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+void XGINew_EnableRefresh( PXGI_HW_DEVICE_INFO HwDeviceExtension , PVB_DEVICE_INFO pVBInfo) -+{ -+ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x1B , pVBInfo->SR15[ 3 ][ XGINew_RAMType ] ) ; /* SR1B */ -+ -+ -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGINew_DisableChannelInterleaving */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+void XGINew_DisableChannelInterleaving(int index, -+ const USHORT XGINew_DDRDRAM_TYPE[][5], -+ PVB_DEVICE_INFO pVBInfo) -+{ -+ USHORT data ; -+ -+ data = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x15 ) ; -+ data &= 0x1F ; -+ -+ switch( XGINew_DDRDRAM_TYPE[ index ][ 3 ] ) -+ { -+ case 64: -+ data |= 0 ; -+ break ; -+ case 32: -+ data |= 0x20 ; -+ break ; -+ case 16: -+ data |= 0x40 ; -+ break ; -+ case 4: -+ data |= 0x60 ; -+ break ; -+ default: -+ break ; -+ } -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x15 , data ) ; -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGINew_SetDRAMSizingType */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+void XGINew_SetDRAMSizingType(int index , const USHORT DRAMTYPE_TABLE[][5], -+ PVB_DEVICE_INFO pVBInfo) -+{ -+ USHORT data ; -+ -+ data = DRAMTYPE_TABLE[ index ][ 4 ] ; -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3c4 , 0x13 , 0x80 , data ) ; -+ /* should delay 50 ns */ -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGINew_SetRank */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+int XGINew_SetRank(int index, UCHAR RankNo, UCHAR XGINew_ChannelAB, -+ const USHORT DRAMTYPE_TABLE[][5], PVB_DEVICE_INFO pVBInfo) -+{ -+ USHORT data ; -+ int RankSize ; -+ -+ if ( ( RankNo == 2 ) && ( DRAMTYPE_TABLE[ index ][ 0 ] == 2 ) ) -+ return 0 ; -+ -+ RankSize = DRAMTYPE_TABLE[ index ][ 3 ] / 2 * XGINew_DataBusWidth / 32 ; -+ -+ if ( ( RankNo * RankSize ) <= 128 ) -+ { -+ data = 0 ; -+ -+ while( ( RankSize >>= 1 ) > 0 ) -+ { -+ data += 0x10 ; -+ } -+ data |= ( RankNo - 1 ) << 2 ; -+ data |= ( XGINew_DataBusWidth / 64 ) & 2 ; -+ data |= XGINew_ChannelAB ; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , data ) ; -+ /* should delay */ -+ XGINew_SDR_MRS( pVBInfo ) ; -+ return( 1 ) ; -+ } -+ else -+ return( 0 ) ; -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGINew_SetDDRChannel */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+int XGINew_SetDDRChannel(int index, UCHAR ChannelNo, UCHAR XGINew_ChannelAB, -+ const USHORT DRAMTYPE_TABLE[][5], -+ PVB_DEVICE_INFO pVBInfo) -+{ -+ USHORT data ; -+ int RankSize ; -+ -+ RankSize = DRAMTYPE_TABLE[index][3]/2 * XGINew_DataBusWidth/32; -+ /* RankSize = DRAMTYPE_TABLE[ index ][ 3 ] ; */ -+ if ( ChannelNo * RankSize <= 128 ) -+ { -+ data = 0 ; -+ while( ( RankSize >>= 1 ) > 0 ) -+ { -+ data += 0x10 ; -+ } -+ -+ if ( ChannelNo == 2 ) -+ data |= 0x0C ; -+ -+ data |= ( XGINew_DataBusWidth / 32 ) & 2 ; -+ data |= XGINew_ChannelAB ; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , data ) ; -+ /* should delay */ -+ XGINew_DDR_MRS( pVBInfo ) ; -+ return( 1 ) ; -+ } -+ else -+ return( 0 ) ; -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGINew_CheckColumn */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+int XGINew_CheckColumn(int index, const USHORT DRAMTYPE_TABLE[][5], -+ PVB_DEVICE_INFO pVBInfo) -+{ -+ int i ; -+ ULONG Increment , Position ; -+ -+ /* Increment = 1 << ( DRAMTYPE_TABLE[ index ][ 2 ] + XGINew_DataBusWidth / 64 + 1 ) ; */ -+ Increment = 1 << ( 10 + XGINew_DataBusWidth / 64 ) ; -+ -+ for( i = 0 , Position = 0 ; i < 2 ; i++ ) -+ { -+ *( ( PULONG )( pVBInfo->FBAddr + Position ) ) = Position ; -+ Position += Increment ; -+ } -+ -+ for( i = 0 , Position = 0 ; i < 2 ; i++ ) -+ { -+ /* if ( pVBInfo->FBAddr[ Position ] != Position ) */ -+ if ( ( *( PULONG )( pVBInfo->FBAddr + Position ) ) != Position ) -+ return( 0 ) ; -+ Position += Increment ; -+ } -+ return( 1 ) ; -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGINew_CheckBanks */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+int XGINew_CheckBanks(int index, const USHORT DRAMTYPE_TABLE[][5], -+ PVB_DEVICE_INFO pVBInfo) -+{ -+ int i ; -+ ULONG Increment , Position ; -+ -+ Increment = 1 << ( DRAMTYPE_TABLE[ index ][ 2 ] + XGINew_DataBusWidth / 64 + 2 ) ; -+ -+ for( i = 0 , Position = 0 ; i < 4 ; i++ ) -+ { -+ /* pVBInfo->FBAddr[ Position ] = Position ; */ -+ *( ( PULONG )( pVBInfo->FBAddr + Position ) ) = Position ; -+ Position += Increment ; -+ } -+ -+ for( i = 0 , Position = 0 ; i < 4 ; i++ ) -+ { -+ /* if (pVBInfo->FBAddr[ Position ] != Position ) */ -+ if ( ( *( PULONG )( pVBInfo->FBAddr + Position ) ) != Position ) -+ return( 0 ) ; -+ Position += Increment ; -+ } -+ return( 1 ) ; -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGINew_CheckRank */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+int XGINew_CheckRank(int RankNo, int index, const USHORT DRAMTYPE_TABLE[][5], -+ PVB_DEVICE_INFO pVBInfo) -+{ -+ int i ; -+ ULONG Increment , Position ; -+ -+ Increment = 1 << ( DRAMTYPE_TABLE[ index ][ 2 ] + DRAMTYPE_TABLE[ index ][ 1 ] + -+ DRAMTYPE_TABLE[ index ][ 0 ] + XGINew_DataBusWidth / 64 + RankNo ) ; -+ -+ for( i = 0 , Position = 0 ; i < 2 ; i++ ) -+ { -+ /* pVBInfo->FBAddr[ Position ] = Position ; */ -+ /* *( ( PULONG )( pVBInfo->FBAddr ) ) = Position ; */ -+ *( ( PULONG )( pVBInfo->FBAddr + Position ) ) = Position ; -+ Position += Increment ; -+ } -+ -+ for( i = 0 , Position = 0 ; i < 2 ; i++ ) -+ { -+ /* if ( pVBInfo->FBAddr[ Position ] != Position ) */ -+ /* if ( ( *( PULONG )( pVBInfo->FBAddr ) ) != Position ) */ -+ if ( ( *( PULONG )( pVBInfo->FBAddr + Position ) ) != Position ) -+ return( 0 ) ; -+ Position += Increment ; -+ } -+ return( 1 ); -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGINew_CheckDDRRank */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+int XGINew_CheckDDRRank(int RankNo, int index, -+ const USHORT DRAMTYPE_TABLE[][5], -+ PVB_DEVICE_INFO pVBInfo) -+{ -+ ULONG Increment , Position ; -+ USHORT data ; -+ -+ Increment = 1 << ( DRAMTYPE_TABLE[ index ][ 2 ] + DRAMTYPE_TABLE[ index ][ 1 ] + -+ DRAMTYPE_TABLE[ index ][ 0 ] + XGINew_DataBusWidth / 64 + RankNo ) ; -+ -+ Increment += Increment / 2 ; -+ -+ Position = 0; -+ *( ( PULONG )( pVBInfo->FBAddr + Position + 0 ) ) = 0x01234567 ; -+ *( ( PULONG )( pVBInfo->FBAddr + Position + 1 ) ) = 0x456789AB ; -+ *( ( PULONG )( pVBInfo->FBAddr + Position + 2 ) ) = 0x55555555 ; -+ *( ( PULONG )( pVBInfo->FBAddr + Position + 3 ) ) = 0x55555555 ; -+ *( ( PULONG )( pVBInfo->FBAddr + Position + 4 ) ) = 0xAAAAAAAA ; -+ *( ( PULONG )( pVBInfo->FBAddr + Position + 5 ) ) = 0xAAAAAAAA ; -+ -+ if ( ( *( PULONG )( pVBInfo->FBAddr + 1 ) ) == 0x456789AB ) -+ return( 1 ) ; -+ -+ if ( ( *( PULONG )( pVBInfo->FBAddr + 0 ) ) == 0x01234567 ) -+ return( 0 ) ; -+ -+ data = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 ) ; -+ data &= 0xF3 ; -+ data |= 0x0E ; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , data ) ; -+ data = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x15 ) ; -+ data += 0x20 ; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x15 , data ) ; -+ -+ return( 1 ) ; -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGINew_CheckRanks */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+int XGINew_CheckRanks(int RankNo, int index, const USHORT DRAMTYPE_TABLE[][5], -+ PVB_DEVICE_INFO pVBInfo) -+{ -+ int r ; -+ -+ for( r = RankNo ; r >= 1 ; r-- ) -+ { -+ if ( !XGINew_CheckRank( r , index , DRAMTYPE_TABLE, pVBInfo ) ) -+ return( 0 ) ; -+ } -+ -+ if ( !XGINew_CheckBanks( index , DRAMTYPE_TABLE, pVBInfo ) ) -+ return( 0 ) ; -+ -+ if ( !XGINew_CheckColumn( index , DRAMTYPE_TABLE, pVBInfo ) ) -+ return( 0 ) ; -+ -+ return( 1 ) ; -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGINew_CheckDDRRanks */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+int XGINew_CheckDDRRanks(int RankNo, int index, -+ const USHORT DRAMTYPE_TABLE[][5], -+ PVB_DEVICE_INFO pVBInfo) -+{ -+ int r ; -+ -+ for( r = RankNo ; r >= 1 ; r-- ) -+ { -+ if ( !XGINew_CheckDDRRank( r , index , DRAMTYPE_TABLE, pVBInfo ) ) -+ return( 0 ) ; -+ } -+ -+ if ( !XGINew_CheckBanks( index , DRAMTYPE_TABLE, pVBInfo ) ) -+ return( 0 ) ; -+ -+ if ( !XGINew_CheckColumn( index , DRAMTYPE_TABLE, pVBInfo ) ) -+ return( 0 ) ; -+ -+ return( 1 ) ; -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+int XGINew_SDRSizing(PVB_DEVICE_INFO pVBInfo) -+{ -+ int i ; -+ UCHAR j ; -+ -+ for( i = 0 ; i < 13 ; i++ ) -+ { -+ XGINew_SetDRAMSizingType( i , XGINew_SDRDRAM_TYPE , pVBInfo) ; -+ -+ for( j = 2 ; j > 0 ; j-- ) -+ { -+ if ( !XGINew_SetRank( i , ( UCHAR )j , XGINew_ChannelAB , XGINew_SDRDRAM_TYPE , pVBInfo) ) -+ continue ; -+ else -+ { -+ if ( XGINew_CheckRanks( j , i , XGINew_SDRDRAM_TYPE, pVBInfo) ) -+ return( 1 ) ; -+ } -+ } -+ } -+ return( 0 ) ; -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGINew_SetDRAMSizeReg */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+USHORT XGINew_SetDRAMSizeReg(int index, const USHORT DRAMTYPE_TABLE[][5], -+ PVB_DEVICE_INFO pVBInfo) -+{ -+ USHORT data = 0 , memsize = 0 ; -+ int RankSize ; -+ UCHAR ChannelNo ; -+ -+ RankSize = DRAMTYPE_TABLE[ index ][ 3 ] * XGINew_DataBusWidth / 32 ; -+ data = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x13 ) ; -+ data &= 0x80 ; -+ -+ if ( data == 0x80 ) -+ RankSize *= 2 ; -+ -+ data = 0 ; -+ -+ if( XGINew_ChannelAB == 3 ) -+ ChannelNo = 4 ; -+ else -+ ChannelNo = XGINew_ChannelAB ; -+ -+ if ( ChannelNo * RankSize <= 256 ) -+ { -+ while( ( RankSize >>= 1 ) > 0 ) -+ { -+ data += 0x10 ; -+ } -+ -+ memsize = data >> 4 ; -+ -+ /* [2004/03/25] Vicent, Fix DRAM Sizing Error */ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , ( XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 ) & 0x0F ) | ( data & 0xF0 ) ) ; -+ -+ /* data |= XGINew_ChannelAB << 2 ; */ -+ /* data |= ( XGINew_DataBusWidth / 64 ) << 1 ; */ -+ /* XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , data ) ; */ -+ -+ /* should delay */ -+ /* XGINew_SetDRAMModeRegister340( pVBInfo ) ; */ -+ } -+ return( memsize ) ; -+} -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGINew_SetDRAMSize20Reg */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+USHORT XGINew_SetDRAMSize20Reg( int index , USHORT DRAMTYPE_TABLE[][ 5 ], PVB_DEVICE_INFO pVBInfo) -+{ -+ USHORT data = 0 , memsize = 0 ; -+ int RankSize ; -+ UCHAR ChannelNo ; -+ -+ RankSize = DRAMTYPE_TABLE[ index ][ 3 ] * XGINew_DataBusWidth / 8 ; -+ data = XGI_GetReg( (XGIIOADDRESS) pVBInfo->P3c4 , 0x13 ) ; -+ data &= 0x80 ; -+ -+ if ( data == 0x80 ) -+ RankSize *= 2 ; -+ -+ data = 0 ; -+ -+ if( XGINew_ChannelAB == 3 ) -+ ChannelNo = 4 ; -+ else -+ ChannelNo = XGINew_ChannelAB ; -+ -+ if ( ChannelNo * RankSize <= 256 ) -+ { -+ while( ( RankSize >>= 1 ) > 0 ) -+ { -+ data += 0x10 ; -+ } -+ -+ memsize = data >> 4 ; -+ -+ /* [2004/03/25] Vicent, Fix DRAM Sizing Error */ -+ XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , ( XGI_GetReg( (XGIIOADDRESS) pVBInfo->P3c4 , 0x14 ) & 0x0F ) | ( data & 0xF0 ) ) ; -+ DelayUS( 15 ) ; -+ -+ /* data |= XGINew_ChannelAB << 2 ; */ -+ /* data |= ( XGINew_DataBusWidth / 64 ) << 1 ; */ -+ /* XGINew_SetReg1( pVBInfo->P3c4 , 0x14 , data ) ; */ -+ -+ /* should delay */ -+ /* XGINew_SetDRAMModeRegister340( pVBInfo ) ; */ -+ } -+ return( memsize ) ; -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGINew_ReadWriteRest */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+int XGINew_ReadWriteRest( USHORT StopAddr, USHORT StartAddr, -+ PVB_DEVICE_INFO pVBInfo) -+{ -+ int i ; -+ ULONG Position = 0 ; -+ -+ *( ( PULONG )( pVBInfo->FBAddr + Position ) ) = Position ; -+ -+ for( i = StartAddr ; i <= StopAddr ; i++ ) -+ { -+ Position = 1 << i ; -+ *( ( PULONG )( pVBInfo->FBAddr + Position ) ) = Position ; -+ } -+ -+ DelayUS( 500 ) ; /* [Vicent] 2004/04/16. Fix #1759 Memory Size error in Multi-Adapter. */ -+ -+ Position = 0 ; -+ -+ if ( ( *( PULONG )( pVBInfo->FBAddr + Position ) ) != Position ) -+ return( 0 ) ; -+ -+ for( i = StartAddr ; i <= StopAddr ; i++ ) -+ { -+ Position = 1 << i ; -+ if ( ( *( PULONG )( pVBInfo->FBAddr + Position ) ) != Position ) -+ return( 0 ) ; -+ } -+ return( 1 ) ; -+} -+ -+ -+/*--------------------------------------------------------------------- */ -+/* Function : XGI45New_ReadWriteRest */ -+/* Input : */ -+/* Output : */ -+/* Description : return 0 : fail, 1 : pass */ -+/*--------------------------------------------------------------------- */ -+int XGI45New_ReadWriteRest(USHORT StopAddr, USHORT StartAddr, -+ PVB_DEVICE_INFO pVBInfo) -+{ -+ int i ; -+ ULONG Position = 0 ; -+ -+ *( ( PULONG )( pVBInfo->FBAddr + Position ) ) = Position ; -+ -+ for( i = StartAddr ; i <= StopAddr ; i++ ) -+ { -+ Position = 1 << i ; -+ *( ( PULONG )( pVBInfo->FBAddr + Position ) ) = Position ; -+ } -+ -+ if ( XGINew_ChannelAB == 4 ) -+ { -+ Position = ( 1 << StopAddr ) + ( 1 << ( StopAddr - 1 ) ); -+ *( ( PULONG )( pVBInfo->FBAddr + Position ) ) = Position ; -+ } -+ -+ DelayUS( 500 ) ; /* [Vicent] 2004/04/16. Fix #1759 Memory Size error in Multi-Adapter. */ -+ -+ Position = 0 ; -+ -+ if ( ( *( PULONG )( pVBInfo->FBAddr + Position ) ) != Position ) -+ return( 0 ) ; -+ -+ for( i = StartAddr ; i <= StopAddr ; i++ ) -+ { -+ Position = 1 << i ; -+ if ( ( *( PULONG )( pVBInfo->FBAddr + Position ) ) != Position ) -+ return( 0 ) ; -+ } -+ -+ if ( XGINew_ChannelAB == 4 ) -+ { -+ Position = ( 1 << StopAddr ) + ( 1 << ( StopAddr - 1 ) ); -+ if( ( *( PULONG )( pVBInfo->FBAddr + Position ) ) != Position ); -+ return( 0 ) ; -+ } -+ return( 1 ) ; -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGINew_CheckFrequence */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+UCHAR XGINew_CheckFrequence(PVB_DEVICE_INFO pVBInfo) -+{ -+ UCHAR data ; -+ -+ data = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0x97 ) ; -+ -+ if ( ( data & 0x10 ) == 0 ) -+ { -+ data = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x39 ) ; -+ data = ( data & 0x02 ) >> 1 ; -+ return( data ) ; -+ } -+ else -+ return( data & 0x01 ) ; -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGINew_CheckChannel */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+void XGINew_CheckChannel(PXGI_HW_DEVICE_INFO HwDeviceExtension, -+ PVB_DEVICE_INFO pVBInfo) -+{ -+ UCHAR i, data ; -+ -+ switch( HwDeviceExtension->jChipType ) -+ { -+ case XG20: -+ case XG21: -+ data = XGI_GetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x97 ) ; -+ data = data & 0x01; -+ XGINew_ChannelAB = 1 ; /* XG20 "JUST" one channel */ -+ -+ if ( data == 0 ) /* Single_32_16 */ -+ { -+ /* Jong 10/03/2007 */ -+ if (( HwDeviceExtension->ulVideoMemorySize - 1 ) > 0x1000000) -+ { -+ -+ XGINew_DataBusWidth = 32 ; /* 32 bits */ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x13 , 0xB1 ) ; /* 22bit + 2 rank + 32bit */ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , 0x52 ) ; -+ DelayUS( 15 ) ; -+ -+ if ( XGINew_ReadWriteRest( 24 , 23 , pVBInfo ) == 1 ) -+ return ; -+ -+ /* Jong 10/03/2007 */ -+ if (( HwDeviceExtension->ulVideoMemorySize - 1 ) > 0x800000) -+ { -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x13 , 0x31 ) ; /* 22bit + 1 rank + 32bit */ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , 0x42 ) ; -+ DelayUS( 15 ) ; -+ -+ if ( XGINew_ReadWriteRest( 23 , 23 , pVBInfo ) == 1 ) -+ return ; -+ } -+ } -+ -+ /* Jong 10/03/2007 */ -+ if (( HwDeviceExtension->ulVideoMemorySize - 1 ) > 0x800000) -+ { -+ XGINew_DataBusWidth = 16 ; /* 16 bits */ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x13 , 0xB1 ) ; /* 22bit + 2 rank + 16bit */ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , 0x41 ) ; -+ DelayUS( 15 ) ; -+ -+ if ( XGINew_ReadWriteRest( 23 , 22 , pVBInfo ) == 1 ) -+ return ; -+ else -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x13 , 0x31 ) ; -+ -+ DelayUS( 15 ) ; -+ } -+ } -+ else /* Dual_16_8 */ -+ { -+ if (( HwDeviceExtension->ulVideoMemorySize - 1 ) > 0x800000) -+ { -+ -+ XGINew_DataBusWidth = 16 ; /* 16 bits */ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x13 , 0xB1 ) ; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , 0x41 ) ; -+ DelayUS( 15 ) ; -+ -+ if ( XGINew_ReadWriteRest( 23 , 22 , pVBInfo ) == 1 ) -+ return ; -+ -+ if (( HwDeviceExtension->ulVideoMemorySize - 1 ) > 0x400000) -+ { -+ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x13 , 0x31 ) ; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , 0x31 ) ; -+ DelayUS( 15 ) ; -+ -+ if ( XGINew_ReadWriteRest( 22 , 22 , pVBInfo ) == 1 ) -+ return ; -+ } -+ } -+ -+ -+ if (( HwDeviceExtension->ulVideoMemorySize - 1 ) > 0x400000) -+ { -+ XGINew_DataBusWidth = 8 ; /* 8 bits */ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x13 , 0xB1 ) ; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , 0x30 ) ; -+ DelayUS( 15 ) ; -+ -+ if ( XGINew_ReadWriteRest( 22 , 21 , pVBInfo ) == 1 ) -+ return ; -+ else -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x13 , 0x31 ) ; -+ DelayUS( 15 ) ; -+ } -+ } -+ break ; -+ -+ case XG27: -+ XGINew_DataBusWidth = 16 ; /* 16 bits */ -+ XGINew_ChannelAB = 1 ; /* Single channel */ -+ XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , 0x51 ) ; /* 32Mx16 bit*/ -+ break ; -+ -+ case XG41: -+ if ( XGINew_CheckFrequence(pVBInfo) == 1 ) -+ { -+ XGINew_DataBusWidth = 32 ; /* 32 bits */ -+ XGINew_ChannelAB = 3 ; /* Quad Channel */ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x13 , 0xA1 ) ; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , 0x4C ) ; -+ -+ if ( XGINew_ReadWriteRest( 25 , 23 , pVBInfo ) == 1 ) -+ return ; -+ -+ XGINew_ChannelAB = 2 ; /* Dual channels */ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , 0x48 ) ; -+ -+ if ( XGINew_ReadWriteRest( 24 , 23 , pVBInfo ) == 1 ) -+ return ; -+ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , 0x49 ) ; -+ -+ if ( XGINew_ReadWriteRest( 24 , 23 , pVBInfo ) == 1 ) -+ return ; -+ -+ XGINew_ChannelAB = 3 ; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x13 , 0x21 ) ; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , 0x3C ) ; -+ -+ if ( XGINew_ReadWriteRest( 24 , 23 , pVBInfo ) == 1 ) -+ return ; -+ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , 0x38 ) ; -+ -+ if ( XGINew_ReadWriteRest( 8 , 4 , pVBInfo ) == 1 ) -+ return ; -+ else -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , 0x39 ) ; -+ } -+ else -+ { /* DDR */ -+ XGINew_DataBusWidth = 64 ; /* 64 bits */ -+ XGINew_ChannelAB = 2 ; /* Dual channels */ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x13 , 0xA1 ) ; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , 0x5A ) ; -+ -+ if ( XGINew_ReadWriteRest( 25 , 24 , pVBInfo ) == 1 ) -+ return ; -+ -+ XGINew_ChannelAB = 1 ; /* Single channels */ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , 0x52 ) ; -+ -+ if ( XGINew_ReadWriteRest( 24 , 23 , pVBInfo ) == 1 ) -+ return ; -+ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , 0x53 ) ; -+ -+ if ( XGINew_ReadWriteRest( 24 , 23 , pVBInfo ) == 1 ) -+ return ; -+ -+ XGINew_ChannelAB = 2 ; /* Dual channels */ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x13 , 0x21 ) ; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , 0x4A ) ; -+ -+ if ( XGINew_ReadWriteRest( 24 , 23 , pVBInfo ) == 1 ) -+ return ; -+ -+ XGINew_ChannelAB = 1 ; /* Single channels */ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , 0x42 ) ; -+ -+ if ( XGINew_ReadWriteRest( 8 , 4 , pVBInfo ) == 1 ) -+ return ; -+ else -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , 0x43 ) ; -+ } -+ -+ break ; -+ -+ case XG42: -+/* -+ XG42 SR14 D[3] Reserve -+ D[2] = 1, Dual Channel -+ = 0, Single Channel -+ -+ It's Different from Other XG40 Series. -+*/ -+ if ( XGINew_CheckFrequence(pVBInfo) == 1 ) /* DDRII, DDR2x */ -+ { -+ XGINew_DataBusWidth = 32 ; /* 32 bits */ -+ XGINew_ChannelAB = 2 ; /* 2 Channel */ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x13 , 0xA1 ) ; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , 0x44 ) ; -+ -+ if ( XGINew_ReadWriteRest( 24 , 23 , pVBInfo ) == 1 ) -+ return ; -+ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x13 , 0x21 ) ; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , 0x34 ) ; -+ if ( XGINew_ReadWriteRest( 23 , 22 , pVBInfo ) == 1 ) -+ return ; -+ -+ XGINew_ChannelAB = 1 ; /* Single Channel */ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x13 , 0xA1 ) ; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , 0x40 ) ; -+ -+ if ( XGINew_ReadWriteRest( 23 , 22 , pVBInfo ) == 1 ) -+ return ; -+ else -+ { -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x13 , 0x21 ) ; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , 0x30 ) ; -+ } -+ } -+ else -+ { /* DDR */ -+ XGINew_DataBusWidth = 64 ; /* 64 bits */ -+ XGINew_ChannelAB = 1 ; /* 1 channels */ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x13 , 0xA1 ) ; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , 0x52 ) ; -+ -+ if ( XGINew_ReadWriteRest( 24 , 23 , pVBInfo ) == 1 ) -+ return ; -+ else -+ { -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x13 , 0x21 ) ; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , 0x42 ) ; -+ } -+ } -+ -+ break ; -+ -+ case XG45: -+ -+ XGINew_DataBusWidth = 64 ; /* 64 bits */ -+ XGINew_ChannelAB = 4 ; /* 3+1 Channel */ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x13 , 0x21 ) ; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , 0x4C ) ; -+ -+ if ( XGI45New_ReadWriteRest( 25 , 24 , pVBInfo ) == 1 ) -+ return ; -+ -+ XGINew_ChannelAB = 3 ; /* 3 Channel */ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x13 , 0xA1 ) ; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , 0x58 ) ; -+ -+ if ( XGI45New_ReadWriteRest( 26 , 24 , pVBInfo ) == 1 ) -+ return ; -+ -+ XGINew_ChannelAB = 2 ; /* 2 Channel */ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x13 , 0xA1 ) ; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , 0x54 ) ; -+ -+ if ( XGI45New_ReadWriteRest( 25 , 24 , pVBInfo ) == 1 ) -+ return ; -+ -+ XGINew_ChannelAB = 1 ; /* 1 Channel */ -+ for ( i = 0; i <= 2; i++) -+ { -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x13 , 0xA1 ) ; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , 0x50+i ) ; -+ -+ if ( XGI45New_ReadWriteRest( 24 , 23 , pVBInfo ) == 1 ) -+ return ; -+ } -+ -+ XGINew_ChannelAB = 3 ; /* 3 Channel */ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x13 , 0x21 ) ; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , 0x58 ) ; -+ -+ if ( XGI45New_ReadWriteRest( 25 , 24 , pVBInfo ) == 1 ) -+ return ; -+ -+ XGINew_ChannelAB = 2 ; /* 2 Channel */ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x13 , 0x21 ) ; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , 0x54 ) ; -+ -+ if ( XGI45New_ReadWriteRest( 24 , 23 , pVBInfo ) == 1 ) -+ return ; -+ -+ XGINew_ChannelAB = 1 ; /* 1 Channel */ -+ for ( i = 0; i <= 2; i++) -+ { -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x13 , 0x21 ) ; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , 0x50+i ) ; -+ -+ if ( XGI45New_ReadWriteRest( 23 , 22 , pVBInfo ) == 1 ) -+ return ; -+ } -+ break ; -+ -+ default: /* XG40 */ -+ -+ if ( XGINew_CheckFrequence(pVBInfo) == 1 ) /* DDRII */ -+ { -+ XGINew_DataBusWidth = 32 ; /* 32 bits */ -+ XGINew_ChannelAB = 3 ; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x13 , 0xA1 ) ; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , 0x4C ) ; -+ -+ if ( XGINew_ReadWriteRest( 25 , 23 , pVBInfo ) == 1 ) -+ return ; -+ -+ XGINew_ChannelAB = 2 ; /* 2 channels */ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , 0x48 ) ; -+ -+ if ( XGINew_ReadWriteRest( 24 , 23 , pVBInfo ) == 1 ) -+ return ; -+ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x13 , 0x21 ) ; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , 0x3C ) ; -+ -+ if ( XGINew_ReadWriteRest( 24 , 23 , pVBInfo ) == 1 ) -+ XGINew_ChannelAB = 3 ; /* 4 channels */ -+ else -+ { -+ XGINew_ChannelAB = 2 ; /* 2 channels */ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , 0x38 ) ; -+ } -+ } -+ else -+ { /* DDR */ -+ XGINew_DataBusWidth = 64 ; /* 64 bits */ -+ XGINew_ChannelAB = 2 ; /* 2 channels */ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x13 , 0xA1 ) ; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , 0x5A ) ; -+ -+ if ( XGINew_ReadWriteRest( 25 , 24 , pVBInfo ) == 1 ) -+ return ; -+ else -+ { -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x13 , 0x21 ) ; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x14 , 0x4A ) ; -+ } -+ } -+ break ; -+ } -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGINew_DDRSizing340 */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+int XGINew_DDRSizing340( PXGI_HW_DEVICE_INFO HwDeviceExtension, PVB_DEVICE_INFO pVBInfo) -+{ -+ int i ; -+ USHORT memsize , addr ; -+ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x15 , 0x00 ) ; /* noninterleaving */ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x1C , 0x00 ) ; /* nontiling */ -+ XGINew_CheckChannel( HwDeviceExtension, pVBInfo ) ; -+ -+ /* Jong 10/03/2007 */ -+ if ( HwDeviceExtension->jChipType >= XG20 ) -+ { -+ for( i = 0 ; i < 12 ; i++ ) -+ { -+ XGINew_SetDRAMSizingType( i , XGINew_DDRDRAM_TYPE20, pVBInfo ) ; -+ memsize = XGINew_SetDRAMSize20Reg( i , XGINew_DDRDRAM_TYPE20, pVBInfo ) ; -+ if ( memsize == 0 ) -+ continue ; -+ -+ addr = memsize + ( XGINew_ChannelAB - 2 ) + 20 ; -+ if ( ( HwDeviceExtension->ulVideoMemorySize - 1 ) < ( ULONG )( 1 << addr ) ) -+ continue ; -+ -+ if ( XGINew_ReadWriteRest( addr , 5, pVBInfo ) == 1 ) -+ return( 1 ) ; -+ } -+ } -+ else -+ { -+ for( i = 0 ; i < 4 ; i++ ) -+ { -+ XGINew_SetDRAMSizingType( i , XGINew_DDRDRAM_TYPE340, pVBInfo ) ; -+ memsize = XGINew_SetDRAMSizeReg( i , XGINew_DDRDRAM_TYPE340, pVBInfo ) ; -+ if ( memsize == 0 ) -+ continue ; -+ -+ addr = memsize + ( XGINew_ChannelAB - 2 ) + 20 ; -+ if ( ( HwDeviceExtension->ulVideoMemorySize - 1 ) < ( ULONG )( 1 << addr ) ) -+ continue ; -+ -+ if ( XGINew_ReadWriteRest( addr , 9, pVBInfo ) == 1 ) -+ return( 1 ) ; -+ } -+ } -+ return( 0 ) ; -+} -+ -+ -+/*--------------------------------------------------------------------- */ -+/* Function : XGINew_DDRSizingXG45 */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/*--------------------------------------------------------------------- */ -+int XGINew_DDRSizingXG45( PXGI_HW_DEVICE_INFO HwDeviceExtension, PVB_DEVICE_INFO pVBInfo) -+{ -+ int i ; -+ USHORT memsize , addr ; -+ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x15 , 0x00 ) ; /* noninterleaving */ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x1C , 0x00 ) ; /* nontiling */ -+ XGINew_CheckChannel( HwDeviceExtension, pVBInfo ) ; -+ -+ for( i = 0 ; i < 4 ; i++ ) -+ { -+ XGINew_SetDRAMSizingType( i , XGINew_DDRDRAM_TYPE340, pVBInfo ) ; -+ memsize = XGINew_SetDRAMSizeReg( i , XGINew_DDRDRAM_TYPE340, pVBInfo ) ; -+ if ( memsize == 0 ) -+ continue ; -+ -+ addr = memsize + ( XGINew_ChannelAB - 2 ) + 20 ; -+ if ( ( HwDeviceExtension->ulVideoMemorySize - 1 ) < ( ULONG )( 1 << addr ) ) -+ continue ; -+ -+ if ( XGI45New_ReadWriteRest( addr , 9, pVBInfo ) == 1 ) -+ return( 1 ) ; -+ } -+ return( 0 ) ; -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGINew_DDRSizing */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+int XGINew_DDRSizing(PVB_DEVICE_INFO pVBInfo) -+{ -+ int i ; -+ UCHAR j ; -+ -+ for( i = 0 ; i < 4 ; i++ ) -+ { -+ XGINew_SetDRAMSizingType( i , XGINew_DDRDRAM_TYPE, pVBInfo ) ; -+ XGINew_DisableChannelInterleaving( i , XGINew_DDRDRAM_TYPE , pVBInfo) ; -+ for( j = 2 ; j > 0 ; j-- ) -+ { -+ XGINew_SetDDRChannel( i , j , XGINew_ChannelAB , XGINew_DDRDRAM_TYPE , pVBInfo ) ; -+ if ( !XGINew_SetRank( i , ( UCHAR )j , XGINew_ChannelAB , XGINew_DDRDRAM_TYPE, pVBInfo ) ) -+ continue ; -+ else -+ { -+ if ( XGINew_CheckDDRRanks( j , i , XGINew_DDRDRAM_TYPE, pVBInfo ) ) -+ return( 1 ) ; -+ } -+ } -+ } -+ return( 0 ) ; -+} -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGINew_SetMemoryClock */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+void XGINew_SetMemoryClock( PXGI_HW_DEVICE_INFO HwDeviceExtension, PVB_DEVICE_INFO pVBInfo) -+{ -+#ifndef LINUX_XF86 -+ UCHAR tempal ; -+#endif -+ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x28 , pVBInfo->MCLKData[ XGINew_RAMType ].SR28 ) ; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x29 , pVBInfo->MCLKData[ XGINew_RAMType ].SR29 ) ; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x2A , pVBInfo->MCLKData[ XGINew_RAMType ].SR2A ) ; -+ -+ -+ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x2E , pVBInfo->ECLKData[ XGINew_RAMType ].SR2E ) ; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x2F , pVBInfo->ECLKData[ XGINew_RAMType ].SR2F ) ; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x30 , pVBInfo->ECLKData[ XGINew_RAMType ].SR30 ) ; -+ -+ /* [Vicent] 2004/07/07, When XG42 ECLK = MCLK = 207MHz, Set SR32 D[1:0] = 10b */ -+ /* [Hsuan] 2004/08/20, Modify SR32 value, when MCLK=207MHZ, ELCK=250MHz, Set SR32 D[1:0] = 10b */ -+ if ( HwDeviceExtension->jChipType == XG42 ) -+ { -+ if ( ( pVBInfo->MCLKData[ XGINew_RAMType ].SR28 == 0x1C ) && ( pVBInfo->MCLKData[ XGINew_RAMType ].SR29 == 0x01 ) -+ && ( ( ( pVBInfo->ECLKData[ XGINew_RAMType ].SR2E == 0x1C ) && ( pVBInfo->ECLKData[ XGINew_RAMType ].SR2F == 0x01 ) ) -+ || ( ( pVBInfo->ECLKData[ XGINew_RAMType ].SR2E == 0x22 ) && ( pVBInfo->ECLKData[ XGINew_RAMType ].SR2F == 0x01 ) ) ) ) -+ { -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x32 , ( ( UCHAR )XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x32 ) & 0xFC ) | 0x02 ) ; -+ } -+ } -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* input : dx ,valid value : CR or second chip's CR */ -+/* */ -+/* SetPowerConsume : */ -+/* Description: reduce 40/43 power consumption in first chip or */ -+/* in second chip, assume CR A1 D[6]="1" in this case */ -+/* output : none */ -+/* --------------------------------------------------------------------- */ -+void SetPowerConsume ( PXGI_HW_DEVICE_INFO HwDeviceExtension , USHORT XGI_P3d4Port ) -+{ -+ ULONG lTemp ; -+ UCHAR bTemp; -+ -+ HwDeviceExtension->pQueryVGAConfigSpace( HwDeviceExtension , 0x08 , 0 , &lTemp ) ; /* Get */ -+ if ((lTemp&0xFF)==0) -+ { -+ /* set CR58 D[5]=0 D[3]=0 */ -+ XGI_SetRegAND((XGIIOADDRESS) XGI_P3d4Port , 0x58 , 0xD7 ) ; -+ bTemp = (UCHAR) XGI_GetReg((XGIIOADDRESS) XGI_P3d4Port , 0xCB ) ; -+ if (bTemp&0x20) -+ { -+ if (!(bTemp&0x10)) -+ { -+ XGI_SetRegANDOR((XGIIOADDRESS) XGI_P3d4Port , 0x58 , 0xD7 , 0x20 ) ; /* CR58 D[5]=1 D[3]=0 */ -+ } -+ else -+ { -+ XGI_SetRegANDOR((XGIIOADDRESS) XGI_P3d4Port , 0x58 , 0xD7 , 0x08 ) ; /* CR58 D[5]=0 D[3]=1 */ -+ } -+ -+ } -+ -+ } -+} -+ -+ -+void XGINew_InitVBIOSData(PXGI_HW_DEVICE_INFO HwDeviceExtension, PVB_DEVICE_INFO pVBInfo) -+{ -+ -+ /* ULONG ROMAddr = (ULONG)HwDeviceExtension->pjVirtualRomBase; */ -+ pVBInfo->ROMAddr = HwDeviceExtension->pjVirtualRomBase ; -+ pVBInfo->FBAddr = HwDeviceExtension->pjVideoMemoryAddress ; -+ pVBInfo->BaseAddr = ( USHORT )HwDeviceExtension->pjIOAddress ; -+ pVBInfo->RelIO = HwDeviceExtension->pjIOAddress - 0x30; -+ pVBInfo->ISXPDOS = 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->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 ; -+ -+ pVBInfo->IF_DEF_LCDA = 1 ; -+ 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 ; -+ } -+ 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 ; -+ } -+ -+ if ( (HwDeviceExtension->jChipType != XG20) && -+ (HwDeviceExtension->jChipType != XG21) && -+ (HwDeviceExtension->jChipType != XG27)) { -+ /* alan, disable VideoCapture */ -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part0Port, 0x3F, 0xEF, 0x00); -+ } -+ -+ XGI_GetVBType( pVBInfo ) ; /* Run XGI_GetVBType before InitTo330Pointer */ -+ InitTo330Pointer(HwDeviceExtension->jChipType,pVBInfo); -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : ReadVBIOSTablData */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+void ReadVBIOSTablData( UCHAR ChipType , PVB_DEVICE_INFO pVBInfo) -+{ -+#ifndef LINUX_XF86 -+ ULONG ulOffset ; -+ UCHAR temp , index , l ; -+#endif -+ PUCHAR volatile pVideoMemory = ( PUCHAR )pVBInfo->ROMAddr ; -+ ULONG i ; -+ UCHAR j , k ; -+ ULONG ii , jj ; -+ -+ i = pVideoMemory[ 0x1CF ] | ( pVideoMemory[ 0x1D0 ] << 8 ) ; /* UniROM */ -+ if ( i != 0 ) -+ UNIROM = 1 ; -+ -+ ii = 0x90 ; -+ for( jj = 0x00 ; jj < 0x08 ; jj++ ) -+ { -+ pVBInfo->MCLKData[ jj ].SR28 = pVideoMemory[ ii ] ; -+ pVBInfo->MCLKData[ jj ].SR29 = pVideoMemory[ ii + 1] ; -+ pVBInfo->MCLKData[ jj ].SR2A = pVideoMemory[ ii + 2] ; -+ pVBInfo->MCLKData[ jj ].CLOCK = pVideoMemory[ ii + 3 ] | ( pVideoMemory[ ii + 4 ] << 8 ) ; -+ ii += 0x05 ; -+ } -+ -+ ii = 0xB8 ; -+ for( jj = 0x00 ; jj < 0x08 ; jj++ ) -+ { -+ pVBInfo->ECLKData[ jj ].SR2E = pVideoMemory[ ii ] ; -+ pVBInfo->ECLKData[ jj ].SR2F=pVideoMemory[ ii + 1 ] ; -+ pVBInfo->ECLKData[ jj ].SR30= pVideoMemory[ ii + 2 ] ; -+ pVBInfo->ECLKData[ jj ].CLOCK= pVideoMemory[ ii + 3 ] | ( pVideoMemory[ ii + 4 ] << 8 ) ; -+ ii += 0x05 ; -+ } -+ -+ /* Volari customize data area start */ -+ /* if ( ChipType == XG40 ) */ -+ if ( ChipType >= XG40 ) -+ { -+ ii = 0xE0 ; -+ for( jj = 0x00 ; jj < 0x03 ; jj++ ) -+ { -+ pVBInfo->SR15[ jj ][ 0 ] = pVideoMemory[ ii ] ; /* SR13, SR14, and SR18 */ -+ pVBInfo->SR15[ jj ][ 1 ] = pVideoMemory[ ii + 1 ] ; -+ pVBInfo->SR15[ jj ][ 2 ] = pVideoMemory[ ii + 2 ] ; -+ pVBInfo->SR15[ jj ][ 3 ] = pVideoMemory[ ii + 3 ] ; -+ pVBInfo->SR15[ jj ][ 4 ] = pVideoMemory[ ii + 4 ] ; -+ pVBInfo->SR15[ jj ][ 5 ] = pVideoMemory[ ii + 5 ] ; -+ pVBInfo->SR15[ jj ][ 6 ] = pVideoMemory[ ii + 6 ] ; -+ pVBInfo->SR15[ jj ][ 7 ] = pVideoMemory[ ii + 7 ] ; -+ ii += 0x08 ; -+ } -+ ii = 0x110 ; -+ jj = 0x03 ; -+ pVBInfo->SR15[ jj ][ 0 ] = pVideoMemory[ ii ] ; /* SR1B */ -+ pVBInfo->SR15[ jj ][ 1 ] = pVideoMemory[ ii + 1 ] ; -+ pVBInfo->SR15[ jj ][ 2 ] = pVideoMemory[ ii + 2 ] ; -+ pVBInfo->SR15[ jj ][ 3 ] = pVideoMemory[ ii + 3 ] ; -+ pVBInfo->SR15[ jj ][ 4 ] = pVideoMemory[ ii + 4 ] ; -+ pVBInfo->SR15[ jj ][ 5 ] = pVideoMemory[ ii + 5 ] ; -+ pVBInfo->SR15[ jj ][ 6 ] = pVideoMemory[ ii + 6 ] ; -+ pVBInfo->SR15[ jj ][ 7 ] = pVideoMemory[ ii + 7 ] ; -+ -+ pVBInfo->SR07 = pVideoMemory[0x74]; -+ pVBInfo->SR1F = pVideoMemory[0x75]; -+ pVBInfo->SR21 = pVideoMemory[0x76]; -+ pVBInfo->SR22 = pVideoMemory[0x77]; -+ pVBInfo->SR23 = pVideoMemory[0x78]; -+ pVBInfo->SR24 = pVideoMemory[0x79]; -+ pVBInfo->SR25[0] = pVideoMemory[0x7A]; -+ pVBInfo->SR31 = pVideoMemory[0x7B]; -+ pVBInfo->SR32 = pVideoMemory[0x7C]; -+ pVBInfo->SR33 = pVideoMemory[0x7D]; -+ ii = 0xF8 ; -+ -+ for( jj = 0 ; jj < 3 ; jj++ ) -+ { -+ pVBInfo->CR40[ jj ][ 0 ] = pVideoMemory[ ii ] ; -+ pVBInfo->CR40[ jj ][ 1 ] = pVideoMemory[ ii + 1 ] ; -+ pVBInfo->CR40[ jj ][ 2 ] = pVideoMemory[ ii + 2 ] ; -+ pVBInfo->CR40[ jj ][ 3 ] = pVideoMemory[ ii + 3 ] ; -+ pVBInfo->CR40[ jj ][ 4 ] = pVideoMemory[ ii + 4 ] ; -+ pVBInfo->CR40[ jj ][ 5 ] = pVideoMemory[ ii + 5 ] ; -+ pVBInfo->CR40[ jj ][ 6 ] = pVideoMemory[ ii + 6 ] ; -+ pVBInfo->CR40[ jj ][ 7 ] = pVideoMemory[ ii + 7 ] ; -+ ii += 0x08 ; -+ } -+ -+ ii = 0x118 ; -+ for( j = 3 ; j < 24 ; j++ ) -+ { -+ pVBInfo->CR40[ j ][ 0 ] = pVideoMemory[ ii ] ; -+ pVBInfo->CR40[ j ][ 1 ] = pVideoMemory[ ii + 1 ] ; -+ pVBInfo->CR40[ j ][ 2 ] = pVideoMemory[ ii + 2 ] ; -+ pVBInfo->CR40[ j ][ 3 ] = pVideoMemory[ ii + 3 ] ; -+ pVBInfo->CR40[ j ][ 4 ] = pVideoMemory[ ii + 4 ] ; -+ pVBInfo->CR40[ j ][ 5 ] = pVideoMemory[ ii + 5 ] ; -+ pVBInfo->CR40[ j ][ 6 ] = pVideoMemory[ ii + 6 ] ; -+ pVBInfo->CR40[ j ][ 7 ] = pVideoMemory[ ii + 7 ] ; -+ ii += 0x08 ; -+ } -+ -+ i = pVideoMemory[ 0x1C0 ] | ( pVideoMemory[ 0x1C1 ] << 8 ) ; -+ -+ for( j = 0 ; j < 8 ; j++ ) -+ { -+ for( k = 0 ; k < 4 ; k++ ) -+ pVBInfo->CR6B[ j ][ k ] = pVideoMemory[ i + 4 * j + k ] ; -+ } -+ -+ i = pVideoMemory[ 0x1C2 ] | ( pVideoMemory[ 0x1C3 ] << 8 ) ; -+ -+ if (ChipType == XG45) -+ { -+ for( j = 0 ; j < 8 ; j++ ) -+ { -+ pVBInfo->XG45CR6E[ j ] = pVideoMemory[i] ; -+ } -+ } -+ else -+ { -+ for( j = 0 ; j < 8 ; j++ ) -+ { -+ for( k = 0 ; k < 4 ; k++ ) -+ pVBInfo->CR6E[ j ][ k ] = pVideoMemory[ i + 4 * j + k ] ; -+ } -+ } -+ -+ i = pVideoMemory[ 0x1C4 ] | ( pVideoMemory[ 0x1C5 ] << 8 ) ; -+ if (ChipType == XG45) -+ { -+ for( j = 0 ; j < 8 ; j++ ) -+ { -+ pVBInfo->XG45CR6F[ j ] = pVideoMemory[i] ; -+ } -+ } -+ else -+ { -+ for( j = 0 ; j < 8 ; j++ ) -+ { -+ for( k = 0 ; k < 32 ; k++ ) -+ pVBInfo->CR6F[ j ][ k ] = pVideoMemory[ i + 32 * j + k ] ; -+ } -+ } -+ -+ i = pVideoMemory[ 0x1C6 ] | ( pVideoMemory[ 0x1C7 ] << 8 ) ; -+ -+ for( j = 0 ; j < 8 ; j++ ) -+ { -+ for( k = 0 ; k < 2 ; k++ ) -+ pVBInfo->CR89[ j ][ k ] = pVideoMemory[ i + 2 * j + k ] ; -+ } -+ -+ i = pVideoMemory[ 0x1C8 ] | ( pVideoMemory[ 0x1C9 ] << 8 ) ; -+ for( j = 0 ; j < 12 ; j++ ) -+ pVBInfo->AGPReg[ j ] = pVideoMemory[ i + j ] ; -+ -+ i = pVideoMemory[ 0x1CF ] | ( pVideoMemory[ 0x1D0 ] << 8 ) ; -+ for( j = 0 ; j < 4 ; j++ ) -+ pVBInfo->SR16[ j ] = pVideoMemory[ i + j ] ; -+ -+ /* Jong 10/03/2007 */ -+ /* -+ pVBInfo->CRCF = pVideoMemory[0x1CA]; -+ pVBInfo->DRAMTypeDefinition = pVideoMemory[0x1CB]; -+ pVBInfo->I2CDefinition = pVideoMemory[0x1D1]; -+ if ( ChipType == XG20 ) -+ pVBInfo->CR97 = pVideoMemory[0x1D2]; */ -+ if ( ChipType == XG21 ) -+ { -+ if (pVideoMemory[ 0x67 ] & 0x80) -+ { -+ *pVBInfo->pDVOSetting = pVideoMemory[ 0x67 ]; -+ } -+ if ( (pVideoMemory[ 0x67 ] & 0xC0) == 0xC0 ) -+ { -+ *pVBInfo->pCR2E = pVideoMemory[ i + 4 ] ; -+ *pVBInfo->pCR2F = pVideoMemory[ i + 5 ] ; -+ *pVBInfo->pCR46 = pVideoMemory[ i + 6 ] ; -+ *pVBInfo->pCR47 = pVideoMemory[ i + 7 ] ; -+ } -+ } -+ -+ if ( ChipType == XG27 ) -+ { -+ jj = i+j; -+ for( i = 0 ; i <= 0xB ; i++,jj++ ) -+ pVBInfo->pCRD0[i] = pVideoMemory[ jj ] ; -+ for( i = 0x0 ; i <= 0x1 ; i++,jj++ ) -+ pVBInfo->pCRDE[i] = pVideoMemory[ jj ] ; -+ -+ *pVBInfo->pSR40 = pVideoMemory[ jj ] ; -+ jj++; -+ *pVBInfo->pSR41 = pVideoMemory[ jj ] ; -+ -+ if (pVideoMemory[ 0x67 ] & 0x80) -+ { -+ *pVBInfo->pDVOSetting = pVideoMemory[ 0x67 ]; -+ } -+ if ( (pVideoMemory[ 0x67 ] & 0xC0) == 0xC0 ) -+ { -+ jj++; -+ *pVBInfo->pCR2E = pVideoMemory[ jj ] ; -+ *pVBInfo->pCR2F = pVideoMemory[ jj + 1 ] ; -+ *pVBInfo->pCR46 = pVideoMemory[ jj + 2 ] ; -+ *pVBInfo->pCR47 = pVideoMemory[ jj + 3 ] ; -+ } -+ -+ } -+ -+ pVBInfo->CRCF = pVideoMemory[ 0x1CA ] ; -+ pVBInfo->DRAMTypeDefinition = pVideoMemory[ 0x1CB ] ; -+ pVBInfo->I2CDefinition = pVideoMemory[ 0x1D1 ] ; -+ if ( ChipType >= XG20 ) -+ { -+ pVBInfo->CR97 = pVideoMemory[ 0x1D2 ] ; -+ if ( ChipType == XG27 ) -+ { -+ *pVBInfo->pSR36 = pVideoMemory[ 0x1D3 ] ; -+ *pVBInfo->pCR8F = pVideoMemory[ 0x1D5 ] ; -+ } -+ } -+ } -+ /* Volari customize data area end */ -+ -+ if ( ChipType == XG21 ) -+ { -+ pVBInfo->IF_DEF_LVDS = 0 ; -+ if (pVideoMemory[ 0x65 ] & 0x1) -+ { -+ pVBInfo->IF_DEF_LVDS = 1 ; -+ i = pVideoMemory[ 0x316 ] | ( pVideoMemory[ 0x317 ] << 8 ); -+ j = pVideoMemory[ i-1 ] ; -+ if ( j != 0xff ) -+ { -+ k = 0; -+ do -+ { -+ pVBInfo->XG21_LVDSCapList[k].LVDS_Capability = pVideoMemory[ i ] | ( pVideoMemory[ i + 1 ] << 8 ); -+ pVBInfo->XG21_LVDSCapList[k].LVDSHT = pVideoMemory[ i + 2 ] | ( pVideoMemory[ i + 3 ] << 8 ) ; -+ pVBInfo->XG21_LVDSCapList[k].LVDSVT = pVideoMemory[ i + 4 ] | ( pVideoMemory[ i + 5 ] << 8 ); -+ pVBInfo->XG21_LVDSCapList[k].LVDSHDE = pVideoMemory[ i + 6 ] | ( pVideoMemory[ i + 7 ] << 8 ); -+ pVBInfo->XG21_LVDSCapList[k].LVDSVDE = pVideoMemory[ i + 8 ] | ( pVideoMemory[ i + 9 ] << 8 ); -+ pVBInfo->XG21_LVDSCapList[k].LVDSHFP = pVideoMemory[ i + 10 ] | ( pVideoMemory[ i + 11 ] << 8 ); -+ pVBInfo->XG21_LVDSCapList[k].LVDSVFP = pVideoMemory[ i + 12 ] | ( pVideoMemory[ i + 13 ] << 8 ); -+ pVBInfo->XG21_LVDSCapList[k].LVDSHSYNC = pVideoMemory[ i + 14 ] | ( pVideoMemory[ i + 15 ] << 8 ); -+ pVBInfo->XG21_LVDSCapList[k].LVDSVSYNC = pVideoMemory[ i + 16 ] | ( pVideoMemory[ i + 17 ] << 8 ); -+ pVBInfo->XG21_LVDSCapList[k].VCLKData1 = pVideoMemory[ i + 18 ] ; -+ pVBInfo->XG21_LVDSCapList[k].VCLKData2 = pVideoMemory[ i + 19 ] ; -+ pVBInfo->XG21_LVDSCapList[k].PSC_S1 = pVideoMemory[ i + 20 ] ; -+ pVBInfo->XG21_LVDSCapList[k].PSC_S2 = pVideoMemory[ i + 21 ] ; -+ pVBInfo->XG21_LVDSCapList[k].PSC_S3 = pVideoMemory[ i + 22 ] ; -+ pVBInfo->XG21_LVDSCapList[k].PSC_S4 = pVideoMemory[ i + 23 ] ; -+ pVBInfo->XG21_LVDSCapList[k].PSC_S5 = pVideoMemory[ i + 24 ] ; -+ i += 25; -+ j--; -+ k++; -+ } while ( (j>0) && ( k < (sizeof(XGI21_LCDCapList)/sizeof(XGI21_LVDSCapStruct)) ) ); -+ } -+ else -+ { -+ pVBInfo->XG21_LVDSCapList[0].LVDS_Capability = pVideoMemory[ i ] | ( pVideoMemory[ i + 1 ] << 8 ); -+ pVBInfo->XG21_LVDSCapList[0].LVDSHT = pVideoMemory[ i + 2 ] | ( pVideoMemory[ i + 3 ] << 8 ) ; -+ pVBInfo->XG21_LVDSCapList[0].LVDSVT = pVideoMemory[ i + 4 ] | ( pVideoMemory[ i + 5 ] << 8 ); -+ pVBInfo->XG21_LVDSCapList[0].LVDSHDE = pVideoMemory[ i + 6 ] | ( pVideoMemory[ i + 7 ] << 8 ); -+ pVBInfo->XG21_LVDSCapList[0].LVDSVDE = pVideoMemory[ i + 8 ] | ( pVideoMemory[ i + 9 ] << 8 ); -+ pVBInfo->XG21_LVDSCapList[0].LVDSHFP = pVideoMemory[ i + 10 ] | ( pVideoMemory[ i + 11 ] << 8 ); -+ pVBInfo->XG21_LVDSCapList[0].LVDSVFP = pVideoMemory[ i + 12 ] | ( pVideoMemory[ i + 13 ] << 8 ); -+ pVBInfo->XG21_LVDSCapList[0].LVDSHSYNC = pVideoMemory[ i + 14 ] | ( pVideoMemory[ i + 15 ] << 8 ); -+ pVBInfo->XG21_LVDSCapList[0].LVDSVSYNC = pVideoMemory[ i + 16 ] | ( pVideoMemory[ i + 17 ] << 8 ); -+ pVBInfo->XG21_LVDSCapList[0].VCLKData1 = pVideoMemory[ i + 18 ] ; -+ pVBInfo->XG21_LVDSCapList[0].VCLKData2 = pVideoMemory[ i + 19 ] ; -+ pVBInfo->XG21_LVDSCapList[0].PSC_S1 = pVideoMemory[ i + 20 ] ; -+ pVBInfo->XG21_LVDSCapList[0].PSC_S2 = pVideoMemory[ i + 21 ] ; -+ pVBInfo->XG21_LVDSCapList[0].PSC_S3 = pVideoMemory[ i + 22 ] ; -+ pVBInfo->XG21_LVDSCapList[0].PSC_S4 = pVideoMemory[ i + 23 ] ; -+ pVBInfo->XG21_LVDSCapList[0].PSC_S5 = pVideoMemory[ i + 24 ] ; -+ } -+ } -+ pVBInfo->IF_DEF_CH7007 = 0 ; -+ if ( ( pVideoMemory[ 0x65 ] & 0x02 ) ) /* For XG21 CH7007 */ -+ { -+ /* VideoDebugPrint((0, "ReadVBIOSTablData: pVideoMemory[ 0x65 ] =%x\n",pVideoMemory[ 0x65 ])); */ -+ pVBInfo->IF_DEF_CH7007 = 1 ; /* [Billy] 07/05/03 */ -+ } -+ } -+ -+ if ( ChipType == XG27 ) -+ { -+ if (pVideoMemory[ 0x65 ] & 0x1) -+ { -+ i = pVideoMemory[ 0x316 ] | ( pVideoMemory[ 0x317 ] << 8 ); -+ j = pVideoMemory[ i-1 ] ; -+ if ( j != 0xff ) -+ { -+ k = 0; -+ do -+ { -+ pVBInfo->XG21_LVDSCapList[k].LVDS_Capability = pVideoMemory[ i ] | ( pVideoMemory[ i + 1 ] << 8 ); -+ pVBInfo->XG21_LVDSCapList[k].LVDSHT = pVideoMemory[ i + 2 ] | ( pVideoMemory[ i + 3 ] << 8 ) ; -+ pVBInfo->XG21_LVDSCapList[k].LVDSVT = pVideoMemory[ i + 4 ] | ( pVideoMemory[ i + 5 ] << 8 ); -+ pVBInfo->XG21_LVDSCapList[k].LVDSHDE = pVideoMemory[ i + 6 ] | ( pVideoMemory[ i + 7 ] << 8 ); -+ pVBInfo->XG21_LVDSCapList[k].LVDSVDE = pVideoMemory[ i + 8 ] | ( pVideoMemory[ i + 9 ] << 8 ); -+ pVBInfo->XG21_LVDSCapList[k].LVDSHFP = pVideoMemory[ i + 10 ] | ( pVideoMemory[ i + 11 ] << 8 ); -+ pVBInfo->XG21_LVDSCapList[k].LVDSVFP = pVideoMemory[ i + 12 ] | ( pVideoMemory[ i + 13 ] << 8 ); -+ pVBInfo->XG21_LVDSCapList[k].LVDSHSYNC = pVideoMemory[ i + 14 ] | ( pVideoMemory[ i + 15 ] << 8 ); -+ pVBInfo->XG21_LVDSCapList[k].LVDSVSYNC = pVideoMemory[ i + 16 ] | ( pVideoMemory[ i + 17 ] << 8 ); -+ pVBInfo->XG21_LVDSCapList[k].VCLKData1 = pVideoMemory[ i + 18 ] ; -+ pVBInfo->XG21_LVDSCapList[k].VCLKData2 = pVideoMemory[ i + 19 ] ; -+ pVBInfo->XG21_LVDSCapList[k].PSC_S1 = pVideoMemory[ i + 20 ] ; -+ pVBInfo->XG21_LVDSCapList[k].PSC_S2 = pVideoMemory[ i + 21 ] ; -+ pVBInfo->XG21_LVDSCapList[k].PSC_S3 = pVideoMemory[ i + 22 ] ; -+ pVBInfo->XG21_LVDSCapList[k].PSC_S4 = pVideoMemory[ i + 23 ] ; -+ pVBInfo->XG21_LVDSCapList[k].PSC_S5 = pVideoMemory[ i + 24 ] ; -+ i += 25; -+ j--; -+ k++; -+ } while ( (j>0) && ( k < (sizeof(XGI21_LCDCapList)/sizeof(XGI21_LVDSCapStruct)) ) ); -+ } -+ else -+ { -+ pVBInfo->XG21_LVDSCapList[0].LVDS_Capability = pVideoMemory[ i ] | ( pVideoMemory[ i + 1 ] << 8 ); -+ pVBInfo->XG21_LVDSCapList[0].LVDSHT = pVideoMemory[ i + 2 ] | ( pVideoMemory[ i + 3 ] << 8 ) ; -+ pVBInfo->XG21_LVDSCapList[0].LVDSVT = pVideoMemory[ i + 4 ] | ( pVideoMemory[ i + 5 ] << 8 ); -+ pVBInfo->XG21_LVDSCapList[0].LVDSHDE = pVideoMemory[ i + 6 ] | ( pVideoMemory[ i + 7 ] << 8 ); -+ pVBInfo->XG21_LVDSCapList[0].LVDSVDE = pVideoMemory[ i + 8 ] | ( pVideoMemory[ i + 9 ] << 8 ); -+ pVBInfo->XG21_LVDSCapList[0].LVDSHFP = pVideoMemory[ i + 10 ] | ( pVideoMemory[ i + 11 ] << 8 ); -+ pVBInfo->XG21_LVDSCapList[0].LVDSVFP = pVideoMemory[ i + 12 ] | ( pVideoMemory[ i + 13 ] << 8 ); -+ pVBInfo->XG21_LVDSCapList[0].LVDSHSYNC = pVideoMemory[ i + 14 ] | ( pVideoMemory[ i + 15 ] << 8 ); -+ pVBInfo->XG21_LVDSCapList[0].LVDSVSYNC = pVideoMemory[ i + 16 ] | ( pVideoMemory[ i + 17 ] << 8 ); -+ pVBInfo->XG21_LVDSCapList[0].VCLKData1 = pVideoMemory[ i + 18 ] ; -+ pVBInfo->XG21_LVDSCapList[0].VCLKData2 = pVideoMemory[ i + 19 ] ; -+ pVBInfo->XG21_LVDSCapList[0].PSC_S1 = pVideoMemory[ i + 20 ] ; -+ pVBInfo->XG21_LVDSCapList[0].PSC_S2 = pVideoMemory[ i + 21 ] ; -+ pVBInfo->XG21_LVDSCapList[0].PSC_S3 = pVideoMemory[ i + 22 ] ; -+ pVBInfo->XG21_LVDSCapList[0].PSC_S4 = pVideoMemory[ i + 23 ] ; -+ pVBInfo->XG21_LVDSCapList[0].PSC_S5 = pVideoMemory[ i + 24 ] ; -+ } -+ } -+ } -+ -+} -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGINew_DDR1x_MRS_XG20 */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+void XGINew_DDR1x_MRS_XG20( USHORT P3c4 , PVB_DEVICE_INFO pVBInfo) -+{ -+ -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x18 , 0x01 ) ; -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x19 , 0x40 ) ; -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x16 , 0x00 ) ; -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x16 , 0x80 ) ; -+ DelayUS( 60 ) ; -+ -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x18 , 0x00 ) ; -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x19 , 0x40 ) ; -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x16 , 0x00 ) ; -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x16 , 0x80 ) ; -+ DelayUS( 60 ) ; -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x18 , pVBInfo->SR15[ 2 ][ XGINew_RAMType ] ) ; /* SR18 */ -+ /* XGI_SetReg((XGIIOADDRESS) P3c4 , 0x18 , 0x31 ) ; */ -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x19 , 0x01 ) ; -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x16 , 0x03 ) ; -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x16 , 0x83 ) ; -+ DelayUS( 1000 ) ; -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x1B , 0x03 ) ; -+ DelayUS( 500 ) ; -+ /* XGI_SetReg((XGIIOADDRESS) P3c4 , 0x18 , 0x31 ) ; */ -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x18 , pVBInfo->SR15[ 2 ][ XGINew_RAMType ] ) ; /* SR18 */ -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x19 , 0x00 ) ; -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x16 , 0x03 ) ; -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x16 , 0x83 ) ; -+ XGI_SetReg((XGIIOADDRESS) P3c4 , 0x1B , 0x00 ) ; -+} -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGINew_SetDRAMModeRegister_XG20 */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+void XGINew_SetDRAMModeRegister_XG20(PXGI_HW_DEVICE_INFO HwDeviceExtension, -+ PVB_DEVICE_INFO pVBInfo) -+{ -+#ifndef LINUX_XF86 -+ UCHAR data ; -+#endif -+ -+ ReadVBIOSTablData( HwDeviceExtension->jChipType , pVBInfo) ; -+ -+ if ( XGINew_Get340DRAMType( HwDeviceExtension, pVBInfo) == 0 ) -+ XGINew_DDR1x_MRS_XG20( pVBInfo->P3c4, pVBInfo ) ; -+ else -+ XGINew_DDR2x_MRS_340( HwDeviceExtension, pVBInfo->P3c4, pVBInfo ) ; -+ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x1B , 0x03 ) ; -+} -+ -+void XGINew_SetDRAMModeRegister_XG27( PXGI_HW_DEVICE_INFO HwDeviceExtension ) -+{ -+#ifndef LINUX_XF86 -+ UCHAR data ; -+#endif -+ VB_DEVICE_INFO VBINF; -+ PVB_DEVICE_INFO pVBInfo = &VBINF; -+ pVBInfo->ROMAddr = HwDeviceExtension->pjVirtualRomBase ; -+ pVBInfo->FBAddr = HwDeviceExtension->pjVideoMemoryAddress ; -+ pVBInfo->BaseAddr = ( USHORT )HwDeviceExtension->pjIOAddress ; -+ pVBInfo->ISXPDOS = 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->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 ; -+ -+ InitTo330Pointer(HwDeviceExtension->jChipType,pVBInfo); -+ -+ ReadVBIOSTablData( HwDeviceExtension->jChipType , pVBInfo) ; -+ -+ if ( XGINew_GetXG20DRAMType( HwDeviceExtension, pVBInfo) == 0 ) -+ XGINew_DDR1x_MRS_XG20( pVBInfo->P3c4, pVBInfo ) ; -+ else -+ /*XGINew_DDR2_MRS_XG27( HwDeviceExtension , pVBInfo->P3c4 , pVBInfo ) ;*/ -+ XGINew_DDRII_Bootup_XG27( HwDeviceExtension , pVBInfo->P3c4 , pVBInfo) ; -+ -+ /*XGINew_SetReg1( pVBInfo->P3c4 , 0x1B , 0x03 ) ;*/ -+ XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3c4 , 0x1B , pVBInfo->SR15[ 3 ][ XGINew_RAMType ] ) ; /* SR1B */ -+ -+} -+ -+/* -------------------------------------------------------- */ -+/* Function : XGINew_ChkSenseStatus */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* -------------------------------------------------------- */ -+void XGINew_ChkSenseStatus ( PXGI_HW_DEVICE_INFO HwDeviceExtension , PVB_DEVICE_INFO pVBInfo) -+{ -+ USHORT tempbx=0 , temp , tempcx , CR3CData; -+ -+ temp = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0x32 ) ; -+ -+ if ( temp & Monitor1Sense ) -+ tempbx |= ActiveCRT1 ; -+ if ( temp & LCDSense ) -+ tempbx |= ActiveLCD ; -+ if ( temp & Monitor2Sense ) -+ tempbx |= ActiveCRT2 ; -+ if ( temp & TVSense ) -+ { -+ tempbx |= ActiveTV ; -+ if ( temp & AVIDEOSense ) -+ tempbx |= ( ActiveAVideo << 8 ); -+ if ( temp & SVIDEOSense ) -+ tempbx |= ( ActiveSVideo << 8 ); -+ if ( temp & SCARTSense ) -+ tempbx |= ( ActiveSCART << 8 ); -+ if ( temp & HiTVSense ) -+ tempbx |= ( ActiveHiTV << 8 ); -+ if ( temp & YPbPrSense ) -+ tempbx |= ( ActiveYPbPr << 8 ); -+ } -+ -+ tempcx = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0x3d ) ; -+ tempcx |= ( XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0x3e ) << 8 ) ; -+ -+ if ( tempbx & tempcx ) -+ { -+ CR3CData = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0x3c ) ; -+ if ( !( CR3CData & DisplayDeviceFromCMOS ) ) -+ { -+ tempcx = 0x1FF0 ; -+ if (pVBInfo->SoftSetting & ModeSoftSetting) { -+ tempbx = 0x1FF0 ; -+ } -+ } -+ } -+ else -+ { -+ tempcx = 0x1FF0 ; -+ if (pVBInfo->SoftSetting & ModeSoftSetting) { -+ tempbx = 0x1FF0 ; -+ } -+ } -+ -+ tempbx &= tempcx ; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x3d , ( tempbx & 0x00FF ) ) ; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x3e , ( ( tempbx & 0xFF00 ) >> 8 )) ; -+} -+/* -------------------------------------------------------- */ -+/* Function : XGINew_SetModeScratch */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* -------------------------------------------------------- */ -+void XGINew_SetModeScratch ( PXGI_HW_DEVICE_INFO HwDeviceExtension , PVB_DEVICE_INFO pVBInfo ) -+{ -+ USHORT temp , tempcl = 0 , tempch = 0 , CR31Data , CR38Data; -+ -+ temp = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0x3d ) ; -+ temp |= XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0x3e ) << 8 ; -+ temp |= ( XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0x31 ) & ( DriverMode >> 8) ) << 8 ; -+ -+ if ( pVBInfo->IF_DEF_CRT2Monitor == 1) -+ { -+ if ( temp & ActiveCRT2 ) -+ tempcl = SetCRT2ToRAMDAC ; -+ } -+ -+ if ( temp & ActiveLCD ) -+ { -+ tempcl |= SetCRT2ToLCD ; -+ if ( temp & DriverMode ) -+ { -+ if ( temp & ActiveTV ) -+ { -+ tempch = SetToLCDA | EnableDualEdge ; -+ temp ^= SetCRT2ToLCD ; -+ -+ if ( ( temp >> 8 ) & ActiveAVideo ) -+ tempcl |= SetCRT2ToAVIDEO ; -+ if ( ( temp >> 8 ) & ActiveSVideo ) -+ tempcl |= SetCRT2ToSVIDEO ; -+ if ( ( temp >> 8 ) & ActiveSCART ) -+ tempcl |= SetCRT2ToSCART ; -+ -+ if ( pVBInfo->IF_DEF_HiVision == 1 ) -+ { -+ if ( ( temp >> 8 ) & ActiveHiTV ) -+ tempcl |= SetCRT2ToHiVisionTV ; -+ } -+ -+ if ( pVBInfo->IF_DEF_YPbPr == 1 ) -+ { -+ if ( ( temp >> 8 ) & ActiveYPbPr ) -+ tempch |= SetYPbPr ; -+ } -+ } -+ } -+ } -+ else -+ { -+ if ( ( temp >> 8 ) & ActiveAVideo ) -+ tempcl |= SetCRT2ToAVIDEO ; -+ if ( ( temp >> 8 ) & ActiveSVideo ) -+ tempcl |= SetCRT2ToSVIDEO ; -+ if ( ( temp >> 8 ) & ActiveSCART ) -+ tempcl |= SetCRT2ToSCART ; -+ -+ if ( pVBInfo->IF_DEF_HiVision == 1 ) -+ { -+ if ( ( temp >> 8 ) & ActiveHiTV ) -+ tempcl |= SetCRT2ToHiVisionTV ; -+ } -+ -+ if ( pVBInfo->IF_DEF_YPbPr == 1 ) -+ { -+ if ( ( temp >> 8 ) & ActiveYPbPr ) -+ tempch |= SetYPbPr ; -+ } -+ } -+ -+ tempcl |= SetSimuScanMode ; -+ if ( (!( temp & ActiveCRT1 )) && ( ( temp & ActiveLCD ) || ( temp & ActiveTV ) || ( temp & ActiveCRT2 ) ) ) -+ tempcl ^= ( SetSimuScanMode | SwitchToCRT2 ) ; -+ if ( ( temp & ActiveLCD ) && ( temp & ActiveTV ) ) -+ tempcl ^= ( SetSimuScanMode | SwitchToCRT2 ) ; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x30 , tempcl ) ; -+ -+ CR31Data = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0x31 ) ; -+ CR31Data &= ~( SetNotSimuMode >> 8 ) ; -+ if ( !( temp & ActiveCRT1 ) ) -+ CR31Data |= ( SetNotSimuMode >> 8 ) ; -+ CR31Data &= ~( DisableCRT2Display >> 8 ) ; -+ if (!( ( temp & ActiveLCD ) || ( temp & ActiveTV ) || ( temp & ActiveCRT2 ) ) ) -+ CR31Data |= ( DisableCRT2Display >> 8 ) ; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x31 , CR31Data ) ; -+ -+ CR38Data = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0x38 ) ; -+ CR38Data &= ~SetYPbPr ; -+ CR38Data |= tempch ; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x38 , CR38Data ) ; -+ -+} -+ -+/* -------------------------------------------------------- */ -+/* Function : XGINew_GetXG21Sense */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* -------------------------------------------------------- */ -+void XGINew_GetXG21Sense(PXGI_HW_DEVICE_INFO HwDeviceExtension, PVB_DEVICE_INFO pVBInfo) -+{ -+ UCHAR Temp; -+ PUCHAR volatile pVideoMemory = ( PUCHAR )pVBInfo->ROMAddr ; -+ -+ pVBInfo->IF_DEF_LVDS = 0 ; -+ -+ if ( ( pVideoMemory[ 0x65 ] & 0x01 ) ) /* For XG21 LVDS */ -+ { -+ pVBInfo->IF_DEF_LVDS = 1 ; -+ XGI_SetRegOR( (XGIIOADDRESS) pVBInfo->P3d4 , 0x32 , LCDSense ) ; -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3d4 , 0x38 , ~0xE0 , 0xC0 ) ; /* LVDS on chip */ -+ } -+ else -+ { -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3d4 , 0x4A , ~0x03 , 0x03 ) ; /* Enable GPIOA/B read */ -+ Temp = XGI_GetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x48 ) & 0xC0; -+ if ( Temp == 0xC0 ) -+ { /* DVI & DVO GPIOA/B pull high */ -+ XGINew_SenseLCD( HwDeviceExtension, pVBInfo ) ; -+ XGI_SetRegOR( (XGIIOADDRESS) pVBInfo->P3d4 , 0x32 , LCDSense ) ; -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3d4 , 0x4A , ~0x20 , 0x20 ) ; /* Enable read GPIOF */ -+ Temp = XGI_GetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x48 ) & 0x04 ; -+ if ( !Temp ) -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3d4 , 0x38 , ~0xE0 , 0x80 ) ; /* TMDS on chip */ -+ else -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3d4 , 0x38 , ~0xE0 , 0xA0 ) ; /* Only DVO on chip */ -+ -+ XGI_SetRegAND( (XGIIOADDRESS)pVBInfo->P3d4 , 0x4A , ~0x20 ) ; /* Disable read GPIOF */ -+ } -+ } -+} -+ -+/* -------------------------------------------------------- */ -+/* Function : XGINew_GetXG27Sense */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* -------------------------------------------------------- */ -+void XGINew_GetXG27Sense(PXGI_HW_DEVICE_INFO HwDeviceExtension, PVB_DEVICE_INFO pVBInfo) -+{ -+ UCHAR Temp,bCR4A; -+ PUCHAR volatile pVideoMemory = ( PUCHAR )pVBInfo->ROMAddr ; -+ -+ pVBInfo->IF_DEF_LVDS = 0 ; -+ bCR4A = XGI_GetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x4A ) ; -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3d4 , 0x4A , ~0x07 , 0x07 ) ; /* Enable GPIOA/B/C read */ -+ Temp = XGI_GetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x48 ) & 0x07; -+ XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4, 0x4A , bCR4A ) ; -+ -+ if ( Temp <= 0x02 ) -+ { -+ pVBInfo->IF_DEF_LVDS = 1 ; -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3d4 , 0x38 , ~0xE0 , 0xC0 ) ; /* LVDS setting */ -+ XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4, 0x30 , 0x21 ) ; -+ } -+ else -+ { -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3d4 , 0x38 , ~0xE0 , 0xA0 ) ; /* TMDS/DVO setting */ -+ } -+ -+ XGI_SetRegOR( (XGIIOADDRESS) pVBInfo->P3d4 , 0x32 , LCDSense ) ; -+} -+ -+UCHAR GetXG21FPBits(PVB_DEVICE_INFO pVBInfo) -+{ -+ UCHAR CR38,CR4A,temp; -+ -+ CR4A = XGI_GetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x4A ) ; -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3d4 , 0x4A , ~0x10 , 0x10 ) ; /* enable GPIOE read */ -+ CR38 = XGI_GetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x38 ) ; -+ temp =0; -+ if ( ( CR38 & 0xE0 ) > 0x80 ) -+ { -+ temp = XGI_GetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x48 ) ; -+ temp &= 0x08; -+ temp >>= 3; -+ } -+ -+ XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4, 0x4A , CR4A ) ; -+ -+ return temp; -+} -+ -+UCHAR GetXG27FPBits(PVB_DEVICE_INFO pVBInfo) -+{ -+ UCHAR CR38,CR4A,temp; -+ -+ CR4A = XGI_GetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x4A ) ; -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3d4 , 0x4A , ~0x03 , 0x03 ) ; /* enable GPIOA/B/C read */ -+ temp = XGI_GetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x48 ) ; -+ if ( temp <= 2 ) -+ { -+ temp &= 0x03; -+ } -+ else -+ { -+ temp = ((temp&0x04)>>1) || ((~temp)&0x01); -+ } -+ -+ XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4, 0x4A , CR4A ) ; -+ -+ return temp; -+} -+ -diff --git a/src/vb_init.h b/src/vb_init.h -index 0ee7f4e..7412a6e 100644 ---- a/src/vb_init.h -+++ b/src/vb_init.h -@@ -33,5 +33,8 @@ extern void XGINew_SetModeScratch(PXGI_HW_DEVICE_INFO HwDeviceExtension, - PVB_DEVICE_INFO pVBInfo); - - extern void ReadVBIOSTablData(UCHAR ChipType, PVB_DEVICE_INFO pVBInfo); -+ -+extern XGI21_LVDSCapStruct XGI21_LCDCapList; -+ - #endif - -diff --git a/src/vb_setmode.c b/src/vb_setmode.c -index 11431ce..cd1afc7 100644 ---- a/src/vb_setmode.c -+++ b/src/vb_setmode.c -@@ -1,8012 +1,9890 @@ --/* Copyright (C) 2003-2006 by XGI Technology, Taiwan. -- * -- * All Rights Reserved. -- * -- * Permission is hereby granted, free of charge, to any person obtaining -- * a copy of this software and associated documentation files (the -- * "Software"), to deal in the Software without restriction, including -- * without limitation on the rights to use, copy, modify, merge, -- * publish, distribute, sublicense, and/or sell copies of the Software, -- * and to permit persons to whom the Software is furnished to do so, -- * subject to the following conditions: -- * -- * The above copyright notice and this permission notice (including the -- * next paragraph) shall be included in all copies or substantial -- * portions of the Software. -- * -- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -- * NON-INFRINGEMENT. IN NO EVENT SHALL XGI AND/OR -- * ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -- * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -- * DEALINGS IN THE SOFTWARE. -- */ --#ifdef HAVE_CONFIG_H --#include "config.h" --#endif -- --#include "osdef.h" -- --#ifdef LINUX_XF86 --#include "xf86.h" --#include "xf86PciInfo.h" --#include "xgi.h" --#include "xgi_regs.h" --#endif -- --#ifdef LINUX_KERNEL --#include --#include --#include --#include "XGIfb.h" --#endif -- --#include "vb_def.h" --#include "vgatypes.h" --#include "vb_struct.h" --#include "vb_table.h" --#include "vb_setmode.h" -- --#define IndexMask 0xff --#ifndef XGI_MASK_DUAL_CHIP --#define XGI_MASK_DUAL_CHIP 0x04 /* SR3A */ --#endif -- -- --BOOLEAN CheckDualChip(PVB_DEVICE_INFO pVBInfo); --static BOOLEAN XGI_IsLCDDualLink(PVB_DEVICE_INFO pVBInfo); --BOOLEAN XGI_SetCRT2Group301(USHORT ModeNo, -- PXGI_HW_DEVICE_INFO HwDeviceExtension, -- PVB_DEVICE_INFO pVBInfo); --BOOLEAN XGI_BacklightByDrv(PVB_DEVICE_INFO pVBInfo); -- --BOOLEAN XGI_IsLCDON(PVB_DEVICE_INFO pVBInfo); --BOOLEAN XGI_DisableChISLCD(PVB_DEVICE_INFO pVBInfo); --BOOLEAN XGI_EnableChISLCD(PVB_DEVICE_INFO pVBInfo); --BOOLEAN XGI_AjustCRT2Rate(USHORT ModeNo, USHORT ModeIdIndex, -- USHORT RefreshRateTableIndex, USHORT * i, -- PVB_DEVICE_INFO pVBInfo); --BOOLEAN XGI_GetLCDInfo(USHORT ModeNo, USHORT ModeIdIndex, -- PVB_DEVICE_INFO pVBInfo); --BOOLEAN XGI_BridgeIsOn(PVB_DEVICE_INFO pVBInfo); --USHORT XGI_GetOffset(USHORT ModeNo, USHORT ModeIdIndex, -- USHORT RefreshRateTableIndex, -- PXGI_HW_DEVICE_INFO HwDeviceExtension, -- PVB_DEVICE_INFO pVBInfo); --USHORT XGI_GetRatePtrCRT2(USHORT ModeNo, USHORT ModeIdIndex, -- PVB_DEVICE_INFO pVBInfo); --static USHORT XGI_GetResInfo(USHORT ModeNo, USHORT ModeIdIndex, -- PVB_DEVICE_INFO pVBInfo); --USHORT XGI_GetVGAHT2(PVB_DEVICE_INFO pVBInfo); --static unsigned XGI_GetVCLK2Ptr(USHORT ModeNo, USHORT ModeIdIndex, -- USHORT RefreshRateTableIndex, -- PVB_DEVICE_INFO pVBInfo); --void XGI_VBLongWait(PVB_DEVICE_INFO pVBInfo); --void XGI_SaveCRT2Info(USHORT ModeNo, PVB_DEVICE_INFO pVBInfo); --void XGI_GetCRT2Data(USHORT ModeNo, USHORT ModeIdIndex, -- USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo); --void XGI_GetCRT2ResInfo(USHORT ModeNo, USHORT ModeIdIndex, -- PVB_DEVICE_INFO pVBInfo); --void XGI_PreSetGroup1(USHORT ModeNo, USHORT ModeIdIndex, -- PXGI_HW_DEVICE_INFO HwDeviceExtension, -- USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo); --void XGI_SetGroup1(USHORT ModeNo, USHORT ModeIdIndex, -- PXGI_HW_DEVICE_INFO HwDeviceExtension, -- USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo); --void XGI_SetLockRegs(USHORT ModeNo, USHORT ModeIdIndex, -- PXGI_HW_DEVICE_INFO HwDeviceExtension, -- USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo); --void XGI_SetLCDRegs(USHORT ModeNo, USHORT ModeIdIndex, -- PXGI_HW_DEVICE_INFO HwDeviceExtension, -- USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo); --void XGI_SetGroup2(USHORT ModeNo, USHORT ModeIdIndex, -- USHORT RefreshRateTableIndex, -- PXGI_HW_DEVICE_INFO HwDeviceExtension, -- PVB_DEVICE_INFO pVBInfo); --void XGI_SetGroup3(USHORT ModeNo, USHORT ModeIdIndex, -- PVB_DEVICE_INFO pVBInfo); --void XGI_SetGroup4(USHORT ModeNo, USHORT ModeIdIndex, -- USHORT RefreshRateTableIndex, -- PXGI_HW_DEVICE_INFO HwDeviceExtension, -- PVB_DEVICE_INFO pVBInfo); --void XGI_SetGroup5(USHORT ModeNo, USHORT ModeIdIndex, -- PVB_DEVICE_INFO pVBInfo); --static const void *XGI_GetLcdPtr(USHORT BX, USHORT ModeNo, USHORT ModeIdIndex, -- USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo); --static const void *XGI_GetTVPtr(USHORT BX, USHORT ModeNo, USHORT ModeIdIndex, -- USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo); --void XGI_FirePWDEnable(PVB_DEVICE_INFO pVBInfo); --void XGI_EnableGatingCRT(PXGI_HW_DEVICE_INFO HwDeviceExtension, -- PVB_DEVICE_INFO pVBInfo); --void XGI_DisableGatingCRT(PXGI_HW_DEVICE_INFO HwDeviceExtension, -- PVB_DEVICE_INFO pVBInfo); --void XGI_SetPanelDelay(USHORT tempbl, PVB_DEVICE_INFO pVBInfo); --void XGI_SetPanelPower(USHORT tempah, USHORT tempbl, PVB_DEVICE_INFO pVBInfo); --void XGI_EnablePWD(PVB_DEVICE_INFO pVBInfo); --void XGI_DisablePWD(PVB_DEVICE_INFO pVBInfo); --void XGI_AutoThreshold(PVB_DEVICE_INFO pVBInfo); --void XGI_SetTap4Regs(PVB_DEVICE_INFO pVBInfo); --void SetDualChipRegs(PXGI_HW_DEVICE_INFO, PVB_DEVICE_INFO pVBInfo); --void XGI_DisplayOn(PVB_DEVICE_INFO pVBInfo); --void XGI_DisplayOff(PVB_DEVICE_INFO pVBInfo); --void XGI_SetCRT1Group(PXGI_HW_DEVICE_INFO HwDeviceExtension, USHORT ModeNo, -- USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo); --static void XGI_WaitDisplay(PVB_DEVICE_INFO pVBInfo); --void XGI_SenseCRT1(PVB_DEVICE_INFO pVBInfo); -- --void XGI_SetCRT1CRTC(USHORT ModeNo, USHORT ModeIdIndex, -- USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo, -- PXGI_HW_DEVICE_INFO HwDeviceExtension); --void XGI_SetCRT1Timing_H(PVB_DEVICE_INFO pVBInfo, -- PXGI_HW_DEVICE_INFO HwDeviceExtension); --void XGI_SetCRT1Timing_V(USHORT ModeIdIndex, USHORT ModeNo, -- PVB_DEVICE_INFO pVBInfo); --void XGI_SetCRT1DE(PXGI_HW_DEVICE_INFO HwDeviceExtension, USHORT ModeNo, -- USHORT ModeIdIndex, USHORT RefreshRateTableIndex, -- PVB_DEVICE_INFO pVBInfo); --void XGI_SetCRT1VCLK(USHORT ModeNo, USHORT ModeIdIndex, -- PXGI_HW_DEVICE_INFO HwDeviceExtension, -- USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo); --void XGI_SetCRT1FIFO(USHORT ModeNo, PXGI_HW_DEVICE_INFO HwDeviceExtension, -- PVB_DEVICE_INFO pVBInfo); --void XGI_SetCRT1ModeRegs(PXGI_HW_DEVICE_INFO HwDeviceExtension, USHORT ModeNo, -- USHORT ModeIdIndex, USHORT RefreshRateTableIndex, -- PVB_DEVICE_INFO pVBInfo); --void XGI_SetVCLKState(PXGI_HW_DEVICE_INFO HwDeviceExtension, USHORT ModeNo, -- USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo); -- --void XGI_LoadDAC(USHORT ModeNo, USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo); --void XGI_SetLCDAGroup(USHORT ModeNo, USHORT ModeIdIndex, -- PXGI_HW_DEVICE_INFO HwDeviceExtension, -- PVB_DEVICE_INFO pVBInfo); --void XGI_GetLVDSResInfo(USHORT ModeNo, USHORT ModeIdIndex, -- PVB_DEVICE_INFO pVBInfo); --void XGI_GetLVDSData(USHORT ModeNo, USHORT ModeIdIndex, -- USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo); --void XGI_ModCRT1Regs(USHORT ModeNo, USHORT ModeIdIndex, -- USHORT RefreshRateTableIndex, -- PXGI_HW_DEVICE_INFO HwDeviceExtension, -- PVB_DEVICE_INFO pVBInfo); --void XGI_SetLVDSRegs(USHORT ModeNo, USHORT ModeIdIndex, -- USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo); --void XGI_UpdateModeInfo(PXGI_HW_DEVICE_INFO HwDeviceExtension, -- PVB_DEVICE_INFO pVBInfo); --void XGI_GetVBType(PVB_DEVICE_INFO pVBInfo); --void XGI_GetVBInfo(USHORT ModeNo, USHORT ModeIdIndex, -- PXGI_HW_DEVICE_INFO HwDeviceExtension, -- PVB_DEVICE_INFO pVBInfo); --void XGI_GetTVInfo(USHORT ModeNo, USHORT ModeIdIndex, -- PVB_DEVICE_INFO pVBInfo); --void XGI_SetCRT2ECLK(USHORT ModeNo, USHORT ModeIdIndex, -- USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo); --void InitTo330Pointer(UCHAR, PVB_DEVICE_INFO pVBInfo); --void XGI_GetLCDSync(USHORT * HSyncWidth, USHORT * VSyncWidth, -- PVB_DEVICE_INFO pVBInfo); --void XGI_DisableBridge(PXGI_HW_DEVICE_INFO HwDeviceExtension, -- PVB_DEVICE_INFO pVBInfo); --void XGI_EnableBridge(PXGI_HW_DEVICE_INFO HwDeviceExtension, -- PVB_DEVICE_INFO pVBInfo); --void XGI_SetCRT2VCLK(USHORT ModeNo, USHORT ModeIdIndex, -- USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo); --void XGI_OEM310Setting(USHORT ModeNo, USHORT ModeIdIndex, -- PVB_DEVICE_INFO pVBInfo); --void XGI_SetDelayComp(PVB_DEVICE_INFO pVBInfo); --void XGI_SetLCDCap(PVB_DEVICE_INFO pVBInfo); --void XGI_SetLCDCap_A(USHORT tempcx, PVB_DEVICE_INFO pVBInfo); --void XGI_SetLCDCap_B(USHORT tempcx, PVB_DEVICE_INFO pVBInfo); --void SetSpectrum(PVB_DEVICE_INFO pVBInfo); --void XGI_SetAntiFlicker(USHORT ModeNo, USHORT ModeIdIndex, -- PVB_DEVICE_INFO pVBInfo); --void XGI_SetEdgeEnhance(USHORT ModeNo, USHORT ModeIdIndex, -- PVB_DEVICE_INFO pVBInfo); --void XGI_SetPhaseIncr(PVB_DEVICE_INFO pVBInfo); --void XGI_SetYFilter(USHORT ModeNo, USHORT ModeIdIndex, -- PVB_DEVICE_INFO pVBInfo); --void XGI_GetTVPtrIndex2(USHORT * tempbx, UCHAR * tempcl, UCHAR * tempch, -- PVB_DEVICE_INFO pVBInfo); --USHORT XGI_GetTVPtrIndex(PVB_DEVICE_INFO pVBInfo); --void XGI_SetCRT2ModeRegs(USHORT ModeNo, PXGI_HW_DEVICE_INFO, -- PVB_DEVICE_INFO pVBInfo); --void XGI_GetRAMDAC2DATA(USHORT ModeNo, USHORT ModeIdIndex, -- USHORT RefreshRateTableIndex, -- PVB_DEVICE_INFO pVBInfo); --void XGI_UnLockCRT2(PXGI_HW_DEVICE_INFO, PVB_DEVICE_INFO pVBInfo); --void XGI_LockCRT2(PXGI_HW_DEVICE_INFO, PVB_DEVICE_INFO pVBInfo); --void XGINew_EnableCRT2(PVB_DEVICE_INFO pVBInfo); --void XGINew_LCD_Wait_Time(UCHAR DelayTime, PVB_DEVICE_INFO pVBInfo); --void XGI_SetCRT1Offset(USHORT ModeNo, USHORT ModeIdIndex, -- USHORT RefreshRateTableIndex, -- PXGI_HW_DEVICE_INFO HwDeviceExtension, -- PVB_DEVICE_INFO pVBInfo); --static void XGI_GetLCDVCLKPtr(UCHAR *di, PVB_DEVICE_INFO pVBInfo); --static unsigned XGI_GetVCLKPtr(USHORT RefreshRateTableIndex, USHORT ModeNo, -- USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo); --static void XGI_GetVCLKLen(unsigned vclkindex, UCHAR *di, -- PVB_DEVICE_INFO pVBInfo); --USHORT XGI_GetLCDCapPtr(PVB_DEVICE_INFO pVBInfo); --USHORT XGI_GetLCDCapPtr1(PVB_DEVICE_INFO pVBInfo); --static const XGI301C_Tap4TimingStruct *XGI_GetTap4Ptr(USHORT tempcx, -- PVB_DEVICE_INFO pVBInfo); -- -- --const uint8_t XGI_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 --}; -- --const uint8_t XGI_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 --}; -- --const uint8_t XGI_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 --}; -- --const uint8_t XGI_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(UCHAR ChipType, PVB_DEVICE_INFO pVBInfo) --{ -- pVBInfo->SModeIDTable = XGI330_SModeIDTable; -- pVBInfo->StandTable = XGI330_StandTable; -- pVBInfo->EModeIDTable = XGI330_EModeIDTable; -- pVBInfo->RefIndex = XGI330_RefIndex; -- pVBInfo->XGINEWUB_CRT1Table = XGI_CRT1Table; -- -- /* add for new UNIVGABIOS */ -- /* XGINew_UBLCDDataTable = (XGI_LCDDataTablStruct *) XGI_LCDDataTable ; */ -- /* XGINew_UBTVDataTable = (XGI_TVDataTablStruct *) XGI_TVDataTable ; */ -- -- -- if (ChipType >= XG40) { -- (void) memcpy(pVBInfo->MCLKData, XGI340New_MCLKData, sizeof(XGI340New_MCLKData)); -- (void) memcpy(pVBInfo->ECLKData, XGI340_ECLKData, sizeof(XGI340_ECLKData)); -- } -- else { -- (void) memcpy(pVBInfo->MCLKData, XGI330New_MCLKData, sizeof(XGI330New_MCLKData)); -- (void) memcpy(pVBInfo->ECLKData, XGI330_ECLKData, sizeof(XGI330_ECLKData)); -- } -- -- pVBInfo->VCLKData = XGI_VCLKData; -- pVBInfo->VBVCLKData = XGI_VBVCLKData; -- pVBInfo->ScreenOffset = XGI330_ScreenOffset; -- pVBInfo->StResInfo = XGI330_StResInfo; -- pVBInfo->ModeResInfo = XGI330_ModeResInfo; -- -- pVBInfo->OutputSelect = XGI330_OutputSelect; -- pVBInfo->SoftSetting = XGI330_SoftSetting; -- pVBInfo->SR07 = XGI330_SR07; -- pVBInfo->LCDResInfo = 0; -- pVBInfo->LCDTypeInfo = 0; -- pVBInfo->LCDInfo = 0; -- pVBInfo->VBInfo = 0; -- pVBInfo->TVInfo = 0; -- -- -- (void) memcpy(pVBInfo->SR15, XGI340_SR13, sizeof(XGI340_SR13)); -- (void) memcpy(pVBInfo->CR40, XGI340_CR41, sizeof(XGI340_CR41)); -- (void) memcpy(pVBInfo->SR25, XGI330_SR25, sizeof(XGI330_SR25)); -- pVBInfo->SR31 = XGI330_SR31; -- pVBInfo->SR32 = XGI330_SR32; -- (void) memcpy(pVBInfo->CR6B, XGI340_CR6B, sizeof(XGI340_CR6B)); -- if (ChipType == XG45) { -- (void) memcpy(pVBInfo->XG45CR6E, XGI45_CR6E, sizeof(XGI45_CR6E)); -- (void) memcpy(pVBInfo->XG45CR6F, XGI45_CR6F, sizeof(XGI45_CR6F)); -- } -- else { -- (void) memcpy(pVBInfo->CR6E, XGI340_CR6E, sizeof(XGI340_CR6E)); -- (void) memcpy(pVBInfo->CR6F, XGI340_CR6F, sizeof(XGI340_CR6F)); -- } -- (void) memcpy(pVBInfo->CR89, XGI340_CR89, sizeof(XGI340_CR89)); -- (void) memcpy(pVBInfo->AGPReg, XGI340_AGPReg, sizeof(XGI340_AGPReg)); -- (void) memcpy(pVBInfo->SR16, XGI340_SR16, sizeof(XGI340_SR16)); -- pVBInfo->CRCF = XG40_CRCF; -- pVBInfo->DRAMTypeDefinition = XG40_DRAMTypeDefinition; -- -- -- (void) memcpy(pVBInfo->CR49, XGI330_CR49, sizeof(XGI330_CR49)); -- pVBInfo->SR1F = XGI330_SR1F; -- pVBInfo->SR21 = XGI330_SR21; -- pVBInfo->SR22 = XGI330_SR22; -- pVBInfo->SR23 = XGI330_SR23; -- pVBInfo->SR24 = XGI330_SR24; -- pVBInfo->SR33 = XGI330_SR33; -- -- -- -- pVBInfo->CRT2Data_1_2 = XGI330_CRT2Data_1_2; -- pVBInfo->CRT2Data_4_D = XGI330_CRT2Data_4_D; -- pVBInfo->CRT2Data_4_E = XGI330_CRT2Data_4_E; -- pVBInfo->CRT2Data_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; -- -- -- (void) memcpy(& pVBInfo->TimingH, XGI_TimingH, sizeof(XGI_TimingH)); -- (void) memcpy(& pVBInfo->TimingV, XGI_TimingV, sizeof(XGI_TimingV)); -- -- 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; -- -- pVBInfo->XGI_TVDelayList = XGI301TVDelayList; -- pVBInfo->XGI_TVDelayList2 = XGI301TVDelayList2; -- -- -- pVBInfo->I2CDefinition = XG40_I2CDefinition; -- -- if (ChipType == XG20) -- pVBInfo->CR97 = XG20_CR97; --} -- -- -- -- -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGISetModeNew */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --BOOLEAN --XGISetModeNew(PXGI_HW_DEVICE_INFO HwDeviceExtension, PVB_DEVICE_INFO pVBInfo, -- USHORT ModeNo) --{ --#ifndef LINUX_XF86 -- ULONG temp; -- USHORT KeepLockReg; --#endif -- USHORT ModeIdIndex; -- /* PUCHAR pVBInfo->FBAddr = HwDeviceExtension->pjVideoMemoryAddress ; */ -- USHORT temp_mode_no; -- -- pVBInfo->IF_DEF_VideoCapture = 1; -- pVBInfo->IF_DEF_ScaleLCD = 1; -- -- -- if (ModeNo & 0x80) { -- ModeNo = ModeNo & 0x7F; -- } -- -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x05, 0x86); -- -- if (HwDeviceExtension->jChipType != XG20) /* kuku 2004/06/25 1.Openkey */ -- XGI_UnLockCRT2(HwDeviceExtension, pVBInfo); -- -- temp_mode_no = ModeNo; -- XGI_SearchModeID(pVBInfo->SModeIDTable, pVBInfo->EModeIDTable, 0x11, -- &temp_mode_no, &ModeIdIndex); -- -- if (HwDeviceExtension->jChipType != XG20) { /* kuku 2004/06/25 */ -- PDEBUG(ErrorF("XGI_GetVBInfo \n")); -- XGI_GetVBInfo(ModeNo, ModeIdIndex, HwDeviceExtension, pVBInfo); -- PDEBUG(ErrorF("XGI_GetTVInfo \n")); -- XGI_GetTVInfo(ModeNo, ModeIdIndex, pVBInfo); -- PDEBUG(ErrorF("XGI_GetLCDInfo \n")); -- XGI_GetLCDInfo(ModeNo, ModeIdIndex, pVBInfo); -- PDEBUG(ErrorF("XGI_DisableBridge \n")); -- XGI_DisableBridge(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); -- } -- } -- } -- -- PDEBUG(ErrorF(" vb_setmode 474\n")); // yilin -- if (pVBInfo->VBInfo & (SetSimuScanMode | SwitchToCRT2)) { -- switch (HwDeviceExtension->ujVBChipID) { -- case VB_CHIP_301: -- PDEBUG(ErrorF(" vb_setmode 301\n")); //yilin -- XGI_SetCRT2Group301(ModeNo, HwDeviceExtension, pVBInfo); /*add for CRT2 */ -- break; -- -- case VB_CHIP_302: -- XGI_SetCRT2Group301(ModeNo, HwDeviceExtension, pVBInfo); /*add for CRT2 */ -- break; -- -- default: -- break; -- } -- } -- ErrorF("492 Part2 0 = %x ", -- XGI_GetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x0)); -- XGI_SetCRT2ModeRegs(ModeNo, HwDeviceExtension, pVBInfo); -- XGI_OEM310Setting(ModeNo, ModeIdIndex, pVBInfo); /*0212 */ -- XGI_EnableBridge(HwDeviceExtension, pVBInfo); -- ErrorF("497 Part2 0 = %x ", -- XGI_GetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x0)); -- } /* !XG20 */ -- else { -- if (ModeNo <= 0x13) { -- pVBInfo->ModeType = -- pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag & ModeInfoFlag; -- } -- else { -- pVBInfo->ModeType = -- pVBInfo->EModeIDTable[ModeIdIndex]. -- Ext_ModeFlag & ModeInfoFlag; -- } -- pVBInfo->SetFlag = 0; -- pVBInfo->VBInfo = DisableCRT2Display; -- XGI_DisplayOff(pVBInfo); -- XGI_SetCRT1Group(HwDeviceExtension, ModeNo, ModeIdIndex, pVBInfo); -- XGI_DisplayOn(pVBInfo); -- } -- --/* -- 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( pVBInfo) ; -- XGI_SetCRT1Group( HwDeviceExtension , ModeNo , ModeIdIndex, pVBInfo ) ; -- XGI_DisplayOn( pVBInfo) ; --*/ -- ErrorF("Part2 0 = %x ", -- XGI_GetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x0)); -- XGI_UpdateModeInfo(HwDeviceExtension, pVBInfo); -- -- if (HwDeviceExtension->jChipType != XG20) /* kuku 2004/06/25 */ -- XGI_LockCRT2(HwDeviceExtension, pVBInfo); -- -- return (TRUE); --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGI_SetCRT1Group */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --void --XGI_SetCRT1Group(PXGI_HW_DEVICE_INFO HwDeviceExtension, USHORT ModeNo, -- USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo) --{ -- const USHORT StandTableIndex = XGI_GetModePtr(pVBInfo->SModeIDTable, -- pVBInfo->ModeType, -- ModeNo, ModeIdIndex); -- USHORT RefreshRateTableIndex; -- USHORT b3CC; -- USHORT temp; -- -- USHORT XGINew_P3cc = pVBInfo->P3cc; --#ifndef LINUX_XF86 -- USHORT XGINew_P3c2 = pVBInfo->P3c2; --#endif -- -- /* XGINew_CRT1Mode = ModeNo ; // SaveModeID */ -- XGI_SetSeqRegs(StandTableIndex, pVBInfo); -- XGI_SetMiscRegs(StandTableIndex, pVBInfo); -- XGI_SetCRTCRegs(StandTableIndex, pVBInfo); -- XGI_SetATTRegs(ModeNo, StandTableIndex, ModeIdIndex, pVBInfo); -- XGI_SetGRCRegs(StandTableIndex, pVBInfo); -- XGI_ClearExt1Regs(ModeNo, 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(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) { -- if ((ModeNo == 0x00) | (ModeNo == 0x01)) { -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x2B, 0x4E); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x2C, 0xE9); -- b3CC = (UCHAR) XGI_GetRegByte((XGIIOADDRESS) XGINew_P3cc); -- XGI_SetRegByte((XGIIOADDRESS) XGINew_P3cc, (b3CC |= 0x0C)); -- } -- else if ((ModeNo == 0x04) | (ModeNo == 0x05) | (ModeNo == 0x0D)) { -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x2B, 0x1B); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x2C, 0xE3); -- b3CC = (UCHAR) XGI_GetRegByte((XGIIOADDRESS) XGINew_P3cc); -- XGI_SetRegByte((XGIIOADDRESS) XGINew_P3cc, (b3CC |= 0x0C)); -- } -- } -- -- pVBInfo->SetFlag &= (~ProgrammingCRT2); -- XGI_SetCRT1FIFO(ModeNo, HwDeviceExtension, pVBInfo); -- XGI_SetCRT1ModeRegs(HwDeviceExtension, ModeNo, ModeIdIndex, -- RefreshRateTableIndex, pVBInfo); -- -- if (HwDeviceExtension->jChipType == XG40) { /* Copy reg settings to 2nd chip */ -- if (CheckDualChip(pVBInfo)) -- SetDualChipRegs(HwDeviceExtension, pVBInfo); -- } -- -- /* XGI_LoadCharacter(); //dif ifdef TVFont */ -- -- XGI_LoadDAC(ModeNo, ModeIdIndex, pVBInfo); --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGI_SetSeqRegs */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --void --XGI_SetSeqRegs(USHORT StandTableIndex, const VB_DEVICE_INFO *pVBInfo) --{ -- unsigned SRdata; -- unsigned i; -- -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x00, 0x03); /* Set SR0 */ -- SRdata = pVBInfo->StandTable[StandTableIndex].SR[0]; -- -- if (pVBInfo->VBInfo & SetCRT2ToLCDA) { -- SRdata |= 0x01; -- } -- else { -- if (pVBInfo->VBInfo & (SetCRT2ToTV | SetCRT2ToLCD)) { -- if (pVBInfo->VBInfo & SetInSlaveMode) -- SRdata |= 0x01; -- } -- } -- -- SRdata |= 0x20; /* screen off */ -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x01, SRdata); /* Set SR1 */ -- -- /* Get SR2, SR3, and SR4 from table and set in hardware. -- */ -- for (i = 2; i <= 4; i++) { -- SRdata = pVBInfo->StandTable[StandTableIndex].SR[i - 1]; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, i, SRdata); -- } --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGI_SetMiscRegs */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --void --XGI_SetMiscRegs(USHORT StandTableIndex, const VB_DEVICE_INFO *pVBInfo) --{ -- UCHAR 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 ; -- } -- } --*/ -- -- XGI_SetRegByte((XGIIOADDRESS) pVBInfo->P3c2, Miscdata); /* Set Misc(3c2) */ --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGI_SetCRTCRegs */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --void --XGI_SetCRTCRegs(unsigned StandTableIndex, const VB_DEVICE_INFO *pVBInfo) --{ -- unsigned i; -- -- /* Unlock CRTC */ -- XGI_SetRegAND((XGIIOADDRESS) pVBInfo->P3d4, 0x11, 0x7f); -- -- for (i = 0; i <= 0x18; i++) { -- /* Get CRTC from file */ -- const unsigned CRTCdata = -- pVBInfo->StandTable[StandTableIndex].CRTC[i]; -- -- /* Set CRTC( 3d4 ) */ -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, i, CRTCdata); -- } --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --void --XGI_SetATTRegs(unsigned ModeNo, unsigned StandTableIndex, unsigned ModeIdIndex, -- const VB_DEVICE_INFO *pVBInfo) --{ -- unsigned i; -- const unsigned modeflag = (ModeNo <= 0x13) -- ? pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag -- : pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag; -- -- for (i = 0; i <= 0x13; i++) { -- UCHAR ARdata = pVBInfo->StandTable[StandTableIndex].ATTR[i]; -- -- if (modeflag & Charx8Dot) { /* ifndef Dot9 */ -- if (i == 0x13) { -- /* Pixel shift. If screen on LCD or TV is shifted left or -- * right, this might be the cause. -- */ -- if (pVBInfo->VBInfo & SetCRT2ToLCDA) -- ARdata = 0; -- else { -- if (pVBInfo->VBInfo & (SetCRT2ToTV | SetCRT2ToLCD)) { -- if (pVBInfo->VBInfo & SetInSlaveMode) -- ARdata = 0; -- } -- } -- } -- } -- -- XGI_GetRegByte((XGIIOADDRESS) pVBInfo->P3da); /* reset 3da */ -- XGI_SetRegByte((XGIIOADDRESS) pVBInfo->P3c0, i); /* set index */ -- XGI_SetRegByte((XGIIOADDRESS) pVBInfo->P3c0, ARdata); /* set data */ -- } -- -- XGI_GetRegByte((XGIIOADDRESS) pVBInfo->P3da); /* reset 3da */ -- XGI_SetRegByte((XGIIOADDRESS) pVBInfo->P3c0, 0x14); /* set index */ -- XGI_SetRegByte((XGIIOADDRESS) pVBInfo->P3c0, 0x00); /* set data */ -- -- XGI_GetRegByte((XGIIOADDRESS) pVBInfo->P3da); /* Enable Attribute */ -- XGI_SetRegByte((XGIIOADDRESS) pVBInfo->P3c0, 0x20); -- XGI_GetRegByte((XGIIOADDRESS) pVBInfo->P3da); --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGI_SetGRCRegs */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --void --XGI_SetGRCRegs(unsigned StandTableIndex, const VB_DEVICE_INFO *pVBInfo) --{ -- unsigned i; -- -- for (i = 0; i <= 8; i++) { -- /* Get GR from file and set GR (3ce) -- */ -- const unsigned GRdata = pVBInfo->StandTable[StandTableIndex].GRC[i]; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3ce, i, GRdata); -- } -- -- if (pVBInfo->ModeType > ModeVGA) { -- /* 256 color disable */ -- XGI_SetRegAND((XGIIOADDRESS) pVBInfo->P3ce, 0x05, 0xBF); -- } --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGI_ClearExt1Regs */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --void --XGI_ClearExt1Regs(unsigned ModeNo, const VB_DEVICE_INFO *pVBInfo) --{ -- unsigned i; -- -- /* Clear SR0A-SR0E */ -- for (i = 0x0A; i <= 0x0E; i++) { -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, i, 0x00); -- } -- -- /* This code came from the old XGI_New_ClearExt1Regs in init.c. Since -- * it wasn't included in the newer code drop from XGI, I'm not sure if -- * it's necessary on the Volari chips. I've included it here, ifdefed -- * out, for future reference. -- * - idr -- */ --#if 0 -- XGI_SetRegAND(pVBInfo->P3c4, 0x37, 0xFE); -- if ((ModeNo == 0x06) || ((ModeNo >= 0x0e) && (ModeNo <= 0x13))) { -- XGI_SetReg(pVBInfo->P3c4, 0x0e, 0x20); -- } --#else -- (void) ModeNo; --#endif --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGI_GetRatePtrCRT2 */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --USHORT --XGI_GetRatePtrCRT2(USHORT ModeNo, USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo) --{ -- SHORT LCDRefreshIndex[] = { 0x00, 0x00, 0x03, 0x01 } -- , LCDARefreshIndex[] = { -- 0x00, 0x00, 0x03, 0x01, 0x01, 0x01, 0x01}; -- -- USHORT RefreshRateTableIndex, i, modeflag, index, temp; -- -- if (ModeNo <= 0x13) { -- modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag; -- } -- else { -- modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag; -- } -- -- if (ModeNo < 0x14) -- return (0xFFFF); -- -- index = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x33); -- index = index >> pVBInfo->SelectCRT2Rate; -- index &= 0x0F; -- -- if (pVBInfo->LCDInfo & (LCDNonExpanding | EnableScalingLCD)) -- index = 0; -- -- if (index > 0) -- index--; -- -- if (pVBInfo->SetFlag & ProgrammingCRT2) { -- if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) { -- 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; -- } -- } -- } -- -- RefreshRateTableIndex = pVBInfo->EModeIDTable[ModeIdIndex].REFindex; -- ModeNo = pVBInfo->RefIndex[RefreshRateTableIndex].ModeID; -- 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 : */ --/* --------------------------------------------------------------------- */ --BOOLEAN --XGI_AjustCRT2Rate(USHORT ModeNo, USHORT ModeIdIndex, -- USHORT RefreshRateTableIndex, USHORT * i, -- PVB_DEVICE_INFO pVBInfo) --{ -- USHORT 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->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); -- } -- } -- } -- } -- } -- } -- -- 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 RefreshRateTableIndex, const VB_DEVICE_INFO *pVBInfo) --{ -- const unsigned sync = -- (pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag >> 8) & 0xC0; -- -- /* Set Misc(3c2) */ -- XGI_SetRegByte((XGIIOADDRESS) pVBInfo->P3c2, sync | 0x2F); --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGI_SetCRT1CRTC */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --void --XGI_SetCRT1CRTC(USHORT ModeNo, USHORT ModeIdIndex, -- USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo, -- PXGI_HW_DEVICE_INFO HwDeviceExtension) --{ -- UCHAR index, data; --#ifndef LINUX_XF86 -- USHORT temp, tempah, j, modeflag, ResInfo, DisplayType; --#endif -- USHORT i; -- -- index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC; /* Get index */ -- index = index & IndexMask; -- -- data = (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x11); -- data &= 0x7F; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x11, data); /* Unlock CRTC */ -- -- for (i = 0; i < 8; i++) -- pVBInfo->TimingH.data[i] = -- pVBInfo->XGINEWUB_CRT1Table[index].CR[i]; -- -- for (i = 0; i < 7; i++) -- pVBInfo->TimingV.data[i] = -- pVBInfo->XGINEWUB_CRT1Table[index].CR[i + 8]; -- -- XGI_SetCRT1Timing_H(pVBInfo, HwDeviceExtension); -- -- -- -- XGI_SetCRT1Timing_V(ModeIdIndex, ModeNo, pVBInfo); -- -- -- if (pVBInfo->ModeType > 0x03) -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x14, 0x4F); --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGI_SetCRT1Timing_H */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --void --XGI_SetCRT1Timing_H(PVB_DEVICE_INFO pVBInfo, -- PXGI_HW_DEVICE_INFO HwDeviceExtension) --{ -- UCHAR data, data1, pushax; -- USHORT i, j; -- -- /* XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0x51 , 0 ) ; */ -- /* XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0x56 , 0 ) ; */ -- /* XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4 ,0x11 , 0x7f , 0x00 ) ; */ -- -- data = (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x11); /* unlock cr0-7 */ -- data &= 0x7F; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x11, data); -- -- data = pVBInfo->TimingH.data[0]; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, 0, data); -- -- for (i = 0x01; i <= 0x04; i++) { -- data = pVBInfo->TimingH.data[i]; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, (USHORT) (i + 1), data); -- } -- -- for (i = 0x05; i <= 0x06; i++) { -- data = pVBInfo->TimingH.data[i]; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, (USHORT) (i + 6), data); -- } -- -- j = (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x0e); -- j &= 0x1F; -- data = pVBInfo->TimingH.data[7]; -- data &= 0xE0; -- data |= j; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x0e, data); -- -- if (HwDeviceExtension->jChipType == XG20) { -- data = (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x04); -- data = data - 1; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x04, data); -- data = (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x05); -- data1 = data; -- data1 &= 0xE0; -- data &= 0x1F; -- if (data == 0) { -- pushax = data; -- data = (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x0c); -- data &= 0xFB; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x0c, data); -- data = pushax; -- } -- data = data - 1; -- data |= data1; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x05, data); -- data = (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x0e); -- data = data >> 5; -- data = data + 3; -- if (data > 7) -- data = data - 7; -- data = data << 5; -- XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3c4, 0x0e, ~0xE0, data); -- } --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGI_SetCRT1Timing_V */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --void --XGI_SetCRT1Timing_V(USHORT ModeIdIndex, USHORT ModeNo, -- PVB_DEVICE_INFO pVBInfo) --{ -- UCHAR data; -- USHORT i, j; -- -- /* XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0x51 , 0 ) ; */ -- /* XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0x56 , 0 ) ; */ -- /* XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4 , 0x11 , 0x7f , 0x00 ) ; */ -- -- for (i = 0x00; i <= 0x01; i++) { -- data = pVBInfo->TimingV.data[i]; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, (USHORT) (i + 6), data); -- } -- -- for (i = 0x02; i <= 0x03; i++) { -- data = pVBInfo->TimingV.data[i]; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, (USHORT) (i + 0x0e), data); -- } -- -- for (i = 0x04; i <= 0x05; i++) { -- data = pVBInfo->TimingV.data[i]; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, (USHORT) (i + 0x11), data); -- } -- -- j = (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x0a); -- j &= 0xC0; -- data = pVBInfo->TimingV.data[6]; -- data &= 0x3F; -- data |= j; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x0a, data); -- -- data = pVBInfo->TimingV.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 = (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x09); -- j &= 0x5F; -- data |= j; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x09, data); --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGI_SetCRT1DE */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --void --XGI_SetCRT1DE(PXGI_HW_DEVICE_INFO HwDeviceExtension, USHORT ModeNo, -- USHORT ModeIdIndex, USHORT RefreshRateTableIndex, -- PVB_DEVICE_INFO pVBInfo) --{ -- USHORT tempax, tempbx, tempcx, temp, modeflag; -- UCHAR data; -- const USHORT 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 = (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x11); -- data = (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x11); -- data &= 0x7F; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x11, data); /* Unlock CRTC */ -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x01, (USHORT) (tempcx & 0xff)); -- XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4, 0x0b, ~0x0c, -- (USHORT) ((tempcx & 0x0ff00) >> 10)); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x12, (USHORT) (tempbx & 0xff)); -- tempax = 0; -- tempbx = tempbx >> 8; -- -- if (tempbx & 0x01) -- tempax |= 0x02; -- -- if (tempbx & 0x02) -- tempax |= 0x40; -- -- XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4, 0x07, ~0x42, tempax); -- data = (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x07); -- data &= 0xFF; -- tempax = 0; -- -- if (tempbx & 0x04) -- tempax |= 0x02; -- -- XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4, 0x0a, ~0x02, tempax); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x11, temp); --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGI_GetResInfo */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --USHORT --XGI_GetResInfo(USHORT ModeNo, USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo) --{ -- return (ModeNo <= 0x13) -- ? pVBInfo->SModeIDTable[ModeIdIndex].St_ResInfo -- : pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO; --} -- -- --static void --get_mode_xres_yres(USHORT ModeNo, USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo, -- unsigned *width, unsigned *height) --{ -- const USHORT resindex = XGI_GetResInfo(ModeNo, ModeIdIndex, pVBInfo); -- unsigned xres; -- unsigned yres; -- -- -- if (ModeNo <= 0x13) { -- xres = pVBInfo->StResInfo[resindex].HTotal; -- yres = pVBInfo->StResInfo[resindex].VTotal; -- } -- else { -- const unsigned modeflag = -- pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag; -- -- xres = pVBInfo->ModeResInfo[resindex].HTotal; -- yres = pVBInfo->ModeResInfo[resindex].VTotal; -- -- if (modeflag & HalfDCLK) -- xres *= 2; -- -- if (modeflag & DoubleScanMode) -- yres *= 2; -- } -- -- *width = xres; -- *height = yres; --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGI_SetCRT1Offset */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --void --XGI_SetCRT1Offset(USHORT ModeNo, USHORT ModeIdIndex, -- USHORT RefreshRateTableIndex, -- PXGI_HW_DEVICE_INFO HwDeviceExtension, -- PVB_DEVICE_INFO pVBInfo) --{ -- USHORT 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 = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x0E); -- i &= 0xF0; -- i |= temp; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x0E, i); -- -- temp = (UCHAR) temp2; -- temp &= 0xFF; /* al */ -- XGI_SetReg((XGIIOADDRESS) 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; -- -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x10, ah); --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGI_SetCRT1VCLK */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --void --XGI_SetCRT1VCLK(USHORT ModeNo, USHORT ModeIdIndex, -- PXGI_HW_DEVICE_INFO HwDeviceExtension, -- USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo) --{ -- unsigned index; -- unsigned clka; -- unsigned clkb; -- -- if ((pVBInfo->VBType & VB_XGI301BLV302BLV) -- && (pVBInfo->VBInfo & SetCRT2ToLCDA)) { -- index = XGI_GetVCLK2Ptr(ModeNo, ModeIdIndex, RefreshRateTableIndex, -- pVBInfo); -- -- clka = pVBInfo->VBVCLKData[index].Part4_A; -- clkb = pVBInfo->VBVCLKData[index].Part4_B; -- } -- else { -- index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRTVCLK; -- -- clka = pVBInfo->VCLKData[index].SR2B; -- clkb = pVBInfo->VCLKData[index].SR2C; -- } -- -- XGI_SetRegAND((XGIIOADDRESS) pVBInfo->P3c4, 0x31, 0xCF); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x2B, clka); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x2C, clkb); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x2D, 0x01); -- -- if ((HwDeviceExtension->jChipType == XG20) -- && (pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag & HalfDCLK)) { -- UCHAR data; -- -- /* FIXME: Does this actually serve any purpose? This register is -- * FIXME: already written above. -- */ -- data = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x2B); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x2B, data); -- -- /* FIXME: The logic here seems wrong. It looks like its possible -- * FIXME: for the (data << 1) to cause a bit to creep into the index -- * FIXME: part. THere's no documentation for this register, so I have -- * FIXME: no way of knowing. :( -- */ -- data = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x2C); -- index = data; -- index &= 0xE0; -- data &= 0x1F; -- data = data << 1; -- data += 1; -- data |= index; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x2C, data); -- } --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGI_SetCRT1FIFO */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --void --XGI_SetCRT1FIFO(USHORT ModeNo, PXGI_HW_DEVICE_INFO HwDeviceExtension, -- PVB_DEVICE_INFO pVBInfo) --{ -- USHORT data; -- -- data = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x3D); -- data &= 0xfe; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x3D, data); /* diable auto-threshold */ -- -- if (ModeNo > 0x13) { -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x08, 0x34); -- data = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x09); -- data &= 0xF0; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x09, data); -- data = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x3D); -- data |= 0x01; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x3D, data); -- } -- else { -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x08, 0xAE); -- data = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x09); -- data &= 0xF0; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x09, data); -- } --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGI_SetCRT1ModeRegs */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --void --XGI_SetCRT1ModeRegs(PXGI_HW_DEVICE_INFO HwDeviceExtension, -- USHORT ModeNo, USHORT ModeIdIndex, -- USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo) --{ -- USHORT 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 (XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x31) & 0x01) -- XGI_SetRegANDOR((XGIIOADDRESS) 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; -- -- XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3c4, 0x06, ~0x3F, data2); -- /* XGI_SetReg((XGIIOADDRESS)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; -- XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4, 0x19, 0xFF, data2); -- data2 = (data & 0xFF00) >> 8; -- XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4, 0x19, 0xFC, data2); -- -- if (modeflag & HalfDCLK) -- XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3c4, 0x01, 0xF7, 0x08); -- -- data2 = 0; -- -- if (modeflag & LineCompareOff) -- data2 |= 0x08; -- -- if (ModeNo > 0x13) { -- if (pVBInfo->ModeType == ModeEGA) -- data2 |= 0x40; -- } -- -- XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3c4, 0x0F, ~0x48, data2); -- data = 0x60; -- if (pVBInfo->ModeType != ModeText) { -- data = data ^ 0x60; -- if (pVBInfo->ModeType != ModeEGA) { -- data = data ^ 0xA0; -- } -- } -- XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3c4, 0x21, 0x1F, data); -- -- XGI_SetVCLKState(HwDeviceExtension, ModeNo, RefreshRateTableIndex, -- pVBInfo); -- -- data = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x31); -- -- if (HwDeviceExtension->jChipType == XG20) { -- if (data & 0x40) -- data = 0x33; -- else -- data = 0x73; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x52, data); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x51, 0x02); -- } -- else { -- if (data & 0x40) -- data = 0x2c; -- else -- data = 0x6c; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x52, data); -- } -- --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGI_SetVCLKState */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --void --XGI_SetVCLKState(PXGI_HW_DEVICE_INFO HwDeviceExtension, USHORT ModeNo, -- USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo) --{ -- USHORT data, data2 = 0; -- SHORT VCLK; -- -- UCHAR index; -- -- if (ModeNo <= 0x13) -- VCLK = 0; -- else { -- index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRTVCLK; -- index &= IndexMask; -- VCLK = pVBInfo->VCLKData[index].CLOCK; -- } -- -- data = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x32); -- data &= 0xf3; -- if (VCLK >= 200) -- data |= 0x0c; /* VCLK > 200 */ -- -- if (HwDeviceExtension->jChipType == XG20) -- data &= ~0x04; /* 2 pixel mode */ -- -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x32, data); -- -- if (HwDeviceExtension->jChipType != XG20) { -- data = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x1F); -- data &= 0xE7; -- if (VCLK < 200) -- data |= 0x10; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x1F, data); -- } -- -- 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; -- -- XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3c4, 0x07, 0xFC, data2); --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGI_LoadDAC */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --void --XGI_LoadDAC(USHORT ModeNo, USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo) --{ -- USHORT data, data2, time, i, j, k, m, n, o, si, di, bx, dl, al, ah, dh; -- const uint8_t *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 = XGI_MDA_DAC; -- else if (data == 0x08) -- table = XGI_CGA_DAC; -- else if (data == 0x10) -- table = XGI_EGA_DAC; -- else if (data == 0x18) { -- time = 256; -- table = XGI_VGA_DAC; -- } -- -- if (time == 256) -- j = 16; -- else -- j = time; -- -- XGI_SetRegByte((XGIIOADDRESS) pVBInfo->P3c6, 0xFF); -- XGI_SetRegByte((XGIIOADDRESS) 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; -- -- XGI_SetRegByte((XGIIOADDRESS) pVBInfo->P3c9, data2); -- data = data >> 2; -- } -- } -- -- if (time == 256) { -- for (i = 16; i < 32; i++) { -- data = table[i]; -- -- for (k = 0; k < 3; k++) -- XGI_SetRegByte((XGIIOADDRESS) 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((XGIIOADDRESS) pVBInfo->P3c9, 0, dl, -- ah, al, dh); -- } -- -- si -= 2; -- -- for (o = 0; o < 3; o++) { -- dh = table[bx]; -- ah = table[di]; -- al = table[si]; -- si--; -- XGI_WriteDAC((XGIIOADDRESS) pVBInfo->P3c9, 0, dl, -- ah, al, dh); -- } -- -- dl++; -- } -- -- si += 5; -- } -- } --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGI_WriteDAC */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --void --XGI_WriteDAC(XGIIOADDRESS dac_data, unsigned shift, unsigned ordering, -- uint8_t ah, uint8_t al, uint8_t dh) --{ -- USHORT temp, bh, bl; -- -- if (shift) { -- ah <<= 2; -- al <<= 2; -- dh <<= 2; -- } -- -- bh = ah; -- bl = al; -- -- if (ordering != 0) { -- temp = bh; -- bh = dh; -- dh = temp; -- if (ordering == 1) { -- temp = bl; -- bl = dh; -- dh = temp; -- } -- else { -- temp = bl; -- bl = bh; -- bh = temp; -- } -- } -- XGI_SetRegByte(dac_data, dh); -- XGI_SetRegByte(dac_data, bh); -- XGI_SetRegByte(dac_data, bl); --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGI_SetLCDAGroup */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --void --XGI_SetLCDAGroup(USHORT ModeNo, USHORT ModeIdIndex, -- PXGI_HW_DEVICE_INFO HwDeviceExtension, -- PVB_DEVICE_INFO pVBInfo) --{ -- USHORT RefreshRateTableIndex; -- /* USHORT temp ; */ -- -- /* pVBInfo->SelectCRT2Rate = 0 ; */ -- -- pVBInfo->SetFlag |= ProgrammingCRT2; -- RefreshRateTableIndex = XGI_GetRatePtrCRT2(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); --} -- -- --/** -- * Get LVDS resolution information. -- */ --void --XGI_GetLVDSResInfo(USHORT ModeNo, USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo) --{ -- unsigned xres; -- unsigned yres; -- -- -- get_mode_xres_yres(ModeNo, ModeIdIndex, pVBInfo, &xres, &yres); -- -- if (xres == 720) -- xres = 640; -- -- pVBInfo->VGAHDE = xres; -- pVBInfo->HDE = xres; -- pVBInfo->VGAVDE = yres; -- pVBInfo->VDE = yres; --} -- -- --static void --get_HDE_VDE(PVB_DEVICE_INFO pVBInfo, USHORT *HDE, USHORT *VDE) --{ -- switch (pVBInfo->LCDResInfo) { -- case Panel1024x768: -- case Panel1024x768x75: -- *HDE = 1024; -- *VDE = 768; -- break; -- -- case Panel1280x1024: -- case Panel1280x1024x75: -- *HDE = 1280; -- *VDE = 1024; -- break; -- -- case Panel1400x1050: -- *HDE = 1400; -- *VDE = 1050; -- break; -- -- default: -- *HDE = 1600; -- *VDE = 1200; -- break; -- } --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGI_GetLVDSData */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --void --XGI_GetLVDSData(USHORT ModeNo, USHORT ModeIdIndex, -- USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo) --{ -- USHORT tempbx; -- XGI330_LVDSDataStruct *LCDPtr = NULL; -- -- tempbx = 2; -- -- if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) { -- LCDPtr = -- (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->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) { -- if (!(pVBInfo->LCDInfo & (SetLCDtoNonExpanding | EnableScalingLCD))) { -- get_HDE_VDE(pVBInfo, & pVBInfo->HDE, & pVBInfo->VDE); -- } -- } --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGI_ModCRT1Regs */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --void --XGI_ModCRT1Regs(USHORT ModeNo, USHORT ModeIdIndex, -- USHORT RefreshRateTableIndex, -- PXGI_HW_DEVICE_INFO HwDeviceExtension, -- PVB_DEVICE_INFO pVBInfo) --{ -- UCHAR index; -- USHORT tempbx, i; -- XGI_LVDSCRT1HDataStruct *LCDPtr = NULL; -- XGI_LVDSCRT1VDataStruct *LCDPtr1 = NULL; -- /* XGI330_CHTVDataStruct *TVPtr = 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 = -- (XGI_LVDSCRT1HDataStruct *) XGI_GetLcdPtr(tempbx, ModeNo, -- ModeIdIndex, -- RefreshRateTableIndex, -- pVBInfo); -- -- for (i = 0; i < 8; i++) -- pVBInfo->TimingH.data[i] = LCDPtr[0].Reg[i]; -- } -- -- XGI_SetCRT1Timing_H(pVBInfo, HwDeviceExtension); -- -- tempbx = 1; -- -- if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) { -- LCDPtr1 = -- (XGI_LVDSCRT1VDataStruct *) XGI_GetLcdPtr(tempbx, ModeNo, -- ModeIdIndex, -- RefreshRateTableIndex, -- pVBInfo); -- for (i = 0; i < 7; i++) -- pVBInfo->TimingV.data[i] = LCDPtr1[0].Reg[i]; -- } -- -- XGI_SetCRT1Timing_V(ModeIdIndex, ModeNo, pVBInfo); -- } --} -- -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGI_SetLVDSRegs */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --void --XGI_SetLVDSRegs(USHORT ModeNo, USHORT ModeIdIndex, -- USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo) --{ -- USHORT tempbx, tempax, tempcx, tempdx, push1, push2, modeflag; -- unsigned long temp, temp1, temp2, temp3, push3; -- XGI330_LCDDataDesStruct *LCDPtr = NULL; -- 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_OEMUtil == 1) { -- tempbx = 8; -- LCDPtr = -- (XGI330_LCDDataDesStruct *) XGI_GetLcdPtr(tempbx, ModeNo, -- ModeIdIndex, -- RefreshRateTableIndex, -- pVBInfo); -- } -- -- if ((pVBInfo->IF_DEF_OEMUtil == 0) || (LCDPtr == 0)) { -- tempbx = 3; -- if (pVBInfo->LCDInfo & EnableScalingLCD) -- LCDPtr1 = -- (XGI330_LCDDataDesStruct2 *) XGI_GetLcdPtr(tempbx, ModeNo, -- ModeIdIndex, -- RefreshRateTableIndex, -- pVBInfo); -- else -- LCDPtr = -- (XGI330_LCDDataDesStruct *) XGI_GetLcdPtr(tempbx, ModeNo, -- ModeIdIndex, -- RefreshRateTableIndex, -- pVBInfo); -- } -- -- XGI_GetLCDSync(&tempax, &tempbx, pVBInfo); -- push1 = tempbx; -- push2 = tempax; -- -- /* GetLCDResInfo */ -- if (pVBInfo->LCDInfo & SetLCDtoNonExpanding) { -- get_HDE_VDE(pVBInfo, & pVBInfo->HDE, & pVBInfo->VDE); -- -- pVBInfo->VGAHDE = pVBInfo->HDE; -- pVBInfo->VGAVDE = pVBInfo->VDE; -- } -- -- tempax = pVBInfo->HT; -- -- tempbx = (pVBInfo->LCDInfo & EnableScalingLCD) -- ? LCDPtr1->LCDHDES : LCDPtr->LCDHDES; -- -- tempcx = pVBInfo->HDE; -- tempbx = tempbx & 0x0fff; -- tempcx += tempbx; -- -- if (tempcx >= tempax) -- tempcx -= tempax; -- -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x1A, tempbx & 0x07); -- -- tempcx = tempcx >> 3; -- tempbx = tempbx >> 3; -- -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x16, -- (USHORT) (tempbx & 0xff)); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x17, -- (USHORT) (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; -- -- /* FIXME: Won't this *always* set tempax to zero? */ -- tempax = tempbx & 0x07; -- tempax = tempax >> 5; -- tempcx = tempcx >> 3; -- tempbx = tempbx >> 3; -- -- tempcx &= 0x1f; -- tempax |= tempcx; -- -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x15, tempax); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x14, -- (USHORT) (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; -- -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x1b, -- (USHORT) (tempbx & 0xff)); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x1c, -- (USHORT) (tempcx & 0xff)); -- -- tempbx = (tempbx >> 8) & 0x07; -- tempcx = (tempcx >> 8) & 0x07; -- -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x1d, -- (USHORT) ((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; -- -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x18, -- (USHORT) (tempbx & 0xff)); -- XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part1Port, 0x19, ~0x0f, -- (USHORT) (tempcx & 0x0f)); -- -- tempax = ((tempbx >> 8) & 0x07) << 3; -- -- tempbx = pVBInfo->VGAVDE; -- if (tempbx != pVBInfo->VDE) -- tempax |= 0x40; -- -- if (pVBInfo->LCDInfo & EnableLVDSDDA) -- tempax |= 0x40; -- -- XGI_SetRegANDOR((XGIIOADDRESS) 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 = (USHORT) ((temp << 18) % tempbx); -- -- if (tempdx != 0) -- temp1 += 1; -- -- temp2 = temp1; -- push3 = temp2; -- -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x37, -- (USHORT) (temp2 & 0xff)); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x36, -- (USHORT) ((temp2 >> 8) & 0xff)); -- -- tempbx = (USHORT) (temp2 >> 16); -- tempax = tempbx & 0x03; -- -- tempbx = pVBInfo->VGAVDE; -- if (tempbx == pVBInfo->VDE) -- tempax |= 0x04; -- -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x35, tempax); -- -- if (pVBInfo->VBType & VB_XGI301C) { -- temp2 = push3; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x3c, -- (USHORT) (temp2 & 0xff)); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x3b, -- (USHORT) ((temp2 >> 8) & 0xff)); -- tempbx = (USHORT) (temp2 >> 16); -- XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part4Port, 0x3a, ~0xc0, -- (USHORT) ((tempbx & 0xff) << 6)); -- -- tempcx = pVBInfo->VGAVDE; -- if (tempcx == pVBInfo->VDE) -- XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part4Port, 0x30, -- ~0x0c, 0x00); -- else -- XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part4Port, 0x30, -- ~0x0c, 0x08); -- } -- -- tempcx = pVBInfo->VGAHDE; -- tempbx = pVBInfo->HDE; -- -- temp1 = tempcx << 16; -- -- tempax = (USHORT) (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 = (USHORT) (temp3 & 0xff); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x1f, tempax); -- -- temp1 = pVBInfo->VGAVDE << 18; -- temp1 = temp1 / push3; -- tempbx = (USHORT) (temp1 & 0xffff); -- -- if (pVBInfo->LCDResInfo == Panel1024x768) -- tempbx -= 1; -- -- tempax = ((tempbx >> 8) & 0xff) << 3; -- tempax |= (USHORT) ((temp3 >> 8) & 0x07); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x20, -- (USHORT) (tempax & 0xff)); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x21, -- (USHORT) (tempbx & 0xff)); -- -- temp3 = temp3 >> 16; -- -- if (modeflag & HalfDCLK) -- temp3 = temp3 >> 1; -- -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x22, -- (USHORT) ((temp3 >> 8) & 0xff)); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x23, -- (USHORT) (temp3 & 0xff)); -- } --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGI_SetCRT2ECLK */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --void --XGI_SetCRT2ECLK(USHORT ModeNo, USHORT ModeIdIndex, -- USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo) --{ -- UCHAR di[2]; -- int i; -- const unsigned vclkindex = -- XGI_GetVCLKPtr(RefreshRateTableIndex, ModeNo, ModeIdIndex, pVBInfo); -- -- XGI_GetVCLKLen(vclkindex, di, pVBInfo); -- XGI_GetLCDVCLKPtr(di, pVBInfo); -- -- for (i = 0; i < 4; i++) { -- XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4, 0x31, ~0x30, -- (USHORT) (0x10 * i)); -- if ((!(pVBInfo->VBInfo & SetCRT2ToLCDA)) -- && (!(pVBInfo->VBInfo & SetInSlaveMode))) { -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x2e, di[0]); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x2f, di[1]); -- } -- else { -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x2b, di[0]); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x2c, di[1]); -- } -- } --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGI_UpdateModeInfo */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --void --XGI_UpdateModeInfo(PXGI_HW_DEVICE_INFO HwDeviceExtension, -- PVB_DEVICE_INFO pVBInfo) --{ -- USHORT tempcl, tempch, temp, tempbl, tempax; -- -- if (pVBInfo-> -- VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | -- VB_XGI301C)) { -- tempcl = 0; -- tempch = 0; -- temp = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x01); -- -- if (!(temp & 0x20)) { -- temp = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x17); -- if (temp & 0x80) { -- if ((HwDeviceExtension->jChipType == XG20) -- || (HwDeviceExtension->jChipType >= XG40)) -- temp = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x53); -- else -- temp = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x63); -- -- if (!(temp & 0x40)) -- tempcl |= ActiveCRT1; -- } -- } -- -- temp = XGI_GetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x2e); -- temp &= 0x0f; -- -- if (!(temp == 0x08)) { -- tempax = XGI_GetReg((XGIIOADDRESS) 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 = XGI_GetReg((XGIIOADDRESS) 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 = -- XGI_GetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x4d); -- -- if (temp & 0x10) -- tempch |= ActiveYPbPr; -- } -- -- if (tempch != 0) -- tempcl |= ActiveTV; -- } -- } -- -- temp = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x3d); -- if (tempcl & ActiveLCD) { -- if ((pVBInfo->SetFlag & ReserveTVOption)) { -- if (temp & ActiveTV) -- tempcl |= ActiveTV; -- } -- } -- temp = tempcl; -- tempbl = ~ModeSwitchStatus; -- XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4, 0x3d, tempbl, temp); -- -- if (!(pVBInfo->SetFlag & ReserveTVOption)) -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x3e, tempch); -- } -- else { -- return; -- } --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGI_GetVBType */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --void --XGI_GetVBType(PVB_DEVICE_INFO pVBInfo) --{ -- USHORT flag, tempbx, tempah; -- -- tempbx = VB_XGI302B; -- flag = XGI_GetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x00); -- if (flag != 0x02) { -- tempbx = VB_XGI301; -- flag = XGI_GetReg((XGIIOADDRESS) 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 = XGI_GetReg((XGIIOADDRESS) pVBInfo->Part4Port, -- 0x39); -- if (tempah != 0xFF) -- tempbx = VB_XGI301C; -- } -- } -- } -- -- if (tempbx & (VB_XGI301B | VB_XGI302B)) { -- flag = XGI_GetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x23); -- -- if (!(flag & 0x02)) -- tempbx = tempbx | VB_NoLCD; -- } -- } -- } -- -- pVBInfo->VBType = tempbx; --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGI_GetVBInfo */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --void --XGI_GetVBInfo(USHORT ModeNo, USHORT ModeIdIndex, -- PXGI_HW_DEVICE_INFO HwDeviceExtension, PVB_DEVICE_INFO pVBInfo) --{ -- USHORT 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 = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x30); /* Check Display Device */ -- tempbx = tempbx | temp; -- temp = XGI_GetReg((XGIIOADDRESS) 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 = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x38); -- -- if (pVBInfo->IF_DEF_LCDA == 1) { -- /* 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; -- } -- } -- } -- -- if (pVBInfo->IF_DEF_YPbPr == 1) { -- if ((pVBInfo->VBType & VB_XGI301LV) -- || (pVBInfo->VBType & VB_XGI302LV) -- || (pVBInfo->VBType & VB_XGI301C)) { -- if (temp & SetYPbPr) { /* temp = CR38 */ -- if (pVBInfo->IF_DEF_HiVision == 1) { -- temp = XGI_GetReg((XGIIOADDRESS) 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_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; -- } -- -- -- 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) -- && (HwDeviceExtension->jChipType <= XG45)) { -- if (ModeNo <= 13) { -- /* CRT2 not need to support */ -- if (!(tempbx & SetCRT2ToRAMDAC)) { -- 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(USHORT ModeNo, USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo) --{ -- USHORT 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 = XGI_GetReg((XGIIOADDRESS) 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->VBInfo & SetCRT2ToSCART) -- tempbx |= SetPALTV; -- -- if (pVBInfo->IF_DEF_YPbPr == 1) { -- if (pVBInfo->VBInfo & SetCRT2ToYPbPr) { -- index1 = XGI_GetReg((XGIIOADDRESS) 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->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 : */ --/* --------------------------------------------------------------------- */ --BOOLEAN --XGI_GetLCDInfo(USHORT ModeNo, USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo) --{ -- USHORT 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 = XGI_GetReg((XGIIOADDRESS) 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 = XGI_GetReg((XGIIOADDRESS) 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 = XGI_GetReg((XGIIOADDRESS) 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->VBType & VB_XGI302LV) || (pVBInfo->VBType & VB_XGI301C)) -- && (tempax & LCDDualLink)) { -- tempbx |= SetLCDDualLink; -- } -- -- 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; -- } -- -- temp = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x39); -- if (temp & ReduceTiming) { -- tempbx |= EnableReduceTiming; -- } -- -- 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 (tempax & (LockLCDBToA | StLCDBToA)) { -- if (pVBInfo->VBInfo & SetInSlaveMode) { -- if (!(tempax & LockLCDBToA)) { -- if (ModeNo <= 0x13) { -- pVBInfo->VBInfo &= -- ~(SetSimuScanMode | SetInSlaveMode | -- SetCRT2ToLCD); -- pVBInfo->VBInfo |= SetCRT2ToLCDA | SetCRT2ToDualEdge; -- } -- } -- } -- } -- } -- -- return (1); --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --BOOLEAN --XGINew_CheckMemorySize(PXGI_HW_DEVICE_INFO HwDeviceExtension, USHORT ModeNo, -- USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo) --{ -- USHORT memorysize, modeflag, temp, temp1, tmp; -- -- 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 = XGI_GetReg((XGIIOADDRESS) 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 (FALSE); -- else -- return (TRUE); --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGI_DisplayOn */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --void --XGI_DisplayOn(PVB_DEVICE_INFO pVBInfo) --{ -- XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3c4, 0x01, 0xDF, 0x00); --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGI_DisplayOff */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --void --XGI_DisplayOff(PVB_DEVICE_INFO pVBInfo) --{ -- XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3c4, 0x01, 0xDF, 0x20); --} -- -- --/** -- * Wait for vertical or horizontal blanking period. -- */ --void --XGI_WaitDisplay(PVB_DEVICE_INFO pVBInfo) --{ -- while ((XGI_GetRegByte((XGIIOADDRESS) pVBInfo->P3da) & 0x01)) -- break; -- -- while (!(XGI_GetRegByte((XGIIOADDRESS) pVBInfo->P3da) & 0x01)) -- break; --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGI_SenseCRT1 */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ -- --void --XGI_SenseCRT1(PVB_DEVICE_INFO pVBInfo) --{ -- UCHAR CRTCData[17] = { 0x5F, 0x4F, 0x50, 0x82, 0x55, 0x81, -- 0x0B, 0x3E, 0xE9, 0x0B, 0xDF, 0xE7, -- 0x04, 0x00, 0x00, 0x05, 0x00 -- }; -- -- UCHAR SR01 = 0, SR1F = 0, SR07 = 0, SR06 = 0; -- -- UCHAR CR17, CR63, SR31; -- USHORT temp; -- UCHAR DAC_TEST_PARMS[3] = { 0x0F, 0x0F, 0x0F }; -- -- int i; --#ifndef LINUX_XF86 -- int j; --#endif -- -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x05, 0x86); -- -- /* [2004/05/06] Vicent to fix XG42 single LCD sense to CRT+LCD */ -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x57, 0x4A); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x53, -- (UCHAR) (XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x53) | -- 0x02)); -- -- SR31 = (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x31); -- CR63 = (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x63); -- SR01 = (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x01); -- -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x01, (UCHAR) (SR01 & 0xDF)); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x63, (UCHAR) (CR63 & 0xBF)); -- -- CR17 = (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x17); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x17, (UCHAR) (CR17 | 0x80)); -- -- SR1F = (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x1F); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x1F, (UCHAR) (SR1F | 0x04)); -- -- SR07 = (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x07); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x07, (UCHAR) (SR07 & 0xFB)); -- SR06 = (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x06); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x06, (UCHAR) (SR06 & 0xC3)); -- -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x11, 0x00); -- -- for (i = 0; i < 8; i++) -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, (USHORT) i, CRTCData[i]); -- -- for (i = 8; i < 11; i++) -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, (USHORT) (i + 8), -- CRTCData[i]); -- -- for (i = 11; i < 13; i++) -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, (USHORT) (i + 4), -- CRTCData[i]); -- -- for (i = 13; i < 16; i++) -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, (USHORT) (i - 3), -- CRTCData[i]); -- -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x0E, -- (UCHAR) (CRTCData[16] & 0xE0)); -- -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x31, 0x00); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x2B, 0x1B); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x2C, 0xE1); -- -- XGI_SetRegByte((XGIIOADDRESS) pVBInfo->P3c8, 0x00); -- for (i = 0; i < 256; i++) { -- XGI_SetRegByte((XGIIOADDRESS) (USHORT) (pVBInfo->P3c8 + 1), -- (UCHAR) DAC_TEST_PARMS[0]); -- XGI_SetRegByte((XGIIOADDRESS) (USHORT) (pVBInfo->P3c8 + 1), -- (UCHAR) DAC_TEST_PARMS[1]); -- XGI_SetRegByte((XGIIOADDRESS) (USHORT) (pVBInfo->P3c8 + 1), -- (UCHAR) DAC_TEST_PARMS[2]); -- } -- -- XGI_VBLongWait(pVBInfo); -- XGI_VBLongWait(pVBInfo); -- XGI_VBLongWait(pVBInfo); -- -- XGINew_LCD_Wait_Time(0x01, pVBInfo); -- XGI_WaitDisplay(pVBInfo); -- -- temp = XGI_GetRegByte((XGIIOADDRESS) pVBInfo->P3c2); -- if (temp & 0x10) { -- XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4, 0x32, 0xDF, 0x20); -- } -- else { -- XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4, 0x32, 0xDF, 0x00); -- } -- -- /* alan, avoid display something, set BLACK DAC if not restore DAC */ -- XGI_SetRegByte((XGIIOADDRESS) pVBInfo->P3c8, 0x00); -- -- for (i = 0; i < 256; i++) { -- XGI_SetRegByte((XGIIOADDRESS) (USHORT) (pVBInfo->P3c8 + 1), 0); -- XGI_SetRegByte((XGIIOADDRESS) (USHORT) (pVBInfo->P3c8 + 1), 0); -- XGI_SetRegByte((XGIIOADDRESS) (USHORT) (pVBInfo->P3c8 + 1), 0); -- } -- -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x01, SR01); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x63, CR63); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x31, SR31); -- -- /* [2004/05/11] Vicent */ -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x53, -- (UCHAR) (XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x53) & -- 0xFD)); --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --BOOLEAN --CheckDualChip(PVB_DEVICE_INFO pVBInfo) --{ -- /* Check H/W trap that 2nd chip is present or not. */ -- return ((BOOLEAN) -- (XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x3A) & -- XGI_MASK_DUAL_CHIP)); --} -- -- -- --/* --------------------------------------------------------------------- */ --/* Function : SetDualChipRegs */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --void --SetDualChipRegs(PXGI_HW_DEVICE_INFO HwDeviceExtension, -- PVB_DEVICE_INFO pVBInfo) --{ -- --#ifdef LINUX_XF86 -- USHORT BaseAddr2nd = (USHORT) (ULONG) HwDeviceExtension->pj2ndIOAddress; --#else -- USHORT BaseAddr2nd = (USHORT) HwDeviceExtension->pj2ndIOAddress; --#endif -- USHORT XGINew_P3CC = pVBInfo->BaseAddr + MISC_OUTPUT_REG_READ_PORT; -- USHORT XGINew_2ndP3CE = BaseAddr2nd + GRAPH_ADDRESS_PORT; -- USHORT XGINew_2ndP3C4 = BaseAddr2nd + SEQ_ADDRESS_PORT; -- USHORT XGINew_2ndP3C2 = BaseAddr2nd + MISC_OUTPUT_REG_WRITE_PORT; -- UCHAR tempal, i; -- pVBInfo->BaseAddr = (USHORT) HwDeviceExtension->pjIOAddress; -- for (i = 0x00; i <= 0x04; i++) { /* SR0 - SR4 */ -- tempal = (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4, i); -- XGI_SetReg((XGIIOADDRESS) XGINew_2ndP3C4, i, tempal); -- } -- for (i = 0x00; i <= 0x08; i++) { /* GR0 - GR8 */ -- tempal = (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->P3ce, i); -- XGI_SetReg((XGIIOADDRESS) XGINew_2ndP3CE, i, tempal); -- } -- /* OpenKey in 2nd chip */ -- XGI_SetReg((XGIIOADDRESS) XGINew_2ndP3C4, 0x05, 0x86); -- -- /* Copy SR06 to 2nd chip */ -- tempal = (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x06); -- XGI_SetReg((XGIIOADDRESS) XGINew_2ndP3C4, 0x06, tempal); -- -- /* Copy SR21 to 2nd chip */ -- tempal = (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x21); -- XGI_SetReg((XGIIOADDRESS) XGINew_2ndP3C4, 0x21, tempal); -- -- /* Miscellaneous reg(input port 3cch,output port 3c2h) */ -- tempal = (UCHAR) XGI_GetRegByte((XGIIOADDRESS) XGINew_P3CC); /* 3cc */ -- XGI_SetRegByte((XGIIOADDRESS) XGINew_2ndP3C2, tempal); -- -- /* Close key in 2nd chip */ -- XGI_SetReg((XGIIOADDRESS) XGINew_2ndP3C4, 0x05, 0x00); --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGI_SetCRT2Group301 */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --BOOLEAN --XGI_SetCRT2Group301(USHORT ModeNo, PXGI_HW_DEVICE_INFO HwDeviceExtension, -- PVB_DEVICE_INFO pVBInfo) --{ -- USHORT tempbx, ModeIdIndex, RefreshRateTableIndex; -- USHORT temp_mode_no; -- -- tempbx = pVBInfo->VBInfo; -- pVBInfo->SetFlag |= ProgrammingCRT2; -- -- temp_mode_no = ModeNo; -- XGI_SearchModeID(pVBInfo->SModeIDTable, pVBInfo->EModeIDTable, 0x11, -- &temp_mode_no, &ModeIdIndex); -- -- -- pVBInfo->SelectCRT2Rate = 4; -- RefreshRateTableIndex = XGI_GetRatePtrCRT2(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(PVB_DEVICE_INFO pVBInfo) --{ -- if (!(pVBInfo->SetFlag & Win9xDOSMode)) -- XGI_SetRegOR((XGIIOADDRESS) pVBInfo->Part1Port, 0x01, 0x40); --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGI_SaveCRT2Info */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --void --XGI_SaveCRT2Info(USHORT ModeNo, PVB_DEVICE_INFO pVBInfo) --{ -- USHORT temp1, temp2; -- -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x34, ModeNo); /* reserve CR34 for CRT1 Mode No */ -- temp1 = (pVBInfo->VBInfo & SetInSlaveMode) >> 8; -- temp2 = ~(SetInSlaveMode >> 8); -- XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4, 0x31, temp2, temp1); --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGI_GetCRT2ResInfo */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --void --XGI_GetCRT2ResInfo(USHORT ModeNo, USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo) --{ -- unsigned xres; -- unsigned yres; -- -- -- get_mode_xres_yres(ModeNo, ModeIdIndex, pVBInfo, &xres, &yres); -- -- if ((pVBInfo->VBInfo & SetCRT2ToLCD) -- && !(pVBInfo->LCDInfo & (EnableScalingLCD | LCDNonExpanding))) { -- switch (pVBInfo->LCDResInfo) { -- case Panel1600x1200: -- if (!(pVBInfo->LCDInfo & LCDVESATiming) && (yres == 1024)) { -- yres = 1056; -- } -- break; -- -- -- case Panel1280x1024: -- if (yres == 400) -- yres = 405; -- else if (yres == 350) -- yres = 360; -- else if ((pVBInfo->LCDInfo & LCDVESATiming) && (yres == 360)) { -- yres = 375; -- } -- break; -- -- -- case Panel1024x768: -- if (!(pVBInfo->LCDInfo & (LCDVESATiming | LCDNonExpanding))) { -- if (yres == 350) { -- yres = 357; -- } -- else if (yres == 400) { -- yres = 420; -- } -- else if (yres == 480) { -- yres = 525; -- } -- } -- -- break; -- } -- -- if (xres == 720) -- xres = 640; -- } -- -- pVBInfo->VGAHDE = xres; -- pVBInfo->HDE = xres; -- pVBInfo->VGAVDE = yres; -- pVBInfo->VDE = yres; --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGI_IsLCDDualLink */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --BOOLEAN --XGI_IsLCDDualLink(PVB_DEVICE_INFO pVBInfo) --{ -- return (((pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) != 0) -- && ((pVBInfo->LCDInfo & SetLCDDualLink) != 0)); --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGI_GetCRT2Data */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --void --XGI_GetCRT2Data(USHORT ModeNo, USHORT ModeIdIndex, -- USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo) --{ -- USHORT tempax = 0, tempbx, modeflag, resinfo; --#ifndef LINUX_XF86 -- USHORT CRT2Index, ResIndex; --#endif -- -- XGI_LCDDataStruct *LCDPtr = NULL; -- 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 = -- (XGI_LCDDataStruct *) XGI_GetLcdPtr(tempbx, ModeNo, ModeIdIndex, -- RefreshRateTableIndex, -- pVBInfo); -- -- PDEBUG(ErrorF -- ("C code setmode: ModeNo: 0x%08lX VGAHT:0x%081X \n", ModeNo, -- LCDPtr->VGAHT)); -- 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 | EnableScalingLCD)) { -- tempax = pVBInfo->VGAHDE; -- tempbx = pVBInfo->VGAVDE; -- } -- -- pVBInfo->HDE = tempax; -- pVBInfo->VDE = tempbx; -- return; -- } -- -- if (pVBInfo->VBInfo & (SetCRT2ToTV)) { -- tempbx = 4; -- TVPtr = -- (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(USHORT ModeNo, USHORT ModeIdIndex, -- USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo) --{ -- UCHAR di[2]; -- const unsigned vclkindex = -- XGI_GetVCLKPtr(RefreshRateTableIndex, ModeNo, ModeIdIndex, pVBInfo); -- -- XGI_GetVCLKLen(vclkindex, di, pVBInfo); -- XGI_GetLCDVCLKPtr(di, pVBInfo); -- -- if (pVBInfo->VBType & VB_XGI301) { /* shampoo 0129 *//* 301 */ -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x0A, 0x10); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x0B, di[1]); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x0A, di[0]); -- } -- else { /* 301b/302b/301lv/302lv */ -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x0A, di[0]); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x0B, di[1]); -- } -- -- if ((pVBInfo->LCDInfo & EnableReduceTiming) -- && (pVBInfo->LCDResInfo == Panel1600x1200)) { -- if (pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO == 0x0A) { -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x0A, 0x5A); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x0B, 0x24); -- } -- } -- -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x00, 0x12); -- -- if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) -- XGI_SetRegOR((XGIIOADDRESS) pVBInfo->Part4Port, 0x12, 0x28); -- else -- XGI_SetRegOR((XGIIOADDRESS) pVBInfo->Part4Port, 0x12, 0x08); --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGI_GETLCDVCLKPtr */ --/* Input : */ --/* Output : al -> VCLK Index */ --/* Description : */ --/* --------------------------------------------------------------------- */ --void --XGI_GetLCDVCLKPtr(UCHAR *di, PVB_DEVICE_INFO pVBInfo) --{ -- if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) { -- if ((pVBInfo->IF_DEF_ScaleLCD != 1) -- || !(pVBInfo->LCDInfo & EnableScalingLCD)) { -- const unsigned 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 --XGI_GetVCLKPtr(USHORT RefreshRateTableIndex, USHORT ModeNo, -- USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo) --{ -- unsigned vclk; -- const unsigned modeflag = (ModeNo <= 0x13) -- ? pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag -- : pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag; -- -- -- if ((pVBInfo->SetFlag & ProgrammingCRT2) -- && (!(pVBInfo->LCDInfo & EnableScalingLCD))) { /* {LCDA/LCDB} */ -- const unsigned index = XGI_GetLCDCapPtr(pVBInfo); -- vclk = pVBInfo->LCDCapList[index].LCD_VCLK; -- -- if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) -- return vclk; -- -- /* {TV} */ -- if (pVBInfo-> -- VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | -- VB_XGI301C)) { -- if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) { -- if (pVBInfo->TVInfo & TVSimuMode) { -- vclk = (modeflag & Charx8Dot) -- ? HiTVSimuVCLK : HiTVTextVCLK; -- } -- else { -- vclk = (pVBInfo->TVInfo & RPLLDIV2XO) -- ? HiTVVCLKDIV2 : HiTVVCLK; -- } -- -- return vclk; -- } -- else if (pVBInfo->TVInfo & SetYPbPrMode750p) { -- return YPbPr750pVCLK; -- } -- else if (pVBInfo->TVInfo & SetYPbPrMode525p) { -- return YPbPr525pVCLK; -- } -- -- vclk = NTSC1024VCLK; -- -- if (!(pVBInfo->TVInfo & NTSC1024x768)) { -- vclk = (pVBInfo->TVInfo & RPLLDIV2XO) -- ? TVVCLKDIV2 : TVVCLK; -- } -- -- if (pVBInfo->VBInfo & SetCRT2ToTV) -- return vclk; -- } -- } /* {End of VB} */ -- -- vclk = XGI_GetRegByte((XGIIOADDRESS) (pVBInfo->P3ca + 0x02)); -- vclk = (vclk >> 2) & 0x03; -- -- /* for Dot8 Scaling LCD */ -- if ((pVBInfo->LCDInfo & EnableScalingLCD) -- && (modeflag & Charx8Dot) -- && ((pVBInfo->IF_DEF_VideoCapture) == 1)) { -- vclk = VCLK25_175; /* ; set to VCLK25MHz always */ -- } -- -- if (ModeNo <= 0x13) -- return vclk; -- -- return pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRTVCLK; --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGI_GetVCLKLen */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --void --XGI_GetVCLKLen(unsigned vclkindex, UCHAR *di, PVB_DEVICE_INFO pVBInfo) --{ -- if (pVBInfo-> -- VBType & (VB_XGI301 | VB_XGI301B | VB_XGI302B | VB_XGI301LV | -- VB_XGI302LV | VB_XGI301C)) { -- if ((!(pVBInfo->VBInfo & SetCRT2ToLCDA)) -- && (pVBInfo->SetFlag & ProgrammingCRT2)) { -- di[0] = XGI_VBVCLKData[vclkindex].SR2B; -- di[1] = XGI_VBVCLKData[vclkindex].SR2C; -- } -- } -- else { -- di[0] = XGI_VCLKData[vclkindex].SR2B; -- di[1] = XGI_VCLKData[vclkindex].SR2C; -- } --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGI_SetCRT2Offset */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --void --XGI_SetCRT2Offset(USHORT ModeNo, -- USHORT ModeIdIndex, USHORT RefreshRateTableIndex, -- PXGI_HW_DEVICE_INFO HwDeviceExtension, -- PVB_DEVICE_INFO pVBInfo) --{ -- USHORT offset; -- UCHAR temp; -- -- if (pVBInfo->VBInfo & SetInSlaveMode) { -- return; -- } -- -- offset = -- XGI_GetOffset(ModeNo, ModeIdIndex, RefreshRateTableIndex, -- HwDeviceExtension, pVBInfo); -- temp = (UCHAR) (offset & 0xFF); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x07, temp); -- temp = (UCHAR) ((offset & 0xFF00) >> 8); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x09, temp); -- temp = (UCHAR) (((offset >> 3) & 0xFF) + 1); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x03, temp); --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGI_GetOffset */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --USHORT --XGI_GetOffset(USHORT ModeNo, USHORT ModeIdIndex, USHORT RefreshRateTableIndex, -- PXGI_HW_DEVICE_INFO HwDeviceExtension, PVB_DEVICE_INFO pVBInfo) --{ -- USHORT temp, -- colordepth, -- modeinfo, index, infoflag; -- -- 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 >= 0x26) && (ModeNo <= 0x28)) { -- return (temp * colordepth + (colordepth >> 1)); -- } -- else -- return (temp * colordepth); --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGI_SetCRT2FIFO */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --void --XGI_SetCRT2FIFO(PVB_DEVICE_INFO pVBInfo) --{ -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x01, 0x3B); /* threshold high ,disable auto threshold */ -- XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part1Port, 0x02, ~(0x3F), 0x04); /* threshold low default 04h */ --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGI_PreSetGroup1 */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --void --XGI_PreSetGroup1(USHORT ModeNo, USHORT ModeIdIndex, -- PXGI_HW_DEVICE_INFO HwDeviceExtension, -- USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo) --{ -- USHORT tempcx = 0, CRT1Index = 0, resinfo = 0; --#ifndef LINUX_XF86 -- USHORT temp = 0, tempax = 0, tempbx = 0, pushbx = 0, modeflag; --#endif -- -- 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++) { -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, tempcx, 0x0); -- } -- -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x02, 0x44); /* temp 0206 */ --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGI_SetGroup1 */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --void --XGI_SetGroup1(USHORT ModeNo, USHORT ModeIdIndex, -- PXGI_HW_DEVICE_INFO HwDeviceExtension, -- USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo) --{ -- USHORT 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 */ -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x08, temp); -- temp = (((pVBInfo->VGAHT / 2 - 1) & 0xFF00) >> 8) << 4; -- XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part1Port, 0x09, ~0x0F0, -- temp); -- temp = (pVBInfo->VGAHDE / 2 + 16) & 0x0FF; /* BTVGA2HDEE 0x0A,0x0C */ -- XGI_SetReg((XGIIOADDRESS) 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; -- -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x0B, temp); -- } -- else { -- temp = (pVBInfo->VGAHT - 1) & 0x0FF; /* BTVGA2HT 0x08,0x09 */ -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x08, temp); -- temp = (((pVBInfo->VGAHT - 1) & 0xFF00) >> 8) << 4; -- XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part1Port, 0x09, ~0x0F0, -- temp); -- temp = (pVBInfo->VGAHDE + 16) & 0x0FF; /* BTVGA2HDEE 0x0A,0x0C */ -- XGI_SetReg((XGIIOADDRESS) 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; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x0B, temp); -- } -- -- tempax = (tempax & 0x00FF) | (tempbx & 0xFF00); -- tempbx = pushbx; -- tempbx = (tempbx & 0x00FF) | ((tempbx & 0xFF00) << 4); -- tempax |= (tempbx & 0xFF00); -- temp = (tempax & 0xFF00) >> 8; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x0C, temp); -- temp = tempcx & 0x00FF; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x0D, temp); -- tempcx = (pVBInfo->VGAVT - 1); -- temp = tempcx & 0x00FF; -- -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x0E, temp); -- tempbx = pVBInfo->VGAVDE - 1; -- temp = tempbx & 0x00FF; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x0F, temp); -- temp = ((tempbx & 0xFF00) << 3) >> 8; -- temp |= ((tempcx & 0xFF00) >> 8); -- XGI_SetReg((XGIIOADDRESS) 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; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x10, temp); -- temp = ((tempbx & 0xFF00) >> 8) << 4; -- temp = ((tempcx & 0x000F) | (temp)); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x11, temp); -- tempax = 0; -- -- if (modeflag & DoubleScanMode) -- tempax |= 0x80; -- -- if (modeflag & HalfDCLK) -- tempax |= 0x40; -- -- XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part1Port, 0x2C, ~0x0C0, tempax); --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGI_SetLockRegs */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --void --XGI_SetLockRegs(USHORT ModeNo, USHORT ModeIdIndex, -- PXGI_HW_DEVICE_INFO HwDeviceExtension, -- USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo) --{ -- USHORT 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 */ -- XGI_SetReg((XGIIOADDRESS) 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; -- XGI_SetReg((XGIIOADDRESS) 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; -- } -- } -- -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x05, temp); /* 0x05 Horizontal Display Start */ -- XGI_SetReg((XGIIOADDRESS) 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 | -- EnableScalingLCD))) { -- temp += 28; -- } -- } -- } -- } -- } -- } -- } -- } -- -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x07, temp); /* 0x07 Horizontal Retrace Start */ -- XGI_SetReg((XGIIOADDRESS) 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)) { -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x07, 0x5b); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x08, 0x03); -- } -- -- if ((ModeNo == 0x00) || (ModeNo == 0x01)) { -- if (pVBInfo->TVInfo & SetNTSCTV) { -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x07, 0x2A); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x08, 0x61); -- } -- else { -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x07, 0x2A); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x08, 0x41); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x0C, 0xF0); -- } -- } -- -- if ((ModeNo == 0x02) || (ModeNo == 0x03) || (ModeNo == 0x07)) { -- if (pVBInfo->TVInfo & SetNTSCTV) { -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x07, 0x54); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x08, 0x00); -- } -- else { -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x07, 0x55); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x08, 0x00); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x0C, 0xF0); -- } -- } -- -- if ((ModeNo == 0x04) || (ModeNo == 0x05) || (ModeNo == 0x0D) -- || (ModeNo == 0x50)) { -- if (pVBInfo->TVInfo & SetNTSCTV) { -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x07, 0x30); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x08, 0x03); -- } -- else { -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x07, 0x2f); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x08, 0x02); -- } -- } -- } -- } -- -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x18, 0x03); /* 0x18 SR0B */ -- XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part1Port, 0x19, 0xF0, 0x00); -- XGI_SetReg((XGIIOADDRESS) 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; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x10, temp); /* 0x10 vertical Blank Start */ -- tempbx = push2; -- tempbx--; -- temp = tempbx & 0x00FF; -- XGI_SetReg((XGIIOADDRESS) 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; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x0B, temp); -- -- if (tempbx & 0x0400) { -- tempcx |= 0x0600; -- } -- -- XGI_SetReg((XGIIOADDRESS) 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; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x0C, temp); -- tempbx--; -- temp = tempbx & 0x00FF; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x10, temp); -- -- if (tempbx & 0x0100) { -- tempcx |= 0x0008; -- } -- -- if (tempbx & 0x0200) { -- XGI_SetRegANDOR((XGIIOADDRESS) 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; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x0D, temp); /* 0x0D vertical Retrace End */ -- -- if (tempbx & 0x0010) { -- tempcx |= 0x2000; -- } -- -- temp = tempcx & 0x00FF; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x0A, temp); /* 0x0A CR07 */ -- temp = (tempcx & 0x0FF00) >> 8; -- XGI_SetReg((XGIIOADDRESS) 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; -- -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x16, temp); /* 0x16 SR01 */ -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x0F, 0); /* 0x0F CR14 */ -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x12, 0); /* 0x12 CR17 */ -- -- if (pVBInfo->LCDInfo & LCDRGB18Bit) -- temp = 0x80; -- else -- temp = 0x00; -- -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x1A, temp); /* 0x1A SR0E */ -- -- return; --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGI_SetGroup2 */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --void --XGI_SetGroup2(USHORT ModeNo, USHORT ModeIdIndex, USHORT RefreshRateTableIndex, -- PXGI_HW_DEVICE_INFO HwDeviceExtension, PVB_DEVICE_INFO pVBInfo) --{ -- USHORT i, -- j, -- tempax, -- tempbx, tempcx, temp, push1, push2, modeflag, resinfo, crt2crtc; --#ifndef LINUX_XF86 -- USHORT temp1, temp3, resindex, xres; --#endif --/* XGINew_RY1COE = 0 , -- XGINew_RY2COE = 0 , -- XGINew_RY3COE = 0 , -- XGINew_RY4COE = 0 , -- XGINew_RY5COE = 0 , -- XGINew_RY6COE = 0 , -- XGINew_RY7COE = 0 ; --*/ -- --#ifndef LINUX_XF86 -- UCHAR *PhasePoint; --#endif -- const UCHAR *TimingPoint; -- -- ULONG 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; -- -- ErrorF("Part2 0 = %x ", -- XGI_GetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x0)); -- ErrorF(" pVBInfo->VBInfo =%x", pVBInfo->VBInfo); -- -- tempax = (tempax & 0xff00) >> 8; -- ErrorF("tempax = %x ", tempax); -- XGI_SetReg((XGIIOADDRESS) 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++) { -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, i, TimingPoint[j]); -- } -- -- for (i = 0x39; i <= 0x45; i++, j++) { -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, i, TimingPoint[j]); /* di->temp2[j] */ -- } -- -- if (pVBInfo->VBInfo & SetCRT2ToTV) { -- XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part2Port, 0x3A, 0x1F, 0x00); -- } -- -- temp = pVBInfo->NewFlickerMode; -- temp &= 0x80; -- XGI_SetRegANDOR((XGIIOADDRESS) 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 += (USHORT) 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 */ -- } -- } -- } -- -- XGI_SetReg((XGIIOADDRESS) 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 */ -- } -- } -- } -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x02, temp); -- } -- -- /* 301b */ -- tempcx = pVBInfo->HT; -- -- if (XGI_IsLCDDualLink(pVBInfo)) -- tempcx = tempcx >> 1; -- -- tempcx -= 2; -- temp = tempcx & 0x00FF; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x1B, temp); -- -- temp = (tempcx & 0xFF00) >> 8; -- XGI_SetRegANDOR((XGIIOADDRESS) 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; -- XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part2Port, 0x22, 0x0F, temp); -- -- tempbx = TimingPoint[j] | ((TimingPoint[j + 1]) << 8); -- tempbx += tempcx; -- push2 = tempbx; -- temp = tempbx & 0x00FF; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x24, temp); -- temp = (tempbx & 0xFF00) >> 8; -- temp = temp << 4; -- XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part2Port, 0x25, 0x0F, temp); -- -- tempbx = push2; -- tempbx = tempbx + 8; -- if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) { -- tempbx = tempbx - 4; -- tempcx = tempbx; -- } -- -- temp = (tempbx & 0x00FF) << 4; -- XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part2Port, 0x29, 0x0F, temp); -- -- j += 2; -- tempcx += (TimingPoint[j] | ((TimingPoint[j + 1]) << 8)); -- temp = tempcx & 0x00FF; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x27, temp); -- temp = ((tempcx & 0xFF00) >> 8) << 4; -- XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part2Port, 0x28, 0x0F, temp); -- -- tempcx += 8; -- if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) { -- tempcx -= 4; -- } -- -- temp = tempcx & 0xFF; -- temp = temp << 4; -- XGI_SetRegANDOR((XGIIOADDRESS) 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; -- XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part2Port, 0x2D, 0x0F, temp); -- -- tempcx -= 11; -- -- if (!(pVBInfo->VBInfo & SetCRT2ToTV)) { -- tempax = XGI_GetVGAHT2(pVBInfo); -- tempcx = tempax - 1; -- } -- temp = tempcx & 0x00FF; -- XGI_SetReg((XGIIOADDRESS) 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; -- } -- } -- } -- -- XGI_SetReg((XGIIOADDRESS) 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; -- } -- } -- -- XGI_SetReg((XGIIOADDRESS) 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; -- -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x10, temp); -- } -- -- temp = (((tempbx - 3) & 0x0300) >> 8) << 5; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x46, temp); -- temp = (tempbx - 3) & 0x00FF; -- XGI_SetReg((XGIIOADDRESS) 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 = (USHORT) 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 = -- (USHORT) (((tempeax & 0x0000FF00) & 0x1F00) | (tempbx & 0x00FF)); -- tempax = (USHORT) (((tempeax & 0x000000FF) << 8) | (tempax & 0x00FF)); -- temp = (tempax & 0xFF00) >> 8; -- } -- else { -- temp = (tempax & 0x00FF) >> 8; -- } -- -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x44, temp); -- temp = (tempbx & 0xFF00) >> 8; -- XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part2Port, 0x45, ~0x03F, temp); -- temp = tempcx & 0x00FF; -- -- if (tempbx & 0x2000) -- temp = 0; -- -- if (!(pVBInfo->VBInfo & SetCRT2ToLCD)) -- temp |= 0x18; -- -- XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part2Port, 0x46, ~0x1F, temp); -- if (pVBInfo->TVInfo & SetPALTV) { -- tempbx = 0x0382; -- tempcx = 0x007e; -- } -- else { -- tempbx = 0x0369; -- tempcx = 0x0061; -- } -- -- temp = tempbx & 0x00FF; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x4b, temp); -- temp = tempcx & 0x00FF; -- XGI_SetReg((XGIIOADDRESS) 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; -- } -- -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x4d, temp); -- temp = XGI_GetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x43); /* 301b change */ -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x43, (USHORT) (temp - 3)); -- -- if (!(pVBInfo->TVInfo & (SetYPbPrMode525p | SetYPbPrMode750p))) { -- if (pVBInfo->TVInfo & NTSC1024x768) { -- TimingPoint = XGI_NTSC1024AdjTime; -- for (i = 0x1c, j = 0; i <= 0x30; i++, j++) { -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, i, -- TimingPoint[j]); -- } -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x43, 0x72); -- } -- } -- -- /* [ycchen] 01/14/03 Modify for 301C PALM Support */ -- if (pVBInfo->VBType & VB_XGI301C) { -- if (pVBInfo->TVInfo & SetPALMTV) -- XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part2Port, 0x4E, ~0x08, 0x08); /* PALM Mode */ -- } -- -- if (pVBInfo->TVInfo & SetPALMTV) { -- tempax = (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x01); -- tempax--; -- XGI_SetRegAND((XGIIOADDRESS) pVBInfo->Part2Port, 0x01, tempax); -- -- /* if ( !( pVBInfo->VBType & VB_XGI301C ) ) */ -- XGI_SetRegAND((XGIIOADDRESS) pVBInfo->Part2Port, 0x00, 0xEF); -- } -- -- if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) { -- if (!(pVBInfo->VBInfo & SetInSlaveMode)) { -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x0B, 0x00); -- } -- } -- -- if (pVBInfo->VBInfo & SetCRT2ToTV) { -- return; -- } -- ErrorF("5935 Part2 0 = %x ", -- XGI_GetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x0)); --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGI_SetLCDRegs */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --void --XGI_SetLCDRegs(USHORT ModeNo, USHORT ModeIdIndex, -- PXGI_HW_DEVICE_INFO HwDeviceExtension, -- USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo) --{ -- USHORT push1, -- push2, -- pushbx, -- tempax, -- tempbx, -- tempcx, temp, tempah, tempbh, tempch, resinfo, modeflag, CRT1Index; -- -- XGI_LCDDesStruct *LCDBDesPtr = NULL; -- XGI330_LCDDataDesStruct2 *LCDPtr1 = 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; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x2C, temp); -- temp = (tempbx & 0xFF00) >> 8; -- temp = temp << 4; -- XGI_SetRegANDOR((XGIIOADDRESS) 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; -- } -- } -- } -- -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x0B, temp); -- tempbx = pVBInfo->VDE; /* RTVACTEO=(VDE-1)&0xFF */ -- push1 = tempbx; -- tempbx--; -- temp = tempbx & 0x00FF; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x03, temp); -- temp = ((tempbx & 0xFF00) >> 8) & 0x07; -- XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part2Port, 0x0C, ~0x07, temp); -- -- tempcx = pVBInfo->VT - 1; -- push2 = tempcx + 1; -- temp = tempcx & 0x00FF; /* RVTVT=VT-1 */ -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x19, temp); -- temp = (tempcx & 0xFF00) >> 8; -- temp = temp << 5; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x1A, temp); -- XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part2Port, 0x09, 0xF0, 0x00); -- XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part2Port, 0x0A, 0xF0, 0x00); -- XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part2Port, 0x17, 0xFB, 0x00); -- XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part2Port, 0x18, 0xDF, 0x00); -- -- /* Customized LCDB Des no add */ -- LCDBDesPtr = (XGI_LCDDesStruct *) XGI_GetLcdPtr(5, ModeNo, ModeIdIndex, -- RefreshRateTableIndex, -- pVBInfo); -- -- if (pVBInfo->LCDInfo & EnableScalingLCD) { -- tempbx = pVBInfo->HDE; -- tempcx = pVBInfo->VDE; -- } -- else { -- get_HDE_VDE(pVBInfo, & tempbx, & tempcx); -- } -- -- 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 */ -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x05, temp); -- temp = tempcx & 0x00FF; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x06, temp); -- tempch = ((tempcx & 0xFF00) >> 8) & 0x07; -- tempbh = ((tempbx & 0xFF00) >> 8) & 0x07; -- tempah = tempch; -- tempah = tempah << 3; -- tempah |= tempbh; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x02, tempah); -- -- /* getlcdsync() */ -- XGI_GetLCDSync(&tempax, &tempbx, pVBInfo); -- if (pVBInfo->LCDInfo & EnableScalingLCD) { -- LCDPtr1 = -- (XGI330_LCDDataDesStruct2 *) XGI_GetLcdPtr(4, ModeNo, ModeIdIndex, -- RefreshRateTableIndex, -- pVBInfo); -- tempbx = LCDPtr1->LCDVSync; -- } -- tempcx = tempbx; -- tempax = pVBInfo->VT; -- tempbx = pVBInfo->LCDVRS; -- -- /* if ( SetLCD_Info & EnableScalingLCD ) */ -- tempcx += tempbx; -- if (tempcx >= tempax) -- tempcx -= tempax; -- -- temp = tempbx & 0x00FF; /* RTVACTEE=lcdvrs */ -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x04, temp); -- temp = (tempbx & 0xFF00) >> 8; -- temp = temp << 4; -- temp |= (tempcx & 0x000F); -- XGI_SetReg((XGIIOADDRESS) 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; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x1F, temp); /* RHBLKE=lcdhdes */ -- temp = ((tempbx & 0xFF00) >> 8) << 4; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x20, temp); -- temp = tempcx & 0x00FF; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x23, temp); /* RHEQPLE=lcdhdee */ -- temp = (tempcx & 0xFF00) >> 8; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x25, temp); -- -- /* getlcdsync() */ -- XGI_GetLCDSync(&tempax, &tempbx, pVBInfo); -- if (pVBInfo->LCDInfo & EnableScalingLCD) { -- LCDPtr1 = -- (XGI330_LCDDataDesStruct2 *) XGI_GetLcdPtr(4, ModeNo, ModeIdIndex, -- RefreshRateTableIndex, -- pVBInfo); -- tempax = LCDPtr1->LCDHSync; -- } -- 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 */ -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x1C, temp); -- -- temp = (tempbx & 0xFF00) >> 8; -- temp = temp << 4; -- XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part2Port, 0x1D, ~0x0F0, temp); -- temp = tempcx & 0x00FF; /* RHSYEXP2S=lcdhre */ -- XGI_SetReg((XGIIOADDRESS) 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; -- -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x2f, temp); -- XGI_SetReg((XGIIOADDRESS) 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; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x2f, temp); -- } -- } --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGI_GetTap4Ptr */ --/* Input : */ --/* Output : di -> Tap4 Reg. Setting Pointer */ --/* Description : */ --/* --------------------------------------------------------------------- */ --const XGI301C_Tap4TimingStruct * --XGI_GetTap4Ptr(USHORT tempcx, PVB_DEVICE_INFO pVBInfo) --{ -- USHORT tempax, tempbx, i; -- -- const 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(PVB_DEVICE_INFO pVBInfo) --{ -- --#ifndef LINUX_XF86 -- USHORT tempcx; --#endif -- USHORT i, j; -- -- const XGI301C_Tap4TimingStruct *Tap4TimingPtr; -- -- if (!(pVBInfo->VBType & VB_XGI301C)) -- return; -- --#ifndef Tap4 -- XGI_SetRegAND((XGIIOADDRESS) 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++) -- XGI_SetReg((XGIIOADDRESS) 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++) -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, i, -- Tap4TimingPtr->Reg[j]); -- } -- -- if ((pVBInfo->VBInfo & SetCRT2ToTV) -- && (!(pVBInfo->VBInfo & SetCRT2ToHiVisionTV))) -- XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part2Port, 0x4E, ~0x14, 0x04); /* Enable V.Scaling */ -- else -- XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part2Port, 0x4E, ~0x14, 0x10); /* Enable H.Scaling */ --#endif --} -- --/* --------------------------------------------------------------------- */ --/* Function : XGI_SetGroup3 */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --void --XGI_SetGroup3(USHORT ModeNo, USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo) --{ -- USHORT i; -- const UCHAR *tempdi; -- USHORT modeflag; -- -- if (ModeNo <= 0x13) { -- modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag; /* si+St_ResInfo */ -- } -- else { -- modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag; /* si+Ext_ResInfo */ -- } -- -- -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part3Port, 0x00, 0x00); -- if (pVBInfo->TVInfo & SetPALTV) { -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part3Port, 0x13, 0xFA); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part3Port, 0x14, 0xC8); -- } -- else { -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part3Port, 0x13, 0xF5); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part3Port, 0x14, 0xB7); -- } -- -- if (!(pVBInfo->VBInfo & SetCRT2ToTV)) { -- return; -- } -- -- if (pVBInfo->TVInfo & SetPALMTV) { -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part3Port, 0x13, 0xFA); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part3Port, 0x14, 0xC8); -- XGI_SetReg((XGIIOADDRESS) 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++) { -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part3Port, i, tempdi[i]); -- } -- if (pVBInfo->VBType & VB_XGI301C) { /* Marcovision */ -- if (pVBInfo->TVInfo & SetYPbPrMode525p) { -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part3Port, 0x28, 0x3f); -- } -- } -- } -- return; --} /* {end of XGI_SetGroup3} */ -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGI_SetGroup4 */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --void --XGI_SetGroup4(USHORT ModeNo, USHORT ModeIdIndex, USHORT RefreshRateTableIndex, -- PXGI_HW_DEVICE_INFO HwDeviceExtension, PVB_DEVICE_INFO pVBInfo) --{ -- USHORT tempax, tempcx, tempbx, modeflag, temp, temp2; --#ifndef LINUX_XF86 -- USHORT push1; --#endif -- -- ULONG 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; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x13, temp); -- -- tempbx = pVBInfo->RVBHCMAX; -- temp = tempbx & 0x00FF; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x14, temp); -- temp2 = ((tempbx & 0xFF00) >> 8) << 7; -- tempcx = pVBInfo->VGAHT - 1; -- temp = tempcx & 0x00FF; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x16, temp); -- -- temp = ((tempcx & 0xFF00) >> 8) << 3; -- temp2 |= temp; -- -- tempcx = pVBInfo->VGAVT - 1; -- if (!(pVBInfo->VBInfo & SetCRT2ToTV)) { -- tempcx -= 5; -- } -- -- temp = tempcx & 0x00FF; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x17, temp); -- temp = temp2 | ((tempcx & 0xFF00) >> 8); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x15, temp); -- XGI_SetRegOR((XGIIOADDRESS) 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; -- } -- XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part4Port, 0x0E, ~0xEF, temp); -- -- tempebx = pVBInfo->VDE; -- -- if (tempcx & SetCRT2ToHiVisionTV) { -- if (!(temp & 0xE000)) -- tempbx = tempbx >> 1; -- } -- -- tempcx = pVBInfo->RVBHRS; -- temp = tempcx & 0x00FF; -- XGI_SetReg((XGIIOADDRESS) 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 = (USHORT) (tempebx & 0x000000FF); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x1B, temp); -- -- temp = (USHORT) ((tempebx & 0x0000FF00) >> 8); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x1A, temp); -- tempbx = (USHORT) (tempebx >> 16); -- temp = tempbx & 0x00FF; -- temp = temp << 4; -- temp |= ((tempcx & 0xFF00) >> 8); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x19, temp); -- -- /* 301b */ -- if (pVBInfo-> -- VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | -- VB_XGI301C)) { -- temp = 0x0028; -- XGI_SetReg((XGIIOADDRESS) 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); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x1E, temp); -- temp = (tempax & 0x00FF); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x1D, temp); -- -- if (pVBInfo->VBInfo & (SetCRT2ToTV | SetCRT2ToHiVisionTV)) { -- if (pVBInfo->VGAHDE > 800) { -- XGI_SetRegOR((XGIIOADDRESS) 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); -- } -- } -- -- XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part4Port, 0x1F, 0x00C0, -- temp); -- tempbx = pVBInfo->HT; -- if (XGI_IsLCDDualLink(pVBInfo)) -- tempbx = tempbx >> 1; -- tempbx = (tempbx >> 1) - 2; -- temp = ((tempbx & 0x0700) >> 8) << 3; -- XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part4Port, 0x21, 0x00C0, -- temp); -- temp = tempbx & 0x00FF; -- XGI_SetReg((XGIIOADDRESS) 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(USHORT ModeNo, USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo) --{ -- USHORT 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 : */ --/* --------------------------------------------------------------------- */ --const void * --XGI_GetLcdPtr(USHORT BX, USHORT ModeNo, USHORT ModeIdIndex, -- USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo) --{ -- USHORT i, tempdx, tempcx, tempbx, tempal, modeflag, table; -- -- const 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; -- } -- -- if (pVBInfo->LCDInfo & EnableScalingLCD) { /* ScaleLCD */ -- if (pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO == 0x14) { -- tempal = 0x0A; -- } -- else if (pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO == 0x0F) { -- tempal = 0x0B; -- } -- } -- -- 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) { -- if ((pVBInfo->LCDInfo & EnableReduceTiming) -- && (pVBInfo->LCDResInfo == Panel1600x1200)) { -- tempdx = Panel1600x1200_1; -- } -- else { -- 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; -- case 19: -- return &XGI_NoScalingData_1[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; -- case 20: -- return &XGI_NoScalingDesData_1[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 : */ --/* --------------------------------------------------------------------- */ --const void * --XGI_GetTVPtr(USHORT BX, USHORT ModeNo, USHORT ModeIdIndex, -- USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo) --{ -- USHORT i, tempdx, tempbx, tempal, modeflag, table; -- const XGI330_TVDataTablStruct *tempdi = NULL; -- -- 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; */ -- break; -- case 1: -- tempdi = 0; /*EPLCHTVCRT1Ptr_V; */ -- 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 == 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) { -- switch (tempdi[i].DATAPTR) { -- case 0: -- return &XGI_CHTVRegUNTSC[tempal]; -- break; -- case 1: -- return &XGI_CHTVRegONTSC[tempal]; -- break; -- case 2: -- return &XGI_CHTVRegUPAL[tempal]; -- break; -- case 3: -- return &XGI_CHTVRegOPAL[tempal]; -- break; -- default: -- break; -- } -- } -- return (0); --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGI_BacklightByDrv */ --/* Input : */ --/* Output : TRUE -> Skip backlight control */ --/* Description : */ --/* --------------------------------------------------------------------- */ --BOOLEAN --XGI_BacklightByDrv(PVB_DEVICE_INFO pVBInfo) --{ -- UCHAR tempah; -- -- tempah = (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x3A); -- if (tempah & BacklightControlBit) -- return TRUE; -- else -- return FALSE; --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGI_FirePWDDisable */ --/* Input : */ --/* Output : */ --/* Description : Turn off VDD & Backlight : Fire disable procedure */ --/* --------------------------------------------------------------------- */ --/* --void XGI_FirePWDDisable( PVB_DEVICE_INFO pVBInfo ) --{ -- XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part1Port , 0x26 , 0x00 , 0xFC ) ; --} --*/ -- --/* --------------------------------------------------------------------- */ --/* Function : XGI_FirePWDEnable */ --/* Input : */ --/* Output : */ --/* Description : Turn on VDD & Backlight : Fire enable procedure */ --/* --------------------------------------------------------------------- */ --void --XGI_FirePWDEnable(PVB_DEVICE_INFO pVBInfo) --{ -- XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part1Port, 0x26, 0x03, 0xFC); --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGI_EnableGatingCRT */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --void --XGI_EnableGatingCRT(PXGI_HW_DEVICE_INFO HwDeviceExtension, -- PVB_DEVICE_INFO pVBInfo) --{ -- XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4, 0x63, 0xBF, 0x40); --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGI_DisableGatingCRT */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --void --XGI_DisableGatingCRT(PXGI_HW_DEVICE_INFO HwDeviceExtension, -- PVB_DEVICE_INFO pVBInfo) --{ -- -- XGI_SetRegANDOR((XGIIOADDRESS) 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(USHORT tempbl, PVB_DEVICE_INFO pVBInfo) --{ -- USHORT index; --#ifndef LINUX_XF86 -- USHORT temp; --#endif -- -- 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(USHORT tempah, USHORT tempbl, PVB_DEVICE_INFO pVBInfo) --{ -- if (pVBInfo->VBType & (VB_XGI301LV | VB_XGI302LV | VB_XGI301C)) -- XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part4Port, 0x26, tempbl, -- tempah); -- else -- XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3c4, 0x11, tempbl, tempah); --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGI_IsLCDON */ --/* Input : */ --/* Output : FALSE : Skip PSC Control */ --/* TRUE: Disable PSC */ --/* Description : */ --/* --------------------------------------------------------------------- */ --BOOLEAN --XGI_IsLCDON(PVB_DEVICE_INFO pVBInfo) --{ -- USHORT tempax; -- -- tempax = pVBInfo->VBInfo; -- if (tempax & SetCRT2ToDualEdge) -- return FALSE; -- else if (tempax & (DisableCRT2Display | SwitchToCRT2 | SetSimuScanMode)) -- return TRUE; -- -- return FALSE; --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGI_EnablePWD */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --void --XGI_EnablePWD(PVB_DEVICE_INFO pVBInfo) --{ -- USHORT index, temp; -- -- index = XGI_GetLCDCapPtr(pVBInfo); -- temp = pVBInfo->LCDCapList[index].PWD_2B; -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x2B, temp); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x2C, -- pVBInfo->LCDCapList[index].PWD_2C); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x2D, -- pVBInfo->LCDCapList[index].PWD_2D); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x2E, -- pVBInfo->LCDCapList[index].PWD_2E); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x2F, -- pVBInfo->LCDCapList[index].PWD_2F); -- XGI_SetRegOR((XGIIOADDRESS) pVBInfo->Part4Port, 0x27, 0x80); /* enable PWD */ --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGI_DisablePWD */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --void --XGI_DisablePWD(PVB_DEVICE_INFO pVBInfo) --{ -- XGI_SetRegAND((XGIIOADDRESS) pVBInfo->Part4Port, 0x27, 0x7F); /* disable PWD */ --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGI_DisableChISLCD */ --/* Input : */ --/* Output : FALSE -> Not LCD Mode */ --/* Description : */ --/* --------------------------------------------------------------------- */ --BOOLEAN --XGI_DisableChISLCD(PVB_DEVICE_INFO pVBInfo) --{ -- USHORT tempbx, tempah; -- -- tempbx = pVBInfo->SetFlag & (DisableChA | DisableChB); -- tempah = ~((USHORT) XGI_GetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x2E)); -- -- if (tempbx & (EnableChA | DisableChA)) { -- if (!(tempah & 0x08)) /* Chk LCDA Mode */ -- return FALSE; -- } -- -- if (!(tempbx & (EnableChB | DisableChB))) -- return FALSE; -- -- if (tempah & 0x01) /* Chk LCDB Mode */ -- return TRUE; -- -- return FALSE; --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGI_EnableChISLCD */ --/* Input : */ --/* Output : 0 -> Not LCD mode */ --/* Description : */ --/* --------------------------------------------------------------------- */ --BOOLEAN --XGI_EnableChISLCD(PVB_DEVICE_INFO pVBInfo) --{ -- USHORT tempbx, tempah; -- -- -- tempbx = pVBInfo->SetFlag & (EnableChA | EnableChB); -- tempah = ~((USHORT) XGI_GetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x2E)); -- -- if (tempbx & (EnableChA | DisableChA)) { -- if (!(tempah & 0x08)) /* Chk LCDA Mode */ -- return FALSE; -- } -- -- if (!(tempbx & (EnableChB | DisableChB))) -- return FALSE; -- -- if (tempah & 0x01) /* Chk LCDB Mode */ -- return TRUE; -- -- return FALSE; --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGI_GetLCDCapPtr */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --USHORT --XGI_GetLCDCapPtr(PVB_DEVICE_INFO pVBInfo) --{ -- UCHAR tempal, tempah, tempbl, i; -- -- tempah = XGI_GetReg((XGIIOADDRESS) 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 : */ --/* --------------------------------------------------------------------- */ --USHORT --XGI_GetLCDCapPtr1(PVB_DEVICE_INFO pVBInfo) --{ -- USHORT 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(USHORT * HSyncWidth, USHORT * VSyncWidth, -- PVB_DEVICE_INFO pVBInfo) --{ -- USHORT 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(PXGI_HW_DEVICE_INFO HwDeviceExtension, -- PVB_DEVICE_INFO pVBInfo) --{ --#ifndef LINUX_XF86 -- USHORT tempax; --#endif -- USHORT tempbl, tempah; -- -- if (pVBInfo->SetFlag == Win9xDOSMode) { -- if (pVBInfo-> -- VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | -- VB_XGI301C)) { -- XGI_DisplayOn(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) { -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x1E, 0x20); /* Power on */ -- } -- else { -- if (pVBInfo->VBInfo & SetCRT2ToDualEdge) { /* SetCRT2ToLCDA ) */ -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x1E, 0x20); /* Power on */ -- } -- } -- } -- -- if (!(pVBInfo->SetFlag & DisableChB)) { -- if ((pVBInfo->SetFlag & EnableChB) -- || (pVBInfo-> -- VBInfo & (SetCRT2ToLCD | SetCRT2ToTV | SetCRT2ToRAMDAC))) -- { -- tempah = -- (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x32); -- tempah &= 0xDF; -- if (pVBInfo->VBInfo & SetInSlaveMode) { -- if (!(pVBInfo->VBInfo & SetCRT2ToRAMDAC)) -- tempah |= 0x20; -- } -- XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x32, tempah); -- XGI_SetRegOR((XGIIOADDRESS) pVBInfo->P3c4, 0x1E, -- SR1E_ENABLE_CRT2); -- -- -- tempah = -- (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->Part1Port, -- 0x2E); -- -- if (!(tempah & 0x80)) -- XGI_SetRegOR((XGIIOADDRESS) pVBInfo->Part1Port, 0x2E, 0x80); /* BVBDOENABLE = 1 */ -- -- XGI_SetRegAND((XGIIOADDRESS) pVBInfo->Part1Port, 0x00, 0x7F); /* BScreenOFF = 0 */ -- } -- } -- -- if ((pVBInfo->SetFlag & (EnableChA | EnableChB)) -- || (!(pVBInfo->VBInfo & DisableCRT2Display))) { -- XGI_SetRegANDOR((XGIIOADDRESS) 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))) -- XGI_SetRegAND((XGIIOADDRESS) pVBInfo->Part4Port, 0x2A, 0x7F); /* LVDS PLL power on */ -- } -- XGI_SetRegAND((XGIIOADDRESS) 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; -- } -- } -- } -- } -- -- XGI_SetRegOR((XGIIOADDRESS) pVBInfo->Part4Port, 0x1F, tempah); /* EnablePart4_1F */ -- -- if (pVBInfo->SetFlag & Win9xDOSMode) { -- XGI_DisplayOn(pVBInfo); -- return; -- } -- -- if (!(pVBInfo->SetFlag & DisableChA)) { -- XGI_VBLongWait(pVBInfo); -- if (!(pVBInfo->SetFlag & GatingCRT)) { -- XGI_DisableGatingCRT(HwDeviceExtension, pVBInfo); -- XGI_DisplayOn(pVBInfo); -- XGI_VBLongWait(pVBInfo); -- } -- } -- } /* 301 */ -- else { /* LVDS */ -- -- if (pVBInfo->VBInfo & (SetCRT2ToTV | SetCRT2ToLCD | SetCRT2ToLCDA)) -- XGI_SetRegOR((XGIIOADDRESS) pVBInfo->Part1Port, 0x1E, 0x20); /* enable CRT2 */ -- -- -- -- tempah = (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x2E); -- if (!(tempah & 0x80)) -- XGI_SetRegOR((XGIIOADDRESS) pVBInfo->Part1Port, 0x2E, 0x80); /* BVBDOENABLE = 1 */ -- -- XGI_SetRegAND((XGIIOADDRESS) pVBInfo->Part1Port, 0x00, 0x7F); -- XGI_DisplayOn(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(PXGI_HW_DEVICE_INFO HwDeviceExtension, -- PVB_DEVICE_INFO pVBInfo) --{ -- USHORT 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 (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 */ -- } -- } -- } -- -- XGI_SetRegAND((XGIIOADDRESS) 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))) -- XGI_SetRegOR((XGIIOADDRESS) 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(pVBInfo); -- } -- -- if (pVBInfo->VBInfo & SetCRT2ToLCDA) { -- if ((pVBInfo->SetFlag & DisableChA) -- || (pVBInfo->VBInfo & SetCRT2ToLCDA)) -- XGI_SetRegAND((XGIIOADDRESS) pVBInfo->Part1Port, 0x1e, 0xdf); /* Power down */ -- } -- -- XGI_SetRegAND((XGIIOADDRESS) pVBInfo->P3c4, 0x32, 0xdf); /* disable TV as primary VGA swap */ -- -- if ((pVBInfo->VBInfo & (SetSimuScanMode | SetCRT2ToDualEdge))) -- XGI_SetRegAND((XGIIOADDRESS) pVBInfo->Part2Port, 0x00, 0xdf); -- -- if ((pVBInfo->SetFlag & DisableChB) -- || (pVBInfo->VBInfo & (DisableCRT2Display | SetSimuScanMode)) -- || ((!(pVBInfo->VBInfo & SetCRT2ToLCDA)) -- && (pVBInfo-> -- VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToLCD | SetCRT2ToTV)))) -- XGI_SetRegOR((XGIIOADDRESS) pVBInfo->Part1Port, 0x00, 0x80); /* BScreenOff=1 */ -- -- if ((pVBInfo->SetFlag & DisableChB) -- || (pVBInfo->VBInfo & (DisableCRT2Display | SetSimuScanMode)) -- || (!(pVBInfo->VBInfo & SetCRT2ToLCDA)) -- || (pVBInfo-> -- VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToLCD | SetCRT2ToTV))) { -- tempah = XGI_GetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x00); /* save Part1 index 0 */ -- XGI_SetRegOR((XGIIOADDRESS) pVBInfo->Part1Port, 0x00, 0x10); /* BTDAC = 1, avoid VB reset */ -- XGI_SetRegAND((XGIIOADDRESS) pVBInfo->Part1Port, 0x1E, 0xDF); /* disable CRT2 */ -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x00, tempah); /* restore Part1 index 0 */ -- } -- } -- else { /* {301} */ -- -- if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToTV)) { -- XGI_SetRegOR((XGIIOADDRESS) pVBInfo->Part1Port, 0x00, 0x80); /* BScreenOff=1 */ -- XGI_SetRegAND((XGIIOADDRESS) pVBInfo->Part1Port, 0x1E, 0xDF); /* Disable CRT2 */ -- XGI_SetRegAND((XGIIOADDRESS) pVBInfo->P3c4, 0x32, 0xDF); /* Disable TV asPrimary VGA swap */ -- } -- -- if (pVBInfo-> -- VBInfo & (DisableCRT2Display | SetCRT2ToLCDA | SetSimuScanMode)) -- XGI_DisplayOff(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 */ --/* --------------------------------------------------------------------- */ --USHORT --XGI_GetTVPtrIndex(PVB_DEVICE_INFO pVBInfo) --{ -- USHORT 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(USHORT ModeNo, USHORT ModeIdIndex, PVB_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(PVB_DEVICE_INFO pVBInfo) --{ -- USHORT index; -- -- UCHAR tempah, tempbl, tempbh; --#ifndef LINUX_XF86 -- UCHAR temp; --#endif -- -- 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 = XGI_GetReg((XGIIOADDRESS) 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; -- } -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x2D, tempah); -- } -- } --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGI_SetLCDCap */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --void --XGI_SetLCDCap(PVB_DEVICE_INFO pVBInfo) --{ -- USHORT 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 */ -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x24, -- (UCHAR) (tempcx & 0x1F)); -- } -- /* VB Driving */ -- XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part4Port, 0x0D, -- ~((EnableVBCLKDRVLOW | EnablePLLSPLOW) >> 8), -- (USHORT) ((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(USHORT tempcx, PVB_DEVICE_INFO pVBInfo) --{ -- USHORT temp; -- -- temp = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x37); -- -- if (temp & LCDRGB18Bit) { -- XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part1Port, 0x19, 0x0F, (USHORT) (0x20 | (tempcx & 0x00C0))); /* Enable Dither */ -- XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part1Port, 0x1A, 0x7F, 0x80); -- } -- else { -- XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part1Port, 0x19, 0x0F, -- (USHORT) (0x30 | (tempcx & 0x00C0))); -- XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part1Port, 0x1A, 0x7F, 0x00); -- } -- --/* -- if ( tempcx & EnableLCD24bpp ) // 24bits -- { -- XGI_SetRegANDOR((XGIIOADDRESS)pVBInfo->Part1Port,0x19, 0x0F,(USHORT)(0x30|(tempcx&0x00C0)) ); -- XGI_SetRegANDOR((XGIIOADDRESS)pVBInfo->Part1Port,0x1A,0x7F,0x00); -- } -- else -- { -- XGI_SetRegANDOR((XGIIOADDRESS)pVBInfo->Part1Port,0x19, 0x0F,(USHORT)(0x20|(tempcx&0x00C0)) );//Enable Dither -- XGI_SetRegANDOR((XGIIOADDRESS)pVBInfo->Part1Port,0x1A,0x7F,0x80); -- } --*/ --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGI_SetLCDCap_B */ --/* Input : cx -> LCD Capability */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --void --XGI_SetLCDCap_B(USHORT tempcx, PVB_DEVICE_INFO pVBInfo) --{ -- if (tempcx & EnableLCD24bpp) /* 24bits */ -- XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part2Port, 0x1A, 0xE0, -- (USHORT) (((tempcx & 0x00ff) >> 6) | 0x0c)); -- else -- XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part2Port, 0x1A, 0xE0, (USHORT) (((tempcx & 0x00ff) >> 6) | 0x18)); /* Enable Dither */ --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : SetSpectrum */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --void --SetSpectrum(PVB_DEVICE_INFO pVBInfo) --{ -- USHORT index; -- -- index = XGI_GetLCDCapPtr(pVBInfo); -- -- XGI_SetRegAND((XGIIOADDRESS) pVBInfo->Part4Port, 0x30, 0x8F); /* disable down spectrum D[4] */ -- XGI_WaitEndRetrace(pVBInfo->RelIO); -- XGI_SetRegOR((XGIIOADDRESS) pVBInfo->Part4Port, 0x30, 0x20); /* reset spectrum */ -- XGI_WaitEndRetrace(pVBInfo->RelIO); -- -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x31, -- pVBInfo->LCDCapList[index].Spectrum_31); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x32, -- pVBInfo->LCDCapList[index].Spectrum_32); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x33, -- pVBInfo->LCDCapList[index].Spectrum_33); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x34, -- pVBInfo->LCDCapList[index].Spectrum_34); -- XGI_WaitEndRetrace(pVBInfo->RelIO); -- XGI_SetRegOR((XGIIOADDRESS) pVBInfo->Part4Port, 0x30, 0x40); /* enable spectrum */ --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGI_SetAntiFlicker */ --/* Input : */ --/* Output : */ --/* Description : Set TV Customized Param. */ --/* --------------------------------------------------------------------- */ --void --XGI_SetAntiFlicker(USHORT ModeNo, USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo) --{ -- USHORT tempbx, index; -- -- UCHAR 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; -- -- XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part2Port, 0x0A, 0x8F, tempah); --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGI_SetEdgeEnhance */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --void --XGI_SetEdgeEnhance(USHORT ModeNo, USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo) --{ -- USHORT tempbx, index; -- -- UCHAR 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; -- -- XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part2Port, 0x3A, 0x1F, tempah); --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGI_SetPhaseIncr */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --void --XGI_SetPhaseIncr(PVB_DEVICE_INFO pVBInfo) --{ -- USHORT tempbx; -- -- UCHAR tempcl, tempch; -- -- ULONG tempData; -- -- XGI_GetTVPtrIndex2(&tempbx, &tempcl, &tempch, pVBInfo); /* bx, cl, ch */ -- tempData = TVPhaseList[tempbx]; -- -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x31, -- (USHORT) (tempData & 0x000000FF)); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x32, -- (USHORT) ((tempData & 0x0000FF00) >> 8)); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x33, -- (USHORT) ((tempData & 0x00FF0000) >> 16)); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x34, -- (USHORT) ((tempData & 0xFF000000) >> 24)); --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGI_SetYFilter */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --void --XGI_SetYFilter(USHORT ModeNo, USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo) --{ -- USHORT tempbx, index; -- -- UCHAR tempcl, tempch, tempal; -- const UCHAR *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)) { -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x35, 0); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x36, 0); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x37, 0); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x38, -- filterPtr[index++]); -- } -- else { -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x35, -- filterPtr[index++]); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x36, -- filterPtr[index++]); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x37, -- filterPtr[index++]); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x38, -- filterPtr[index++]); -- } -- -- if (pVBInfo-> -- VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | -- VB_XGI301C)) { -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x48, -- filterPtr[index++]); -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x49, -- filterPtr[index++]); -- XGI_SetReg((XGIIOADDRESS) 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(USHORT * tempbx, UCHAR * tempcl, UCHAR * tempch, -- PVB_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(USHORT ModeNo, PXGI_HW_DEVICE_INFO HwDeviceExtension, -- PVB_DEVICE_INFO pVBInfo) --{ --#ifndef LINUX_XF86 -- USHORT i, j; --#endif -- USHORT tempbl; -- SHORT tempcl; -- -- UCHAR tempah; -- -- /* XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port , 0x03 , 0x00 ) ; // fix write part1 index 0 BTDRAM bit Bug */ -- tempah = 0; -- if (!(pVBInfo->VBInfo & DisableCRT2Display)) { -- tempah = XGI_GetReg((XGIIOADDRESS) 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 ; -- } -- -- XGI_SetReg((XGIIOADDRESS) 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 ) ; -- } -- } --*/ -- -- XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x00, tempah); -- tempah = 0x08; -- tempbl = 0xf0; -- -- if (pVBInfo->VBInfo & DisableCRT2Display) -- XGI_SetRegANDOR((XGIIOADDRESS) 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; -- XGI_SetRegANDOR((XGIIOADDRESS) 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; -- XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part1Port, 0x2e, -- tempbl, tempah); -- } -- else -- XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part1Port, 0x2e, -- tempbl, tempah); -- } -- } -- else -- XGI_SetRegANDOR((XGIIOADDRESS) 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; -- } -- /* } */ -- } -- -- XGI_SetRegANDOR((XGIIOADDRESS) 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; -- -- XGI_SetReg((XGIIOADDRESS) 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 */ -- } -- -- XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part1Port, 0x13, tempbl, -- tempah); -- tempah = 0x00; -- tempbl = 0xcf; -- if (!(pVBInfo->VBInfo & DisableCRT2Display)) { -- if (pVBInfo->VBInfo & SetCRT2ToDualEdge) -- tempah |= 0x30; -- } -- -- XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part1Port, 0x2c, tempbl, -- tempah); -- tempah = 0; -- tempbl = 0x3f; -- -- if (!(pVBInfo->VBInfo & DisableCRT2Display)) { -- if (pVBInfo->VBInfo & SetCRT2ToDualEdge) -- tempah |= 0xc0; -- } -- XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part4Port, 0x21, tempbl, -- tempah); -- } -- -- tempah = 0; -- tempbl = 0x7f; -- if (!(pVBInfo->VBInfo & SetCRT2ToLCDA)) { -- tempbl = 0xff; -- if (!(pVBInfo->VBInfo & SetCRT2ToDualEdge)) -- tempah |= 0x80; -- } -- -- XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part4Port, 0x23, tempbl, tempah); -- -- if (pVBInfo->VBType & (VB_XGI302LV | VB_XGI301C)) { -- if (pVBInfo->LCDInfo & SetLCDDualLink) { -- XGI_SetRegOR((XGIIOADDRESS) pVBInfo->Part4Port, 0x27, 0x20); -- XGI_SetRegOR((XGIIOADDRESS) pVBInfo->Part4Port, 0x34, 0x10); -- } -- } --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGI_GetRAMDAC2DATA */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --void --XGI_GetRAMDAC2DATA(USHORT ModeNo, USHORT ModeIdIndex, -- USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo) --{ -- USHORT tempax, tempbx, temp1, temp2, modeflag = 0, tempcx, CRT1Index; --#ifndef LINUX_XF86 -- USHORT temp, ResInfo, DisplayType; --#endif -- -- pVBInfo->RVBHCMAX = 1; -- pVBInfo->RVBHCFACT = 1; -- -- if (ModeNo <= 0x13) { -- const USHORT StandTableIndex = XGI_GetModePtr(pVBInfo->SModeIDTable, -- pVBInfo->ModeType, -- ModeNo, ModeIdIndex); -- -- modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag; -- 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 = (USHORT) pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[0]; -- temp2 = (USHORT) pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[5]; -- tempax = (temp1 & 0xFF) | ((temp2 & 0x03) << 8); -- tempbx = (USHORT) pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[8]; -- tempcx = (USHORT) pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[14] << 8; -- tempcx &= 0x0100; -- tempcx = tempcx << 2; -- tempbx |= tempcx; -- temp1 = (USHORT) 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 : */ --/* --------------------------------------------------------------------- */ --USHORT --XGI_GetColorDepth(USHORT ModeNo, USHORT ModeIdIndex, -- const VB_DEVICE_INFO *pVBInfo) --{ -- USHORT ColorDepth[6] = { 1, 2, 4, 4, 6, 8 }; -- SHORT index; -- USHORT 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(PXGI_HW_DEVICE_INFO HwDeviceExtension, PVB_DEVICE_INFO pVBInfo) --{ -- -- XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part1Port, 0x2f, 0xFF, 0x01); -- --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGI_LockCRT2 */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --void --XGI_LockCRT2(PXGI_HW_DEVICE_INFO HwDeviceExtension, PVB_DEVICE_INFO pVBInfo) --{ -- XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part1Port, 0x2F, 0xFE, 0x00); --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGINew_EnableCRT2 */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --void --XGINew_EnableCRT2(PVB_DEVICE_INFO pVBInfo) --{ -- XGI_SetRegOR((XGIIOADDRESS) pVBInfo->P3c4, 0x1E, SR1E_ENABLE_CRT2); --} -- -- -- --/* --------------------------------------------------------------------- */ --/* Function : */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --void --XGINew_LCD_Wait_Time(UCHAR DelayTime, PVB_DEVICE_INFO pVBInfo) --{ -- USHORT i, j; -- -- ULONG temp, flag; -- -- flag = 0; -- -- for (i = 0; i < DelayTime; i++) { -- for (j = 0; j < 66; j++) { -- temp = XGI_GetRegLong((XGIIOADDRESS) 0x61); -- temp &= 0x10; -- -- if (temp == flag) -- continue; -- -- flag = temp; -- } -- } --} -- -- -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGI_BridgeIsOn */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --BOOLEAN --XGI_BridgeIsOn(PVB_DEVICE_INFO pVBInfo) --{ -- USHORT flag; -- -- flag = XGI_GetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x00); -- if ((flag == 1) || (flag == 2)) -- return (1); /* 301b */ -- else -- return (0); --} -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGI_VBLongWait */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --void --XGI_VBLongWait(PVB_DEVICE_INFO pVBInfo) --{ -- USHORT tempal, temp, i, j; -- -- if (!(pVBInfo->VBInfo & SetCRT2ToTV)) { -- temp = 0; -- for (i = 0; i < 3; i++) { -- for (j = 0; j < 100; j++) { -- tempal = XGI_GetRegByte((XGIIOADDRESS) 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_WaitEndRetrace(pVBInfo->RelIO); -- } -- return; --} -- -- -- -- --/* --------------------------------------------------------------------- */ --/* Function : XGI_GetVGAHT2 */ --/* Input : */ --/* Output : */ --/* Description : */ --/* --------------------------------------------------------------------- */ --USHORT --XGI_GetVGAHT2(PVB_DEVICE_INFO pVBInfo) --{ -- ULONG tempax, tempbx; -- -- tempbx = -- ((pVBInfo->VGAVT - pVBInfo->VGAVDE) * pVBInfo->RVBHCMAX) & 0xFFFF; -- tempax = (pVBInfo->VT - pVBInfo->VDE) * pVBInfo->RVBHCFACT; -- tempax = (tempax * pVBInfo->HT) / tempbx; -- -- return ((USHORT) tempax); --} -- -- --/** -- * Get magic index into clock table. -- * -- * \bugs -- * I'm pretty sure the first if-statement is wrong. It will \b always -- * evaluate to true. -- */ --unsigned --XGI_GetVCLK2Ptr(USHORT ModeNo, USHORT ModeIdIndex, -- USHORT RefreshRateTableIndex, -- PVB_DEVICE_INFO pVBInfo) --{ -- unsigned VCLKIndex; -- const unsigned modeflag = (ModeNo <= 0x13) -- ? pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag -- : pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag; -- -- -- if (((pVBInfo->VBInfo & SetCRT2ToLCD) | SetCRT2ToLCDA)) { /*301b */ -- VCLKIndex = (pVBInfo->LCDResInfo != Panel1024x768) -- ? (VCLK108_2 + 5) : (VCLK65 + 2); -- } -- else { /* for TV */ -- if (pVBInfo->VBInfo & SetCRT2ToTV) { -- if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) { -- VCLKIndex = (pVBInfo->SetFlag & RPLLDIV2XO) -- ? HiTVVCLKDIV2 : HiTVVCLK; -- -- VCLKIndex += 25; -- -- if (pVBInfo->SetFlag & TVSimuMode) { -- VCLKIndex = (modeflag & Charx8Dot) -- ? HiTVSimuVCLK : HiTVTextVCLK; -- -- VCLKIndex += 25; -- } -- -- if (pVBInfo->VBType & VB_XGI301LV) { -- switch (pVBInfo->VBExtInfo) { -- case VB_YPbPr1080i: -- /* VCLKIndex already set to correct value? */ -- break; -- case VB_YPbPr750p: -- VCLKIndex = YPbPr750pVCLK; -- break; -- case VB_YPbPr525p: -- VCLKIndex = YPbPr525pVCLK; -- break; -- case VB_YPbPr525i: -- VCLKIndex = (pVBInfo->SetFlag & RPLLDIV2XO) -- ? YPbPr525iVCLK_2 : YPbPr525iVCLK; -- break; -- } -- } -- } -- else { -- VCLKIndex = (pVBInfo->SetFlag & RPLLDIV2XO) -- ? TVVCLKDIV2 : TVVCLK; -- -- VCLKIndex += 25; -- } -- } -- else { /* for CRT2 */ -- VCLKIndex = XGI_GetRegByte((XGIIOADDRESS) (pVBInfo->P3ca + 0x02)); -- VCLKIndex = ((VCLKIndex >> 2) & 0x03); -- if (ModeNo > 0x13) { -- VCLKIndex = -- (pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRTVCLK -- & IndexMask); -- } -- } -- } -- -- return VCLKIndex; --} -+/* Copyright (C) 2003-2006 by XGI Technology, Taiwan. -+ * -+ * All Rights Reserved. -+ * -+ * Permission is hereby granted, free of charge, to any person obtaining -+ * a copy of this software and associated documentation files (the -+ * "Software"), to deal in the Software without restriction, including -+ * without limitation on the rights to use, copy, modify, merge, -+ * publish, distribute, sublicense, and/or sell copies of the Software, -+ * and to permit persons to whom the Software is furnished to do so, -+ * subject to the following conditions: -+ * -+ * The above copyright notice and this permission notice (including the -+ * next paragraph) shall be included in all copies or substantial -+ * portions of the Software. -+ * -+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -+ * NON-INFRINGEMENT. IN NO EVENT SHALL XGI AND/OR -+ * ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -+ * DEALINGS IN THE SOFTWARE. -+ */ -+#ifdef HAVE_CONFIG_H -+#include "config.h" -+#endif -+ -+#include "osdef.h" -+ -+#ifdef LINUX_XF86 -+#include "xf86.h" -+#include "xf86PciInfo.h" -+#include "xgi.h" -+#include "xgi_regs.h" -+#endif -+ -+#ifdef LINUX_KERNEL -+#include -+#include -+#include -+#include "XGIfb.h" -+#endif -+ -+#include "vb_def.h" -+#include "vgatypes.h" -+#include "vb_struct.h" -+#include "vb_table.h" -+#include "vb_setmode.h" -+ -+#define IndexMask 0xff -+#ifndef XGI_MASK_DUAL_CHIP -+#define XGI_MASK_DUAL_CHIP 0x04 /* SR3A */ -+#endif -+ -+ -+BOOLEAN CheckDualChip(PVB_DEVICE_INFO pVBInfo); -+static BOOLEAN XGI_IsLCDDualLink(PVB_DEVICE_INFO pVBInfo); -+BOOLEAN XGI_SetCRT2Group301(USHORT ModeNo, -+ PXGI_HW_DEVICE_INFO HwDeviceExtension, -+ PVB_DEVICE_INFO pVBInfo); -+BOOLEAN XGI_BacklightByDrv(PVB_DEVICE_INFO pVBInfo); -+ -+BOOLEAN XGI_IsLCDON(PVB_DEVICE_INFO pVBInfo); -+BOOLEAN XGI_DisableChISLCD(PVB_DEVICE_INFO pVBInfo); -+BOOLEAN XGI_EnableChISLCD(PVB_DEVICE_INFO pVBInfo); -+BOOLEAN XGI_AjustCRT2Rate(USHORT ModeNo, USHORT ModeIdIndex, -+ USHORT RefreshRateTableIndex, USHORT * i, -+ PVB_DEVICE_INFO pVBInfo); -+BOOLEAN XGI_GetLCDInfo(USHORT ModeNo, USHORT ModeIdIndex, -+ PVB_DEVICE_INFO pVBInfo); -+BOOLEAN XGI_BridgeIsOn(PVB_DEVICE_INFO pVBInfo); -+USHORT XGI_GetOffset(USHORT ModeNo, USHORT ModeIdIndex, -+ USHORT RefreshRateTableIndex, -+ PXGI_HW_DEVICE_INFO HwDeviceExtension, -+ PVB_DEVICE_INFO pVBInfo); -+USHORT XGI_GetRatePtrCRT2(PXGI_HW_DEVICE_INFO HwDeviceExtension, USHORT ModeNo, USHORT ModeIdIndex, -+ PVB_DEVICE_INFO pVBInfo); -+USHORT XGI_GetResInfo(USHORT ModeNo, USHORT ModeIdIndex, -+ PVB_DEVICE_INFO pVBInfo); -+USHORT XGI_GetVGAHT2(PVB_DEVICE_INFO pVBInfo); -+static unsigned XGI_GetVCLK2Ptr(USHORT ModeNo, USHORT ModeIdIndex, -+ USHORT RefreshRateTableIndex, -+ PVB_DEVICE_INFO pVBInfo); -+void XGI_VBLongWait(PVB_DEVICE_INFO pVBInfo); -+void XGI_SaveCRT2Info(USHORT ModeNo, PVB_DEVICE_INFO pVBInfo); -+void XGI_GetCRT2Data(USHORT ModeNo, USHORT ModeIdIndex, -+ USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo); -+void XGI_GetCRT2ResInfo(USHORT ModeNo, USHORT ModeIdIndex, -+ PVB_DEVICE_INFO pVBInfo); -+void XGI_PreSetGroup1(USHORT ModeNo, USHORT ModeIdIndex, -+ PXGI_HW_DEVICE_INFO HwDeviceExtension, -+ USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo); -+void XGI_SetGroup1(USHORT ModeNo, USHORT ModeIdIndex, -+ PXGI_HW_DEVICE_INFO HwDeviceExtension, -+ USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo); -+void XGI_SetLockRegs(USHORT ModeNo, USHORT ModeIdIndex, -+ PXGI_HW_DEVICE_INFO HwDeviceExtension, -+ USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo); -+void XGI_SetLCDRegs(USHORT ModeNo, USHORT ModeIdIndex, -+ PXGI_HW_DEVICE_INFO HwDeviceExtension, -+ USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo); -+void XGI_SetGroup2(USHORT ModeNo, USHORT ModeIdIndex, -+ USHORT RefreshRateTableIndex, -+ PXGI_HW_DEVICE_INFO HwDeviceExtension, -+ PVB_DEVICE_INFO pVBInfo); -+void XGI_SetGroup3(USHORT ModeNo, USHORT ModeIdIndex, -+ PVB_DEVICE_INFO pVBInfo); -+void XGI_SetGroup4(USHORT ModeNo, USHORT ModeIdIndex, -+ USHORT RefreshRateTableIndex, -+ PXGI_HW_DEVICE_INFO HwDeviceExtension, -+ PVB_DEVICE_INFO pVBInfo); -+void XGI_SetGroup5(USHORT ModeNo, USHORT ModeIdIndex, -+ PVB_DEVICE_INFO pVBInfo); -+static const void *XGI_GetLcdPtr(USHORT BX, USHORT ModeNo, USHORT ModeIdIndex, -+ USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo); -+static const void *XGI_GetTVPtr(USHORT BX, USHORT ModeNo, USHORT ModeIdIndex, -+ USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo); -+void XGI_FirePWDEnable(PVB_DEVICE_INFO pVBInfo); -+void XGI_EnableGatingCRT(PXGI_HW_DEVICE_INFO HwDeviceExtension, -+ PVB_DEVICE_INFO pVBInfo); -+void XGI_DisableGatingCRT(PXGI_HW_DEVICE_INFO HwDeviceExtension, -+ PVB_DEVICE_INFO pVBInfo); -+void XGI_SetPanelDelay(USHORT tempbl, PVB_DEVICE_INFO pVBInfo); -+void XGI_SetPanelPower(USHORT tempah, USHORT tempbl, PVB_DEVICE_INFO pVBInfo); -+void XGI_EnablePWD(PVB_DEVICE_INFO pVBInfo); -+void XGI_DisablePWD(PVB_DEVICE_INFO pVBInfo); -+void XGI_AutoThreshold(PVB_DEVICE_INFO pVBInfo); -+void XGI_SetTap4Regs(PVB_DEVICE_INFO pVBInfo); -+void SetDualChipRegs(PXGI_HW_DEVICE_INFO, PVB_DEVICE_INFO pVBInfo); -+void XGI_DisplayOn(PXGI_HW_DEVICE_INFO HwDeviceExtension, PVB_DEVICE_INFO pVBInfo); -+void XGI_DisplayOff(PXGI_HW_DEVICE_INFO HwDeviceExtension,PVB_DEVICE_INFO pVBInfo); -+void XGI_SetCRT1Group(PXGI_HW_DEVICE_INFO HwDeviceExtension, USHORT ModeNo, -+ USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo); -+/* Jong 10/03/2007 */ -+void XGI_SetXG21CRTC(USHORT ModeNo, USHORT ModeIdIndex, USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo); -+void XGI_SetXG21LCD(PVB_DEVICE_INFO pVBInfo,USHORT RefreshRateTableIndex,USHORT ModeNo); -+void XGI_SetXG27CRTC(USHORT ModeNo, USHORT ModeIdIndex, USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo); -+void XGI_SetXG27LCD(PVB_DEVICE_INFO pVBInfo,USHORT RefreshRateTableIndex,USHORT ModeNo); -+void XGI_UpdateXG21CRTC(USHORT ModeNo, PVB_DEVICE_INFO pVBInfo, USHORT RefreshRateTableIndex); -+ -+static void XGI_WaitDisplay(PVB_DEVICE_INFO pVBInfo); -+void XGI_SenseCRT1(PVB_DEVICE_INFO pVBInfo); -+ -+void XGI_SetCRT1CRTC(USHORT ModeNo, USHORT ModeIdIndex, -+ USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo, -+ PXGI_HW_DEVICE_INFO HwDeviceExtension); -+void XGI_SetCRT1Timing_H(PVB_DEVICE_INFO pVBInfo, -+ PXGI_HW_DEVICE_INFO HwDeviceExtension); -+void XGI_SetCRT1Timing_V(USHORT ModeIdIndex, USHORT ModeNo, -+ PVB_DEVICE_INFO pVBInfo); -+void XGI_SetCRT1DE(PXGI_HW_DEVICE_INFO HwDeviceExtension, USHORT ModeNo, -+ USHORT ModeIdIndex, USHORT RefreshRateTableIndex, -+ PVB_DEVICE_INFO pVBInfo); -+void XGI_SetCRT1VCLK(USHORT ModeNo, USHORT ModeIdIndex, -+ PXGI_HW_DEVICE_INFO HwDeviceExtension, -+ USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo); -+void XGI_SetCRT1FIFO(USHORT ModeNo, PXGI_HW_DEVICE_INFO HwDeviceExtension, -+ PVB_DEVICE_INFO pVBInfo); -+void XGI_SetCRT1ModeRegs(PXGI_HW_DEVICE_INFO HwDeviceExtension, USHORT ModeNo, -+ USHORT ModeIdIndex, USHORT RefreshRateTableIndex, -+ PVB_DEVICE_INFO pVBInfo); -+void XGI_SetVCLKState(PXGI_HW_DEVICE_INFO HwDeviceExtension, USHORT ModeNo, -+ USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo); -+ -+void XGI_LoadDAC(USHORT ModeNo, USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo); -+void XGI_SetLCDAGroup(USHORT ModeNo, USHORT ModeIdIndex, -+ PXGI_HW_DEVICE_INFO HwDeviceExtension, -+ PVB_DEVICE_INFO pVBInfo); -+void XGI_GetLVDSResInfo(USHORT ModeNo, USHORT ModeIdIndex, -+ PVB_DEVICE_INFO pVBInfo); -+void XGI_GetLVDSData(USHORT ModeNo, USHORT ModeIdIndex, -+ USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo); -+void XGI_ModCRT1Regs(USHORT ModeNo, USHORT ModeIdIndex, -+ USHORT RefreshRateTableIndex, -+ PXGI_HW_DEVICE_INFO HwDeviceExtension, -+ PVB_DEVICE_INFO pVBInfo); -+void XGI_SetLVDSRegs(USHORT ModeNo, USHORT ModeIdIndex, -+ USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo); -+void XGI_UpdateModeInfo(PXGI_HW_DEVICE_INFO HwDeviceExtension, -+ PVB_DEVICE_INFO pVBInfo); -+void XGI_GetVBType(PVB_DEVICE_INFO pVBInfo); -+void XGI_GetVBInfo(USHORT ModeNo, USHORT ModeIdIndex, -+ PXGI_HW_DEVICE_INFO HwDeviceExtension, -+ PVB_DEVICE_INFO pVBInfo); -+void XGI_GetTVInfo(USHORT ModeNo, USHORT ModeIdIndex, -+ PVB_DEVICE_INFO pVBInfo); -+void XGI_SetCRT2ECLK(USHORT ModeNo, USHORT ModeIdIndex, -+ USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo); -+void InitTo330Pointer(UCHAR, PVB_DEVICE_INFO pVBInfo); -+void XGI_GetLCDSync(USHORT * HSyncWidth, USHORT * VSyncWidth, -+ PVB_DEVICE_INFO pVBInfo); -+void XGI_DisableBridge(PXGI_HW_DEVICE_INFO HwDeviceExtension, -+ PVB_DEVICE_INFO pVBInfo); -+void XGI_EnableBridge(PXGI_HW_DEVICE_INFO HwDeviceExtension, -+ PVB_DEVICE_INFO pVBInfo); -+void XGI_SetCRT2VCLK(USHORT ModeNo, USHORT ModeIdIndex, -+ USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo); -+void XGI_OEM310Setting(USHORT ModeNo, USHORT ModeIdIndex, -+ PVB_DEVICE_INFO pVBInfo); -+void XGI_SetDelayComp(PVB_DEVICE_INFO pVBInfo); -+void XGI_SetLCDCap(PVB_DEVICE_INFO pVBInfo); -+void XGI_SetLCDCap_A(USHORT tempcx, PVB_DEVICE_INFO pVBInfo); -+void XGI_SetLCDCap_B(USHORT tempcx, PVB_DEVICE_INFO pVBInfo); -+void SetSpectrum(PVB_DEVICE_INFO pVBInfo); -+void XGI_SetAntiFlicker(USHORT ModeNo, USHORT ModeIdIndex, -+ PVB_DEVICE_INFO pVBInfo); -+void XGI_SetEdgeEnhance(USHORT ModeNo, USHORT ModeIdIndex, -+ PVB_DEVICE_INFO pVBInfo); -+void XGI_SetPhaseIncr(PVB_DEVICE_INFO pVBInfo); -+void XGI_SetYFilter(USHORT ModeNo, USHORT ModeIdIndex, -+ PVB_DEVICE_INFO pVBInfo); -+void XGI_GetTVPtrIndex2(USHORT * tempbx, UCHAR * tempcl, UCHAR * tempch, -+ PVB_DEVICE_INFO pVBInfo); -+USHORT XGI_GetTVPtrIndex(PVB_DEVICE_INFO pVBInfo); -+void XGI_SetCRT2ModeRegs(USHORT ModeNo, PXGI_HW_DEVICE_INFO, -+ PVB_DEVICE_INFO pVBInfo); -+void XGI_GetRAMDAC2DATA(USHORT ModeNo, USHORT ModeIdIndex, -+ USHORT RefreshRateTableIndex, -+ PVB_DEVICE_INFO pVBInfo); -+void XGI_UnLockCRT2(PXGI_HW_DEVICE_INFO, PVB_DEVICE_INFO pVBInfo); -+void XGI_LockCRT2(PXGI_HW_DEVICE_INFO, PVB_DEVICE_INFO pVBInfo); -+void XGINew_EnableCRT2(PVB_DEVICE_INFO pVBInfo); -+void XGINew_LCD_Wait_Time(UCHAR DelayTime, PVB_DEVICE_INFO pVBInfo); -+void XGI_SetCRT1Offset(USHORT ModeNo, USHORT ModeIdIndex, -+ USHORT RefreshRateTableIndex, -+ PXGI_HW_DEVICE_INFO HwDeviceExtension, -+ PVB_DEVICE_INFO pVBInfo); -+static void XGI_GetLCDVCLKPtr(UCHAR *di, PVB_DEVICE_INFO pVBInfo); -+static unsigned XGI_GetVCLKPtr(USHORT RefreshRateTableIndex, USHORT ModeNo, -+ USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo); -+static void XGI_GetVCLKLen(unsigned vclkindex, UCHAR *di, -+ PVB_DEVICE_INFO pVBInfo); -+USHORT XGI_GetLCDCapPtr(PVB_DEVICE_INFO pVBInfo); -+USHORT XGI_GetLCDCapPtr1(PVB_DEVICE_INFO pVBInfo); -+static const XGI301C_Tap4TimingStruct *XGI_GetTap4Ptr(USHORT tempcx, PVB_DEVICE_INFO pVBInfo); -+ -+/* Jong 10/03/2007 */ -+void XGI_SetXG21FPBits(PVB_DEVICE_INFO pVBInfo); -+void XGI_SetXG27FPBits(PVB_DEVICE_INFO pVBInfo); -+UCHAR XGI_XG21GetPSCValue(PVB_DEVICE_INFO pVBInfo); -+UCHAR XGI_XG27GetPSCValue(PVB_DEVICE_INFO pVBInfo); -+void XGI_XG21BLSignalVDD(USHORT tempbh,USHORT tempbl, PVB_DEVICE_INFO pVBInfo); -+void XGI_XG27BLSignalVDD(USHORT tempbh,USHORT tempbl, PVB_DEVICE_INFO pVBInfo); -+void XGI_XG21SetPanelDelay(USHORT tempbl, PVB_DEVICE_INFO pVBInfo); -+BOOLEAN XGI_XG21CheckLVDSMode(USHORT ModeNo,USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo ); -+void XGI_SetXG21LVDSPara(USHORT ModeNo,USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo ); -+void XGI_SetXG27LVDSPara(USHORT ModeNo,USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo ); -+UCHAR XGI_SetDefaultVCLK( PVB_DEVICE_INFO pVBInfo ); -+ -+const uint8_t XGI_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 -+}; -+ -+const uint8_t XGI_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 -+}; -+ -+const uint8_t XGI_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 -+}; -+ -+const uint8_t XGI_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(UCHAR ChipType, PVB_DEVICE_INFO pVBInfo) -+{ -+ pVBInfo->SModeIDTable = XGI330_SModeIDTable; -+ pVBInfo->StandTable = XGI330_StandTable; -+ pVBInfo->EModeIDTable = XGI330_EModeIDTable; -+ pVBInfo->RefIndex = XGI330_RefIndex; -+ pVBInfo->XGINEWUB_CRT1Table = XGI_CRT1Table; -+ -+ /* add for new UNIVGABIOS */ -+ /* XGINew_UBLCDDataTable = (XGI_LCDDataTablStruct *) XGI_LCDDataTable ; */ -+ /* XGINew_UBTVDataTable = (XGI_TVDataTablStruct *) XGI_TVDataTable ; */ -+ -+ -+ if (ChipType >= XG40) { -+ (void) memcpy(pVBInfo->MCLKData, XGI340New_MCLKData, sizeof(XGI340New_MCLKData)); -+ (void) memcpy(pVBInfo->ECLKData, XGI340_ECLKData, sizeof(XGI340_ECLKData)); -+ } -+ else { -+ (void) memcpy(pVBInfo->MCLKData, XGI330New_MCLKData, sizeof(XGI330New_MCLKData)); -+ (void) memcpy(pVBInfo->ECLKData, XGI330_ECLKData, sizeof(XGI330_ECLKData)); -+ } -+ -+ pVBInfo->VCLKData = XGI_VCLKData; -+ pVBInfo->VBVCLKData = XGI_VBVCLKData; -+ pVBInfo->ScreenOffset = XGI330_ScreenOffset; -+ pVBInfo->StResInfo = XGI330_StResInfo; -+ pVBInfo->ModeResInfo = XGI330_ModeResInfo; -+ -+ pVBInfo->OutputSelect = XGI330_OutputSelect; -+ pVBInfo->SoftSetting = XGI330_SoftSetting; -+ pVBInfo->SR07 = XGI330_SR07; -+ pVBInfo->LCDResInfo = 0; -+ pVBInfo->LCDTypeInfo = 0; -+ pVBInfo->LCDInfo = 0; -+ pVBInfo->VBInfo = 0; -+ pVBInfo->TVInfo = 0; -+ -+ -+ (void) memcpy(pVBInfo->SR15, XGI340_SR13, sizeof(XGI340_SR13)); -+ (void) memcpy(pVBInfo->CR40, XGI340_CR41, sizeof(XGI340_CR41)); -+ (void) memcpy(pVBInfo->SR25, XGI330_SR25, sizeof(XGI330_SR25)); -+ pVBInfo->SR31 = XGI330_SR31; -+ pVBInfo->SR32 = XGI330_SR32; -+ (void) memcpy(pVBInfo->CR6B, XGI340_CR6B, sizeof(XGI340_CR6B)); -+ if (ChipType == XG45) { -+ (void) memcpy(pVBInfo->XG45CR6E, XGI45_CR6E, sizeof(XGI45_CR6E)); -+ (void) memcpy(pVBInfo->XG45CR6F, XGI45_CR6F, sizeof(XGI45_CR6F)); -+ } -+ else { -+ (void) memcpy(pVBInfo->CR6E, XGI340_CR6E, sizeof(XGI340_CR6E)); -+ (void) memcpy(pVBInfo->CR6F, XGI340_CR6F, sizeof(XGI340_CR6F)); -+ } -+ (void) memcpy(pVBInfo->CR89, XGI340_CR89, sizeof(XGI340_CR89)); -+ (void) memcpy(pVBInfo->AGPReg, XGI340_AGPReg, sizeof(XGI340_AGPReg)); -+ (void) memcpy(pVBInfo->SR16, XGI340_SR16, sizeof(XGI340_SR16)); -+ pVBInfo->CRCF = XG40_CRCF; -+ pVBInfo->DRAMTypeDefinition = XG40_DRAMTypeDefinition; -+ -+ -+ (void) memcpy(pVBInfo->CR49, XGI330_CR49, sizeof(XGI330_CR49)); -+ pVBInfo->SR1F = XGI330_SR1F; -+ pVBInfo->SR21 = XGI330_SR21; -+ pVBInfo->SR22 = XGI330_SR22; -+ pVBInfo->SR23 = XGI330_SR23; -+ pVBInfo->SR24 = XGI330_SR24; -+ pVBInfo->SR33 = XGI330_SR33; -+ -+ -+ -+ pVBInfo->CRT2Data_1_2 = XGI330_CRT2Data_1_2; -+ pVBInfo->CRT2Data_4_D = XGI330_CRT2Data_4_D; -+ pVBInfo->CRT2Data_4_E = XGI330_CRT2Data_4_E; -+ pVBInfo->CRT2Data_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; -+ -+ -+ (void) memcpy(& pVBInfo->TimingH, XGI_TimingH, sizeof(XGI_TimingH)); -+ (void) memcpy(& pVBInfo->TimingV, XGI_TimingV, sizeof(XGI_TimingV)); -+ -+ /* Jong 10/17/2007; merge code */ -+ pVBInfo->UpdateCRT1 = (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; -+ -+ /* Jong 10/03/2007 */ -+ if ( ( ChipType == XG21 ) || ( ChipType == XG27 ) ) -+ pVBInfo->XG21_LVDSCapList = XGI21_LCDCapList ; -+ -+ pVBInfo->XGI_TVDelayList = XGI301TVDelayList; -+ pVBInfo->XGI_TVDelayList2 = XGI301TVDelayList2; -+ -+ -+ pVBInfo->I2CDefinition = XG40_I2CDefinition; -+ -+ /* Jong 10/03/2007 */ -+ if (ChipType >= XG20) -+ pVBInfo->CR97 = XG20_CR97; -+ -+ -+ /* Jong 10/03/2007 */ -+ if ( ChipType == XG27 ) -+ { -+ /* pVBInfo->MCLKData = (XGI_MCLKDataStruct *) XGI27New_MCLKData ; */ -+ (void) memcpy(pVBInfo->MCLKData, XGI27New_MCLKData, sizeof(XGI27New_MCLKData)); -+ -+ /* pVBInfo->CR40 = XGI27_cr41 ; */ -+ (void) memcpy(pVBInfo->CR40, XGI27_cr41, sizeof(XGI27_cr41)); -+ -+ pVBInfo->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 : */ -+/* --------------------------------------------------------------------- */ -+BOOLEAN -+XGISetModeNew(PXGI_HW_DEVICE_INFO HwDeviceExtension, PVB_DEVICE_INFO pVBInfo, -+ USHORT ModeNo) -+{ -+#ifndef LINUX_XF86 -+ ULONG temp; -+ USHORT KeepLockReg; -+#endif -+ USHORT ModeIdIndex; -+ /* PUCHAR pVBInfo->FBAddr = HwDeviceExtension->pjVideoMemoryAddress ; */ -+ USHORT temp_mode_no; -+ -+ pVBInfo->IF_DEF_LVDS = 0 ; -+ pVBInfo->IF_DEF_VideoCapture = 1; -+ pVBInfo->IF_DEF_ScaleLCD = 1; -+ -+ unsigned vga_info; /* Jong 11/28/2007 */ -+ -+ /* Jong 10/03/2007 */ -+ if ( HwDeviceExtension->jChipType == XG27 ) -+ { -+ if ( ( XGI_GetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x38 ) & 0xE0 ) == 0xC0 ) -+ { -+ if ( XGI_GetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x30 ) & 0x20 ) -+ { -+ pVBInfo->IF_DEF_LVDS = 1 ; -+ } -+ } -+ } -+ -+ /* Jong 10/03/20007 */ -+ if ( HwDeviceExtension->jChipType < XG20 ) /* kuku 2004/06/25 */ -+ XGI_GetVBType( pVBInfo ) ; -+ -+ /* Jong 10/17/2007; merge code */ -+ InitTo330Pointer( HwDeviceExtension->jChipType, pVBInfo ) ; -+ -+ if (ModeNo & 0x80) { -+ ModeNo = ModeNo & 0x7F; -+ } -+ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x05, 0x86); -+ -+ /* Jong 10/03/2007 */ -+ if (HwDeviceExtension->jChipType < XG20) /* kuku 2004/06/25 1.Openkey */ -+ XGI_UnLockCRT2(HwDeviceExtension, pVBInfo); -+ -+ /* Jong 10/03/2007 */ -+ HwDeviceExtension->SpecialMode = FALSE; -+ -+/* Jong 11/27/2007 */ -+#if 0 /* can't get pScrn */ -+#if (defined(i386) || defined(__i386) || defined(__i386__) || defined(__AMD64__)) -+ vga_info = XGI_GetSetBIOSScratch(pScrn, 0x489, 0xff); -+#else -+ vga_info = 0x11; /* set default mode 3 */ -+#endif -+#endif -+ -+ /* Jong 11/28/2007; pVBInfo field is not matching VGAINFO argument */ -+ /* if ( !XGI_SearchModeID(pVBInfo->SModeIDTable, pVBInfo->EModeIDTable, pVBInfo , &ModeNo , &ModeIdIndex) ) */ -+ if ( !XGI_SearchModeID(pVBInfo->SModeIDTable, pVBInfo->EModeIDTable, 0x11, &ModeNo , &ModeIdIndex) ) -+ { -+ switch (HwDeviceExtension->BPP) -+ { -+ case 8: ModeNo = 0x2E; -+ HwDeviceExtension->SpecialMode = TRUE; -+ break; -+ case 15: ModeNo = 0x43; -+ HwDeviceExtension->SpecialMode = TRUE; -+ break; -+ case 16: ModeNo = 0x44; -+ HwDeviceExtension->SpecialMode = TRUE; -+ break; -+ case 32: ModeNo = 0x62; -+ HwDeviceExtension->SpecialMode = TRUE; -+ break; -+ default: -+ return FALSE; -+ break; -+ } -+ -+ /* Jong 10/03/2007 */ -+ if (HwDeviceExtension->SpecialMode) -+ { -+ -+ /* Jong 11/28/2007; pVBInfo field is not matching VGAINFO argument */ -+ /* XGI_SearchModeID( pVBInfo->SModeIDTable, pVBInfo->EModeIDTable, pVBInfo, &ModeNo , &ModeIdIndex ) ; */ -+ XGI_SearchModeID( pVBInfo->SModeIDTable, pVBInfo->EModeIDTable, 0x11, &ModeNo , &ModeIdIndex ) ; -+ if ( !(HwDeviceExtension->SpecifyTiming) ) -+ { -+ int i = 0; -+ while ( SpecialModeTiming[i].Horizontal_ACTIVE != 0 ) -+ { -+ if ( ( SpecialModeTiming[i].Horizontal_ACTIVE==HwDeviceExtension->Horizontal_ACTIVE ) && -+ ( (SpecialModeTiming[i].Vertical_ACTIVE<<(SpecialModeTiming[i].Interlace&0x1))==HwDeviceExtension->Vertical_ACTIVE ) ) -+ { -+ if ( ( ( SpecialModeTiming[i].FrameRate-HwDeviceExtension->Frequency ) < 2.0 ) || -+ ( ( SpecialModeTiming[i].FrameRate-HwDeviceExtension->Frequency ) > -2.0 ) ) -+ { -+ HwDeviceExtension->Horizontal_FP = SpecialModeTiming[i].Horizontal_FP; -+ HwDeviceExtension->Horizontal_SYNC = SpecialModeTiming[i].Horizontal_SYNC; -+ HwDeviceExtension->Horizontal_BP = SpecialModeTiming[i].Horizontal_BP; -+ HwDeviceExtension->Vertical_FP = SpecialModeTiming[i].Vertical_FP; -+ HwDeviceExtension->Vertical_SYNC = SpecialModeTiming[i].Vertical_SYNC; -+ HwDeviceExtension->Vertical_BP = SpecialModeTiming[i].Vertical_BP; -+ HwDeviceExtension->DCLK = SpecialModeTiming[i].DCLK; -+ HwDeviceExtension->Interlace = SpecialModeTiming[i].Interlace & 0x1; -+ break; -+ } -+ } -+ i++; -+ } -+ if ( SpecialModeTiming[i].Horizontal_ACTIVE == 0 ) -+ { -+ return FALSE; /* currently not support */ -+ } -+ } -+ } -+ } -+ -+ if (HwDeviceExtension->jChipType < XG20) { /* kuku 2004/06/25 */ -+ PDEBUG(ErrorF("XGI_GetVBInfo \n")); -+ XGI_GetVBInfo(ModeNo, ModeIdIndex, HwDeviceExtension, pVBInfo); -+ PDEBUG(ErrorF("XGI_GetTVInfo \n")); -+ XGI_GetTVInfo(ModeNo, ModeIdIndex, pVBInfo); -+ PDEBUG(ErrorF("XGI_GetLCDInfo \n")); -+ XGI_GetLCDInfo(ModeNo, ModeIdIndex, pVBInfo); -+ PDEBUG(ErrorF("XGI_DisableBridge \n")); -+ -+ /* Jong 10/17/2007; merge code */ -+ if ( pVBInfo->VBInfo & ( SetSimuScanMode | SwitchToCRT2 ) ) -+ { -+ if (HwDeviceExtension->SpecialMode) -+ { -+ return FALSE; -+ } -+ } -+ -+ XGI_DisableBridge(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); -+ } -+ } -+ } -+ -+ PDEBUG(ErrorF(" vb_setmode 474\n")); // yilin -+ if (pVBInfo->VBInfo & (SetSimuScanMode | SwitchToCRT2)) { -+ switch (HwDeviceExtension->ujVBChipID) { -+ case VB_CHIP_301: -+ PDEBUG(ErrorF(" vb_setmode 301\n")); //yilin -+ XGI_SetCRT2Group301(ModeNo, HwDeviceExtension, pVBInfo); /*add for CRT2 */ -+ break; -+ -+ case VB_CHIP_302: -+ XGI_SetCRT2Group301(ModeNo, HwDeviceExtension, pVBInfo); /*add for CRT2 */ -+ break; -+ -+ default: -+ break; -+ } -+ } -+ ErrorF("492 Part2 0 = %x ", -+ XGI_GetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x0)); -+ XGI_SetCRT2ModeRegs(ModeNo, HwDeviceExtension, pVBInfo); -+ XGI_OEM310Setting(ModeNo, ModeIdIndex, pVBInfo); /*0212 */ -+ XGI_EnableBridge(HwDeviceExtension, pVBInfo); -+ ErrorF("497 Part2 0 = %x ", -+ XGI_GetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x0)); -+ } /* !XG20 */ -+ else -+ { -+ /* Jong 10/04/2007 */ -+ if ( pVBInfo->IF_DEF_LVDS == 1 ) -+ { -+ if ( !XGI_XG21CheckLVDSMode(ModeNo , ModeIdIndex, pVBInfo) ) -+ { -+ return FALSE; -+ } -+ } -+ -+ 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 ( 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) ; -+*/ -+ ErrorF("Part2 0 = %x ", -+ XGI_GetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x0)); -+ XGI_UpdateModeInfo(HwDeviceExtension, pVBInfo); -+ -+ /* Jong 10/04/2007 */ -+ if (HwDeviceExtension->jChipType < XG20) /* kuku 2004/06/25 */ -+ XGI_LockCRT2(HwDeviceExtension, pVBInfo); -+ -+ return (TRUE); -+} -+ -+/* Jong 10/17/2007; merge code */ -+void XGI_SetCRTVCLK(PVB_DEVICE_INFO pVBInfo, double dwPixelClock) -+{ -+struct factor -+{ -+ int sr2b7; -+ int sr2c7; -+ int sr2c6; -+ int sr2c5; -+ int dividend ; -+ int divisor ; -+}; -+ -+struct factor kind[16]= -+{ -+ {0,0,0,0,1,1}, -+ {0,0,0,1,1,2}, -+ {0,0,1,0,1,3}, -+ {0,0,1,1,1,4}, -+ {1,0,0,0,2,1}, -+ {1,0,0,1,2,2}, -+ {1,0,1,0,2,3}, -+ {1,0,1,1,2,4}, -+ {0,1,0,0,1,1}, -+ {0,1,0,1,1,4}, -+ {0,1,1,0,1,6}, -+ {0,1,1,1,1,8}, -+ {1,1,0,0,2,1}, -+ {1,1,0,1,2,4}, -+ {1,1,1,0,2,6}, -+ {1,1,1,1,2,8} -+}; -+ int ii,jj,kk,ll,sr2b,sr2c,Numerator,DeNumerator; -+ double factor1,tempclock,vclk,temp1,min,clock; -+ -+ -+ vclk=(double)dwPixelClock; -+ min=99.0; -+ for(ii=2;ii<=31;ii++) /* (DeNumerator1)It's value must >=2 */ -+ { -+ for(jj=0;jj<=127;jj++) /* (Numerator1) */ -+ { -+ -+ for(kk=0;kk<=15;kk++) -+ { -+ tempclock=14.318*kind[kk].dividend*(jj+1)/(ii+1); -+ if ( (tempclock >= 150 ) && ( tempclock <= 380) ) -+ { -+ tempclock = tempclock / kind[kk].divisor ; -+ temp1=fabs(vclk-tempclock); -+ if(temp1P3c4 , 0x2B , (unsigned char) sr2b) ; -+ XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3c4 , 0x2C , (unsigned char) sr2c) ; -+} -+ -+/* Jong 10/17/2007; merge code */ -+void XGI_SetCRTTiming( -+ PXGI_HW_DEVICE_INFO pXGIHWDE, -+ PVB_DEVICE_INFO pVBInfo -+ ) -+{ -+ int HT, VT, HDE, VDE, HRS, VRS, HRE, VRE, VGAHDE, VGAVDE, VGAHT, VGAVT; -+ int HorizontalActivePixel, HorizontalFrontPorch, HorizontalSyncWidth, HorizontalBackPorch; -+ int VerticalActivePixel, VerticalFrontPorch, VerticalSyncWidth, VerticalBackPorch; -+ int temp1; -+ UCHAR temp; -+ -+ HorizontalActivePixel = pXGIHWDE->Horizontal_ACTIVE; -+ HorizontalFrontPorch = pXGIHWDE->Horizontal_FP; -+ HorizontalSyncWidth = pXGIHWDE->Horizontal_SYNC; -+ HorizontalBackPorch = pXGIHWDE->Horizontal_BP; -+ VerticalActivePixel = pXGIHWDE->Vertical_ACTIVE >> (pXGIHWDE->Interlace & 0x1); -+ VerticalFrontPorch = pXGIHWDE->Vertical_FP; -+ VerticalSyncWidth = pXGIHWDE->Vertical_SYNC; -+ VerticalBackPorch = pXGIHWDE->Vertical_BP; -+ -+ HT = HorizontalActivePixel + HorizontalFrontPorch + HorizontalSyncWidth + HorizontalBackPorch; -+ HDE = HorizontalActivePixel; -+ HRS = HorizontalActivePixel + HorizontalFrontPorch; -+ HRE = HorizontalActivePixel + HorizontalFrontPorch + HorizontalSyncWidth; -+ HT = HT / 8; -+ HDE = HDE / 8; -+ HRS = HRS / 8; -+ HRE = HRE / 8; -+ VGAHT = HT - 5; -+ VGAHDE = HDE - 1; -+ HDE = HDE - 1; -+ HT = HT - 1; -+ HRS = HRS + 3; -+ HRE = HRE + 3; -+ -+ /* -+ HRS = HRS + 2; -+ HRE = HRE + 2; -+ */ -+ -+ VT = VerticalActivePixel + VerticalFrontPorch + VerticalSyncWidth + VerticalBackPorch; -+ VDE = VerticalActivePixel; -+ VRS = VerticalActivePixel + VerticalFrontPorch; -+ VRE = VerticalActivePixel + VerticalFrontPorch + VerticalSyncWidth; -+ VGAVT = VT - 2; -+ VGAVDE = VDE - 1; -+ VRS = VRS - 1; -+ VRE = VRE - 1; -+ VDE = VDE - 1; -+ VT = VT - 1; -+ -+ -+ temp = XGINew_GetReg1( pVBInfo->P3c4 , 0x06 ) ; -+ temp = ((temp & 0x1c ) >> 2) * 8; -+ if (temp == 0) -+ temp = 8; -+ temp1 = HorizontalActivePixel * temp / 8; -+ temp1 = temp1 / 8; -+ temp = temp1 / 8 + 1; -+ -+ if (pXGIHWDE->Interlace) -+ { -+ temp1 = temp1 << 1; -+ } -+ -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3c4, 0x05, 0x00, 0x86); -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4, 0x11, 0x7f, 0x00); -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4, 0x00, 0x00, (VGAHT & 0xff)); /* HT */ -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4, 0x01, 0x00, (VGAHDE & 0xff)); /* HDEE */ -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4, 0x02, 0x00, (HDE & 0xff)); /* HBS */ -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4, 0x03, 0xe0, (HT & 0x1f)); /* HBE */ -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4, 0x04, 0x00, (HRS & 0xff)); /* HRS */ -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4, 0x05, 0x60, (((HT & 0x20) << 2) | (HRE & 0x1f))); /* HRE */ -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4, 0x06, 0x00, (VGAVT & 0xff)); /* VT */ -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4, 0x07, 0x00, (((VRS & 0x0200) >> 2) | ((VDE & 0x0200) >> 3) | ((VGAVT & 0x0200) >> 4)| ((VGAVDE & 0x0100) >> 5) | ((VRS & 0x0100) >> 6) | ((VDE & 0x0100) >> 7) | ((VGAVT & 0x0100) >> 8))); -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4, 0x09, 0xdf, ((VGAVDE & 0x0200) >> 4)); -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4, 0x10, 0x00, (VRS & 0xff)); /* VRS */ -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4, 0x11, 0xf0, (VRE & 0x0f)); /* VRE */ -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4, 0x12, 0x00, (VDE & 0xff)); /* VDEE */ -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4, 0x13, 0x00, (temp1 & 0xff)); -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4, 0x15, 0x00, (VGAVDE & 0xff)); /* VBS */ -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4, 0x16, 0x00, (VT & 0xff)); /* VBE */ -+ -+ if ( pXGIHWDE->jChipType == XG21 ) -+ { -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3c4, 0x2e, 0x00, ((HRS-1) & 0xff)); /* HRS */ -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3c4, 0x2f, 0x00, (((HRE-1) & 0x3f)<<2) | (((HRS-1) & 0x0300) >> 8)); /* HRS */ -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3c4, 0x33, 0xFE, (((VRS) & 0x01))); /* VRS */ -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3c4, 0x34, 0x00, (((VRS) & 0x01FE)>>1)); /* VRS */ -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3c4, 0x3F, 0x00, (((VRS) & 0x0600)>>9) | (((VRE) & 0x003F)<<2 )); /* VRS */ -+ -+ } -+ if ( pXGIHWDE->jChipType == XG27 ) -+ { -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3c4, 0x2e, 0x00, ((HRS-1) & 0xff)); /* HRS SR2E[7:0] */ -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3c4, 0x2f, 0x00, (((HRE-1) & 0x3f)<<2) | (((HRS-1) & 0x0300) >> 8)); /* HRE SR2F[7:2] HRS SR2F[1:0] */ -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3c4, 0x34, 0x00, ((VRS) & 0x0FF) ); /* VRS SR34[7:0] */ -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3c4, 0x35, 0xF8, (((VRS) & 0x0700)>>8)); /* VRS SR35[2:0] */ -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3c4, 0x3F, 0xFC, (((VRE) & 0x003F)<<2 )); /* VRE SR3F[7:2] */ -+ -+ } -+ if (VerticalActivePixel > 1024) -+ { -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3c4, 0x0f, 0xf7, 0x08); -+ } -+ else -+ { -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4, 0x07, 0xef, ((VGAVDE & 0x0100) >> 4)); -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4, 0x09, 0xbf, ((VGAVDE & 0x0200) >> 3)); -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4, 0x18, 0x00, (VGAVDE & 0x0ff)); -+ } -+ -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4, 0x11, 0xff, 0x80); -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3c4, 0x0a, 0xc0, (((VRE & 0x10) << 1) | ((VT & 0x0100) >> 4) | ((VRS & 0x0400) >> 7) | ((VGAVDE & 0x0400) >> 8) | ((VDE & 0x0400) >> 9) | ((VGAVT & 0x0400) >> 10))); -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3c4, 0x0b, 0x00, (((VGAHT & 0xff00) >> 8) | ((VGAHDE & 0xff00) >> 6) | ((HDE & 0xff00) >> 4) | ((HRS & 0xff00) >> 2))); -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3c4, 0x0c, 0xf8, (((HRE & 0x20) >> 3) | ((HT & 0xc0) >> 6))); -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3c4, 0x0e, 0xf0, ((temp1 & 0xff00) >> 8)); -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3c4, 0x10, 0x00, temp); -+ -+ -+ -+ XGI_SetCRTVCLK (pVBInfo, pXGIHWDE->DCLK); -+ -+ if (pXGIHWDE->BPP==0x20) -+ { -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4, 0x14, 0xE0, 0x0f); -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3ce, 0x05, 0xBF, 0x0); -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3c4, 0x06, 0xE3, 0x10); -+ temp = ((pXGIHWDE->Horizontal_ACTIVE / 8 * pXGIHWDE->BPP) / 64) + 1; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x10, temp); -+ } -+ if (pXGIHWDE->BPP==0x10) -+ { -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4, 0x14, 0xE0, 0x0f); -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3ce, 0x05, 0xBF, 0x0); -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3c4, 0x06, 0xE3, 0x08); -+ temp = ((pXGIHWDE->Horizontal_ACTIVE / 8 * pXGIHWDE->BPP) / 64) + 1; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x10, temp); -+ } -+ if (pXGIHWDE->BPP==0x8) -+ { -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3c4, 0x06, 0xE3, 0x00); -+ temp = ((pXGIHWDE->Horizontal_ACTIVE / 8 * pXGIHWDE->BPP) / 64) + 1; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x10, temp); -+ } -+ -+} -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGI_SetCRT1Group */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+void -+XGI_SetCRT1Group(PXGI_HW_DEVICE_INFO HwDeviceExtension, USHORT ModeNo, -+ USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo) -+{ -+ const USHORT StandTableIndex = XGI_GetModePtr(pVBInfo->SModeIDTable, -+ pVBInfo->ModeType, -+ ModeNo, ModeIdIndex); -+ USHORT RefreshRateTableIndex; -+ USHORT b3CC; -+ USHORT temp; -+ -+ USHORT XGINew_P3cc = pVBInfo->P3cc; -+#ifndef LINUX_XF86 -+ USHORT XGINew_P3c2 = pVBInfo->P3c2; -+#endif -+ -+ /* XGINew_CRT1Mode = ModeNo ; // SaveModeID */ -+ XGI_SetSeqRegs(StandTableIndex, pVBInfo); -+ XGI_SetMiscRegs(StandTableIndex, pVBInfo); -+ XGI_SetCRTCRegs(StandTableIndex, pVBInfo); -+ XGI_SetATTRegs(ModeNo, StandTableIndex, ModeIdIndex, pVBInfo); -+ XGI_SetGRCRegs(StandTableIndex, pVBInfo); -+ XGI_ClearExt1Regs(ModeNo, pVBInfo); -+ -+ /* Jong 10/19/2007; merge code */ -+ /* Jong 04/23/2008; All XG20,21,27 should do this */ -+ /* if ( HwDeviceExtension->jChipType == XG27 ) */ -+ if ( HwDeviceExtension->jChipType >= XG20 ) -+ { -+ 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; -+ } -+ } -+ -+ /* Jong 10/05/2007; merge code */ -+ /* RefreshRateTableIndex = XGI_GetRatePtrCRT2( ModeNo, ModeIdIndex, pVBInfo); */ -+ 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); -+ } -+ -+ /* Jong 10/04/2007; merge code */ -+ /* if (HwDeviceExtension->jChipType == XG20) { */ -+ if ( ( HwDeviceExtension->jChipType >= XG20 ) && -+ ( HwDeviceExtension->jChipType < XG27 ) ) /* fix H/W DCLK/2 bug */ -+ { -+ if ((ModeNo == 0x00) | (ModeNo == 0x01)) { -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x2B, 0x4E); -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x2C, 0xE9); -+ b3CC = (UCHAR) XGI_GetRegByte((XGIIOADDRESS) XGINew_P3cc); -+ XGI_SetRegByte((XGIIOADDRESS) XGINew_P3cc, (b3CC |= 0x0C)); -+ } -+ else if ((ModeNo == 0x04) | (ModeNo == 0x05) | (ModeNo == 0x0D)) { -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x2B, 0x1B); -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x2C, 0xE3); -+ b3CC = (UCHAR) XGI_GetRegByte((XGIIOADDRESS) XGINew_P3cc); -+ XGI_SetRegByte((XGIIOADDRESS) XGINew_P3cc, (b3CC |= 0x0C)); -+ } -+ } -+ -+ /* Jong 10/04/2007; merge code */ -+ if ( HwDeviceExtension->jChipType >= XG21 ) -+ { -+ temp = XGI_GetReg( (XGIIOADDRESS) 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 */ -+ } -+ } -+ -+ /* Jong 10/04/2007; merge code */ -+ if ( HwDeviceExtension->SpecialMode ) -+ { -+ XGI_SetCRTTiming( HwDeviceExtension, pVBInfo ); -+ } -+ -+ pVBInfo->SetFlag &= (~ProgrammingCRT2); -+ XGI_SetCRT1FIFO(ModeNo, HwDeviceExtension, pVBInfo); -+ XGI_SetCRT1ModeRegs(HwDeviceExtension, ModeNo, ModeIdIndex, -+ RefreshRateTableIndex, pVBInfo); -+ -+ if (HwDeviceExtension->jChipType == XG40) { /* Copy reg settings to 2nd chip */ -+ if (CheckDualChip(pVBInfo)) -+ SetDualChipRegs(HwDeviceExtension, pVBInfo); -+ } -+ -+ /* XGI_LoadCharacter(); //dif ifdef TVFont */ -+ -+ XGI_LoadDAC(ModeNo, ModeIdIndex, pVBInfo); -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGI_SetSeqRegs */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+void -+XGI_SetSeqRegs(USHORT StandTableIndex, const VB_DEVICE_INFO *pVBInfo) -+{ -+ unsigned SRdata; -+ unsigned i; -+ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x00, 0x03); /* Set SR0 */ -+ SRdata = pVBInfo->StandTable[StandTableIndex].SR[0]; -+ -+ if (pVBInfo->VBInfo & SetCRT2ToLCDA) { -+ SRdata |= 0x01; -+ } -+ else { -+ if (pVBInfo->VBInfo & (SetCRT2ToTV | SetCRT2ToLCD)) { -+ if (pVBInfo->VBInfo & SetInSlaveMode) -+ SRdata |= 0x01; -+ } -+ } -+ -+ SRdata |= 0x20; /* screen off */ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x01, SRdata); /* Set SR1 */ -+ -+ /* Get SR2, SR3, and SR4 from table and set in hardware. -+ */ -+ for (i = 2; i <= 4; i++) { -+ SRdata = pVBInfo->StandTable[StandTableIndex].SR[i - 1]; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, i, SRdata); -+ } -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGI_SetMiscRegs */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+void -+XGI_SetMiscRegs(USHORT StandTableIndex, const VB_DEVICE_INFO *pVBInfo) -+{ -+ UCHAR 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 ; -+ } -+ } -+*/ -+ -+ XGI_SetRegByte((XGIIOADDRESS) pVBInfo->P3c2, Miscdata); /* Set Misc(3c2) */ -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGI_SetCRTCRegs */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+void -+XGI_SetCRTCRegs(unsigned StandTableIndex, const VB_DEVICE_INFO *pVBInfo) -+{ -+ unsigned i; -+ -+ /* Unlock CRTC */ -+ XGI_SetRegAND((XGIIOADDRESS) pVBInfo->P3d4, 0x11, 0x7f); -+ -+ for (i = 0; i <= 0x18; i++) { -+ /* Get CRTC from file */ -+ const unsigned CRTCdata = -+ pVBInfo->StandTable[StandTableIndex].CRTC[i]; -+ -+ /* Set CRTC( 3d4 ) */ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, i, CRTCdata); -+ } -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+void -+XGI_SetATTRegs(unsigned ModeNo, unsigned StandTableIndex, unsigned ModeIdIndex, -+ const VB_DEVICE_INFO *pVBInfo) -+{ -+ unsigned i; -+ const unsigned modeflag = (ModeNo <= 0x13) -+ ? pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag -+ : pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag; -+ -+ for (i = 0; i <= 0x13; i++) { -+ UCHAR ARdata = pVBInfo->StandTable[StandTableIndex].ATTR[i]; -+ -+ if (modeflag & Charx8Dot) { /* ifndef Dot9 */ -+ if (i == 0x13) { -+ /* Pixel shift. If screen on LCD or TV is shifted left or -+ * right, this might be the cause. -+ */ -+ if (pVBInfo->VBInfo & SetCRT2ToLCDA) -+ ARdata = 0; -+ else { -+ if (pVBInfo->VBInfo & (SetCRT2ToTV | SetCRT2ToLCD)) { -+ if (pVBInfo->VBInfo & SetInSlaveMode) -+ ARdata = 0; -+ } -+ } -+ } -+ } -+ -+ XGI_GetRegByte((XGIIOADDRESS) pVBInfo->P3da); /* reset 3da */ -+ XGI_SetRegByte((XGIIOADDRESS) pVBInfo->P3c0, i); /* set index */ -+ XGI_SetRegByte((XGIIOADDRESS) pVBInfo->P3c0, ARdata); /* set data */ -+ } -+ -+ XGI_GetRegByte((XGIIOADDRESS) pVBInfo->P3da); /* reset 3da */ -+ XGI_SetRegByte((XGIIOADDRESS) pVBInfo->P3c0, 0x14); /* set index */ -+ XGI_SetRegByte((XGIIOADDRESS) pVBInfo->P3c0, 0x00); /* set data */ -+ -+ XGI_GetRegByte((XGIIOADDRESS) pVBInfo->P3da); /* Enable Attribute */ -+ XGI_SetRegByte((XGIIOADDRESS) pVBInfo->P3c0, 0x20); -+ XGI_GetRegByte((XGIIOADDRESS) pVBInfo->P3da); -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGI_SetGRCRegs */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+void -+XGI_SetGRCRegs(unsigned StandTableIndex, const VB_DEVICE_INFO *pVBInfo) -+{ -+ unsigned i; -+ -+ for (i = 0; i <= 8; i++) { -+ /* Get GR from file and set GR (3ce) -+ */ -+ const unsigned GRdata = pVBInfo->StandTable[StandTableIndex].GRC[i]; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3ce, i, GRdata); -+ } -+ -+ if (pVBInfo->ModeType > ModeVGA) { -+ /* 256 color disable */ -+ XGI_SetRegAND((XGIIOADDRESS) pVBInfo->P3ce, 0x05, 0xBF); -+ } -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGI_ClearExt1Regs */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+void -+XGI_ClearExt1Regs(unsigned ModeNo, const VB_DEVICE_INFO *pVBInfo) -+{ -+ unsigned i; -+ -+ /* Clear SR0A-SR0E */ -+ for (i = 0x0A; i <= 0x0E; i++) { -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, i, 0x00); -+ } -+ -+ /* This code came from the old XGI_New_ClearExt1Regs in init.c. Since -+ * it wasn't included in the newer code drop from XGI, I'm not sure if -+ * it's necessary on the Volari chips. I've included it here, ifdefed -+ * out, for future reference. -+ * - idr -+ */ -+#if 0 -+ XGI_SetRegAND(pVBInfo->P3c4, 0x37, 0xFE); -+ if ((ModeNo == 0x06) || ((ModeNo >= 0x0e) && (ModeNo <= 0x13))) { -+ XGI_SetReg(pVBInfo->P3c4, 0x0e, 0x20); -+ } -+#else -+ (void) ModeNo; -+#endif -+} -+ -+/* Jong 10/17/2007; merge code */ -+/* --------------------------------------------------------------------- */ -+/* Function : XGI_SetDefaultVCLK */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+UCHAR XGI_SetDefaultVCLK( PVB_DEVICE_INFO pVBInfo ) -+{ -+ /* Jong 04/22/2008; XGINew_ -> XGI_*/ -+ /* Jong 04/23/2008; coding error: VCLKData[0]-> 0x10:25MHz; VCLKData[1]-> 0x20:28MHz */ -+ /* XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x31 , ~0x30 , 0x20 ) ; */ -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x31 , ~0x30 , 0x10 ) ; -+ XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3c4 , 0x2B , pVBInfo->VCLKData[ 0 ].SR2B ) ; -+ XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3c4 , 0x2C , pVBInfo->VCLKData[ 0 ].SR2C ) ; -+ -+ /* XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x31 , ~0x30 , 0x10 ) ; */ -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x31 , ~0x30 , 0x20 ) ; -+ XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3c4 , 0x2B , pVBInfo->VCLKData[ 1 ].SR2B ) ; -+ XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3c4 , 0x2C , pVBInfo->VCLKData[ 1 ].SR2C ) ; -+ -+ XGI_SetRegAND( (XGIIOADDRESS) pVBInfo->P3c4 , 0x31 , ~0x30 ) ; -+ return( 0 ) ; -+} -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGI_GetRatePtrCRT2 */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+USHORT -+XGI_GetRatePtrCRT2(PXGI_HW_DEVICE_INFO HwDeviceExtension, USHORT ModeNo, USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo) -+{ -+ SHORT LCDRefreshIndex[] = { 0x00, 0x00, 0x03, 0x01 } -+ , LCDARefreshIndex[] = { -+ 0x00, 0x00, 0x03, 0x01, 0x01, 0x01, 0x01}; -+ -+ USHORT RefreshRateTableIndex, i, modeflag, index, temp; -+ -+ if (ModeNo <= 0x13) { -+ modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag; -+ } -+ else { -+ modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag; -+ } -+ -+ if (ModeNo < 0x14) -+ return (0xFFFF); -+ -+ index = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x33); -+ index = index >> pVBInfo->SelectCRT2Rate; -+ index &= 0x0F; -+ -+ if (pVBInfo->LCDInfo & (LCDNonExpanding | EnableScalingLCD)) -+ index = 0; -+ -+ if (index > 0) -+ index--; -+ -+ if (pVBInfo->SetFlag & ProgrammingCRT2) { -+ if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) { -+ -+ /* Jong 10/03/2007; merge code */ -+ 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; -+ -+ /* Jong 10/03/2007; merge code */ -+ /* Do the similiar adjustment like XGISearchCRT1Rate() */ -+ if ( HwDeviceExtension->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++; -+ } -+ if ( ( pVBInfo->RefIndex[ RefreshRateTableIndex ].XRes == 1024 ) && -+ ( pVBInfo->RefIndex[ RefreshRateTableIndex ].YRes == 768 ) ) -+ { -+ index++; -+ } -+ if ( ( pVBInfo->RefIndex[ RefreshRateTableIndex ].XRes == 1280 ) && -+ ( pVBInfo->RefIndex[ RefreshRateTableIndex ].YRes == 1024 ) ) -+ { -+ index++; -+ } -+ -+ /* Jong 11/29/2007; fix bugs of 1600x1200; set limitation to 60Hz */ -+ /* It should need to check refresh rate supporting of output device */ -+ if ( ( pVBInfo->RefIndex[ RefreshRateTableIndex ].XRes == 1600 ) && -+ ( pVBInfo->RefIndex[ RefreshRateTableIndex ].YRes == 1200 ) ) -+ { -+ index=0; -+ } -+ } -+ -+ /* Jong 11/29/2007; according to CR33(index) to update refresh table 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 : */ -+/* --------------------------------------------------------------------- */ -+BOOLEAN -+XGI_AjustCRT2Rate(USHORT ModeNo, USHORT ModeIdIndex, -+ USHORT RefreshRateTableIndex, USHORT * i, -+ PVB_DEVICE_INFO pVBInfo) -+{ -+ USHORT 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; -+ -+ /* Jong 10/04/2007; merge code */ -+ 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->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 RefreshRateTableIndex, const VB_DEVICE_INFO *pVBInfo) -+{ -+ const unsigned sync = -+ (pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag >> 8) & 0xC0; -+ -+ /* Set Misc(3c2) */ -+ XGI_SetRegByte((XGIIOADDRESS) pVBInfo->P3c2, sync | 0x2F); -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGI_SetCRT1CRTC */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+void -+XGI_SetCRT1CRTC(USHORT ModeNo, USHORT ModeIdIndex, -+ USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo, -+ PXGI_HW_DEVICE_INFO HwDeviceExtension) -+{ -+ UCHAR index, data; -+#ifndef LINUX_XF86 -+ USHORT temp, tempah, j, modeflag, ResInfo, DisplayType; -+#endif -+ USHORT i; -+ -+ index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC; /* Get index */ -+ index = index & IndexMask; -+ -+ data = (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x11); -+ data &= 0x7F; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x11, data); /* Unlock CRTC */ -+ -+ for (i = 0; i < 8; i++) -+ pVBInfo->TimingH.data[i] = -+ pVBInfo->XGINEWUB_CRT1Table[index].CR[i]; -+ -+ for (i = 0; i < 7; i++) -+ pVBInfo->TimingV.data[i] = -+ pVBInfo->XGINEWUB_CRT1Table[index].CR[i + 8]; -+ -+ XGI_SetCRT1Timing_H(pVBInfo, HwDeviceExtension); -+ -+ -+ -+ XGI_SetCRT1Timing_V(ModeIdIndex, ModeNo, pVBInfo); -+ -+ -+ if (pVBInfo->ModeType > 0x03) -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x14, 0x4F); -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGI_SetCRT1Timing_H */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+void -+XGI_SetCRT1Timing_H(PVB_DEVICE_INFO pVBInfo, -+ PXGI_HW_DEVICE_INFO HwDeviceExtension) -+{ -+ UCHAR data, data1, pushax; -+ USHORT i, j; -+ -+ /* XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0x51 , 0 ) ; */ -+ /* XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0x56 , 0 ) ; */ -+ /* XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4 ,0x11 , 0x7f , 0x00 ) ; */ -+ -+ data = (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x11); /* unlock cr0-7 */ -+ data &= 0x7F; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x11, data); -+ -+ data = pVBInfo->TimingH.data[0]; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, 0, data); -+ -+ for (i = 0x01; i <= 0x04; i++) { -+ data = pVBInfo->TimingH.data[i]; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, (USHORT) (i + 1), data); -+ } -+ -+ for (i = 0x05; i <= 0x06; i++) { -+ data = pVBInfo->TimingH.data[i]; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, (USHORT) (i + 6), data); -+ } -+ -+ j = (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x0e); -+ j &= 0x1F; -+ data = pVBInfo->TimingH.data[7]; -+ data &= 0xE0; -+ data |= j; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x0e, data); -+ -+ /* Jong 10/04/2007; merge code */ -+ if (HwDeviceExtension->jChipType >= XG20) { -+ data = (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x04); -+ data = data - 1; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x04, data); -+ data = (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x05); -+ data1 = data; -+ data1 &= 0xE0; -+ data &= 0x1F; -+ if (data == 0) { -+ pushax = data; -+ data = (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x0c); -+ data &= 0xFB; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x0c, data); -+ data = pushax; -+ } -+ data = data - 1; -+ data |= data1; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x05, data); -+ data = (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x0e); -+ data = data >> 5; -+ data = data + 3; -+ if (data > 7) -+ data = data - 7; -+ data = data << 5; -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3c4, 0x0e, ~0xE0, data); -+ } -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGI_SetCRT1Timing_V */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+void -+XGI_SetCRT1Timing_V(USHORT ModeIdIndex, USHORT ModeNo, -+ PVB_DEVICE_INFO pVBInfo) -+{ -+ UCHAR data; -+ USHORT i, j; -+ -+ /* XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0x51 , 0 ) ; */ -+ /* XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0x56 , 0 ) ; */ -+ /* XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4 , 0x11 , 0x7f , 0x00 ) ; */ -+ -+ for (i = 0x00; i <= 0x01; i++) { -+ data = pVBInfo->TimingV.data[i]; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, (USHORT) (i + 6), data); -+ } -+ -+ for (i = 0x02; i <= 0x03; i++) { -+ data = pVBInfo->TimingV.data[i]; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, (USHORT) (i + 0x0e), data); -+ } -+ -+ for (i = 0x04; i <= 0x05; i++) { -+ data = pVBInfo->TimingV.data[i]; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, (USHORT) (i + 0x11), data); -+ } -+ -+ j = (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x0a); -+ j &= 0xC0; -+ data = pVBInfo->TimingV.data[6]; -+ data &= 0x3F; -+ data |= j; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x0a, data); -+ -+ data = pVBInfo->TimingV.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 = (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x09); -+ j &= 0x5F; -+ data |= j; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x09, data); -+} -+ -+/* Jong 10/04/2007; merge code */ -+/* --------------------------------------------------------------------- */ -+/* 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(USHORT ModeNo, USHORT ModeIdIndex, USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo) -+{ -+ UCHAR StandTableIndex, index, Tempax, Tempbx, Tempcx, Tempdx ; -+ USHORT Temp1, Temp2, Temp3 ; -+ -+ if ( ModeNo <= 0x13 ) -+ { -+ StandTableIndex = XGI_GetModePtr( pVBInfo->SModeIDTable, -+ pVBInfo->ModeType, -+ ModeNo, ModeIdIndex); -+ Tempax = pVBInfo->StandTable[ StandTableIndex ].CRTC[ 4 ] ; /* CR04 HRS */ -+ XGI_SetReg( (XGIIOADDRESS) 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 */ -+ XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3c4 , 0x2F , Tempdx ) ; /* SR2F [7:2]->HRE */ -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x30 , 0xE3 , 00 ) ; -+ -+ Tempax = pVBInfo->StandTable[ StandTableIndex ].CRTC[ 16 ] ; /* Tempax: CR16 VRS */ -+ Tempbx = Tempax ; /* Tempbx=Tempax */ -+ Tempax &= 0x01 ; /* Tempax: VRS[0] */ -+ XGI_SetRegOR( (XGIIOADDRESS) 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] */ -+ XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3c4 , 0x34 , Tempdx ) ; /* SR34[7:0]: VRS[8:1] */ -+ -+ Temp1 = Tempcx << 1 ; /* Temp1[8]: VRS[8] UCHAR -> USHORT */ -+ 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]>= 9 ; /* [10:9]->[1:0] */ -+ Tempbx = (UCHAR)Temp1 ; /* Tempbx[1:0]: VRS[10:9] */ -+ Tempax |= Tempbx ; /* VRE[5:0]VRS[10:9] */ -+ Tempax &= 0x7F ; -+ XGI_SetReg( (XGIIOADDRESS) 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 */ -+ XGI_SetReg( (XGIIOADDRESS) 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 = (UCHAR)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] */ -+ XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3c4 , 0x2F , Tempax ) ; /* SR2F D[7:2]->HRE, D[1:0]->HRS */ -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x30 , 0xE3 , 00 ) ; -+ -+ Tempax = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 10 ] ; /* CR10 VRS */ -+ Tempbx = Tempax ; /* Tempbx: VRS */ -+ Tempax &= 0x01 ; /* Tempax[0]: VRS[0] */ -+ XGI_SetRegOR( (XGIIOADDRESS) 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] */ -+ XGI_SetReg( (XGIIOADDRESS) 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 = (UCHAR)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 = (UCHAR)Temp1 ; -+ Tempax |= Tempbx ; /* Tempax[7:0]: VRE[5:0]VRS[10:9] */ -+ Tempax &= 0x7F ; -+ XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3c4 , 0x3F , Tempax ) ; /* SR3F D[7:2]->VRE D[1:0]->VRS */ -+ } -+} -+ -+/* Jong 10/04/2007; merge code */ -+void XGI_SetXG27CRTC(USHORT ModeNo, USHORT ModeIdIndex, USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo) -+{ -+ USHORT StandTableIndex, index, Tempax, Tempbx, Tempcx, Tempdx ; -+ -+ if ( ModeNo <= 0x13 ) -+ { -+ /* Jong 10/05/2007; merge code */ -+ /* StandTableIndex = XGI_GetModePtr( ModeNo , ModeIdIndex, pVBInfo ) ; */ -+ StandTableIndex = XGI_GetModePtr( pVBInfo->SModeIDTable, -+ pVBInfo->ModeType, -+ ModeNo, ModeIdIndex); -+ -+ Tempax = pVBInfo->StandTable[ StandTableIndex ].CRTC[ 4 ] ; /* CR04 HRS */ -+ XGI_SetReg( (XGIIOADDRESS) 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 */ -+ XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3c4 , 0x2F , Tempdx ) ; /* SR2F [7:2]->HRE */ -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x30 , 0xE3 , 00 ) ; -+ -+ Tempax = pVBInfo->StandTable[ StandTableIndex ].CRTC[ 16 ] ; /* Tempax: CR10 VRS */ -+ XGI_SetReg( (XGIIOADDRESS) 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; -+ XGI_SetRegANDOR( (XGIIOADDRESS) 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 = (UCHAR)Tempbx & 0xFF; /* Tempax[7:0]: VRE[7:0] */ -+ Tempax <<= 2 ; /* Tempax << 2: VRE[5:0] */ -+ Tempcx = (Tempcx&0x600)>>8; /* Tempcx VRS[10:9] */ -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x3F , ~0xFC, Tempax ) ; /* SR3F D[7:2]->VRE D[5:0] */ -+ XGI_SetRegANDOR( (XGIIOADDRESS) 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] */ -+ XGI_SetReg( (XGIIOADDRESS) 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] */ -+ XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3c4 , 0x2F , Tempax ) ; /* SR2F [7:2][1:0]: HRE[5:0]HRS[9:8] */ -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x30 , 0xE3 , 00 ) ; -+ -+ Tempax = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 10 ] ; /* CR10 VRS */ -+ XGI_SetReg( (XGIIOADDRESS) 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] */ -+ XGI_SetRegANDOR( (XGIIOADDRESS) 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 */ -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x3F , ~0xFC , Tempax ) ; /* SR3F[7:2]:VRE[5:0] */ -+ Tempax = Tempcx >> 8; -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x35 , ~0x07 , Tempax ) ; /* SR35[2:0]:VRS[10:8] */ -+ } -+} -+ -+ -+/* Jong 10/04/2007; merge code */ -+/* --------------------------------------------------------------------- */ -+/* Function : XGI_SetXG21LCD */ -+/* Input : */ -+/* Output : FCLK duty cycle, FCLK delay compensation */ -+/* Description : All values set zero */ -+/* --------------------------------------------------------------------- */ -+void XGI_SetXG21LCD(PVB_DEVICE_INFO pVBInfo,USHORT RefreshRateTableIndex,USHORT ModeNo) -+{ -+ USHORT Data , Temp , b3CC ; -+ USHORT XGI_P3cc ; -+ -+ if ( ModeNo > 0x13 ) -+ Data = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_InfoFlag ; -+ XGI_P3cc = pVBInfo->P3cc ; -+ -+ XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x2E , 0x00 ) ; -+ XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x2F , 0x00 ) ; -+ XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x46 , 0x00 ) ; -+ XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x47 , 0x00 ) ; -+ if ( ((*pVBInfo->pDVOSetting)&0xC0) == 0xC0 ) -+ { -+ XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x2E , *pVBInfo->pCR2E ) ; -+ XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x2F , *pVBInfo->pCR2F ) ; -+ XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x46 , *pVBInfo->pCR46 ) ; -+ XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x47 , *pVBInfo->pCR47 ) ; -+ } -+ -+ Temp = XGI_GetReg( pVBInfo->P3d4 , 0x37 ) ; -+ -+ if ( Temp & 0x01 ) -+ { -+ XGI_SetRegOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x06 , 0x40 ) ; /* 18 bits FP */ -+ XGI_SetRegOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x09 , 0x40 ) ; -+ } -+ -+ XGI_SetRegOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x1E , 0x01 ) ; /* Negative blank polarity */ -+ -+ XGI_SetRegAND( (XGIIOADDRESS) pVBInfo->P3c4 , 0x30 , ~0x20 ) ; -+ XGI_SetRegAND( (XGIIOADDRESS) pVBInfo->P3c4 , 0x35 , ~0x80 ) ; -+ -+ if ( ModeNo <= 0x13 ) -+ { -+ b3CC = (UCHAR) XGI_GetRegByte( (XGIIOADDRESS) XGI_P3cc ) ; -+ if ( b3CC & 0x40 ) -+ XGI_SetRegOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x30 , 0x20 ) ; /* Hsync polarity */ -+ if ( b3CC & 0x80 ) -+ XGI_SetRegOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x35 , 0x80 ) ; /* Vsync polarity */ -+ } -+ else -+ { -+ if ( Data & 0x4000 ) -+ XGI_SetRegOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x30 , 0x20 ) ; /* Hsync polarity */ -+ if ( Data & 0x8000 ) -+ XGI_SetRegOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x35 , 0x80 ) ; /* Vsync polarity */ -+ } -+} -+ -+/* Jong 10/04/2007; merge code */ -+void XGI_SetXG27LCD(PVB_DEVICE_INFO pVBInfo,USHORT RefreshRateTableIndex,USHORT ModeNo) -+{ -+ USHORT Data , Temp , b3CC ; -+ USHORT XGI_P3cc ; -+ -+ if ( ModeNo > 0x13 ) -+ Data = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_InfoFlag ; -+ XGI_P3cc = pVBInfo->P3cc ; -+ -+ XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x2E , 0x00 ) ; -+ XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x2F , 0x00 ) ; -+ XGI_SetReg( pVBInfo->P3d4 , 0x46 , 0x00 ) ; -+ XGI_SetReg( pVBInfo->P3d4 , 0x47 , 0x00 ) ; -+ -+ Temp = XGI_GetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x37 ) ; -+ if ( ( Temp & 0x03 ) == 0 ) /* dual 12 */ -+ { -+ XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x46 , 0x13 ) ; -+ XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x47 , 0x13 ) ; -+ } -+ -+ if ( ((*pVBInfo->pDVOSetting)&0xC0) == 0xC0 ) -+ { -+ XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x2E , *pVBInfo->pCR2E ) ; -+ XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x2F , *pVBInfo->pCR2F ) ; -+ XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x46 , *pVBInfo->pCR46 ) ; -+ XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x47 , *pVBInfo->pCR47 ) ; -+ } -+ -+ XGI_SetXG27FPBits(pVBInfo); -+ -+ XGI_SetRegOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x1E , 0x01 ) ; /* Negative blank polarity */ -+ -+ XGI_SetRegAND( (XGIIOADDRESS) pVBInfo->P3c4 , 0x30 , ~0x20 ) ; /* Hsync polarity */ -+ XGI_SetRegAND( (XGIIOADDRESS) pVBInfo->P3c4 , 0x35 , ~0x80 ) ; /* Vsync polarity */ -+ -+ if ( ModeNo <= 0x13 ) -+ { -+ b3CC = (UCHAR) XGI_GetRegByte( (XGIIOADDRESS) XGI_P3cc ) ; -+ if ( b3CC & 0x40 ) -+ XGI_SetRegOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x30 , 0x20 ) ; /* Hsync polarity */ -+ if ( b3CC & 0x80 ) -+ XGI_SetRegOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x35 , 0x80 ) ; /* Vsync polarity */ -+ } -+ else -+ { -+ if ( Data & 0x4000 ) -+ XGI_SetRegOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x30 , 0x20 ) ; /* Hsync polarity */ -+ if ( Data & 0x8000 ) -+ XGI_SetRegOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x35 , 0x80 ) ; /* Vsync polarity */ -+ } -+} -+ -+/* Jong 10/04/2007; merge code */ -+/* --------------------------------------------------------------------- */ -+/* Function : XGI_UpdateXG21CRTC */ -+/* Input : */ -+/* Output : CRT1 CRTC */ -+/* Description : Modify CRT1 Hsync/Vsync to fix LCD mode timing */ -+/* --------------------------------------------------------------------- */ -+void XGI_UpdateXG21CRTC( USHORT ModeNo , PVB_DEVICE_INFO pVBInfo , USHORT RefreshRateTableIndex ) -+{ -+ int i , index = -1; -+ -+ XGI_SetRegAND( (XGIIOADDRESS) 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 ) -+ { -+ XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x02 , pVBInfo->UpdateCRT1[ index ].CR02 ) ; -+ XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x03 , pVBInfo->UpdateCRT1[ index ].CR03 ) ; -+ XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x15 , pVBInfo->UpdateCRT1[ index ].CR15 ) ; -+ XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x16 , pVBInfo->UpdateCRT1[ index ].CR16 ) ; -+ } -+} -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGI_SetCRT1DE */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+void -+XGI_SetCRT1DE(PXGI_HW_DEVICE_INFO HwDeviceExtension, USHORT ModeNo, -+ USHORT ModeIdIndex, USHORT RefreshRateTableIndex, -+ PVB_DEVICE_INFO pVBInfo) -+{ -+ USHORT tempax, tempbx, tempcx, temp, modeflag; -+ UCHAR data; -+ const USHORT 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 = (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x11); -+ data = (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x11); -+ data &= 0x7F; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x11, data); /* Unlock CRTC */ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x01, (USHORT) (tempcx & 0xff)); -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4, 0x0b, ~0x0c, -+ (USHORT) ((tempcx & 0x0ff00) >> 10)); -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x12, (USHORT) (tempbx & 0xff)); -+ tempax = 0; -+ tempbx = tempbx >> 8; -+ -+ if (tempbx & 0x01) -+ tempax |= 0x02; -+ -+ if (tempbx & 0x02) -+ tempax |= 0x40; -+ -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4, 0x07, ~0x42, tempax); -+ data = (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x07); -+ data &= 0xFF; -+ tempax = 0; -+ -+ if (tempbx & 0x04) -+ tempax |= 0x02; -+ -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4, 0x0a, ~0x02, tempax); -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x11, temp); -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGI_GetResInfo */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+USHORT -+XGI_GetResInfo(USHORT ModeNo, USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo) -+{ -+ return (ModeNo <= 0x13) -+ ? pVBInfo->SModeIDTable[ModeIdIndex].St_ResInfo -+ : pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO; -+} -+ -+ -+static void -+get_mode_xres_yres(USHORT ModeNo, USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo, -+ unsigned *width, unsigned *height) -+{ -+ const USHORT resindex = XGI_GetResInfo(ModeNo, ModeIdIndex, pVBInfo); -+ unsigned xres; -+ unsigned yres; -+ -+ -+ if (ModeNo <= 0x13) { -+ xres = pVBInfo->StResInfo[resindex].HTotal; -+ yres = pVBInfo->StResInfo[resindex].VTotal; -+ } -+ else { -+ const unsigned modeflag = -+ pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag; -+ -+ xres = pVBInfo->ModeResInfo[resindex].HTotal; -+ yres = pVBInfo->ModeResInfo[resindex].VTotal; -+ -+ if (modeflag & HalfDCLK) -+ xres *= 2; -+ -+ if (modeflag & DoubleScanMode) -+ yres *= 2; -+ } -+ -+ *width = xres; -+ *height = yres; -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGI_SetCRT1Offset */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+void -+XGI_SetCRT1Offset(USHORT ModeNo, USHORT ModeIdIndex, -+ USHORT RefreshRateTableIndex, -+ PXGI_HW_DEVICE_INFO HwDeviceExtension, -+ PVB_DEVICE_INFO pVBInfo) -+{ -+ USHORT 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 = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x0E); -+ i &= 0xF0; -+ i |= temp; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x0E, i); -+ -+ temp = (UCHAR) temp2; -+ temp &= 0xFF; /* al */ -+ XGI_SetReg((XGIIOADDRESS) 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; -+ -+ /* Jong 10/04/2007; merge code */ -+ if (HwDeviceExtension->jChipType >= XG20) -+ if ((ModeNo == 0x4A) | (ModeNo == 0x49)) -+ ah -= 1; -+ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x10, ah); -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGI_SetCRT1VCLK */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+void -+XGI_SetCRT1VCLK(USHORT ModeNo, USHORT ModeIdIndex, -+ PXGI_HW_DEVICE_INFO HwDeviceExtension, -+ USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo) -+{ -+ unsigned index; -+ unsigned clka; -+ unsigned clkb; -+ unsigned data; /* Jong 10/04/2007; merge code */ -+ -+ /* Jong 10/04/2007; merge code */ -+ if ( pVBInfo->IF_DEF_LVDS == 1 ) -+ { -+ index = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_CRTVCLK ; -+ clka = pVBInfo->VCLKData[ index ].SR2B; -+ clkb = pVBInfo->VCLKData[ index ].SR2C; -+ } -+ else if ((pVBInfo->VBType & VB_XGI301BLV302BLV) -+ && (pVBInfo->VBInfo & SetCRT2ToLCDA)) { -+ index = XGI_GetVCLK2Ptr(ModeNo, ModeIdIndex, RefreshRateTableIndex, -+ pVBInfo); -+ -+ clka = pVBInfo->VBVCLKData[index].Part4_A; -+ clkb = pVBInfo->VBVCLKData[index].Part4_B; -+ } -+ else { -+ index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRTVCLK; -+ -+ clka = pVBInfo->VCLKData[index].SR2B; -+ clkb = pVBInfo->VCLKData[index].SR2C; -+ } -+ -+ XGI_SetRegAND((XGIIOADDRESS) pVBInfo->P3c4, 0x31, 0xCF); -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x2B, clka); -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x2C, clkb); -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x2D, 0x01); -+ -+ /* Jong 10/04/2007; merge code */ -+ if ((HwDeviceExtension->jChipType >= XG20) -+ && (pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag & HalfDCLK)) { -+ UCHAR data; -+ -+ /* FIXME: Does this actually serve any purpose? This register is -+ * FIXME: already written above. -+ */ -+ data = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x2B); -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x2B, data); -+ -+ /* FIXME: The logic here seems wrong. It looks like its possible -+ * FIXME: for the (data << 1) to cause a bit to creep into the index -+ * FIXME: part. THere's no documentation for this register, so I have -+ * FIXME: no way of knowing. :( -+ */ -+ data = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x2C); -+ index = data; -+ index &= 0xE0; -+ data &= 0x1F; -+ data = data << 1; -+ data += 1; -+ data |= index; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x2C, data); -+ } -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGI_SetCRT1FIFO */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+void -+XGI_SetCRT1FIFO(USHORT ModeNo, PXGI_HW_DEVICE_INFO HwDeviceExtension, -+ PVB_DEVICE_INFO pVBInfo) -+{ -+ USHORT data; -+ -+ data = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x3D); -+ data &= 0xfe; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x3D, data); /* diable auto-threshold */ -+ -+ if (ModeNo > 0x13) { -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x08, 0x34); -+ data = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x09); -+ data &= 0xF0; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x09, data); -+ data = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x3D); -+ data |= 0x01; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x3D, data); -+ } -+ else { -+ if (HwDeviceExtension->jChipType == XG27) -+ { -+ XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3c4 , 0x08 , 0x0E ) ; -+ data = XGI_GetReg( (XGIIOADDRESS) pVBInfo->P3c4 , 0x09 ) ; -+ data &= 0xC0 ; -+ XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3c4 , 0x09 , data | 0x20 ) ; -+ } -+ else -+ { -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x08, 0xAE); -+ data = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x09); -+ data &= 0xF0; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x09, data); -+ } -+ } -+ -+ /* Jong 10/17/2007; merge code */ -+ if (HwDeviceExtension->jChipType == XG21) -+ { -+ XGI_SetXG21FPBits(pVBInfo); /* Fix SR9[7:6] can't read back */ -+ } -+ -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGI_SetCRT1ModeRegs */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+void -+XGI_SetCRT1ModeRegs(PXGI_HW_DEVICE_INFO HwDeviceExtension, -+ USHORT ModeNo, USHORT ModeIdIndex, -+ USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo) -+{ -+ USHORT 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 (XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x31) & 0x01) -+ XGI_SetRegANDOR((XGIIOADDRESS) 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; -+ -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3c4, 0x06, ~0x3F, data2); -+ /* XGI_SetReg((XGIIOADDRESS)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; -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4, 0x19, 0xFF, data2); -+ data2 = (data & 0xFF00) >> 8; -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4, 0x19, 0xFC, data2); -+ -+ if (modeflag & HalfDCLK) -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3c4, 0x01, 0xF7, 0x08); -+ -+ data2 = 0; -+ -+ if (modeflag & LineCompareOff) -+ data2 |= 0x08; -+ -+ if (ModeNo > 0x13) { -+ if (pVBInfo->ModeType == ModeEGA) -+ data2 |= 0x40; -+ } -+ -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3c4, 0x0F, ~0x48, data2); -+ data = 0x60; -+ if (pVBInfo->ModeType != ModeText) { -+ data = data ^ 0x60; -+ if (pVBInfo->ModeType != ModeEGA) { -+ data = data ^ 0xA0; -+ } -+ } -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3c4, 0x21, 0x1F, data); -+ -+ XGI_SetVCLKState(HwDeviceExtension, ModeNo, RefreshRateTableIndex, -+ pVBInfo); -+ -+ data = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x31); -+ -+ /* Jong 10/04/2007; merge code */ -+ if (HwDeviceExtension->jChipType == XG27 ) -+ { -+ if ( data & 0x40 ) -+ data = 0x2c ; -+ else -+ data = 0x6c ; -+ XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x52 , data ) ; -+ XGI_SetRegOR( (XGIIOADDRESS) pVBInfo->P3d4 , 0x51 , 0x10 ) ; -+ } -+ else if (HwDeviceExtension->jChipType >= XG20) -+ { -+ if (data & 0x40) -+ data = 0x33; -+ else -+ data = 0x73; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x52, data); -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x51, 0x02); -+ } -+ else { -+ if (data & 0x40) -+ data = 0x2c; -+ else -+ data = 0x6c; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x52, data); -+ } -+ -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGI_SetVCLKState */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+void -+XGI_SetVCLKState(PXGI_HW_DEVICE_INFO HwDeviceExtension, USHORT ModeNo, -+ USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo) -+{ -+ USHORT data, data2 = 0; -+ SHORT VCLK; -+ -+ UCHAR index; -+ -+ if (ModeNo <= 0x13) -+ VCLK = 0; -+ else { -+ index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRTVCLK; -+ index &= IndexMask; -+ VCLK = pVBInfo->VCLKData[index].CLOCK; -+ } -+ -+ data = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x32); -+ data &= 0xf3; -+ if (VCLK >= 200) -+ data |= 0x0c; /* VCLK > 200 */ -+ -+ /* Jong 10/04/2007; merge code */ -+ if (HwDeviceExtension->jChipType >= XG20) -+ data &= ~0x04; /* 2 pixel mode */ -+ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x32, data); -+ -+ /* Jong 10/04/2007; merge code */ -+ if (HwDeviceExtension->jChipType < XG20) { -+ data = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x1F); -+ data &= 0xE7; -+ if (VCLK < 200) -+ data |= 0x10; -+ XGI_SetReg((XGIIOADDRESS) 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 ; -+ -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3c4, 0x07, 0xFC, data2); -+ -+ /* Jong 10/04/2007; merge code */ -+ if (HwDeviceExtension->jChipType >= XG27 ) -+ { -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x40 , 0xFC , data2&0x03 ) ; -+ } -+ -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGI_LoadDAC */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+void -+XGI_LoadDAC(USHORT ModeNo, USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo) -+{ -+ USHORT data, data2, time, i, j, k, m, n, o, si, di, bx, dl, al, ah, dh; -+ const uint8_t *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 = XGI_MDA_DAC; -+ else if (data == 0x08) -+ table = XGI_CGA_DAC; -+ else if (data == 0x10) -+ table = XGI_EGA_DAC; -+ else if (data == 0x18) { -+ time = 256; -+ table = XGI_VGA_DAC; -+ } -+ -+ if (time == 256) -+ j = 16; -+ else -+ j = time; -+ -+ XGI_SetRegByte((XGIIOADDRESS) pVBInfo->P3c6, 0xFF); -+ XGI_SetRegByte((XGIIOADDRESS) 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; -+ -+ XGI_SetRegByte((XGIIOADDRESS) pVBInfo->P3c9, data2); -+ data = data >> 2; -+ } -+ } -+ -+ if (time == 256) { -+ for (i = 16; i < 32; i++) { -+ data = table[i]; -+ -+ for (k = 0; k < 3; k++) -+ XGI_SetRegByte((XGIIOADDRESS) 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((XGIIOADDRESS) pVBInfo->P3c9, 0, dl, -+ ah, al, dh); -+ } -+ -+ si -= 2; -+ -+ for (o = 0; o < 3; o++) { -+ dh = table[bx]; -+ ah = table[di]; -+ al = table[si]; -+ si--; -+ XGI_WriteDAC((XGIIOADDRESS) pVBInfo->P3c9, 0, dl, -+ ah, al, dh); -+ } -+ -+ dl++; -+ } -+ -+ si += 5; -+ } -+ } -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGI_WriteDAC */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+void -+XGI_WriteDAC(XGIIOADDRESS dac_data, unsigned shift, unsigned ordering, -+ uint8_t ah, uint8_t al, uint8_t dh) -+{ -+ USHORT temp, bh, bl; -+ -+ if (shift) { -+ ah <<= 2; -+ al <<= 2; -+ dh <<= 2; -+ } -+ -+ bh = ah; -+ bl = al; -+ -+ if (ordering != 0) { -+ temp = bh; -+ bh = dh; -+ dh = temp; -+ if (ordering == 1) { -+ temp = bl; -+ bl = dh; -+ dh = temp; -+ } -+ else { -+ temp = bl; -+ bl = bh; -+ bh = temp; -+ } -+ } -+ XGI_SetRegByte(dac_data, dh); -+ XGI_SetRegByte(dac_data, bh); -+ XGI_SetRegByte(dac_data, bl); -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGI_SetLCDAGroup */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+void -+XGI_SetLCDAGroup(USHORT ModeNo, USHORT ModeIdIndex, -+ PXGI_HW_DEVICE_INFO HwDeviceExtension, -+ PVB_DEVICE_INFO pVBInfo) -+{ -+ USHORT RefreshRateTableIndex; -+ /* USHORT 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); -+} -+ -+ -+/** -+ * Get LVDS resolution information. -+ */ -+void -+XGI_GetLVDSResInfo(USHORT ModeNo, USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo) -+{ -+ unsigned xres; -+ unsigned yres; -+ -+ -+ get_mode_xres_yres(ModeNo, ModeIdIndex, pVBInfo, &xres, &yres); -+ -+ if (xres == 720) -+ xres = 640; -+ -+ pVBInfo->VGAHDE = xres; -+ pVBInfo->HDE = xres; -+ pVBInfo->VGAVDE = yres; -+ pVBInfo->VDE = yres; -+} -+ -+ -+static void -+get_HDE_VDE(PVB_DEVICE_INFO pVBInfo, USHORT *HDE, USHORT *VDE) -+{ -+ switch (pVBInfo->LCDResInfo) { -+ case Panel1024x768: -+ case Panel1024x768x75: -+ *HDE = 1024; -+ *VDE = 768; -+ break; -+ -+ case Panel1280x1024: -+ case Panel1280x1024x75: -+ *HDE = 1280; -+ *VDE = 1024; -+ break; -+ -+ case Panel1400x1050: -+ *HDE = 1400; -+ *VDE = 1050; -+ break; -+ -+ default: -+ *HDE = 1600; -+ *VDE = 1200; -+ break; -+ } -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGI_GetLVDSData */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+void -+XGI_GetLVDSData(USHORT ModeNo, USHORT ModeIdIndex, -+ USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo) -+{ -+ USHORT tempbx; -+ XGI330_LVDSDataStruct *LCDPtr = NULL; -+ -+ tempbx = 2; -+ -+ if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) { -+ LCDPtr = -+ (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->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) { -+ if (!(pVBInfo->LCDInfo & (SetLCDtoNonExpanding | EnableScalingLCD))) { -+ get_HDE_VDE(pVBInfo, & pVBInfo->HDE, & pVBInfo->VDE); -+ } -+ } -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGI_ModCRT1Regs */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+void -+XGI_ModCRT1Regs(USHORT ModeNo, USHORT ModeIdIndex, -+ USHORT RefreshRateTableIndex, -+ PXGI_HW_DEVICE_INFO HwDeviceExtension, -+ PVB_DEVICE_INFO pVBInfo) -+{ -+ UCHAR index; -+ USHORT tempbx, i; -+ XGI_LVDSCRT1HDataStruct *LCDPtr = NULL; -+ XGI_LVDSCRT1VDataStruct *LCDPtr1 = NULL; -+ /* XGI330_CHTVDataStruct *TVPtr = 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 = -+ (XGI_LVDSCRT1HDataStruct *) XGI_GetLcdPtr(tempbx, ModeNo, -+ ModeIdIndex, -+ RefreshRateTableIndex, -+ pVBInfo); -+ -+ for (i = 0; i < 8; i++) -+ pVBInfo->TimingH.data[i] = LCDPtr[0].Reg[i]; -+ } -+ -+ XGI_SetCRT1Timing_H(pVBInfo, HwDeviceExtension); -+ -+ tempbx = 1; -+ -+ if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) { -+ LCDPtr1 = -+ (XGI_LVDSCRT1VDataStruct *) XGI_GetLcdPtr(tempbx, ModeNo, -+ ModeIdIndex, -+ RefreshRateTableIndex, -+ pVBInfo); -+ for (i = 0; i < 7; i++) -+ pVBInfo->TimingV.data[i] = LCDPtr1[0].Reg[i]; -+ } -+ -+ XGI_SetCRT1Timing_V(ModeIdIndex, ModeNo, pVBInfo); -+ } -+} -+ -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGI_SetLVDSRegs */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+void -+XGI_SetLVDSRegs(USHORT ModeNo, USHORT ModeIdIndex, -+ USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo) -+{ -+ USHORT tempbx, tempax, tempcx, tempdx, push1, push2, modeflag; -+ unsigned long temp, temp1, temp2, temp3, push3; -+ XGI330_LCDDataDesStruct *LCDPtr = NULL; -+ 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_OEMUtil == 1) { -+ tempbx = 8; -+ LCDPtr = -+ (XGI330_LCDDataDesStruct *) XGI_GetLcdPtr(tempbx, ModeNo, -+ ModeIdIndex, -+ RefreshRateTableIndex, -+ pVBInfo); -+ } -+ -+ if ((pVBInfo->IF_DEF_OEMUtil == 0) || (LCDPtr == 0)) { -+ tempbx = 3; -+ if (pVBInfo->LCDInfo & EnableScalingLCD) -+ LCDPtr1 = -+ (XGI330_LCDDataDesStruct2 *) XGI_GetLcdPtr(tempbx, ModeNo, -+ ModeIdIndex, -+ RefreshRateTableIndex, -+ pVBInfo); -+ else -+ LCDPtr = -+ (XGI330_LCDDataDesStruct *) XGI_GetLcdPtr(tempbx, ModeNo, -+ ModeIdIndex, -+ RefreshRateTableIndex, -+ pVBInfo); -+ } -+ -+ XGI_GetLCDSync(&tempax, &tempbx, pVBInfo); -+ push1 = tempbx; -+ push2 = tempax; -+ -+ /* GetLCDResInfo */ -+ if (pVBInfo->LCDInfo & SetLCDtoNonExpanding) { -+ get_HDE_VDE(pVBInfo, & pVBInfo->HDE, & pVBInfo->VDE); -+ -+ pVBInfo->VGAHDE = pVBInfo->HDE; -+ pVBInfo->VGAVDE = pVBInfo->VDE; -+ } -+ -+ tempax = pVBInfo->HT; -+ -+ tempbx = (pVBInfo->LCDInfo & EnableScalingLCD) -+ ? LCDPtr1->LCDHDES : LCDPtr->LCDHDES; -+ -+ tempcx = pVBInfo->HDE; -+ tempbx = tempbx & 0x0fff; -+ tempcx += tempbx; -+ -+ if (tempcx >= tempax) -+ tempcx -= tempax; -+ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x1A, tempbx & 0x07); -+ -+ tempcx = tempcx >> 3; -+ tempbx = tempbx >> 3; -+ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x16, -+ (USHORT) (tempbx & 0xff)); -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x17, -+ (USHORT) (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; -+ -+ /* FIXME: Won't this *always* set tempax to zero? */ -+ tempax = tempbx & 0x07; -+ tempax = tempax >> 5; -+ tempcx = tempcx >> 3; -+ tempbx = tempbx >> 3; -+ -+ tempcx &= 0x1f; -+ tempax |= tempcx; -+ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x15, tempax); -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x14, -+ (USHORT) (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; -+ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x1b, -+ (USHORT) (tempbx & 0xff)); -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x1c, -+ (USHORT) (tempcx & 0xff)); -+ -+ tempbx = (tempbx >> 8) & 0x07; -+ tempcx = (tempcx >> 8) & 0x07; -+ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x1d, -+ (USHORT) ((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; -+ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x18, -+ (USHORT) (tempbx & 0xff)); -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part1Port, 0x19, ~0x0f, -+ (USHORT) (tempcx & 0x0f)); -+ -+ tempax = ((tempbx >> 8) & 0x07) << 3; -+ -+ tempbx = pVBInfo->VGAVDE; -+ if (tempbx != pVBInfo->VDE) -+ tempax |= 0x40; -+ -+ if (pVBInfo->LCDInfo & EnableLVDSDDA) -+ tempax |= 0x40; -+ -+ XGI_SetRegANDOR((XGIIOADDRESS) 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 = (USHORT) ((temp << 18) % tempbx); -+ -+ if (tempdx != 0) -+ temp1 += 1; -+ -+ temp2 = temp1; -+ push3 = temp2; -+ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x37, -+ (USHORT) (temp2 & 0xff)); -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x36, -+ (USHORT) ((temp2 >> 8) & 0xff)); -+ -+ tempbx = (USHORT) (temp2 >> 16); -+ tempax = tempbx & 0x03; -+ -+ tempbx = pVBInfo->VGAVDE; -+ if (tempbx == pVBInfo->VDE) -+ tempax |= 0x04; -+ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x35, tempax); -+ -+ if (pVBInfo->VBType & VB_XGI301C) { -+ temp2 = push3; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x3c, -+ (USHORT) (temp2 & 0xff)); -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x3b, -+ (USHORT) ((temp2 >> 8) & 0xff)); -+ tempbx = (USHORT) (temp2 >> 16); -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part4Port, 0x3a, ~0xc0, -+ (USHORT) ((tempbx & 0xff) << 6)); -+ -+ tempcx = pVBInfo->VGAVDE; -+ if (tempcx == pVBInfo->VDE) -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part4Port, 0x30, -+ ~0x0c, 0x00); -+ else -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part4Port, 0x30, -+ ~0x0c, 0x08); -+ } -+ -+ tempcx = pVBInfo->VGAHDE; -+ tempbx = pVBInfo->HDE; -+ -+ temp1 = tempcx << 16; -+ -+ tempax = (USHORT) (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 = (USHORT) (temp3 & 0xff); -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x1f, tempax); -+ -+ temp1 = pVBInfo->VGAVDE << 18; -+ temp1 = temp1 / push3; -+ tempbx = (USHORT) (temp1 & 0xffff); -+ -+ if (pVBInfo->LCDResInfo == Panel1024x768) -+ tempbx -= 1; -+ -+ tempax = ((tempbx >> 8) & 0xff) << 3; -+ tempax |= (USHORT) ((temp3 >> 8) & 0x07); -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x20, -+ (USHORT) (tempax & 0xff)); -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x21, -+ (USHORT) (tempbx & 0xff)); -+ -+ temp3 = temp3 >> 16; -+ -+ if (modeflag & HalfDCLK) -+ temp3 = temp3 >> 1; -+ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x22, -+ (USHORT) ((temp3 >> 8) & 0xff)); -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x23, -+ (USHORT) (temp3 & 0xff)); -+ } -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGI_SetCRT2ECLK */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+void -+XGI_SetCRT2ECLK(USHORT ModeNo, USHORT ModeIdIndex, -+ USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo) -+{ -+ UCHAR di[2]; -+ int i; -+ const unsigned vclkindex = -+ XGI_GetVCLKPtr(RefreshRateTableIndex, ModeNo, ModeIdIndex, pVBInfo); -+ -+ XGI_GetVCLKLen(vclkindex, di, pVBInfo); -+ XGI_GetLCDVCLKPtr(di, pVBInfo); -+ -+ for (i = 0; i < 4; i++) { -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4, 0x31, ~0x30, -+ (USHORT) (0x10 * i)); -+ if ((!(pVBInfo->VBInfo & SetCRT2ToLCDA)) -+ && (!(pVBInfo->VBInfo & SetInSlaveMode))) { -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x2e, di[0]); -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x2f, di[1]); -+ } -+ else { -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x2b, di[0]); -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x2c, di[1]); -+ } -+ } -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGI_UpdateModeInfo */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+void -+XGI_UpdateModeInfo(PXGI_HW_DEVICE_INFO HwDeviceExtension, -+ PVB_DEVICE_INFO pVBInfo) -+{ -+ USHORT tempcl, tempch, temp, tempbl, tempax; -+ -+ if (pVBInfo-> -+ VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | -+ VB_XGI301C)) { -+ tempcl = 0; -+ tempch = 0; -+ temp = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x01); -+ -+ if (!(temp & 0x20)) { -+ temp = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x17); -+ if (temp & 0x80) { -+ /* Jong 10/04/2007; merge code */ -+ if ((HwDeviceExtension->jChipType >= XG20) -+ || (HwDeviceExtension->jChipType >= XG40)) -+ temp = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x53); -+ else -+ temp = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x63); -+ -+ if (!(temp & 0x40)) -+ tempcl |= ActiveCRT1; -+ } -+ } -+ -+ temp = XGI_GetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x2e); -+ temp &= 0x0f; -+ -+ if (!(temp == 0x08)) { -+ tempax = XGI_GetReg((XGIIOADDRESS) 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 = XGI_GetReg((XGIIOADDRESS) 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 = -+ XGI_GetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x4d); -+ -+ if (temp & 0x10) -+ tempch |= ActiveYPbPr; -+ } -+ -+ if (tempch != 0) -+ tempcl |= ActiveTV; -+ } -+ } -+ -+ temp = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x3d); -+ if (tempcl & ActiveLCD) { -+ if ((pVBInfo->SetFlag & ReserveTVOption)) { -+ if (temp & ActiveTV) -+ tempcl |= ActiveTV; -+ } -+ } -+ temp = tempcl; -+ tempbl = ~ModeSwitchStatus; -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4, 0x3d, tempbl, temp); -+ -+ if (!(pVBInfo->SetFlag & ReserveTVOption)) -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x3e, tempch); -+ } -+ else { -+ return; -+ } -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGI_GetVBType */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+void -+XGI_GetVBType(PVB_DEVICE_INFO pVBInfo) -+{ -+ USHORT flag, tempbx, tempah; -+ -+ /* Jong 10/04/2007; merge code */ -+ if ( pVBInfo->IF_DEF_LVDS == 0 ) -+ { -+ tempbx = VB_XGI302B; -+ flag = XGI_GetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x00); -+ if (flag != 0x02) { -+ tempbx = VB_XGI301; -+ flag = XGI_GetReg((XGIIOADDRESS) 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 = XGI_GetReg((XGIIOADDRESS) pVBInfo->Part4Port, -+ 0x39); -+ if (tempah != 0xFF) -+ tempbx = VB_XGI301C; -+ } -+ } -+ } -+ -+ if (tempbx & (VB_XGI301B | VB_XGI302B)) { -+ flag = XGI_GetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x23); -+ -+ if (!(flag & 0x02)) -+ tempbx = tempbx | VB_NoLCD; -+ } -+ } -+ } -+ -+ pVBInfo->VBType = tempbx; -+ } -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGI_GetVBInfo */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+void -+XGI_GetVBInfo(USHORT ModeNo, USHORT ModeIdIndex, -+ PXGI_HW_DEVICE_INFO HwDeviceExtension, PVB_DEVICE_INFO pVBInfo) -+{ -+ USHORT 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 = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x30); /* Check Display Device */ -+ tempbx = tempbx | temp; -+ temp = XGI_GetReg((XGIIOADDRESS) 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 = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x38); -+ -+ if (pVBInfo->IF_DEF_LCDA == 1) { -+ /* 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; -+ } -+ } -+ } -+ -+ if (pVBInfo->IF_DEF_YPbPr == 1) { -+ if ((pVBInfo->VBType & VB_XGI301LV) -+ || (pVBInfo->VBType & VB_XGI302LV) -+ || (pVBInfo->VBType & VB_XGI301C)) { -+ if (temp & SetYPbPr) { /* temp = CR38 */ -+ if (pVBInfo->IF_DEF_HiVision == 1) { -+ temp = XGI_GetReg((XGIIOADDRESS) 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 */ -+ -+ /* Jong 10/04/2007; merge code */ -+ 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) -+ && (HwDeviceExtension->jChipType <= XG45)) { -+ if (ModeNo <= 13) { -+ /* CRT2 not need to support */ -+ if (!(tempbx & SetCRT2ToRAMDAC)) { -+ 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(USHORT ModeNo, USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo) -+{ -+ USHORT 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 = XGI_GetReg((XGIIOADDRESS) 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); -+ } -+ -+ /* Jong 10/04/2007; merge code */ -+ if ( pVBInfo->IF_DEF_LVDS == 0 ) -+ { -+ if (pVBInfo->VBInfo & SetCRT2ToSCART) -+ tempbx |= SetPALTV; -+ } -+ -+ if (pVBInfo->IF_DEF_YPbPr == 1) { -+ if (pVBInfo->VBInfo & SetCRT2ToYPbPr) { -+ index1 = XGI_GetReg((XGIIOADDRESS) 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; -+ } -+ } -+ -+ /* Jong 10/17/2007; merge code */ -+ if ( pVBInfo->IF_DEF_LVDS == 0 ) -+ { -+ 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 : */ -+/* --------------------------------------------------------------------- */ -+BOOLEAN -+XGI_GetLCDInfo(USHORT ModeNo, USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo) -+{ -+ USHORT 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 = XGI_GetReg((XGIIOADDRESS) 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 = XGI_GetReg((XGIIOADDRESS) 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 = XGI_GetReg((XGIIOADDRESS) 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; -+ -+ /* Jong 10/17/2007; merge code */ -+ if ( pVBInfo->IF_DEF_LVDS == 0 ) /* shampoo */ -+ { -+ if (((pVBInfo->VBType & VB_XGI302LV) || (pVBInfo->VBType & VB_XGI301C)) -+ && (tempax & LCDDualLink)) { -+ tempbx |= SetLCDDualLink; -+ } -+ } -+ -+ /* Jong 10/17/1007; merge code */ -+ 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; -+ } -+ -+ temp = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x39); -+ if (temp & ReduceTiming) { -+ tempbx |= EnableReduceTiming; -+ } -+ -+ 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; -+ } -+ } -+ } -+ } -+ -+ /* Jong 10/04/2007; merge code */ -+ 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; -+ } -+ } -+ } -+ } -+ } -+ -+ return (1); -+} -+ -+/* Jong 10/04/2007; defined in init.c */ -+/* Function : XGI_SearchModeID */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+BOOLEAN -+XGINew_CheckMemorySize(PXGI_HW_DEVICE_INFO HwDeviceExtension, USHORT ModeNo, -+ USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo) -+{ -+ USHORT memorysize, modeflag, temp, temp1, tmp; -+ -+ 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 = XGI_GetReg((XGIIOADDRESS) 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 (FALSE); -+ else -+ return (TRUE); -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGI_DisplayOn */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+void -+XGI_DisplayOn(PXGI_HW_DEVICE_INFO HwDeviceExtension, PVB_DEVICE_INFO pVBInfo) -+{ -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3c4, 0x01, 0xDF, 0x00); -+ -+ /* Jong 10/04/2007; merge code */ -+ if ( HwDeviceExtension->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 */ -+ } -+ -+ } -+ -+ /* Jong 10/04/2007; merge code */ -+ if ( HwDeviceExtension->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(PXGI_HW_DEVICE_INFO HwDeviceExtension, PVB_DEVICE_INFO pVBInfo) -+{ -+ /* Jong 10/04/2007; merge code */ -+ if ( HwDeviceExtension->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 */ -+ } -+ } -+ -+ /* Jong 10/04/2007; merge code */ -+ if ( HwDeviceExtension->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 */ -+ } -+ } -+ -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3c4, 0x01, 0xDF, 0x20); -+} -+ -+ -+/** -+ * Wait for vertical or horizontal blanking period. -+ */ -+void -+XGI_WaitDisplay(PVB_DEVICE_INFO pVBInfo) -+{ -+ while ((XGI_GetRegByte((XGIIOADDRESS) pVBInfo->P3da) & 0x01)) -+ break; -+ -+ while (!(XGI_GetRegByte((XGIIOADDRESS) pVBInfo->P3da) & 0x01)) -+ break; -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGI_SenseCRT1 */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+ -+void -+XGI_SenseCRT1(PVB_DEVICE_INFO pVBInfo) -+{ -+ UCHAR CRTCData[17] = { 0x5F, 0x4F, 0x50, 0x82, 0x55, 0x81, -+ 0x0B, 0x3E, 0xE9, 0x0B, 0xDF, 0xE7, -+ 0x04, 0x00, 0x00, 0x05, 0x00 -+ }; -+ -+ UCHAR SR01 = 0, SR1F = 0, SR07 = 0, SR06 = 0; -+ -+ UCHAR CR17, CR63, SR31; -+ USHORT temp; -+ UCHAR DAC_TEST_PARMS[3] = { 0x0F, 0x0F, 0x0F }; -+ -+ int i; -+#ifndef LINUX_XF86 -+ int j; -+#endif -+ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x05, 0x86); -+ -+ /* [2004/05/06] Vicent to fix XG42 single LCD sense to CRT+LCD */ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x57, 0x4A); -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x53, -+ (UCHAR) (XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x53) | -+ 0x02)); -+ -+ SR31 = (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x31); -+ CR63 = (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x63); -+ SR01 = (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x01); -+ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x01, (UCHAR) (SR01 & 0xDF)); -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x63, (UCHAR) (CR63 & 0xBF)); -+ -+ CR17 = (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x17); -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x17, (UCHAR) (CR17 | 0x80)); -+ -+ SR1F = (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x1F); -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x1F, (UCHAR) (SR1F | 0x04)); -+ -+ SR07 = (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x07); -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x07, (UCHAR) (SR07 & 0xFB)); -+ SR06 = (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x06); -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x06, (UCHAR) (SR06 & 0xC3)); -+ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x11, 0x00); -+ -+ for (i = 0; i < 8; i++) -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, (USHORT) i, CRTCData[i]); -+ -+ for (i = 8; i < 11; i++) -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, (USHORT) (i + 8), -+ CRTCData[i]); -+ -+ for (i = 11; i < 13; i++) -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, (USHORT) (i + 4), -+ CRTCData[i]); -+ -+ for (i = 13; i < 16; i++) -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, (USHORT) (i - 3), -+ CRTCData[i]); -+ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x0E, -+ (UCHAR) (CRTCData[16] & 0xE0)); -+ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x31, 0x00); -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x2B, 0x1B); -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x2C, 0xE1); -+ -+ XGI_SetRegByte((XGIIOADDRESS) pVBInfo->P3c8, 0x00); -+ for (i = 0; i < 256; i++) { -+ XGI_SetRegByte((XGIIOADDRESS) (USHORT) (pVBInfo->P3c8 + 1), -+ (UCHAR) DAC_TEST_PARMS[0]); -+ XGI_SetRegByte((XGIIOADDRESS) (USHORT) (pVBInfo->P3c8 + 1), -+ (UCHAR) DAC_TEST_PARMS[1]); -+ XGI_SetRegByte((XGIIOADDRESS) (USHORT) (pVBInfo->P3c8 + 1), -+ (UCHAR) DAC_TEST_PARMS[2]); -+ } -+ -+ XGI_VBLongWait(pVBInfo); -+ XGI_VBLongWait(pVBInfo); -+ XGI_VBLongWait(pVBInfo); -+ -+ XGINew_LCD_Wait_Time(0x01, pVBInfo); -+ XGI_WaitDisplay(pVBInfo); -+ -+ temp = XGI_GetRegByte((XGIIOADDRESS) pVBInfo->P3c2); -+ if (temp & 0x10) { -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4, 0x32, 0xDF, 0x20); -+ } -+ else { -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4, 0x32, 0xDF, 0x00); -+ } -+ -+ /* alan, avoid display something, set BLACK DAC if not restore DAC */ -+ XGI_SetRegByte((XGIIOADDRESS) pVBInfo->P3c8, 0x00); -+ -+ for (i = 0; i < 256; i++) { -+ XGI_SetRegByte((XGIIOADDRESS) (USHORT) (pVBInfo->P3c8 + 1), 0); -+ XGI_SetRegByte((XGIIOADDRESS) (USHORT) (pVBInfo->P3c8 + 1), 0); -+ XGI_SetRegByte((XGIIOADDRESS) (USHORT) (pVBInfo->P3c8 + 1), 0); -+ } -+ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x01, SR01); -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x63, CR63); -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x31, SR31); -+ -+ /* [2004/05/11] Vicent */ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x53, -+ (UCHAR) (XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x53) & -+ 0xFD)); -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+BOOLEAN -+CheckDualChip(PVB_DEVICE_INFO pVBInfo) -+{ -+ /* Check H/W trap that 2nd chip is present or not. */ -+ return ((BOOLEAN) -+ (XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x3A) & -+ XGI_MASK_DUAL_CHIP)); -+} -+ -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : SetDualChipRegs */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+void -+SetDualChipRegs(PXGI_HW_DEVICE_INFO HwDeviceExtension, -+ PVB_DEVICE_INFO pVBInfo) -+{ -+ -+#ifdef LINUX_XF86 -+ USHORT BaseAddr2nd = (USHORT) (ULONG) HwDeviceExtension->pj2ndIOAddress; -+#else -+ USHORT BaseAddr2nd = (USHORT) HwDeviceExtension->pj2ndIOAddress; -+#endif -+ USHORT XGINew_P3CC = pVBInfo->BaseAddr + MISC_OUTPUT_REG_READ_PORT; -+ USHORT XGINew_2ndP3CE = BaseAddr2nd + GRAPH_ADDRESS_PORT; -+ USHORT XGINew_2ndP3C4 = BaseAddr2nd + SEQ_ADDRESS_PORT; -+ USHORT XGINew_2ndP3C2 = BaseAddr2nd + MISC_OUTPUT_REG_WRITE_PORT; -+ UCHAR tempal, i; -+ pVBInfo->BaseAddr = (USHORT) HwDeviceExtension->pjIOAddress; -+ for (i = 0x00; i <= 0x04; i++) { /* SR0 - SR4 */ -+ tempal = (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4, i); -+ XGI_SetReg((XGIIOADDRESS) XGINew_2ndP3C4, i, tempal); -+ } -+ for (i = 0x00; i <= 0x08; i++) { /* GR0 - GR8 */ -+ tempal = (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->P3ce, i); -+ XGI_SetReg((XGIIOADDRESS) XGINew_2ndP3CE, i, tempal); -+ } -+ /* OpenKey in 2nd chip */ -+ XGI_SetReg((XGIIOADDRESS) XGINew_2ndP3C4, 0x05, 0x86); -+ -+ /* Copy SR06 to 2nd chip */ -+ tempal = (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x06); -+ XGI_SetReg((XGIIOADDRESS) XGINew_2ndP3C4, 0x06, tempal); -+ -+ /* Copy SR21 to 2nd chip */ -+ tempal = (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x21); -+ XGI_SetReg((XGIIOADDRESS) XGINew_2ndP3C4, 0x21, tempal); -+ -+ /* Miscellaneous reg(input port 3cch,output port 3c2h) */ -+ tempal = (UCHAR) XGI_GetRegByte((XGIIOADDRESS) XGINew_P3CC); /* 3cc */ -+ XGI_SetRegByte((XGIIOADDRESS) XGINew_2ndP3C2, tempal); -+ -+ /* Close key in 2nd chip */ -+ XGI_SetReg((XGIIOADDRESS) XGINew_2ndP3C4, 0x05, 0x00); -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGI_SetCRT2Group301 */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+BOOLEAN -+XGI_SetCRT2Group301(USHORT ModeNo, PXGI_HW_DEVICE_INFO HwDeviceExtension, -+ PVB_DEVICE_INFO pVBInfo) -+{ -+ USHORT tempbx, ModeIdIndex, RefreshRateTableIndex; -+ USHORT temp_mode_no; -+ -+ tempbx = pVBInfo->VBInfo; -+ pVBInfo->SetFlag |= ProgrammingCRT2; -+ -+ temp_mode_no = ModeNo; -+ XGI_SearchModeID(pVBInfo->SModeIDTable, pVBInfo->EModeIDTable, 0x11, -+ &temp_mode_no, &ModeIdIndex); -+ -+ -+ 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(PVB_DEVICE_INFO pVBInfo) -+{ -+ if (!(pVBInfo->SetFlag & Win9xDOSMode)) -+ XGI_SetRegOR((XGIIOADDRESS) pVBInfo->Part1Port, 0x01, 0x40); -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGI_SaveCRT2Info */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+void -+XGI_SaveCRT2Info(USHORT ModeNo, PVB_DEVICE_INFO pVBInfo) -+{ -+ USHORT temp1, temp2; -+ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x34, ModeNo); /* reserve CR34 for CRT1 Mode No */ -+ temp1 = (pVBInfo->VBInfo & SetInSlaveMode) >> 8; -+ temp2 = ~(SetInSlaveMode >> 8); -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4, 0x31, temp2, temp1); -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGI_GetCRT2ResInfo */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+void -+XGI_GetCRT2ResInfo(USHORT ModeNo, USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo) -+{ -+ unsigned xres; -+ unsigned yres; -+ -+ -+ get_mode_xres_yres(ModeNo, ModeIdIndex, pVBInfo, &xres, &yres); -+ -+ if ((pVBInfo->VBInfo & SetCRT2ToLCD) -+ && !(pVBInfo->LCDInfo & (EnableScalingLCD | LCDNonExpanding))) { -+ switch (pVBInfo->LCDResInfo) { -+ case Panel1600x1200: -+ if (!(pVBInfo->LCDInfo & LCDVESATiming) && (yres == 1024)) { -+ yres = 1056; -+ } -+ break; -+ -+ -+ case Panel1280x1024: -+ if (yres == 400) -+ yres = 405; -+ else if (yres == 350) -+ yres = 360; -+ else if ((pVBInfo->LCDInfo & LCDVESATiming) && (yres == 360)) { -+ yres = 375; -+ } -+ break; -+ -+ -+ case Panel1024x768: -+ if (!(pVBInfo->LCDInfo & (LCDVESATiming | LCDNonExpanding))) { -+ if (yres == 350) { -+ yres = 357; -+ } -+ else if (yres == 400) { -+ yres = 420; -+ } -+ else if (yres == 480) { -+ yres = 525; -+ } -+ } -+ -+ break; -+ } -+ -+ if (xres == 720) -+ xres = 640; -+ } -+ -+ pVBInfo->VGAHDE = xres; -+ pVBInfo->HDE = xres; -+ pVBInfo->VGAVDE = yres; -+ pVBInfo->VDE = yres; -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGI_IsLCDDualLink */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+BOOLEAN -+XGI_IsLCDDualLink(PVB_DEVICE_INFO pVBInfo) -+{ -+ return (((pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) != 0) -+ && ((pVBInfo->LCDInfo & SetLCDDualLink) != 0)); -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGI_GetCRT2Data */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+void -+XGI_GetCRT2Data(USHORT ModeNo, USHORT ModeIdIndex, -+ USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo) -+{ -+ USHORT tempax = 0, tempbx, modeflag, resinfo; -+#ifndef LINUX_XF86 -+ USHORT CRT2Index, ResIndex; -+#endif -+ -+ XGI_LCDDataStruct *LCDPtr = NULL; -+ 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 = -+ (XGI_LCDDataStruct *) XGI_GetLcdPtr(tempbx, ModeNo, ModeIdIndex, -+ RefreshRateTableIndex, -+ pVBInfo); -+ -+ PDEBUG(ErrorF -+ ("C code setmode: ModeNo: 0x%08lX VGAHT:0x%081X \n", ModeNo, -+ LCDPtr->VGAHT)); -+ 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 | EnableScalingLCD)) { -+ tempax = pVBInfo->VGAHDE; -+ tempbx = pVBInfo->VGAVDE; -+ } -+ -+ pVBInfo->HDE = tempax; -+ pVBInfo->VDE = tempbx; -+ return; -+ } -+ -+ if (pVBInfo->VBInfo & (SetCRT2ToTV)) { -+ tempbx = 4; -+ TVPtr = -+ (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(USHORT ModeNo, USHORT ModeIdIndex, -+ USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo) -+{ -+ UCHAR di[2]; -+ const unsigned vclkindex = -+ XGI_GetVCLKPtr(RefreshRateTableIndex, ModeNo, ModeIdIndex, pVBInfo); -+ -+ XGI_GetVCLKLen(vclkindex, di, pVBInfo); -+ XGI_GetLCDVCLKPtr(di, pVBInfo); -+ -+ if (pVBInfo->VBType & VB_XGI301) { /* shampoo 0129 *//* 301 */ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x0A, 0x10); -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x0B, di[1]); -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x0A, di[0]); -+ } -+ else { /* 301b/302b/301lv/302lv */ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x0A, di[0]); -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x0B, di[1]); -+ } -+ -+ if ((pVBInfo->LCDInfo & EnableReduceTiming) -+ && (pVBInfo->LCDResInfo == Panel1600x1200)) { -+ if (pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO == 0x0A) { -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x0A, 0x5A); -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x0B, 0x24); -+ } -+ } -+ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x00, 0x12); -+ -+ if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) -+ XGI_SetRegOR((XGIIOADDRESS) pVBInfo->Part4Port, 0x12, 0x28); -+ else -+ XGI_SetRegOR((XGIIOADDRESS) pVBInfo->Part4Port, 0x12, 0x08); -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGI_GETLCDVCLKPtr */ -+/* Input : */ -+/* Output : al -> VCLK Index */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+void -+XGI_GetLCDVCLKPtr(UCHAR *di, PVB_DEVICE_INFO pVBInfo) -+{ -+ if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) { -+ if ((pVBInfo->IF_DEF_ScaleLCD != 1) -+ || !(pVBInfo->LCDInfo & EnableScalingLCD)) { -+ const unsigned 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 -+XGI_GetVCLKPtr(USHORT RefreshRateTableIndex, USHORT ModeNo, -+ USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo) -+{ -+ unsigned vclk; -+ const unsigned modeflag = (ModeNo <= 0x13) -+ ? pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag -+ : pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag; -+ -+ -+ if ((pVBInfo->SetFlag & ProgrammingCRT2) -+ && (!(pVBInfo->LCDInfo & EnableScalingLCD))) { /* {LCDA/LCDB} */ -+ const unsigned index = XGI_GetLCDCapPtr(pVBInfo); -+ vclk = pVBInfo->LCDCapList[index].LCD_VCLK; -+ -+ if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) -+ return vclk; -+ -+ /* {TV} */ -+ if (pVBInfo-> -+ VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | -+ VB_XGI301C)) { -+ if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) { -+ if (pVBInfo->TVInfo & TVSimuMode) { -+ vclk = (modeflag & Charx8Dot) -+ ? HiTVSimuVCLK : HiTVTextVCLK; -+ } -+ else { -+ vclk = (pVBInfo->TVInfo & RPLLDIV2XO) -+ ? HiTVVCLKDIV2 : HiTVVCLK; -+ } -+ -+ return vclk; -+ } -+ else if (pVBInfo->TVInfo & SetYPbPrMode750p) { -+ return YPbPr750pVCLK; -+ } -+ else if (pVBInfo->TVInfo & SetYPbPrMode525p) { -+ return YPbPr525pVCLK; -+ } -+ -+ vclk = NTSC1024VCLK; -+ -+ if (!(pVBInfo->TVInfo & NTSC1024x768)) { -+ vclk = (pVBInfo->TVInfo & RPLLDIV2XO) -+ ? TVVCLKDIV2 : TVVCLK; -+ } -+ -+ if (pVBInfo->VBInfo & SetCRT2ToTV) -+ return vclk; -+ } -+ } /* {End of VB} */ -+ -+ vclk = XGI_GetRegByte((XGIIOADDRESS) (pVBInfo->P3ca + 0x02)); -+ vclk = (vclk >> 2) & 0x03; -+ -+ /* for Dot8 Scaling LCD */ -+ if ((pVBInfo->LCDInfo & EnableScalingLCD) -+ && (modeflag & Charx8Dot) -+ && ((pVBInfo->IF_DEF_VideoCapture) == 1)) { -+ vclk = VCLK25_175; /* ; set to VCLK25MHz always */ -+ } -+ -+ if (ModeNo <= 0x13) -+ return vclk; -+ -+ return pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRTVCLK; -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGI_GetVCLKLen */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+void -+XGI_GetVCLKLen(unsigned vclkindex, UCHAR *di, PVB_DEVICE_INFO pVBInfo) -+{ -+ if (pVBInfo-> -+ VBType & (VB_XGI301 | VB_XGI301B | VB_XGI302B | VB_XGI301LV | -+ VB_XGI302LV | VB_XGI301C)) { -+ if ((!(pVBInfo->VBInfo & SetCRT2ToLCDA)) -+ && (pVBInfo->SetFlag & ProgrammingCRT2)) { -+ di[0] = XGI_VBVCLKData[vclkindex].SR2B; -+ di[1] = XGI_VBVCLKData[vclkindex].SR2C; -+ } -+ } -+ else { -+ di[0] = XGI_VCLKData[vclkindex].SR2B; -+ di[1] = XGI_VCLKData[vclkindex].SR2C; -+ } -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGI_SetCRT2Offset */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+void -+XGI_SetCRT2Offset(USHORT ModeNo, -+ USHORT ModeIdIndex, USHORT RefreshRateTableIndex, -+ PXGI_HW_DEVICE_INFO HwDeviceExtension, -+ PVB_DEVICE_INFO pVBInfo) -+{ -+ USHORT offset; -+ UCHAR temp; -+ -+ if (pVBInfo->VBInfo & SetInSlaveMode) { -+ return; -+ } -+ -+ offset = -+ XGI_GetOffset(ModeNo, ModeIdIndex, RefreshRateTableIndex, -+ HwDeviceExtension, pVBInfo); -+ temp = (UCHAR) (offset & 0xFF); -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x07, temp); -+ temp = (UCHAR) ((offset & 0xFF00) >> 8); -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x09, temp); -+ temp = (UCHAR) (((offset >> 3) & 0xFF) + 1); -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x03, temp); -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGI_GetOffset */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+USHORT -+XGI_GetOffset(USHORT ModeNo, USHORT ModeIdIndex, USHORT RefreshRateTableIndex, -+ PXGI_HW_DEVICE_INFO HwDeviceExtension, PVB_DEVICE_INFO pVBInfo) -+{ -+ USHORT 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); -+ -+ /* Jong 10/04/2007; merge code */ -+ 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 ) ; -+ -+ /* -+ if ((ModeNo >= 0x26) && (ModeNo <= 0x28)) { -+ return (temp * colordepth + (colordepth >> 1)); -+ } -+ else -+ return (temp * colordepth); */ -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGI_SetCRT2FIFO */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+void -+XGI_SetCRT2FIFO(PVB_DEVICE_INFO pVBInfo) -+{ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x01, 0x3B); /* threshold high ,disable auto threshold */ -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part1Port, 0x02, ~(0x3F), 0x04); /* threshold low default 04h */ -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGI_PreSetGroup1 */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+void -+XGI_PreSetGroup1(USHORT ModeNo, USHORT ModeIdIndex, -+ PXGI_HW_DEVICE_INFO HwDeviceExtension, -+ USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo) -+{ -+ USHORT tempcx = 0, CRT1Index = 0, resinfo = 0; -+#ifndef LINUX_XF86 -+ USHORT temp = 0, tempax = 0, tempbx = 0, pushbx = 0, modeflag; -+#endif -+ -+ 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++) { -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, tempcx, 0x0); -+ } -+ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x02, 0x44); /* temp 0206 */ -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGI_SetGroup1 */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+void -+XGI_SetGroup1(USHORT ModeNo, USHORT ModeIdIndex, -+ PXGI_HW_DEVICE_INFO HwDeviceExtension, -+ USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo) -+{ -+ USHORT 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 */ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x08, temp); -+ temp = (((pVBInfo->VGAHT / 2 - 1) & 0xFF00) >> 8) << 4; -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part1Port, 0x09, ~0x0F0, -+ temp); -+ temp = (pVBInfo->VGAHDE / 2 + 16) & 0x0FF; /* BTVGA2HDEE 0x0A,0x0C */ -+ XGI_SetReg((XGIIOADDRESS) 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; -+ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x0B, temp); -+ } -+ else { -+ temp = (pVBInfo->VGAHT - 1) & 0x0FF; /* BTVGA2HT 0x08,0x09 */ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x08, temp); -+ temp = (((pVBInfo->VGAHT - 1) & 0xFF00) >> 8) << 4; -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part1Port, 0x09, ~0x0F0, -+ temp); -+ temp = (pVBInfo->VGAHDE + 16) & 0x0FF; /* BTVGA2HDEE 0x0A,0x0C */ -+ XGI_SetReg((XGIIOADDRESS) 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; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x0B, temp); -+ } -+ -+ tempax = (tempax & 0x00FF) | (tempbx & 0xFF00); -+ tempbx = pushbx; -+ tempbx = (tempbx & 0x00FF) | ((tempbx & 0xFF00) << 4); -+ tempax |= (tempbx & 0xFF00); -+ temp = (tempax & 0xFF00) >> 8; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x0C, temp); -+ temp = tempcx & 0x00FF; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x0D, temp); -+ tempcx = (pVBInfo->VGAVT - 1); -+ temp = tempcx & 0x00FF; -+ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x0E, temp); -+ tempbx = pVBInfo->VGAVDE - 1; -+ temp = tempbx & 0x00FF; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x0F, temp); -+ temp = ((tempbx & 0xFF00) << 3) >> 8; -+ temp |= ((tempcx & 0xFF00) >> 8); -+ XGI_SetReg((XGIIOADDRESS) 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; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x10, temp); -+ temp = ((tempbx & 0xFF00) >> 8) << 4; -+ temp = ((tempcx & 0x000F) | (temp)); -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x11, temp); -+ tempax = 0; -+ -+ if (modeflag & DoubleScanMode) -+ tempax |= 0x80; -+ -+ if (modeflag & HalfDCLK) -+ tempax |= 0x40; -+ -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part1Port, 0x2C, ~0x0C0, tempax); -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGI_SetLockRegs */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+void -+XGI_SetLockRegs(USHORT ModeNo, USHORT ModeIdIndex, -+ PXGI_HW_DEVICE_INFO HwDeviceExtension, -+ USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo) -+{ -+ USHORT 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 */ -+ XGI_SetReg((XGIIOADDRESS) 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; -+ XGI_SetReg((XGIIOADDRESS) 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; -+ } -+ } -+ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x05, temp); /* 0x05 Horizontal Display Start */ -+ XGI_SetReg((XGIIOADDRESS) 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 | -+ EnableScalingLCD))) { -+ temp += 28; -+ } -+ } -+ } -+ } -+ } -+ } -+ } -+ } -+ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x07, temp); /* 0x07 Horizontal Retrace Start */ -+ XGI_SetReg((XGIIOADDRESS) 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)) { -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x07, 0x5b); -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x08, 0x03); -+ } -+ -+ if ((ModeNo == 0x00) || (ModeNo == 0x01)) { -+ if (pVBInfo->TVInfo & SetNTSCTV) { -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x07, 0x2A); -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x08, 0x61); -+ } -+ else { -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x07, 0x2A); -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x08, 0x41); -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x0C, 0xF0); -+ } -+ } -+ -+ if ((ModeNo == 0x02) || (ModeNo == 0x03) || (ModeNo == 0x07)) { -+ if (pVBInfo->TVInfo & SetNTSCTV) { -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x07, 0x54); -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x08, 0x00); -+ } -+ else { -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x07, 0x55); -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x08, 0x00); -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x0C, 0xF0); -+ } -+ } -+ -+ if ((ModeNo == 0x04) || (ModeNo == 0x05) || (ModeNo == 0x0D) -+ || (ModeNo == 0x50)) { -+ if (pVBInfo->TVInfo & SetNTSCTV) { -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x07, 0x30); -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x08, 0x03); -+ } -+ else { -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x07, 0x2f); -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x08, 0x02); -+ } -+ } -+ } -+ } -+ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x18, 0x03); /* 0x18 SR0B */ -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part1Port, 0x19, 0xF0, 0x00); -+ XGI_SetReg((XGIIOADDRESS) 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; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x10, temp); /* 0x10 vertical Blank Start */ -+ tempbx = push2; -+ tempbx--; -+ temp = tempbx & 0x00FF; -+ XGI_SetReg((XGIIOADDRESS) 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; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x0B, temp); -+ -+ if (tempbx & 0x0400) { -+ tempcx |= 0x0600; -+ } -+ -+ XGI_SetReg((XGIIOADDRESS) 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; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x0C, temp); -+ tempbx--; -+ temp = tempbx & 0x00FF; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x10, temp); -+ -+ if (tempbx & 0x0100) { -+ tempcx |= 0x0008; -+ } -+ -+ if (tempbx & 0x0200) { -+ XGI_SetRegANDOR((XGIIOADDRESS) 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; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x0D, temp); /* 0x0D vertical Retrace End */ -+ -+ if (tempbx & 0x0010) { -+ tempcx |= 0x2000; -+ } -+ -+ temp = tempcx & 0x00FF; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x0A, temp); /* 0x0A CR07 */ -+ temp = (tempcx & 0x0FF00) >> 8; -+ XGI_SetReg((XGIIOADDRESS) 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; -+ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x16, temp); /* 0x16 SR01 */ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x0F, 0); /* 0x0F CR14 */ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x12, 0); /* 0x12 CR17 */ -+ -+ if (pVBInfo->LCDInfo & LCDRGB18Bit) -+ temp = 0x80; -+ else -+ temp = 0x00; -+ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x1A, temp); /* 0x1A SR0E */ -+ -+ return; -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGI_SetGroup2 */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+void -+XGI_SetGroup2(USHORT ModeNo, USHORT ModeIdIndex, USHORT RefreshRateTableIndex, -+ PXGI_HW_DEVICE_INFO HwDeviceExtension, PVB_DEVICE_INFO pVBInfo) -+{ -+ USHORT i, -+ j, -+ tempax, -+ tempbx, tempcx, temp, push1, push2, modeflag, resinfo, crt2crtc; -+#ifndef LINUX_XF86 -+ USHORT temp1, temp3, resindex, xres; -+#endif -+/* XGINew_RY1COE = 0 , -+ XGINew_RY2COE = 0 , -+ XGINew_RY3COE = 0 , -+ XGINew_RY4COE = 0 , -+ XGINew_RY5COE = 0 , -+ XGINew_RY6COE = 0 , -+ XGINew_RY7COE = 0 ; -+*/ -+ -+#ifndef LINUX_XF86 -+ UCHAR *PhasePoint; -+#endif -+ const UCHAR *TimingPoint; -+ -+ ULONG 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; -+ -+ ErrorF("Part2 0 = %x ", -+ XGI_GetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x0)); -+ ErrorF(" pVBInfo->VBInfo =%x", pVBInfo->VBInfo); -+ -+ tempax = (tempax & 0xff00) >> 8; -+ ErrorF("tempax = %x ", tempax); -+ XGI_SetReg((XGIIOADDRESS) 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++) { -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, i, TimingPoint[j]); -+ } -+ -+ for (i = 0x39; i <= 0x45; i++, j++) { -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, i, TimingPoint[j]); /* di->temp2[j] */ -+ } -+ -+ if (pVBInfo->VBInfo & SetCRT2ToTV) { -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part2Port, 0x3A, 0x1F, 0x00); -+ } -+ -+ temp = pVBInfo->NewFlickerMode; -+ temp &= 0x80; -+ XGI_SetRegANDOR((XGIIOADDRESS) 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 += (USHORT) 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 */ -+ } -+ } -+ } -+ -+ XGI_SetReg((XGIIOADDRESS) 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 */ -+ } -+ } -+ } -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x02, temp); -+ } -+ -+ /* 301b */ -+ tempcx = pVBInfo->HT; -+ -+ if (XGI_IsLCDDualLink(pVBInfo)) -+ tempcx = tempcx >> 1; -+ -+ tempcx -= 2; -+ temp = tempcx & 0x00FF; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x1B, temp); -+ -+ temp = (tempcx & 0xFF00) >> 8; -+ XGI_SetRegANDOR((XGIIOADDRESS) 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; -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part2Port, 0x22, 0x0F, temp); -+ -+ tempbx = TimingPoint[j] | ((TimingPoint[j + 1]) << 8); -+ tempbx += tempcx; -+ push2 = tempbx; -+ temp = tempbx & 0x00FF; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x24, temp); -+ temp = (tempbx & 0xFF00) >> 8; -+ temp = temp << 4; -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part2Port, 0x25, 0x0F, temp); -+ -+ tempbx = push2; -+ tempbx = tempbx + 8; -+ if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) { -+ tempbx = tempbx - 4; -+ tempcx = tempbx; -+ } -+ -+ temp = (tempbx & 0x00FF) << 4; -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part2Port, 0x29, 0x0F, temp); -+ -+ j += 2; -+ tempcx += (TimingPoint[j] | ((TimingPoint[j + 1]) << 8)); -+ temp = tempcx & 0x00FF; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x27, temp); -+ temp = ((tempcx & 0xFF00) >> 8) << 4; -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part2Port, 0x28, 0x0F, temp); -+ -+ tempcx += 8; -+ if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) { -+ tempcx -= 4; -+ } -+ -+ temp = tempcx & 0xFF; -+ temp = temp << 4; -+ XGI_SetRegANDOR((XGIIOADDRESS) 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; -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part2Port, 0x2D, 0x0F, temp); -+ -+ tempcx -= 11; -+ -+ if (!(pVBInfo->VBInfo & SetCRT2ToTV)) { -+ tempax = XGI_GetVGAHT2(pVBInfo); -+ tempcx = tempax - 1; -+ } -+ temp = tempcx & 0x00FF; -+ XGI_SetReg((XGIIOADDRESS) 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; -+ } -+ } -+ } -+ -+ XGI_SetReg((XGIIOADDRESS) 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; -+ } -+ } -+ -+ XGI_SetReg((XGIIOADDRESS) 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; -+ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x10, temp); -+ } -+ -+ temp = (((tempbx - 3) & 0x0300) >> 8) << 5; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x46, temp); -+ temp = (tempbx - 3) & 0x00FF; -+ XGI_SetReg((XGIIOADDRESS) 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 = (USHORT) 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 = -+ (USHORT) (((tempeax & 0x0000FF00) & 0x1F00) | (tempbx & 0x00FF)); -+ tempax = (USHORT) (((tempeax & 0x000000FF) << 8) | (tempax & 0x00FF)); -+ temp = (tempax & 0xFF00) >> 8; -+ } -+ else { -+ temp = (tempax & 0x00FF) >> 8; -+ } -+ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x44, temp); -+ temp = (tempbx & 0xFF00) >> 8; -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part2Port, 0x45, ~0x03F, temp); -+ temp = tempcx & 0x00FF; -+ -+ if (tempbx & 0x2000) -+ temp = 0; -+ -+ if (!(pVBInfo->VBInfo & SetCRT2ToLCD)) -+ temp |= 0x18; -+ -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part2Port, 0x46, ~0x1F, temp); -+ if (pVBInfo->TVInfo & SetPALTV) { -+ tempbx = 0x0382; -+ tempcx = 0x007e; -+ } -+ else { -+ tempbx = 0x0369; -+ tempcx = 0x0061; -+ } -+ -+ temp = tempbx & 0x00FF; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x4b, temp); -+ temp = tempcx & 0x00FF; -+ XGI_SetReg((XGIIOADDRESS) 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; -+ } -+ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x4d, temp); -+ temp = XGI_GetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x43); /* 301b change */ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x43, (USHORT) (temp - 3)); -+ -+ if (!(pVBInfo->TVInfo & (SetYPbPrMode525p | SetYPbPrMode750p))) { -+ if (pVBInfo->TVInfo & NTSC1024x768) { -+ TimingPoint = XGI_NTSC1024AdjTime; -+ for (i = 0x1c, j = 0; i <= 0x30; i++, j++) { -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, i, -+ TimingPoint[j]); -+ } -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x43, 0x72); -+ } -+ } -+ -+ /* [ycchen] 01/14/03 Modify for 301C PALM Support */ -+ if (pVBInfo->VBType & VB_XGI301C) { -+ if (pVBInfo->TVInfo & SetPALMTV) -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part2Port, 0x4E, ~0x08, 0x08); /* PALM Mode */ -+ } -+ -+ if (pVBInfo->TVInfo & SetPALMTV) { -+ tempax = (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x01); -+ tempax--; -+ XGI_SetRegAND((XGIIOADDRESS) pVBInfo->Part2Port, 0x01, tempax); -+ -+ /* if ( !( pVBInfo->VBType & VB_XGI301C ) ) */ -+ XGI_SetRegAND((XGIIOADDRESS) pVBInfo->Part2Port, 0x00, 0xEF); -+ } -+ -+ if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) { -+ if (!(pVBInfo->VBInfo & SetInSlaveMode)) { -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x0B, 0x00); -+ } -+ } -+ -+ if (pVBInfo->VBInfo & SetCRT2ToTV) { -+ return; -+ } -+ ErrorF("5935 Part2 0 = %x ", -+ XGI_GetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x0)); -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGI_SetLCDRegs */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+void -+XGI_SetLCDRegs(USHORT ModeNo, USHORT ModeIdIndex, -+ PXGI_HW_DEVICE_INFO HwDeviceExtension, -+ USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo) -+{ -+ USHORT push1, -+ push2, -+ pushbx, -+ tempax, -+ tempbx, -+ tempcx, temp, tempah, tempbh, tempch, resinfo, modeflag, CRT1Index; -+ -+ XGI_LCDDesStruct *LCDBDesPtr = NULL; -+ XGI330_LCDDataDesStruct2 *LCDPtr1 = 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; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x2C, temp); -+ temp = (tempbx & 0xFF00) >> 8; -+ temp = temp << 4; -+ XGI_SetRegANDOR((XGIIOADDRESS) 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; -+ } -+ } -+ } -+ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x0B, temp); -+ tempbx = pVBInfo->VDE; /* RTVACTEO=(VDE-1)&0xFF */ -+ push1 = tempbx; -+ tempbx--; -+ temp = tempbx & 0x00FF; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x03, temp); -+ temp = ((tempbx & 0xFF00) >> 8) & 0x07; -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part2Port, 0x0C, ~0x07, temp); -+ -+ tempcx = pVBInfo->VT - 1; -+ push2 = tempcx + 1; -+ temp = tempcx & 0x00FF; /* RVTVT=VT-1 */ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x19, temp); -+ temp = (tempcx & 0xFF00) >> 8; -+ temp = temp << 5; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x1A, temp); -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part2Port, 0x09, 0xF0, 0x00); -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part2Port, 0x0A, 0xF0, 0x00); -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part2Port, 0x17, 0xFB, 0x00); -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part2Port, 0x18, 0xDF, 0x00); -+ -+ /* Customized LCDB Des no add */ -+ LCDBDesPtr = (XGI_LCDDesStruct *) XGI_GetLcdPtr(5, ModeNo, ModeIdIndex, -+ RefreshRateTableIndex, -+ pVBInfo); -+ -+ if (pVBInfo->LCDInfo & EnableScalingLCD) { -+ tempbx = pVBInfo->HDE; -+ tempcx = pVBInfo->VDE; -+ } -+ else { -+ get_HDE_VDE(pVBInfo, & tempbx, & tempcx); -+ } -+ -+ 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 */ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x05, temp); -+ temp = tempcx & 0x00FF; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x06, temp); -+ tempch = ((tempcx & 0xFF00) >> 8) & 0x07; -+ tempbh = ((tempbx & 0xFF00) >> 8) & 0x07; -+ tempah = tempch; -+ tempah = tempah << 3; -+ tempah |= tempbh; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x02, tempah); -+ -+ /* getlcdsync() */ -+ XGI_GetLCDSync(&tempax, &tempbx, pVBInfo); -+ if (pVBInfo->LCDInfo & EnableScalingLCD) { -+ LCDPtr1 = -+ (XGI330_LCDDataDesStruct2 *) XGI_GetLcdPtr(4, ModeNo, ModeIdIndex, -+ RefreshRateTableIndex, -+ pVBInfo); -+ tempbx = LCDPtr1->LCDVSync; -+ } -+ tempcx = tempbx; -+ tempax = pVBInfo->VT; -+ tempbx = pVBInfo->LCDVRS; -+ -+ /* if ( SetLCD_Info & EnableScalingLCD ) */ -+ tempcx += tempbx; -+ if (tempcx >= tempax) -+ tempcx -= tempax; -+ -+ temp = tempbx & 0x00FF; /* RTVACTEE=lcdvrs */ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x04, temp); -+ temp = (tempbx & 0xFF00) >> 8; -+ temp = temp << 4; -+ temp |= (tempcx & 0x000F); -+ XGI_SetReg((XGIIOADDRESS) 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; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x1F, temp); /* RHBLKE=lcdhdes */ -+ temp = ((tempbx & 0xFF00) >> 8) << 4; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x20, temp); -+ temp = tempcx & 0x00FF; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x23, temp); /* RHEQPLE=lcdhdee */ -+ temp = (tempcx & 0xFF00) >> 8; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x25, temp); -+ -+ /* getlcdsync() */ -+ XGI_GetLCDSync(&tempax, &tempbx, pVBInfo); -+ if (pVBInfo->LCDInfo & EnableScalingLCD) { -+ LCDPtr1 = -+ (XGI330_LCDDataDesStruct2 *) XGI_GetLcdPtr(4, ModeNo, ModeIdIndex, -+ RefreshRateTableIndex, -+ pVBInfo); -+ tempax = LCDPtr1->LCDHSync; -+ } -+ 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 */ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x1C, temp); -+ -+ temp = (tempbx & 0xFF00) >> 8; -+ temp = temp << 4; -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part2Port, 0x1D, ~0x0F0, temp); -+ temp = tempcx & 0x00FF; /* RHSYEXP2S=lcdhre */ -+ XGI_SetReg((XGIIOADDRESS) 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; -+ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x2f, temp); -+ XGI_SetReg((XGIIOADDRESS) 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; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x2f, temp); -+ } -+ } -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGI_GetTap4Ptr */ -+/* Input : */ -+/* Output : di -> Tap4 Reg. Setting Pointer */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+const XGI301C_Tap4TimingStruct * -+XGI_GetTap4Ptr(USHORT tempcx, PVB_DEVICE_INFO pVBInfo) -+{ -+ USHORT tempax, tempbx, i; -+ -+ const 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(PVB_DEVICE_INFO pVBInfo) -+{ -+ -+#ifndef LINUX_XF86 -+ USHORT tempcx; -+#endif -+ USHORT i, j; -+ -+ const XGI301C_Tap4TimingStruct *Tap4TimingPtr; -+ -+ if (!(pVBInfo->VBType & VB_XGI301C)) -+ return; -+ -+#ifndef Tap4 -+ XGI_SetRegAND((XGIIOADDRESS) 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++) -+ XGI_SetReg((XGIIOADDRESS) 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++) -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, i, -+ Tap4TimingPtr->Reg[j]); -+ } -+ -+ if ((pVBInfo->VBInfo & SetCRT2ToTV) -+ && (!(pVBInfo->VBInfo & SetCRT2ToHiVisionTV))) -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part2Port, 0x4E, ~0x14, 0x04); /* Enable V.Scaling */ -+ else -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part2Port, 0x4E, ~0x14, 0x10); /* Enable H.Scaling */ -+#endif -+} -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGI_SetGroup3 */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+void -+XGI_SetGroup3(USHORT ModeNo, USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo) -+{ -+ USHORT i; -+ const UCHAR *tempdi; -+ USHORT modeflag; -+ -+ if (ModeNo <= 0x13) { -+ modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag; /* si+St_ResInfo */ -+ } -+ else { -+ modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag; /* si+Ext_ResInfo */ -+ } -+ -+ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part3Port, 0x00, 0x00); -+ if (pVBInfo->TVInfo & SetPALTV) { -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part3Port, 0x13, 0xFA); -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part3Port, 0x14, 0xC8); -+ } -+ else { -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part3Port, 0x13, 0xF5); -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part3Port, 0x14, 0xB7); -+ } -+ -+ if (!(pVBInfo->VBInfo & SetCRT2ToTV)) { -+ return; -+ } -+ -+ if (pVBInfo->TVInfo & SetPALMTV) { -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part3Port, 0x13, 0xFA); -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part3Port, 0x14, 0xC8); -+ XGI_SetReg((XGIIOADDRESS) 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++) { -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part3Port, i, tempdi[i]); -+ } -+ if (pVBInfo->VBType & VB_XGI301C) { /* Marcovision */ -+ if (pVBInfo->TVInfo & SetYPbPrMode525p) { -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part3Port, 0x28, 0x3f); -+ } -+ } -+ } -+ return; -+} /* {end of XGI_SetGroup3} */ -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGI_SetGroup4 */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+void -+XGI_SetGroup4(USHORT ModeNo, USHORT ModeIdIndex, USHORT RefreshRateTableIndex, -+ PXGI_HW_DEVICE_INFO HwDeviceExtension, PVB_DEVICE_INFO pVBInfo) -+{ -+ USHORT tempax, tempcx, tempbx, modeflag, temp, temp2; -+#ifndef LINUX_XF86 -+ USHORT push1; -+#endif -+ -+ ULONG 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; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x13, temp); -+ -+ tempbx = pVBInfo->RVBHCMAX; -+ temp = tempbx & 0x00FF; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x14, temp); -+ temp2 = ((tempbx & 0xFF00) >> 8) << 7; -+ tempcx = pVBInfo->VGAHT - 1; -+ temp = tempcx & 0x00FF; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x16, temp); -+ -+ temp = ((tempcx & 0xFF00) >> 8) << 3; -+ temp2 |= temp; -+ -+ tempcx = pVBInfo->VGAVT - 1; -+ if (!(pVBInfo->VBInfo & SetCRT2ToTV)) { -+ tempcx -= 5; -+ } -+ -+ temp = tempcx & 0x00FF; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x17, temp); -+ temp = temp2 | ((tempcx & 0xFF00) >> 8); -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x15, temp); -+ XGI_SetRegOR((XGIIOADDRESS) 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; -+ } -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part4Port, 0x0E, ~0xEF, temp); -+ -+ tempebx = pVBInfo->VDE; -+ -+ if (tempcx & SetCRT2ToHiVisionTV) { -+ if (!(temp & 0xE000)) -+ tempbx = tempbx >> 1; -+ } -+ -+ tempcx = pVBInfo->RVBHRS; -+ temp = tempcx & 0x00FF; -+ XGI_SetReg((XGIIOADDRESS) 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 = (USHORT) (tempebx & 0x000000FF); -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x1B, temp); -+ -+ temp = (USHORT) ((tempebx & 0x0000FF00) >> 8); -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x1A, temp); -+ tempbx = (USHORT) (tempebx >> 16); -+ temp = tempbx & 0x00FF; -+ temp = temp << 4; -+ temp |= ((tempcx & 0xFF00) >> 8); -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x19, temp); -+ -+ /* 301b */ -+ if (pVBInfo-> -+ VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | -+ VB_XGI301C)) { -+ temp = 0x0028; -+ XGI_SetReg((XGIIOADDRESS) 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); -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x1E, temp); -+ temp = (tempax & 0x00FF); -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x1D, temp); -+ -+ if (pVBInfo->VBInfo & (SetCRT2ToTV | SetCRT2ToHiVisionTV)) { -+ if (pVBInfo->VGAHDE > 800) { -+ XGI_SetRegOR((XGIIOADDRESS) 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); -+ } -+ } -+ -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part4Port, 0x1F, 0x00C0, -+ temp); -+ tempbx = pVBInfo->HT; -+ if (XGI_IsLCDDualLink(pVBInfo)) -+ tempbx = tempbx >> 1; -+ tempbx = (tempbx >> 1) - 2; -+ temp = ((tempbx & 0x0700) >> 8) << 3; -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part4Port, 0x21, 0x00C0, -+ temp); -+ temp = tempbx & 0x00FF; -+ XGI_SetReg((XGIIOADDRESS) 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(USHORT ModeNo, USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo) -+{ -+ USHORT 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 : */ -+/* --------------------------------------------------------------------- */ -+const void * -+XGI_GetLcdPtr(USHORT BX, USHORT ModeNo, USHORT ModeIdIndex, -+ USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo) -+{ -+ USHORT i, tempdx, tempcx, tempbx, tempal, modeflag, table; -+ -+ const 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; -+ } -+ -+ if (pVBInfo->LCDInfo & EnableScalingLCD) { /* ScaleLCD */ -+ if (pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO == 0x14) { -+ tempal = 0x0A; -+ } -+ else if (pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO == 0x0F) { -+ tempal = 0x0B; -+ } -+ } -+ -+ 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) { -+ if ((pVBInfo->LCDInfo & EnableReduceTiming) -+ && (pVBInfo->LCDResInfo == Panel1600x1200)) { -+ tempdx = Panel1600x1200_1; -+ } -+ else { -+ 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; -+ case 19: -+ return &XGI_NoScalingData_1[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; -+ case 20: -+ return &XGI_NoScalingDesData_1[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 : */ -+/* --------------------------------------------------------------------- */ -+const void * -+XGI_GetTVPtr(USHORT BX, USHORT ModeNo, USHORT ModeIdIndex, -+ USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo) -+{ -+ USHORT i, tempdx, tempbx, tempal, modeflag, table; -+ const XGI330_TVDataTablStruct *tempdi = NULL; -+ -+ 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; */ -+ break; -+ case 1: -+ tempdi = 0; /*EPLCHTVCRT1Ptr_V; */ -+ 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 == 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) { -+ switch (tempdi[i].DATAPTR) { -+ case 0: -+ return &XGI_CHTVRegUNTSC[tempal]; -+ break; -+ case 1: -+ return &XGI_CHTVRegONTSC[tempal]; -+ break; -+ case 2: -+ return &XGI_CHTVRegUPAL[tempal]; -+ break; -+ case 3: -+ return &XGI_CHTVRegOPAL[tempal]; -+ break; -+ default: -+ break; -+ } -+ } -+ return (0); -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGI_BacklightByDrv */ -+/* Input : */ -+/* Output : TRUE -> Skip backlight control */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+BOOLEAN -+XGI_BacklightByDrv(PVB_DEVICE_INFO pVBInfo) -+{ -+ UCHAR tempah; -+ -+ tempah = (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x3A); -+ if (tempah & BacklightControlBit) -+ return TRUE; -+ else -+ return FALSE; -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGI_FirePWDDisable */ -+/* Input : */ -+/* Output : */ -+/* Description : Turn off VDD & Backlight : Fire disable procedure */ -+/* --------------------------------------------------------------------- */ -+/* -+void XGI_FirePWDDisable( PVB_DEVICE_INFO pVBInfo ) -+{ -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part1Port , 0x26 , 0x00 , 0xFC ) ; -+} -+*/ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGI_FirePWDEnable */ -+/* Input : */ -+/* Output : */ -+/* Description : Turn on VDD & Backlight : Fire enable procedure */ -+/* --------------------------------------------------------------------- */ -+void -+XGI_FirePWDEnable(PVB_DEVICE_INFO pVBInfo) -+{ -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part1Port, 0x26, 0x03, 0xFC); -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGI_EnableGatingCRT */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+void -+XGI_EnableGatingCRT(PXGI_HW_DEVICE_INFO HwDeviceExtension, -+ PVB_DEVICE_INFO pVBInfo) -+{ -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4, 0x63, 0xBF, 0x40); -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGI_DisableGatingCRT */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+void -+XGI_DisableGatingCRT(PXGI_HW_DEVICE_INFO HwDeviceExtension, -+ PVB_DEVICE_INFO pVBInfo) -+{ -+ -+ XGI_SetRegANDOR((XGIIOADDRESS) 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(USHORT tempbl, PVB_DEVICE_INFO pVBInfo) -+{ -+ USHORT index; -+#ifndef LINUX_XF86 -+ USHORT temp; -+#endif -+ -+ 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(USHORT tempah, USHORT tempbl, PVB_DEVICE_INFO pVBInfo) -+{ -+ if (pVBInfo->VBType & (VB_XGI301LV | VB_XGI302LV | VB_XGI301C)) -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part4Port, 0x26, tempbl, -+ tempah); -+ else -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3c4, 0x11, tempbl, tempah); -+} -+ -+/* Jong 10/04/2007; merge code */ -+UCHAR XG21GPIODataTransfer(UCHAR ujDate) -+{ -+ UCHAR ujRet = 0; -+ UCHAR i = 0; -+ -+ for (i=0; i<8; i++) -+ { -+ ujRet = ujRet << 1; -+ /* ujRet |= GETBITS(ujDate >> i, 0:0); */ -+ ujRet |= (ujDate >> i) & 1; -+ } -+ -+ return ujRet; -+} -+ -+/* Jong 10/04/2007; merge code */ -+/*----------------------------------------------------------------------------*/ -+/* output */ -+/* bl[5] : LVDS signal */ -+/* bl[1] : LVDS backlight */ -+/* bl[0] : LVDS VDD */ -+/*----------------------------------------------------------------------------*/ -+UCHAR XGI_XG21GetPSCValue(PVB_DEVICE_INFO pVBInfo) -+{ -+ UCHAR CR4A,temp; -+ -+ CR4A = XGI_GetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x4A ) ; -+ XGI_SetRegAND( (XGIIOADDRESS) pVBInfo->P3d4 , 0x4A , ~0x23 ) ; /* enable GPIO write */ -+ -+ temp = XGI_GetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x48 ) ; -+ -+ temp = XG21GPIODataTransfer(temp); -+ temp &= 0x23; -+ XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x4A , CR4A ) ; -+ return temp; -+} -+ -+/* Jong 10/04/2007; merge code */ -+/*----------------------------------------------------------------------------*/ -+/* output */ -+/* bl[5] : LVDS signal */ -+/* bl[1] : LVDS backlight */ -+/* bl[0] : LVDS VDD */ -+/*----------------------------------------------------------------------------*/ -+UCHAR XGI_XG27GetPSCValue(PVB_DEVICE_INFO pVBInfo) -+{ -+ UCHAR CR4A,CRB4,temp; -+ -+ CR4A = XGI_GetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x4A ) ; -+ XGI_SetRegAND( (XGIIOADDRESS) pVBInfo->P3d4 , 0x4A , ~0x0C ) ; /* enable GPIO write */ -+ -+ temp = XGI_GetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x48 ) ; -+ -+ temp &= 0x0C; -+ temp >>= 2; -+ XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x4A , CR4A ) ; -+ CRB4 = XGI_GetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0xB4 ) ; -+ temp |= ((CRB4&0x04)<<3); -+ return temp; -+} -+ -+/* Jong 10/04/2007; merge code */ -+/*----------------------------------------------------------------------------*/ -+/* 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(USHORT tempbh,USHORT tempbl, PVB_DEVICE_INFO pVBInfo) -+{ -+ UCHAR CR4A,temp; -+ -+ CR4A = XGI_GetReg( (XGIIOADDRESS)pVBInfo->P3d4 , 0x4A ) ; -+ tempbh &= 0x23; -+ tempbl &= 0x23; -+ XGI_SetRegAND( (XGIIOADDRESS)pVBInfo->P3d4 , 0x4A , ~tempbh ) ; /* enable GPIO write */ -+ -+ if (tempbh&0x20) -+ { -+ temp = (tempbl>>4)&0x02; -+ -+ XGI_SetRegANDOR( (XGIIOADDRESS)pVBInfo->P3d4 , 0xB4 , ~0x02 , temp) ; /* CR B4[1] */ -+ -+ } -+ -+ temp = XGI_GetReg( (XGIIOADDRESS)pVBInfo->P3d4 , 0x48 ) ; -+ -+ temp = XG21GPIODataTransfer(temp); -+ -+ temp &= ~tempbh; -+ temp |= tempbl; -+ XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x48 , temp ) ; -+} -+ -+/* Jong 10/04/2007; merge code */ -+void XGI_XG27BLSignalVDD(USHORT tempbh,USHORT tempbl, PVB_DEVICE_INFO pVBInfo) -+{ -+ UCHAR CR4A,temp; -+ USHORT tempbh0,tempbl0; -+ -+ tempbh0 = tempbh; -+ tempbl0 = tempbl; -+ tempbh0 &= 0x20; -+ tempbl0 &= 0x20; -+ tempbh0 >>= 3; -+ tempbl0 >>= 3; -+ -+ if (tempbh&0x20) -+ { -+ temp = (tempbl>>4)&0x02; -+ -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3d4 , 0xB4 , ~0x02 , temp) ; /* CR B4[1] */ -+ -+ } -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3d4 , 0xB4 , ~tempbh0 , tempbl0 ) ; -+ -+ CR4A = XGI_GetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x4A ) ; -+ tempbh &= 0x03; -+ tempbl &= 0x03; -+ tempbh <<= 2; -+ tempbl <<= 2; /* GPIOC,GPIOD */ -+ XGI_SetRegAND( (XGIIOADDRESS) pVBInfo->P3d4 , 0x4A , ~tempbh ) ; /* enable GPIO write */ -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3d4 , 0x48 , ~tempbh , tempbl ) ; -+} -+ -+/* Jong 10/04/2007; merge code */ -+/* --------------------------------------------------------------------- */ -+USHORT XGI_GetLVDSOEMTableIndex(PVB_DEVICE_INFO pVBInfo) -+{ -+ USHORT index ; -+ -+ index = XGI_GetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x36 ) ; -+ if (indexXG21_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 ) ; -+} -+ -+/* Jong 10/04/2007; merge code */ -+BOOLEAN XGI_XG21CheckLVDSMode(USHORT ModeNo,USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo ) -+{ -+ USHORT 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 FALSE; -+ -+ if ( yres > (pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVDE) ) -+ return FALSE; -+ -+ 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 FALSE; -+ } -+ } -+ } -+ return TRUE; -+} -+ -+/* Jong 10/04/2007; merge code */ -+void XGI_SetXG21FPBits(PVB_DEVICE_INFO pVBInfo) -+{ -+ UCHAR temp; -+ -+ temp = XGI_GetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x37 ) ; /* D[0] 1: 18bit */ -+ temp = ( temp & 1 ) << 6; -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x06 , ~0x40 , temp ) ; /* SR06[6] 18bit Dither */ -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x09 , ~0xc0 , temp | 0x80 ) ; /* SR09[7] enable FP output, SR09[6] 1: sigle 18bits, 0: dual 12bits */ -+ -+} -+ -+/* Jong 10/04/2007; merge code */ -+void XGI_SetXG27FPBits(PVB_DEVICE_INFO pVBInfo) -+{ -+ UCHAR temp; -+ -+ temp = XGI_GetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x37 ) ; /* D[1:0] 01: 18bit, 00: dual 12, 10: single 24 */ -+ temp = ( temp & 3 ) << 6; -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x06 , ~0xc0 , temp & 0x80 ) ; /* SR06[7]0: dual 12/1: single 24 [6] 18bit Dither <= 0 h/w recommend */ -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x09 , ~0xc0 , temp | 0x80 ) ; /* SR09[7] enable FP output, SR09[6] 1: sigle 18bits, 0: 24bits */ -+ -+} -+ -+/* Jong 10/04/2007; merge code */ -+void XGI_SetXG21LVDSPara(USHORT ModeNo,USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo ) -+{ -+ UCHAR temp,Miscdata; -+ USHORT xres , -+ yres , -+ colordepth , -+ modeflag , -+ resindex , -+ lvdstableindex ; -+ USHORT LVDSHT,LVDSHBS,LVDSHRS,LVDSHRE,LVDSHBE; -+ USHORT LVDSVT,LVDSVBS,LVDSVRS,LVDSVRE,LVDSVBE; -+ USHORT value; -+ -+ lvdstableindex = XGI_GetLVDSOEMTableIndex( pVBInfo ); -+ -+ temp = (UCHAR) ( ( pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDS_Capability & (LCDPolarity << 8 ) ) >> 8 ); -+ temp &= LCDPolarity; -+ Miscdata =(UCHAR) XGI_GetRegByte(pVBInfo->P3cc) ; -+ -+ XGI_SetRegByte( (XGIIOADDRESS) pVBInfo->P3c2 , (Miscdata & 0x3F) | temp ) ; -+ -+ temp = (UCHAR) ( pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDS_Capability & LCDPolarity ) ; -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x35 , ~0x80 , temp&0x80 ) ; /* SR35[7] FP VSync polarity */ -+ XGI_SetRegANDOR( (XGIIOADDRESS) 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 = ( UCHAR )XGI_GetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x11 ) ; -+ XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x11 , temp & 0x7f ) ; /* Unlock CRTC */ -+ -+ if (!( modeflag & Charx8Dot )) -+ { -+ XGI_SetRegOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x1 , 0x1 ) ; -+ } -+ -+ /* HT SR0B[1:0] CR00 */ -+ value = ( LVDSHT >> 3 ) - 5; -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x0B , ~0x03 , ( value & 0x300 ) >> 8 ) ; -+ XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x0 , (value & 0xFF) ) ; -+ -+ /* HBS SR0B[5:4] CR02 */ -+ value = ( LVDSHBS >> 3 ) - 1; -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x0B , ~0x30 , ( value & 0x300 ) >> 4 ) ; -+ XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x2 , (value & 0xFF) ) ; -+ -+ /* HBE SR0C[1:0] CR05[7] CR03[4:0] */ -+ value = ( LVDSHBE >> 3 ) - 1; -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x0C , ~0x03 , ( value & 0xC0 ) >> 6 ) ; -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3d4 , 0x05 , ~0x80 , ( value & 0x20 ) << 2 ) ; -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3d4 , 0x03 , ~0x1F , value & 0x1F ) ; -+ -+ /* HRS SR0B[7:6] CR04 */ -+ value = ( LVDSHRS >> 3 ) + 2; -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x0B , ~0xC0 , ( value & 0x300 ) >> 2 ) ; -+ XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x4 , (value & 0xFF) ) ; -+ -+ /* Panel HRS SR2F[1:0] SR2E[7:0] */ -+ value--; -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x2F , ~0x03 , ( value & 0x300 ) >> 8 ) ; -+ XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3c4 , 0x2E , (value & 0xFF) ) ; -+ -+ /* HRE SR0C[2] CR05[4:0] */ -+ value = ( LVDSHRE >> 3 ) + 2; -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x0C , ~0x04 , ( value & 0x20 ) >> 3 ) ; -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3d4 , 0x05 , ~0x1F , value & 0x1F ) ; -+ -+ /* Panel HRE SR2F[7:2] */ -+ value--; -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x2F , ~0xFC , value << 2 ) ; -+ -+ /* VT SR0A[0] CR07[5][0] CR06 */ -+ value = LVDSVT - 2 ; -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x0A , ~0x01 , ( value & 0x400 ) >> 10 ) ; -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3d4 , 0x07 , ~0x20 , ( value & 0x200 ) >> 4 ) ; -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3d4 , 0x07 , ~0x01 , ( value & 0x100 ) >> 8 ) ; -+ XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x06 , (value & 0xFF) ) ; -+ -+ /* VBS SR0A[2] CR09[5] CR07[3] CR15 */ -+ value = LVDSVBS - 1 ; -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x0A , ~0x04 , ( value & 0x400 ) >> 8 ) ; -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3d4 , 0x09 , ~0x20 , ( value & 0x200 ) >> 4 ) ; -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3d4 , 0x07 , ~0x08 , ( value & 0x100 ) >> 5 ) ; -+ XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x15 , (value & 0xFF) ) ; -+ -+ /* VBE SR0A[4] CR16 */ -+ value = LVDSVBE - 1; -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x0A , ~0x10 , ( value & 0x100 ) >> 4 ) ; -+ XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x16 , (value & 0xFF) ) ; -+ -+ /* VRS SR0A[3] CR7[7][2] CR10 */ -+ value = LVDSVRS - 1 ; -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x0A , ~0x08 , ( value & 0x400 ) >> 7 ) ; -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3d4 , 0x07 , ~0x80 , ( value & 0x200 ) >> 2 ) ; -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3d4 , 0x07 , ~0x04 , ( value & 0x100 ) >> 6 ) ; -+ XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x10 , (value & 0xFF) ) ; -+ -+ /* Panel VRS SR3F[1:0] SR34[7:0] SR33[0] */ -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x3F , ~0x03 , ( value & 0x600 ) >> 9 ) ; -+ XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3c4 , 0x34 , (value >> 1) & 0xFF ) ; -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3d4 , 0x33 , ~0x01 , value & 0x01 ) ; -+ -+ /* VRE SR0A[5] CR11[3:0] */ -+ value = LVDSVRE - 1; -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x0A , ~0x20 , ( value & 0x10 ) << 1 ) ; -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3d4 , 0x11 , ~0x0F , value & 0x0F ) ; -+ -+ /* Panel VRE SR3F[7:2] */ /* SR3F[7] has to be 0, h/w bug */ -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x3F , ~0xFC , ( value << 2 ) & 0x7C ) ; -+ -+ for ( temp=0, value = 0; temp < 3; temp++) -+ { -+ -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x31 , ~0x30 , value ) ; -+ XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3c4 , 0x2B , pVBInfo->XG21_LVDSCapList[lvdstableindex].VCLKData1) ; -+ XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3c4 , 0x2C , pVBInfo->XG21_LVDSCapList[lvdstableindex].VCLKData2) ; -+ value += 0x10; -+ } -+ -+ if (!( modeflag & Charx8Dot )) -+ { -+ XGI_GetRegByte( (XGIIOADDRESS) pVBInfo->P3da ) ; /* reset 3da */ -+ XGI_SetRegByte( (XGIIOADDRESS) pVBInfo->P3c0 , 0x13 ) ; /* set index */ -+ XGI_SetRegByte( (XGIIOADDRESS) pVBInfo->P3c0 , 0x00 ) ; /* set data, panning = 0, shift left 1 dot*/ -+ -+ XGI_GetRegByte( (XGIIOADDRESS) pVBInfo->P3da ) ; /* Enable Attribute */ -+ XGI_SetRegByte( (XGIIOADDRESS) pVBInfo->P3c0 , 0x20 ) ; -+ -+ XGI_GetRegByte( (XGIIOADDRESS) pVBInfo->P3da ) ; /* reset 3da */ -+ } -+ -+ -+} -+ -+/* Jong 10/04/2007; merge code */ -+/* no shadow case */ -+void XGI_SetXG27LVDSPara(USHORT ModeNo,USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo ) -+{ -+ UCHAR temp,Miscdata; -+ USHORT xres , -+ yres , -+ colordepth , -+ modeflag , -+ resindex , -+ lvdstableindex ; -+ USHORT LVDSHT,LVDSHBS,LVDSHRS,LVDSHRE,LVDSHBE; -+ USHORT LVDSVT,LVDSVBS,LVDSVRS,LVDSVRE,LVDSVBE; -+ USHORT value; -+ -+ lvdstableindex = XGI_GetLVDSOEMTableIndex( pVBInfo ); -+ temp = (UCHAR) ( ( pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDS_Capability & (LCDPolarity << 8 ) ) >> 8 ); -+ temp &= LCDPolarity; -+ Miscdata =(UCHAR) XGI_GetRegByte((XGIIOADDRESS) pVBInfo->P3cc) ; -+ -+ XGI_SetRegByte( (XGIIOADDRESS) pVBInfo->P3c2 , (Miscdata & 0x3F) | temp ) ; -+ -+ temp = (UCHAR) ( pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDS_Capability & LCDPolarity ) ; -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x35 , ~0x80 , temp&0x80 ) ; /* SR35[7] FP VSync polarity */ -+ XGI_SetRegANDOR( (XGIIOADDRESS) 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 = ( UCHAR )XGI_GetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x11 ) ; -+ XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x11 , temp & 0x7f ) ; /* Unlock CRTC */ -+ -+ if (!( modeflag & Charx8Dot )) -+ { -+ XGI_SetRegOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x1 , 0x1 ) ; -+ } -+ -+ /* HT SR0B[1:0] CR00 */ -+ value = ( LVDSHT >> 3 ) - 5; -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x0B , ~0x03 , ( value & 0x300 ) >> 8 ) ; -+ XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x0 , (value & 0xFF) ) ; -+ -+ /* HBS SR0B[5:4] CR02 */ -+ value = ( LVDSHBS >> 3 ) - 1; -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x0B , ~0x30 , ( value & 0x300 ) >> 4 ) ; -+ XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x2 , (value & 0xFF) ) ; -+ -+ /* HBE SR0C[1:0] CR05[7] CR03[4:0] */ -+ value = ( LVDSHBE >> 3 ) - 1; -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x0C , ~0x03 , ( value & 0xC0 ) >> 6 ) ; -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3d4 , 0x05 , ~0x80 , ( value & 0x20 ) << 2 ) ; -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3d4 , 0x03 , ~0x1F , value & 0x1F ) ; -+ -+ /* HRS SR0B[7:6] CR04 */ -+ value = ( LVDSHRS >> 3 ) + 2; -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x0B , ~0xC0 , ( value & 0x300 ) >> 2 ) ; -+ XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x4 , (value & 0xFF) ) ; -+ -+ /* Panel HRS SR2F[1:0] SR2E[7:0] */ -+ value--; -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x2F , ~0x03 , ( value & 0x300 ) >> 8 ) ; -+ XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3c4 , 0x2E , (value & 0xFF) ) ; -+ -+ /* HRE SR0C[2] CR05[4:0] */ -+ value = ( LVDSHRE >> 3 ) + 2; -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x0C , ~0x04 , ( value & 0x20 ) >> 3 ) ; -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3d4 , 0x05 , ~0x1F , value & 0x1F ) ; -+ -+ /* Panel HRE SR2F[7:2] */ -+ value--; -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x2F , ~0xFC , value << 2 ) ; -+ -+ /* VT SR0A[0] CR07[5][0] CR06 */ -+ value = LVDSVT - 2 ; -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x0A , ~0x01 , ( value & 0x400 ) >> 10 ) ; -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3d4 , 0x07 , ~0x20 , ( value & 0x200 ) >> 4 ) ; -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3d4 , 0x07 , ~0x01 , ( value & 0x100 ) >> 8 ) ; -+ XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x06 , (value & 0xFF) ) ; -+ -+ /* VBS SR0A[2] CR09[5] CR07[3] CR15 */ -+ value = LVDSVBS - 1 ; -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x0A , ~0x04 , ( value & 0x400 ) >> 8 ) ; -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3d4 , 0x09 , ~0x20 , ( value & 0x200 ) >> 4 ) ; -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3d4 , 0x07 , ~0x08 , ( value & 0x100 ) >> 5 ) ; -+ XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x15 , (value & 0xFF) ) ; -+ -+ /* VBE SR0A[4] CR16 */ -+ value = LVDSVBE - 1; -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x0A , ~0x10 , ( value & 0x100 ) >> 4 ) ; -+ XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x16 , (value & 0xFF) ) ; -+ -+ /* VRS SR0A[3] CR7[7][2] CR10 */ -+ value = LVDSVRS - 1 ; -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x0A , ~0x08 , ( value & 0x400 ) >> 7 ) ; -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3d4 , 0x07 , ~0x80 , ( value & 0x200 ) >> 2 ) ; -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3d4 , 0x07 , ~0x04 , ( value & 0x100 ) >> 6 ) ; -+ XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x10 , (value & 0xFF) ) ; -+ -+ /* Panel VRS SR35[2:0] SR34[7:0] */ -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x35 , ~0x07 , ( value & 0x700 ) >> 8 ) ; -+ XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3c4 , 0x34 , value & 0xFF ) ; -+ -+ /* VRE SR0A[5] CR11[3:0] */ -+ value = LVDSVRE - 1; -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x0A , ~0x20 , ( value & 0x10 ) << 1 ) ; -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3d4 , 0x11 , ~0x0F , value & 0x0F ) ; -+ -+ /* Panel VRE SR3F[7:2] */ -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x3F , ~0xFC , ( value << 2 ) & 0xFC ) ; -+ -+ for ( temp=0, value = 0; temp < 3; temp++) -+ { -+ -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x31 , ~0x30 , value ) ; -+ XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3c4 , 0x2B , pVBInfo->XG21_LVDSCapList[lvdstableindex].VCLKData1) ; -+ XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3c4 , 0x2C , pVBInfo->XG21_LVDSCapList[lvdstableindex].VCLKData2) ; -+ value += 0x10; -+ } -+ -+ if (!( modeflag & Charx8Dot )) -+ { -+ XGI_GetRegByte( (XGIIOADDRESS) pVBInfo->P3da ) ; /* reset 3da */ -+ XGI_SetRegByte( (XGIIOADDRESS) pVBInfo->P3c0 , 0x13 ) ; /* set index */ -+ XGI_SetRegByte( (XGIIOADDRESS) pVBInfo->P3c0 , 0x00 ) ; /* set data, panning = 0, shift left 1 dot*/ -+ -+ XGI_GetRegByte( (XGIIOADDRESS) pVBInfo->P3da ) ; /* Enable Attribute */ -+ XGI_SetRegByte( (XGIIOADDRESS) pVBInfo->P3c0 , 0x20 ) ; -+ -+ XGI_GetRegByte( (XGIIOADDRESS) pVBInfo->P3da ) ; /* reset 3da */ -+ } -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGI_IsLCDON */ -+/* Input : */ -+/* Output : FALSE : Skip PSC Control */ -+/* TRUE: Disable PSC */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+BOOLEAN -+XGI_IsLCDON(PVB_DEVICE_INFO pVBInfo) -+{ -+ USHORT tempax; -+ -+ tempax = pVBInfo->VBInfo; -+ if (tempax & SetCRT2ToDualEdge) -+ return FALSE; -+ else if (tempax & (DisableCRT2Display | SwitchToCRT2 | SetSimuScanMode)) -+ return TRUE; -+ -+ return FALSE; -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGI_EnablePWD */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+void -+XGI_EnablePWD(PVB_DEVICE_INFO pVBInfo) -+{ -+ USHORT index, temp; -+ -+ index = XGI_GetLCDCapPtr(pVBInfo); -+ temp = pVBInfo->LCDCapList[index].PWD_2B; -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x2B, temp); -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x2C, -+ pVBInfo->LCDCapList[index].PWD_2C); -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x2D, -+ pVBInfo->LCDCapList[index].PWD_2D); -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x2E, -+ pVBInfo->LCDCapList[index].PWD_2E); -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x2F, -+ pVBInfo->LCDCapList[index].PWD_2F); -+ XGI_SetRegOR((XGIIOADDRESS) pVBInfo->Part4Port, 0x27, 0x80); /* enable PWD */ -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGI_DisablePWD */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+void -+XGI_DisablePWD(PVB_DEVICE_INFO pVBInfo) -+{ -+ XGI_SetRegAND((XGIIOADDRESS) pVBInfo->Part4Port, 0x27, 0x7F); /* disable PWD */ -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGI_DisableChISLCD */ -+/* Input : */ -+/* Output : FALSE -> Not LCD Mode */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+BOOLEAN -+XGI_DisableChISLCD(PVB_DEVICE_INFO pVBInfo) -+{ -+ USHORT tempbx, tempah; -+ -+ tempbx = pVBInfo->SetFlag & (DisableChA | DisableChB); -+ tempah = ~((USHORT) XGI_GetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x2E)); -+ -+ if (tempbx & (EnableChA | DisableChA)) { -+ if (!(tempah & 0x08)) /* Chk LCDA Mode */ -+ return FALSE; -+ } -+ -+ if (!(tempbx & (EnableChB | DisableChB))) -+ return FALSE; -+ -+ if (tempah & 0x01) /* Chk LCDB Mode */ -+ return TRUE; -+ -+ return FALSE; -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGI_EnableChISLCD */ -+/* Input : */ -+/* Output : 0 -> Not LCD mode */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+BOOLEAN -+XGI_EnableChISLCD(PVB_DEVICE_INFO pVBInfo) -+{ -+ USHORT tempbx, tempah; -+ -+ -+ tempbx = pVBInfo->SetFlag & (EnableChA | EnableChB); -+ tempah = ~((USHORT) XGI_GetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x2E)); -+ -+ if (tempbx & (EnableChA | DisableChA)) { -+ if (!(tempah & 0x08)) /* Chk LCDA Mode */ -+ return FALSE; -+ } -+ -+ if (!(tempbx & (EnableChB | DisableChB))) -+ return FALSE; -+ -+ if (tempah & 0x01) /* Chk LCDB Mode */ -+ return TRUE; -+ -+ return FALSE; -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGI_GetLCDCapPtr */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+USHORT -+XGI_GetLCDCapPtr(PVB_DEVICE_INFO pVBInfo) -+{ -+ UCHAR tempal, tempah, tempbl, i; -+ -+ tempah = XGI_GetReg((XGIIOADDRESS) 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 : */ -+/* --------------------------------------------------------------------- */ -+USHORT -+XGI_GetLCDCapPtr1(PVB_DEVICE_INFO pVBInfo) -+{ -+ USHORT 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(USHORT * HSyncWidth, USHORT * VSyncWidth, -+ PVB_DEVICE_INFO pVBInfo) -+{ -+ USHORT 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(PXGI_HW_DEVICE_INFO HwDeviceExtension, -+ PVB_DEVICE_INFO pVBInfo) -+{ -+#ifndef LINUX_XF86 -+ USHORT tempax; -+#endif -+ USHORT 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) { -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x1E, 0x20); /* Power on */ -+ } -+ else { -+ if (pVBInfo->VBInfo & SetCRT2ToDualEdge) { /* SetCRT2ToLCDA ) */ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x1E, 0x20); /* Power on */ -+ } -+ } -+ } -+ -+ if (!(pVBInfo->SetFlag & DisableChB)) { -+ if ((pVBInfo->SetFlag & EnableChB) -+ || (pVBInfo-> -+ VBInfo & (SetCRT2ToLCD | SetCRT2ToTV | SetCRT2ToRAMDAC))) -+ { -+ tempah = -+ (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x32); -+ tempah &= 0xDF; -+ if (pVBInfo->VBInfo & SetInSlaveMode) { -+ if (!(pVBInfo->VBInfo & SetCRT2ToRAMDAC)) -+ tempah |= 0x20; -+ } -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x32, tempah); -+ XGI_SetRegOR((XGIIOADDRESS) pVBInfo->P3c4, 0x1E, -+ SR1E_ENABLE_CRT2); -+ -+ -+ tempah = -+ (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->Part1Port, -+ 0x2E); -+ -+ if (!(tempah & 0x80)) -+ XGI_SetRegOR((XGIIOADDRESS) pVBInfo->Part1Port, 0x2E, 0x80); /* BVBDOENABLE = 1 */ -+ -+ XGI_SetRegAND((XGIIOADDRESS) pVBInfo->Part1Port, 0x00, 0x7F); /* BScreenOFF = 0 */ -+ } -+ } -+ -+ if ((pVBInfo->SetFlag & (EnableChA | EnableChB)) -+ || (!(pVBInfo->VBInfo & DisableCRT2Display))) { -+ XGI_SetRegANDOR((XGIIOADDRESS) 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))) -+ XGI_SetRegAND((XGIIOADDRESS) pVBInfo->Part4Port, 0x2A, 0x7F); /* LVDS PLL power on */ -+ } -+ XGI_SetRegAND((XGIIOADDRESS) 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; -+ } -+ } -+ } -+ } -+ -+ XGI_SetRegOR((XGIIOADDRESS) 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)) -+ XGI_SetRegOR((XGIIOADDRESS) pVBInfo->Part1Port, 0x1E, 0x20); /* enable CRT2 */ -+ -+ -+ -+ tempah = (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x2E); -+ if (!(tempah & 0x80)) -+ XGI_SetRegOR((XGIIOADDRESS) pVBInfo->Part1Port, 0x2E, 0x80); /* BVBDOENABLE = 1 */ -+ -+ XGI_SetRegAND((XGIIOADDRESS) 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(PXGI_HW_DEVICE_INFO HwDeviceExtension, -+ PVB_DEVICE_INFO pVBInfo) -+{ -+ USHORT 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 (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 */ -+ } -+ } -+ } -+ -+ XGI_SetRegAND((XGIIOADDRESS) 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))) -+ XGI_SetRegOR((XGIIOADDRESS) 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)) -+ XGI_SetRegAND((XGIIOADDRESS) pVBInfo->Part1Port, 0x1e, 0xdf); /* Power down */ -+ } -+ -+ XGI_SetRegAND((XGIIOADDRESS) pVBInfo->P3c4, 0x32, 0xdf); /* disable TV as primary VGA swap */ -+ -+ if ((pVBInfo->VBInfo & (SetSimuScanMode | SetCRT2ToDualEdge))) -+ XGI_SetRegAND((XGIIOADDRESS) pVBInfo->Part2Port, 0x00, 0xdf); -+ -+ if ((pVBInfo->SetFlag & DisableChB) -+ || (pVBInfo->VBInfo & (DisableCRT2Display | SetSimuScanMode)) -+ || ((!(pVBInfo->VBInfo & SetCRT2ToLCDA)) -+ && (pVBInfo-> -+ VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToLCD | SetCRT2ToTV)))) -+ XGI_SetRegOR((XGIIOADDRESS) pVBInfo->Part1Port, 0x00, 0x80); /* BScreenOff=1 */ -+ -+ if ((pVBInfo->SetFlag & DisableChB) -+ || (pVBInfo->VBInfo & (DisableCRT2Display | SetSimuScanMode)) -+ || (!(pVBInfo->VBInfo & SetCRT2ToLCDA)) -+ || (pVBInfo-> -+ VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToLCD | SetCRT2ToTV))) { -+ tempah = XGI_GetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x00); /* save Part1 index 0 */ -+ XGI_SetRegOR((XGIIOADDRESS) pVBInfo->Part1Port, 0x00, 0x10); /* BTDAC = 1, avoid VB reset */ -+ XGI_SetRegAND((XGIIOADDRESS) pVBInfo->Part1Port, 0x1E, 0xDF); /* disable CRT2 */ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x00, tempah); /* restore Part1 index 0 */ -+ } -+ } -+ else { /* {301} */ -+ -+ if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToTV)) { -+ XGI_SetRegOR((XGIIOADDRESS) pVBInfo->Part1Port, 0x00, 0x80); /* BScreenOff=1 */ -+ XGI_SetRegAND((XGIIOADDRESS) pVBInfo->Part1Port, 0x1E, 0xDF); /* Disable CRT2 */ -+ XGI_SetRegAND((XGIIOADDRESS) 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 */ -+/* --------------------------------------------------------------------- */ -+USHORT -+XGI_GetTVPtrIndex(PVB_DEVICE_INFO pVBInfo) -+{ -+ USHORT 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(USHORT ModeNo, USHORT ModeIdIndex, PVB_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(PVB_DEVICE_INFO pVBInfo) -+{ -+ USHORT index; -+ -+ UCHAR tempah, tempbl, tempbh; -+#ifndef LINUX_XF86 -+ UCHAR temp; -+#endif -+ -+ 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 = XGI_GetReg((XGIIOADDRESS) 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; -+ } -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x2D, tempah); -+ } -+ } -+ /* Jong 10/04/2007; merge code */ -+ 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 ; -+ XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->Part1Port , 0x2D , 0x0f , tempah ) ; -+ } -+ } -+ -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGI_SetLCDCap */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+void -+XGI_SetLCDCap(PVB_DEVICE_INFO pVBInfo) -+{ -+ USHORT 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 */ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x24, -+ (UCHAR) (tempcx & 0x1F)); -+ } -+ /* VB Driving */ -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part4Port, 0x0D, -+ ~((EnableVBCLKDRVLOW | EnablePLLSPLOW) >> 8), -+ (USHORT) ((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(USHORT tempcx, PVB_DEVICE_INFO pVBInfo) -+{ -+ USHORT temp; -+ -+ temp = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x37); -+ -+ if (temp & LCDRGB18Bit) { -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part1Port, 0x19, 0x0F, (USHORT) (0x20 | (tempcx & 0x00C0))); /* Enable Dither */ -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part1Port, 0x1A, 0x7F, 0x80); -+ } -+ else { -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part1Port, 0x19, 0x0F, -+ (USHORT) (0x30 | (tempcx & 0x00C0))); -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part1Port, 0x1A, 0x7F, 0x00); -+ } -+ -+/* -+ if ( tempcx & EnableLCD24bpp ) // 24bits -+ { -+ XGI_SetRegANDOR((XGIIOADDRESS)pVBInfo->Part1Port,0x19, 0x0F,(USHORT)(0x30|(tempcx&0x00C0)) ); -+ XGI_SetRegANDOR((XGIIOADDRESS)pVBInfo->Part1Port,0x1A,0x7F,0x00); -+ } -+ else -+ { -+ XGI_SetRegANDOR((XGIIOADDRESS)pVBInfo->Part1Port,0x19, 0x0F,(USHORT)(0x20|(tempcx&0x00C0)) );//Enable Dither -+ XGI_SetRegANDOR((XGIIOADDRESS)pVBInfo->Part1Port,0x1A,0x7F,0x80); -+ } -+*/ -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGI_SetLCDCap_B */ -+/* Input : cx -> LCD Capability */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+void -+XGI_SetLCDCap_B(USHORT tempcx, PVB_DEVICE_INFO pVBInfo) -+{ -+ if (tempcx & EnableLCD24bpp) /* 24bits */ -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part2Port, 0x1A, 0xE0, -+ (USHORT) (((tempcx & 0x00ff) >> 6) | 0x0c)); -+ else -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part2Port, 0x1A, 0xE0, (USHORT) (((tempcx & 0x00ff) >> 6) | 0x18)); /* Enable Dither */ -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : SetSpectrum */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+void -+SetSpectrum(PVB_DEVICE_INFO pVBInfo) -+{ -+ USHORT index; -+ -+ index = XGI_GetLCDCapPtr(pVBInfo); -+ -+ XGI_SetRegAND((XGIIOADDRESS) pVBInfo->Part4Port, 0x30, 0x8F); /* disable down spectrum D[4] */ -+ XGI_WaitEndRetrace(pVBInfo->RelIO); -+ XGI_SetRegOR((XGIIOADDRESS) pVBInfo->Part4Port, 0x30, 0x20); /* reset spectrum */ -+ XGI_WaitEndRetrace(pVBInfo->RelIO); -+ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x31, -+ pVBInfo->LCDCapList[index].Spectrum_31); -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x32, -+ pVBInfo->LCDCapList[index].Spectrum_32); -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x33, -+ pVBInfo->LCDCapList[index].Spectrum_33); -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x34, -+ pVBInfo->LCDCapList[index].Spectrum_34); -+ XGI_WaitEndRetrace(pVBInfo->RelIO); -+ XGI_SetRegOR((XGIIOADDRESS) pVBInfo->Part4Port, 0x30, 0x40); /* enable spectrum */ -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGI_SetAntiFlicker */ -+/* Input : */ -+/* Output : */ -+/* Description : Set TV Customized Param. */ -+/* --------------------------------------------------------------------- */ -+void -+XGI_SetAntiFlicker(USHORT ModeNo, USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo) -+{ -+ USHORT tempbx, index; -+ -+ UCHAR 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; -+ -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part2Port, 0x0A, 0x8F, tempah); -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGI_SetEdgeEnhance */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+void -+XGI_SetEdgeEnhance(USHORT ModeNo, USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo) -+{ -+ USHORT tempbx, index; -+ -+ UCHAR 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; -+ -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part2Port, 0x3A, 0x1F, tempah); -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGI_SetPhaseIncr */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+void -+XGI_SetPhaseIncr(PVB_DEVICE_INFO pVBInfo) -+{ -+ USHORT tempbx; -+ -+ UCHAR tempcl, tempch; -+ -+ ULONG tempData; -+ -+ XGI_GetTVPtrIndex2(&tempbx, &tempcl, &tempch, pVBInfo); /* bx, cl, ch */ -+ tempData = TVPhaseList[tempbx]; -+ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x31, -+ (USHORT) (tempData & 0x000000FF)); -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x32, -+ (USHORT) ((tempData & 0x0000FF00) >> 8)); -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x33, -+ (USHORT) ((tempData & 0x00FF0000) >> 16)); -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x34, -+ (USHORT) ((tempData & 0xFF000000) >> 24)); -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGI_SetYFilter */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+void -+XGI_SetYFilter(USHORT ModeNo, USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo) -+{ -+ USHORT tempbx, index; -+ -+ UCHAR tempcl, tempch, tempal; -+ const UCHAR *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)) { -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x35, 0); -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x36, 0); -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x37, 0); -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x38, -+ filterPtr[index++]); -+ } -+ else { -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x35, -+ filterPtr[index++]); -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x36, -+ filterPtr[index++]); -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x37, -+ filterPtr[index++]); -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x38, -+ filterPtr[index++]); -+ } -+ -+ if (pVBInfo-> -+ VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | -+ VB_XGI301C)) { -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x48, -+ filterPtr[index++]); -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x49, -+ filterPtr[index++]); -+ XGI_SetReg((XGIIOADDRESS) 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(USHORT * tempbx, UCHAR * tempcl, UCHAR * tempch, -+ PVB_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(USHORT ModeNo, PXGI_HW_DEVICE_INFO HwDeviceExtension, -+ PVB_DEVICE_INFO pVBInfo) -+{ -+#ifndef LINUX_XF86 -+ USHORT i, j; -+#endif -+ USHORT tempbl; -+ SHORT tempcl; -+ -+ UCHAR tempah; -+ -+ /* XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port , 0x03 , 0x00 ) ; // fix write part1 index 0 BTDRAM bit Bug */ -+ tempah = 0; -+ if (!(pVBInfo->VBInfo & DisableCRT2Display)) { -+ tempah = XGI_GetReg((XGIIOADDRESS) 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 ; -+ } -+ -+ XGI_SetReg((XGIIOADDRESS) 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 ) ; -+ } -+ } -+*/ -+ -+ XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x00, tempah); -+ tempah = 0x08; -+ tempbl = 0xf0; -+ -+ if (pVBInfo->VBInfo & DisableCRT2Display) -+ XGI_SetRegANDOR((XGIIOADDRESS) 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; -+ XGI_SetRegANDOR((XGIIOADDRESS) 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; -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part1Port, 0x2e, -+ tempbl, tempah); -+ } -+ else -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part1Port, 0x2e, -+ tempbl, tempah); -+ } -+ } -+ else -+ XGI_SetRegANDOR((XGIIOADDRESS) 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; -+ } -+ /* } */ -+ } -+ -+ XGI_SetRegANDOR((XGIIOADDRESS) 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; -+ -+ XGI_SetReg((XGIIOADDRESS) 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 */ -+ } -+ -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part1Port, 0x13, tempbl, -+ tempah); -+ tempah = 0x00; -+ tempbl = 0xcf; -+ if (!(pVBInfo->VBInfo & DisableCRT2Display)) { -+ if (pVBInfo->VBInfo & SetCRT2ToDualEdge) -+ tempah |= 0x30; -+ } -+ -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part1Port, 0x2c, tempbl, -+ tempah); -+ tempah = 0; -+ tempbl = 0x3f; -+ -+ if (!(pVBInfo->VBInfo & DisableCRT2Display)) { -+ if (pVBInfo->VBInfo & SetCRT2ToDualEdge) -+ tempah |= 0xc0; -+ } -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part4Port, 0x21, tempbl, -+ tempah); -+ } -+ -+ tempah = 0; -+ tempbl = 0x7f; -+ if (!(pVBInfo->VBInfo & SetCRT2ToLCDA)) { -+ tempbl = 0xff; -+ if (!(pVBInfo->VBInfo & SetCRT2ToDualEdge)) -+ tempah |= 0x80; -+ } -+ -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part4Port, 0x23, tempbl, tempah); -+ -+ if (pVBInfo->VBType & (VB_XGI302LV | VB_XGI301C)) { -+ if (pVBInfo->LCDInfo & SetLCDDualLink) { -+ XGI_SetRegOR((XGIIOADDRESS) pVBInfo->Part4Port, 0x27, 0x20); -+ XGI_SetRegOR((XGIIOADDRESS) pVBInfo->Part4Port, 0x34, 0x10); -+ } -+ } -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGI_GetRAMDAC2DATA */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+void -+XGI_GetRAMDAC2DATA(USHORT ModeNo, USHORT ModeIdIndex, -+ USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo) -+{ -+ USHORT tempax, tempbx, temp1, temp2, modeflag = 0, tempcx, CRT1Index; -+#ifndef LINUX_XF86 -+ USHORT temp, ResInfo, DisplayType; -+#endif -+ -+ pVBInfo->RVBHCMAX = 1; -+ pVBInfo->RVBHCFACT = 1; -+ -+ if (ModeNo <= 0x13) { -+ const USHORT StandTableIndex = XGI_GetModePtr(pVBInfo->SModeIDTable, -+ pVBInfo->ModeType, -+ ModeNo, ModeIdIndex); -+ -+ modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag; -+ 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 = (USHORT) pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[0]; -+ temp2 = (USHORT) pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[5]; -+ tempax = (temp1 & 0xFF) | ((temp2 & 0x03) << 8); -+ tempbx = (USHORT) pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[8]; -+ tempcx = (USHORT) pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[14] << 8; -+ tempcx &= 0x0100; -+ tempcx = tempcx << 2; -+ tempbx |= tempcx; -+ temp1 = (USHORT) 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 : */ -+/* --------------------------------------------------------------------- */ -+USHORT -+XGI_GetColorDepth(USHORT ModeNo, USHORT ModeIdIndex, -+ const VB_DEVICE_INFO *pVBInfo) -+{ -+ USHORT ColorDepth[6] = { 1, 2, 4, 4, 6, 8 }; -+ SHORT index; -+ USHORT 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(PXGI_HW_DEVICE_INFO HwDeviceExtension, PVB_DEVICE_INFO pVBInfo) -+{ -+ -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part1Port, 0x2f, 0xFF, 0x01); -+ -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGI_LockCRT2 */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+void -+XGI_LockCRT2(PXGI_HW_DEVICE_INFO HwDeviceExtension, PVB_DEVICE_INFO pVBInfo) -+{ -+ XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part1Port, 0x2F, 0xFE, 0x00); -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGINew_EnableCRT2 */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+void -+XGINew_EnableCRT2(PVB_DEVICE_INFO pVBInfo) -+{ -+ XGI_SetRegOR((XGIIOADDRESS) pVBInfo->P3c4, 0x1E, SR1E_ENABLE_CRT2); -+} -+ -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+void -+XGINew_LCD_Wait_Time(UCHAR DelayTime, PVB_DEVICE_INFO pVBInfo) -+{ -+ USHORT i, j; -+ -+ ULONG temp, flag; -+ -+ flag = 0; -+ -+ for (i = 0; i < DelayTime; i++) { -+ for (j = 0; j < 66; j++) { -+ temp = XGI_GetRegLong((XGIIOADDRESS) 0x61); -+ temp &= 0x10; -+ -+ if (temp == flag) -+ continue; -+ -+ flag = temp; -+ } -+ } -+} -+ -+ -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGI_BridgeIsOn */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+BOOLEAN -+XGI_BridgeIsOn(PVB_DEVICE_INFO pVBInfo) -+{ -+ USHORT flag; -+ -+ /* Jong 10/04/2007; merge code */ -+ if ( pVBInfo->IF_DEF_LVDS == 1 ) -+ { -+ return( 1 ) ; -+ } -+ else -+ { -+ flag = XGI_GetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x00); -+ if ((flag == 1) || (flag == 2)) -+ return (1); /* 301b */ -+ else -+ return (0); -+ } -+} -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGI_VBLongWait */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+void -+XGI_VBLongWait(PVB_DEVICE_INFO pVBInfo) -+{ -+ USHORT tempal, temp, i, j; -+ -+ if (!(pVBInfo->VBInfo & SetCRT2ToTV)) { -+ temp = 0; -+ for (i = 0; i < 3; i++) { -+ for (j = 0; j < 100; j++) { -+ tempal = XGI_GetRegByte((XGIIOADDRESS) 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_WaitEndRetrace(pVBInfo->RelIO); -+ } -+ return; -+} -+ -+ -+ -+ -+/* --------------------------------------------------------------------- */ -+/* Function : XGI_GetVGAHT2 */ -+/* Input : */ -+/* Output : */ -+/* Description : */ -+/* --------------------------------------------------------------------- */ -+USHORT -+XGI_GetVGAHT2(PVB_DEVICE_INFO pVBInfo) -+{ -+ ULONG tempax, tempbx; -+ -+ tempbx = -+ ((pVBInfo->VGAVT - pVBInfo->VGAVDE) * pVBInfo->RVBHCMAX) & 0xFFFF; -+ tempax = (pVBInfo->VT - pVBInfo->VDE) * pVBInfo->RVBHCFACT; -+ tempax = (tempax * pVBInfo->HT) / tempbx; -+ -+ return ((USHORT) tempax); -+} -+ -+ -+/** -+ * Get magic index into clock table. -+ * -+ * \bugs -+ * I'm pretty sure the first if-statement is wrong. It will \b always -+ * evaluate to true. -+ */ -+unsigned -+XGI_GetVCLK2Ptr(USHORT ModeNo, USHORT ModeIdIndex, -+ USHORT RefreshRateTableIndex, -+ PVB_DEVICE_INFO pVBInfo) -+{ -+ /* Jong 10/08/2007; merge code */ -+ USHORT tempbx ; -+ UCHAR *CHTVVCLKPtr = NULL ; -+ -+ unsigned VCLKIndex; -+ USHORT CRT2Index; -+ -+ /* Jong 10/08/2007; merge code */ -+ USHORT LCDXlat1VCLK[ 4 ] = { VCLK65 + 2 , VCLK65 + 2 , VCLK65 + 2 , VCLK65 + 2 } ; -+ USHORT LCDXlat2VCLK[ 4 ] = { VCLK108_2 + 5 , VCLK108_2 + 5 , VCLK108_2 + 5 , VCLK108_2 + 5 } ; -+ USHORT LVDSXlat1VCLK[ 4 ] = { VCLK40 , VCLK40 , VCLK40 , VCLK40 } ; -+ USHORT LVDSXlat2VCLK[ 4 ] = { VCLK65 + 2 , VCLK65 + 2 , VCLK65 + 2 , VCLK65 + 2 } ; -+ USHORT LVDSXlat3VCLK[ 4 ] = { VCLK65 + 2 , VCLK65 + 2 , VCLK65 + 2 , VCLK65 + 2 } ; -+ -+ const unsigned modeflag = (ModeNo <= 0x13) -+ ? pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag -+ : pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag; -+ -+ /* Jong 10/04/2007; merge code */ -+ if ( pVBInfo->IF_DEF_LVDS == 0 ) -+ { -+ CRT2Index = CRT2Index >> 6 ; /* for LCD */ -+ -+ if (((pVBInfo->VBInfo & SetCRT2ToLCD) | SetCRT2ToLCDA)) { /*301b */ -+ VCLKIndex = (pVBInfo->LCDResInfo != Panel1024x768) -+ ? (VCLK108_2 + 5) : (VCLK65 + 2); -+ } -+ else -+ { -+ if (pVBInfo->VBInfo & SetCRT2ToTV) /* for TV */ -+ { -+ if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) -+ { -+ VCLKIndex = (pVBInfo->SetFlag & RPLLDIV2XO) -+ ? HiTVVCLKDIV2 : HiTVVCLK; -+ -+ VCLKIndex += 25; -+ -+ if (pVBInfo->SetFlag & TVSimuMode) { -+ VCLKIndex = (modeflag & Charx8Dot) -+ ? HiTVSimuVCLK : HiTVTextVCLK; -+ -+ VCLKIndex += 25; -+ } -+ -+ if (pVBInfo->VBType & VB_XGI301LV) { -+ switch (pVBInfo->VBExtInfo) { -+ case VB_YPbPr1080i: -+ /* VCLKIndex already set to correct value? */ -+ break; -+ case VB_YPbPr750p: -+ VCLKIndex = YPbPr750pVCLK; -+ break; -+ case VB_YPbPr525p: -+ VCLKIndex = YPbPr525pVCLK; -+ break; -+ case VB_YPbPr525i: -+ VCLKIndex = (pVBInfo->SetFlag & RPLLDIV2XO) -+ ? YPbPr525iVCLK_2 : YPbPr525iVCLK; -+ break; -+ } -+ } -+ } -+ else { -+ VCLKIndex = (pVBInfo->SetFlag & RPLLDIV2XO) -+ ? TVVCLKDIV2 : TVVCLK; -+ -+ VCLKIndex += 25; -+ } -+ } -+ else /* for CRT2 */ -+ { -+ VCLKIndex = XGI_GetRegByte((XGIIOADDRESS) (pVBInfo->P3ca + 0x02)); -+ VCLKIndex = ((VCLKIndex >> 2) & 0x03); -+ if (ModeNo > 0x13) { -+ VCLKIndex = -+ (pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRTVCLK -+ & IndexMask); -+ } -+ } -+ } -+ } -+ else /* Jong 10/04/2007; merge code */ -+ { /* 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 ] ; -+ } -+ } -+ -+ return VCLKIndex; -+} -diff --git a/src/vb_setmode.h b/src/vb_setmode.h -index 558e68d..1b37395 100644 ---- a/src/vb_setmode.h -+++ b/src/vb_setmode.h -@@ -34,8 +34,8 @@ extern void XGI_LongWait( PVB_DEVICE_INFO ); - extern void XGI_SetCRT2ModeRegs(USHORT ModeNo,PXGI_HW_DEVICE_INFO, PVB_DEVICE_INFO ); - extern void XGI_DisableBridge(PXGI_HW_DEVICE_INFO HwDeviceExtension, PVB_DEVICE_INFO ); - extern void XGI_EnableBridge(PXGI_HW_DEVICE_INFO HwDeviceExtension, PVB_DEVICE_INFO ); --extern void XGI_DisplayOff( PVB_DEVICE_INFO ); --extern void XGI_DisplayOn( PVB_DEVICE_INFO ); -+extern void XGI_DisplayOff( PXGI_HW_DEVICE_INFO HwDeviceExtension, PVB_DEVICE_INFO ); -+extern void XGI_DisplayOn( PXGI_HW_DEVICE_INFO HwDeviceExtension, PVB_DEVICE_INFO ); - extern void XGI_GetVBType(PVB_DEVICE_INFO); - extern void XGI_SenseCRT1(PVB_DEVICE_INFO ); - extern void XGI_GetVGAType(PXGI_HW_DEVICE_INFO HwDeviceExtension, PVB_DEVICE_INFO ); -@@ -44,6 +44,9 @@ extern void XGI_GetTVInfo(USHORT ModeNo,USHORT ModeIdIndex, PVB_DEVICE_INF - extern void XGI_SetCRT1Offset(USHORT ModeNo,USHORT ModeIdIndex,USHORT RefreshRateTableIndex,PXGI_HW_DEVICE_INFO HwDeviceExtension, PVB_DEVICE_INFO ); - extern void XGI_SetLCDAGroup(USHORT ModeNo,USHORT ModeIdIndex,PXGI_HW_DEVICE_INFO HwDeviceExtension, PVB_DEVICE_INFO ); - -+/* Jong 10/04/2007; merge code */ -+extern USHORT XGI_GetResInfo(USHORT ModeNo,USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo); -+ - extern BOOLEAN XGISetModeNew(PXGI_HW_DEVICE_INFO HwDeviceExtension, - PVB_DEVICE_INFO pVBInfo, USHORT ModeNo); - -@@ -51,7 +54,7 @@ extern BOOLEAN CheckDualChip(PVB_DEVICE_INFO ); - extern BOOLEAN XGI_GetLCDInfo(USHORT ModeNo,USHORT ModeIdIndex,PVB_DEVICE_INFO ); - extern BOOLEAN XGI_BridgeIsOn( PVB_DEVICE_INFO ); - extern BOOLEAN XGI_SetCRT2Group301(USHORT ModeNo, PXGI_HW_DEVICE_INFO HwDeviceExtension, PVB_DEVICE_INFO); --extern USHORT XGI_GetRatePtrCRT2( USHORT ModeNo,USHORT ModeIdIndex, PVB_DEVICE_INFO ); -+extern USHORT XGI_GetRatePtrCRT2( PXGI_HW_DEVICE_INFO HwDeviceExtension, USHORT ModeNo,USHORT ModeIdIndex, PVB_DEVICE_INFO ); - - extern USHORT XGI_GetColorDepth(USHORT ModeNo, USHORT ModeIdIndex, - const VB_DEVICE_INFO *pVBInfo); -@@ -73,6 +76,15 @@ extern void XGI_SetGRCRegs(unsigned StandTableIndex, - - extern void XGI_ClearExt1Regs(unsigned ModeNo, const VB_DEVICE_INFO *pVBInfo); - -+extern void XGI_SetXG21FPBits(PVB_DEVICE_INFO pVBInfo); -+extern void XGI_SetXG27FPBits(PVB_DEVICE_INFO pVBInfo); -+extern void XGI_XG21BLSignalVDD(USHORT tempbh,USHORT tempbl, PVB_DEVICE_INFO pVBInfo); -+extern void XGI_XG27BLSignalVDD(USHORT tempbh,USHORT tempbl, PVB_DEVICE_INFO pVBInfo); -+extern void XGI_XG21SetPanelDelay(USHORT tempbl, PVB_DEVICE_INFO pVBInfo); -+extern BOOLEAN XGI_XG21CheckLVDSMode(USHORT ModeNo,USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo ); -+extern void XGI_SetXG21LVDSPara(USHORT ModeNo,USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo ); -+extern USHORT XGI_GetLVDSOEMTableIndex(PVB_DEVICE_INFO pVBInfo); -+ - extern void XGI_SetSync(unsigned RefreshRateTableIndex, - const VB_DEVICE_INFO *pVBInfo); - #endif -diff --git a/src/vb_struct.h b/src/vb_struct.h -index 072a024..2ba26cf 100644 ---- a/src/vb_struct.h -+++ b/src/vb_struct.h -@@ -1,499 +1,574 @@ --/* Copyright (C) 2003-2006 by XGI Technology, Taiwan. -- * -- * All Rights Reserved. -- * -- * Permission is hereby granted, free of charge, to any person obtaining -- * a copy of this software and associated documentation files (the -- * "Software"), to deal in the Software without restriction, including -- * without limitation on the rights to use, copy, modify, merge, -- * publish, distribute, sublicense, and/or sell copies of the Software, -- * and to permit persons to whom the Software is furnished to do so, -- * subject to the following conditions: -- * -- * The above copyright notice and this permission notice (including the -- * next paragraph) shall be included in all copies or substantial -- * portions of the Software. -- * -- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -- * NON-INFRINGEMENT. IN NO EVENT SHALL XGI AND/OR -- * ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -- * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -- * DEALINGS IN THE SOFTWARE. -- */ -- -- --#ifndef _VB_STRUCT_ --#define _VB_STRUCT_ -- -- --typedef struct _XGI_PanelDelayTblStruct --{ -- UCHAR timer[2]; --} XGI_PanelDelayTblStruct; -- --typedef struct _XGI_LCDDataStruct --{ -- USHORT RVBHCMAX; -- USHORT RVBHCFACT; -- USHORT VGAHT; -- USHORT VGAVT; -- USHORT LCDHT; -- USHORT LCDVT; --} XGI_LCDDataStruct; -- -- --typedef struct _XGI_LVDSCRT1HDataStruct --{ -- UCHAR Reg[8]; --} XGI_LVDSCRT1HDataStruct; --typedef struct _XGI_LVDSCRT1VDataStruct --{ -- UCHAR Reg[7]; --} XGI_LVDSCRT1VDataStruct; -- -- --typedef struct _XGI_TVDataStruct --{ -- USHORT RVBHCMAX; -- USHORT RVBHCFACT; -- USHORT VGAHT; -- USHORT VGAVT; -- USHORT TVHDE; -- USHORT TVVDE; -- USHORT RVBHRS; -- UCHAR FlickerMode; -- USHORT HALFRVBHRS; -- UCHAR RY1COE; -- UCHAR RY2COE; -- UCHAR RY3COE; -- UCHAR RY4COE; --} XGI_TVDataStruct; -- --typedef struct _XGI_LVDSDataStruct --{ -- USHORT VGAHT; -- USHORT VGAVT; -- USHORT LCDHT; -- USHORT LCDVT; --} XGI_LVDSDataStruct; -- --typedef struct _XGI_LVDSDesStruct --{ -- USHORT LCDHDES; -- USHORT LCDVDES; --} XGI_LVDSDesStruct; -- --typedef struct _XGI_LVDSCRT1DataStruct --{ -- UCHAR CR[15]; --} XGI_LVDSCRT1DataStruct; -- --/*add for LCDA*/ -- -- --typedef struct _XGI_StStruct --{ -- UCHAR St_ModeID; -- USHORT St_ModeFlag; -- UCHAR St_StTableIndex; -- UCHAR St_CRT2CRTC; -- UCHAR St_CRT2CRTC2; -- UCHAR St_ResInfo; -- UCHAR VB_StTVFlickerIndex; -- UCHAR VB_StTVEdgeIndex; -- UCHAR VB_StTVYFilterIndex; --} XGI_StStruct; -- --typedef struct _XGI_StandTableStruct --{ -- UCHAR CRT_COLS; -- UCHAR ROWS; -- UCHAR CHAR_HEIGHT; -- USHORT CRT_LEN; -- UCHAR SR[4]; -- UCHAR MISC; -- UCHAR CRTC[0x19]; -- UCHAR ATTR[0x14]; -- UCHAR GRC[9]; --} XGI_StandTableStruct; -- --typedef struct _XGI_ExtStruct --{ -- UCHAR Ext_ModeID; -- USHORT Ext_ModeFlag; -- USHORT Ext_ModeInfo; -- USHORT Ext_Point; -- USHORT Ext_VESAID; -- UCHAR Ext_VESAMEMSize; -- UCHAR Ext_RESINFO; -- UCHAR VB_ExtTVFlickerIndex; -- UCHAR VB_ExtTVEdgeIndex; -- UCHAR VB_ExtTVYFilterIndex; -- UCHAR REFindex; --} XGI_ExtStruct; -- --typedef struct _XGI_Ext2Struct --{ -- USHORT Ext_InfoFlag; -- UCHAR Ext_CRT1CRTC; -- UCHAR Ext_CRTVCLK; -- UCHAR Ext_CRT2CRTC; -- UCHAR Ext_CRT2CRTC2; -- UCHAR ModeID; -- USHORT XRes; -- USHORT YRes; -- /* USHORT ROM_OFFSET; */ --} XGI_Ext2Struct; -- -- --typedef struct _XGI_MCLKDataStruct --{ -- UCHAR SR28,SR29,SR2A; -- USHORT CLOCK; --} XGI_MCLKDataStruct; -- --typedef struct _XGI_ECLKDataStruct --{ -- UCHAR SR2E,SR2F,SR30; -- USHORT CLOCK; --} XGI_ECLKDataStruct; -- --typedef struct _XGI_VCLKDataStruct --{ -- UCHAR SR2B,SR2C; -- USHORT CLOCK; --} XGI_VCLKDataStruct; -- --typedef struct _XGI_VBVCLKDataStruct --{ -- UCHAR Part4_A,Part4_B; -- USHORT CLOCK; --} XGI_VBVCLKDataStruct; -- --typedef struct _XGI_StResInfoStruct --{ -- USHORT HTotal; -- USHORT VTotal; --} XGI_StResInfoStruct; -- --typedef struct _XGI_ModeResInfoStruct --{ -- USHORT HTotal; -- USHORT VTotal; -- UCHAR XChar; -- UCHAR YChar; --} XGI_ModeResInfoStruct; -- --typedef struct _XGI_LCDNBDesStruct --{ -- UCHAR NB[12]; --} XGI_LCDNBDesStruct; -- /*add for new UNIVGABIOS*/ --typedef struct _XGI_LCDDesStruct --{ -- USHORT LCDHDES; -- USHORT LCDHRS; -- USHORT LCDVDES; -- USHORT LCDVRS; --} XGI_LCDDesStruct; -- --typedef struct _XGI_LCDDataTablStruct --{ -- UCHAR PANELID; -- USHORT MASK; -- USHORT CAP; -- USHORT DATAPTR; --} XGI_LCDDataTablStruct; -- --typedef struct _XGI_TVTablDataStruct --{ -- USHORT MASK; -- USHORT CAP; -- USHORT DATAPTR; --} XGI_TVDataTablStruct; -- --typedef struct _XGI330_LCDDesDataStruct --{ -- USHORT LCDHDES; -- USHORT LCDHRS; -- USHORT LCDVDES; -- USHORT LCDVRS; --} XGI330_LCDDataDesStruct; -- -- --typedef struct _XGI330_LVDSDataStruct --{ -- USHORT VGAHT; -- USHORT VGAVT; -- USHORT LCDHT; -- USHORT LCDVT; --} XGI330_LVDSDataStruct; -- --typedef struct _XGI330_LCDDesDataStruct2 --{ -- USHORT LCDHDES; -- USHORT LCDHRS; -- USHORT LCDVDES; -- USHORT LCDVRS; -- USHORT LCDHSync; -- USHORT LCDVSync; --} XGI330_LCDDataDesStruct2; -- --typedef struct _XGI330_LCDDataStruct --{ -- USHORT RVBHCMAX; -- USHORT RVBHCFACT; -- USHORT VGAHT; -- USHORT VGAVT; -- USHORT LCDHT; -- USHORT LCDVT; --} XGI330_LCDDataStruct; -- -- --typedef struct _XGI330_TVDataStruct --{ -- USHORT RVBHCMAX; -- USHORT RVBHCFACT; -- USHORT VGAHT; -- USHORT VGAVT; -- USHORT TVHDE; -- USHORT TVVDE; -- USHORT RVBHRS; -- UCHAR FlickerMode; -- USHORT HALFRVBHRS; --} XGI330_TVDataStruct; -- --typedef struct _XGI330_LCDDataTablStruct --{ -- UCHAR PANELID; -- USHORT MASK; -- USHORT CAP; -- USHORT DATAPTR; --} XGI330_LCDDataTablStruct; -- --typedef struct _XGI330_TVDataTablStruct --{ -- USHORT MASK; -- USHORT CAP; -- USHORT DATAPTR; --} XGI330_TVDataTablStruct; -- -- --typedef struct _XGI330_CHTVDataStruct --{ -- USHORT VGAHT; -- USHORT VGAVT; -- USHORT LCDHT; -- USHORT LCDVT; --} XGI330_CHTVDataStruct; -- --typedef struct _XGI_TimingHStruct --{ -- UCHAR data[8]; --} XGI_TimingHStruct; -- --typedef struct _XGI_TimingVStruct --{ -- UCHAR data[7]; --} XGI_TimingVStruct; -- --typedef struct _XGI330_CHTVRegDataStruct --{ -- UCHAR Reg[16]; --} XGI330_CHTVRegDataStruct; -- --typedef struct _XGI330_LCDCapStruct --{ -- UCHAR LCD_ID; -- USHORT LCD_Capability; -- UCHAR LCD_SetFlag; -- UCHAR LCD_DelayCompensation; -- UCHAR LCD_HSyncWidth; -- UCHAR LCD_VSyncWidth; -- UCHAR LCD_VCLK; -- UCHAR LCDA_VCLKData1; -- UCHAR LCDA_VCLKData2; -- UCHAR LCUCHAR_VCLKData1; -- UCHAR LCUCHAR_VCLKData2; -- UCHAR PSC_S1; -- UCHAR PSC_S2; -- UCHAR PSC_S3; -- UCHAR PSC_S4; -- UCHAR PSC_S5; -- UCHAR PWD_2B; -- UCHAR PWD_2C; -- UCHAR PWD_2D; -- UCHAR PWD_2E; -- UCHAR PWD_2F; -- UCHAR Spectrum_31; -- UCHAR Spectrum_32; -- UCHAR Spectrum_33; -- UCHAR Spectrum_34; --} XGI330_LCDCapStruct; -- --typedef struct _XGI_CRT1TableStruct --{ -- UCHAR CR[15]; --} XGI_CRT1TableStruct; -- -- --typedef struct _XGI330_VCLKDataStruct --{ -- UCHAR SR2B,SR2C; -- USHORT CLOCK; --} XGI330_VCLKDataStruct; -- --typedef struct _XGI301C_Tap4TimingStruct --{ -- USHORT DE; -- UCHAR Reg[64]; /* C0-FF */ --} XGI301C_Tap4TimingStruct; -- --typedef struct _XGI_New_StandTableStruct --{ -- UCHAR CRT_COLS; -- UCHAR ROWS; -- UCHAR CHAR_HEIGHT; -- USHORT CRT_LEN; -- UCHAR SR[4]; -- UCHAR MISC; -- UCHAR CRTC[0x19]; -- UCHAR ATTR[0x14]; -- UCHAR GRC[9]; --} XGI_New_StandTableStruct; -- --typedef UCHAR DRAM8Type[8]; --typedef UCHAR DRAM4Type[4]; --typedef UCHAR DRAM32Type[32]; --typedef UCHAR DRAM2Type[2]; -- --typedef struct _VB_DEVICE_INFO VB_DEVICE_INFO,*PVB_DEVICE_INFO; -- --#define AGP_REG_SIZE 12 --#define CR40_SIZE 24 --#define CR6B_SIZE 8 --#define CR6E_SIZE 8 --#define CR6F_SIZE 8 --#define CR89_SIZE 8 --#define SR15_SIZE 4 --#define MCLK_SIZE 8 --#define ECLK_SIZE 8 -- --struct _VB_DEVICE_INFO --{ -- BOOLEAN ISXPDOS; -- USHORT P3c4,P3d4,P3c0,P3ce,P3c2,P3cc; -- USHORT P3ca,P3c6,P3c7,P3c8,P3c9,P3da; -- USHORT Part0Port,Part1Port,Part2Port; -- USHORT Part3Port,Part4Port,Part5Port; -- USHORT RVBHCFACT,RVBHCMAX,RVBHRS; -- USHORT VGAVT,VGAHT,VGAVDE,VGAHDE; -- USHORT VT,HT,VDE,HDE; -- USHORT LCDHRS,LCDVRS,LCDHDES,LCDVDES; -- -- USHORT ModeType; -- USHORT IF_DEF_TRUMPION,IF_DEF_DSTN; -- USHORT IF_DEF_CRT2Monitor,IF_DEF_VideoCapture; -- USHORT IF_DEF_LCDA,IF_DEF_YPbPr,IF_DEF_ScaleLCD,IF_DEF_OEMUtil,IF_DEF_PWD; -- USHORT IF_DEF_ExpLink; -- USHORT IF_DEF_HiVision; -- USHORT LCDResInfo,LCDTypeInfo, VBType;/*301b*/ -- USHORT VBInfo,TVInfo,LCDInfo; -- USHORT VBExtInfo;/*301lv*/ -- USHORT SetFlag; -- USHORT NewFlickerMode; -- USHORT SelectCRT2Rate; -- -- PUCHAR ROMAddr; -- PUCHAR FBAddr; -- USHORT BaseAddr; -- XGIIOADDRESS RelIO; -- -- DRAM4Type CR6B[CR6B_SIZE]; -- -- UCHAR XG45CR6E[CR6E_SIZE]; -- UCHAR XG45CR6F[CR6F_SIZE]; -- DRAM4Type CR6E[CR6E_SIZE]; -- DRAM32Type CR6F[CR6F_SIZE]; -- DRAM2Type CR89[CR89_SIZE]; -- -- DRAM8Type SR15[SR15_SIZE]; /* pointer : point to array */ -- DRAM8Type CR40[CR40_SIZE]; -- UCHAR SoftSetting; -- UCHAR OutputSelect; -- -- const USHORT *pRGBSenseData; -- const USHORT *pRGBSenseData2; /*301b*/ -- const USHORT *pVideoSenseData; -- const USHORT *pVideoSenseData2; -- const USHORT *pYCSenseData; -- const USHORT *pYCSenseData2; -- -- UCHAR SR07; -- UCHAR CR49[2]; -- UCHAR SR1F; -- UCHAR AGPReg[AGP_REG_SIZE]; -- UCHAR SR16[4]; -- UCHAR SR21; -- UCHAR SR22; -- UCHAR SR23; -- UCHAR SR24; -- UCHAR SR25[2]; -- UCHAR SR31; -- UCHAR SR32; -- UCHAR SR33; -- UCHAR CRCF; -- UCHAR CRT2Data_1_2; -- UCHAR CRT2Data_4_D; -- UCHAR CRT2Data_4_E; -- UCHAR CRT2Data_4_10; -- XGI_MCLKDataStruct MCLKData[MCLK_SIZE]; -- XGI_ECLKDataStruct ECLKData[ECLK_SIZE]; -- -- const UCHAR *XGI_TVDelayList; -- const UCHAR *XGI_TVDelayList2; -- const UCHAR *CHTVVCLKUNTSC; -- const UCHAR *CHTVVCLKONTSC; -- const UCHAR *CHTVVCLKUPAL; -- const UCHAR *CHTVVCLKOPAL; -- const UCHAR *NTSCTiming; -- const UCHAR *PALTiming; -- const UCHAR *HiTVExtTiming; -- const UCHAR *HiTVSt1Timing; -- const UCHAR *HiTVSt2Timing; -- const UCHAR *HiTVTextTiming; -- const UCHAR *YPbPr750pTiming; -- const UCHAR *YPbPr525pTiming; -- const UCHAR *YPbPr525iTiming; -- const UCHAR *HiTVGroup3Data; -- const UCHAR *HiTVGroup3Simu; -- const UCHAR *HiTVGroup3Text; -- const UCHAR *Ren525pGroup3; -- const UCHAR *Ren750pGroup3; -- const UCHAR *ScreenOffset; -- UCHAR DRAMTypeDefinition; -- UCHAR I2CDefinition; -- UCHAR CR97; -- -- const XGI330_LCDCapStruct *LCDCapList; -- -- XGI_TimingHStruct TimingH; -- XGI_TimingVStruct TimingV; -- -- const XGI_StStruct *SModeIDTable; -- const XGI_StandTableStruct *StandTable; -- const XGI_ExtStruct *EModeIDTable; -- const XGI_Ext2Struct *RefIndex; -- /* XGINew_CRT1TableStruct *CRT1Table; */ -- const XGI_CRT1TableStruct *XGINEWUB_CRT1Table; -- const XGI_VCLKDataStruct *VCLKData; -- const XGI_VBVCLKDataStruct *VBVCLKData; -- const XGI_StResInfoStruct *StResInfo; -- const XGI_ModeResInfoStruct *ModeResInfo; --}; /* _VB_DEVICE_INFO */ -- --#define _VB_STRUCT_ --#endif /* _VB_STRUCT_ */ -+/* Copyright (C) 2003-2006 by XGI Technology, Taiwan. -+ * -+ * All Rights Reserved. -+ * -+ * Permission is hereby granted, free of charge, to any person obtaining -+ * a copy of this software and associated documentation files (the -+ * "Software"), to deal in the Software without restriction, including -+ * without limitation on the rights to use, copy, modify, merge, -+ * publish, distribute, sublicense, and/or sell copies of the Software, -+ * and to permit persons to whom the Software is furnished to do so, -+ * subject to the following conditions: -+ * -+ * The above copyright notice and this permission notice (including the -+ * next paragraph) shall be included in all copies or substantial -+ * portions of the Software. -+ * -+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -+ * NON-INFRINGEMENT. IN NO EVENT SHALL XGI AND/OR -+ * ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -+ * DEALINGS IN THE SOFTWARE. -+ */ -+ -+ -+#ifndef _VB_STRUCT_ -+#define _VB_STRUCT_ -+ -+ -+typedef struct _XGI_PanelDelayTblStruct -+{ -+ UCHAR timer[2]; -+} XGI_PanelDelayTblStruct; -+ -+typedef struct _XGI_LCDDataStruct -+{ -+ USHORT RVBHCMAX; -+ USHORT RVBHCFACT; -+ USHORT VGAHT; -+ USHORT VGAVT; -+ USHORT LCDHT; -+ USHORT LCDVT; -+} XGI_LCDDataStruct; -+ -+ -+typedef struct _XGI_LVDSCRT1HDataStruct -+{ -+ UCHAR Reg[8]; -+} XGI_LVDSCRT1HDataStruct; -+typedef struct _XGI_LVDSCRT1VDataStruct -+{ -+ UCHAR Reg[7]; -+} XGI_LVDSCRT1VDataStruct; -+ -+ -+typedef struct _XGI_TVDataStruct -+{ -+ USHORT RVBHCMAX; -+ USHORT RVBHCFACT; -+ USHORT VGAHT; -+ USHORT VGAVT; -+ USHORT TVHDE; -+ USHORT TVVDE; -+ USHORT RVBHRS; -+ UCHAR FlickerMode; -+ USHORT HALFRVBHRS; -+ UCHAR RY1COE; -+ UCHAR RY2COE; -+ UCHAR RY3COE; -+ UCHAR RY4COE; -+} XGI_TVDataStruct; -+ -+typedef struct _XGI_LVDSDataStruct -+{ -+ USHORT VGAHT; -+ USHORT VGAVT; -+ USHORT LCDHT; -+ USHORT LCDVT; -+} XGI_LVDSDataStruct; -+ -+typedef struct _XGI_LVDSDesStruct -+{ -+ USHORT LCDHDES; -+ USHORT LCDVDES; -+} XGI_LVDSDesStruct; -+ -+typedef struct _XGI_LVDSCRT1DataStruct -+{ -+ UCHAR CR[15]; -+} XGI_LVDSCRT1DataStruct; -+ -+/*add for LCDA*/ -+ -+ -+typedef struct _XGI_StStruct -+{ -+ UCHAR St_ModeID; -+ USHORT St_ModeFlag; -+ UCHAR St_StTableIndex; -+ UCHAR St_CRT2CRTC; -+ UCHAR St_CRT2CRTC2; -+ UCHAR St_ResInfo; -+ UCHAR VB_StTVFlickerIndex; -+ UCHAR VB_StTVEdgeIndex; -+ UCHAR VB_StTVYFilterIndex; -+} XGI_StStruct; -+ -+typedef struct _XGI_StandTableStruct -+{ -+ UCHAR CRT_COLS; -+ UCHAR ROWS; -+ UCHAR CHAR_HEIGHT; -+ USHORT CRT_LEN; -+ UCHAR SR[4]; -+ UCHAR MISC; -+ UCHAR CRTC[0x19]; -+ UCHAR ATTR[0x14]; -+ UCHAR GRC[9]; -+} XGI_StandTableStruct; -+ -+typedef struct _XGI_ExtStruct -+{ -+ UCHAR Ext_ModeID; -+ USHORT Ext_ModeFlag; -+ USHORT Ext_ModeInfo; -+ USHORT Ext_Point; -+ USHORT Ext_VESAID; -+ UCHAR Ext_VESAMEMSize; -+ UCHAR Ext_RESINFO; -+ UCHAR VB_ExtTVFlickerIndex; -+ UCHAR VB_ExtTVEdgeIndex; -+ UCHAR VB_ExtTVYFilterIndex; -+ UCHAR REFindex; -+} XGI_ExtStruct; -+ -+typedef struct _XGI_Ext2Struct -+{ -+ USHORT Ext_InfoFlag; -+ UCHAR Ext_CRT1CRTC; -+ UCHAR Ext_CRTVCLK; -+ UCHAR Ext_CRT2CRTC; -+ UCHAR Ext_CRT2CRTC2; -+ UCHAR ModeID; -+ USHORT XRes; -+ USHORT YRes; -+ /* USHORT ROM_OFFSET; */ -+} XGI_Ext2Struct; -+ -+ -+typedef struct _XGI_MCLKDataStruct -+{ -+ UCHAR SR28,SR29,SR2A; -+ USHORT CLOCK; -+} XGI_MCLKDataStruct; -+ -+typedef struct _XGI_ECLKDataStruct -+{ -+ UCHAR SR2E,SR2F,SR30; -+ USHORT CLOCK; -+} XGI_ECLKDataStruct; -+ -+typedef struct _XGI_VCLKDataStruct -+{ -+ UCHAR SR2B,SR2C; -+ USHORT CLOCK; -+} XGI_VCLKDataStruct; -+ -+typedef struct _XGI_VBVCLKDataStruct -+{ -+ UCHAR Part4_A,Part4_B; -+ USHORT CLOCK; -+} XGI_VBVCLKDataStruct; -+ -+typedef struct _XGI_StResInfoStruct -+{ -+ USHORT HTotal; -+ USHORT VTotal; -+} XGI_StResInfoStruct; -+ -+typedef struct _XGI_ModeResInfoStruct -+{ -+ USHORT HTotal; -+ USHORT VTotal; -+ UCHAR XChar; -+ UCHAR YChar; -+} XGI_ModeResInfoStruct; -+ -+typedef struct _XGI_LCDNBDesStruct -+{ -+ UCHAR NB[12]; -+} XGI_LCDNBDesStruct; -+ /*add for new UNIVGABIOS*/ -+typedef struct _XGI_LCDDesStruct -+{ -+ USHORT LCDHDES; -+ USHORT LCDHRS; -+ USHORT LCDVDES; -+ USHORT LCDVRS; -+} XGI_LCDDesStruct; -+ -+typedef struct _XGI_LCDDataTablStruct -+{ -+ UCHAR PANELID; -+ USHORT MASK; -+ USHORT CAP; -+ USHORT DATAPTR; -+} XGI_LCDDataTablStruct; -+ -+typedef struct _XGI_TVTablDataStruct -+{ -+ USHORT MASK; -+ USHORT CAP; -+ USHORT DATAPTR; -+} XGI_TVDataTablStruct; -+ -+typedef struct _XGI330_LCDDesDataStruct -+{ -+ USHORT LCDHDES; -+ USHORT LCDHRS; -+ USHORT LCDVDES; -+ USHORT LCDVRS; -+} XGI330_LCDDataDesStruct; -+ -+ -+typedef struct _XGI330_LVDSDataStruct -+{ -+ USHORT VGAHT; -+ USHORT VGAVT; -+ USHORT LCDHT; -+ USHORT LCDVT; -+} XGI330_LVDSDataStruct; -+ -+typedef struct _XGI330_LCDDesDataStruct2 -+{ -+ USHORT LCDHDES; -+ USHORT LCDHRS; -+ USHORT LCDVDES; -+ USHORT LCDVRS; -+ USHORT LCDHSync; -+ USHORT LCDVSync; -+} XGI330_LCDDataDesStruct2; -+ -+typedef struct _XGI330_LCDDataStruct -+{ -+ USHORT RVBHCMAX; -+ USHORT RVBHCFACT; -+ USHORT VGAHT; -+ USHORT VGAVT; -+ USHORT LCDHT; -+ USHORT LCDVT; -+} XGI330_LCDDataStruct; -+ -+ -+typedef struct _XGI330_TVDataStruct -+{ -+ USHORT RVBHCMAX; -+ USHORT RVBHCFACT; -+ USHORT VGAHT; -+ USHORT VGAVT; -+ USHORT TVHDE; -+ USHORT TVVDE; -+ USHORT RVBHRS; -+ UCHAR FlickerMode; -+ USHORT HALFRVBHRS; -+} XGI330_TVDataStruct; -+ -+typedef struct _XGI330_LCDDataTablStruct -+{ -+ UCHAR PANELID; -+ USHORT MASK; -+ USHORT CAP; -+ USHORT DATAPTR; -+} XGI330_LCDDataTablStruct; -+ -+typedef struct _XGI330_TVDataTablStruct -+{ -+ USHORT MASK; -+ USHORT CAP; -+ USHORT DATAPTR; -+} XGI330_TVDataTablStruct; -+ -+ -+typedef struct _XGI330_CHTVDataStruct -+{ -+ USHORT VGAHT; -+ USHORT VGAVT; -+ USHORT LCDHT; -+ USHORT LCDVT; -+} XGI330_CHTVDataStruct; -+ -+typedef struct _XGI_TimingHStruct -+{ -+ UCHAR data[8]; -+} XGI_TimingHStruct; -+ -+typedef struct _XGI_TimingVStruct -+{ -+ UCHAR data[7]; -+} XGI_TimingVStruct; -+ -+/* Jong 10/04/2007; merge code */ -+typedef struct _XGI_CH7007TV_TimingHStruct -+{ -+ UCHAR data[10]; -+} XGI_CH7007TV_TimingHStruct; -+ -+/* Jong 10/04/2007; merge code */ -+typedef struct _XGI_CH7007TV_TimingVStruct -+{ -+ UCHAR data[10]; -+} XGI_CH7007TV_TimingVStruct; -+ -+/* Jong 10/04/2007; merge code */ -+typedef struct _XGI_XG21CRT1Struct -+{ -+ UCHAR ModeID,CR02,CR03,CR15,CR16; -+} XGI_XG21CRT1Struct; -+ -+typedef struct _XGI330_CHTVRegDataStruct -+{ -+ UCHAR Reg[16]; -+} XGI330_CHTVRegDataStruct; -+ -+typedef struct _XGI330_LCDCapStruct -+{ -+ UCHAR LCD_ID; -+ USHORT LCD_Capability; -+ UCHAR LCD_SetFlag; -+ UCHAR LCD_DelayCompensation; -+ UCHAR LCD_HSyncWidth; -+ UCHAR LCD_VSyncWidth; -+ UCHAR LCD_VCLK; -+ UCHAR LCDA_VCLKData1; -+ UCHAR LCDA_VCLKData2; -+ UCHAR LCUCHAR_VCLKData1; -+ UCHAR LCUCHAR_VCLKData2; -+ UCHAR PSC_S1; -+ UCHAR PSC_S2; -+ UCHAR PSC_S3; -+ UCHAR PSC_S4; -+ UCHAR PSC_S5; -+ UCHAR PWD_2B; -+ UCHAR PWD_2C; -+ UCHAR PWD_2D; -+ UCHAR PWD_2E; -+ UCHAR PWD_2F; -+ UCHAR Spectrum_31; -+ UCHAR Spectrum_32; -+ UCHAR Spectrum_33; -+ UCHAR Spectrum_34; -+} XGI330_LCDCapStruct; -+ -+/* Jong 10/04/2007; merge code */ -+typedef struct _XGI21_LVDSCapStruct -+{ -+ USHORT LVDS_Capability; -+ USHORT LVDSHT; -+ USHORT LVDSVT; -+ USHORT LVDSHDE; -+ USHORT LVDSVDE; -+ USHORT LVDSHFP; -+ USHORT LVDSVFP; -+ USHORT LVDSHSYNC; -+ USHORT LVDSVSYNC; -+ UCHAR VCLKData1; -+ UCHAR VCLKData2; -+ UCHAR PSC_S1; -+ UCHAR PSC_S2; -+ UCHAR PSC_S3; -+ UCHAR PSC_S4; -+ UCHAR PSC_S5; -+} XGI21_LVDSCapStruct; -+ -+typedef struct _XGI_CRT1TableStruct -+{ -+ UCHAR CR[15]; -+} XGI_CRT1TableStruct; -+ -+ -+typedef struct _XGI330_VCLKDataStruct -+{ -+ UCHAR SR2B,SR2C; -+ USHORT CLOCK; -+} XGI330_VCLKDataStruct; -+ -+typedef struct _XGI301C_Tap4TimingStruct -+{ -+ USHORT DE; -+ UCHAR Reg[64]; /* C0-FF */ -+} XGI301C_Tap4TimingStruct; -+ -+typedef struct _XGI_New_StandTableStruct -+{ -+ UCHAR CRT_COLS; -+ UCHAR ROWS; -+ UCHAR CHAR_HEIGHT; -+ USHORT CRT_LEN; -+ UCHAR SR[4]; -+ UCHAR MISC; -+ UCHAR CRTC[0x19]; -+ UCHAR ATTR[0x14]; -+ UCHAR GRC[9]; -+} XGI_New_StandTableStruct; -+ -+typedef UCHAR DRAM8Type[8]; -+typedef UCHAR DRAM4Type[4]; -+typedef UCHAR DRAM32Type[32]; -+typedef UCHAR DRAM2Type[2]; -+ -+typedef struct _VB_DEVICE_INFO VB_DEVICE_INFO,*PVB_DEVICE_INFO; -+ -+#define AGP_REG_SIZE 12 -+#define CR40_SIZE 24 -+#define CR6B_SIZE 8 -+#define CR6E_SIZE 8 -+#define CR6F_SIZE 8 -+#define CR89_SIZE 8 -+#define SR15_SIZE 4 -+#define MCLK_SIZE 8 -+#define ECLK_SIZE 8 -+ -+struct _VB_DEVICE_INFO -+{ -+ BOOLEAN ISXPDOS; -+ USHORT P3c4,P3d4,P3c0,P3ce,P3c2,P3cc; -+ USHORT P3ca,P3c6,P3c7,P3c8,P3c9,P3da; -+ USHORT Part0Port,Part1Port,Part2Port; -+ USHORT Part3Port,Part4Port,Part5Port; -+ USHORT RVBHCFACT,RVBHCMAX,RVBHRS; -+ USHORT VGAVT,VGAHT,VGAVDE,VGAHDE; -+ USHORT VT,HT,VDE,HDE; -+ USHORT LCDHRS,LCDVRS,LCDHDES,LCDVDES; -+ -+ USHORT ModeType; -+ USHORT IF_DEF_TRUMPION,IF_DEF_DSTN; -+ USHORT IF_DEF_CRT2Monitor,IF_DEF_VideoCapture; -+ USHORT IF_DEF_CH7017,IF_DEF_LCDA,IF_DEF_YPbPr,IF_DEF_ScaleLCD,IF_DEF_OEMUtil,IF_DEF_PWD; -+ USHORT IF_DEF_ExpLink; -+ USHORT IF_DEF_CH7005,IF_DEF_HiVision; /* Jong 10/08/2007; merge code */ -+ USHORT IF_DEF_CH7007; /* Jong 10/04/2007; merge code */ -+ USHORT LCDResInfo,LCDTypeInfo, VBType;/*301b*/ -+ USHORT VBInfo,TVInfo,LCDInfo; -+ USHORT VBExtInfo;/*301lv*/ -+ USHORT SetFlag; -+ USHORT NewFlickerMode; -+ USHORT SelectCRT2Rate; -+ -+ PUCHAR ROMAddr; -+ PUCHAR FBAddr; -+ USHORT BaseAddr; -+ XGIIOADDRESS RelIO; -+ -+ DRAM4Type CR6B[CR6B_SIZE]; -+ -+ UCHAR XG45CR6E[CR6E_SIZE]; -+ UCHAR XG45CR6F[CR6F_SIZE]; -+ DRAM4Type CR6E[CR6E_SIZE]; -+ DRAM32Type CR6F[CR6F_SIZE]; -+ DRAM2Type CR89[CR89_SIZE]; -+ -+ DRAM8Type SR15[SR15_SIZE]; /* pointer : point to array */ -+ DRAM8Type CR40[CR40_SIZE]; -+ UCHAR SoftSetting; -+ UCHAR OutputSelect; -+ -+ USHORT IF_DEF_LVDS; /* Jong 10/05/2007; merge code */ -+ -+ const USHORT *pRGBSenseData; -+ const USHORT *pRGBSenseData2; /*301b*/ -+ const USHORT *pVideoSenseData; -+ const USHORT *pVideoSenseData2; -+ const USHORT *pYCSenseData; -+ const USHORT *pYCSenseData2; -+ -+ UCHAR SR07; -+ UCHAR CR49[2]; -+ UCHAR SR1F; -+ UCHAR AGPReg[AGP_REG_SIZE]; -+ UCHAR SR16[4]; -+ UCHAR SR21; -+ UCHAR SR22; -+ UCHAR SR23; -+ UCHAR SR24; -+ UCHAR SR25[2]; -+ UCHAR SR31; -+ UCHAR SR32; -+ UCHAR SR33; -+ -+ /* Jong 10/05/2007; merge code */ -+ UCHAR *pSR36; -+ UCHAR CRCF; -+ UCHAR *pCRD0; -+ UCHAR *pCRDE; -+ UCHAR *pCR8F; -+ UCHAR *pSR40; -+ UCHAR *pSR41; -+ UCHAR *pDVOSetting; -+ UCHAR *pCR2E; -+ UCHAR *pCR2F; -+ UCHAR *pCR46; -+ UCHAR *pCR47; -+ -+ UCHAR CRT2Data_1_2; -+ UCHAR CRT2Data_4_D; -+ UCHAR CRT2Data_4_E; -+ UCHAR CRT2Data_4_10; -+ XGI_MCLKDataStruct MCLKData[MCLK_SIZE]; -+ XGI_ECLKDataStruct ECLKData[ECLK_SIZE]; -+ -+ const UCHAR *XGI_TVDelayList; -+ const UCHAR *XGI_TVDelayList2; -+ const UCHAR *CHTVVCLKUNTSC; -+ const UCHAR *CHTVVCLKONTSC; -+ const UCHAR *CHTVVCLKUPAL; -+ const UCHAR *CHTVVCLKOPAL; -+ const UCHAR *NTSCTiming; -+ const UCHAR *PALTiming; -+ const UCHAR *HiTVExtTiming; -+ const UCHAR *HiTVSt1Timing; -+ const UCHAR *HiTVSt2Timing; -+ const UCHAR *HiTVTextTiming; -+ const UCHAR *YPbPr750pTiming; -+ const UCHAR *YPbPr525pTiming; -+ const UCHAR *YPbPr525iTiming; -+ const UCHAR *HiTVGroup3Data; -+ const UCHAR *HiTVGroup3Simu; -+ const UCHAR *HiTVGroup3Text; -+ const UCHAR *Ren525pGroup3; -+ const UCHAR *Ren750pGroup3; -+ const UCHAR *ScreenOffset; -+ UCHAR DRAMTypeDefinition; -+ UCHAR I2CDefinition; -+ UCHAR CR97; -+ -+ const XGI330_LCDCapStruct *LCDCapList; -+ XGI21_LVDSCapStruct *XG21_LVDSCapList; /* Jong 10/05/2007; merge code */ -+ -+ XGI_TimingHStruct TimingH; -+ XGI_TimingVStruct TimingV; -+ -+ const XGI_StStruct *SModeIDTable; -+ const XGI_StandTableStruct *StandTable; -+ const XGI_ExtStruct *EModeIDTable; -+ const XGI_Ext2Struct *RefIndex; -+ /* XGINew_CRT1TableStruct *CRT1Table; */ -+ const XGI_CRT1TableStruct *XGINEWUB_CRT1Table; -+ const XGI_VCLKDataStruct *VCLKData; -+ const XGI_VBVCLKDataStruct *VBVCLKData; -+ const XGI_StResInfoStruct *StResInfo; -+ const XGI_ModeResInfoStruct *ModeResInfo; -+ XGI_XG21CRT1Struct *UpdateCRT1; /* Jong 10/05/2007; merge code */ -+}; /* _VB_DEVICE_INFO */ -+ -+/* Jong 10/04/2007; merge code */ -+typedef struct -+{ -+ USHORT Horizontal_ACTIVE; -+ USHORT Horizontal_FP; -+ USHORT Horizontal_SYNC; -+ USHORT Horizontal_BP; -+ USHORT Vertical_ACTIVE; -+ USHORT Vertical_FP; -+ USHORT Vertical_SYNC; -+ USHORT Vertical_BP; -+ double DCLK; -+ UCHAR FrameRate; -+ UCHAR Interlace; -+ USHORT Margin; -+} TimingInfo; -+ -+#define _VB_STRUCT_ -+#endif /* _VB_STRUCT_ */ -diff --git a/src/vb_table.h b/src/vb_table.h -index 2b31679..b26427c 100644 ---- a/src/vb_table.h -+++ b/src/vb_table.h -@@ -84,7 +84,36 @@ static const DRAM8Type XGI340_CR41[CR40_SIZE] = { - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} /* 23 CRC5 */ - }; - --static const DRAM4Type XGI340_CR6B[CR6B_SIZE]={ -+/* Jong 10/04/2007; merge code */ -+UCHAR XGI27_cr41[24][8]= -+{ -+{0x20,0x60,0x60,0x00,0x00,0x00,0x00,0x00},/* 0 CR41 */ -+{0x04,0x44,0x84,0x00,0x00,0x00,0x00,0x00},/* 1 CR8A */ -+{0x04,0x40,0x84,0x00,0x00,0x00,0x00,0x00},/* 2 CR8B */ -+{0xb5,0x03,0xa4,0x00,0x00,0x00,0x00,0x00},/* 3 CR40[7],CR99[2:0],CR45[3:0]*/ -+{0xf0,0xf5,0xf0,0x00,0x00,0x00,0x00,0x00},/* 4 CR59 */ -+{0xa4,0x1C,0x24,0x00,0x00,0x00,0x00,0x00},/* 5 CR68 */ -+{0x77,0x77,0x44,0x00,0x00,0x00,0x00,0x00},/* 6 CR69 */ -+{0x77,0x77,0x44,0x00,0x00,0x00,0x00,0x00},/* 7 CR6A */ -+{0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00},/* 8 CR6D */ -+{0x55,0x55,0x55,0x00,0x00,0x00,0x00,0x00},/* 9 CR80 */ -+{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/* 10 CR81 */ -+{0x48,0xa8,0x48,0x00,0x00,0x00,0x00,0x00},/* 11 CR82 */ -+{0x77,0x88,0x77,0x00,0x00,0x00,0x00,0x00},/* 12 CR85 */ -+{0x88,0x88,0x88,0x00,0x00,0x00,0x00,0x00},/* 13 CR86 */ -+{0x44,0x32,0x44,0x00,0x00,0x00,0x00,0x00},/* 14 CR90 */ -+{0x44,0x33,0x44,0x00,0x00,0x00,0x00,0x00},/* 15 CR91 */ -+{0x07,0x07,0x07,0x00,0x00,0x00,0x00,0x00},/* 16 CR92 */ -+{0x44,0x63,0x44,0x00,0x00,0x00,0x00,0x00},/* 17 CR93 */ -+{0x0A,0x14,0x0A,0x00,0x00,0x00,0x00,0x00},/* 18 CR94 */ -+{0x0C,0x0B,0x0C,0x00,0x00,0x00,0x00,0x00},/* 19 CR95 */ -+{0x05,0x22,0x05,0x00,0x00,0x00,0x00,0x00},/* 20 CR96 */ -+{0xf0,0xf0,0xf0,0x00,0x00,0x00,0x00,0x00},/* 21 CRC3 */ -+{0x03,0x00,0x02,0x00,0x00,0x00,0x00,0x00},/* 22 CRC4 */ -+{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}/* 23 CRC5 */ -+}; -+ -+UCHAR XGI340_CR6B[8][4]={ - {0xaa, 0xaa, 0xaa, 0xaa}, - {0xaa, 0xaa, 0xaa, 0xaa}, - {0xaa, 0xaa, 0xaa, 0xaa}, -@@ -275,7 +304,32 @@ static const XGI_ExtStruct XGI330_EModeIDTable[]= - {0xff,0x0000,0x0000,0x0000,0x0000,0x00,0x00,0x00,0x00,0x00,0x00} - }; - --static const XGI_StandTableStruct XGI330_StandTable[]= -+/* Jong 10/04/2007; merge code */ -+TimingInfo SpecialModeTiming[]= -+{ -+ {1280,110, 40,220, 720, 5, 5, 20, -+ 74.18, 60, 0, 0 -+ }, -+ {1440, 80,152,232, 900, 1, 3, 28, -+ 106.472, 60, 0, 0 -+ }, -+ {1920, 88, 44,148, 540, 2, 5, 15, -+ 74.11, 60, 1, 0 -+ }, -+ {1920,120,208,328, 1080, 1, 3, 34, -+ 172.8, 60, 0, 0 -+ }, -+ {1920,128,208,336, 1200, 1, 3, 38, -+ 193.16, 60, 0, 0 -+ }, -+ { 0, 0, 0, 0, 0, 0, 0, 0, -+ 0, 0, 0, 0 -+ } -+}; -+ -+ -+ -+XGI_StandTableStruct XGI330_StandTable[]= - { - /* MD_0_200 */ - { -@@ -719,6 +773,27 @@ static const XGI_TimingHStruct XGI_TimingH[]= - static const XGI_TimingVStruct XGI_TimingV[]= - {{{0x00,0x00,0x00,0x00,0x00,0x00,0x00}}}; - -+/* Jong 10/04/2007; merge code */ -+XGI_XG21CRT1Struct XGI_UpdateCRT1Table[]= -+{ -+ {0x01,0x27,0x91,0x8f,0xc0}, /* 00 */ -+ {0x03,0x4f,0x83,0x8f,0xc0}, /* 01 */ -+ {0x05,0x27,0x91,0x8f,0xc0}, /* 02 */ -+ {0x06,0x4f,0x83,0x8f,0xc0}, /* 03 */ -+ {0x07,0x4f,0x83,0x8f,0xc0}, /* 04 */ -+ {0x0d,0x27,0x91,0x8f,0xc0}, /* 05 */ -+ {0x0e,0x4f,0x83,0x8f,0xc0}, /* 06 */ -+ {0x0f,0x4f,0x83,0x5d,0xc0}, /* 07 */ -+ {0x10,0x4f,0x83,0x5d,0xc0}, /* 08 */ -+ {0x11,0x4f,0x83,0xdf,0x0c}, /* 09 */ -+ {0x12,0x4f,0x83,0xdf,0x0c}, /* 10 */ -+ {0x13,0x4f,0x83,0x8f,0xc0}, /* 11 */ -+ {0x2e,0x4f,0x83,0xdf,0x0c}, /* 12 */ -+ {0x2e,0x4f,0x87,0xdf,0xc0}, /* 13 */ -+ {0x2f,0x4f,0x83,0x8f,0xc0}, /* 14 */ -+ {0x50,0x27,0x91,0xdf,0x0c}, /* 15 */ -+ {0x59,0x27,0x91,0x8f,0xc0} /* 16 */ -+}; - - static const XGI_CRT1TableStruct XGI_CRT1Table[]= - { -@@ -2542,6 +2617,74 @@ static const XGI_LVDSCRT1VDataStruct XGI_LVDSCRT11280x1024_2_Vx75[]= - {{ 0x28,0x5A,0x13,0x87,0xFF,0x29,0xA9 }} /* ; 05 (x1024) */ - }; - -+/* Jong 10/04/2007; merge code */ -+XGI_LVDSCRT1DataStruct XGI_CHTVCRT1UNTSC[]= -+{ -+ {{0x64,0x4f,0x88,0x56,0x9f,0x56,0x3e, -+ 0xe8,0x84,0x8f,0x57,0x20,0x00,0x01,0x00 }}, -+ {{0x64,0x4f,0x88,0x56,0x9f,0x56,0x3e, -+ 0xd0,0x82,0x5d,0x57,0x00,0x00,0x01,0x00 }}, -+ {{0x64,0x4f,0x88,0x56,0x9f,0x56,0x3e, -+ 0xe8,0x84,0x8f,0x57,0x20,0x00,0x01,0x00 }}, -+ {{0x64,0x4f,0x88,0x56,0x9f,0x56,0x3e, -+ 0xd0,0x82,0x5d,0x57,0x00,0x00,0x01,0x00 }}, -+ {{0x5d,0x4f,0x81,0x53,0x9c,0x56,0xba, -+ 0x18,0x84,0xdf,0x57,0x00,0x00,0x01,0x00 }}, -+ {{0x80,0x63,0x84,0x6c,0x17,0xec,0xf0, -+ 0x90,0x8c,0x57,0xed,0x20,0x00,0x06,0x01 }} -+}; -+ -+/* Jong 10/04/2007; merge code */ -+XGI_LVDSCRT1DataStruct XGI_CHTVCRT1ONTSC[]= -+{ -+ {{0x64,0x4f,0x88,0x5a,0x9f,0x0b,0x3e, -+ 0xc0,0x84,0x8f,0x0c,0x20,0x00,0x01,0x00 }}, -+ {{0x64,0x4f,0x88,0x5a,0x9f,0x0b,0x3e, -+ 0xb0,0x8d,0x5d,0x0c,0x00,0x00,0x01,0x00 }}, -+ {{0x64,0x4f,0x88,0x5a,0x9f,0x0b,0x3e, -+ 0xc0,0x84,0x8f,0x0c,0x20,0x00,0x01,0x00 }}, -+ {{0x64,0x4f,0x88,0x5a,0x9f,0x0b,0x3e, -+ 0xb0,0x8d,0x5d,0x0c,0x00,0x00,0x01,0x00 }}, -+ {{0x5d,0x4f,0x81,0x56,0x9c,0x0b,0x3e, -+ 0xe8,0x84,0xdf,0x0c,0x00,0x00,0x01,0x00 }}, -+ {{0x7d,0x63,0x81,0x6a,0x16,0xba,0xf0, -+ 0x7f,0x86,0x57,0xbb,0x00,0x00,0x06,0x01 }} -+}; -+ -+/* Jong 10/04/2007; merge code */ -+XGI_LVDSCRT1DataStruct XGI_CHTVCRT1UPAL[]= -+{ -+ {{0x79,0x4f,0x9d,0x5a,0x90,0x6f,0x3e, -+ 0xf8,0x83,0x8f,0x70,0x20,0x00,0x05,0x00 }}, -+ {{0x79,0x4f,0x9d,0x5a,0x90,0x6f,0x3e, -+ 0xde,0x81,0x5d,0x70,0x00,0x00,0x05,0x00 }}, -+ {{0x79,0x4f,0x9d,0x5a,0x90,0x6f,0x3e, -+ 0xf8,0x83,0x8f,0x70,0x20,0x00,0x05,0x00 }}, -+ {{0x79,0x4f,0x9d,0x5a,0x90,0x6f,0x3e, -+ 0xde,0x81,0x5d,0x70,0x00,0x00,0x05,0x00 }}, -+ {{0x64,0x4f,0x88,0x55,0x80,0xec,0xba, -+ 0x50,0x84,0xdf,0xed,0x00,0x00,0x05,0x00 }}, -+ {{0x70,0x63,0x94,0x68,0x8d,0x42,0xf1, -+ 0xc8,0x8c,0x57,0xe9,0x20,0x00,0x05,0x01 }} -+}; -+ -+/* Jong 10/04/2007; merge code */ -+XGI_LVDSCRT1DataStruct XGI_CHTVCRT1OPAL[]= -+{ -+ {{0x79,0x4f,0x9d,0x5a,0x90,0x6f,0x3e, -+ 0xf0,0x83,0x8f,0x70,0x20,0x00,0x05,0x00 }}, -+ {{0x79,0x4f,0x9d,0x5a,0x90,0x6f,0x3e, -+ 0xde,0x81,0x5d,0x70,0x00,0x00,0x05,0x00 }}, -+ {{0x79,0x4f,0x9d,0x5a,0x90,0x6f,0x3e, -+ 0xf0,0x83,0x8f,0x70,0x20,0x00,0x05,0x00 }}, -+ {{0x79,0x4f,0x9d,0x5a,0x90,0x6f,0x3e, -+ 0xde,0x81,0x5d,0x70,0x00,0x00,0x05,0x00 }}, -+ {{0x64,0x4f,0x88,0x55,0x80,0x6f,0xba, -+ 0x20,0x83,0xdf,0x70,0x00,0x00,0x05,0x00 }}, -+ {{0x73,0x63,0x97,0x69,0x8e,0xec,0xf0, -+ 0x90,0x8c,0x57,0xed,0x20,0x00,0x05,0x01 }} -+}; -+ - /*add for new UNIVGABIOS*/ - static const XGI330_LCDDataTablStruct XGI_LCDDataTable[]= - { -@@ -2787,7 +2930,37 @@ static const XGI330_LCDCapStruct XGI_LCDCapList[]= - 0x30, 0x10, 0x5A, 0x10, 0x10, 0x0A, 0xC0, 0x28, 0x10} - }; - --static const XGI_Ext2Struct XGI330_RefIndex[]= -+/* Jong 10/04/2007; merge code */ -+XGI21_LVDSCapStruct XGI21_LCDCapList[]= -+{ -+ {DisableLCD24bpp + LCDPolarity, -+ 2160,1250,1600,1200, 64, 1, 192, 3, -+ 0x70,0x24,0x20,0x04,0x0A,0x02,0xC8 -+ }, -+ {DisableLCD24bpp + LCDPolarity, -+ 1688,1066,1280,1024, 48, 1, 112, 3, -+ 0x70,0x44,0x20,0x04,0x0A,0x02,0xC8 -+ }, -+ {DisableLCD24bpp + LCDPolarity + (LCDPolarity << 8), -+ 1344, 806,1024, 768, 24, 3, 136, 6, -+ 0x6C,0x65,0x20,0x04,0x0A,0x02,0xC8 -+ }, -+ {DisableLCD24bpp + LCDPolarity, -+ 1056, 628, 800, 600, 40, 1, 128, 4, -+ 0x42,0xE2,0x20,0x14,0x0A,0x02,0x00 -+ }, -+ {DisableLCD24bpp + LCDPolarity, -+ 928, 525, 800, 480, 40, 13, 48, 3, -+ 0x52,0xC5,0x20,0x14,0x0A,0x02,0x00 -+ }, -+ {DisableLCD24bpp + LCDPolarity + (LCDPolarity << 8), -+ 800, 525, 640, 480, 16, 10, 96, 2, -+ 0x1B,0xE1,0x20,0x04,0x0A,0x02,0xC8 -+ } -+ -+}; -+ -+XGI_Ext2Struct XGI330_RefIndex[]= - { - {Support32Bpp + SupportAllCRT2 + SyncPN, RES320x200, VCLK25_175, 0x00,0x10,0x59, 320, 200},/* 00 */ - {Support32Bpp + SupportAllCRT2 + SyncPN, RES320x200, VCLK25_175, 0x00,0x10,0x00, 320, 400},/* 01 */ -@@ -2888,6 +3061,18 @@ static const XGI_MCLKDataStruct XGI340New_MCLKData[MCLK_SIZE]= - { 0x29,0x01,0x81,300} - }; - -+/* Jong 10/04/2007; merge code */ -+static const XGI_MCLKDataStruct XGI27New_MCLKData[]= -+{ -+ { 0x5c,0x23,0x01,166}, -+ { 0x19,0x02,0x01,124}, -+ { 0x7C,0x08,0x80,200}, -+ { 0x79,0x06,0x80,250}, -+ { 0x29,0x01,0x81,300}, -+ { 0x5c,0x23,0x01,166}, -+ { 0x5c,0x23,0x01,166}, -+ { 0x5c,0x23,0x01,166} -+}; - - static const UCHAR XGI330_ScreenOffset[]={ 0x14,0x19,0x20,0x28,0x32,0x40,0x50,0x64,0x78,0x80,0x2d,0x35,0x57,0x48 }; - -@@ -2930,6 +3115,20 @@ static const XGI_ModeResInfoStruct XGI330_ModeResInfo[]= - static const UCHAR XGI330_OutputSelect = 0x40; - static const UCHAR XGI330_SoftSetting = 0x30; - static const UCHAR XGI330_SR07 = 0x18; -+static const UCHAR XG21_DVOSetting = 0x00 ; -+static const UCHAR XG21_CR2E = 0x00 ; -+static const UCHAR XG21_CR2F = 0x00 ; -+static const UCHAR XG21_CR46 = 0x00 ; -+static const UCHAR XG21_CR47 = 0x00 ; -+ -+UCHAR XG27_CR97 = 0xC1 ; -+UCHAR XG27_SR36 = 0x30 ; -+UCHAR XG27_CR8F = 0x09 ; -+UCHAR XG27_CRD0[] = {0,0,0,0,0,0,0,0x82,0x00,0x66,0x01,0x00} ; -+UCHAR XG27_CRDE[] = {0,0} ; -+UCHAR XG27_SR40 = 0x04 ; -+UCHAR XG27_SR41 = 0x00 ; -+ - - static const UCHAR XGI330_CR49[2] = { 0xaa, 0x88 }; - static const UCHAR XGI330_SR1F = 0x00; -diff --git a/src/vgatypes.h b/src/vgatypes.h -index dda97fe..f26ea57 100644 ---- a/src/vgatypes.h -+++ b/src/vgatypes.h -@@ -150,6 +150,7 @@ typedef enum _XGI_CHIP_TYPE { - XG45, - XG20 = 48, - XG21, -+ XG27, - MAX_XGI_CHIP - } XGI_CHIP_TYPE; - #endif -@@ -279,6 +280,25 @@ struct _XGI_HW_DEVICE_INFO - - UCHAR szVBIOSVer[VBIOS_VER_MAX_LENGTH]; - -+ /* Jong 09/18/2007; patch to GIT */ -+ /* Jong 08/17/2007; Alan's code to support custom mode of modeline */ -+ /* --------------------------------------------------------------------- */ -+ UCHAR BPP; -+ UCHAR Frequency; -+ USHORT Horizontal_ACTIVE; -+ USHORT Vertical_ACTIVE; -+ UCHAR SpecialMode; -+ -+ UCHAR SpecifyTiming; /* Set 1 for specifying timing*/ -+ USHORT Horizontal_FP; /* Alan 08/10/2007; HSyncStart - HDisplay */ -+ USHORT Horizontal_BP; /* Alan 08/10/2007; HTotal - HSyncEnd */ -+ USHORT Horizontal_SYNC; /* Alan 08/10/2007; HSyncEnd - HSyncStart */ -+ USHORT Vertical_FP; -+ USHORT Vertical_BP; -+ USHORT Vertical_SYNC; -+ double DCLK; -+ UCHAR Interlace; /* Alan 08/10/2007; specify interlace or not */ -+ /* --------------------------------------------------------------------- */ - }; - #endif - -diff --git a/src/xgi.h b/src/xgi.h -index 0f016d2..9a89bd7 100644 ---- a/src/xgi.h -+++ b/src/xgi.h -@@ -1,890 +1,904 @@ --/* -- * Main global data and definitions -- * -- * Copyright (C) 2001-2004 by Thomas Winischhofer, Vienna, Austria -- * -- * Redistribution and use in source and binary forms, with or without -- * modification, are permitted provided that the following conditions -- * are met: -- * 1) Redistributions of source code must retain the above copyright -- * notice, this list of conditions and the following disclaimer. -- * 2) Redistributions in binary form must reproduce the above copyright -- * notice, this list of conditions and the following disclaimer in the -- * documentation and/or other materials provided with the distribution. -- * 3) The name of the author may not be used to endorse or promote products -- * derived from this software without specific prior written permission. -- * -- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESSED OR -- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, -- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -- * -- * Authors: Thomas Winischhofer -- * others (old code base) -- * -- */ --#ifndef _XGI_H_ --#define _XGI_H_ -- --/*************** -- --#define DEBUG2 --#define DEBUG --#define DEBUG1 --#define DEBUG3 --#define DEBUG4 --#define DEBUG5 --*****************/ -- -- --#ifdef DEBUG --#define PDEBUG(p) p --#else --#define PDEBUG(p) --#endif -- --#ifdef DEBUG1 --#define PDEBUG1(p) p --#else --#define PDEBUG1(p) --#endif -- --#ifdef DEBUG2 --#define PDEBUG2(p) p --#else --#define PDEBUG2(p) --#endif -- --#ifdef DEBUG3 --#define PDEBUG3(p) p --#else --#define PDEBUG3(p) --#endif -- --#ifdef DEBUG4 --#define PDEBUG4(p) p --#else --#define PDEBUG4(p) --#endif -- --#ifdef DEBUG5 --#define PDEBUG5(p) p --#else --#define PDEBUG5(p) --#endif -- --/* Always unlock the registers (should be set!) */ --#define UNLOCK_ALWAYS -- --#undef XGI_CP -- --#ifdef XSERVER_LIBPCIACCESS --#include --#else --#include "xf86Pci.h" --#endif --#include "xf86Cursor.h" --#include "xf86xv.h" --#include "compiler.h" --#include "xaa.h" --#include "vgaHW.h" --#include "vbe.h" -- --#ifdef XORG_VERSION_CURRENT --#include "xorgVersion.h" --#endif -- --#include "xgi_pci.h" --#include "osdef.h" --#include "vgatypes.h" --#include "vb_struct.h" -- --#ifdef XF86DRI --#define XGINEWDRI --#undef XGINEWDRI2 --#if XF86_VERSION_CURRENT >= XF86_VERSION_NUMERIC(4,4,99,99,0) /* Adapt this when the time has come */ --#define XGINEWDRI2 --#endif --#include "xf86drm.h" --#include "sarea.h" --#define _XF86DRI_SERVER_ --#include "xf86dri.h" --#include "dri.h" --#include "GL/glxint.h" --#include "xgi_dri.h" --#endif -- --#ifdef XSERVER_LIBPCIACCESS --#define VENDOR_ID(p) (p)->vendor_id --#define DEVICE_ID(p) (p)->device_id --#define SUBSYS_ID(p) (p)->subdevice_id --#define CHIP_REVISION(p) (p)->revision --#else --#define VENDOR_ID(p) (p)->vendor --#define DEVICE_ID(p) (p)->chipType --#define SUBSYS_ID(p) (p)->subsysCard --#define CHIP_REVISION(p) (p)->chipRev --#endif -- --#if 1 --#define XGIDUALHEAD /* Include Dual Head code */ --#endif -- --#if 1 --#define XGIMERGED /* Include Merged-FB mode */ --#endif -- --#ifdef XGIMERGED --#if 1 --#define XGIXINERAMA /* Include Pseudo-Xinerama for MergedFB mode */ --#define XGI_XINERAMA_MAJOR_VERSION 1 --#define XGI_XINERAMA_MINOR_VERSION 1 --#endif --#endif -- --#if 1 --#define XGIGAMMA /* Include code for gamma correction */ --#endif -- --#if 1 /* Include code for color hardware cursors */ --#define XGI_ARGB_CURSOR --#endif -- --#if 0 /* Include YPbPr support on VB */ --#define ENABLE_YPBPR --#endif -- --#ifdef XGIMERGED --#ifdef XGIXINERAMA --#define NEED_REPLIES /* ? */ --#define EXTENSION_PROC_ARGS void * --#include "extnsionst.h" /* required */ --#include /* required */ --#endif --#endif -- --#if 1 --#define XGIVRAMQ /* Use VRAM queue mode on 315 series */ --#endif -- --#undef XGI315DRI /* define this if dri is adapted for 315/330 series */ -- --#ifndef PCI_VENDOR_XGI --#define PCI_VENDOR_XGI 0x18CA --#endif --#ifndef PCI_CHIP_XGIXG40 --#define PCI_CHIP_XGIXG40 0x0040 --#endif --#ifndef PCI_CHIP_XGIXG20 --#define PCI_CHIP_XGIXG20 0x0020 --#endif -- --#define CONFIG_DRM_XGI -- --#define XGI_NAME "XGI" --#define XGI_DRIVER_NAME "xgi" --#define XGI_CURRENT_VERSION ((PACKAGE_VERSION_MAJOR << 16) | \ -- (PACKAGE_VERSION_MINOR << 8) | \ -- PACKAGE_VERSION_PATCHLEVEL) -- --/* pXGI->Flags (old series only) */ --#define SYNCDRAM 0x00000001 --#define RAMFLAG 0x00000002 --#define ESS137xPRESENT 0x00000004 --#define SECRETFLAG 0x00000008 --#define A6326REVAB 0x00000010 --#define MMIOMODE 0x00010000 --#define LFBQMODE 0x00020000 --#define AGPQMODE 0x00040000 --#define UMA 0x80000000 -- --#define BIOS_BASE 0xC0000 --#define BIOS_SIZE 0x10000 -- --#define SR_BUFFER_SIZE 5 --#define CR_BUFFER_SIZE 5 -- --#define XGI_VBFlagsVersion 1 -- --/* VBFlags - if anything is changed here, increase VBFlagsVersion! */ --#define CRT2_DEFAULT 0x00000001 --#define CRT2_LCD 0x00000002 /* Never change the order of the CRT2_XXX entries */ --#define CRT2_TV 0x00000004 --#define CRT2_VGA 0x00000008 --#define TV_NTSC 0x00000010 --#define TV_PAL 0x00000020 --#define TV_HIVISION 0x00000040 --#define TV_YPBPR 0x00000080 --#define TV_AVIDEO 0x00000100 --#define TV_SVIDEO 0x00000200 --#define TV_SCART 0x00000400 --#define VB_CONEXANT 0x00000800 /* 661 series only */ --#define VB_TRUMPION VB_CONEXANT /* 300 series only */ --#define TV_PALM 0x00001000 --#define TV_PALN 0x00002000 --#define TV_NTSCJ 0x00001000 --#define VB_302ELV 0x00004000 --#define TV_CHSCART 0x00008000 --#define TV_CHYPBPR525I 0x00010000 --#define CRT1_VGA 0x00000000 --#define CRT1_LCDA 0x00020000 --#define VGA2_CONNECTED 0x00040000 --#define DISPTYPE_CRT1 0x00080000 /* CRT1 connected and used */ -- --#define SINGLE_MODE 0x20000000 /* CRT1 or CRT2; determined by DISPTYPE_CRTx */ --#define MIRROR_MODE 0x40000000 /* CRT1 + CRT2 identical (mirror mode) */ --#define DUALVIEW_MODE 0x80000000 /* CRT1 + CRT2 independent (dual head mode) */ -- --/* Aliases: */ --#define CRT2_ENABLE (CRT2_LCD | CRT2_TV | CRT2_VGA) --#define TV_STANDARD (TV_NTSC | TV_PAL | TV_PALM | TV_PALN | TV_NTSCJ) --#define TV_INTERFACE (TV_AVIDEO|TV_SVIDEO|TV_SCART|TV_HIVISION|TV_YPBPR) -- --/* Only if TV_YPBPR is set: */ --#define TV_YPBPR525I TV_NTSC --#define TV_YPBPR525P TV_PAL --#define TV_YPBPR750P TV_PALM --#define TV_YPBPR1080I TV_PALN --#define TV_YPBPRALL (TV_YPBPR525I | TV_YPBPR525P | TV_YPBPR750P | TV_YPBPR1080I) -- --#define TV_YPBPR43LB TV_CHSCART --#define TV_YPBPR43 TV_CHYPBPR525I --#define TV_YPBPR169 (TV_CHSCART | TV_CHYPBPR525I) --#define TV_YPBPRAR (TV_CHSCART | TV_CHYPBPR525I) -- -- --#define DISPTYPE_DISP2 CRT2_ENABLE --#define DISPTYPE_DISP1 DISPTYPE_CRT1 --#define VB_DISPMODE_SINGLE SINGLE_MODE /* alias */ --#define VB_DISPMODE_MIRROR MIRROR_MODE /* alias */ --#define VB_DISPMODE_DUAL DUALVIEW_MODE /* alias */ --#define DISPLAY_MODE (SINGLE_MODE | MIRROR_MODE | DUALVIEW_MODE) -- --/* PresetMode argument */ --#define XGI_MODE_SIMU 0 --#define XGI_MODE_CRT1 1 --#define XGI_MODE_CRT2 2 -- --/* pXGI->MiscFlags */ --#define MISC_CRT1OVERLAY 0x00000001 /* Current display mode supports overlay */ --#define MISC_PANELLINKSCALER 0x00000002 /* Panel link is currently scaling */ --#define MISC_CRT1OVERLAYGAMMA 0x00000004 /* Current display mode supports overlay gamma corr on CRT1 */ --#define MISC_TVNTSC1024 0x00000008 /* Current display mode is TV NTSC/PALM/YPBPR525I 1024x768 */ -- -- --#define HW_DEVICE_EXTENSION XGI_HW_DEVICE_INFO -- --#define BITMASK(h,l) (((unsigned)(1U << ((h)-(l)+1))-1)<<(l)) --#define GENMASK(mask) BITMASK(1?mask,0?mask) -- --typedef unsigned long ULong; --typedef unsigned short UShort; --typedef unsigned char UChar; -- -- --/* ChipFlags */ --/* Use only lower 16 bit for chip id! (xgictrl) */ --#define XGICF_LARGEOVERLAY 0x00000001 --#define XGICF_Is651 0x00000002 --#define XGICF_IsM650 0x00000004 --#define XGICF_IsM652 0x00000008 --#define XGICF_IsM653 0x00000010 --#define XGICF_Is652 0x00000020 --#define XGICF_Is65x (XGICF_Is651|XGICF_IsM650|XGICF_IsM652|XGICF_IsM653|XGICF_Is652) --#define XGICF_IsM661 0x00000100 /* M661FX */ --#define XGICF_IsM741 0x00000200 --#define XGICF_IsM760 0x00000400 --#define XGICF_IsM661M 0x00000800 /* M661MX */ --#define XGICF_IsM66x (XGICF_IsM661 | XGICF_IsM741 | XGICF_IsM760 | XGICF_IsM661M) --#define XGICF_315Core 0x00010000 /* 3D: Real 315 */ --#define XGICF_Real256ECore 0x00020000 /* 3D: Similar to 315 core, no T&L? (65x, 661, 740, 741) */ --#define XGICF_XabreCore 0x00040000 /* 3D: Real Xabre */ --#define XGICF_Ultra256Core 0x00080000 /* 3D: Similar to Xabre, no T&L?, no P:Shader? (660, 760) */ --#define XGICF_UseLCDA 0x01000000 --#define XGICF_760UMA 0x10000000 /* 760: UMA active */ --#define XGICF_CRT2HWCKaputt 0x20000000 /* CRT2 Mono HWCursor engine buggy */ --#define XGICF_Glamour3 0x40000000 --#define XGICF_Integrated 0x80000000 -- --/* Direct Xv-API */ --#define XGI_SD_IS300SERIES 0x00000001 --#define XGI_SD_IS315SERIES 0x00000002 --#define XGI_SD_IS330SERIES 0x00000004 --#define XGI_SD_SUPPORTPALMN 0x00000008 /* tv chip supports pal-m, pal-n */ --#define XGI_SD_SUPPORT2OVL 0x00000010 /* set = 2 overlays, clear = support SWITCHCRT xv prop */ --#define XGI_SD_SUPPORTTVPOS 0x00000020 /* supports changing tv position */ --#define XGI_SD_ISDUALHEAD 0x00000040 /* Driver is in dual head mode */ --#define XGI_SD_ISMERGEDFB 0x00000080 /* Driver is in merged fb mode */ --#define XGI_SD_ISDHSECONDHEAD 0x00000100 /* Dual head: This is CRT1 (=second head) */ --#define XGI_SD_ISDHXINERAMA 0x00000200 /* Dual head: We are running Xinerama */ --#define XGI_SD_VBHASSCART 0x00000400 /* videobridge has SCART instead of VGA2 */ --#define XGI_SD_ISDEPTH8 0x00000800 /* Depth is 8, no independent gamma correction */ --#define XGI_SD_ENABLED 0x00002000 /* xgictrl is enabled (by option) */ --#define XGI_SD_PSEUDOXINERAMA 0x00004000 /* pseudo xinerama is active */ --#define XGI_SD_SUPPORTLCDA 0x00008000 /* Support LCD Channel A */ --#define XGI_SD_SUPPORTNTSCJ 0x00010000 /* tv chip supports ntsc-j */ --#define XGI_SD_ADDLSUPFLAG 0x00020000 /* 1 = the following flags are valid */ --#define XGI_SD_SUPPORTVGA2 0x00040000 /* CRT2=VGA supported */ --#define XGI_SD_SUPPORTSCART 0x00080000 /* CRT2=SCART supported */ --#define XGI_SD_SUPPORTOVERSCAN 0x00100000 /* Overscan flag supported */ --#define XGI_SD_SUPPORTXVGAMMA1 0x00200000 /* Xv Gamma correction for CRT1 supported */ --#define XGI_SD_SUPPORTTV 0x00400000 /* CRT2=TV supported */ --#define XGI_SD_SUPPORTYPBPR 0x00800000 /* CRT2=YPbPr (525i, 525p, 750p, 1080i) is supported */ --#define XGI_SD_SUPPORTHIVISION 0x01000000 /* CRT2=HiVision is supported */ --#define XGI_SD_SUPPORTYPBPRAR 0x02000000 /* YPbPr aspect ratio is supported */ --#define XGI_SD_SUPPORTSCALE 0x04000000 /* Scaling of LCD panel supported */ --#define XGI_SD_SUPPORTCENTER 0x08000000 /* If scaling supported: Centering of screen [NOT] supported (TMDS only) */ -- --#define XGI_DIRECTKEY 0x03145792 -- --/* XGICtrl: Check mode for CRT2 */ --#define XGI_CF2_LCD 0x01 --#define XGI_CF2_TV 0x02 --#define XGI_CF2_VGA2 0x04 --#define XGI_CF2_TVPAL 0x08 --#define XGI_CF2_TVNTSC 0x10 /* + NTSC-J */ --#define XGI_CF2_TVPALM 0x20 --#define XGI_CF2_TVPALN 0x40 --#define XGI_CF2_CRT1LCDA 0x80 --#define XGI_CF2_TYPEMASK (XGI_CF2_LCD | XGI_CF2_TV | XGI_CF2_VGA2 | XGI_CF2_CRT1LCDA) --#define XGI_CF2_TVSPECIAL (XGI_CF2_LCD | XGI_CF2_TV) --#define XGI_CF2_TVSPECMASK (XGI_CF2_TVPAL | XGI_CF2_TVNTSC | XGI_CF2_TVPALM | XGI_CF2_TVPALN) --#define XGI_CF2_TVHIVISION XGI_CF2_TVPAL --#define XGI_CF2_TVYPBPR525I XGI_CF2_TVNTSC --#define XGI_CF2_TVYPBPR525P (XGI_CF2_TVPAL | XGI_CF2_TVNTSC) --#define XGI_CF2_TVYPBPR750P XGI_CF2_TVPALM --#define XGI_CF2_TVYPBPR1080I (XGI_CF2_TVPALM | XGI_CF2_TVPAL) -- --/* AGP stuff for DRI */ --#define AGP_PAGE_SIZE 4096 --#define AGP_PAGES 2048 /* Default: 2048 pages @ 4096 = 8MB */ --/* 300 */ --#define AGP_CMDBUF_PAGES 256 --#define AGP_CMDBUF_SIZE (AGP_PAGE_SIZE * AGP_CMDBUF_PAGES) --/* 315/330 */ --#define AGP_VTXBUF_PAGES 512 --#define AGP_VTXBUF_SIZE (AGP_PAGE_SIZE * AGP_VTXBUF_PAGES) -- --#define VOLARI_CQSIZE (1024*1024) --#define VOLARI_CQSIZEXG20 (128*1024) --#define VOLARI_CURSOR_SHAPE_SIZE (64*64*4) -- --/* For backup of register contents */ --typedef struct { -- unsigned char xgiRegs3C4[0x50]; -- unsigned char xgiRegs3D4[0x90]; -- unsigned char xgiRegs3C2; -- unsigned char xgiCapt[0x60]; -- unsigned char xgiVid[0x50]; -- unsigned char VBPart1[0x50]; -- unsigned char VBPart2[0x100]; -- unsigned char VBPart3[0x50]; -- unsigned char VBPart4[0x50]; -- unsigned short ch70xx[64]; -- unsigned long xgiMMIO85C0; -- unsigned char xgi6326tv[0x46]; -- unsigned long xgiRegsPCI50, xgiRegsPCIA0; --} XGIRegRec, *XGIRegPtr; -- -- --/* XGIFBLayout is mainly there because of DGA. It holds the -- * current layout parameters needed for acceleration and other -- * stuff. When switching mode using DGA, these are set up -- * accordingly and not necessarily match pScrn's. Therefore, -- * driver modules should read these values instead of pScrn's. -- */ --typedef struct { -- int bitsPerPixel; /* = pScrn->bitsPerPixel */ -- int depth; /* = pScrn->depth */ -- int displayWidth; /* = pScrn->displayWidth */ -- DisplayModePtr mode; /* = pScrn->currentMode */ --} XGIFBLayout; -- --/* Dual head private entity structure */ --typedef struct { -- ScrnInfoPtr pScrn_1; -- ScrnInfoPtr pScrn_2; -- unsigned char * BIOS; -- VB_DEVICE_INFO *XGI_Pr; -- int CRT2ModeNo; /* Current display mode for CRT2 */ -- Bool CRT2ModeSet; /* CRT2 mode has been set */ -- unsigned char CRT2CR30, CRT2CR31, CRT2CR35, CRT2CR38; -- int refCount; -- -- /** -- * Number of entities -- * -- * \bug -- * This field is tested in one place, but it doesn't appear to ever be -- * set or modified. -- */ -- int lastInstance; -- -- Bool DisableDual; /* Emergency flag */ -- Bool ErrorAfterFirst; /* Emergency flag: Error after first init -> Abort second */ -- int maxUsedClock; /* Max used pixelclock on master head */ -- -- /** -- * Framebuffer addresses and sizes -- * -- * \bug -- * These 4 fields are set, but the stored values don't appear to be used. -- */ -- unsigned long masterFbAddress; -- unsigned long masterFbSize; -- unsigned long slaveFbAddress; -- unsigned long slaveFbSize; -- -- unsigned char * FbBase; /* VRAM linear address */ -- unsigned char * IOBase; /* MMIO linear address */ -- -- /** -- * Map / unmap queue counter. -- * -- * \bug -- * These vales are tested, set to zero, or decremented. However, I don't -- * see anywhere in the code where they are incremented. -- */ -- unsigned short MapCountIOBase; -- unsigned short MapCountFbBase; -- -- Bool forceUnmapIOBase; /* ignore counter and unmap */ -- Bool forceUnmapFbBase; /* ignore counter and unmap */ --#ifdef __alpha__ -- unsigned char * IOBaseDense; /* MMIO for Alpha platform */ -- unsigned short MapCountIOBaseDense; -- Bool forceUnmapIOBaseDense; /* ignore counter and unmap */ --#endif -- BOOLEAN CRT1gamma; -- -- /** -- * \bug This field is tested and set to \c NULL but never used. -- */ -- unsigned char *RenderAccelArray; -- unsigned char * FbBase1; -- unsigned long OnScreenSize1; -- --#ifdef XGI_CP -- XGI_CP_H_ENT --#endif --} XGIEntRec, *XGIEntPtr; -- --#define XGIPTR(p) ((XGIPtr)((p)->driverPrivate)) --#define XAAPTR(p) ((XAAInfoRecPtr)(XGIPTR(p)->AccelInfoPtr)) -- --#define ExtRegSize 0x40 -- -- --/* Relative merge position */ --typedef enum { -- xgiLeftOf, -- xgiRightOf, -- xgiAbove, -- xgiBelow, -- xgiClone --} XGIScrn2Rel; -- --typedef struct MonitorRange { -- float loH,hiH,loV,hiV ; --}MonitorRangeRec,*MonitorRangePtr ; -- --typedef struct { -- ScrnInfoPtr pScrn; /* -------------- DON'T INSERT ANYTHING HERE --------------- */ --#ifdef XSERVER_LIBPCIACCESS -- struct pci_device * PciInfo; --#else -- pciVideoPtr PciInfo; /* -------- OTHERWISE xgi_dri.so MUST BE RECOMPILED -------- */ -- PCITAG PciTag; --#endif -- EntityInfoPtr pEnt; -- int Chipset; -- int ChipRev; -- VB_DEVICE_INFO *XGI_Pr; /* For new mode switching code */ -- unsigned long FbAddress; /* VRAM physical address (in DHM: for each Fb!) */ -- unsigned long realFbAddress; /* For DHM/PCI mem mapping: store global FBAddress */ -- unsigned char * FbBase; /* VRAM virtual linear address */ -- CARD32 IOAddress; /* MMIO physical address */ -- unsigned char * IOBase; /* MMIO linear address */ -- IOADDRESS IODBase; /* Base of PIO memory area */ --#ifdef __alpha__ -- unsigned char * IOBaseDense; /* MMIO for Alpha platform */ --#endif -- XGIIOADDRESS RelIO; /* Relocated IO Ports baseaddress */ -- unsigned char * BIOS; -- int MemClock; -- int BusWidth; -- int MinClock; -- int MaxClock; -- int Flags; /* HW config flags */ -- long FbMapSize; /* Used for Mem Mapping - DON'T CHANGE THIS */ -- long availMem; /* Really available Fb mem (minus TQ, HWCursor) */ -- unsigned long maxxfbmem; /* limit fb memory X is to use to this (KB) */ -- unsigned long xgifbMem; /* heapstart of xgifb (if running) */ -- unsigned long dhmOffset; /* Offset to memory for each head (0 or ..) */ -- DGAModePtr DGAModes; -- int numDGAModes; -- Bool DGAactive; -- Bool NoAccel; -- Bool NoXvideo; -- Bool TurboQueue; -- int ForceCRT1Type; -- int ForceCRT2Type; -- int OptROMUsage; -- Bool ValidWidth; -- unsigned char myCR63; -- unsigned long VBFlags; /* Video bridge configuration */ -- unsigned long VBFlags_backup; /* Backup for SlaveMode-modes */ -- -- short scrnOffset; /* Screen pitch (data) */ -- short scrnPitch; /* Screen pitch (display; regarding interlace) */ -- unsigned long DstColor; -- int xcurrent; /* for temp use in accel */ -- int ycurrent; /* for temp use in accel */ -- int CommandReg; -- -- Bool HWCursor; -- CARD16 CursorSize; /* Size of HWCursor area (bytes) */ -- xf86CursorInfoPtr CursorInfoPtr; -- unsigned CursorOffset; -- -- /** -- * \bug This field is set to \c FALSE but never used. -- */ -- Bool DoColorExpand; -- -- XGIRegRec SavedReg; -- XGIRegRec ModeReg; -- XAAInfoRecPtr AccelInfoPtr; -- CloseScreenProcPtr CloseScreen; -- Bool (*ModeInit)(ScrnInfoPtr pScrn, DisplayModePtr mode); -- void (*XGISave)(ScrnInfoPtr pScrn, XGIRegPtr xgireg); -- void (*XGISave2)(ScrnInfoPtr pScrn, XGIRegPtr xgireg); -- void (*XGISave3)(ScrnInfoPtr pScrn, XGIRegPtr xgireg); -- void (*XGIRestore)(ScrnInfoPtr pScrn, XGIRegPtr xgireg); -- void (*XGIRestore2)(ScrnInfoPtr pScrn, XGIRegPtr xgireg); -- void (*XGIRestore3)(ScrnInfoPtr pScrn, XGIRegPtr xgireg); -- void (*LoadCRT2Palette)(ScrnInfoPtr pScrn, int numColors, -- int *indicies, LOCO *colors, VisualPtr pVisual); -- -- int cmdQueueLen; /* Current cmdQueueLength (for 2D and 3D) */ -- unsigned long cmdQueueLenMax; -- unsigned long cmdQueueLenMin; -- unsigned char *cmdQueueBase; -- int *cmdQueueLenPtr; /* Ptr to variable holding the current queue length */ -- unsigned int cmdQueueOffset; -- unsigned int cmdQueueSize; -- unsigned long cmdQueueSizeMask; -- -- /** -- * \bug This field is set but never used. -- */ -- unsigned int agpWantedPages; -- --#ifdef XF86DRI -- unsigned long agpHandle; -- unsigned long agpAddr; -- unsigned char *agpBase; -- unsigned int agpSize; -- unsigned long agpVtxBufAddr; /* 315 series */ -- unsigned char *agpVtxBufBase; -- unsigned int agpVtxBufSize; -- unsigned int agpVtxBufFree; -- xgiRegion agp; -- Bool irqEnabled; -- int irq; --#endif -- unsigned long DRIheapstart, DRIheapend; -- -- void (*RenderCallback)(ScrnInfoPtr); -- -- /** -- * \bug This field is tested and set to \c NULL but never used. -- */ -- unsigned char *RenderAccelArray; -- -- /** -- * \bug This field is to \c TRUE but never used. -- */ -- Bool doRender; -- -- int PerColorExpandBufferSize; -- int ColorExpandBufferNumber; -- unsigned char *ColorExpandBufferAddr[32]; -- int ColorExpandBufferScreenOffset[32]; -- -- /** -- * \bug This field is read but never initialized. -- */ -- int ImageWriteBufferSize; -- -- unsigned char *ImageWriteBufferAddr; -- -- int Rotate; -- -- /* ShadowFB support */ -- Bool ShadowFB; -- unsigned char *ShadowPtr; -- int ShadowPitch; -- -- /** -- * \bug This field is set but never used. -- */ -- Bool loadDRI; -- --#ifdef XF86DRI -- Bool directRenderingEnabled; -- DRIInfoPtr pDRIInfo; -- int drmSubFD; -- int numVisualConfigs; -- __GLXvisualConfig* pVisualConfigs; -- XGIConfigPrivPtr pVisualConfigsPriv; --#endif -- -- HW_DEVICE_EXTENSION xgi_HwDevExt; /* For new mode switching code */ -- XF86VideoAdaptorPtr adaptor; -- ScreenBlockHandlerProcPtr BlockHandler; -- -- /** -- * \bug This field is tested and used but never set. -- */ -- void (*VideoTimerCallback)(ScrnInfoPtr, Time); -- -- void (*ResetXv)(ScrnInfoPtr); -- void (*ResetXvGamma)(ScrnInfoPtr); -- -- OptionInfoPtr Options; -- -- /** -- * \bug This field is used but never initialized. -- */ -- unsigned char LCDon; -- Bool Blank; -- int CRT1off; /* 1=CRT1 off, 0=CRT1 on */ -- CARD16 LCDheight; /* Vertical resolution of LCD panel */ -- CARD16 LCDwidth; /* Horizontal resolution of LCD panel */ -- vbeInfoPtr pVbe; /* For VESA mode switching */ -- UCHAR ScratchSet[16]; -- MonitorRangeRec CRT1Range,CRT2Range; -- --#ifdef XGIDUALHEAD -- BOOL DualHeadMode; /* TRUE if we use dual head mode */ -- BOOL SecondHead; /* TRUE is this is the second head */ -- XGIEntPtr entityPrivate; /* Ptr to private entity (see above) */ --#endif -- XGIFBLayout CurrentLayout; /* Current framebuffer layout */ -- BOOL Primary; /* Display adapter is primary */ -- xf86Int10InfoPtr pInt; /* Our int10 */ -- -- /** -- * Use our own default modes? -- * -- * \bug This field is set but never used. -- */ -- Bool noInternalModes; -- -- int ForceTVType, SenseYPbPr; -- int NonDefaultPAL, NonDefaultNTSC; -- unsigned long ForceYPbPrType, ForceYPbPrAR; -- unsigned long lockcalls; /* Count unlock calls for debug */ -- -- Atom xvBrightness, xvContrast, xvColorKey, xvHue, xvSaturation; -- Atom xvAutopaintColorKey, xvSetDefaults, xvSwitchCRT; -- Atom xvDisableGfx, xvDisableGfxLR, xvTVXPosition, xvTVYPosition; -- Atom xvDisableColorkey, xvUseChromakey, xvChromaMin, xvChromaMax; -- Atom xvInsideChromakey, xvYUVChromakey; -- Atom xvGammaRed, xvGammaGreen, xvGammaBlue; --#ifdef XGI_CP -- XGI_CP_H --#endif -- unsigned long ChipFlags; -- unsigned long XGI_SD_Flags; -- int vb; -- BOOLEAN restorebyset; -- BOOLEAN nocrt2ddcdetection; -- BOOLEAN forcecrt2redetection; -- BOOLEAN CRT1gamma, CRT1gammaGiven, CRT2gamma, XvGamma, XvGammaGiven; -- int XvDefCon, XvDefBri, XvDefHue, XvDefSat; -- BOOLEAN XvDefDisableGfx, XvDefDisableGfxLR; -- BOOLEAN XvUseMemcpy; -- int XvGammaRed, XvGammaGreen, XvGammaBlue; -- CARD8 XvGammaRampRed[256], XvGammaRampGreen[256], XvGammaRampBlue[256]; -- BOOLEAN disablecolorkeycurrent; -- CARD32 colorKey; -- CARD32 MiscFlags; -- FBLinearPtr AccelLinearScratch; -- float zClearVal; -- unsigned long bClrColor, dwColor; -- int AllowHotkey; -- BOOLEAN enablexgictrl; -- short Video_MaxWidth, Video_MaxHeight; -- short scrnPitch2; -- unsigned long mmioSize; --#ifdef XGIMERGED -- Bool MergedFB, MergedFBAuto; -- XGIScrn2Rel CRT2Position; -- char * CRT2HSync; -- char * CRT2VRefresh; -- char * MetaModes; -- ScrnInfoPtr CRT2pScrn; -- DisplayModePtr CRT1Modes; -- DisplayModePtr CRT1CurrentMode; -- int CRT1frameX0; -- int CRT1frameY0; -- int CRT1frameX1; -- int CRT1frameY1; -- Bool CheckForCRT2; -- int MergedFBXDPI, MergedFBYDPI; --#ifdef XGIXINERAMA -- Bool UsexgiXinerama; -- Bool CRT2IsScrn0; -- ExtensionEntry *XineramaExtEntry; -- int xgiXineramaVX, xgiXineramaVY; -- Bool AtLeastOneNonClone; --#endif --#endif -- -- /* Added for 3D */ -- unsigned long cmdQueue_shareWP_only2D; -- unsigned long *pCQ_shareWritePort; -- void (*SetThreshold)(ScrnInfoPtr pScrn, DisplayModePtr mode, -- unsigned short *Low, unsigned short *High); -- -- XGI_DSReg SRList[ExtRegSize] ; -- XGI_DSReg CRList[ExtRegSize] ; -- -- /** -- * Total number of iterations to wait in \c Volari_Idle. -- */ -- unsigned int idle_wait_count; -- --//:::: for capture -- Bool v4l_videoin; -- int v4l_devnum; /* v4l device number, 0,1,2....*/ --//~:::: --} XGIRec, *XGIPtr; -- --#ifdef XGIDUALHEAD --# define IS_DUAL_HEAD(x) ((x)->DualHeadMode) --# define IS_SECOND_HEAD(x) ((x)->SecondHead) --# define ENTITY_PRIVATE(x) ((x)->entityPrivate) --#else --# define IS_DUAL_HEAD(x) FALSE --# define IS_SECOND_HEAD(x) FALSE --# define ENTITY_PRIVATE(x) NULL --#endif -- -- --#define SEQ_ADDRESS_PORT 0x0014 --#define MISC_OUTPUT_REG_WRITE_PORT 0x0012 --#define MISC_OUTPUT_REG_READ_PORT 0x001C --#define GRAPH_ADDRESS_PORT 0x001E --#define VIDEO_SUBSYSTEM_ENABLE_PORT 0x0013 --#define CRTC_ADDRESS_PORT_COLOR 0x0024 --#define PCI_COMMAND 0x04 -- --#define SDMPTR(x) ((XGIMergedDisplayModePtr)(x->currentMode->Private)) --#define CDMPTR ((XGIMergedDisplayModePtr)(pXGI->CurrentLayout.mode->Private)) -- --#define BOUND(test,low,hi) { \ -- if(test < low) test = low; \ -- if(test > hi) test = hi; } -- --#define REBOUND(low,hi,test) { \ -- if(test < low) { \ -- hi += test-low; \ -- low = test; } \ -- if(test > hi) { \ -- low += test-hi; \ -- hi = test; } } -- --typedef struct _MergedDisplayModeRec { -- DisplayModePtr CRT1; -- DisplayModePtr CRT2; -- XGIScrn2Rel CRT2Position; --} XGIMergedDisplayModeRec, *XGIMergedDisplayModePtr; -- -- --typedef struct _region { -- int x0,x1,y0,y1; --} region; -- -- --extern void xgiOptions(ScrnInfoPtr pScrn); --extern const OptionInfoRec * XGIAvailableOptions(int chipid, int busid); --extern void XGISetup(ScrnInfoPtr pScrn); --extern void XGIVGAPreInit(ScrnInfoPtr pScrn); --extern Bool XGIAccelInit(ScreenPtr pScreen); --extern Bool XGIHWCursorInit(ScreenPtr pScreen); --extern Bool XGIDGAInit(ScreenPtr pScreen); --extern void XGIInitVideo(ScreenPtr pScreen); -- --extern int XGI_GetCHTVlumabandwidthcvbs(ScrnInfoPtr pScrn); -- --int XG40Mclk(XGIPtr pXGI); -- --void XGINew_InitVBIOSData(PXGI_HW_DEVICE_INFO HwDeviceExtension, PVB_DEVICE_INFO pVBInfo) ; --int compute_vclk(int Clock, int *out_n, int *out_dn, int *out_div, -- int *out_sbit, int *out_scale); -- --void XGI_WaitBeginRetrace(XGIIOADDRESS RelIO); --void XGI_WaitEndRetrace(XGIIOADDRESS RelIO); -- --/* 2005/11/21 added by jjtseng */ --#define DelayS(sec) usleep((sec)*1000000) --#define DelayMS(millisec) usleep((millisec)*1000) --#define DelayUS(microsec) usleep((microsec)) --/*~jjtseng 2005/11/21 */ -- --Bool Volari_AccelInit(ScreenPtr pScreen) ; --/* void XGI_UnLockCRT2(PXGI_HW_DEVICE_INFO,USHORT BaseAddr); */ --/* void XGI_LockCRT2(PXGI_HW_DEVICE_INFO,USHORT BaseAddr); */ --/* void XGI_DisableBridge(PXGI_HW_DEVICE_INFO,USHORT BaseAddr); */ --/* void XGI_EnableBridge(PXGI_HW_DEVICE_INFO,USHORT BaseAddr); */ --#endif -- --extern USHORT XGI_GetModeID(ULONG VBFlags, int HDisplay, int VDisplay, -- int Depth, int LCDwith, int LCDheight); -- --extern BOOLEAN XGI_SearchModeID(const XGI_StStruct *SModeIDTable, -- const XGI_ExtStruct *EModeIDTable, unsigned char VGAINFO, -- USHORT *ModeNo, USHORT *ModeIdIndex); -- --extern UCHAR XGI_GetModePtr(const XGI_StStruct *SModeIDTable, -- unsigned ModeType, USHORT ModeNo, USHORT ModeIdIndex); -- --extern void XGI_SetReg(XGIIOADDRESS port, USHORT index, USHORT data); --extern void XGI_SetRegByte(XGIIOADDRESS port, USHORT data); --extern void XGI_SetRegShort(XGIIOADDRESS port, USHORT data); --extern void XGI_SetRegLong(XGIIOADDRESS port, ULONG data); --extern UCHAR XGI_GetReg(XGIIOADDRESS port, USHORT index); --extern UCHAR XGI_GetRegByte(XGIIOADDRESS port); --extern USHORT XGI_GetRegShort(XGIIOADDRESS port); --extern ULONG XGI_GetRegLong(XGIIOADDRESS port); --extern void XGI_SetRegANDOR(XGIIOADDRESS Port, USHORT Index, USHORT DataAND, -- USHORT DataOR); --extern void XGI_SetRegAND(XGIIOADDRESS Port, USHORT Index, USHORT DataAND); --extern void XGI_SetRegOR(XGIIOADDRESS Port, USHORT Index, USHORT DataOR); -- --extern void XGI_WriteDAC(XGIIOADDRESS dac_data, unsigned shift, -- unsigned ordering, uint8_t red, uint8_t green, uint8_t blue); -- --#ifdef DEBUG --void XGIDumpRegs(ScrnInfoPtr pScrn); -- --/** -- * Write value to the PC's 0x80 debug port. -- * -- * \bug -- * I'm pretty sure the debug 0x80 only exists on PCs. Should this routine -- * be a no-op on non-x86 and non-x86-64 architectures? -- */ --#define Newdebugcode(dbg_code) outb(0x80, dbg_code) --#else --#define Newdebugcode(dbg_code) --#endif -+/* -+ * Main global data and definitions -+ * -+ * Copyright (C) 2001-2004 by Thomas Winischhofer, Vienna, Austria -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * 1) Redistributions of source code must retain the above copyright -+ * notice, this list of conditions and the following disclaimer. -+ * 2) Redistributions in binary form must reproduce the above copyright -+ * notice, this list of conditions and the following disclaimer in the -+ * documentation and/or other materials provided with the distribution. -+ * 3) The name of the author may not be used to endorse or promote products -+ * derived from this software without specific prior written permission. -+ * -+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESSED OR -+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, -+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -+ * -+ * Authors: Thomas Winischhofer -+ * others (old code base) -+ * -+ */ -+#ifndef _XGI_H_ -+#define _XGI_H_ -+ -+/*************** -+#define DEBUG2 -+#define DEBUG -+#define DEBUG1 -+#define DEBUG3 -+#define DEBUG4 -+#define DEBUG5 -+*****************/ -+ -+ -+#ifdef DEBUG -+#define PDEBUG(p) p -+#else -+#define PDEBUG(p) -+#endif -+ -+#ifdef DEBUG1 -+#define PDEBUG1(p) p -+#else -+#define PDEBUG1(p) -+#endif -+ -+#ifdef DEBUG2 -+#define PDEBUG2(p) p -+#else -+#define PDEBUG2(p) -+#endif -+ -+#ifdef DEBUG3 -+#define PDEBUG3(p) p -+#else -+#define PDEBUG3(p) -+#endif -+ -+#ifdef DEBUG4 -+#define PDEBUG4(p) p -+#else -+#define PDEBUG4(p) -+#endif -+ -+#ifdef DEBUG5 -+#define PDEBUG5(p) p -+#else -+#define PDEBUG5(p) -+#endif -+ -+/* Always unlock the registers (should be set!) */ -+#define UNLOCK_ALWAYS -+ -+#undef XGI_CP -+ -+#ifdef XSERVER_LIBPCIACCESS -+#include -+#else -+#include "xf86Pci.h" -+#endif -+#include "xf86Cursor.h" -+#include "xf86xv.h" -+#include "compiler.h" -+#include "xaa.h" -+#include "vgaHW.h" -+#include "vbe.h" -+ -+#ifdef XORG_VERSION_CURRENT -+#include "xorgVersion.h" -+#endif -+ -+#include "xgi_pci.h" -+#include "osdef.h" -+#include "vgatypes.h" -+#include "vb_struct.h" -+ -+#ifdef XF86DRI -+#define XGINEWDRI -+#undef XGINEWDRI2 -+#if XF86_VERSION_CURRENT >= XF86_VERSION_NUMERIC(4,4,99,99,0) /* Adapt this when the time has come */ -+#define XGINEWDRI2 -+#endif -+#include "xf86drm.h" -+#include "sarea.h" -+#define _XF86DRI_SERVER_ -+#include "xf86dri.h" -+#include "dri.h" -+#include "GL/glxint.h" -+#include "xgi_dri.h" -+#endif -+ -+#ifdef XSERVER_LIBPCIACCESS -+#define VENDOR_ID(p) (p)->vendor_id -+#define DEVICE_ID(p) (p)->device_id -+#define SUBSYS_ID(p) (p)->subdevice_id -+#define CHIP_REVISION(p) (p)->revision -+#else -+#define VENDOR_ID(p) (p)->vendor -+#define DEVICE_ID(p) (p)->chipType -+#define SUBSYS_ID(p) (p)->subsysCard -+#define CHIP_REVISION(p) (p)->chipRev -+#endif -+ -+#if 1 -+#define XGIDUALHEAD /* Include Dual Head code */ -+#endif -+ -+#if 1 -+#define XGIMERGED /* Include Merged-FB mode */ -+#endif -+ -+#ifdef XGIMERGED -+#if 1 -+#define XGIXINERAMA /* Include Pseudo-Xinerama for MergedFB mode */ -+#define XGI_XINERAMA_MAJOR_VERSION 1 -+#define XGI_XINERAMA_MINOR_VERSION 1 -+#endif -+#endif -+ -+#if 1 -+#define XGIGAMMA /* Include code for gamma correction */ -+#endif -+ -+/* Jong 09/28/2007; disable this because it causes cursor drawing incorrectly */ -+#if 0 /* Include code for color hardware cursors */ -+#define XGI_ARGB_CURSOR -+#endif -+ -+#if 0 /* Include YPbPr support on VB */ -+#define ENABLE_YPBPR -+#endif -+ -+#ifdef XGIMERGED -+#ifdef XGIXINERAMA -+#define NEED_REPLIES /* ? */ -+#define EXTENSION_PROC_ARGS void * -+#include "extnsionst.h" /* required */ -+#include /* required */ -+#endif -+#endif -+ -+#if 1 -+#define XGIVRAMQ /* Use VRAM queue mode on 315 series */ -+#endif -+ -+#undef XGI315DRI /* define this if dri is adapted for 315/330 series */ -+ -+#ifndef PCI_VENDOR_XGI -+#define PCI_VENDOR_XGI 0x18CA -+#endif -+#ifndef PCI_CHIP_XGIXG40 -+#define PCI_CHIP_XGIXG40 0x0040 -+#endif -+#ifndef PCI_CHIP_XGIXG20 -+#define PCI_CHIP_XGIXG20 0x0020 -+#endif -+ -+/* Jong 09/18/2007; patch to GIT */ -+#ifndef PCI_CHIP_XGIXG27 -+#define PCI_CHIP_XGIXG27 0x0027 -+#endif -+ -+/* Jong 01/07/2008; support New XG21 */ -+#ifndef PCI_CHIP_XGIXG21 -+#define PCI_CHIP_XGIXG21 0x0021 -+#endif -+ -+#define CONFIG_DRM_XGI -+ -+#define XGI_NAME "XGI" -+#define XGI_DRIVER_NAME "xgi" -+#define XGI_CURRENT_VERSION ((PACKAGE_VERSION_MAJOR << 16) | \ -+ (PACKAGE_VERSION_MINOR << 8) | \ -+ PACKAGE_VERSION_PATCHLEVEL) -+ -+/* pXGI->Flags (old series only) */ -+#define SYNCDRAM 0x00000001 -+#define RAMFLAG 0x00000002 -+#define ESS137xPRESENT 0x00000004 -+#define SECRETFLAG 0x00000008 -+#define A6326REVAB 0x00000010 -+#define MMIOMODE 0x00010000 -+#define LFBQMODE 0x00020000 -+#define AGPQMODE 0x00040000 -+#define UMA 0x80000000 -+ -+#define BIOS_BASE 0xC0000 -+#define BIOS_SIZE 0x10000 -+ -+#define SR_BUFFER_SIZE 5 -+#define CR_BUFFER_SIZE 5 -+ -+#define XGI_VBFlagsVersion 1 -+ -+/* VBFlags - if anything is changed here, increase VBFlagsVersion! */ -+#define CRT2_DEFAULT 0x00000001 -+#define CRT2_LCD 0x00000002 /* Never change the order of the CRT2_XXX entries */ -+#define CRT2_TV 0x00000004 -+#define CRT2_VGA 0x00000008 -+#define TV_NTSC 0x00000010 -+#define TV_PAL 0x00000020 -+#define TV_HIVISION 0x00000040 -+#define TV_YPBPR 0x00000080 -+#define TV_AVIDEO 0x00000100 -+#define TV_SVIDEO 0x00000200 -+#define TV_SCART 0x00000400 -+#define VB_CONEXANT 0x00000800 /* 661 series only */ -+#define VB_TRUMPION VB_CONEXANT /* 300 series only */ -+#define TV_PALM 0x00001000 -+#define TV_PALN 0x00002000 -+#define TV_NTSCJ 0x00001000 -+#define VB_302ELV 0x00004000 -+#define TV_CHSCART 0x00008000 -+#define TV_CHYPBPR525I 0x00010000 -+#define CRT1_VGA 0x00000000 -+#define CRT1_LCDA 0x00020000 -+#define VGA2_CONNECTED 0x00040000 -+#define DISPTYPE_CRT1 0x00080000 /* CRT1 connected and used */ -+ -+#define SINGLE_MODE 0x20000000 /* CRT1 or CRT2; determined by DISPTYPE_CRTx */ -+#define MIRROR_MODE 0x40000000 /* CRT1 + CRT2 identical (mirror mode) */ -+#define DUALVIEW_MODE 0x80000000 /* CRT1 + CRT2 independent (dual head mode) */ -+ -+/* Aliases: */ -+#define CRT2_ENABLE (CRT2_LCD | CRT2_TV | CRT2_VGA) -+#define TV_STANDARD (TV_NTSC | TV_PAL | TV_PALM | TV_PALN | TV_NTSCJ) -+#define TV_INTERFACE (TV_AVIDEO|TV_SVIDEO|TV_SCART|TV_HIVISION|TV_YPBPR) -+ -+/* Only if TV_YPBPR is set: */ -+#define TV_YPBPR525I TV_NTSC -+#define TV_YPBPR525P TV_PAL -+#define TV_YPBPR750P TV_PALM -+#define TV_YPBPR1080I TV_PALN -+#define TV_YPBPRALL (TV_YPBPR525I | TV_YPBPR525P | TV_YPBPR750P | TV_YPBPR1080I) -+ -+#define TV_YPBPR43LB TV_CHSCART -+#define TV_YPBPR43 TV_CHYPBPR525I -+#define TV_YPBPR169 (TV_CHSCART | TV_CHYPBPR525I) -+#define TV_YPBPRAR (TV_CHSCART | TV_CHYPBPR525I) -+ -+ -+#define DISPTYPE_DISP2 CRT2_ENABLE -+#define DISPTYPE_DISP1 DISPTYPE_CRT1 -+#define VB_DISPMODE_SINGLE SINGLE_MODE /* alias */ -+#define VB_DISPMODE_MIRROR MIRROR_MODE /* alias */ -+#define VB_DISPMODE_DUAL DUALVIEW_MODE /* alias */ -+#define DISPLAY_MODE (SINGLE_MODE | MIRROR_MODE | DUALVIEW_MODE) -+ -+/* PresetMode argument */ -+#define XGI_MODE_SIMU 0 -+#define XGI_MODE_CRT1 1 -+#define XGI_MODE_CRT2 2 -+ -+/* pXGI->MiscFlags */ -+#define MISC_CRT1OVERLAY 0x00000001 /* Current display mode supports overlay */ -+#define MISC_PANELLINKSCALER 0x00000002 /* Panel link is currently scaling */ -+#define MISC_CRT1OVERLAYGAMMA 0x00000004 /* Current display mode supports overlay gamma corr on CRT1 */ -+#define MISC_TVNTSC1024 0x00000008 /* Current display mode is TV NTSC/PALM/YPBPR525I 1024x768 */ -+ -+ -+#define HW_DEVICE_EXTENSION XGI_HW_DEVICE_INFO -+ -+#define BITMASK(h,l) (((unsigned)(1U << ((h)-(l)+1))-1)<<(l)) -+#define GENMASK(mask) BITMASK(1?mask,0?mask) -+ -+typedef unsigned long ULong; -+typedef unsigned short UShort; -+typedef unsigned char UChar; -+ -+ -+/* ChipFlags */ -+/* Use only lower 16 bit for chip id! (xgictrl) */ -+#define XGICF_LARGEOVERLAY 0x00000001 -+#define XGICF_Is651 0x00000002 -+#define XGICF_IsM650 0x00000004 -+#define XGICF_IsM652 0x00000008 -+#define XGICF_IsM653 0x00000010 -+#define XGICF_Is652 0x00000020 -+#define XGICF_Is65x (XGICF_Is651|XGICF_IsM650|XGICF_IsM652|XGICF_IsM653|XGICF_Is652) -+#define XGICF_IsM661 0x00000100 /* M661FX */ -+#define XGICF_IsM741 0x00000200 -+#define XGICF_IsM760 0x00000400 -+#define XGICF_IsM661M 0x00000800 /* M661MX */ -+#define XGICF_IsM66x (XGICF_IsM661 | XGICF_IsM741 | XGICF_IsM760 | XGICF_IsM661M) -+#define XGICF_315Core 0x00010000 /* 3D: Real 315 */ -+#define XGICF_Real256ECore 0x00020000 /* 3D: Similar to 315 core, no T&L? (65x, 661, 740, 741) */ -+#define XGICF_XabreCore 0x00040000 /* 3D: Real Xabre */ -+#define XGICF_Ultra256Core 0x00080000 /* 3D: Similar to Xabre, no T&L?, no P:Shader? (660, 760) */ -+#define XGICF_UseLCDA 0x01000000 -+#define XGICF_760UMA 0x10000000 /* 760: UMA active */ -+#define XGICF_CRT2HWCKaputt 0x20000000 /* CRT2 Mono HWCursor engine buggy */ -+#define XGICF_Glamour3 0x40000000 -+#define XGICF_Integrated 0x80000000 -+ -+/* Direct Xv-API */ -+#define XGI_SD_IS300SERIES 0x00000001 -+#define XGI_SD_IS315SERIES 0x00000002 -+#define XGI_SD_IS330SERIES 0x00000004 -+#define XGI_SD_SUPPORTPALMN 0x00000008 /* tv chip supports pal-m, pal-n */ -+#define XGI_SD_SUPPORT2OVL 0x00000010 /* set = 2 overlays, clear = support SWITCHCRT xv prop */ -+#define XGI_SD_SUPPORTTVPOS 0x00000020 /* supports changing tv position */ -+#define XGI_SD_ISDUALHEAD 0x00000040 /* Driver is in dual head mode */ -+#define XGI_SD_ISMERGEDFB 0x00000080 /* Driver is in merged fb mode */ -+#define XGI_SD_ISDHSECONDHEAD 0x00000100 /* Dual head: This is CRT1 (=second head) */ -+#define XGI_SD_ISDHXINERAMA 0x00000200 /* Dual head: We are running Xinerama */ -+#define XGI_SD_VBHASSCART 0x00000400 /* videobridge has SCART instead of VGA2 */ -+#define XGI_SD_ISDEPTH8 0x00000800 /* Depth is 8, no independent gamma correction */ -+#define XGI_SD_ENABLED 0x00002000 /* xgictrl is enabled (by option) */ -+#define XGI_SD_PSEUDOXINERAMA 0x00004000 /* pseudo xinerama is active */ -+#define XGI_SD_SUPPORTLCDA 0x00008000 /* Support LCD Channel A */ -+#define XGI_SD_SUPPORTNTSCJ 0x00010000 /* tv chip supports ntsc-j */ -+#define XGI_SD_ADDLSUPFLAG 0x00020000 /* 1 = the following flags are valid */ -+#define XGI_SD_SUPPORTVGA2 0x00040000 /* CRT2=VGA supported */ -+#define XGI_SD_SUPPORTSCART 0x00080000 /* CRT2=SCART supported */ -+#define XGI_SD_SUPPORTOVERSCAN 0x00100000 /* Overscan flag supported */ -+#define XGI_SD_SUPPORTXVGAMMA1 0x00200000 /* Xv Gamma correction for CRT1 supported */ -+#define XGI_SD_SUPPORTTV 0x00400000 /* CRT2=TV supported */ -+#define XGI_SD_SUPPORTYPBPR 0x00800000 /* CRT2=YPbPr (525i, 525p, 750p, 1080i) is supported */ -+#define XGI_SD_SUPPORTHIVISION 0x01000000 /* CRT2=HiVision is supported */ -+#define XGI_SD_SUPPORTYPBPRAR 0x02000000 /* YPbPr aspect ratio is supported */ -+#define XGI_SD_SUPPORTSCALE 0x04000000 /* Scaling of LCD panel supported */ -+#define XGI_SD_SUPPORTCENTER 0x08000000 /* If scaling supported: Centering of screen [NOT] supported (TMDS only) */ -+ -+#define XGI_DIRECTKEY 0x03145792 -+ -+/* XGICtrl: Check mode for CRT2 */ -+#define XGI_CF2_LCD 0x01 -+#define XGI_CF2_TV 0x02 -+#define XGI_CF2_VGA2 0x04 -+#define XGI_CF2_TVPAL 0x08 -+#define XGI_CF2_TVNTSC 0x10 /* + NTSC-J */ -+#define XGI_CF2_TVPALM 0x20 -+#define XGI_CF2_TVPALN 0x40 -+#define XGI_CF2_CRT1LCDA 0x80 -+#define XGI_CF2_TYPEMASK (XGI_CF2_LCD | XGI_CF2_TV | XGI_CF2_VGA2 | XGI_CF2_CRT1LCDA) -+#define XGI_CF2_TVSPECIAL (XGI_CF2_LCD | XGI_CF2_TV) -+#define XGI_CF2_TVSPECMASK (XGI_CF2_TVPAL | XGI_CF2_TVNTSC | XGI_CF2_TVPALM | XGI_CF2_TVPALN) -+#define XGI_CF2_TVHIVISION XGI_CF2_TVPAL -+#define XGI_CF2_TVYPBPR525I XGI_CF2_TVNTSC -+#define XGI_CF2_TVYPBPR525P (XGI_CF2_TVPAL | XGI_CF2_TVNTSC) -+#define XGI_CF2_TVYPBPR750P XGI_CF2_TVPALM -+#define XGI_CF2_TVYPBPR1080I (XGI_CF2_TVPALM | XGI_CF2_TVPAL) -+ -+/* AGP stuff for DRI */ -+#define AGP_PAGE_SIZE 4096 -+#define AGP_PAGES 2048 /* Default: 2048 pages @ 4096 = 8MB */ -+/* 300 */ -+#define AGP_CMDBUF_PAGES 256 -+#define AGP_CMDBUF_SIZE (AGP_PAGE_SIZE * AGP_CMDBUF_PAGES) -+/* 315/330 */ -+#define AGP_VTXBUF_PAGES 512 -+#define AGP_VTXBUF_SIZE (AGP_PAGE_SIZE * AGP_VTXBUF_PAGES) -+ -+#define VOLARI_CQSIZE (1024*1024) -+#define VOLARI_CQSIZEXG20 (128*1024) -+#define VOLARI_CURSOR_SHAPE_SIZE (64*64*4) -+ -+/* For backup of register contents */ -+typedef struct { -+ unsigned char xgiRegs3C4[0x50]; -+ unsigned char xgiRegs3D4[0x90]; -+ unsigned char xgiRegs3C2; -+ unsigned char xgiCapt[0x60]; -+ unsigned char xgiVid[0x50]; -+ unsigned char VBPart1[0x50]; -+ unsigned char VBPart2[0x100]; -+ unsigned char VBPart3[0x50]; -+ unsigned char VBPart4[0x50]; -+ unsigned short ch70xx[64]; -+ unsigned long xgiMMIO85C0; -+ unsigned char xgi6326tv[0x46]; -+ unsigned long xgiRegsPCI50, xgiRegsPCIA0; -+} XGIRegRec, *XGIRegPtr; -+ -+ -+/* XGIFBLayout is mainly there because of DGA. It holds the -+ * current layout parameters needed for acceleration and other -+ * stuff. When switching mode using DGA, these are set up -+ * accordingly and not necessarily match pScrn's. Therefore, -+ * driver modules should read these values instead of pScrn's. -+ */ -+typedef struct { -+ int bitsPerPixel; /* = pScrn->bitsPerPixel */ -+ int depth; /* = pScrn->depth */ -+ int displayWidth; /* = pScrn->displayWidth */ -+ DisplayModePtr mode; /* = pScrn->currentMode */ -+} XGIFBLayout; -+ -+/* Dual head private entity structure */ -+typedef struct { -+ ScrnInfoPtr pScrn_1; -+ ScrnInfoPtr pScrn_2; -+ unsigned char * BIOS; -+ VB_DEVICE_INFO *XGI_Pr; -+ int CRT2ModeNo; /* Current display mode for CRT2 */ -+ Bool CRT2ModeSet; /* CRT2 mode has been set */ -+ unsigned char CRT2CR30, CRT2CR31, CRT2CR35, CRT2CR38; -+ int refCount; -+ -+ /** -+ * Number of entities -+ * -+ * \bug -+ * This field is tested in one place, but it doesn't appear to ever be -+ * set or modified. -+ */ -+ int lastInstance; -+ -+ Bool DisableDual; /* Emergency flag */ -+ Bool ErrorAfterFirst; /* Emergency flag: Error after first init -> Abort second */ -+ int maxUsedClock; /* Max used pixelclock on master head */ -+ -+ /** -+ * Framebuffer addresses and sizes -+ * -+ * \bug -+ * These 4 fields are set, but the stored values don't appear to be used. -+ */ -+ unsigned long masterFbAddress; -+ unsigned long masterFbSize; -+ unsigned long slaveFbAddress; -+ unsigned long slaveFbSize; -+ -+ unsigned char * FbBase; /* VRAM linear address */ -+ unsigned char * IOBase; /* MMIO linear address */ -+ -+ /** -+ * Map / unmap queue counter. -+ * -+ * \bug -+ * These vales are tested, set to zero, or decremented. However, I don't -+ * see anywhere in the code where they are incremented. -+ */ -+ unsigned short MapCountIOBase; -+ unsigned short MapCountFbBase; -+ -+ Bool forceUnmapIOBase; /* ignore counter and unmap */ -+ Bool forceUnmapFbBase; /* ignore counter and unmap */ -+#ifdef __alpha__ -+ unsigned char * IOBaseDense; /* MMIO for Alpha platform */ -+ unsigned short MapCountIOBaseDense; -+ Bool forceUnmapIOBaseDense; /* ignore counter and unmap */ -+#endif -+ BOOLEAN CRT1gamma; -+ -+ /** -+ * \bug This field is tested and set to \c NULL but never used. -+ */ -+ unsigned char *RenderAccelArray; -+ unsigned char * FbBase1; -+ unsigned long OnScreenSize1; -+ -+#ifdef XGI_CP -+ XGI_CP_H_ENT -+#endif -+} XGIEntRec, *XGIEntPtr; -+ -+#define XGIPTR(p) ((XGIPtr)((p)->driverPrivate)) -+#define XAAPTR(p) ((XAAInfoRecPtr)(XGIPTR(p)->AccelInfoPtr)) -+ -+#define ExtRegSize 0x40 -+ -+ -+/* Relative merge position */ -+typedef enum { -+ xgiLeftOf, -+ xgiRightOf, -+ xgiAbove, -+ xgiBelow, -+ xgiClone -+} XGIScrn2Rel; -+ -+typedef struct MonitorRange { -+ float loH,hiH,loV,hiV ; -+}MonitorRangeRec,*MonitorRangePtr ; -+ -+typedef struct { -+ ScrnInfoPtr pScrn; /* -------------- DON'T INSERT ANYTHING HERE --------------- */ -+#ifdef XSERVER_LIBPCIACCESS -+ struct pci_device * PciInfo; -+#else -+ pciVideoPtr PciInfo; /* -------- OTHERWISE xgi_dri.so MUST BE RECOMPILED -------- */ -+ PCITAG PciTag; -+#endif -+ EntityInfoPtr pEnt; -+ int Chipset; -+ int ChipRev; -+ VB_DEVICE_INFO *XGI_Pr; /* For new mode switching code */ -+ unsigned long FbAddress; /* VRAM physical address (in DHM: for each Fb!) */ -+ unsigned long realFbAddress; /* For DHM/PCI mem mapping: store global FBAddress */ -+ unsigned char * FbBase; /* VRAM virtual linear address */ -+ CARD32 IOAddress; /* MMIO physical address */ -+ unsigned char * IOBase; /* MMIO linear address */ -+ IOADDRESS IODBase; /* Base of PIO memory area */ -+#ifdef __alpha__ -+ unsigned char * IOBaseDense; /* MMIO for Alpha platform */ -+#endif -+ XGIIOADDRESS RelIO; /* Relocated IO Ports baseaddress */ -+ unsigned char * BIOS; -+ int MemClock; -+ int BusWidth; -+ int MinClock; -+ int MaxClock; -+ int Flags; /* HW config flags */ -+ long FbMapSize; /* Used for Mem Mapping - DON'T CHANGE THIS */ -+ long availMem; /* Really available Fb mem (minus TQ, HWCursor) */ -+ unsigned long maxxfbmem; /* limit fb memory X is to use to this (KB) */ -+ unsigned long xgifbMem; /* heapstart of xgifb (if running) */ -+ unsigned long dhmOffset; /* Offset to memory for each head (0 or ..) */ -+ DGAModePtr DGAModes; -+ int numDGAModes; -+ Bool DGAactive; -+ Bool NoAccel; -+ Bool NoXvideo; -+ Bool TurboQueue; -+ int ForceCRT1Type; -+ int ForceCRT2Type; -+ int OptROMUsage; -+ Bool ValidWidth; -+ unsigned char myCR63; -+ unsigned long VBFlags; /* Video bridge configuration */ -+ unsigned long VBFlags_backup; /* Backup for SlaveMode-modes */ -+ -+ short scrnOffset; /* Screen pitch (data) */ -+ short scrnPitch; /* Screen pitch (display; regarding interlace) */ -+ unsigned long DstColor; -+ int xcurrent; /* for temp use in accel */ -+ int ycurrent; /* for temp use in accel */ -+ int CommandReg; -+ -+ Bool HWCursor; -+ CARD16 CursorSize; /* Size of HWCursor area (bytes) */ -+ xf86CursorInfoPtr CursorInfoPtr; -+ unsigned CursorOffset; -+ -+ /** -+ * \bug This field is set to \c FALSE but never used. -+ */ -+ Bool DoColorExpand; -+ -+ XGIRegRec SavedReg; -+ XGIRegRec ModeReg; -+ XAAInfoRecPtr AccelInfoPtr; -+ CloseScreenProcPtr CloseScreen; -+ Bool (*ModeInit)(ScrnInfoPtr pScrn, DisplayModePtr mode); -+ void (*XGISave)(ScrnInfoPtr pScrn, XGIRegPtr xgireg); -+ void (*XGISave2)(ScrnInfoPtr pScrn, XGIRegPtr xgireg); -+ void (*XGISave3)(ScrnInfoPtr pScrn, XGIRegPtr xgireg); -+ void (*XGIRestore)(ScrnInfoPtr pScrn, XGIRegPtr xgireg); -+ void (*XGIRestore2)(ScrnInfoPtr pScrn, XGIRegPtr xgireg); -+ void (*XGIRestore3)(ScrnInfoPtr pScrn, XGIRegPtr xgireg); -+ void (*LoadCRT2Palette)(ScrnInfoPtr pScrn, int numColors, -+ int *indicies, LOCO *colors, VisualPtr pVisual); -+ -+ int cmdQueueLen; /* Current cmdQueueLength (for 2D and 3D) */ -+ unsigned long cmdQueueLenMax; -+ unsigned long cmdQueueLenMin; -+ unsigned char *cmdQueueBase; -+ int *cmdQueueLenPtr; /* Ptr to variable holding the current queue length */ -+ unsigned int cmdQueueOffset; -+ unsigned int cmdQueueSize; -+ unsigned long cmdQueueSizeMask; -+ -+ /** -+ * \bug This field is set but never used. -+ */ -+ unsigned int agpWantedPages; -+ -+#ifdef XF86DRI -+ unsigned long agpHandle; -+ unsigned long agpAddr; -+ unsigned char *agpBase; -+ unsigned int agpSize; -+ unsigned long agpVtxBufAddr; /* 315 series */ -+ unsigned char *agpVtxBufBase; -+ unsigned int agpVtxBufSize; -+ unsigned int agpVtxBufFree; -+ xgiRegion agp; -+ Bool irqEnabled; -+ int irq; -+#endif -+ unsigned long DRIheapstart, DRIheapend; -+ -+ void (*RenderCallback)(ScrnInfoPtr); -+ -+ /** -+ * \bug This field is tested and set to \c NULL but never used. -+ */ -+ unsigned char *RenderAccelArray; -+ -+ /** -+ * \bug This field is to \c TRUE but never used. -+ */ -+ Bool doRender; -+ -+ int PerColorExpandBufferSize; -+ int ColorExpandBufferNumber; -+ unsigned char *ColorExpandBufferAddr[32]; -+ int ColorExpandBufferScreenOffset[32]; -+ -+ /** -+ * \bug This field is read but never initialized. -+ */ -+ int ImageWriteBufferSize; -+ -+ unsigned char *ImageWriteBufferAddr; -+ -+ int Rotate; -+ -+ /* ShadowFB support */ -+ Bool ShadowFB; -+ unsigned char *ShadowPtr; -+ int ShadowPitch; -+ -+ /** -+ * \bug This field is set but never used. -+ */ -+ Bool loadDRI; -+ -+#ifdef XF86DRI -+ Bool directRenderingEnabled; -+ DRIInfoPtr pDRIInfo; -+ int drmSubFD; -+ int numVisualConfigs; -+ __GLXvisualConfig* pVisualConfigs; -+ XGIConfigPrivPtr pVisualConfigsPriv; -+#endif -+ -+ HW_DEVICE_EXTENSION xgi_HwDevExt; /* For new mode switching code */ -+ XF86VideoAdaptorPtr adaptor; -+ ScreenBlockHandlerProcPtr BlockHandler; -+ -+ /** -+ * \bug This field is tested and used but never set. -+ */ -+ void (*VideoTimerCallback)(ScrnInfoPtr, Time); -+ -+ void (*ResetXv)(ScrnInfoPtr); -+ void (*ResetXvGamma)(ScrnInfoPtr); -+ -+ OptionInfoPtr Options; -+ -+ /** -+ * \bug This field is used but never initialized. -+ */ -+ unsigned char LCDon; -+ Bool Blank; -+ int CRT1off; /* 1=CRT1 off, 0=CRT1 on */ -+ CARD16 LCDheight; /* Vertical resolution of LCD panel */ -+ CARD16 LCDwidth; /* Horizontal resolution of LCD panel */ -+ vbeInfoPtr pVbe; /* For VESA mode switching */ -+ UCHAR ScratchSet[16]; -+ MonitorRangeRec CRT1Range,CRT2Range; -+ -+#ifdef XGIDUALHEAD -+ BOOL DualHeadMode; /* TRUE if we use dual head mode */ -+ BOOL SecondHead; /* TRUE is this is the second head */ -+ XGIEntPtr entityPrivate; /* Ptr to private entity (see above) */ -+#endif -+ XGIFBLayout CurrentLayout; /* Current framebuffer layout */ -+ BOOL Primary; /* Display adapter is primary */ -+ xf86Int10InfoPtr pInt; /* Our int10 */ -+ -+ /** -+ * Use our own default modes? -+ * -+ * \bug This field is set but never used. -+ */ -+ Bool noInternalModes; -+ -+ int ForceTVType, SenseYPbPr; -+ int NonDefaultPAL, NonDefaultNTSC; -+ unsigned long ForceYPbPrType, ForceYPbPrAR; -+ unsigned long lockcalls; /* Count unlock calls for debug */ -+ -+ Atom xvBrightness, xvContrast, xvColorKey, xvHue, xvSaturation; -+ Atom xvAutopaintColorKey, xvSetDefaults, xvSwitchCRT; -+ Atom xvDisableGfx, xvDisableGfxLR, xvTVXPosition, xvTVYPosition; -+ Atom xvDisableColorkey, xvUseChromakey, xvChromaMin, xvChromaMax; -+ Atom xvInsideChromakey, xvYUVChromakey; -+ Atom xvGammaRed, xvGammaGreen, xvGammaBlue; -+#ifdef XGI_CP -+ XGI_CP_H -+#endif -+ unsigned long ChipFlags; -+ unsigned long XGI_SD_Flags; -+ BOOLEAN UseHWARGBCursor; -+ BOOLEAN HWARGBCursor; -+ int vb; -+ BOOLEAN restorebyset; -+ BOOLEAN nocrt2ddcdetection; -+ BOOLEAN forcecrt2redetection; -+ BOOLEAN CRT1gamma, CRT1gammaGiven, CRT2gamma, XvGamma, XvGammaGiven; -+ int XvDefCon, XvDefBri, XvDefHue, XvDefSat; -+ BOOLEAN XvDefDisableGfx, XvDefDisableGfxLR; -+ BOOLEAN XvUseMemcpy; -+ int XvGammaRed, XvGammaGreen, XvGammaBlue; -+ CARD8 XvGammaRampRed[256], XvGammaRampGreen[256], XvGammaRampBlue[256]; -+ BOOLEAN disablecolorkeycurrent; -+ CARD32 colorKey; -+ CARD32 MiscFlags; -+ FBLinearPtr AccelLinearScratch; -+ float zClearVal; -+ unsigned long bClrColor, dwColor; -+ int AllowHotkey; -+ BOOLEAN enablexgictrl; -+ short Video_MaxWidth, Video_MaxHeight; -+ short scrnPitch2; -+ int CurXPreset ; -+ int CurYPreset ; -+ unsigned long mmioSize; -+#ifdef XGIMERGED -+ Bool MergedFB, MergedFBAuto; -+ XGIScrn2Rel CRT2Position; -+ char * CRT2HSync; -+ char * CRT2VRefresh; -+ char * MetaModes; -+ ScrnInfoPtr CRT2pScrn; -+ DisplayModePtr CRT1Modes; -+ DisplayModePtr CRT1CurrentMode; -+ int CRT1frameX0; -+ int CRT1frameY0; -+ int CRT1frameX1; -+ int CRT1frameY1; -+ Bool CheckForCRT2; -+ int MergedFBXDPI, MergedFBYDPI; -+#ifdef XGIXINERAMA -+ Bool UsexgiXinerama; -+ Bool CRT2IsScrn0; -+ ExtensionEntry *XineramaExtEntry; -+ int xgiXineramaVX, xgiXineramaVY; -+ Bool AtLeastOneNonClone; -+#endif -+#endif -+ -+ /* Added for 3D */ -+ unsigned long cmdQueue_shareWP_only2D; -+ unsigned long *pCQ_shareWritePort; -+ void (*SetThreshold)(ScrnInfoPtr pScrn, DisplayModePtr mode, -+ unsigned short *Low, unsigned short *High); -+ -+ XGI_DSReg SRList[ExtRegSize] ; -+ XGI_DSReg CRList[ExtRegSize] ; -+ -+ /** -+ * Total number of iterations to wait in \c Volari_Idle. -+ */ -+ unsigned int idle_wait_count; -+ -+//:::: for capture -+ Bool v4l_videoin; -+ int v4l_devnum; /* v4l device number, 0,1,2....*/ -+//~:::: -+} XGIRec, *XGIPtr; -+ -+#ifdef XGIDUALHEAD -+# define IS_DUAL_HEAD(x) ((x)->DualHeadMode) -+# define IS_SECOND_HEAD(x) ((x)->SecondHead) -+# define ENTITY_PRIVATE(x) ((x)->entityPrivate) -+#else -+# define IS_DUAL_HEAD(x) FALSE -+# define IS_SECOND_HEAD(x) FALSE -+# define ENTITY_PRIVATE(x) NULL -+#endif -+ -+ -+#define SEQ_ADDRESS_PORT 0x0014 -+#define MISC_OUTPUT_REG_WRITE_PORT 0x0012 -+#define MISC_OUTPUT_REG_READ_PORT 0x001C -+#define GRAPH_ADDRESS_PORT 0x001E -+#define VIDEO_SUBSYSTEM_ENABLE_PORT 0x0013 -+#define CRTC_ADDRESS_PORT_COLOR 0x0024 -+#define PCI_COMMAND 0x04 -+ -+#define SDMPTR(x) ((XGIMergedDisplayModePtr)(x->currentMode->Private)) -+#define CDMPTR ((XGIMergedDisplayModePtr)(pXGI->CurrentLayout.mode->Private)) -+ -+#define BOUND(test,low,hi) { \ -+ if(test < low) test = low; \ -+ if(test > hi) test = hi; } -+ -+#define REBOUND(low,hi,test) { \ -+ if(test < low) { \ -+ hi += test-low; \ -+ low = test; } \ -+ if(test > hi) { \ -+ low += test-hi; \ -+ hi = test; } } -+ -+typedef struct _MergedDisplayModeRec { -+ DisplayModePtr CRT1; -+ DisplayModePtr CRT2; -+ XGIScrn2Rel CRT2Position; -+} XGIMergedDisplayModeRec, *XGIMergedDisplayModePtr; -+ -+ -+typedef struct _region { -+ int x0,x1,y0,y1; -+} region; -+ -+ -+extern void xgiOptions(ScrnInfoPtr pScrn); -+extern const OptionInfoRec * XGIAvailableOptions(int chipid, int busid); -+extern void XGISetup(ScrnInfoPtr pScrn); -+extern void XGIVGAPreInit(ScrnInfoPtr pScrn); -+extern Bool XGIAccelInit(ScreenPtr pScreen); -+extern Bool XGIHWCursorInit(ScreenPtr pScreen); -+extern Bool XGIDGAInit(ScreenPtr pScreen); -+extern void XGIInitVideo(ScreenPtr pScreen); -+ -+extern int XGI_GetCHTVlumabandwidthcvbs(ScrnInfoPtr pScrn); -+ -+int XG40Mclk(XGIPtr pXGI); -+ -+void XGINew_InitVBIOSData(PXGI_HW_DEVICE_INFO HwDeviceExtension, PVB_DEVICE_INFO pVBInfo) ; -+int compute_vclk(int Clock, int *out_n, int *out_dn, int *out_div, -+ int *out_sbit, int *out_scale); -+ -+void XGI_WaitBeginRetrace(XGIIOADDRESS RelIO); -+void XGI_WaitEndRetrace(XGIIOADDRESS RelIO); -+ -+/* 2005/11/21 added by jjtseng */ -+#define DelayS(sec) usleep((sec)*1000000) -+#define DelayMS(millisec) usleep((millisec)*1000) -+#define DelayUS(microsec) usleep((microsec)) -+/*~jjtseng 2005/11/21 */ -+ -+Bool Volari_AccelInit(ScreenPtr pScreen) ; -+/* void XGI_UnLockCRT2(PXGI_HW_DEVICE_INFO,USHORT BaseAddr); */ -+/* void XGI_LockCRT2(PXGI_HW_DEVICE_INFO,USHORT BaseAddr); */ -+/* void XGI_DisableBridge(PXGI_HW_DEVICE_INFO,USHORT BaseAddr); */ -+/* void XGI_EnableBridge(PXGI_HW_DEVICE_INFO,USHORT BaseAddr); */ -+#endif -+ -+extern USHORT XGI_GetModeID(ULONG VBFlags, int HDisplay, int VDisplay, -+ int Depth, int LCDwith, int LCDheight); -+ -+extern BOOLEAN XGI_SearchModeID(const XGI_StStruct *SModeIDTable, -+ const XGI_ExtStruct *EModeIDTable, unsigned char VGAINFO, -+ USHORT *ModeNo, USHORT *ModeIdIndex); -+ -+extern UCHAR XGI_GetModePtr(const XGI_StStruct *SModeIDTable, -+ unsigned ModeType, USHORT ModeNo, USHORT ModeIdIndex); -+ -+extern void XGI_SetReg(XGIIOADDRESS port, USHORT index, USHORT data); -+extern void XGI_SetRegByte(XGIIOADDRESS port, USHORT data); -+extern void XGI_SetRegShort(XGIIOADDRESS port, USHORT data); -+extern void XGI_SetRegLong(XGIIOADDRESS port, ULONG data); -+extern UCHAR XGI_GetReg(XGIIOADDRESS port, USHORT index); -+extern UCHAR XGI_GetRegByte(XGIIOADDRESS port); -+extern USHORT XGI_GetRegShort(XGIIOADDRESS port); -+extern ULONG XGI_GetRegLong(XGIIOADDRESS port); -+extern void XGI_SetRegANDOR(XGIIOADDRESS Port, USHORT Index, USHORT DataAND, -+ USHORT DataOR); -+extern void XGI_SetRegAND(XGIIOADDRESS Port, USHORT Index, USHORT DataAND); -+extern void XGI_SetRegOR(XGIIOADDRESS Port, USHORT Index, USHORT DataOR); -+ -+extern void XGI_WriteDAC(XGIIOADDRESS dac_data, unsigned shift, -+ unsigned ordering, uint8_t red, uint8_t green, uint8_t blue); -+ -+#ifdef DEBUG -+void XGIDumpRegs(ScrnInfoPtr pScrn); -+ -+/** -+ * Write value to the PC's 0x80 debug port. -+ * -+ * \bug -+ * I'm pretty sure the debug 0x80 only exists on PCs. Should this routine -+ * be a no-op on non-x86 and non-x86-64 architectures? -+ */ -+#define Newdebugcode(dbg_code) outb(0x80, dbg_code) -+#else -+#define Newdebugcode(dbg_code) -+#endif -diff --git a/src/xgi_accel.c b/src/xgi_accel.c -index 330ed5d..2490348 100644 ---- a/src/xgi_accel.c -+++ b/src/xgi_accel.c -@@ -1,850 +1,879 @@ --/* -- * -- * Copyright (C) 1998, 1999 by Alan Hourihane, Wigan, England. -- * Parts Copyright (C) 2001-2004 Thomas Winischhofer, Vienna, Austria. -- * -- * Licensed under the following terms: -- * -- * Permission to use, copy, modify, distribute, and sell this software and its -- * documentation for any purpose is hereby granted without fee, provided that -- * the above copyright notice appears in all copies and that both that copyright -- * notice and this permission notice appear in supporting documentation, and -- * and that the name of the copyright holder not be used in advertising -- * or publicity pertaining to distribution of the software without specific, -- * written prior permission. The copyright holder makes no representations -- * about the suitability of this software for any purpose. It is provided -- * "as is" without expressed or implied warranty. -- * -- * THE COPYRIGHT HOLDER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, -- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO -- * EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY SPECIAL, INDIRECT OR -- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, -- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER -- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -- * PERFORMANCE OF THIS SOFTWARE. -- * -- * Authors: Alan Hourihane , -- * Mike Chapman , -- * Juanjo Santamarta , -- * Mitani Hiroshi , -- * David Thomas , -- * Thomas Winischhofer . -- */ -- --#ifdef HAVE_CONFIG_H --#include "config.h" --#endif -- --#include "xf86.h" --#include "xf86_OSproc.h" -- --#include "xf86PciInfo.h" --#include "xf86Pci.h" -- --#include --#include -- --#include "xgi_accel.h" --#include "xgi_regs.h" --#include "xgi.h" --#include "vb_def.h" -- --#include "xaarop.h" --#include --#include --#include -- --/*************************************************************************/ -- --void Volari_Sync(ScrnInfoPtr pScrn); -- --static void Volari_SetupForScreenToScreenCopy(ScrnInfoPtr pScrn, -- int xdir, int ydir, int rop, -- unsigned int planemask, int trans_color); --static void Volari_SubsequentScreenToScreenCopy(ScrnInfoPtr pScrn, -- int x1, int y1, int x2, int y2, -- int width, int height); --static void Volari_SetupForSolidFill(ScrnInfoPtr pScrn, int color, -- int rop, unsigned int planemask); --static void Volari_SubsequentSolidFillRect(ScrnInfoPtr pScrn, -- int x, int y, int w, int h); --static void Volari_SetupForMonoPatternFill(ScrnInfoPtr pScrn, -- int patx, int paty, int fg, int bg, -- int rop, unsigned int planemask); --static void Volari_SubsequentMonoPatternFill(ScrnInfoPtr pScrn, -- int patx, int paty, -- int x, int y, int w, int h); -- --void Volari_EnableAccelerator(ScrnInfoPtr pScrn) ; --static void Volari_InitCmdQueue(ScrnInfoPtr pScrn) ; --static void Volari_DisableDualPipe(ScrnInfoPtr pScrn) ; --static void Volari_DisableCmdQueue(ScrnInfoPtr pScrn) ; -- --extern int FbDevExist; -- --#if X_BYTE_ORDER == X_BIG_ENDIAN --static CARD32 BE_SWAP32 (CARD32 val) --{ -- if (CurrentColorDepth == 8) -- return ((((val) & 0x000000ff) << 24) | \ -- (((val) & 0x0000ff00) << 8) | \ -- (((val) & 0x00ff0000) >> 8) | \ -- (((val) & 0xff000000) >> 24)); -- if (CurrentColorDepth == 24) -- return val; -- if (CurrentColorDepth == 16) -- return ((((val) & 0x0000ffff) << 16) | \ -- (((val) & 0xffff0000) >> 16)); --} --#else --static CARD32 BE_SWAP32 (CARD32 val) --{ -- return val; --} --#endif -- -- --#ifdef DEBUG --static void dump_cq_read_pointer(unsigned int cqrp) --{ -- static const char *const field_name[8] = { -- "all idle", -- "hardware queues empty", -- "2D idle", -- "3D idle", -- "hardware command queue empty", -- "2D queue empty", -- "3D queue empty", -- "software command queue empty", -- }; -- unsigned i; -- -- xf86DrvMsg(0, X_INFO, "IO(0x85CC) = 0x%08x\n", cqrp); -- for (i = 31; i > 23; i--) { -- if ((cqrp & (1U << i)) != 0) { -- xf86DrvMsg(0, X_INFO, " %s\n", field_name[31 - i]); -- } -- } --} --#endif /* DEBUG */ -- -- --void Volari_SetDefaultIdleWait(XGIPtr pXGI, unsigned HDisplay, -- unsigned depth) --{ -- static const unsigned wait_table[5][4] = { -- { 1, 1, 1, 1 }, -- { 65535, 1, 1000, 3000 }, -- { 65535, 160, 1200, 4000 }, -- { 65535, 200, 1600, 6000 }, -- { 65535, 500, 2000, 8000 } -- }; -- -- if (pXGI->Chipset == PCI_CHIP_XGIXG20) { -- unsigned i; -- -- switch (HDisplay) { -- case 640: i = 1; break; -- case 800: i = 2; break; -- case 1024: i = 3; break; -- case 1280: i = 4; break; -- default: i = 0; break; -- } -- -- pXGI->idle_wait_count = wait_table[i][3 & (depth / 8)]; -- } -- else { -- pXGI->idle_wait_count = 65535; -- } --} -- --void Volari_Idle(XGIPtr pXGI) --{ -- int i; --#ifdef DEBUG -- unsigned int last_cqrp = 0; --#endif /* DEBUG */ -- -- do { -- int bIdle = 0; -- unsigned int cqrp; -- -- for (i = 0; i < pXGI->idle_wait_count; i++) { -- cqrp = MMIO_IN32(pXGI->IOBase, 0x85CC); -- if (cqrp & IDLE_ALL) { -- bIdle = 1; -- break; -- } -- } -- -- if (bIdle) -- break; -- --#ifdef DEBUG -- if (last_cqrp != cqrp) { -- dump_cq_read_pointer(cqrp); -- last_cqrp = cqrp; -- } -- -- sleep(1); --#endif /* DEBUG */ -- -- if (pXGI->Chipset == PCI_CHIP_XGIXG20) -- usleep(1); -- } while (1); --} -- -- --void --Volari_EnableAccelerator(ScrnInfoPtr pScrn) --{ -- XGIPtr pXGI = XGIPTR(pScrn); -- -- PDEBUG(ErrorF("Volari_EnableAccelerator()\n")) ; -- -- switch (pXGI->Chipset) { -- case PCI_CHIP_XGIXG40: -- default: -- orXGIIDXREG(XGISR, 0x1E, -- SR1E_ENABLE_3D_TRANSFORM_ENGINE -- | SR1E_ENABLE_2D -- | SR1E_ENABLE_3D_AGP_VERTEX_FETCH -- | SR1E_ENABLE_3D_COMMAND_PARSER -- | SR1E_ENABLE_3D); -- } -- -- -- if( pXGI->TurboQueue ) -- { -- Volari_InitCmdQueue(pScrn) ; -- } --} -- --static void --Volari_InitCmdQueue(ScrnInfoPtr pScrn) --{ -- XGIPtr pXGI = XGIPTR(pScrn); -- unsigned long ulXGITempRP ; -- unsigned long ulCR55 ; -- unsigned long ulSR26 ; -- unsigned long temp ; -- /* unsigned long ulFlag = 0 ; */ --/* -- PDEBUG(ErrorF("Volari_InitCmdQueue()\n")); -- PDEBUG(ErrorF( "pXGI->IOBase = 0x%08lX, [%04X] = 0x%08lX\n",(unsigned long)(pXGI->IOBase),0x85c0, XGIMMIOLONG(0x85c0))) ; -- PDEBUG(ErrorF( "pXGI->IOBase = 0x%08lX, [%04X] = 0x%08lX\n",(unsigned long)(pXGI->IOBase),0x85c4, XGIMMIOLONG(0x85c4))) ; -- PDEBUG(ErrorF( "pXGI->IOBase = 0x%08lX, [%04X] = 0x%08lX\n",(unsigned long)(pXGI->IOBase),0x85c8, XGIMMIOLONG(0x85c8))) ; -- PDEBUG(ErrorF( "pXGI->IOBase = 0x%08lX, [%04X] = 0x%08lX\n",(unsigned long)(pXGI->IOBase),0x85cc, XGIMMIOLONG(0x85cc))) ; --*/ -- inXGIIDXREG(XGICR, 0x55, ulCR55) ; -- andXGIIDXREG(XGICR, 0x55, 0x33) ; -- orXGIIDXREG(XGISR, 0x26, 1) ; /* reset cmd queue */ -- -- w_port = Volari_GetSwWP() ; /* GuardBand() Init */ -- r_port = Volari_GetHwRP() ; -- -- if( pXGI->Chipset == PCI_CHIP_XGIXG20 ) -- { -- Alignment = 1 ; /* 64 bits */ -- -- switch(pXGI->cmdQueueSize) -- { -- case 64*1024: -- ulSR26 = 0x40 + 0x00 ; -- break ; -- case 128*1024: -- ulSR26 = 0x40 + 0x04 ; -- break ; -- default: -- /* reset the command queue information */ -- -- pXGI->cmdQueueSize = 128*1024 ; /* reset the command queue */ -- pXGI->cmdQueueSizeMask = pXGI->cmdQueueSize - 1 ; -- if( FbDevExist ) -- { -- if( pScrn->videoRam < 8*1024 ) -- { -- pXGI->cmdQueueOffset = 4*1024*1024 - pXGI->cmdQueueSize ; -- } -- else if( pScrn->videoRam < 16*1024 ) -- { -- pXGI->cmdQueueOffset = 8*1024*1024 - pXGI->cmdQueueSize ; -- } -- else -- { -- pXGI->cmdQueueOffset = 13*1024*1024 - pXGI->cmdQueueSize ; -- } -- } -- else -- { -- pXGI->cmdQueueOffset = (pScrn->videoRam)*1024 - pXGI->cmdQueueSize ; -- } -- -- pXGI->cmdQueueLen = 0 ; -- pXGI->cmdQueueLenMin = 0x200 ; -- pXGI->cmdQueueLenMax = pXGI->cmdQueueSize - pXGI->cmdQueueLenMin ; -- -- ulSR26 = 0x40 ; -- break ; -- } -- } -- else -- { -- Alignment = 2 ; /* 128 bits */ -- -- switch(pXGI->cmdQueueSize) -- { -- case 512*1024: -- ulSR26 = 0x40 + 0x00 ; -- break ; -- case 1024*1024: -- ulSR26 = 0x40 + 0x04 ; -- break ; -- case 2*1024*1024: -- ulSR26 = 0x40 + 0x08 ; -- break ; -- case 4*1024*1024: -- ulSR26 = 0x40 + 0x0C ; -- break ; -- default: -- /* reset the command queue information */ -- -- pXGI->cmdQueueSize = 512*1024 ; /* reset the command queue */ -- pXGI->cmdQueueSizeMask = pXGI->cmdQueueSize - 1 ; -- if( FbDevExist ) -- { -- if( pScrn->videoRam < 8*1024 ) -- { -- pXGI->cmdQueueOffset = 4*1024*1024 - pXGI->cmdQueueSize ; -- } -- else if( pScrn->videoRam < 16*1024 ) -- { -- pXGI->cmdQueueOffset = 8*1024*1024 - pXGI->cmdQueueSize ; -- } -- else -- { -- pXGI->cmdQueueOffset = 13*1024*1024 - pXGI->cmdQueueSize ; -- } -- } -- else -- { -- pXGI->cmdQueueOffset = (pScrn->videoRam)*1024 - pXGI->cmdQueueSize ; -- } -- -- pXGI->cmdQueueLen = 0 ; -- pXGI->cmdQueueLenMin = 0x200 ; -- pXGI->cmdQueueLenMax = pXGI->cmdQueueSize - pXGI->cmdQueueLenMin ; -- -- ulSR26 = 0x40 ; -- break ; -- } -- } -- -- pXGI->CursorOffset = pXGI->cmdQueueOffset - VOLARI_CURSOR_SHAPE_SIZE; -- -- temp = (unsigned long)pXGI->FbBase ; -- temp += pXGI->cmdQueueOffset ; -- pXGI->cmdQueueBase = (unsigned char *)temp ; --/* -- PDEBUG(ErrorF( "pXGI->FbBase = 0x%lX\n", pXGI->FbBase )) ; -- PDEBUG(ErrorF( "pXGI->cmdQueueOffset = 0x%lX\n", pXGI->cmdQueueOffset )) ; -- PDEBUG(ErrorF( "pXGI->cmdQueueBase = 0x%lX\n", pXGI->cmdQueueBase )) ; --*/ -- outXGIIDXREG(XGISR, 0x26, ulSR26) ; -- -- ulXGITempRP=Volari_GetHwRP() ; --/* -- PDEBUG(ErrorF( "pXGI->IOBase = 0x%08lX, [%04X] = 0x%08lX\n",(unsigned long)(pXGI->IOBase),0x85c0, XGIMMIOLONG(0x85c0))) ; -- PDEBUG(ErrorF( "pXGI->IOBase = 0x%08lX, [%04X] = 0x%08lX\n",(unsigned long)(pXGI->IOBase),0x85c4, XGIMMIOLONG(0x85c4))) ; -- PDEBUG(ErrorF( "pXGI->IOBase = 0x%08lX, [%04X] = 0x%08lX\n",(unsigned long)(pXGI->IOBase),0x85c8, XGIMMIOLONG(0x85c8))) ; -- PDEBUG(ErrorF( "pXGI->IOBase = 0x%08lX, [%04X] = 0x%08lX\n",(unsigned long)(pXGI->IOBase),0x85cc, XGIMMIOLONG(0x85cc))) ; --*/ -- /* XGI315 */ -- pXGI->cmdQueue_shareWP_only2D = ulXGITempRP; -- /* pXGI->pCQ_shareWritePort = &(pXGI->cmdQueue_shareWP_only2D); */ -- -- Volari_UpdateHwWP(ulXGITempRP) ; -- -- -- -- MMIO_OUT32(pXGI->IOBase, 0x85C0, pXGI->cmdQueueOffset) ; -- -- outXGIIDXREG(XGICR, 0x55, ulCR55) ; -- -- if(pXGI->Chipset == PCI_CHIP_XGIXG40) -- { -- Volari_Idle(pXGI); -- Volari_DisableDualPipe(pScrn) ; -- Volari_Idle(pXGI); -- -- } -- PDEBUG(ErrorF("Volari_InitCmdQueue() done.\n")) ; --} -- --static void --Volari_DisableDualPipe(ScrnInfoPtr pScrn) --{ -- XGIPtr pXGI = XGIPTR(pScrn) ; -- unsigned long ulTemp ; -- unsigned long ulValue = MMIO_IN32(pXGI->IOBase, 0x8240) ; -- ulValue |= 1 << 10 ; /* D[10] = 1, Disable Dual Pipe. */ -- -- ulTemp = Volari_GetSwWP() ; -- -- *(CARD32 *)(pXGI->cmdQueueBase+ulTemp) = (CARD32)BE_SWAP32(GR_SKPC_HEADER + 0x8240) ; -- *(CARD32 *)(pXGI->cmdQueueBase+ulTemp+4) = (CARD32)BE_SWAP32(ulValue) ; -- -- if( pXGI->Chipset == PCI_CHIP_XGIXG40 ) -- { -- *(CARD32 *)(pXGI->cmdQueueBase+ulTemp+8) = (CARD32)BE_SWAP32(GR_NIL_CMD) ; -- *(CARD32 *)(pXGI->cmdQueueBase+ulTemp+12) = (CARD32)BE_SWAP32(GR_NIL_CMD) ; -- -- ulTemp += 0x10 ; -- } -- else if( pXGI->Chipset == PCI_CHIP_XGIXG20 ) -- ulTemp += 0x08 ; -- -- ulTemp &= pXGI->cmdQueueSizeMask ; -- Volari_UpdateHwWP(ulTemp) ; --} -- --void --Volari_DisableAccelerator(ScrnInfoPtr pScrn) --{ -- XGIPtr pXGI = XGIPTR(pScrn) ; -- -- PDEBUG(ErrorF("Volari_DisableAccelerator(pScrn)\n")) ; -- -- Volari_Idle(pXGI); -- -- if( pXGI->TurboQueue ) -- { -- Volari_DisableCmdQueue(pScrn) ; -- } -- -- andXGIIDXREG(XGISR, 0x1E, -- ~(SR1E_ENABLE_3D_TRANSFORM_ENGINE -- | SR1E_ENABLE_2D -- | SR1E_ENABLE_3D_AGP_VERTEX_FETCH -- | SR1E_ENABLE_3D_COMMAND_PARSER -- | SR1E_ENABLE_3D)); --/* PDEBUG(ErrorF("Volari_DisableAccelerator(pScrn) Done, GBCount = %ld\n",GBCount)) ; */ --} -- --static void --Volari_DisableCmdQueue(ScrnInfoPtr pScrn) --{ -- XGIPtr pXGI = XGIPTR(pScrn) ; -- -- andXGIIDXREG(XGISR, 0x26, 0x0F) ; --} -- --void --Volari_InitializeAccelerator(ScrnInfoPtr pScrn) --{ -- XGIPtr pXGI = XGIPTR(pScrn); -- -- pXGI->DoColorExpand = FALSE; --} -- --Bool --Volari_AccelInit(ScreenPtr pScreen) --{ -- XAAInfoRecPtr infoPtr; -- ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; -- XGIPtr pXGI = XGIPTR(pScrn); -- int reservedFbSize; -- long UsableFbSize; -- unsigned char *AvailBufBase; -- BoxRec Avail; -- int i; -- -- -- Avail.x1 = 0; Avail.y1 = 0; Avail.x2 = 0; Avail.y2 = 0; -- -- PDEBUG1(ErrorF("Volari_AccelInit()\n" )) ; -- -- pXGI->AccelInfoPtr = infoPtr = XAACreateInfoRec(); -- if (!infoPtr) return FALSE; -- -- Volari_InitializeAccelerator(pScrn); -- -- infoPtr->Flags = LINEAR_FRAMEBUFFER | -- OFFSCREEN_PIXMAPS | -- PIXMAP_CACHE; -- -- /* sync */ -- infoPtr->Sync = Volari_Sync; -- -- if ((pScrn->bitsPerPixel != 8) && -- (pScrn->bitsPerPixel != 16) && -- (pScrn->bitsPerPixel != 32)) -- { -- return FALSE; -- } -- --#ifdef XGIG2_SCR2SCRCOPY -- /* BitBlt */ -- infoPtr->SetupForScreenToScreenCopy = Volari_SetupForScreenToScreenCopy; -- infoPtr->SubsequentScreenToScreenCopy = Volari_SubsequentScreenToScreenCopy; -- infoPtr->ScreenToScreenCopyFlags = NO_PLANEMASK | NO_TRANSPARENCY; --#endif -- --#ifdef XGIG2_SOLIDFILL -- /* solid fills */ -- infoPtr->SetupForSolidFill = Volari_SetupForSolidFill; -- infoPtr->SubsequentSolidFillRect = Volari_SubsequentSolidFillRect; -- infoPtr->SolidFillFlags = NO_PLANEMASK; --#endif -- --#ifdef XGIG2_8X8MONOPATFILL -- /* 8x8 mono pattern fill */ -- infoPtr->SetupForMono8x8PatternFill = Volari_SetupForMonoPatternFill; -- infoPtr->SubsequentMono8x8PatternFillRect = Volari_SubsequentMonoPatternFill; -- infoPtr->Mono8x8PatternFillFlags = -- NO_PLANEMASK | -- HARDWARE_PATTERN_SCREEN_ORIGIN | -- HARDWARE_PATTERN_PROGRAMMED_BITS | -- /* 2005/08/15 modified by jjtseng */ -- /* NO_TRANSPARENCY | */ -- /*~ jjtseng 2005/08/15 */ -- BIT_ORDER_IN_BYTE_MSBFIRST ; --#endif /* XGIG2_8X8MONOPATFILL */ -- -- /* init Frame Buffer Manager */ -- reservedFbSize = 0; -- if (pXGI->TurboQueue) -- { -- reservedFbSize += pXGI->cmdQueueSize ; -- } -- -- if (pXGI->HWCursor) -- { -- reservedFbSize += VOLARI_CURSOR_SHAPE_SIZE; -- } -- --#ifdef XGIG2_COLOREXPSCANLN -- reservedFbSize += (pXGI->ColorExpandBufferNumber * pXGI->PerColorExpandBufferSize); --#endif -- -- UsableFbSize = pXGI->FbMapSize - reservedFbSize; -- AvailBufBase = pXGI->FbBase + UsableFbSize; -- -- for (i = 0; i < pXGI->ColorExpandBufferNumber; i++) { -- const int base = i * pXGI->PerColorExpandBufferSize; -- -- pXGI->ColorExpandBufferAddr[i] = AvailBufBase + base; -- pXGI->ColorExpandBufferScreenOffset[i] = UsableFbSize + base; -- } -- --#ifdef XGIG2_IMAGEWRITE -- reservedFbSize += pXGI->ImageWriteBufferSize; -- UsableFbSize = pXGI->FbMapSize - reservedFbSize; -- pXGI->ImageWriteBufferAddr = AvailBufBase = pXGI->FbBase + UsableFbSize; -- infoPtr->ImageWriteRange = pXGI->ImageWriteBufferAddr; --#endif /* XGIG2_IMAGEWRITE */ -- -- Avail.x1 = 0; -- Avail.y1 = 0; -- --/* -- Avail.x2 = pScrn->displayWidth; -- -- ErrorF("FbDevExist=%s\n",FbDevExist?"TRUE":"FALSE"); -- -- if (FbDevExist) -- { -- if( UsableFbSize >= 8*1024*1024 ) -- { -- UsableFbSize = 8*1024*1024 ; -- } -- else -- { -- UsableFbSize = 4*1024*1024 ; -- } -- } -- -- PDEBUG1(ErrorF( "UsabelFbSize = %08lx\n", UsableFbSize )) ; -- Avail.y2 = UsableFbSize / pXGI->scrnOffset ; -- -- if ((unsigned long)Avail.y2 > 8192) -- { -- Avail.y2 = 8192 ; -- } --*/ -- -- UsableFbSize = pXGI->CursorOffset ; -- Avail.x1 = 0 ; -- Avail.y1 = 0 ; -- Avail.x2 = pScrn->displayWidth; -- Avail.y2 = UsableFbSize / pXGI->scrnOffset ; -- -- -- if ((unsigned long)Avail.y2 > 8192) -- { -- Avail.y2 = 8192 ; -- } -- -- -- xf86DrvMsg(pScrn->scrnIndex, X_INFO, -- "Usable FBSize = %08lx\n", UsableFbSize ) ; -- -- -- xf86DrvMsg(pScrn->scrnIndex, X_INFO, -- "Frame Buffer From (%d,%d) To (%d,%d)\n", -- Avail.x1, Avail.y1, Avail.x2, Avail.y2); -- -- xf86InitFBManager(pScreen, &Avail); -- -- return(XAAInit(pScreen, infoPtr)); -- --} -- --void --Volari_Sync(ScrnInfoPtr pScrn) --{ -- XGIPtr pXGI = XGIPTR(pScrn); -- -- PDEBUG1(ErrorF("Volari_Sync()\n")); -- pXGI->DoColorExpand = FALSE; -- Volari_Idle(pXGI); --} -- --static int xgiG2_ALUConv[] = --{ -- 0x00, /* dest = 0; 0, GXclear, 0 */ -- 0x88, /* dest &= src; DSa, GXand, 0x1 */ -- 0x44, /* dest = src & ~dest; SDna, GXandReverse, 0x2 */ -- 0xCC, /* dest = src; S, GXcopy, 0x3 */ -- 0x22, /* dest &= ~src; DSna, GXandInverted, 0x4 */ -- 0xAA, /* dest = dest; D, GXnoop, 0x5 */ -- 0x66, /* dest = ^src; DSx, GXxor, 0x6 */ -- 0xEE, /* dest |= src; DSo, GXor, 0x7 */ -- 0x11, /* dest = ~src & ~dest; DSon, GXnor, 0x8 */ -- 0x99, /* dest ^= ~src ; DSxn, GXequiv, 0x9 */ -- 0x55, /* dest = ~dest; Dn, GXInvert, 0xA */ -- 0xDD, /* dest = src|~dest ; SDno, GXorReverse, 0xB */ -- 0x33, /* dest = ~src; Sn, GXcopyInverted, 0xC */ -- 0xBB, /* dest |= ~src; DSno, GXorInverted, 0xD */ -- 0x77, /* dest = ~src|~dest; DSan, GXnand, 0xE */ -- 0xFF, /* dest = 0xFF; 1, GXset, 0xF */ --}; --/* same ROP but with Pattern as Source */ --static int xgiG2_PatALUConv[] = --{ -- 0x00, /* dest = 0; 0, GXclear, 0 */ -- 0xA0, /* dest &= src; DPa, GXand, 0x1 */ -- 0x50, /* dest = src & ~dest; PDna, GXandReverse, 0x2 */ -- 0xF0, /* dest = src; P, GXcopy, 0x3 */ -- 0x0A, /* dest &= ~src; DPna, GXandInverted, 0x4 */ -- 0xAA, /* dest = dest; D, GXnoop, 0x5 */ -- 0x5A, /* dest = ^src; DPx, GXxor, 0x6 */ -- 0xFA, /* dest |= src; DPo, GXor, 0x7 */ -- 0x05, /* dest = ~src & ~dest; DPon, GXnor, 0x8 */ -- 0xA5, /* dest ^= ~src ; DPxn, GXequiv, 0x9 */ -- 0x55, /* dest = ~dest; Dn, GXInvert, 0xA */ -- 0xF5, /* dest = src|~dest ; PDno, GXorReverse, 0xB */ -- 0x0F, /* dest = ~src; Pn, GXcopyInverted, 0xC */ -- 0xAF, /* dest |= ~src; DPno, GXorInverted, 0xD */ -- 0x5F, /* dest = ~src|~dest; DPan, GXnand, 0xE */ -- 0xFF, /* dest = 0xFF; 1, GXset, 0xF */ --}; -- --static void --Volari_SetupForScreenToScreenCopy( -- ScrnInfoPtr pScrn, -- int xdir, int ydir, int rop, -- unsigned int planemask, int trans_color) --{ -- XGIPtr pXGI = XGIPTR(pScrn); --#ifdef SHOW_XAAINFO -- XAAInfoRecPtr pXAA = XAAPTR(pScrn); --/* -- ErrorF("XAAInfoPtr->UsingPixmapCache = %s\n" -- "XAAInfoPtr->CanDoMono8x8 = %s\n" -- "XAAInfoPtr->CanDoColor8x8 = %s\n" -- "XAAInfoPtr->CachePixelGranularity = %d\n" -- "XAAInfoPtr->MaxCacheableTileWidth = %d\n" -- "XAAInfoPtr->MaxCacheableTileHeight = %d\n" -- "XAAInfoPtr->MaxCacheableStippleWidth = %d\n" -- "XAAInfoPtr->MaxCacheableStippleHeight = %d\n" -- "XAAInfoPtr->MonoPatternPitch = %d\n" -- "XAAInfoPtr->CacheWidthMono8x8Pattern = %d\n" -- "XAAInfoPtr->CacheHeightMono8x8Pattern = %d\n" -- "XAAInfoPtr->ColorPatternPitch = %d\n" -- "XAAInfoPtr->CacheWidthColor8x8Pattern = %d\n" -- "XAAInfoPtr->CacheHeightColor8x8Pattern = %d\n" -- "XAAInfoPtr->CacheColorExpandDensity = %d\n" -- "XAAInfoPtr->maxOffPixWidth = %d\n" -- "XAAInfoPtr->maxOffPixHeight= %d\n" -- "XAAInfoPtr->NeedToSync = %s\n" -- "\n", -- pXAA->UsingPixmapCache ? "True" : "False", -- pXAA->CanDoMono8x8 ? "True" : "False", -- pXAA->CanDoColor8x8 ? "True" : "False", -- pXAA->CachePixelGranularity, -- pXAA->MaxCacheableTileWidth, -- pXAA->MaxCacheableTileHeight, -- pXAA->MaxCacheableStippleWidth, -- pXAA->MaxCacheableStippleHeight, -- pXAA->MonoPatternPitch, -- pXAA->CacheWidthMono8x8Pattern, -- pXAA->CacheHeightMono8x8Pattern, -- pXAA->ColorPatternPitch, -- pXAA->CacheWidthColor8x8Pattern, -- pXAA->CacheHeightColor8x8Pattern, -- pXAA->CacheColorExpandDensity, -- pXAA->maxOffPixWidth, -- pXAA->maxOffPixHeight, -- pXAA->NeedToSync ? "True" : "False"); --*/ --#endif -- -- PDEBUG1(ErrorF("Setup ScreenCopy(%d, %d, 0x%x, 0x%x, 0x%x)\n", -- xdir, ydir, rop, planemask, trans_color)); -- -- Volari_ResetCmd ; -- GuardBand(0x20 * Alignment); -- Volari_SetupDSTColorDepth(pXGI->DstColor); -- Volari_SetupSRCPitch(pXGI->scrnOffset) ; -- Volari_SetupDSTRect(pXGI->scrnOffset, Dst_Hight) ; -- Volari_SetupROP(xgiG2_ALUConv[rop]) ; --} -- --static void --Volari_SubsequentScreenToScreenCopy( -- ScrnInfoPtr pScrn, -- int src_x, int src_y, -- int dst_x, int dst_y, -- int width, int height) --{ -- XGIPtr pXGI = XGIPTR(pScrn); -- long srcbase, dstbase; --/* -- PDEBUG1(ErrorF("Subsequent ScreenCopy(%d,%d, %d,%d, %d,%d)\n", -- src_x, src_y, -- dst_x, dst_y, -- width, height)); --*/ -- srcbase=dstbase=0; -- if (src_y >= 2048) -- { -- srcbase=pXGI->scrnOffset*src_y; -- src_y=0; -- } -- if (dst_y >= pScrn->virtualY) -- { -- dstbase=pXGI->scrnOffset*dst_y; -- dst_y=0; -- } -- /* -- PDEBUG1(ErrorF("SrcBase = %08lX DstBase = %08lX\n",srcbase,dstbase)) ; -- PDEBUG1(ErrorF("SrcX = %08lX SrcY = %08lX\n",src_x,src_y)) ; -- PDEBUG1(ErrorF("DstX = %08lX DstY = %08lX\n",dst_x,dst_y)) ; --*/ -- GuardBand(0x30 * Alignment); -- Volari_SetupSRCBase(srcbase); -- Volari_SetupDSTBase(dstbase); -- Volari_SetupSRCXY(src_x,src_y) ; -- Volari_SetupDSTXY(dst_x,dst_y) ; -- Volari_SetupRect(width, height) ; -- Volari_DoCMD ; --} -- --static void --Volari_SetupForSolidFill(ScrnInfoPtr pScrn, -- int color, int rop, unsigned int planemask) --{ -- XGIPtr pXGI = XGIPTR(pScrn); -- -- PDEBUG1(ErrorF("Volari_SetupForSolidFill()\n")) ; -- PDEBUG1(ErrorF("Color = #%08lX ",color)) ; -- PDEBUG1(ErrorF("DstPitch = #%04lX ",(pXGI->scrnOffset))) ; -- PDEBUG1(ErrorF("\n")) ; -- -- Volari_ResetCmd ; -- GuardBand(0x28 * Alignment); -- Volari_SetupPATFG(color) ; -- Volari_SetupDSTRect(pXGI->scrnOffset, Dst_Hight) ; -- Volari_SetupDSTColorDepth(XGIPTR(pScrn)->DstColor) ; -- Volari_SetupROP(xgiG2_PatALUConv[rop]) ; -- Volari_SetupCMDFlag(PATFG | BITBLT) ; --} -- --static void --Volari_SubsequentSolidFillRect( -- ScrnInfoPtr pScrn, -- int x, int y, -- int width, int height) --{ -- XGIPtr pXGI = XGIPTR(pScrn); -- unsigned long dstbase = 0 ; -- -- PDEBUG1(ErrorF("Subsequent SolidFillRect(%d, %d, %d, %d)\n", -- x, y, width, height)); -- -- dstbase=0; -- if (y>=2048) -- { -- dstbase=pXGI->scrnOffset*y; -- y=0; -- } -- -- GuardBand(0x20 * Alignment); -- Volari_SetupDSTBase(dstbase) ; -- Volari_SetupDSTXY(x,y) ; -- Volari_SetupRect(width,height) ; -- Volari_DoCMD ; -- --} -- --static void --Volari_SetupForMonoPatternFill(ScrnInfoPtr pScrn, -- int pat0, int pat1, -- int fg, int bg, -- int rop, unsigned int planemask) --{ -- XGIPtr pXGI = XGIPTR(pScrn); -- -- PDEBUG1(ErrorF("Setup MonoPatFill(0x%x,0x%x, 0x%x,0x%x, 0x%x, 0x%x)\n", -- pat0, pat1, fg, bg, rop, planemask)); -- -- Volari_ResetCmd ; -- GuardBand(0x40 * Alignment); -- Volari_SetupDSTRect(pXGI->scrnOffset, Dst_Hight) ; -- Volari_SetupMONOPAT0(pat0) ; -- Volari_SetupMONOPAT1(pat1) ; -- Volari_SetupPATFG(fg) ; -- Volari_SetupPATBG(bg) ; -- Volari_SetupROP(xgiG2_PatALUConv[rop]) ; -- Volari_SetupDSTColorDepth(pXGI->DstColor) ; -- Volari_SetupCMDFlag(PATMONO | BITBLT) ; --} -- --static void --Volari_SubsequentMonoPatternFill(ScrnInfoPtr pScrn, -- int patx, int paty, -- int x, int y, int w, int h) --{ -- XGIPtr pXGI = XGIPTR(pScrn); -- long dstbase; -- -- PDEBUG1(ErrorF("Subsequent MonoPatFill(0x%x,0x%x, %d,%d, %d,%d)\n", -- patx, paty, x, y, w, h)); -- dstbase=0; -- if (y>=2048) -- { -- dstbase=pXGI->scrnOffset*y; -- y=0; -- } -- -- GuardBand(0x20 * Alignment); -- Volari_SetupDSTBase(dstbase) ; -- Volari_SetupDSTXY(x,y) ; -- Volari_SetupRect(w,h) ; -- Volari_DoCMD ; -- /*Volari_Idle(pXGI)*/; --} -- --/************************************************************************/ -- -+/* -+ * -+ * Copyright (C) 1998, 1999 by Alan Hourihane, Wigan, England. -+ * Parts Copyright (C) 2001-2004 Thomas Winischhofer, Vienna, Austria. -+ * -+ * Licensed under the following terms: -+ * -+ * Permission to use, copy, modify, distribute, and sell this software and its -+ * documentation for any purpose is hereby granted without fee, provided that -+ * the above copyright notice appears in all copies and that both that copyright -+ * notice and this permission notice appear in supporting documentation, and -+ * and that the name of the copyright holder not be used in advertising -+ * or publicity pertaining to distribution of the software without specific, -+ * written prior permission. The copyright holder makes no representations -+ * about the suitability of this software for any purpose. It is provided -+ * "as is" without expressed or implied warranty. -+ * -+ * THE COPYRIGHT HOLDER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, -+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO -+ * EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY SPECIAL, INDIRECT OR -+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, -+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER -+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -+ * PERFORMANCE OF THIS SOFTWARE. -+ * -+ * Authors: Alan Hourihane , -+ * Mike Chapman , -+ * Juanjo Santamarta , -+ * Mitani Hiroshi , -+ * David Thomas , -+ * Thomas Winischhofer . -+ */ -+ -+#ifdef HAVE_CONFIG_H -+#include "config.h" -+#endif -+ -+#include "xf86.h" -+#include "xf86_OSproc.h" -+ -+#include "xf86PciInfo.h" -+#include "xf86Pci.h" -+ -+#include -+#include -+ -+#include "xgi_accel.h" -+#include "xgi_regs.h" -+#include "xgi.h" -+#include "vb_def.h" -+ -+#include "xaarop.h" -+#include -+#include -+#include -+ -+/*************************************************************************/ -+ -+void Volari_Sync(ScrnInfoPtr pScrn); -+ -+static void Volari_SetupForScreenToScreenCopy(ScrnInfoPtr pScrn, -+ int xdir, int ydir, int rop, -+ unsigned int planemask, int trans_color); -+static void Volari_SubsequentScreenToScreenCopy(ScrnInfoPtr pScrn, -+ int x1, int y1, int x2, int y2, -+ int width, int height); -+static void Volari_SetupForSolidFill(ScrnInfoPtr pScrn, int color, -+ int rop, unsigned int planemask); -+static void Volari_SubsequentSolidFillRect(ScrnInfoPtr pScrn, -+ int x, int y, int w, int h); -+static void Volari_SetupForMonoPatternFill(ScrnInfoPtr pScrn, -+ int patx, int paty, int fg, int bg, -+ int rop, unsigned int planemask); -+static void Volari_SubsequentMonoPatternFill(ScrnInfoPtr pScrn, -+ int patx, int paty, -+ int x, int y, int w, int h); -+ -+void Volari_EnableAccelerator(ScrnInfoPtr pScrn) ; -+static void Volari_InitCmdQueue(ScrnInfoPtr pScrn) ; -+static void Volari_DisableDualPipe(ScrnInfoPtr pScrn) ; -+static void Volari_DisableCmdQueue(ScrnInfoPtr pScrn) ; -+ -+/* Jong 01/07/2008; force to disable 2D */ -+extern Bool ForceToDisable2DEngine(ScrnInfoPtr pScrn); -+ -+extern int FbDevExist; -+ -+#if X_BYTE_ORDER == X_BIG_ENDIAN -+static CARD32 BE_SWAP32 (CARD32 val) -+{ -+ if (CurrentColorDepth == 8) -+ return ((((val) & 0x000000ff) << 24) | \ -+ (((val) & 0x0000ff00) << 8) | \ -+ (((val) & 0x00ff0000) >> 8) | \ -+ (((val) & 0xff000000) >> 24)); -+ if (CurrentColorDepth == 24) -+ return val; -+ if (CurrentColorDepth == 16) -+ return ((((val) & 0x0000ffff) << 16) | \ -+ (((val) & 0xffff0000) >> 16)); -+} -+#else -+static CARD32 BE_SWAP32 (CARD32 val) -+{ -+ return val; -+} -+#endif -+ -+ -+#ifdef DEBUG -+static void dump_cq_read_pointer(unsigned int cqrp) -+{ -+ static const char *const field_name[8] = { -+ "all idle", -+ "hardware queues empty", -+ "2D idle", -+ "3D idle", -+ "hardware command queue empty", -+ "2D queue empty", -+ "3D queue empty", -+ "software command queue empty", -+ }; -+ unsigned i; -+ -+ xf86DrvMsg(0, X_INFO, "IO(0x85CC) = 0x%08x\n", cqrp); -+ for (i = 31; i > 23; i--) { -+ if ((cqrp & (1U << i)) != 0) { -+ xf86DrvMsg(0, X_INFO, " %s\n", field_name[31 - i]); -+ } -+ } -+} -+#endif /* DEBUG */ -+ -+ -+void Volari_SetDefaultIdleWait(XGIPtr pXGI, unsigned HDisplay, -+ unsigned depth) -+{ -+ static const unsigned wait_table[5][4] = { -+ { 1, 1, 1, 1 }, -+ { 65535, 1, 1000, 3000 }, -+ { 65535, 160, 1200, 4000 }, -+ { 65535, 200, 1600, 6000 }, -+ { 65535, 500, 2000, 8000 } -+ }; -+ -+ if (pXGI->Chipset == PCI_CHIP_XGIXG20) { -+ unsigned i; -+ -+ switch (HDisplay) { -+ case 640: i = 1; break; -+ case 800: i = 2; break; -+ case 1024: i = 3; break; -+ case 1280: i = 4; break; -+ default: i = 0; break; -+ } -+ -+ pXGI->idle_wait_count = wait_table[i][3 & (depth / 8)]; -+ } -+ else { -+ pXGI->idle_wait_count = 65535; -+ } -+} -+ -+void Volari_Idle(XGIPtr pXGI) -+{ -+ int i; -+#ifdef DEBUG -+ unsigned int last_cqrp = 0; -+#endif /* DEBUG */ -+ -+ do { -+ int bIdle = 0; -+ unsigned int cqrp; -+ -+ for (i = 0; i < pXGI->idle_wait_count; i++) { -+ cqrp = MMIO_IN32(pXGI->IOBase, 0x85CC); -+ if (cqrp & IDLE_ALL) { -+ bIdle = 1; -+ break; -+ } -+ } -+ -+ if (bIdle) -+ break; -+ -+#ifdef DEBUG -+ if (last_cqrp != cqrp) { -+ dump_cq_read_pointer(cqrp); -+ last_cqrp = cqrp; -+ } -+ -+ sleep(1); -+#endif /* DEBUG */ -+ -+ if (pXGI->Chipset == PCI_CHIP_XGIXG20) -+ usleep(1); -+ } while (1); -+} -+ -+ -+void -+Volari_EnableAccelerator(ScrnInfoPtr pScrn) -+{ -+ XGIPtr pXGI = XGIPTR(pScrn); -+ -+ PDEBUG(ErrorF("Volari_EnableAccelerator()\n")) ; -+ -+ switch (pXGI->Chipset) { -+ case PCI_CHIP_XGIXG20: -+ case PCI_CHIP_XGIXG21: /* Jong 01/07/2008; support new XG21 */ -+ case PCI_CHIP_XGIXG27: -+ case PCI_CHIP_XGIXG40: -+ default: -+ orXGIIDXREG(XGISR, 0x1E, -+ SR1E_ENABLE_3D_TRANSFORM_ENGINE -+ | SR1E_ENABLE_2D -+ | SR1E_ENABLE_3D_AGP_VERTEX_FETCH -+ | SR1E_ENABLE_3D_COMMAND_PARSER -+ | SR1E_ENABLE_3D); -+ -+ /* Jong 01/07/2008; force to disable 2D */ -+ if(pXGI->Chipset == PCI_CHIP_XGIXG21) -+ { -+ if(ForceToDisable2DEngine(pScrn)) -+ { -+ andXGIIDXREG(XGISR, 0x1E, 0xBF) ; -+ } -+ } -+ -+ break; -+ } -+ -+ -+ if( pXGI->TurboQueue ) -+ { -+ Volari_InitCmdQueue(pScrn) ; -+ } -+} -+ -+static void -+Volari_InitCmdQueue(ScrnInfoPtr pScrn) -+{ -+ XGIPtr pXGI = XGIPTR(pScrn); -+ unsigned long ulXGITempRP ; -+ unsigned long ulCR55 ; -+ unsigned long ulSR26 ; -+ unsigned long temp ; -+ /* unsigned long ulFlag = 0 ; */ -+/* -+ PDEBUG(ErrorF("Volari_InitCmdQueue()\n")); -+ PDEBUG(ErrorF( "pXGI->IOBase = 0x%08lX, [%04X] = 0x%08lX\n",(unsigned long)(pXGI->IOBase),0x85c0, XGIMMIOLONG(0x85c0))) ; -+ PDEBUG(ErrorF( "pXGI->IOBase = 0x%08lX, [%04X] = 0x%08lX\n",(unsigned long)(pXGI->IOBase),0x85c4, XGIMMIOLONG(0x85c4))) ; -+ PDEBUG(ErrorF( "pXGI->IOBase = 0x%08lX, [%04X] = 0x%08lX\n",(unsigned long)(pXGI->IOBase),0x85c8, XGIMMIOLONG(0x85c8))) ; -+ PDEBUG(ErrorF( "pXGI->IOBase = 0x%08lX, [%04X] = 0x%08lX\n",(unsigned long)(pXGI->IOBase),0x85cc, XGIMMIOLONG(0x85cc))) ; -+*/ -+ inXGIIDXREG(XGICR, 0x55, ulCR55) ; -+ andXGIIDXREG(XGICR, 0x55, 0x33) ; -+ orXGIIDXREG(XGISR, 0x26, 1) ; /* reset cmd queue */ -+ -+ w_port = Volari_GetSwWP() ; /* GuardBand() Init */ -+ r_port = Volari_GetHwRP() ; -+ -+ if(( pXGI->Chipset == PCI_CHIP_XGIXG20 )||( pXGI->Chipset == PCI_CHIP_XGIXG21 )||( pXGI->Chipset == PCI_CHIP_XGIXG27 )) -+ { -+ Alignment = 1 ; /* 64 bits */ -+ -+ switch(pXGI->cmdQueueSize) -+ { -+ case 64*1024: -+ ulSR26 = 0x40 + 0x00 ; -+ break ; -+ case 128*1024: -+ ulSR26 = 0x40 + 0x04 ; -+ break ; -+ default: -+ /* reset the command queue information */ -+ -+ pXGI->cmdQueueSize = 128*1024 ; /* reset the command queue */ -+ pXGI->cmdQueueSizeMask = pXGI->cmdQueueSize - 1 ; -+ -+ /* Jong 09/18/2007; bug fixing for ??? */ -+ if( FbDevExist && (pXGI->Chipset != PCI_CHIP_XGIXG20 ) && (pXGI->Chipset != PCI_CHIP_XGIXG21 ) && (pXGI->Chipset != PCI_CHIP_XGIXG27 ) ) -+ { -+ if( pScrn->videoRam < 8*1024 ) -+ { -+ pXGI->cmdQueueOffset = 4*1024*1024 - pXGI->cmdQueueSize ; -+ } -+ else if( pScrn->videoRam < 16*1024 ) -+ { -+ pXGI->cmdQueueOffset = 8*1024*1024 - pXGI->cmdQueueSize ; -+ } -+ else -+ { -+ pXGI->cmdQueueOffset = 13*1024*1024 - pXGI->cmdQueueSize ; -+ } -+ } -+ else -+ { -+ pXGI->cmdQueueOffset = (pScrn->videoRam)*1024 - pXGI->cmdQueueSize ; -+ } -+ -+ pXGI->cmdQueueLen = 0 ; -+ pXGI->cmdQueueLenMin = 0x200 ; -+ pXGI->cmdQueueLenMax = pXGI->cmdQueueSize - pXGI->cmdQueueLenMin ; -+ -+ ulSR26 = 0x40 ; -+ break ; -+ } -+ } -+ else -+ { -+ Alignment = 2 ; /* 128 bits */ -+ -+ switch(pXGI->cmdQueueSize) -+ { -+ case 512*1024: -+ ulSR26 = 0x40 + 0x00 ; -+ break ; -+ case 1024*1024: -+ ulSR26 = 0x40 + 0x04 ; -+ break ; -+ case 2*1024*1024: -+ ulSR26 = 0x40 + 0x08 ; -+ break ; -+ case 4*1024*1024: -+ ulSR26 = 0x40 + 0x0C ; -+ break ; -+ default: -+ /* reset the command queue information */ -+ -+ pXGI->cmdQueueSize = 512*1024 ; /* reset the command queue */ -+ pXGI->cmdQueueSizeMask = pXGI->cmdQueueSize - 1 ; -+ -+ /* Jong 09/18/2007; bug fixing for ??? */ -+ if( FbDevExist && (pXGI->Chipset != PCI_CHIP_XGIXG20 ) && (pXGI->Chipset != PCI_CHIP_XGIXG21 ) && (pXGI->Chipset != PCI_CHIP_XGIXG27 )) -+ { -+ if( pScrn->videoRam < 8*1024 ) -+ { -+ pXGI->cmdQueueOffset = 4*1024*1024 - pXGI->cmdQueueSize ; -+ } -+ else if( pScrn->videoRam < 16*1024 ) -+ { -+ pXGI->cmdQueueOffset = 8*1024*1024 - pXGI->cmdQueueSize ; -+ } -+ else -+ { -+ pXGI->cmdQueueOffset = 13*1024*1024 - pXGI->cmdQueueSize ; -+ } -+ } -+ else -+ { -+ pXGI->cmdQueueOffset = (pScrn->videoRam)*1024 - pXGI->cmdQueueSize ; -+ } -+ -+ pXGI->cmdQueueLen = 0 ; -+ pXGI->cmdQueueLenMin = 0x200 ; -+ pXGI->cmdQueueLenMax = pXGI->cmdQueueSize - pXGI->cmdQueueLenMin ; -+ -+ ulSR26 = 0x40 ; -+ break ; -+ } -+ } -+ -+ pXGI->CursorOffset = pXGI->cmdQueueOffset - VOLARI_CURSOR_SHAPE_SIZE; -+ -+ temp = (unsigned long)pXGI->FbBase ; -+ temp += pXGI->cmdQueueOffset ; -+ pXGI->cmdQueueBase = (unsigned char *)temp ; -+/* -+ PDEBUG(ErrorF( "pXGI->FbBase = 0x%lX\n", pXGI->FbBase )) ; -+ PDEBUG(ErrorF( "pXGI->cmdQueueOffset = 0x%lX\n", pXGI->cmdQueueOffset )) ; -+ PDEBUG(ErrorF( "pXGI->cmdQueueBase = 0x%lX\n", pXGI->cmdQueueBase )) ; -+*/ -+ outXGIIDXREG(XGISR, 0x26, ulSR26) ; -+ -+ ulXGITempRP=Volari_GetHwRP() ; -+/* -+ PDEBUG(ErrorF( "pXGI->IOBase = 0x%08lX, [%04X] = 0x%08lX\n",(unsigned long)(pXGI->IOBase),0x85c0, XGIMMIOLONG(0x85c0))) ; -+ PDEBUG(ErrorF( "pXGI->IOBase = 0x%08lX, [%04X] = 0x%08lX\n",(unsigned long)(pXGI->IOBase),0x85c4, XGIMMIOLONG(0x85c4))) ; -+ PDEBUG(ErrorF( "pXGI->IOBase = 0x%08lX, [%04X] = 0x%08lX\n",(unsigned long)(pXGI->IOBase),0x85c8, XGIMMIOLONG(0x85c8))) ; -+ PDEBUG(ErrorF( "pXGI->IOBase = 0x%08lX, [%04X] = 0x%08lX\n",(unsigned long)(pXGI->IOBase),0x85cc, XGIMMIOLONG(0x85cc))) ; -+*/ -+ /* XGI315 */ -+ pXGI->cmdQueue_shareWP_only2D = ulXGITempRP; -+ /* pXGI->pCQ_shareWritePort = &(pXGI->cmdQueue_shareWP_only2D); */ -+ -+ Volari_UpdateHwWP(ulXGITempRP) ; -+ -+ -+ -+ MMIO_OUT32(pXGI->IOBase, 0x85C0, pXGI->cmdQueueOffset) ; -+ -+ outXGIIDXREG(XGICR, 0x55, ulCR55) ; -+ -+ if(pXGI->Chipset == PCI_CHIP_XGIXG40) -+ { -+ Volari_Idle(pXGI); -+ Volari_DisableDualPipe(pScrn) ; -+ Volari_Idle(pXGI); -+ -+ } -+ PDEBUG(ErrorF("Volari_InitCmdQueue() done.\n")) ; -+} -+ -+static void -+Volari_DisableDualPipe(ScrnInfoPtr pScrn) -+{ -+ XGIPtr pXGI = XGIPTR(pScrn) ; -+ unsigned long ulTemp ; -+ unsigned long ulValue = MMIO_IN32(pXGI->IOBase, 0x8240) ; -+ ulValue |= 1 << 10 ; /* D[10] = 1, Disable Dual Pipe. */ -+ -+ ulTemp = Volari_GetSwWP() ; -+ -+ *(CARD32 *)(pXGI->cmdQueueBase+ulTemp) = (CARD32)BE_SWAP32(GR_SKPC_HEADER + 0x8240) ; -+ *(CARD32 *)(pXGI->cmdQueueBase+ulTemp+4) = (CARD32)BE_SWAP32(ulValue) ; -+ -+ if( pXGI->Chipset == PCI_CHIP_XGIXG40 ) -+ { -+ *(CARD32 *)(pXGI->cmdQueueBase+ulTemp+8) = (CARD32)BE_SWAP32(GR_NIL_CMD) ; -+ *(CARD32 *)(pXGI->cmdQueueBase+ulTemp+12) = (CARD32)BE_SWAP32(GR_NIL_CMD) ; -+ -+ ulTemp += 0x10 ; -+ } -+ else if(( pXGI->Chipset == PCI_CHIP_XGIXG20 ) || ( pXGI->Chipset == PCI_CHIP_XGIXG21 ) || ( pXGI->Chipset == PCI_CHIP_XGIXG27 )) -+ ulTemp += 0x08 ; -+ -+ ulTemp &= pXGI->cmdQueueSizeMask ; -+ Volari_UpdateHwWP(ulTemp) ; -+} -+ -+void -+Volari_DisableAccelerator(ScrnInfoPtr pScrn) -+{ -+ XGIPtr pXGI = XGIPTR(pScrn) ; -+ -+ PDEBUG(ErrorF("Volari_DisableAccelerator(pScrn)\n")) ; -+ -+ Volari_Idle(pXGI); -+ -+ if( pXGI->TurboQueue ) -+ { -+ Volari_DisableCmdQueue(pScrn) ; -+ } -+ -+ andXGIIDXREG(XGISR, 0x1E, -+ ~(SR1E_ENABLE_3D_TRANSFORM_ENGINE -+ | SR1E_ENABLE_2D -+ | SR1E_ENABLE_3D_AGP_VERTEX_FETCH -+ | SR1E_ENABLE_3D_COMMAND_PARSER -+ | SR1E_ENABLE_3D)); -+/* PDEBUG(ErrorF("Volari_DisableAccelerator(pScrn) Done, GBCount = %ld\n",GBCount)) ; */ -+} -+ -+static void -+Volari_DisableCmdQueue(ScrnInfoPtr pScrn) -+{ -+ XGIPtr pXGI = XGIPTR(pScrn) ; -+ -+ andXGIIDXREG(XGISR, 0x26, 0x0F) ; -+} -+ -+void -+Volari_InitializeAccelerator(ScrnInfoPtr pScrn) -+{ -+ XGIPtr pXGI = XGIPTR(pScrn); -+ -+ pXGI->DoColorExpand = FALSE; -+} -+ -+Bool -+Volari_AccelInit(ScreenPtr pScreen) -+{ -+ XAAInfoRecPtr infoPtr; -+ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; -+ XGIPtr pXGI = XGIPTR(pScrn); -+ int reservedFbSize; -+ long UsableFbSize; -+ unsigned char *AvailBufBase; -+ BoxRec Avail; -+ int i; -+ -+ -+ Avail.x1 = 0; Avail.y1 = 0; Avail.x2 = 0; Avail.y2 = 0; -+ -+ PDEBUG1(ErrorF("Volari_AccelInit()\n" )) ; -+ -+ pXGI->AccelInfoPtr = infoPtr = XAACreateInfoRec(); -+ if (!infoPtr) return FALSE; -+ -+ Volari_InitializeAccelerator(pScrn); -+ -+ infoPtr->Flags = LINEAR_FRAMEBUFFER | -+ OFFSCREEN_PIXMAPS | -+ PIXMAP_CACHE; -+ -+ /* sync */ -+ infoPtr->Sync = Volari_Sync; -+ -+ if ((pScrn->bitsPerPixel != 8) && -+ (pScrn->bitsPerPixel != 16) && -+ (pScrn->bitsPerPixel != 32)) -+ { -+ return FALSE; -+ } -+ -+ /* Jong 01/07/2008; force to disable 2D based on SR3A[6] for XG21 */ -+ if( !((pXGI->Chipset == PCI_CHIP_XGIXG21) && ForceToDisable2DEngine(pScrn)) ) -+ { -+#ifdef XGIG2_SCR2SCRCOPY -+ /* BitBlt */ -+ /* Jong 08/24/2007; cause an extra rectangle drawing at top-left corner while clicking "Computer" on Suse SP1 (Xorg6.9.0) */ -+ if(pScrn->bitsPerPixel != 8) -+ { -+ infoPtr->SetupForScreenToScreenCopy = Volari_SetupForScreenToScreenCopy; -+ infoPtr->SubsequentScreenToScreenCopy = Volari_SubsequentScreenToScreenCopy; -+ infoPtr->ScreenToScreenCopyFlags = NO_PLANEMASK | NO_TRANSPARENCY; -+ } -+#endif -+ -+#ifdef XGIG2_SOLIDFILL -+ /* solid fills */ -+ infoPtr->SetupForSolidFill = Volari_SetupForSolidFill; -+ infoPtr->SubsequentSolidFillRect = Volari_SubsequentSolidFillRect; -+ infoPtr->SolidFillFlags = NO_PLANEMASK; -+#endif -+ -+#ifdef XGIG2_8X8MONOPATFILL -+ /* 8x8 mono pattern fill */ -+ infoPtr->SetupForMono8x8PatternFill = Volari_SetupForMonoPatternFill; -+ infoPtr->SubsequentMono8x8PatternFillRect = Volari_SubsequentMonoPatternFill; -+ infoPtr->Mono8x8PatternFillFlags = -+ NO_PLANEMASK | -+ HARDWARE_PATTERN_SCREEN_ORIGIN | -+ HARDWARE_PATTERN_PROGRAMMED_BITS | -+ /* 2005/08/15 modified by jjtseng */ -+ /* NO_TRANSPARENCY | */ -+ /*~ jjtseng 2005/08/15 */ -+ BIT_ORDER_IN_BYTE_MSBFIRST ; -+#endif /* XGIG2_8X8MONOPATFILL */ -+ } -+ -+ /* init Frame Buffer Manager */ -+ reservedFbSize = 0; -+ if (pXGI->TurboQueue) -+ { -+ reservedFbSize += pXGI->cmdQueueSize ; -+ } -+ -+ if (pXGI->HWCursor) -+ { -+ reservedFbSize += VOLARI_CURSOR_SHAPE_SIZE; -+ } -+ -+#ifdef XGIG2_COLOREXPSCANLN -+ reservedFbSize += (pXGI->ColorExpandBufferNumber * pXGI->PerColorExpandBufferSize); -+#endif -+ -+ UsableFbSize = pXGI->FbMapSize - reservedFbSize; -+ AvailBufBase = pXGI->FbBase + UsableFbSize; -+ -+ for (i = 0; i < pXGI->ColorExpandBufferNumber; i++) { -+ const int base = i * pXGI->PerColorExpandBufferSize; -+ -+ pXGI->ColorExpandBufferAddr[i] = AvailBufBase + base; -+ pXGI->ColorExpandBufferScreenOffset[i] = UsableFbSize + base; -+ } -+ -+#ifdef XGIG2_IMAGEWRITE -+ reservedFbSize += pXGI->ImageWriteBufferSize; -+ UsableFbSize = pXGI->FbMapSize - reservedFbSize; -+ pXGI->ImageWriteBufferAddr = AvailBufBase = pXGI->FbBase + UsableFbSize; -+ infoPtr->ImageWriteRange = pXGI->ImageWriteBufferAddr; -+#endif /* XGIG2_IMAGEWRITE */ -+ -+ Avail.x1 = 0; -+ Avail.y1 = 0; -+ -+/* -+ Avail.x2 = pScrn->displayWidth; -+ -+ ErrorF("FbDevExist=%s\n",FbDevExist?"TRUE":"FALSE"); -+ -+ if( FbDevExist && (pXGI->Chipset != PCI_CHIP_XGIXG20 ) && (pXGI->Chipset != PCI_CHIP_XGIXG27 ) ) -+ { -+ if( UsableFbSize >= 8*1024*1024 ) -+ { -+ UsableFbSize = 8*1024*1024 ; -+ } -+ else -+ { -+ UsableFbSize = 4*1024*1024 ; -+ } -+ } -+ -+ PDEBUG1(ErrorF( "UsabelFbSize = %08lx\n", UsableFbSize )) ; -+ Avail.y2 = UsableFbSize / pXGI->scrnOffset ; -+ -+ if ((unsigned long)Avail.y2 > 8192) -+ { -+ Avail.y2 = 8192 ; -+ } -+*/ -+ -+ UsableFbSize = pXGI->CursorOffset ; -+ Avail.x1 = 0 ; -+ Avail.y1 = 0 ; -+ Avail.x2 = pScrn->displayWidth; -+ Avail.y2 = UsableFbSize / pXGI->scrnOffset ; -+ -+ -+ if ((unsigned long)Avail.y2 > 8192) -+ { -+ Avail.y2 = 8192 ; -+ } -+ -+ -+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, -+ "Usable FBSize = %08lx\n", UsableFbSize ) ; -+ -+ -+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, -+ "Frame Buffer From (%d,%d) To (%d,%d)\n", -+ Avail.x1, Avail.y1, Avail.x2, Avail.y2); -+ -+ xf86InitFBManager(pScreen, &Avail); -+ -+ return(XAAInit(pScreen, infoPtr)); -+ -+} -+ -+void -+Volari_Sync(ScrnInfoPtr pScrn) -+{ -+ XGIPtr pXGI = XGIPTR(pScrn); -+ -+ PDEBUG1(ErrorF("Volari_Sync()\n")); -+ pXGI->DoColorExpand = FALSE; -+ Volari_Idle(pXGI); -+} -+ -+static int xgiG2_ALUConv[] = -+{ -+ 0x00, /* dest = 0; 0, GXclear, 0 */ -+ 0x88, /* dest &= src; DSa, GXand, 0x1 */ -+ 0x44, /* dest = src & ~dest; SDna, GXandReverse, 0x2 */ -+ 0xCC, /* dest = src; S, GXcopy, 0x3 */ -+ 0x22, /* dest &= ~src; DSna, GXandInverted, 0x4 */ -+ 0xAA, /* dest = dest; D, GXnoop, 0x5 */ -+ 0x66, /* dest = ^src; DSx, GXxor, 0x6 */ -+ 0xEE, /* dest |= src; DSo, GXor, 0x7 */ -+ 0x11, /* dest = ~src & ~dest; DSon, GXnor, 0x8 */ -+ 0x99, /* dest ^= ~src ; DSxn, GXequiv, 0x9 */ -+ 0x55, /* dest = ~dest; Dn, GXInvert, 0xA */ -+ 0xDD, /* dest = src|~dest ; SDno, GXorReverse, 0xB */ -+ 0x33, /* dest = ~src; Sn, GXcopyInverted, 0xC */ -+ 0xBB, /* dest |= ~src; DSno, GXorInverted, 0xD */ -+ 0x77, /* dest = ~src|~dest; DSan, GXnand, 0xE */ -+ 0xFF, /* dest = 0xFF; 1, GXset, 0xF */ -+}; -+/* same ROP but with Pattern as Source */ -+static int xgiG2_PatALUConv[] = -+{ -+ 0x00, /* dest = 0; 0, GXclear, 0 */ -+ 0xA0, /* dest &= src; DPa, GXand, 0x1 */ -+ 0x50, /* dest = src & ~dest; PDna, GXandReverse, 0x2 */ -+ 0xF0, /* dest = src; P, GXcopy, 0x3 */ -+ 0x0A, /* dest &= ~src; DPna, GXandInverted, 0x4 */ -+ 0xAA, /* dest = dest; D, GXnoop, 0x5 */ -+ 0x5A, /* dest = ^src; DPx, GXxor, 0x6 */ -+ 0xFA, /* dest |= src; DPo, GXor, 0x7 */ -+ 0x05, /* dest = ~src & ~dest; DPon, GXnor, 0x8 */ -+ 0xA5, /* dest ^= ~src ; DPxn, GXequiv, 0x9 */ -+ 0x55, /* dest = ~dest; Dn, GXInvert, 0xA */ -+ 0xF5, /* dest = src|~dest ; PDno, GXorReverse, 0xB */ -+ 0x0F, /* dest = ~src; Pn, GXcopyInverted, 0xC */ -+ 0xAF, /* dest |= ~src; DPno, GXorInverted, 0xD */ -+ 0x5F, /* dest = ~src|~dest; DPan, GXnand, 0xE */ -+ 0xFF, /* dest = 0xFF; 1, GXset, 0xF */ -+}; -+ -+static void -+Volari_SetupForScreenToScreenCopy( -+ ScrnInfoPtr pScrn, -+ int xdir, int ydir, int rop, -+ unsigned int planemask, int trans_color) -+{ -+ XGIPtr pXGI = XGIPTR(pScrn); -+#ifdef SHOW_XAAINFO -+ XAAInfoRecPtr pXAA = XAAPTR(pScrn); -+/* -+ ErrorF("XAAInfoPtr->UsingPixmapCache = %s\n" -+ "XAAInfoPtr->CanDoMono8x8 = %s\n" -+ "XAAInfoPtr->CanDoColor8x8 = %s\n" -+ "XAAInfoPtr->CachePixelGranularity = %d\n" -+ "XAAInfoPtr->MaxCacheableTileWidth = %d\n" -+ "XAAInfoPtr->MaxCacheableTileHeight = %d\n" -+ "XAAInfoPtr->MaxCacheableStippleWidth = %d\n" -+ "XAAInfoPtr->MaxCacheableStippleHeight = %d\n" -+ "XAAInfoPtr->MonoPatternPitch = %d\n" -+ "XAAInfoPtr->CacheWidthMono8x8Pattern = %d\n" -+ "XAAInfoPtr->CacheHeightMono8x8Pattern = %d\n" -+ "XAAInfoPtr->ColorPatternPitch = %d\n" -+ "XAAInfoPtr->CacheWidthColor8x8Pattern = %d\n" -+ "XAAInfoPtr->CacheHeightColor8x8Pattern = %d\n" -+ "XAAInfoPtr->CacheColorExpandDensity = %d\n" -+ "XAAInfoPtr->maxOffPixWidth = %d\n" -+ "XAAInfoPtr->maxOffPixHeight= %d\n" -+ "XAAInfoPtr->NeedToSync = %s\n" -+ "\n", -+ pXAA->UsingPixmapCache ? "True" : "False", -+ pXAA->CanDoMono8x8 ? "True" : "False", -+ pXAA->CanDoColor8x8 ? "True" : "False", -+ pXAA->CachePixelGranularity, -+ pXAA->MaxCacheableTileWidth, -+ pXAA->MaxCacheableTileHeight, -+ pXAA->MaxCacheableStippleWidth, -+ pXAA->MaxCacheableStippleHeight, -+ pXAA->MonoPatternPitch, -+ pXAA->CacheWidthMono8x8Pattern, -+ pXAA->CacheHeightMono8x8Pattern, -+ pXAA->ColorPatternPitch, -+ pXAA->CacheWidthColor8x8Pattern, -+ pXAA->CacheHeightColor8x8Pattern, -+ pXAA->CacheColorExpandDensity, -+ pXAA->maxOffPixWidth, -+ pXAA->maxOffPixHeight, -+ pXAA->NeedToSync ? "True" : "False"); -+*/ -+#endif -+ -+ PDEBUG1(ErrorF("Setup ScreenCopy(%d, %d, 0x%x, 0x%x, 0x%x)\n", -+ xdir, ydir, rop, planemask, trans_color)); -+ -+ Volari_ResetCmd ; -+ GuardBand(0x20 * Alignment); -+ Volari_SetupDSTColorDepth(pXGI->DstColor); -+ Volari_SetupSRCPitch(pXGI->scrnOffset) ; -+ Volari_SetupDSTRect(pXGI->scrnOffset, Dst_Hight) ; -+ Volari_SetupROP(xgiG2_ALUConv[rop]) ; -+} -+ -+static void -+Volari_SubsequentScreenToScreenCopy( -+ ScrnInfoPtr pScrn, -+ int src_x, int src_y, -+ int dst_x, int dst_y, -+ int width, int height) -+{ -+ XGIPtr pXGI = XGIPTR(pScrn); -+ long srcbase, dstbase; -+/* -+ PDEBUG1(ErrorF("Subsequent ScreenCopy(%d,%d, %d,%d, %d,%d)\n", -+ src_x, src_y, -+ dst_x, dst_y, -+ width, height)); -+*/ -+ srcbase=dstbase=0; -+ if (src_y >= 2048) -+ { -+ srcbase=pXGI->scrnOffset*src_y; -+ src_y=0; -+ } -+ if (dst_y >= pScrn->virtualY) -+ { -+ dstbase=pXGI->scrnOffset*dst_y; -+ dst_y=0; -+ } -+ /* -+ PDEBUG1(ErrorF("SrcBase = %08lX DstBase = %08lX\n",srcbase,dstbase)) ; -+ PDEBUG1(ErrorF("SrcX = %08lX SrcY = %08lX\n",src_x,src_y)) ; -+ PDEBUG1(ErrorF("DstX = %08lX DstY = %08lX\n",dst_x,dst_y)) ; -+*/ -+ GuardBand(0x30 * Alignment); -+ Volari_SetupSRCBase(srcbase); -+ Volari_SetupDSTBase(dstbase); -+ Volari_SetupSRCXY(src_x,src_y) ; -+ Volari_SetupDSTXY(dst_x,dst_y) ; -+ Volari_SetupRect(width, height) ; -+ Volari_DoCMD ; -+} -+ -+static void -+Volari_SetupForSolidFill(ScrnInfoPtr pScrn, -+ int color, int rop, unsigned int planemask) -+{ -+ XGIPtr pXGI = XGIPTR(pScrn); -+ -+ PDEBUG1(ErrorF("Volari_SetupForSolidFill()\n")) ; -+ PDEBUG1(ErrorF("Color = #%08lX ",color)) ; -+ PDEBUG1(ErrorF("DstPitch = #%04lX ",(pXGI->scrnOffset))) ; -+ PDEBUG1(ErrorF("\n")) ; -+ -+ Volari_ResetCmd ; -+ GuardBand(0x28 * Alignment); -+ Volari_SetupPATFG(color) ; -+ Volari_SetupDSTRect(pXGI->scrnOffset, Dst_Hight) ; -+ Volari_SetupDSTColorDepth(XGIPTR(pScrn)->DstColor) ; -+ Volari_SetupROP(xgiG2_PatALUConv[rop]) ; -+ Volari_SetupCMDFlag(PATFG | BITBLT) ; -+} -+ -+static void -+Volari_SubsequentSolidFillRect( -+ ScrnInfoPtr pScrn, -+ int x, int y, -+ int width, int height) -+{ -+ XGIPtr pXGI = XGIPTR(pScrn); -+ unsigned long dstbase = 0 ; -+ -+ PDEBUG1(ErrorF("Subsequent SolidFillRect(%d, %d, %d, %d)\n", -+ x, y, width, height)); -+ -+ dstbase=0; -+ if (y>=2048) -+ { -+ dstbase=pXGI->scrnOffset*y; -+ y=0; -+ } -+ -+ GuardBand(0x20 * Alignment); -+ Volari_SetupDSTBase(dstbase) ; -+ Volari_SetupDSTXY(x,y) ; -+ Volari_SetupRect(width,height) ; -+ Volari_DoCMD ; -+ -+} -+ -+static void -+Volari_SetupForMonoPatternFill(ScrnInfoPtr pScrn, -+ int pat0, int pat1, -+ int fg, int bg, -+ int rop, unsigned int planemask) -+{ -+ XGIPtr pXGI = XGIPTR(pScrn); -+ -+ PDEBUG1(ErrorF("Setup MonoPatFill(0x%x,0x%x, 0x%x,0x%x, 0x%x, 0x%x)\n", -+ pat0, pat1, fg, bg, rop, planemask)); -+ -+ Volari_ResetCmd ; -+ GuardBand(0x40 * Alignment); -+ Volari_SetupDSTRect(pXGI->scrnOffset, Dst_Hight) ; -+ Volari_SetupMONOPAT0(pat0) ; -+ Volari_SetupMONOPAT1(pat1) ; -+ Volari_SetupPATFG(fg) ; -+ Volari_SetupPATBG(bg) ; -+ Volari_SetupROP(xgiG2_PatALUConv[rop]) ; -+ Volari_SetupDSTColorDepth(pXGI->DstColor) ; -+ Volari_SetupCMDFlag(PATMONO | BITBLT) ; -+} -+ -+static void -+Volari_SubsequentMonoPatternFill(ScrnInfoPtr pScrn, -+ int patx, int paty, -+ int x, int y, int w, int h) -+{ -+ XGIPtr pXGI = XGIPTR(pScrn); -+ long dstbase; -+ -+ PDEBUG1(ErrorF("Subsequent MonoPatFill(0x%x,0x%x, %d,%d, %d,%d)\n", -+ patx, paty, x, y, w, h)); -+ dstbase=0; -+ if (y>=2048) -+ { -+ dstbase=pXGI->scrnOffset*y; -+ y=0; -+ } -+ -+ GuardBand(0x20 * Alignment); -+ Volari_SetupDSTBase(dstbase) ; -+ Volari_SetupDSTXY(x,y) ; -+ Volari_SetupRect(w,h) ; -+ Volari_DoCMD ; -+ /*Volari_Idle(pXGI)*/; -+} -+ -+/************************************************************************/ -+ -diff --git a/src/xgi_accel.h b/src/xgi_accel.h -index 8f5d005..a0fa9f5 100644 ---- a/src/xgi_accel.h -+++ b/src/xgi_accel.h -@@ -116,6 +116,8 @@ - - #define BandSize 0x10 - -+/* Jong 09/27/2007; recover for compiler error */ -+typedef unsigned long ulong ; - /* typedef unsigned long ulong ; */ - - unsigned long r_port, w_port ; -@@ -248,7 +250,7 @@ extern void Volari_Idle(XGIPtr pXGI); - (CARD32)BE_SWAP32(GR_NIL_CMD) ;\ - ulTemp += 0x10 ;\ - } \ -- else if( pXGI->Chipset == PCI_CHIP_XGIXG20 ) \ -+ else if(( pXGI->Chipset == PCI_CHIP_XGIXG20 )||( pXGI->Chipset == PCI_CHIP_XGIXG21 )||( pXGI->Chipset == PCI_CHIP_XGIXG27 )) \ - ulTemp += 0x08 ;\ - ulTemp &= pXGI->cmdQueueSizeMask ;\ - Volari_UpdateHwWP(ulTemp) ;\ -@@ -280,7 +282,7 @@ extern void Volari_Idle(XGIPtr pXGI); - (CARD32)BE_SWAP32(GR_NIL_CMD) ;\ - ulTemp += 0x10 ;\ - } \ -- else if( pXGI->Chipset == PCI_CHIP_XGIXG20 ) \ -+ else if(( pXGI->Chipset == PCI_CHIP_XGIXG20 )||( pXGI->Chipset == PCI_CHIP_XGIXG21 )||( pXGI->Chipset == PCI_CHIP_XGIXG27 )) \ - ulTemp += 0x08 ;\ - ulTemp &= pXGI->cmdQueueSizeMask ;\ - Volari_UpdateSwWP(ulTemp) ;\ -@@ -314,7 +316,7 @@ extern void Volari_Idle(XGIPtr pXGI); - (CARD32)BE_SWAP32(GR_NIL_CMD) ;\ - ulTemp += 0x10 ;\ - } \ -- else if( pXGI->Chipset == PCI_CHIP_XGIXG20 ) \ -+ else if(( pXGI->Chipset == PCI_CHIP_XGIXG20 )||( pXGI->Chipset == PCI_CHIP_XGIXG21 )||( pXGI->Chipset == PCI_CHIP_XGIXG27 )) \ - ulTemp += 0x08 ;\ - ulTemp &= pXGI->cmdQueueSizeMask ;\ - Volari_UpdateSwWP(ulTemp) ;\ -@@ -346,7 +348,7 @@ extern void Volari_Idle(XGIPtr pXGI); - (CARD32)BE_SWAP32(GR_NIL_CMD) ;\ - ulTemp += 0x10 ;\ - } \ -- else if( pXGI->Chipset == PCI_CHIP_XGIXG20 ) \ -+ else if(( pXGI->Chipset == PCI_CHIP_XGIXG20 )||( pXGI->Chipset == PCI_CHIP_XGIXG21 )||( pXGI->Chipset == PCI_CHIP_XGIXG27 )) \ - ulTemp += 0x08 ;\ - ulTemp &= pXGI->cmdQueueSizeMask ;\ - Volari_UpdateSwWP(ulTemp) ;\ -@@ -379,7 +381,7 @@ extern void Volari_Idle(XGIPtr pXGI); - (CARD32)BE_SWAP32(GR_NIL_CMD) ;\ - ulTemp += 0x10 ;\ - } \ -- else if( pXGI->Chipset == PCI_CHIP_XGIXG20 ) \ -+ else if(( pXGI->Chipset == PCI_CHIP_XGIXG20 )||( pXGI->Chipset == PCI_CHIP_XGIXG21 )||( pXGI->Chipset == PCI_CHIP_XGIXG27 )) \ - ulTemp += 0x08 ;\ - ulTemp &= pXGI->cmdQueueSizeMask ;\ - Volari_UpdateSwWP(ulTemp) ;\ -@@ -412,7 +414,7 @@ extern void Volari_Idle(XGIPtr pXGI); - (CARD32)BE_SWAP32(GR_NIL_CMD) ;\ - ulTemp += 0x10 ;\ - } \ -- else if( pXGI->Chipset == PCI_CHIP_XGIXG20 ) \ -+ else if(( pXGI->Chipset == PCI_CHIP_XGIXG20 )||( pXGI->Chipset == PCI_CHIP_XGIXG21 )||( pXGI->Chipset == PCI_CHIP_XGIXG27 )) \ - ulTemp += 0x08 ;\ - ulTemp &= pXGI->cmdQueueSizeMask ;\ - Volari_UpdateSwWP(ulTemp) ;\ -@@ -445,7 +447,7 @@ extern void Volari_Idle(XGIPtr pXGI); - (CARD32)BE_SWAP32(GR_NIL_CMD) ;\ - ulTemp += 0x10 ;\ - } \ -- else if( pXGI->Chipset == PCI_CHIP_XGIXG20 ) \ -+ else if(( pXGI->Chipset == PCI_CHIP_XGIXG20 )||( pXGI->Chipset == PCI_CHIP_XGIXG21 )||( pXGI->Chipset == PCI_CHIP_XGIXG27 )) \ - ulTemp += 0x08 ;\ - ulTemp &= pXGI->cmdQueueSizeMask ;\ - Volari_UpdateSwWP(ulTemp) ;\ -@@ -488,7 +490,7 @@ extern void Volari_Idle(XGIPtr pXGI); - (CARD32)BE_SWAP32(GR_NIL_CMD) ;\ - ulTemp += 0x10 ;\ - } \ -- else if( pXGI->Chipset == PCI_CHIP_XGIXG20 ) \ -+ else if(( pXGI->Chipset == PCI_CHIP_XGIXG20 )||( pXGI->Chipset == PCI_CHIP_XGIXG21 )||( pXGI->Chipset == PCI_CHIP_XGIXG27 )) \ - ulTemp += 0x08 ;\ - ulTemp &= pXGI->cmdQueueSizeMask ;\ - Volari_UpdateSwWP(ulTemp) ;\ -@@ -538,7 +540,7 @@ extern void Volari_Idle(XGIPtr pXGI); - (CARD32)BE_SWAP32(GR_NIL_CMD) ;\ - ulTemp += 0x10 ;\ - } \ -- else if( pXGI->Chipset == PCI_CHIP_XGIXG20 ) \ -+ else if(( pXGI->Chipset == PCI_CHIP_XGIXG20 )||( pXGI->Chipset == PCI_CHIP_XGIXG21 )||( pXGI->Chipset == PCI_CHIP_XGIXG27 )) \ - ulTemp += 0x08 ;\ - ulTemp &= pXGI->cmdQueueSizeMask ;\ - Volari_UpdateSwWP(ulTemp) ;\ -@@ -564,7 +566,7 @@ extern void Volari_Idle(XGIPtr pXGI); - (CARD32)BE_SWAP32(GR_NIL_CMD) ;\ - ulTemp += 0x10 ;\ - } \ -- else if( pXGI->Chipset == PCI_CHIP_XGIXG20 ) \ -+ else if(( pXGI->Chipset == PCI_CHIP_XGIXG20 )||( pXGI->Chipset == PCI_CHIP_XGIXG21 )||( pXGI->Chipset == PCI_CHIP_XGIXG27 )) \ - ulTemp += 0x08 ;\ - ulTemp &= pXGI->cmdQueueSizeMask ;\ - Volari_UpdateSwWP(ulTemp) ;\ -@@ -589,7 +591,7 @@ extern void Volari_Idle(XGIPtr pXGI); - (CARD32)BE_SWAP32(GR_NIL_CMD) ;\ - ulTemp += 0x10 ;\ - } \ -- else if( pXGI->Chipset == PCI_CHIP_XGIXG20 ) \ -+ else if(( pXGI->Chipset == PCI_CHIP_XGIXG20 )||( pXGI->Chipset == PCI_CHIP_XGIXG21 )||( pXGI->Chipset == PCI_CHIP_XGIXG27 )) \ - ulTemp += 0x08 ;\ - ulTemp &= pXGI->cmdQueueSizeMask ;\ - Volari_UpdateSwWP(ulTemp) ;\ -@@ -614,7 +616,7 @@ extern void Volari_Idle(XGIPtr pXGI); - (CARD32)BE_SWAP32(GR_NIL_CMD) ;\ - ulTemp += 0x10 ;\ - } \ -- else if( pXGI->Chipset == PCI_CHIP_XGIXG20 ) \ -+ else if(( pXGI->Chipset == PCI_CHIP_XGIXG20 )||( pXGI->Chipset == PCI_CHIP_XGIXG21 )||( pXGI->Chipset == PCI_CHIP_XGIXG27 )) \ - ulTemp += 0x08 ;\ - ulTemp &= pXGI->cmdQueueSizeMask ;\ - Volari_UpdateSwWP(ulTemp) ;\ -@@ -647,7 +649,7 @@ extern void Volari_Idle(XGIPtr pXGI); - (CARD32)BE_SWAP32(GR_NIL_CMD) ;\ - ulTemp += 0x10 ;\ - } \ -- else if( pXGI->Chipset == PCI_CHIP_XGIXG20 ) \ -+ else if(( pXGI->Chipset == PCI_CHIP_XGIXG20 )||( pXGI->Chipset == PCI_CHIP_XGIXG21 )||( pXGI->Chipset == PCI_CHIP_XGIXG27 )) \ - ulTemp += 0x08 ;\ - ulTemp &= pXGI->cmdQueueSizeMask ;\ - Volari_UpdateSwWP(ulTemp) ;\ -@@ -672,7 +674,7 @@ extern void Volari_Idle(XGIPtr pXGI); - (CARD32)BE_SWAP32(GR_NIL_CMD) ;\ - ulTemp += 0x10 ;\ - } \ -- else if( pXGI->Chipset == PCI_CHIP_XGIXG20 ) \ -+ else if(( pXGI->Chipset == PCI_CHIP_XGIXG20 )||( pXGI->Chipset == PCI_CHIP_XGIXG21 )||( pXGI->Chipset == PCI_CHIP_XGIXG27 )) \ - ulTemp += 0x08 ;\ - ulTemp &= pXGI->cmdQueueSizeMask ;\ - Volari_UpdateSwWP(ulTemp) ;\ -@@ -709,7 +711,7 @@ extern void Volari_Idle(XGIPtr pXGI); - (CARD32)BE_SWAP32(GR_NIL_CMD) ;\ - ulTemp += 0x10 ;\ - } \ -- else if( pXGI->Chipset == PCI_CHIP_XGIXG20 ) \ -+ else if(( pXGI->Chipset == PCI_CHIP_XGIXG20 )||( pXGI->Chipset == PCI_CHIP_XGIXG21 )||( pXGI->Chipset == PCI_CHIP_XGIXG27 )) \ - ulTemp += 0x08 ;\ - ulTemp &= pXGI->cmdQueueSizeMask ;\ - Volari_UpdateSwWP(ulTemp) ;\ -@@ -734,7 +736,7 @@ extern void Volari_Idle(XGIPtr pXGI); - (CARD32)BE_SWAP32(GR_NIL_CMD) ;\ - ulTemp += 0x10 ;\ - } \ -- else if( pXGI->Chipset == PCI_CHIP_XGIXG20 ) \ -+ else if(( pXGI->Chipset == PCI_CHIP_XGIXG20 )||( pXGI->Chipset == PCI_CHIP_XGIXG21 )||( pXGI->Chipset == PCI_CHIP_XGIXG27 )) \ - ulTemp += 0x08 ;\ - ulTemp &= pXGI->cmdQueueSizeMask ;\ - Volari_UpdateSwWP(ulTemp) ;\ -@@ -759,7 +761,7 @@ extern void Volari_Idle(XGIPtr pXGI); - (CARD32)BE_SWAP32(GR_NIL_CMD) ;\ - ulTemp += 0x10 ;\ - } \ -- else if( pXGI->Chipset == PCI_CHIP_XGIXG20 ) \ -+ else if(( pXGI->Chipset == PCI_CHIP_XGIXG20 )||( pXGI->Chipset == PCI_CHIP_XGIXG21 )||( pXGI->Chipset == PCI_CHIP_XGIXG27 )) \ - ulTemp += 0x08 ;\ - ulTemp &= pXGI->cmdQueueSizeMask ;\ - Volari_UpdateSwWP(ulTemp) ;\ -@@ -830,7 +832,7 @@ extern void Volari_Idle(XGIPtr pXGI); - (CARD32)BE_SWAP32(GR_NIL_CMD) ;\ - ulTemp += 0x10 ;\ - } \ -- else if( pXGI->Chipset == PCI_CHIP_XGIXG20 ) \ -+ else if(( pXGI->Chipset == PCI_CHIP_XGIXG20 )||( pXGI->Chipset == PCI_CHIP_XGIXG21 )||( pXGI->Chipset == PCI_CHIP_XGIXG27 )) \ - ulTemp += 0x08 ;\ - ulTemp &= pXGI->cmdQueueSizeMask ;\ - Volari_UpdateSwWP(ulTemp) ;\ -@@ -855,7 +857,7 @@ extern void Volari_Idle(XGIPtr pXGI); - (CARD32)BE_SWAP32(GR_NIL_CMD) ;\ - ulTemp += 0x10 ;\ - } \ -- else if( pXGI->Chipset == PCI_CHIP_XGIXG20 ) \ -+ else if(( pXGI->Chipset == PCI_CHIP_XGIXG20 )||( pXGI->Chipset == PCI_CHIP_XGIXG21 )||( pXGI->Chipset == PCI_CHIP_XGIXG27 )) \ - ulTemp += 0x08 ;\ - ulTemp &= pXGI->cmdQueueSizeMask ;\ - Volari_UpdateSwWP(ulTemp) ;\ -@@ -880,7 +882,7 @@ extern void Volari_Idle(XGIPtr pXGI); - (CARD32)BE_SWAP32(GR_NIL_CMD) ;\ - ulTemp += 0x10 ;\ - } \ -- else if( pXGI->Chipset == PCI_CHIP_XGIXG20 ) \ -+ else if(( pXGI->Chipset == PCI_CHIP_XGIXG20 )||( pXGI->Chipset == PCI_CHIP_XGIXG21 )||( pXGI->Chipset == PCI_CHIP_XGIXG27 )) \ - ulTemp += 0x08 ;\ - ulTemp &= pXGI->cmdQueueSizeMask ;\ - Volari_UpdateSwWP(ulTemp) ;\ -@@ -905,7 +907,7 @@ extern void Volari_Idle(XGIPtr pXGI); - (CARD32)BE_SWAP32(GR_NIL_CMD) ;\ - ulTemp += 0x10 ;\ - } \ -- else if( pXGI->Chipset == PCI_CHIP_XGIXG20 ) \ -+ else if(( pXGI->Chipset == PCI_CHIP_XGIXG20 )||( pXGI->Chipset == PCI_CHIP_XGIXG21 )||( pXGI->Chipset == PCI_CHIP_XGIXG27 )) \ - ulTemp += 0x08 ;\ - ulTemp &= pXGI->cmdQueueSizeMask ;\ - Volari_UpdateSwWP(ulTemp) ;\ -@@ -930,7 +932,7 @@ extern void Volari_Idle(XGIPtr pXGI); - (CARD32)BE_SWAP32(GR_NIL_CMD) ;\ - ulTemp += 0x10 ;\ - } \ -- else if( pXGI->Chipset == PCI_CHIP_XGIXG20 ) \ -+ else if(( pXGI->Chipset == PCI_CHIP_XGIXG20 )||( pXGI->Chipset == PCI_CHIP_XGIXG21 )||( pXGI->Chipset == PCI_CHIP_XGIXG27 )) \ - ulTemp += 0x08 ;\ - ulTemp &= pXGI->cmdQueueSizeMask ;\ - Volari_UpdateSwWP(ulTemp) ;\ -@@ -955,7 +957,7 @@ extern void Volari_Idle(XGIPtr pXGI); - (CARD32)BE_SWAP32(GR_NIL_CMD) ;\ - ulTemp += 0x10 ;\ - } \ -- else if( pXGI->Chipset == PCI_CHIP_XGIXG20 ) \ -+ else if(( pXGI->Chipset == PCI_CHIP_XGIXG20 )||( pXGI->Chipset == PCI_CHIP_XGIXG21 )||( pXGI->Chipset == PCI_CHIP_XGIXG27 )) \ - ulTemp += 0x08 ;\ - ulTemp &= pXGI->cmdQueueSizeMask ;\ - Volari_UpdateSwWP(ulTemp) ;\ -diff --git a/src/xgi_common.h b/src/xgi_common.h -diff --git a/src/xgi_cursor.c b/src/xgi_cursor.c -index a66eed1..2d5d8c6 100644 ---- a/src/xgi_cursor.c -+++ b/src/xgi_cursor.c -@@ -67,10 +67,24 @@ Volari_ShowCursor(ScrnInfoPtr pScrn) - /* unsigned long cursor_addr = pXGI->CursorOffset ; */ - unsigned long cursor_base = pXGI->CursorOffset/1024 ; - -- xgiG2CRT1_EnableHWCursor(cursor_base, 0); -- if (pXGI->VBFlags & CRT2_ENABLE) { -- xgiG2CRT2_EnableHWCursor(cursor_base, 0); -+ /* Jong 09/19/2007; bug fixing for ??? */ -+ if( pXGI->HWARGBCursor ) -+ { -+ xgiG2CRT1_EnableARGBHWCursor(cursor_base, 0); -+ if (pXGI->VBFlags & CRT2_ENABLE) -+ { -+ xgiG2CRT2_EnableARGBHWCursor(cursor_base, 0); -+ } - } -+ else -+ { -+ xgiG2CRT1_EnableHWCursor(cursor_base, 0); -+ if (pXGI->VBFlags & CRT2_ENABLE) -+ { -+ xgiG2CRT2_EnableHWCursor(cursor_base, 0); -+ } -+ } -+ - XGIG1_SetCursorPosition(pScrn, currX, currY) ; - XGI_WaitEndRetrace(pXGI->RelIO); - } -@@ -163,6 +177,66 @@ Volari_UseHWCursor(ScreenPtr pScreen, CursorPtr pCurs) - return TRUE; - } - -+/* Jong 09/19/2007; Is this required? */ -+Bool -+Volari_UseHWCursorARGB(ScreenPtr pScreen, CursorPtr pCurs) -+{ -+ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; -+ DisplayModePtr mode = pScrn->currentMode; -+ XGIPtr pXGI = XGIPTR(pScrn); -+ -+ if (mode->Flags & V_INTERLACE) -+ { -+ return FALSE; -+ } -+ -+ /* DumpDDIName("Volari_UserHWCursorARGB()\n") ; */ -+ -+ return TRUE ; -+} -+ -+/* Jong 09/19/2007; Is this required? */ -+static void -+Volari_LoadCursorARGB(ScrnInfoPtr pScrn, CursorPtr pCursor) -+{ -+ XGIPtr pXGI = XGIPTR(pScrn); -+ unsigned long cursor_addr = pXGI->CursorOffset ; -+ unsigned long cursor_base = pXGI->CursorOffset/1024 ; -+ unsigned char *pCursorShape ; -+ int i , j ; CARD32 *pDest,*pSrc ; -+ CursorBitsPtr pCursorBits = pCursor->bits ; -+ -+ -+ /* DumpDDIName("Volari_LoadCursorARGB()\n") ; */ -+ pXGI->HWARGBCursor = TRUE ; -+ pCursorShape = pXGI->FbBase + cursor_addr ; -+ -+ pSrc = pCursorBits->argb ; -+ -+ pXGI->CurXPreset = 64-pCursorBits->width ; -+ pXGI->CurYPreset = 64-pCursorBits->height ; -+ -+ for( i = 64 - pCursorBits->height ; i< 64 ; i++ ) -+ { -+ pDest = (CARD32 *)(pCursorShape + i*64*4 ) ; -+ for( j = 64-pCursorBits->width ; j < 64 ; j++, pSrc++ ) -+ { -+ pDest[j] = *pSrc ; -+ } -+ } -+ -+ xgiG2CRT1_SetCursorAddressPattern(cursor_base,0) ; -+ -+ if (pXGI->VBFlags & CRT2_ENABLE) { -+ xgiG2CRT2_SetCursorAddressPattern(cursor_base,0) ; -+ /* xgiG1CRT2_SetCursorAddress(cursor_base) ; */ -+ /* xgiG1CRT2_SetCursorPatternSelect(0) ; */ -+ } -+ XGIG1_SetCursorPosition(pScrn, currX, currY) ; -+ PDEBUG4(vWaitCRT1VerticalRetrace(pScrn)) ; -+ PDEBUG4(XGIDumpMMIO(pScrn)); -+} -+ - Bool - XGIHWCursorInit(ScreenPtr pScreen) - { -@@ -179,6 +253,8 @@ XGIHWCursorInit(ScreenPtr pScreen) - - case PCI_CHIP_XGIXG40: - case PCI_CHIP_XGIXG20: -+ case PCI_CHIP_XGIXG21: -+ case PCI_CHIP_XGIXG27: - default: - PDEBUG(ErrorF("--- HWCursorInit() \n")); - infoPtr->MaxWidth = 64; -@@ -192,6 +268,13 @@ XGIHWCursorInit(ScreenPtr pScreen) - infoPtr->LoadCursorImage = Volari_LoadCursorImage; - infoPtr->UseHWCursor = Volari_UseHWCursor; - /* infoPtr->RealizeCursor = XGIRealizeCursorColor ; // */ -+ -+ /* Jong 09/19/2007; Is this required */ -+ #ifdef XGI_ARGB_CURSOR -+ infoPtr->UseHWCursorARGB = Volari_UseHWCursorARGB ; -+ infoPtr->LoadCursorARGB = Volari_LoadCursorARGB ; -+ #endif -+ - infoPtr->Flags = - HARDWARE_CURSOR_TRUECOLOR_AT_8BPP | - HARDWARE_CURSOR_INVERT_MASK | -diff --git a/src/xgi_cursor.h b/src/xgi_cursor.h -index a29e3cb..64bb87f 100644 ---- a/src/xgi_cursor.h -+++ b/src/xgi_cursor.h -@@ -190,4 +190,27 @@ - XGIMMIOLONG(0x8520) =BE_SWAP32(ulTemp) ;\ - } - -+/* Jong 09/19/2007; added for ??? */ -+#define xgiG2CRT1_EnableARGBHWCursor(cursor_base,pat_id)\ -+ {\ -+ CARD32 ulTemp ;\ -+ ulTemp = XGIMMIOLONG(0x8500) ;\ -+ ulTemp &= 0x00FC0000 ;\ -+ ulTemp |= 0xE<<28 ;\ -+ ulTemp |= (cursor_base) & 0x3FFFF ;\ -+ ulTemp |= ((pat_id)&0xF)<<24 ;\ -+ XGIMMIOLONG(0x8500) = ulTemp ;\ -+ } -+ -+#define xgiG2CRT2_EnableARGBHWCursor(cursor_base,pat_id)\ -+ {\ -+ CARD32 ulTemp ;\ -+ ulTemp = XGIMMIOLONG(0x8500) ;\ -+ ulTemp &= 0x00FC0000 ;\ -+ ulTemp |= 0xE<<28 ;\ -+ ulTemp |= (cursor_base) & 0x3FFFF ;\ -+ ulTemp |= ((pat_id)&0xF)<<24 ;\ -+ XGIMMIOLONG(0x8500) = ulTemp ;\ -+ } -+ - /*******************************************************************/ -diff --git a/src/xgi_dac.c b/src/xgi_dac.c -index b8155e0..9a95001 100644 ---- a/src/xgi_dac.c -+++ b/src/xgi_dac.c -@@ -359,7 +359,7 @@ Volari_Restore(ScrnInfoPtr pScrn, XGIRegPtr xgiReg) - int vgaIOBase; - int i; - --PDEBUG(ErrorF("--- Volari_Restore(). \n")) ; -+ PDEBUG(ErrorF("--- Volari_Restore(). \n")) ; - xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 4, - "Volari_Restore(ScrnInfoPtr pScrn, XGIRegPtr xgiReg)\n"); - -@@ -386,8 +386,12 @@ PDEBUG(ErrorF("--- Volari_Restore(). \n")) ; - | SR1E_ENABLE_3D)); - PDEBUG(XGIDumpRegs(pScrn)); - #endif -- PDEBUG(XGIDumpRegs(pScrn)) ; //yilin -+ -+ PDEBUG(XGIDumpRegs(pScrn)) ; //yilin -+ - for (i = 0x19; i < 0x5C; i++) { -+ /* Jong 09/19/2007; added for ??? */ -+ if((i!=0x48 && i!=0x4a)|| ((pXGI->Chipset != PCI_CHIP_XGIXG20)&&(pXGI->Chipset != PCI_CHIP_XGIXG21)&&(pXGI->Chipset != PCI_CHIP_XGIXG27))) - outXGIIDXREG(XGICR, i, xgiReg->xgiRegs3D4[i]); - } - -@@ -407,7 +411,7 @@ PDEBUG(ErrorF("--- Volari_Restore(). \n")) ; - } - - --// yilin restore the VB register -+ // yilin restore the VB register - outXGIIDXREG(XGIPART1, 0x2f, 0x01); - for (i=0; i<0x50; i++) - { -@@ -432,7 +436,7 @@ PDEBUG(ErrorF("--- Volari_Restore(). \n")) ; - /* MemClock needs this to take effect */ - - outw(VGA_SEQ_INDEX, 0x0100); /* Synchronous Reset */ -- PDEBUG(XGIDumpRegs(pScrn)) ; //yilin -+ PDEBUG(XGIDumpRegs(pScrn)) ; //yilin - xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 4, - "Volari_Restore(ScrnInfoPtr pScrn, XGIRegPtr xgiReg) Done\n"); - -@@ -452,7 +456,7 @@ Volari_Threshold(ScrnInfoPtr pScrn, DisplayModePtr mode, - /** - * Calculate available memory bandwidth for an XG40 series chip. - * -- * \sa XG20_MemBandWidth -+ * \sa XG40_MemBandWidth - */ - static int XG40_MemBandWidth(ScrnInfoPtr pScrn) - { -@@ -480,7 +484,7 @@ static int XG40_MemBandWidth(ScrnInfoPtr pScrn) - /** - * Calculate available memory bandwidth for an XG20 series chip. - * -- * \sa XG40_MemBandWidth -+ * \sa XG20_MemBandWidth - */ - static int XG20_MemBandWidth(ScrnInfoPtr pScrn) - { -@@ -491,8 +495,35 @@ static int XG20_MemBandWidth(ScrnInfoPtr pScrn) - const float magic = 1.44; - float total = (mclk * bus) / bpp; - -+ /* Jong 09/19/2007; support DDRII and double pixel clock */ -+ unsigned long SR39, CR97 ; -+ - PDEBUG5(ErrorF("mclk: %d, bus: %d, magic: %f, bpp: %d\n", - mclk, bus, magic, bpp)); -+ -+ total = mclk*bus/bpp; -+ -+ /* Jong 04/26/2007; support DDRII and double pixel clock */ -+ /*-------------------------------------------------------*/ -+ inXGIIDXREG(XGISR, 0x39, SR39); -+ inXGIIDXREG(XGICR, 0x97, CR97); -+ -+ if (CR97 & 0x10) -+ { -+ if (CR97 & 0x01) -+ { -+ total *= 2; -+ } -+ } -+ else -+ { -+ if (SR39 & 0x2) -+ { -+ total *= 2; -+ } -+ } -+ /*-------------------------------------------------------*/ -+ - PDEBUG5(ErrorF("Total Adapter Bandwidth is %fM\n", total/1000)); - - return (int)(total / magic); -@@ -606,7 +637,7 @@ PDEBUG(ErrorF("XGIDACPreInit()\n")); - pXGI->XGIRestore = Volari_Restore; - pXGI->SetThreshold = Volari_Threshold; - -- pXGI->MaxClock = (pXGI->Chipset == PCI_CHIP_XGIXG20) -+ pXGI->MaxClock = ((pXGI->Chipset == PCI_CHIP_XGIXG20) || (pXGI->Chipset == PCI_CHIP_XGIXG21) || (pXGI->Chipset == PCI_CHIP_XGIXG27)) - ? XG20_MemBandWidth(pScrn) : XG40_MemBandWidth(pScrn); - } - -diff --git a/src/xgi_dac.h b/src/xgi_dac.h -diff --git a/src/xgi_dga.c b/src/xgi_dga.c -diff --git a/src/xgi_dri.c b/src/xgi_dri.c -index b76ecbd..08b58e1 100644 ---- a/src/xgi_dri.c -+++ b/src/xgi_dri.c -@@ -38,6 +38,12 @@ - #ifdef HAVE_CONFIG_H - #include "config.h" - #endif -+ -+/* Jong 09/27/2007; added for PACKAGE_VERSION_MAJOR,... */ -+#define PACKAGE_VERSION_MAJOR 1 -+#define PACKAGE_VERSION_MINOR 1 -+#define PACKAGE_VERSION_PATCHLEVEL 0 -+ - #include "xf86.h" - #include "xf86_OSproc.h" - #include "xf86Priv.h" -diff --git a/src/xgi_dri.h b/src/xgi_dri.h -diff --git a/src/xgi_driver.c b/src/xgi_driver.c -index cb01f9d..a1ef47b 100644 ---- a/src/xgi_driver.c -+++ b/src/xgi_driver.c -@@ -1,6036 +1,6458 @@ --/* -- * XGI driver main code -- * -- * Copyright (C) 2001-2004 by Thomas Winischhofer, Vienna, Austria. -- * -- * Redistribution and use in source and binary forms, with or without -- * modification, are permitted provided that the following conditions -- * are met: -- * 1) Redistributions of source code must retain the above copyright -- * notice, this list of conditions and the following disclaimer. -- * 2) Redistributions in binary form must reproduce the above copyright -- * notice, this list of conditions and the following disclaimer in the -- * documentation and/or other materials provided with the distribution. -- * 3) The name of the author may not be used to endorse or promote products -- * derived from this software without specific prior written permission. -- * -- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESSED OR -- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, -- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -- * -- * Author: Thomas Winischhofer -- * - driver entirely rewritten since 2001, only basic structure taken from -- * old code (except xgi_dri.c, xgi_shadow.c, xgi_accel.c and parts of -- * xgi_dga.c; these were mostly taken over; xgi_dri.c was changed for -- * new versions of the DRI layer) -- * -- * This notice covers the entire driver code unless otherwise indicated. -- * -- * Formerly based on code which is -- * Copyright (C) 1998, 1999 by Alan Hourihane, Wigan, England. -- * Written by: -- * Alan Hourihane , -- * Mike Chapman , -- * Juanjo Santamarta , -- * Mitani Hiroshi , -- * David Thomas . -- */ -- --#ifdef HAVE_CONFIG_H --#include "config.h" --#endif -- --#include "fb.h" --#include "mibank.h" --#include "micmap.h" --#include "xf86.h" --#include "xf86Priv.h" --#include "xf86_OSproc.h" --#include "xf86Resources.h" --#include "dixstruct.h" --#include "xf86Version.h" --#include "xf86PciInfo.h" --#include "xf86Pci.h" --#include "xf86cmap.h" --#include "vgaHW.h" --#include "xf86RAC.h" --#include "shadowfb.h" --#include "vbe.h" -- --#include "mipointer.h" --#include "mibstore.h" -- --#include "xgi.h" --#include "xgi_regs.h" --#include "xgi_vb.h" --#include "xgi_dac.h" --#include "vb_def.h" --#include "xgi_driver.h" --#include "valid_mode.h" -- --#define _XF86DGA_SERVER_ --#include -- --#include "globals.h" -- --#define DPMS_SERVER --#include -- --#if defined(XvExtension) --#include "xf86xv.h" --#include --#endif -- --#ifdef XF86DRI --#include "dri.h" --#endif -- --#ifdef HAVE_UNISTD_H --#include --#endif -- --#include --#include -- --#ifdef XSERVER_LIBPCIACCESS --static Bool XGIPciProbe(DriverPtr drv, int entity_num, -- struct pci_device *dev, intptr_t match_data); --#else --static Bool XGIProbe(DriverPtr drv, int flags); --#endif -- --void Volari_EnableAccelerator(ScrnInfoPtr pScrn); --/* Globals (yes, these ARE really required to be global) */ -- --#ifdef XGIDUALHEAD --static int XGIEntityIndex = -1; --#endif -- --/* -- * This is intentionally screen-independent. It indicates the binding -- * choice made in the first PreInit. -- */ --static int pix24bpp = 0; --int FbDevExist; -- --#define FBIOGET_FSCREENINFO 0x4602 --#define FB_ACCEL_XGI_GLAMOUR 41 -- --struct fb_fix_screeninfo --{ -- char id[16]; /* identification string eg "TT Builtin" */ -- unsigned long smem_start; /* Start of frame buffer mem */ -- /* (physical address) */ -- unsigned long smem_len; /* Length of frame buffer mem */ -- unsigned long type; /* see FB_TYPE_* */ -- unsigned long type_aux; /* Interleave for interleaved Planes */ -- unsigned long visual; /* see FB_VISUAL_* */ -- unsigned short xpanstep; /* zero if no hardware panning */ -- unsigned short ypanstep; /* zero if no hardware panning */ -- unsigned short ywrapstep; /* zero if no hardware ywrap */ -- unsigned long line_length; /* length of a line in bytes */ -- unsigned long mmio_start; /* Start of Memory Mapped I/O */ -- /* (physical address) */ -- unsigned long mmio_len; /* Length of Memory Mapped I/O */ -- unsigned long accel; /* Type of acceleration available */ -- unsigned short reserved[3]; /* Reserved for future compatibility */ --}; -- --#ifdef XSERVER_LIBPCIACCESS --#define XGI_DEVICE_MATCH(d, i) \ -- { 0x18ca, (d), PCI_MATCH_ANY, PCI_MATCH_ANY, 0, 0, (i) } -- --static const struct pci_id_match xgi_device_match[] = { -- XGI_DEVICE_MATCH(PCI_CHIP_XGIXG40, 0), -- XGI_DEVICE_MATCH(PCI_CHIP_XGIXG20, 1), -- -- { 0, 0, 0 }, --}; --#endif -- --/* -- * This contains the functions needed by the server after loading the driver -- * module. It must be supplied, and gets passed back by the SetupProc -- * function in the dynamic case. In the static case, a reference to this -- * is compiled in, and this requires that the name of this DriverRec be -- * an upper-case version of the driver name. -- */ -- --DriverRec XGI = { -- XGI_CURRENT_VERSION, -- XGI_DRIVER_NAME, -- XGIIdentify, --#ifdef XSERVER_LIBPCIACCESS -- NULL, --#else -- XGIProbe, --#endif -- XGIAvailableOptions, -- NULL, -- 0, -- NULL, -- --#ifdef XSERVER_LIBPCIACCESS -- xgi_device_match, -- XGIPciProbe --#endif --}; -- --static SymTabRec XGIChipsets[] = { -- {PCI_CHIP_XGIXG40, "Volari V8_V5_V3XT"}, -- {PCI_CHIP_XGIXG20, "Volari Z7"}, -- {-1, NULL} --}; -- --static PciChipsets XGIPciChipsets[] = { -- {PCI_CHIP_XGIXG40, PCI_CHIP_XGIXG40, RES_SHARED_VGA}, -- {PCI_CHIP_XGIXG20, PCI_CHIP_XGIXG20, RES_SHARED_VGA}, -- {-1, -1, RES_UNDEFINED} --}; -- --static const char *xaaSymbols[] = { -- "XAACopyROP", -- "XAACreateInfoRec", -- "XAADestroyInfoRec", -- "XAAFillMono8x8PatternRects", -- "XAAPatternROP", -- "XAAHelpPatternROP", -- "XAAInit", -- NULL --}; -- --static const char *vgahwSymbols[] = { -- "vgaHWFreeHWRec", -- "vgaHWGetHWRec", -- "vgaHWGetIOBase", -- "vgaHWGetIndex", -- "vgaHWInit", -- "vgaHWLock", -- "vgaHWMapMem", -- "vgaHWUnmapMem", -- "vgaHWProtect", -- "vgaHWRestore", -- "vgaHWSave", -- "vgaHWSaveScreen", -- "vgaHWUnlock", -- NULL --}; -- --static const char *fbSymbols[] = { -- "fbPictureInit", -- "fbScreenInit", -- NULL --}; -- --static const char *shadowSymbols[] = { -- "ShadowFBInit", -- NULL --}; -- --static const char *ramdacSymbols[] = { -- "xf86CreateCursorInfoRec", -- "xf86DestroyCursorInfoRec", -- "xf86InitCursor", -- NULL --}; -- -- --static const char *ddcSymbols[] = { -- "xf86PrintEDID", -- "xf86SetDDCproperties", -- "xf86InterpretEDID", -- NULL --}; -- -- --/* static const char *i2cSymbols[] = { -- "xf86I2CBusInit", -- "xf86CreateI2CBusRec", -- NULL --}; */ -- --static const char *int10Symbols[] = { -- "xf86FreeInt10", -- "xf86InitInt10", -- "xf86ExecX86int10", -- NULL --}; -- --static const char *vbeSymbols[] = { -- "VBEExtendedInit", -- "vbeDoEDID", -- "vbeFree", -- "VBEGetVBEInfo", -- "VBEFreeVBEInfo", -- "VBEGetModeInfo", -- "VBEFreeModeInfo", -- "VBESaveRestore", -- "VBESetVBEMode", -- "VBEGetVBEMode", -- "VBESetDisplayStart", -- "VBESetGetLogicalScanlineLength", -- NULL --}; -- --#ifdef XF86DRI --static const char *drmSymbols[] = { -- "drmAddMap", -- "drmAgpAcquire", -- "drmAgpAlloc", -- "drmAgpBase", -- "drmAgpBind", -- "drmAgpEnable", -- "drmAgpFree", -- "drmAgpGetMode", -- "drmAgpRelease", -- "drmCtlInstHandler", -- "drmGetInterruptFromBusID", -- "drmXGIAgpInit", -- NULL --}; -- --static const char *driSymbols[] = { -- "DRICloseScreen", -- "DRICreateInfoRec", -- "DRIDestroyInfoRec", -- "DRIFinishScreenInit", -- "DRIGetSAREAPrivate", -- "DRILock", -- "DRIQueryVersion", -- "DRIScreenInit", -- "DRIUnlock", --#ifdef XGINEWDRI2 -- "GlxSetVisualConfigs", -- "DRICreatePCIBusID", --#endif -- NULL --}; --#endif -- --static MODULESETUPPROTO(xgiSetup); -- --static XF86ModuleVersionInfo xgiVersRec = { -- XGI_DRIVER_NAME, -- MODULEVENDORSTRING, -- MODINFOSTRING1, -- MODINFOSTRING2, --#ifdef XORG_VERSION_CURRENT -- XORG_VERSION_CURRENT, --#else -- XF86_VERSION_CURRENT, --#endif -- PACKAGE_VERSION_MAJOR, PACKAGE_VERSION_MINOR, PACKAGE_VERSION_PATCHLEVEL, -- ABI_CLASS_VIDEODRV, /* This is a video driver */ --#ifdef ABI_VIDEODRV_VERSION -- ABI_VIDEODRV_VERSION, --#else -- 6, --#endif -- MOD_CLASS_VIDEODRV, -- {0, 0, 0, 0} --}; -- --XF86ModuleData xgiModuleData = { &xgiVersRec, xgiSetup, NULL }; -- --/*** static string ***/ --#ifdef XGIMERGED --static const char *mergednocrt1 = "CRT1 not detected or forced off. %s.\n"; --static const char *mergednocrt2 = -- "No CRT2 output selected or no bridge detected. %s.\n"; --static const char *mergeddisstr = "MergedFB mode disabled"; --static const char *modesforstr = -- "Modes for CRT%d: *********************************************\n"; --static const char *crtsetupstr = -- "------------------------ CRT%d setup -------------------------\n"; --#endif -- --typedef struct --{ -- int width, height; -- float VRefresh, HSync, DCLK; --} ModeTiming; -- --static const ModeTiming establish_timing[] = { -- {800, 600, 60, 37.9, 40}, /* t1 D[0] */ -- {800, 600, 56, 35.1, 36}, /* t1 D[1] */ -- {640, 480, 75, 37.5, 31.5}, /* t1 D[2] */ -- {640, 480, 72, 37.9, 31.5}, /* t1 D[3] */ -- {-1, -1, -1, -1}, /* t1 D[4] 640x480@67Hz, ignore */ -- {640, 480, 60, 31.5, 25.175}, /* t1 D[5] */ -- {-1, -1, -1, -1}, /* t1 D[6] */ -- {-1, -1, -1, -1}, /* t1 D[7] */ -- {1280, 1024, 75, 80.0, 135}, /* t2 D[0] */ -- {1024, 768, 75, 60.0, 78.75}, /* t2 D[1] */ -- {1024, 768, 70, 56.5, 75}, /* t2 D[2] */ -- {1024, 768, 60, 48.4, 65}, /* t2 D[3] */ -- {-1, -1, -1, -1}, /* t2 D[4] 1024x768@87I, ignore */ -- {-1, -1, -1, -1}, /* t2 D[5] 832x624@75Hz, ignore */ -- {800, 600, 75, 46.9, 49.5}, /* t2 D[6] */ -- {800, 600, 72, 48.1, 50} /* t2 D[7] */ --}; -- --static const ModeTiming StdTiming[] = { -- {640, 480, 60, 31.5, 25.175}, -- {640, 480, 72, 37.9, 31.5}, -- {640, 480, 75, 37.5, 31.5}, -- {640, 480, 85, 43.3, 36.0}, -- -- {800, 600, 56, 35.1, 36}, -- {800, 600, 60, 37.9, 40}, -- {800, 600, 72, 48.1, 50}, -- {800, 600, 75, 46.9, 49.5}, -- {800, 600, 85, 53.7, 56.25}, -- -- {1024, 768, 43, 35.5, 44.9}, -- {1024, 768, 60, 48.4, 65}, -- {1024, 768, 70, 56.5, 75}, -- {1024, 768, 75, 60, 78.75}, -- {1024, 768, 85, 68.7, 94.5}, -- -- {1152, 864, 75, 67.5, 108}, -- -- {1280, 960, 60, 60, 108}, -- {1280, 960, 85, 85.9, 148.5}, -- {1280, 1024, 60, 64.0, 108}, -- {1280, 1024, 75, 80, 135}, -- {1280, 1024, 85, 91.1, 157.5}, -- -- {1600, 1200, 60, 75, 162.0}, -- {1600, 1200, 65, 81.3, 175.5}, -- {1600, 1200, 70, 87.5, 189}, -- {1600, 1200, 75, 93.8, 202}, -- {1600, 1200, 85, 106.3, 229.5}, -- -- {1792, 1344, 60, 83.64, 204.75}, -- {1792, 1344, 75, 106.27, 261}, -- -- {1856, 1392, 60, 86.33, 218.25}, -- {1856, 1392, 75, 112.50, 288}, -- -- {1920, 1440, 60, 90, 234}, -- {1920, 1440, 75, 112.5, 297}, -- {-1, -1, -1, -1, -1}, --}; -- -- --static void XGIDumpPalette(ScrnInfoPtr pScrn); --#ifdef DEBUG --static void XGIDumpSR(ScrnInfoPtr pScrn); --static void XGIDumpCR(ScrnInfoPtr pScrn); --static void XGIDumpGR(ScrnInfoPtr pScrn); --static void XGIDumpPart1(ScrnInfoPtr pScrn); --static void XGIDumpPart2(ScrnInfoPtr pScrn); --static void XGIDumpPart3(ScrnInfoPtr pScrn); --static void XGIDumpPart4(ScrnInfoPtr pScrn); --static void XGIDumpMMIO(ScrnInfoPtr pScrn); --#endif -- --static int XGICalcVRate(DisplayModePtr mode); --static unsigned char XGISearchCRT1Rate(ScrnInfoPtr pScrn, -- DisplayModePtr mode); --static void xgiSaveUnlockExtRegisterLock(XGIPtr pXGI, unsigned char *reg1, -- unsigned char *reg2); --static void xgiRestoreExtRegisterLock(XGIPtr pXGI, unsigned char reg1, -- unsigned char reg2); -- -- --static pointer --xgiSetup(pointer module, pointer opts, int *errmaj, int *errmin) --{ -- static Bool setupDone = FALSE; -- -- if (!setupDone) { -- setupDone = TRUE; -- xf86AddDriver(&XGI, module, HaveDriverFuncs); -- LoaderRefSymLists(vgahwSymbols, fbSymbols, xaaSymbols, -- shadowSymbols, ramdacSymbols, ddcSymbols, -- vbeSymbols, int10Symbols, --#ifdef XF86DRI -- drmSymbols, driSymbols, --#endif -- NULL); -- return (pointer) TRUE; -- } -- -- if (errmaj) -- *errmaj = LDR_ONCEONLY; -- return NULL; --} -- -- --static XGIPtr --XGIGetRec(ScrnInfoPtr pScrn) --{ -- /* -- * Allocate an XGIRec, and hook it into pScrn->driverPrivate. -- * pScrn->driverPrivate is initialised to NULL, so we can check if -- * the allocation has already been done. -- */ -- if (pScrn->driverPrivate == NULL) { -- XGIPtr pXGI = xnfcalloc(sizeof(XGIRec), 1); -- -- /* Initialise it to 0 */ -- memset(pXGI, 0, sizeof(XGIRec)); -- -- pScrn->driverPrivate = pXGI; -- pXGI->pScrn = pScrn; -- } -- -- return (XGIPtr) pScrn->driverPrivate; --} -- --static void --XGIFreeRec(ScrnInfoPtr pScrn) --{ -- XGIPtr pXGI = XGIPTR(pScrn); -- XGIEntPtr pXGIEnt = NULL; -- -- /* Just to make sure... */ -- if (!pXGI) -- return; -- -- pXGIEnt = ENTITY_PRIVATE(pXGI); -- if (pXGIEnt) { -- if (!IS_SECOND_HEAD(pXGI)) { -- /* Free memory only if we are first head; in case of an error -- * during init of the second head, the server will continue - -- * and we need the BIOS image and VB_DEVICE_INFO for the first -- * head. -- */ -- if (pXGIEnt->BIOS) -- xfree(pXGIEnt->BIOS); -- pXGIEnt->BIOS = pXGI->BIOS = NULL; -- if (pXGIEnt->XGI_Pr) -- xfree(pXGIEnt->XGI_Pr); -- pXGIEnt->XGI_Pr = pXGI->XGI_Pr = NULL; -- if (pXGIEnt->RenderAccelArray) -- xfree(pXGIEnt->RenderAccelArray); -- pXGIEnt->RenderAccelArray = pXGI->RenderAccelArray = NULL; -- } -- else { -- pXGI->BIOS = NULL; -- pXGI->XGI_Pr = NULL; -- pXGI->RenderAccelArray = NULL; -- } -- } -- else { -- if (pXGI->BIOS) -- xfree(pXGI->BIOS); -- pXGI->BIOS = NULL; -- if (pXGI->XGI_Pr) -- xfree(pXGI->XGI_Pr); -- pXGI->XGI_Pr = NULL; -- if (pXGI->RenderAccelArray) -- xfree(pXGI->RenderAccelArray); -- pXGI->RenderAccelArray = NULL; -- } -- --#ifdef XGIMERGED -- if (pXGI->MetaModes) -- xfree(pXGI->MetaModes); -- pXGI->MetaModes = NULL; -- -- if (pXGI->CRT1Modes) { -- if (pXGI->CRT1Modes != pScrn->modes) { -- if (pScrn->modes) { -- pScrn->currentMode = pScrn->modes; -- do { -- DisplayModePtr p = pScrn->currentMode->next; -- if (pScrn->currentMode->Private) -- xfree(pScrn->currentMode->Private); -- xfree(pScrn->currentMode); -- pScrn->currentMode = p; -- } while (pScrn->currentMode != pScrn->modes); -- } -- pScrn->currentMode = pXGI->CRT1CurrentMode; -- pScrn->modes = pXGI->CRT1Modes; -- pXGI->CRT1CurrentMode = NULL; -- pXGI->CRT1Modes = NULL; -- } -- } --#endif -- if (pXGI->pVbe) -- vbeFree(pXGI->pVbe); -- pXGI->pVbe = NULL; -- if (pScrn->driverPrivate == NULL) -- return; -- xfree(pScrn->driverPrivate); -- pScrn->driverPrivate = NULL; --} -- --static void --XGIDisplayPowerManagementSet(ScrnInfoPtr pScrn, int PowerManagementMode, -- int flags) --{ -- XGIPtr pXGI = XGIPTR(pScrn); -- BOOLEAN docrt1 = TRUE, docrt2 = TRUE; -- unsigned char sr1 = 0, cr17 = 0, cr63 = 0, sr11 = 0, pmreg = 0, sr7 = 0; -- unsigned char p1_13 = 0, p2_0 = 0, oldpmreg = 0; -- BOOLEAN backlight = TRUE; -- -- xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 3, -- "XGIDisplayPowerManagementSet(%d)\n", PowerManagementMode); -- -- if (IS_DUAL_HEAD(pXGI)) { -- if (IS_SECOND_HEAD(pXGI)) -- docrt2 = FALSE; -- else -- docrt1 = FALSE; -- } -- --#ifdef UNLOCK_ALWAYS -- xgiSaveUnlockExtRegisterLock(pXGI, NULL, NULL); --#endif -- -- switch (PowerManagementMode) { -- -- case DPMSModeOn: /* HSync: On, VSync: On */ -- if (docrt1) -- pXGI->Blank = FALSE; -- -- sr1 = 0x00; -- cr17 = 0x80; -- pmreg = 0x00; -- cr63 = 0x00; -- sr7 = 0x10; -- sr11 = (pXGI->LCDon & 0x0C); -- p2_0 = 0x20; -- p1_13 = 0x00; -- backlight = TRUE; -- break; -- -- case DPMSModeSuspend: /* HSync: On, VSync: Off */ -- if (docrt1) -- pXGI->Blank = TRUE; -- -- sr1 = 0x20; -- cr17 = 0x80; -- pmreg = 0x80; -- cr63 = 0x40; -- sr7 = 0x00; -- sr11 = 0x08; -- p2_0 = 0x40; -- p1_13 = 0x80; -- backlight = FALSE; -- break; -- -- case DPMSModeStandby: /* HSync: Off, VSync: On */ -- if (docrt1) -- pXGI->Blank = TRUE; -- -- sr1 = 0x20; -- cr17 = 0x80; -- pmreg = 0x40; -- cr63 = 0x40; -- sr7 = 0x00; -- sr11 = 0x08; -- p2_0 = 0x80; -- p1_13 = 0x40; -- backlight = FALSE; -- break; -- -- case DPMSModeOff: /* HSync: Off, VSync: Off */ -- if (docrt1) -- pXGI->Blank = TRUE; -- -- sr1 = 0x20; -- cr17 = 0x00; -- pmreg = 0xc0; -- cr63 = 0x40; -- sr7 = 0x00; -- sr11 = 0x08; -- p2_0 = 0xc0; -- p1_13 = 0xc0; -- backlight = FALSE; -- break; -- -- default: -- return; -- } -- -- if (docrt1) { -- /* Set/Clear "Display On" bit -- */ -- setXGIIDXREG(XGISR, 0x01, ~0x20, sr1); -- -- if ((!(pXGI->VBFlags & CRT1_LCDA)) -- || (pXGI->XGI_Pr->VBType & VB_XGI301C)) { -- inXGIIDXREG(XGISR, 0x1f, oldpmreg); -- if (!pXGI->CRT1off) { -- setXGIIDXREG(XGISR, 0x1f, 0x3f, pmreg); -- } -- } -- oldpmreg &= 0xc0; -- } -- -- if ((docrt1) && (pmreg != oldpmreg) -- && ((!(pXGI->VBFlags & CRT1_LCDA)) -- || (pXGI->XGI_Pr->VBType & VB_XGI301C))) { -- outXGIIDXREG(XGISR, 0x00, 0x01); /* Synchronous Reset */ -- usleep(10000); -- outXGIIDXREG(XGISR, 0x00, 0x03); /* End Reset */ -- } -- --} -- --/* Mandatory */ --static void --XGIIdentify(int flags) --{ -- xf86PrintChipsets(XGI_NAME, "driver for XGI chipsets", XGIChipsets); -- PDEBUG(ErrorF(" --- XGIIdentify \n")); --} -- --static void --XGIErrorLog(ScrnInfoPtr pScrn, const char *format, ...) --{ -- va_list ap; -- static const char *str = -- "**************************************************\n"; -- -- va_start(ap, format); -- xf86DrvMsg(pScrn->scrnIndex, X_ERROR, str); -- xf86DrvMsg(pScrn->scrnIndex, X_ERROR, " ERROR:\n"); -- xf86VDrvMsgVerb(pScrn->scrnIndex, X_ERROR, 1, format, ap); -- va_end(ap); -- xf86DrvMsg(pScrn->scrnIndex, X_ERROR, -- " END OF MESSAGE\n"); -- xf86DrvMsg(pScrn->scrnIndex, X_ERROR, str); --} -- --#ifdef XSERVER_LIBPCIACCESS --static Bool XGIPciProbe(DriverPtr drv, int entity_num, -- struct pci_device *dev, intptr_t match_data) --{ -- ScrnInfoPtr pScrn; -- -- -- pScrn = xf86ConfigPciEntity(NULL, 0, entity_num, NULL, -- NULL, NULL, NULL, NULL, NULL); -- if (pScrn != NULL) { -- XGIPtr pXGI; -- -- /* Fill in what we can of the ScrnInfoRec */ -- pScrn->driverVersion = XGI_CURRENT_VERSION; -- pScrn->driverName = XGI_DRIVER_NAME; -- pScrn->name = XGI_NAME; -- pScrn->Probe = NULL; -- pScrn->PreInit = XGIPreInit; -- pScrn->ScreenInit = XGIScreenInit; -- pScrn->SwitchMode = XGISwitchMode; -- pScrn->AdjustFrame = XGIAdjustFrame; -- pScrn->EnterVT = XGIEnterVT; -- pScrn->LeaveVT = XGILeaveVT; -- pScrn->FreeScreen = XGIFreeScreen; -- pScrn->ValidMode = XGIValidMode; -- -- -- pXGI = XGIGetRec(pScrn); -- if (pXGI == NULL) { -- return FALSE; -- } -- -- pXGI->PciInfo = dev; -- } -- -- return (pScrn != NULL); --} -- --#else -- --/* Mandatory */ --static Bool --XGIProbe(DriverPtr drv, int flags) --{ -- int i; -- GDevPtr *devSections; -- int *usedChips; -- int numDevSections; -- int numUsed; -- Bool foundScreen = FALSE; -- -- /* -- * The aim here is to find all cards that this driver can handle, -- * and for the ones not already claimed by another driver, claim the -- * slot, and allocate a ScrnInfoRec. -- * -- * This should be a minimal probe, and it should under no circumstances -- * change the state of the hardware. Because a device is found, don't -- * assume that it will be used. Don't do any initialisations other than -- * the required ScrnInfoRec initialisations. Don't allocate any new -- * data structures. -- * -- */ -- -- /* -- * Next we check, if there has been a chipset override in the config file. -- * For this we must find out if there is an active device section which -- * is relevant, i.e., which has no driver specified or has THIS driver -- * specified. -- */ -- -- if ((numDevSections = -- xf86MatchDevice(XGI_DRIVER_NAME, &devSections)) <= 0) { -- /* -- * There's no matching device section in the config file, so quit -- * now. -- */ -- return FALSE; -- } -- -- PDEBUG(ErrorF(" --- XGIProbe \n")); -- /* -- * We need to probe the hardware first. We then need to see how this -- * fits in with what is given in the config file, and allow the config -- * file info to override any contradictions. -- */ -- -- /* -- * All of the cards this driver supports are PCI, so the "probing" just -- * amounts to checking the PCI data that the server has already collected. -- */ -- if (xf86GetPciVideoInfo() == NULL) { -- /* -- * We won't let anything in the config file override finding no -- * PCI video cards at all. This seems reasonable now, but we'll see. -- */ -- return FALSE; -- } -- -- numUsed = xf86MatchPciInstances(XGI_NAME, PCI_VENDOR_XGI, -- XGIChipsets, XGIPciChipsets, devSections, -- numDevSections, drv, &usedChips); -- -- /* Free it since we don't need that list after this */ -- xfree(devSections); -- if (numUsed <= 0) -- return FALSE; -- -- if (flags & PROBE_DETECT) { -- foundScreen = TRUE; -- } -- else -- for (i = 0; i < numUsed; i++) { -- ScrnInfoPtr pScrn; --#ifdef XGIDUALHEAD -- EntityInfoPtr pEnt; --#endif -- -- /* Allocate a ScrnInfoRec and claim the slot */ -- pScrn = NULL; -- -- if ((pScrn = xf86ConfigPciEntity(pScrn, 0, usedChips[i], -- XGIPciChipsets, NULL, NULL, -- NULL, NULL, NULL))) { -- /* Fill in what we can of the ScrnInfoRec */ -- pScrn->driverVersion = XGI_CURRENT_VERSION; -- pScrn->driverName = XGI_DRIVER_NAME; -- pScrn->name = XGI_NAME; -- pScrn->Probe = XGIProbe; -- pScrn->PreInit = XGIPreInit; -- pScrn->ScreenInit = XGIScreenInit; -- pScrn->SwitchMode = XGISwitchMode; -- pScrn->AdjustFrame = XGIAdjustFrame; -- pScrn->EnterVT = XGIEnterVT; -- pScrn->LeaveVT = XGILeaveVT; -- pScrn->FreeScreen = XGIFreeScreen; -- pScrn->ValidMode = XGIValidMode; -- foundScreen = TRUE; -- } --#ifdef XGIDUALHEAD -- pEnt = xf86GetEntityInfo(usedChips[i]); -- --#endif -- } -- xfree(usedChips); -- -- return foundScreen; --} --#endif -- -- --/* Some helper functions for MergedFB mode */ -- --#ifdef XGIMERGED -- --/* Copy and link two modes form mergedfb mode -- * (Code base taken from mga driver) -- * Copys mode i, links the result to dest, and returns it. -- * Links i and j in Private record. -- * If dest is NULL, return value is copy of i linked to itself. -- * For mergedfb auto-config, we only check the dimension -- * against virtualX/Y, if they were user-provided. -- */ --static DisplayModePtr --XGICopyModeNLink(ScrnInfoPtr pScrn, DisplayModePtr dest, -- DisplayModePtr i, DisplayModePtr j, XGIScrn2Rel srel) --{ -- XGIPtr pXGI = XGIPTR(pScrn); -- DisplayModePtr mode; -- int dx = 0, dy = 0; -- -- if (!((mode = xalloc(sizeof(DisplayModeRec))))) -- return dest; -- memcpy(mode, i, sizeof(DisplayModeRec)); -- if (!((mode->Private = xalloc(sizeof(XGIMergedDisplayModeRec))))) { -- xfree(mode); -- return dest; -- } -- ((XGIMergedDisplayModePtr) mode->Private)->CRT1 = i; -- ((XGIMergedDisplayModePtr) mode->Private)->CRT2 = j; -- ((XGIMergedDisplayModePtr) mode->Private)->CRT2Position = srel; -- mode->PrivSize = 0; -- -- switch (srel) { -- case xgiLeftOf: -- case xgiRightOf: -- if (!(pScrn->display->virtualX)) { -- dx = i->HDisplay + j->HDisplay; -- } -- else { -- dx = min(pScrn->virtualX, i->HDisplay + j->HDisplay); -- } -- dx -= mode->HDisplay; -- if (!(pScrn->display->virtualY)) { -- dy = max(i->VDisplay, j->VDisplay); -- } -- else { -- dy = min(pScrn->virtualY, max(i->VDisplay, j->VDisplay)); -- } -- dy -= mode->VDisplay; -- break; -- case xgiAbove: -- case xgiBelow: -- if (!(pScrn->display->virtualY)) { -- dy = i->VDisplay + j->VDisplay; -- } -- else { -- dy = min(pScrn->virtualY, i->VDisplay + j->VDisplay); -- } -- dy -= mode->VDisplay; -- if (!(pScrn->display->virtualX)) { -- dx = max(i->HDisplay, j->HDisplay); -- } -- else { -- dx = min(pScrn->virtualX, max(i->HDisplay, j->HDisplay)); -- } -- dx -= mode->HDisplay; -- break; -- case xgiClone: -- if (!(pScrn->display->virtualX)) { -- dx = max(i->HDisplay, j->HDisplay); -- } -- else { -- dx = min(pScrn->virtualX, max(i->HDisplay, j->HDisplay)); -- } -- dx -= mode->HDisplay; -- if (!(pScrn->display->virtualY)) { -- dy = max(i->VDisplay, j->VDisplay); -- } -- else { -- dy = min(pScrn->virtualY, max(i->VDisplay, j->VDisplay)); -- } -- dy -= mode->VDisplay; -- break; -- } -- mode->HDisplay += dx; -- mode->HSyncStart += dx; -- mode->HSyncEnd += dx; -- mode->HTotal += dx; -- mode->VDisplay += dy; -- mode->VSyncStart += dy; -- mode->VSyncEnd += dy; -- mode->VTotal += dy; -- mode->Clock = 0; -- -- if (((mode->HDisplay * ((pScrn->bitsPerPixel + 7) / 8) * mode->VDisplay) > -- pXGI->maxxfbmem) || (mode->HDisplay > 4088) -- || (mode->VDisplay > 4096)) { -- -- xf86DrvMsg(pScrn->scrnIndex, X_ERROR, -- "Skipped %dx%d, not enough video RAM or beyond hardware specs\n", -- mode->HDisplay, mode->VDisplay); -- xfree(mode->Private); -- xfree(mode); -- -- return dest; -- } -- --#ifdef XGIXINERAMA -- if (srel != xgiClone) { -- pXGI->AtLeastOneNonClone = TRUE; -- } --#endif -- -- xf86DrvMsg(pScrn->scrnIndex, X_INFO, -- "Merged %dx%d and %dx%d to %dx%d%s\n", -- i->HDisplay, i->VDisplay, j->HDisplay, j->VDisplay, -- mode->HDisplay, mode->VDisplay, -- (srel == xgiClone) ? " (Clone)" : ""); -- -- mode->next = mode; -- mode->prev = mode; -- -- if (dest) { -- mode->next = dest->next; /* Insert node after "dest" */ -- dest->next->prev = mode; -- mode->prev = dest; -- dest->next = mode; -- } -- -- return mode; --} -- --/* Helper function to find a mode from a given name -- * (Code base taken from mga driver) -- */ --static DisplayModePtr --XGIGetModeFromName(char *str, DisplayModePtr i) --{ -- DisplayModePtr c = i; -- if (!i) -- return NULL; -- do { -- if (strcmp(str, c->name) == 0) -- return c; -- c = c->next; -- } while (c != i); -- return NULL; --} -- --static DisplayModePtr --XGIFindWidestTallestMode(DisplayModePtr i, Bool tallest) --{ -- DisplayModePtr c = i, d = NULL; -- int max = 0; -- if (!i) -- return NULL; -- do { -- if (tallest) { -- if (c->VDisplay > max) { -- max = c->VDisplay; -- d = c; -- } -- } -- else { -- if (c->HDisplay > max) { -- max = c->HDisplay; -- d = c; -- } -- } -- c = c->next; -- } while (c != i); -- return d; --} -- --static DisplayModePtr --XGIGenerateModeListFromLargestModes(ScrnInfoPtr pScrn, -- DisplayModePtr i, DisplayModePtr j, -- XGIScrn2Rel srel) --{ --#ifdef XGIXINERAMA -- XGIPtr pXGI = XGIPTR(pScrn); --#endif -- DisplayModePtr mode1 = NULL; -- DisplayModePtr mode2 = NULL; -- DisplayModePtr result = NULL; -- --#ifdef XGIXINERAMA -- pXGI->AtLeastOneNonClone = FALSE; --#endif -- -- switch (srel) { -- case xgiLeftOf: -- case xgiRightOf: -- mode1 = XGIFindWidestTallestMode(i, FALSE); -- mode2 = XGIFindWidestTallestMode(j, FALSE); -- break; -- case xgiAbove: -- case xgiBelow: -- mode1 = XGIFindWidestTallestMode(i, TRUE); -- mode2 = XGIFindWidestTallestMode(j, TRUE); -- break; -- case xgiClone: -- mode1 = i; -- mode2 = j; -- } -- -- if (mode1 && mode2) { -- return (XGICopyModeNLink(pScrn, result, mode1, mode2, srel)); -- } -- else { -- return NULL; -- } --} -- --/* Generate the merged-fb mode modelist from metamodes -- * (Code base taken from mga driver) -- */ --static DisplayModePtr --XGIGenerateModeListFromMetaModes(ScrnInfoPtr pScrn, char *str, -- DisplayModePtr i, DisplayModePtr j, -- XGIScrn2Rel srel) --{ --#ifdef XGIXINERAMA -- XGIPtr pXGI = XGIPTR(pScrn); --#endif -- char *strmode = str; -- char modename[256]; -- Bool gotdash = FALSE; -- XGIScrn2Rel sr; -- DisplayModePtr mode1 = NULL; -- DisplayModePtr mode2 = NULL; -- DisplayModePtr result = NULL; -- --#ifdef XGIXINERAMA -- pXGI->AtLeastOneNonClone = FALSE; --#endif -- -- do { -- switch (*str) { -- case 0: -- case '-': -- case ' ': -- if ((strmode != str)) { -- -- strncpy(modename, strmode, str - strmode); -- modename[str - strmode] = 0; -- -- if (gotdash) { -- if (mode1 == NULL) -- return NULL; -- mode2 = XGIGetModeFromName(modename, j); -- if (!mode2) { -- xf86DrvMsg(pScrn->scrnIndex, X_WARNING, -- "Mode \"%s\" is not a supported mode for CRT2\n", -- modename); -- xf86DrvMsg(pScrn->scrnIndex, X_WARNING, -- "Skipping metamode \"%s-%s\".\n", -- mode1->name, modename); -- mode1 = NULL; -- } -- } -- else { -- mode1 = XGIGetModeFromName(modename, i); -- if (!mode1) { -- char *tmps = str; -- xf86DrvMsg(pScrn->scrnIndex, X_WARNING, -- "Mode \"%s\" is not a supported mode for CRT1\n", -- modename); -- gotdash = FALSE; -- while (*tmps == ' ') -- tmps++; -- if (*tmps == '-') { /* skip the next mode */ -- tmps++; -- while ((*tmps == ' ') && (*tmps != 0)) -- tmps++; /* skip spaces */ -- while ((*tmps != ' ') && (*tmps != '-') -- && (*tmps != 0)) -- tmps++; /* skip modename */ -- strncpy(modename, strmode, tmps - strmode); -- modename[tmps - strmode] = 0; -- str = tmps - 1; -- } -- xf86DrvMsg(pScrn->scrnIndex, X_WARNING, -- "Skipping metamode \"%s\".\n", modename); -- mode1 = NULL; -- } -- } -- gotdash = FALSE; -- } -- strmode = str + 1; -- gotdash |= (*str == '-'); -- -- if (*str != 0) -- break; -- /* Fall through otherwise */ -- -- default: -- if (!gotdash && mode1) { -- sr = srel; -- if (!mode2) { -- mode2 = XGIGetModeFromName(mode1->name, j); -- sr = xgiClone; -- } -- if (!mode2) { -- xf86DrvMsg(pScrn->scrnIndex, X_WARNING, -- "Mode: \"%s\" is not a supported mode for CRT2\n", -- mode1->name); -- xf86DrvMsg(pScrn->scrnIndex, X_WARNING, -- "Skipping metamode \"%s\".\n", modename); -- mode1 = NULL; -- } -- else { -- result = -- XGICopyModeNLink(pScrn, result, mode1, mode2, sr); -- mode1 = NULL; -- mode2 = NULL; -- } -- } -- break; -- -- } -- -- } while (*(str++) != 0); -- -- return result; --} -- --static DisplayModePtr --XGIGenerateModeList(ScrnInfoPtr pScrn, char *str, -- DisplayModePtr i, DisplayModePtr j, XGIScrn2Rel srel) --{ -- if (str != NULL) { -- return (XGIGenerateModeListFromMetaModes(pScrn, str, i, j, srel)); -- } -- else { -- xf86DrvMsg(pScrn->scrnIndex, X_INFO, -- "No MetaModes given, linking %s modes by default\n", -- (srel == xgiClone) ? "first" : -- (((srel == xgiLeftOf) -- || (srel == xgiRightOf)) ? "widest" : "tallest")); -- return (XGIGenerateModeListFromLargestModes(pScrn, i, j, srel)); -- } --} -- --static void --XGIRecalcDefaultVirtualSize(ScrnInfoPtr pScrn) --{ -- DisplayModePtr mode, bmode; -- int max; -- static const char *str = "MergedFB: Virtual %s %d\n"; -- -- if (!(pScrn->display->virtualX)) { -- mode = bmode = pScrn->modes; -- max = 0; -- do { -- if (mode->HDisplay > max) -- max = mode->HDisplay; -- mode = mode->next; -- } while (mode != bmode); -- pScrn->virtualX = max; -- pScrn->displayWidth = max; -- xf86DrvMsg(pScrn->scrnIndex, X_PROBED, str, "width", max); -- } -- if (!(pScrn->display->virtualY)) { -- mode = bmode = pScrn->modes; -- max = 0; -- do { -- if (mode->VDisplay > max) -- max = mode->VDisplay; -- mode = mode->next; -- } while (mode != bmode); -- pScrn->virtualY = max; -- xf86DrvMsg(pScrn->scrnIndex, X_PROBED, str, "height", max); -- } --} -- --static void --XGIMergedFBSetDpi(ScrnInfoPtr pScrn1, ScrnInfoPtr pScrn2, XGIScrn2Rel srel) --{ -- XGIPtr pXGI = XGIPTR(pScrn1); -- MessageType from = X_DEFAULT; -- xf86MonPtr DDC1 = (xf86MonPtr) (pScrn1->monitor->DDC); -- xf86MonPtr DDC2 = (xf86MonPtr) (pScrn2->monitor->DDC); -- int ddcWidthmm = 0, ddcHeightmm = 0; -- const char *dsstr = "MergedFB: Display dimensions: (%d, %d) mm\n"; -- -- /* This sets the DPI for MergedFB mode. The problem is that -- * this can never be exact, because the output devices may -- * have different dimensions. This function tries to compromise -- * through a few assumptions, and it just calculates an average DPI -- * value for both monitors. -- */ -- -- /* Given DisplaySize should regard BOTH monitors */ -- pScrn1->widthmm = pScrn1->monitor->widthmm; -- pScrn1->heightmm = pScrn1->monitor->heightmm; -- -- /* Get DDC display size; if only either CRT1 or CRT2 provided these, -- * assume equal dimensions for both, otherwise add dimensions -- */ -- if ((DDC1 && (DDC1->features.hsize > 0 && DDC1->features.vsize > 0)) && -- (DDC2 && (DDC2->features.hsize > 0 && DDC2->features.vsize > 0))) { -- ddcWidthmm = max(DDC1->features.hsize, DDC2->features.hsize) * 10; -- ddcHeightmm = max(DDC1->features.vsize, DDC2->features.vsize) * 10; -- switch (srel) { -- case xgiLeftOf: -- case xgiRightOf: -- ddcWidthmm = (DDC1->features.hsize + DDC2->features.hsize) * 10; -- break; -- case xgiAbove: -- case xgiBelow: -- ddcHeightmm = (DDC1->features.vsize + DDC2->features.vsize) * 10; -- default: -- break; -- } -- } -- else if (DDC1 && (DDC1->features.hsize > 0 && DDC1->features.vsize > 0)) { -- ddcWidthmm = DDC1->features.hsize * 10; -- ddcHeightmm = DDC1->features.vsize * 10; -- switch (srel) { -- case xgiLeftOf: -- case xgiRightOf: -- ddcWidthmm *= 2; -- break; -- case xgiAbove: -- case xgiBelow: -- ddcHeightmm *= 2; -- default: -- break; -- } -- } -- else if (DDC2 && (DDC2->features.hsize > 0 && DDC2->features.vsize > 0)) { -- ddcWidthmm = DDC2->features.hsize * 10; -- ddcHeightmm = DDC2->features.vsize * 10; -- switch (srel) { -- case xgiLeftOf: -- case xgiRightOf: -- ddcWidthmm *= 2; -- break; -- case xgiAbove: -- case xgiBelow: -- ddcHeightmm *= 2; -- default: -- break; -- } -- } -- -- if (monitorResolution > 0) { -- -- /* Set command line given values (overrules given options) */ -- pScrn1->xDpi = monitorResolution; -- pScrn1->yDpi = monitorResolution; -- from = X_CMDLINE; -- -- } -- else if (pXGI->MergedFBXDPI) { -- -- /* Set option-wise given values (overrule DisplaySize) */ -- pScrn1->xDpi = pXGI->MergedFBXDPI; -- pScrn1->yDpi = pXGI->MergedFBYDPI; -- from = X_CONFIG; -- -- } -- else if (pScrn1->widthmm > 0 || pScrn1->heightmm > 0) { -- -- /* Set values calculated from given DisplaySize */ -- from = X_CONFIG; -- if (pScrn1->widthmm > 0) { -- pScrn1->xDpi = -- (int) ((double) pScrn1->virtualX * 25.4 / pScrn1->widthmm); -- } -- if (pScrn1->heightmm > 0) { -- pScrn1->yDpi = -- (int) ((double) pScrn1->virtualY * 25.4 / pScrn1->heightmm); -- } -- xf86DrvMsg(pScrn1->scrnIndex, from, dsstr, pScrn1->widthmm, -- pScrn1->heightmm); -- -- } -- else if (ddcWidthmm && ddcHeightmm) { -- -- /* Set values from DDC-provided display size */ -- from = X_PROBED; -- xf86DrvMsg(pScrn1->scrnIndex, from, dsstr, ddcWidthmm, ddcHeightmm); -- pScrn1->widthmm = ddcWidthmm; -- pScrn1->heightmm = ddcHeightmm; -- if (pScrn1->widthmm > 0) { -- pScrn1->xDpi = -- (int) ((double) pScrn1->virtualX * 25.4 / pScrn1->widthmm); -- } -- if (pScrn1->heightmm > 0) { -- pScrn1->yDpi = -- (int) ((double) pScrn1->virtualY * 25.4 / pScrn1->heightmm); -- } -- -- } -- else { -- -- pScrn1->xDpi = pScrn1->yDpi = DEFAULT_DPI; -- -- } -- -- /* Sanity check */ -- if (pScrn1->xDpi > 0 && pScrn1->yDpi <= 0) -- pScrn1->yDpi = pScrn1->xDpi; -- if (pScrn1->yDpi > 0 && pScrn1->xDpi <= 0) -- pScrn1->xDpi = pScrn1->yDpi; -- -- pScrn2->xDpi = pScrn1->xDpi; -- pScrn2->yDpi = pScrn1->yDpi; -- -- xf86DrvMsg(pScrn1->scrnIndex, from, "MergedFB: DPI set to (%d, %d)\n", -- pScrn1->xDpi, pScrn1->yDpi); --} -- --static void --XGIFreeCRT2Structs(XGIPtr pXGI) --{ -- if (pXGI->CRT2pScrn) { -- if (pXGI->CRT2pScrn->modes) { -- while (pXGI->CRT2pScrn->modes) -- xf86DeleteMode(&pXGI->CRT2pScrn->modes, -- pXGI->CRT2pScrn->modes); -- } -- if (pXGI->CRT2pScrn->monitor) { -- if (pXGI->CRT2pScrn->monitor->Modes) { -- while (pXGI->CRT2pScrn->monitor->Modes) -- xf86DeleteMode(&pXGI->CRT2pScrn->monitor->Modes, -- pXGI->CRT2pScrn->monitor->Modes); -- } -- if (pXGI->CRT2pScrn->monitor->DDC) -- xfree(pXGI->CRT2pScrn->monitor->DDC); -- xfree(pXGI->CRT2pScrn->monitor); -- } -- xfree(pXGI->CRT2pScrn); -- pXGI->CRT2pScrn = NULL; -- } --} -- --#endif /* End of MergedFB helpers */ -- --static xf86MonPtr --XGIInternalDDC(ScrnInfoPtr pScrn, int crtno) --{ -- XGIPtr pXGI = XGIPTR(pScrn); -- unsigned char buffer[256]; -- -- int RealOff; -- unsigned char *page; -- -- xf86MonPtr pMonitor = NULL; -- xf86Int10InfoPtr pInt = NULL; /* Our int10 */ -- -- static char *crtno_means_str[] = { -- "CRT1", "DVI", "CRT2" -- }; -- -- if (crtno > 2 || crtno < 0) { -- xf86DrvMsg(pScrn->scrnIndex, X_WARNING, -- "XGIInternalDDC(): Can not get EDID for crtno = %d,abort.\n", -- crtno); -- } -- else { -- xf86DrvMsg(pScrn->scrnIndex, X_INFO, -- "XGIInternalDDC(): getting EDID for %s.\n", -- crtno_means_str[crtno]); -- } -- -- if (xf86LoadSubModule(pScrn, "int10")) { -- xf86LoaderReqSymLists(int10Symbols, NULL); -- pInt = xf86InitInt10(pXGI->pEnt->index); -- if (pInt == NULL) { -- xf86DrvMsg(pScrn->scrnIndex, X_WARNING, -- "XGIInternalDDC(): Can not initialize pInt, abort.\n"); -- return NULL; -- } -- -- page = xf86Int10AllocPages(pInt, 1, &RealOff); -- if (page == NULL) { -- xf86FreeInt10(pInt); -- xf86DrvMsg(pScrn->scrnIndex, X_WARNING, -- "XGIInternalDDC(): Can not initialize real mode buffer, abort.\n"); -- return NULL; -- } -- } -- -- if (pInt) { -- pInt->ax = 0x4f15; /* VESA DDC supporting */ -- pInt->bx = 1; /* get EDID */ -- pInt->cx = crtno; /* port 0 or 1 for CRT 1 or 2 */ -- pInt->es = SEG_ADDR(RealOff); -- pInt->di = SEG_OFF(RealOff); -- pInt->num = 0x10; -- xf86ExecX86int10(pInt); -- -- PDEBUG3(ErrorF -- ("ax = %04X bx = %04X cx = %04X dx = %04X si = %04X di = %04X es = %04X\n", -- pInt->ax, pInt->bx, pInt->cx, pInt->dx, pInt->si, pInt->di, -- pInt->es)); -- -- if ((pInt->ax & 0xff00) == 0) { -- int i; -- xf86DrvMsg(pScrn->scrnIndex, X_INFO, -- "XGIInternalDDC(): VESA get DDC success for CRT %d.\n", -- crtno + 1); -- -- for (i = 0; i < 128; i++) { -- buffer[i] = page[i]; -- } -- --#ifdef DEBUG5 -- for (i = 0; i < 128; i += 16) { -- unsigned j; -- ErrorF("EDID[%02X]", i); -- for (j = 0; j < 16; j++) { -- ErrorF(" %02X", buffer[i + j]); -- } -- ErrorF("\n"); -- } --#endif /* DEBUG3 */ -- -- xf86LoaderReqSymLists(ddcSymbols, NULL); -- pMonitor = xf86InterpretEDID(pScrn->scrnIndex, buffer); -- -- if (pMonitor == NULL) { -- xf86DrvMsg(pScrn->scrnIndex, X_WARNING, -- "CRT%d DDC EDID corrupt\n", crtno + 1); -- return (NULL); -- } -- xf86UnloadSubModule("ddc"); -- } -- else { -- xf86DrvMsg(pScrn->scrnIndex, X_WARNING, -- "XGIInternalDDC(): VESA get DDC fail for CRT %d.\n", -- crtno + 1); -- } -- -- xf86Int10FreePages(pInt, page, 1); -- xf86FreeInt10(pInt); -- } -- return pMonitor; --} -- --/* static xf86MonPtr --XGIDoPrivateDDC(ScrnInfoPtr pScrn, int *crtnum) --{ -- XGIPtr pXGI = XGIPTR(pScrn); -- -- if(IS_DUAL_HEAD(pXGI)) -- { -- if(IS_SECOND_HEAD(pXGI)) -- { -- *crtnum = 1; -- return(XGIInternalDDC(pScrn, 0)); -- } -- else -- { -- *crtnum = 2; -- return(XGIInternalDDC(pScrn, 1)); -- } -- } -- else if(pXGI->CRT1off) -- { -- *crtnum = 2; -- return(XGIInternalDDC(pScrn, 1)); -- } -- else -- { -- *crtnum = 1; -- return(XGIInternalDDC(pScrn, 0)); -- } --} */ -- -- --#ifdef DEBUG5 --static void --XGIDumpMonitorInfo(xf86MonPtr pMonitor) --{ -- struct detailed_timings *pd_timings; -- Uchar *pserial; -- Uchar *pascii_data; -- Uchar *pname; -- struct monitor_ranges *pranges; -- struct std_timings *pstd_t; -- struct whitePoints *pwp; -- int i, j; -- -- if (pMonitor == NULL) { -- ErrorF("Monitor is NULL"); -- return; -- } -- -- ErrorF("pMonitor->scrnIndex = %d\n", pMonitor->scrnIndex); -- ErrorF -- ("vendor = %c%c%c%c, prod_id = %x serial = %d week = %d year = %d\n", -- pMonitor->vendor.name[0], pMonitor->vendor.name[1], -- pMonitor->vendor.name[2], pMonitor->vendor.name[3], -- pMonitor->vendor.prod_id, pMonitor->vendor.serial, -- pMonitor->vendor.week, pMonitor->vendor.year); -- -- ErrorF("ver = %d %d\n", pMonitor->ver.version, pMonitor->ver.revision); -- ErrorF("intput type = %d voltage = %d setup = %d sync = %d\n", -- pMonitor->features.input_type, -- pMonitor->features.input_voltage, -- pMonitor->features.input_setup, pMonitor->features.input_sync); -- ErrorF("hsize = %d vsize = %d gamma=%8.3f\n", -- pMonitor->features.hsize, -- pMonitor->features.vsize, pMonitor->features.gamma); -- -- ErrorF("dpms = %d display_type = %d msc = %d\n", -- pMonitor->features.dpms, -- pMonitor->features.display_type, pMonitor->features.msc); -- ErrorF -- ("redx,redy,greenx,greeny,bluex,bluey,whitex,whitey = %8.3f,%8.3f,%8.3f,%8.3f,%8.3f,%8.3f,%8.3f,%8.3f\n", -- pMonitor->features.redx, pMonitor->features.redy, -- pMonitor->features.greenx, pMonitor->features.greeny, -- pMonitor->features.bluex, pMonitor->features.bluey, -- pMonitor->features.whitex, pMonitor->features.whitey); -- -- ErrorF("established_timings = (t1)%d%d%d%d%d%d%d%d", -- (pMonitor->timings1.t1 >> 7) & 1, -- (pMonitor->timings1.t1 >> 6) & 1, -- (pMonitor->timings1.t1 >> 5) & 1, -- (pMonitor->timings1.t1 >> 4) & 1, -- (pMonitor->timings1.t1 >> 3) & 1, -- (pMonitor->timings1.t1 >> 2) & 1, -- (pMonitor->timings1.t1 >> 1) & 1, -- (pMonitor->timings1.t1 >> 0) & 1); -- ErrorF("(t2) %d%d%d%d%d%d%d%d", -- (pMonitor->timings1.t1 >> 7) & 1, -- (pMonitor->timings1.t1 >> 6) & 1, -- (pMonitor->timings1.t1 >> 5) & 1, -- (pMonitor->timings1.t1 >> 4) & 1, -- (pMonitor->timings1.t1 >> 3) & 1, -- (pMonitor->timings1.t1 >> 2) & 1, -- (pMonitor->timings1.t1 >> 1) & 1, -- (pMonitor->timings1.t1 >> 0) & 1); -- ErrorF("(t_manu)%d%d%d%d%d%d%d%d\n", -- (pMonitor->timings1.t_manu >> 7) & 1, -- (pMonitor->timings1.t_manu >> 6) & 1, -- (pMonitor->timings1.t_manu >> 5) & 1, -- (pMonitor->timings1.t_manu >> 4) & 1, -- (pMonitor->timings1.t_manu >> 3) & 1, -- (pMonitor->timings1.t_manu >> 2) & 1, -- (pMonitor->timings1.t_manu >> 1) & 1, -- (pMonitor->timings1.t_manu >> 0) & 1); -- -- for (i = 0; i < 7; i++) { -- ErrorF -- ("std timing %d: hsize = %d, vsize = %d, refresh = %d, id = %d\n", -- i, pMonitor->timings2[i].hsize, pMonitor->timings2[i].vsize, -- pMonitor->timings2[i].refresh, pMonitor->timings2[i].id); -- } -- -- for (i = 0; i < 4; i++) { -- ErrorF("Detail timing section %d\n", i); -- ErrorF("type = %x\n", pMonitor->det_mon[i].type); -- switch (pMonitor->det_mon[i].type) { -- case DS_SERIAL: -- ErrorF("type = %x DS_SERIAL = %x\n", pMonitor->det_mon[i].type, -- DS_SERIAL); -- break; -- case DS_ASCII_STR: -- ErrorF("type = %x DS_ASCII_STR = %x\n", pMonitor->det_mon[i].type, -- DS_ASCII_STR); -- break; -- case DS_NAME: -- ErrorF("type = %x DS_NAME = %x\n", pMonitor->det_mon[i].type, -- DS_NAME); -- break; -- case DS_RANGES: -- ErrorF("type = %x DS_RANGES = %x\n", pMonitor->det_mon[i].type, -- DS_RANGES); -- break; -- case DS_WHITE_P: -- ErrorF("type = %x DS_WHITE_P = %x\n", pMonitor->det_mon[i].type, -- DS_WHITE_P); -- break; -- case DS_STD_TIMINGS: -- ErrorF("type = %x DS_STD_TIMINGS = %x\n", -- pMonitor->det_mon[i].type, DS_STD_TIMINGS); -- break; -- } -- switch (pMonitor->det_mon[i].type) { -- case DS_SERIAL: -- pserial = pMonitor->det_mon[i].section.serial; -- ErrorF("seial: "); -- for (j = 0; j < 13; j++) { -- ErrorF("%02X", pserial[j]); -- } -- ErrorF("\n"); -- break; -- case DS_ASCII_STR: -- pascii_data = pMonitor->det_mon[i].section.ascii_data; -- ErrorF("ascii: "); -- for (j = 0; j < 13; j++) { -- ErrorF("%c", pascii_data[j]); -- } -- ErrorF("\n"); -- break; -- case DS_NAME: -- pname = pMonitor->det_mon[i].section.name; -- ErrorF("name: "); -- for (j = 0; j < 13; j++) { -- ErrorF("%c", pname[j]); -- } -- ErrorF("\n"); -- break; -- case DS_RANGES: -- pranges = &(pMonitor->det_mon[i].section.ranges); -- ErrorF -- ("min_v = %d max_v = %d min_h = %d max_h = %d max_clock = %d\n", -- pranges->min_v, pranges->max_v, pranges->min_h, -- pranges->max_h, pranges->max_clock); -- break; -- case DS_WHITE_P: -- pwp = pMonitor->det_mon[i].section.wp; -- for (j = 0; j < 2; j++) { -- ErrorF -- ("wp[%d].index = %d white_x = %8.3f white_y = %8.3f white_gamma = %8.3f\n", -- j, pwp[j].index, pwp[j].white_x, pwp[j].white_y, -- pwp[j].white_gamma); -- } -- break; -- case DS_STD_TIMINGS: -- pstd_t = pMonitor->det_mon[i].section.std_t; -- for (j = 0; j < 5; j++) { -- ErrorF -- ("std_t[%d] hsize = %d vsize = %d refresh = %d id = %d\n", -- j, pstd_t[j].hsize, pstd_t[j].vsize, pstd_t[j].refresh, -- pstd_t[j].id); -- } -- break; -- case DT: -- -- pd_timings = &pMonitor->det_mon[i].section.d_timings; -- ErrorF("Detail Timing Descriptor\n"); -- ErrorF("clock = %d\n", pd_timings->clock); -- ErrorF("h_active = %d\n", pd_timings->h_active); -- ErrorF("h_blanking = %d\n", pd_timings->h_blanking); -- ErrorF("v_active = %d\n", pd_timings->v_active); -- ErrorF("v_blanking = %d\n", pd_timings->v_blanking); -- ErrorF("h_sync_off = %d\n", pd_timings->h_sync_off); -- ErrorF("h_sync_width = %d\n", pd_timings->h_sync_width); -- ErrorF("v_sync_off = %d\n", pd_timings->v_sync_off); -- ErrorF("v_sync_width = %d\n", pd_timings->v_sync_width); -- ErrorF("h_size = %d\n", pd_timings->h_size); -- ErrorF("v_size = %d\n", pd_timings->v_size); -- ErrorF("h_border = %d\n", pd_timings->h_border); -- ErrorF("v_border = %d\n", pd_timings->v_border); -- ErrorF("interlaced = %d stereo = %x sync = %x misc = %x\n", -- pd_timings->interlaced, -- pd_timings->stereo, pd_timings->sync, pd_timings->misc); -- break; -- } -- } -- -- for (i = 0; i < 128; i += 16) { -- ErrorF("rawData[%02X]:", i); -- for (j = 0; j < 16; j++) { -- ErrorF(" %02X", pMonitor->rawData[i + j]); -- } -- ErrorF("\n"); -- } --} --#endif -- --static void --XGIGetMonitorRangeByDDC(MonitorRangePtr range, xf86MonPtr pMonitor) --{ -- int i, j; -- float VF, HF; -- struct detailed_timings *pd_timings; -- struct monitor_ranges *pranges; -- struct std_timings *pstd_t; -- -- if ((range == NULL) || (pMonitor == NULL)) { -- return; /* ignore */ -- } -- -- PDEBUG5(ErrorF -- ("establish timing t1 = %02x t2=%02x\n", pMonitor->timings1.t1, -- pMonitor->timings1.t2)); -- for (i = 0, j = 0; i < 8; i++, j++) { -- if (establish_timing[j].width == -1) { -- continue; -- } -- -- if (pMonitor->timings1.t1 & (1 << i)) { -- PDEBUG5(ErrorF("Support %dx%d@%4.1fHz Hseq = %8.3fKHz\n", -- establish_timing[j].width, -- establish_timing[j].height, -- establish_timing[j].VRefresh, -- establish_timing[j].HSync)); -- -- if (range->loH > establish_timing[j].HSync) { -- range->loH = establish_timing[j].HSync; -- } -- -- if (range->hiH < establish_timing[j].HSync) { -- range->hiH = establish_timing[j].HSync; -- } -- -- if (range->loV > establish_timing[j].VRefresh) { -- range->loV = establish_timing[j].VRefresh; -- } -- -- if (range->hiV < establish_timing[j].VRefresh) { -- range->hiV = establish_timing[j].VRefresh; -- } -- } -- } -- PDEBUG5(ErrorF -- ("check establish timing t1:range ( %8.3f %8.3f %8.3f %8.3f )\n", -- range->loH, range->loV, range->hiH, range->hiV)); -- -- for (i = 0; i < 8; i++, j++) { -- if (establish_timing[j].width == -1) { -- continue; -- } -- -- if (pMonitor->timings1.t2 & (1 << i)) { -- PDEBUG5(ErrorF("Support %dx%d@%4.1fHz Hseq = %8.3fKHz\n", -- establish_timing[j].width, -- establish_timing[j].height, -- establish_timing[j].VRefresh, -- establish_timing[j].HSync)); -- -- if (range->loH > establish_timing[j].HSync) { -- range->loH = establish_timing[j].HSync; -- } -- -- if (range->hiH < establish_timing[j].HSync) { -- range->hiH = establish_timing[j].HSync; -- } -- -- if (range->loV > establish_timing[j].VRefresh) { -- range->loV = establish_timing[j].VRefresh; -- } -- -- if (range->hiV < establish_timing[j].VRefresh) { -- range->hiV = establish_timing[j].VRefresh; -- } -- } -- } -- PDEBUG5(ErrorF -- ("check establish timing t2:range ( %8.3f %8.3f %8.3f %8.3f )\n", -- range->loH, range->loV, range->hiH, range->hiV)); -- -- for (i = 0; i < 8; i++) { -- for (j = 0; StdTiming[j].width != -1; j++) { -- if ((StdTiming[j].width == pMonitor->timings2[i].hsize) && -- (StdTiming[j].height == pMonitor->timings2[i].vsize) && -- (StdTiming[j].VRefresh == pMonitor->timings2[i].refresh)) { -- PDEBUG5(ErrorF("pMonitor->timings2[%d]= %d %d %d %d\n", -- i, -- pMonitor->timings2[i].hsize, -- pMonitor->timings2[i].vsize, -- pMonitor->timings2[i].refresh, -- pMonitor->timings2[i].id)); -- HF = StdTiming[j].HSync; -- VF = StdTiming[j].VRefresh; -- if (range->loH > HF) -- range->loH = HF; -- if (range->loV > VF) -- range->loV = VF; -- if (range->hiH < HF) -- range->hiH = HF; -- if (range->hiV < VF) -- range->hiV = VF; -- break; -- } -- } -- } -- PDEBUG5(ErrorF -- ("check standard timing :range ( %8.3f %8.3f %8.3f %8.3f )\n", -- range->loH, range->loV, range->hiH, range->hiV)); -- -- for (i = 0; i < 4; i++) { -- switch (pMonitor->det_mon[i].type) { -- case DS_RANGES: -- pranges = &(pMonitor->det_mon[i].section.ranges); -- PDEBUG5(ErrorF -- ("min_v = %d max_v = %d min_h = %d max_h = %d max_clock = %d\n", -- pranges->min_v, pranges->max_v, pranges->min_h, -- pranges->max_h, pranges->max_clock)); -- -- if (range->loH > pranges->min_h) -- range->loH = pranges->min_h; -- if (range->loV > pranges->min_v) -- range->loV = pranges->min_v; -- if (range->hiH < pranges->max_h) -- range->hiH = pranges->max_h; -- if (range->hiV < pranges->max_v) -- range->hiV = pranges->max_v; -- PDEBUG5(ErrorF -- ("range(%8.3f %8.3f %8.3f %8.3f)\n", range->loH, -- range->loV, range->hiH, range->hiV)); -- break; -- -- case DS_STD_TIMINGS: -- pstd_t = pMonitor->det_mon[i].section.std_t; -- for (j = 0; j < 5; j++) { -- int k; -- PDEBUG5(ErrorF -- ("std_t[%d] hsize = %d vsize = %d refresh = %d id = %d\n", -- j, pstd_t[j].hsize, pstd_t[j].vsize, -- pstd_t[j].refresh, pstd_t[j].id)); -- for (k = 0; StdTiming[k].width != -1; k++) { -- if ((StdTiming[k].width == pstd_t[j].hsize) && -- (StdTiming[k].height == pstd_t[j].vsize) && -- (StdTiming[k].VRefresh == pstd_t[j].refresh)) { -- if (range->loH > StdTiming[k].HSync) -- range->loH = StdTiming[k].HSync; -- if (range->hiH < StdTiming[k].HSync) -- range->hiH = StdTiming[k].HSync; -- if (range->loV > StdTiming[k].VRefresh) -- range->loV = StdTiming[k].VRefresh; -- if (range->hiV < StdTiming[k].VRefresh) -- range->hiV = StdTiming[k].VRefresh; -- break; -- } -- -- } -- } -- break; -- -- case DT: -- -- pd_timings = &pMonitor->det_mon[i].section.d_timings; -- -- HF = pd_timings->clock / (pd_timings->h_active + -- pd_timings->h_blanking); -- VF = HF / (pd_timings->v_active + pd_timings->v_blanking); -- HF /= 1000; /* into KHz Domain */ -- if (range->loH > HF) -- range->loH = HF; -- if (range->hiH < HF) -- range->hiH = HF; -- if (range->loV > VF) -- range->loV = VF; -- if (range->hiV < VF) -- range->hiV = VF; -- PDEBUG(ErrorF -- ("Detailing Timing: HF = %f VF = %f range (%8.3f %8.3f %8.3f %8.3f)\n", -- HF, VF, range->loH, range->loV, range->hiH, range->hiV)); -- break; -- } -- } -- PDEBUG5(ErrorF -- ("Done range(%8.3f %8.3f %8.3f %8.3f)\n", range->loH, range->loV, -- range->hiH, range->hiV)); -- --} -- --static void --XGISyncDDCMonitorRange(MonPtr monitor, MonitorRangePtr range) --{ -- int i; -- if ((monitor == NULL) || (range == NULL)) { -- return; -- } -- -- for (i = 0; i < monitor->nHsync; i++) { -- monitor->hsync[i].lo = range->loH; -- monitor->hsync[i].hi = range->hiH; -- } -- -- for (i = 0; i < monitor->nVrefresh; i++) { -- monitor->vrefresh[i].lo = range->loV; -- monitor->vrefresh[i].hi = range->hiV; -- } --} -- --static void --XGIDDCPreInit(ScrnInfoPtr pScrn) --{ -- -- XGIPtr pXGI = XGIPTR(pScrn); -- xf86MonPtr pMonitor = NULL; -- xf86MonPtr pMonitorDVI = NULL; -- Bool didddc2; -- -- static const char *ddcsstr = -- "CRT%d DDC monitor info: ************************************\n"; -- static const char *ddcestr = -- "End of CRT%d DDC monitor info ******************************\n"; -- -- /* Now for something completely different: DDC. -- * For 300 and 315/330 series, we provide our -- * own functions (in order to probe CRT2 as well) -- * If these fail, use the VBE. -- * All other chipsets will use VBE. No need to re-invent -- * the wheel there. -- */ -- -- pXGI->pVbe = NULL; -- didddc2 = FALSE; -- -- /* In dual head mode, probe DDC using VBE only for CRT1 (second head) */ -- if (IS_DUAL_HEAD(pXGI) && (!didddc2) && !IS_SECOND_HEAD(pXGI)) -- didddc2 = TRUE; -- -- if (!didddc2) { -- /* If CRT1 is off or LCDA, skip DDC via VBE */ -- if ((pXGI->CRT1off) || (pXGI->VBFlags & CRT1_LCDA)) -- didddc2 = TRUE; -- } -- -- /* Now (re-)load and initialize the DDC module */ -- if (!didddc2) { -- -- if (xf86LoadSubModule(pScrn, "ddc")) { -- -- xf86LoaderReqSymLists(ddcSymbols, NULL); -- -- pMonitor = XGIInternalDDC(pScrn, 0); -- if (pMonitor == NULL) { -- xf86DrvMsg(pScrn->scrnIndex, X_INFO, -- "Could not retrieve DDC data\n"); -- } -- -- if (pXGI->xgi_HwDevExt.jChipType == XG21) { -- PDEBUG(ErrorF("Getting XG21 DVI EDID...\n")); -- pMonitorDVI = XGIInternalDDC(pScrn, 1); -- if (pMonitorDVI == NULL) { -- xf86DrvMsg(pScrn->scrnIndex, X_INFO, -- "Could not retrieve DVI DDC data\n"); -- } -- -- if ((pMonitor == NULL) && (pMonitorDVI != NULL)) { -- pMonitor = pMonitorDVI; -- } -- } -- -- } -- } -- -- /* initialize */ -- -- if (pMonitor) { -- pXGI->CRT1Range.loH = 1000; -- pXGI->CRT1Range.loV = 1000; -- pXGI->CRT1Range.hiH = 0; -- pXGI->CRT1Range.hiV = 0; -- XGIGetMonitorRangeByDDC(&(pXGI->CRT1Range), pMonitor); -- } -- else { -- pXGI->CRT1Range.loH = 0; -- pXGI->CRT1Range.loV = 0; -- pXGI->CRT1Range.hiH = 1000; -- pXGI->CRT1Range.hiV = 1000; -- } -- -- if (pMonitorDVI) { -- pXGI->CRT2Range.loV = 1000; -- pXGI->CRT2Range.loH = 1000; -- pXGI->CRT2Range.hiH = 0; -- pXGI->CRT2Range.hiV = 0; -- XGIGetMonitorRangeByDDC(&(pXGI->CRT2Range), pMonitorDVI); -- } -- else { -- pXGI->CRT2Range.loH = 0; -- pXGI->CRT2Range.loV = 0; -- pXGI->CRT2Range.hiH = 1000; -- pXGI->CRT2Range.hiV = 1000; -- } -- -- if (pXGI->xgi_HwDevExt.jChipType == XG21) { -- /* Mode range intersecting */ -- if (pXGI->CRT1Range.loH < pXGI->CRT2Range.loH) { -- pXGI->CRT1Range.loH = pXGI->CRT2Range.loH; -- } -- if (pXGI->CRT1Range.loV < pXGI->CRT2Range.loV) { -- pXGI->CRT1Range.loV = pXGI->CRT2Range.loV; -- } -- if (pXGI->CRT1Range.hiH > pXGI->CRT2Range.hiH) { -- pXGI->CRT1Range.hiH = pXGI->CRT2Range.hiH; -- } -- if (pXGI->CRT1Range.hiV > pXGI->CRT2Range.hiV) { -- pXGI->CRT1Range.hiV = pXGI->CRT2Range.hiV; -- } -- } -- -- if (pMonitor) { -- XGISyncDDCMonitorRange(pScrn->monitor, &pXGI->CRT1Range); -- } -- -- if (pScrn->monitor) { -- pScrn->monitor->DDC = pMonitor; -- } -- -- return; -- --#ifdef XGIMERGED -- if (pXGI->MergedFB) { -- pXGI->CRT2pScrn->monitor = xalloc(sizeof(MonRec)); -- if (pXGI->CRT2pScrn->monitor) { -- DisplayModePtr tempm = NULL, currentm = NULL, newm = NULL; -- memcpy(pXGI->CRT2pScrn->monitor, pScrn->monitor, sizeof(MonRec)); -- pXGI->CRT2pScrn->monitor->DDC = NULL; -- pXGI->CRT2pScrn->monitor->Modes = NULL; -- tempm = pScrn->monitor->Modes; -- while (tempm) { -- if (!(newm = xalloc(sizeof(DisplayModeRec)))) -- break; -- memcpy(newm, tempm, sizeof(DisplayModeRec)); -- if (!(newm->name = xalloc(strlen(tempm->name) + 1))) { -- xfree(newm); -- break; -- } -- strcpy(newm->name, tempm->name); -- if (!pXGI->CRT2pScrn->monitor->Modes) -- pXGI->CRT2pScrn->monitor->Modes = newm; -- if (currentm) { -- currentm->next = newm; -- newm->prev = currentm; -- } -- currentm = newm; -- tempm = tempm->next; -- } -- -- if ((pMonitor = XGIInternalDDC(pXGI->CRT2pScrn, 1))) { -- xf86DrvMsg(pScrn->scrnIndex, X_PROBED, ddcsstr, 2); -- xf86PrintEDID(pMonitor); -- xf86DrvMsg(pScrn->scrnIndex, X_PROBED, ddcestr, 2); -- xf86SetDDCproperties(pXGI->CRT2pScrn, pMonitor); -- -- pXGI->CRT2pScrn->monitor->DDC = pMonitor; -- -- /* use DDC data if no ranges in config file */ -- if (!pXGI->CRT2HSync) { -- pXGI->CRT2pScrn->monitor->nHsync = 0; -- } -- if (!pXGI->CRT2VRefresh) { -- pXGI->CRT2pScrn->monitor->nVrefresh = 0; -- } -- } -- else { -- xf86DrvMsg(pScrn->scrnIndex, X_PROBED, -- "Failed to read DDC data for CRT2\n"); -- } -- } -- else { -- XGIErrorLog(pScrn, -- "Failed to allocate memory for CRT2 monitor, %s.\n", -- mergeddisstr); -- if (pXGI->CRT2pScrn) -- xfree(pXGI->CRT2pScrn); -- pXGI->CRT2pScrn = NULL; -- pXGI->MergedFB = FALSE; -- } -- } --#endif -- --#ifdef XGIMERGED -- if (pXGI->MergedFB) { -- xf86DrvMsg(pScrn->scrnIndex, X_INFO, crtsetupstr, 1); -- } --#endif -- -- /* end of DDC */ --} -- --#ifdef DEBUG5 --static void --XGIDumpModePtr(DisplayModePtr mode) --{ -- if (mode == NULL) -- return; -- -- ErrorF("Dump DisplayModePtr mode\n"); -- ErrorF("name = %s\n", mode->name); -- /* ModeStatus status; */ -- ErrorF("type = %d\n", mode->type); -- ErrorF("Clock = %d\n", mode->Clock); -- ErrorF("HDisplay = %d\n", mode->HDisplay); -- ErrorF("HSyncStart = %d\n", mode->HSyncStart); -- ErrorF("HSyncEnd = %d\n", mode->HSyncEnd); -- ErrorF("HTotal = %d\n", mode->HTotal); -- ErrorF("HSkew = %d\n", mode->HSkew); -- ErrorF("VDisplay = %d\n", mode->VDisplay); -- ErrorF("VSyncStart = %d\n", mode->VSyncStart); -- ErrorF("VSyncEnd = %d\n", mode->VSyncEnd); -- ErrorF("VTotal = %d\n", mode->VTotal); -- ErrorF("VScan = %d\n", mode->VScan); -- ErrorF("Flags = %d\n", mode->Flags); -- -- -- ErrorF("ClockIndex = %d\n", mode->ClockIndex); -- ErrorF("SynthClock = %d\n", mode->SynthClock); -- ErrorF("CrtcHDisplay = %d\n", mode->CrtcHDisplay); -- ErrorF("CrtcHBlankStart = %d\n", mode->CrtcHBlankStart); -- ErrorF("CrtcHSyncStart = %d\n", mode->CrtcHSyncStart); -- ErrorF("CrtcHSyncEnd = %d\n", mode->CrtcHSyncEnd); -- ErrorF("CrtcHBlankEnd = %d\n", mode->CrtcHBlankEnd); -- ErrorF("CrtcHTotal = %d\n", mode->CrtcHTotal); -- ErrorF("CrtcHSkew = %d\n", mode->CrtcHSkew); -- ErrorF("CrtcVDisplay = %d\n", mode->CrtcVDisplay); -- ErrorF("CrtcVBlankStart = %d\n", mode->CrtcVBlankStart); -- ErrorF("CrtcVSyncStart = %d\n", mode->CrtcVSyncStart); -- ErrorF("CrtcVSyncEnd = %d\n", mode->CrtcVSyncEnd); -- ErrorF("CrtcVBlankEnd = %d\n", mode->CrtcVBlankEnd); -- ErrorF("CrtcVTotal = %d\n", mode->CrtcVTotal); -- ErrorF("CrtcHAdjusted = %s\n", (mode->CrtcHAdjusted) ? "TRUE" : "FALSE"); -- ErrorF("CrtcVAdjusted = %s\n", (mode->CrtcVAdjusted) ? "TRUE" : "FALSE"); -- ErrorF("PrivSize = %d\n", mode->PrivSize); -- /* INT32 * Private; */ -- ErrorF("PrivFlags = %d\n", mode->PrivFlags); -- ErrorF("HSync = %8.3f\n", mode->HSync); -- ErrorF("VRefresh = %8.3f\n", mode->VRefresh); --} --#endif -- --static void --XGIDumpMonPtr(MonPtr pMonitor) --{ --#ifdef DEBUG5 -- int i; --# if 0 -- DisplayModePtr mode; --#endif -- -- ErrorF("XGIDumpMonPtr() ... \n"); -- if (pMonitor == NULL) { -- ErrorF("pMonitor is NULL\n"); -- } -- -- ErrorF("id = %s, vendor = %s model = %s\n", -- pMonitor->id, pMonitor->vendor, pMonitor->model); -- ErrorF("nHsync = %d\n", pMonitor->nHsync); -- ErrorF("nVrefresh = %d\n", pMonitor->nVrefresh); -- -- for (i = 0; i < MAX_HSYNC; i++) { -- ErrorF("hsync[%d] = (%8.3f,%8.3f)\n", i, pMonitor->hsync[i].lo, -- pMonitor->hsync[i].hi); -- } -- -- for (i = 0; i < MAX_VREFRESH; i++) { -- ErrorF("vrefresh[%d] = (%8.3f,%8.3f)\n", i, pMonitor->vrefresh[i].lo, -- pMonitor->vrefresh[i].hi); -- } -- -- ErrorF("widthmm = %d, heightmm = %d\n", -- pMonitor->widthmm, pMonitor->heightmm); -- ErrorF("options = %p, DDC = %p\n", pMonitor->options, pMonitor->DDC); --# if 0 -- mode = pMonitor->Modes; -- while (1) { -- XGIDumpModePtr(mode); -- if (mode == pMonitor->Last) { -- break; -- } -- mode = mode->next; -- } --# endif --#endif /* DEBUG5 */ --} -- --/* Mandatory */ --static Bool --XGIPreInit(ScrnInfoPtr pScrn, int flags) --{ -- XGIPtr pXGI; -- MessageType from; -- unsigned long int i; -- int temp; -- ClockRangePtr clockRanges; -- int pix24flags; -- int fd; -- struct fb_fix_screeninfo fix; -- XGIEntPtr pXGIEnt = NULL; -- size_t memreq; -- --#if defined(XGIMERGED) || defined(XGIDUALHEAD) -- DisplayModePtr first, p, n; --#endif -- unsigned char srlockReg, crlockReg; -- vbeInfoPtr pVbe; -- -- /****************** Code Start ***********************/ -- -- ErrorF("XGIPreInit\n"); -- -- if (flags & PROBE_DETECT) { -- if (xf86LoadSubModule(pScrn, "vbe")) { -- int index = xf86GetEntityInfo(pScrn->entityList[0])->index; -- -- if ((pVbe = VBEExtendedInit(NULL, index, 0))) { -- ConfiguredMonitor = vbeDoEDID(pVbe, NULL); -- vbeFree(pVbe); -- } -- } -- return TRUE; -- } -- -- /* -- * Note: This function is only called once at server startup, and -- * not at the start of each server generation. This means that -- * only things that are persistent across server generations can -- * be initialised here. xf86Screens[] is the array of all screens, -- * (pScrn is a pointer to one of these). Privates allocated using -- * xf86AllocateScrnInfoPrivateIndex() are too, and should be used -- * for data that must persist across server generations. -- * -- * Per-generation data should be allocated with -- * AllocateScreenPrivateIndex() from the ScreenInit() function. -- */ -- -- /* Check the number of entities, and fail if it isn't one. */ -- if (pScrn->numEntities != 1) { -- XGIErrorLog(pScrn, "Number of entities is not 1\n"); -- return FALSE; -- } -- -- /* The vgahw module should be loaded here when needed */ -- if (!xf86LoadSubModule(pScrn, "vgahw")) { -- XGIErrorLog(pScrn, "Could not load vgahw module\n"); -- return FALSE; -- } -- -- xf86LoaderReqSymLists(vgahwSymbols, NULL); -- -- /* Due to the liberal license terms this is needed for -- * keeping the copyright notice readable and intact in -- * binary distributions. Removing this is a copyright -- * infringement. Please read the license terms above. -- */ -- -- xf86DrvMsg(pScrn->scrnIndex, X_INFO, -- "XGI driver (%s)\n", XGI_RELEASE_DATE); -- -- xf86DrvMsg(pScrn->scrnIndex, X_INFO, -- "Copyright (C) 2001-2004 Thomas Winischhofer and others\n"); -- -- /* Allocate a vgaHWRec */ -- if (!vgaHWGetHWRec(pScrn)) { -- XGIErrorLog(pScrn, "Could not allocate VGA private\n"); -- return FALSE; -- } -- -- /* Allocate the XGIRec driverPrivate */ -- pXGI = XGIGetRec(pScrn); -- if (pXGI == NULL) { -- XGIErrorLog(pScrn, "Could not allocate memory for pXGI private\n"); -- return FALSE; -- } -- -- pXGI->IODBase = pScrn->domainIOBase; -- -- -- /* Get the entity, and make sure it is PCI. */ -- pXGI->pEnt = xf86GetEntityInfo(pScrn->entityList[0]); -- if (pXGI->pEnt->location.type != BUS_PCI) { -- XGIErrorLog(pScrn, "Entity's bus type is not PCI\n"); -- XGIFreeRec(pScrn); -- return FALSE; -- } -- --#ifdef XGIDUALHEAD -- /* Allocate an entity private if necessary */ -- if (xf86IsEntityShared(pScrn->entityList[0])) { -- pXGIEnt = xf86GetEntityPrivate(pScrn->entityList[0], -- XGIEntityIndex)->ptr; -- pXGI->entityPrivate = pXGIEnt; -- -- /* If something went wrong, quit here */ -- if ((pXGIEnt->DisableDual) || (pXGIEnt->ErrorAfterFirst)) { -- XGIErrorLog(pScrn, -- "First head encountered fatal error, can't continue\n"); -- XGIFreeRec(pScrn); -- return FALSE; -- } -- } --#endif -- -- /* Find the PCI info for this screen */ --#ifndef XSERVER_LIBPCIACCESS -- pXGI->PciInfo = xf86GetPciInfoForEntity(pXGI->pEnt->index); -- pXGI->PciTag = pciTag(pXGI->PciInfo->bus, pXGI->PciInfo->device, -- pXGI->PciInfo->func); --#endif -- -- pXGI->Primary = xf86IsPrimaryPci(pXGI->PciInfo); -- xf86DrvMsg(pScrn->scrnIndex, X_PROBED, -- "This adapter is %s display adapter\n", -- (pXGI->Primary ? "primary" : "secondary")); -- -- if (pXGI->Primary) { -- VGAHWPTR(pScrn)->MapSize = 0x10000; /* Standard 64k VGA window */ -- if (!vgaHWMapMem(pScrn)) { -- XGIErrorLog(pScrn, "Could not map VGA memory\n"); -- XGIFreeRec(pScrn); -- return FALSE; -- } -- } -- vgaHWGetIOBase(VGAHWPTR(pScrn)); -- -- /* We "patch" the PIOOffset inside vgaHW in order to force -- * the vgaHW module to use our relocated i/o ports. -- */ -- VGAHWPTR(pScrn)->PIOOffset = pXGI->IODBase - 0x380 + --#ifdef XSERVER_LIBPCIACCESS -- (pXGI->PciInfo->regions[2].base_addr & 0xFFFC) --#else -- (pXGI->PciInfo->ioBase[2] & 0xFFFC) --#endif -- ; -- -- pXGI->pInt = NULL; -- if (!pXGI->Primary) { --#if !defined(__alpha__) --#if !defined(__powerpc__) -- xf86DrvMsg(pScrn->scrnIndex, X_INFO, -- "Initializing display adapter through int10\n"); -- -- if (xf86LoadSubModule(pScrn, "int10")) { -- xf86LoaderReqSymLists(int10Symbols, NULL); -- pXGI->pInt = xf86InitInt10(pXGI->pEnt->index); -- } -- else { -- XGIErrorLog(pScrn, "Could not load int10 module\n"); -- } --#endif /* !defined(__powerpc__) */ --#endif /* !defined(__alpha__) */ -- } -- -- xf86SetOperatingState(resVgaMem, pXGI->pEnt->index, ResUnusedOpr); -- -- /* Operations for which memory access is required */ -- pScrn->racMemFlags = RAC_FB | RAC_COLORMAP | RAC_CURSOR | RAC_VIEWPORT; -- /* Operations for which I/O access is required */ -- pScrn->racIoFlags = RAC_COLORMAP | RAC_CURSOR | RAC_VIEWPORT; -- -- /* The ramdac module should be loaded here when needed */ -- if (!xf86LoadSubModule(pScrn, "ramdac")) { -- XGIErrorLog(pScrn, "Could not load ramdac module\n"); -- -- if (pXGIEnt) -- pXGIEnt->ErrorAfterFirst = TRUE; -- -- if (pXGI->pInt) -- xf86FreeInt10(pXGI->pInt); -- XGIFreeRec(pScrn); -- return FALSE; -- } -- -- xf86LoaderReqSymLists(ramdacSymbols, NULL); -- -- /* Set pScrn->monitor */ -- pScrn->monitor = pScrn->confScreen->monitor; -- -- /* -- * Set the Chipset and ChipRev, allowing config file entries to -- * override. DANGEROUS! -- */ -- if (pXGI->pEnt->device->chipset && *pXGI->pEnt->device->chipset) { -- PDEBUG(ErrorF(" --- Chipset 1 \n")); -- pScrn->chipset = pXGI->pEnt->device->chipset; -- pXGI->Chipset = xf86StringToToken(XGIChipsets, pScrn->chipset); -- from = X_CONFIG; -- } -- else if (pXGI->pEnt->device->chipID >= 0) { -- PDEBUG(ErrorF(" --- Chipset 2 \n")); -- pXGI->Chipset = pXGI->pEnt->device->chipID; -- pScrn->chipset = -- (char *) xf86TokenToString(XGIChipsets, pXGI->Chipset); -- -- from = X_CONFIG; -- xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "ChipID override: 0x%04X\n", -- pXGI->Chipset); -- } -- else { -- PDEBUG(ErrorF(" --- Chipset 3 \n")); -- from = X_PROBED; -- pXGI->Chipset = DEVICE_ID(pXGI->PciInfo); -- pScrn->chipset = -- (char *) xf86TokenToString(XGIChipsets, pXGI->Chipset); -- } -- if (pXGI->pEnt->device->chipRev >= 0) { -- pXGI->ChipRev = pXGI->pEnt->device->chipRev; -- xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "ChipRev override: %d\n", -- pXGI->ChipRev); -- } -- else { -- pXGI->ChipRev = CHIP_REVISION(pXGI->PciInfo); -- } -- pXGI->xgi_HwDevExt.jChipRevision = pXGI->ChipRev; -- -- PDEBUG(ErrorF(" --- Chipset : %s \n", pScrn->chipset)); -- -- -- /* -- * This shouldn't happen because such problems should be caught in -- * XGIProbe(), but check it just in case. -- */ -- if (pScrn->chipset == NULL) { -- XGIErrorLog(pScrn, "ChipID 0x%04X is not recognised\n", -- pXGI->Chipset); -- -- if (pXGIEnt) -- pXGIEnt->ErrorAfterFirst = TRUE; -- -- if (pXGI->pInt) -- xf86FreeInt10(pXGI->pInt); -- XGIFreeRec(pScrn); -- return FALSE; -- } -- -- if (pXGI->Chipset < 0) { -- XGIErrorLog(pScrn, "Chipset \"%s\" is not recognised\n", -- pScrn->chipset); -- -- if (pXGIEnt) -- pXGIEnt->ErrorAfterFirst = TRUE; -- -- if (pXGI->pInt) -- xf86FreeInt10(pXGI->pInt); -- XGIFreeRec(pScrn); -- return FALSE; -- } -- -- /* Determine chipset and VGA engine type */ -- pXGI->ChipFlags = 0; -- pXGI->XGI_SD_Flags = 0; -- -- switch (pXGI->Chipset) { -- case PCI_CHIP_XGIXG40: -- case PCI_CHIP_XGIXG20: -- pXGI->xgi_HwDevExt.jChipType = XG40; -- pXGI->myCR63 = 0x63; -- pXGI->mmioSize = 64; -- break; -- default: -- /* This driver currently only supports V3XE, V3XT, V5, V8 (all of -- * which are XG40 chips) and Z7 (which is XG20). -- */ -- if (pXGI->pInt) { -- xf86FreeInt10(pXGI->pInt); -- } -- XGIFreeRec(pScrn); -- return FALSE; -- } -- --/* load frame_buffer */ -- -- FbDevExist = FALSE; -- if (pXGI->Chipset != PCI_CHIP_XGIXG20) { -- if ((fd = open("/dev/fb", 'r')) != -1) { -- PDEBUG(ErrorF("--- open /dev/fb.... \n")); -- ioctl(fd, FBIOGET_FSCREENINFO, &fix); -- if (fix.accel == FB_ACCEL_XGI_GLAMOUR) { -- PDEBUG(ErrorF("--- fix.accel.... \n")); -- FbDevExist = TRUE; -- } -- else -- PDEBUG(ErrorF("--- no fix.accel.... 0x%08lx \n", fix.accel)); -- close(fd); -- } -- } -- -- -- /* -- * The first thing we should figure out is the depth, bpp, etc. -- * Additionally, determine the size of the HWCursor memory area. -- */ -- pXGI->CursorSize = 4096; -- pix24flags = Support32bppFb; -- --#ifdef XGIDUALHEAD -- /* In case of Dual Head, we need to determine if we are the "master" head or -- * the "slave" head. In order to do that, we set PrimInit to DONE in the -- * shared entity at the end of the first initialization. The second -- * initialization then knows that some things have already been done. THIS -- * ALWAYS ASSUMES THAT THE FIRST DEVICE INITIALIZED IS THE MASTER! -- */ -- -- if (xf86IsEntityShared(pScrn->entityList[0])) { -- if (pXGIEnt->lastInstance > 0) { -- if (!xf86IsPrimInitDone(pScrn->entityList[0])) { -- /* First Head (always CRT2) */ -- pXGI->SecondHead = FALSE; -- pXGIEnt->pScrn_1 = pScrn; -- pXGIEnt->CRT2ModeNo = -1; -- pXGIEnt->CRT2ModeSet = FALSE; -- pXGI->DualHeadMode = TRUE; -- pXGIEnt->DisableDual = FALSE; -- pXGIEnt->BIOS = NULL; -- pXGIEnt->XGI_Pr = NULL; -- pXGIEnt->RenderAccelArray = NULL; -- } -- else { -- /* Second Head (always CRT1) */ -- pXGI->SecondHead = TRUE; -- pXGIEnt->pScrn_2 = pScrn; -- pXGI->DualHeadMode = TRUE; -- } -- } -- else { -- /* Only one screen in config file - disable dual head mode */ -- pXGI->SecondHead = FALSE; -- pXGI->DualHeadMode = FALSE; -- pXGIEnt->DisableDual = TRUE; -- } -- } -- else { -- /* Entity is not shared - disable dual head mode */ -- pXGI->SecondHead = FALSE; -- pXGI->DualHeadMode = FALSE; -- } --#endif -- -- /* Allocate VB_DEVICE_INFO (for mode switching code) and initialize it */ -- pXGI->XGI_Pr = NULL; -- if (pXGIEnt && pXGIEnt->XGI_Pr) { -- pXGI->XGI_Pr = pXGIEnt->XGI_Pr; -- } -- -- if (!pXGI->XGI_Pr) { -- if (!(pXGI->XGI_Pr = xnfcalloc(sizeof(VB_DEVICE_INFO), 1))) { -- XGIErrorLog(pScrn, -- "Could not allocate memory for XGI_Pr private\n"); -- -- if (pXGIEnt) -- pXGIEnt->ErrorAfterFirst = TRUE; -- if (pXGI->pInt) -- xf86FreeInt10(pXGI->pInt); -- XGIFreeRec(pScrn); -- return FALSE; -- } -- -- if (pXGIEnt) -- pXGIEnt->XGI_Pr = pXGI->XGI_Pr; -- -- memset(pXGI->XGI_Pr, 0, sizeof(VB_DEVICE_INFO)); -- } -- -- /* Get our relocated IO registers */ -- pXGI->RelIO = (XGIIOADDRESS) (pXGI->IODBase | --#ifdef XSERVER_LIBPCIACCESS -- (pXGI->PciInfo->regions[2].base_addr & 0xFFFC) --#else -- (pXGI->PciInfo->ioBase[2] & 0xFFFC) --#endif -- ); -- pXGI->xgi_HwDevExt.pjIOAddress = (XGIIOADDRESS) (pXGI->RelIO + 0x30); -- xf86DrvMsg(pScrn->scrnIndex, from, "Relocated IO registers at 0x%lX\n", -- (unsigned long) pXGI->RelIO); -- -- if (!xf86SetDepthBpp(pScrn, 0, 0, 0, pix24flags)) { -- XGIErrorLog(pScrn, "xf86SetDepthBpp() error\n"); -- -- if (pXGIEnt) -- pXGIEnt->ErrorAfterFirst = TRUE; -- -- if (pXGI->pInt) -- xf86FreeInt10(pXGI->pInt); -- XGIFreeRec(pScrn); -- return FALSE; -- } -- -- /* Check that the returned depth is one we support */ -- temp = 0; -- switch (pScrn->depth) { -- case 8: -- case 16: -- case 24: --#if !defined(__powerpc__) -- case 15: --#endif -- break; -- default: -- temp = 1; -- } -- -- if (temp) { -- XGIErrorLog(pScrn, -- "Given color depth (%d) is not supported by this driver/chipset\n", -- pScrn->depth); -- if (pXGI->pInt) -- xf86FreeInt10(pXGI->pInt); -- XGIFreeRec(pScrn); -- return FALSE; -- } -- -- xf86PrintDepthBpp(pScrn); -- -- /* Get the depth24 pixmap format */ -- if (pScrn->depth == 24 && pix24bpp == 0) { -- pix24bpp = xf86GetBppFromDepth(pScrn, 24); -- } -- -- /* -- * This must happen after pScrn->display has been set because -- * xf86SetWeight references it. -- */ -- if (pScrn->depth > 8) { -- /* The defaults are OK for us */ -- rgb zeros = { 0, 0, 0 }; -- -- if (!xf86SetWeight(pScrn, zeros, zeros)) { -- XGIErrorLog(pScrn, "xf86SetWeight() error\n"); -- -- if (pXGIEnt) -- pXGIEnt->ErrorAfterFirst = TRUE; -- -- if (pXGI->pInt) -- xf86FreeInt10(pXGI->pInt); -- XGIFreeRec(pScrn); -- return FALSE; -- } -- else { -- Bool ret = FALSE; -- switch (pScrn->depth) { -- case 15: -- if ((pScrn->weight.red != 5) || -- (pScrn->weight.green != 5) || (pScrn->weight.blue != 5)) -- ret = TRUE; -- break; -- case 16: -- if ((pScrn->weight.red != 5) || -- (pScrn->weight.green != 6) || (pScrn->weight.blue != 5)) -- ret = TRUE; -- break; -- case 24: -- if ((pScrn->weight.red != 8) || -- (pScrn->weight.green != 8) || (pScrn->weight.blue != 8)) -- ret = TRUE; -- break; -- } -- if (ret) { -- XGIErrorLog(pScrn, -- "RGB weight %d%d%d at depth %d not supported by hardware\n", -- (int) pScrn->weight.red, -- (int) pScrn->weight.green, -- (int) pScrn->weight.blue, pScrn->depth); -- -- if (pXGIEnt) -- pXGIEnt->ErrorAfterFirst = TRUE; -- -- if (pXGI->pInt) -- xf86FreeInt10(pXGI->pInt); -- XGIFreeRec(pScrn); -- return FALSE; -- } -- } -- } -- -- /* Set the current layout parameters */ -- pXGI->CurrentLayout.bitsPerPixel = pScrn->bitsPerPixel; -- pXGI->CurrentLayout.depth = pScrn->depth; -- /* (Inside this function, we can use pScrn's contents anyway) */ -- -- if (!xf86SetDefaultVisual(pScrn, -1)) { -- XGIErrorLog(pScrn, "xf86SetDefaultVisual() error\n"); -- -- if (pXGIEnt) -- pXGIEnt->ErrorAfterFirst = TRUE; -- -- if (pXGI->pInt) -- xf86FreeInt10(pXGI->pInt); -- XGIFreeRec(pScrn); -- return FALSE; -- } -- else { -- /* We don't support DirectColor at > 8bpp */ -- if (pScrn->depth > 8 && pScrn->defaultVisual != TrueColor) { -- XGIErrorLog(pScrn, -- "Given default visual (%s) is not supported at depth %d\n", -- xf86GetVisualName(pScrn->defaultVisual), -- pScrn->depth); -- -- if (pXGIEnt) -- pXGIEnt->ErrorAfterFirst = TRUE; -- -- if (pXGI->pInt) -- xf86FreeInt10(pXGI->pInt); -- XGIFreeRec(pScrn); -- return FALSE; -- } -- } -- -- /* Due to palette & timing problems we don't support 8bpp in DHM */ -- if ((IS_DUAL_HEAD(pXGI)) && (pScrn->bitsPerPixel == 8)) { -- XGIErrorLog(pScrn, -- "Color depth 8 not supported in Dual Head mode.\n"); -- if (pXGIEnt) -- pXGIEnt->ErrorAfterFirst = TRUE; -- if (pXGI->pInt) -- xf86FreeInt10(pXGI->pInt); -- XGIFreeRec(pScrn); -- return FALSE; -- } -- -- /* -- * The cmap layer needs this to be initialised. -- */ -- { -- Gamma zeros = { 0.0, 0.0, 0.0 }; -- -- if (!xf86SetGamma(pScrn, zeros)) { -- XGIErrorLog(pScrn, "xf86SetGamma() error\n"); -- -- if (pXGIEnt) -- pXGIEnt->ErrorAfterFirst = TRUE; -- -- if (pXGI->pInt) -- xf86FreeInt10(pXGI->pInt); -- XGIFreeRec(pScrn); -- return FALSE; -- } -- } -- -- /* We use a programamble clock */ -- pScrn->progClock = TRUE; -- -- /* Set the bits per RGB for 8bpp mode */ -- if (pScrn->depth == 8) { -- pScrn->rgbBits = 6; -- } -- -- from = X_DEFAULT; -- -- /* Unlock registers */ -- xgiSaveUnlockExtRegisterLock(pXGI, &srlockReg, &crlockReg); -- -- /* Read BIOS for 300 and 315/330 series customization */ -- pXGI->xgi_HwDevExt.pjVirtualRomBase = NULL; -- pXGI->BIOS = NULL; -- pXGI->xgi_HwDevExt.UseROM = FALSE; -- -- /* Evaluate options */ -- xgiOptions(pScrn); -- --#ifdef XGIMERGED -- /* Due to palette & timing problems we don't support 8bpp in MFBM */ -- if ((pXGI->MergedFB) && (pScrn->bitsPerPixel == 8)) { -- XGIErrorLog(pScrn, "MergedFB: Color depth 8 not supported, %s\n", -- mergeddisstr); -- pXGI->MergedFB = pXGI->MergedFBAuto = FALSE; -- } --#endif -- -- /* Do basic configuration */ -- -- XGISetup(pScrn); -- -- from = X_PROBED; --#ifdef XSERVER_LIBPCIACCESS -- pXGI->FbAddress = pXGI->PciInfo->regions[0].base_addr & 0xFFFFFFF0; --#else -- if (pXGI->pEnt->device->MemBase != 0) { -- /* -- * XXX Should check that the config file value matches one of the -- * PCI base address values. -- */ -- pXGI->FbAddress = pXGI->pEnt->device->MemBase; -- from = X_CONFIG; -- } -- else { -- pXGI->FbAddress = pXGI->PciInfo->memBase[0] & 0xFFFFFFF0; -- } --#endif -- -- pXGI->realFbAddress = pXGI->FbAddress; -- -- xf86DrvMsg(pScrn->scrnIndex, from, -- "%sinear framebuffer at 0x%lX\n", -- IS_DUAL_HEAD(pXGI) ? "Global l" : "L", -- (unsigned long) pXGI->FbAddress); -- --#ifdef XSERVER_LIBPCIACCESS -- pXGI->IOAddress = pXGI->PciInfo->regions[1].base_addr & 0xFFFFFFF0; --#else -- if (pXGI->pEnt->device->IOBase != 0) { -- /* -- * XXX Should check that the config file value matches one of the -- * PCI base address values. -- */ -- pXGI->IOAddress = pXGI->pEnt->device->IOBase; -- from = X_CONFIG; -- } -- else { -- pXGI->IOAddress = pXGI->PciInfo->memBase[1] & 0xFFFFFFF0; -- } --#endif -- -- xf86DrvMsg(pScrn->scrnIndex, from, -- "MMIO registers at 0x%lX (size %ldK)\n", -- (unsigned long) pXGI->IOAddress, pXGI->mmioSize); -- pXGI->xgi_HwDevExt.bIntegratedMMEnabled = TRUE; -- -- /* Register the PCI-assigned resources. */ -- if (xf86RegisterResources(pXGI->pEnt->index, NULL, ResExclusive)) { -- XGIErrorLog(pScrn, -- "xf86RegisterResources() found resource conflicts\n"); -- -- if (pXGIEnt) -- pXGIEnt->ErrorAfterFirst = TRUE; -- -- if (pXGI->pInt) -- xf86FreeInt10(pXGI->pInt); -- xgiRestoreExtRegisterLock(pXGI, srlockReg, crlockReg); -- XGIFreeRec(pScrn); -- return FALSE; -- } -- -- from = X_PROBED; -- if (pXGI->pEnt->device->videoRam != 0) { -- -- xf86DrvMsg(pScrn->scrnIndex, X_WARNING, -- "Option \"VideoRAM\" ignored\n"); -- } -- -- xf86DrvMsg(pScrn->scrnIndex, from, "VideoRAM: %d KB\n", pScrn->videoRam); -- -- pXGI->FbMapSize = pXGI->availMem = pScrn->videoRam * 1024; -- pXGI->xgi_HwDevExt.ulVideoMemorySize = pScrn->videoRam * 1024; -- pXGI->xgi_HwDevExt.bSkipDramSizing = TRUE; -- -- /* Calculate real availMem according to Accel/TurboQueue and -- * HWCursur setting. -- * -- * TQ is max 64KiB. Reduce the available memory by 64KiB, and locate the -- * TQ at the beginning of this last 64KiB block. This is done even when -- * using the HWCursor, because the cursor only takes 2KiB and the queue -- * does not seem to last that far anyway. -- * -- * The TQ must be located at 32KB boundaries. -- */ -- if (pScrn->videoRam < 3072) { -- if (pXGI->TurboQueue) { -- xf86DrvMsg(pScrn->scrnIndex, X_INFO, -- "Not enough video RAM for TurboQueue. TurboQueue disabled\n"); -- pXGI->TurboQueue = FALSE; -- } -- } -- -- pXGI->availMem -= (pXGI->TurboQueue) ? (64 * 1024) : pXGI->CursorSize; -- -- -- /* In dual head mode, we share availMem equally - so align it -- * to 8KB; this way, the address of the FB of the second -- * head is aligned to 4KB for mapping. -- * -- * Check MaxXFBMem setting. Since DRI is not supported in dual head -- * mode, we don't need the MaxXFBMem setting. -- */ -- if (IS_DUAL_HEAD(pXGI)) { -- if (pXGI->maxxfbmem) { -- xf86DrvMsg(pScrn->scrnIndex, X_INFO, -- "MaxXFBMem not used in Dual Head mode. Using all VideoRAM.\n"); -- } -- -- pXGI->availMem &= 0xFFFFE000; -- pXGI->maxxfbmem = pXGI->availMem; -- } -- else if (pXGI->maxxfbmem) { -- if (pXGI->maxxfbmem > pXGI->availMem) { -- if (pXGI->xgifbMem) { -- pXGI->maxxfbmem = pXGI->xgifbMem * 1024; -- xf86DrvMsg(pScrn->scrnIndex, X_WARNING, -- "Invalid MaxXFBMem setting. Using xgifb heap start information\n"); -- } -- else { -- xf86DrvMsg(pScrn->scrnIndex, X_WARNING, -- "Invalid MaxXFBMem setting. Using all VideoRAM for framebuffer\n"); -- pXGI->maxxfbmem = pXGI->availMem; -- } -- } -- else if (pXGI->xgifbMem) { -- if (pXGI->maxxfbmem > pXGI->xgifbMem * 1024) { -- xf86DrvMsg(pScrn->scrnIndex, X_WARNING, -- "MaxXFBMem beyond xgifb heap start. Using xgifb heap start\n"); -- pXGI->maxxfbmem = pXGI->xgifbMem * 1024; -- } -- } -- } -- else if (pXGI->xgifbMem) { -- pXGI->maxxfbmem = pXGI->xgifbMem * 1024; -- } -- else -- pXGI->maxxfbmem = pXGI->availMem; -- -- xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Using %ldK of framebuffer memory\n", -- pXGI->maxxfbmem / 1024); -- -- pXGI->CRT1off = -1; -- -- /* Detect video bridge and sense TV/VGA2 */ -- XGIVGAPreInit(pScrn); -- -- /* Detect CRT1 (via DDC1 and DDC2, hence via VGA port; regardless of LCDA) */ -- XGICRT1PreInit(pScrn); -- -- /* Detect LCD (connected via CRT2, regardless of LCDA) and LCD resolution */ -- XGILCDPreInit(pScrn); -- -- /* LCDA only supported under these conditions: */ -- if (pXGI->ForceCRT1Type == CRT1_LCDA) { -- if (! -- (pXGI->XGI_Pr-> -- VBType & (VB_XGI301C | VB_XGI302B | VB_XGI301LV | -- VB_XGI302LV))) { -- xf86DrvMsg(pScrn->scrnIndex, X_WARNING, -- "Chipset/Video bridge does not support LCD-via-CRT1\n"); -- pXGI->ForceCRT1Type = CRT1_VGA; -- } -- else if (!(pXGI->VBFlags & CRT2_LCD)) { -- xf86DrvMsg(pScrn->scrnIndex, X_WARNING, -- "No digitally connected LCD panel found, LCD-via-CRT1 " -- "disabled\n"); -- pXGI->ForceCRT1Type = CRT1_VGA; -- } -- } -- -- /* Setup SD flags */ -- pXGI->XGI_SD_Flags |= XGI_SD_ADDLSUPFLAG; -- -- if (pXGI->XGI_Pr->VBType & VB_XGIVB) { -- pXGI->XGI_SD_Flags |= XGI_SD_SUPPORTTV; -- } -- --#ifdef ENABLE_YPBPR -- if (pXGI->XGI_Pr->VBType & (VB_XGI301 | VB_XGI301B | VB_XGI302B)) { -- pXGI->XGI_SD_Flags |= XGI_SD_SUPPORTHIVISION; -- } --#endif -- --#ifdef TWDEBUG /* @@@ TEST @@@ */ -- pXGI->XGI_SD_Flags |= XGI_SD_SUPPORTYPBPRAR; -- xf86DrvMsg(0, X_INFO, "TEST: Support Aspect Ratio\n"); --#endif -- -- /* Detect CRT2-TV and PAL/NTSC mode */ -- XGITVPreInit(pScrn); -- -- /* Detect CRT2-VGA */ -- XGICRT2PreInit(pScrn); -- PDEBUG(ErrorF("3496 pXGI->VBFlags =%x\n", pXGI->VBFlags)); -- -- if (!(pXGI->XGI_SD_Flags & XGI_SD_SUPPORTYPBPR)) { -- if ((pXGI->ForceTVType != -1) && (pXGI->ForceTVType & TV_YPBPR)) { -- pXGI->ForceTVType = -1; -- xf86DrvMsg(pScrn->scrnIndex, X_WARNING, -- "YPbPr TV output not supported\n"); -- } -- } -- -- if (!(pXGI->XGI_SD_Flags & XGI_SD_SUPPORTHIVISION)) { -- if ((pXGI->ForceTVType != -1) && (pXGI->ForceTVType & TV_HIVISION)) { -- pXGI->ForceTVType = -1; -- xf86DrvMsg(pScrn->scrnIndex, X_WARNING, -- "HiVision TV output not supported\n"); -- } -- } -- -- if (pXGI->XGI_Pr->VBType & VB_XGIVB) { -- pXGI->XGI_SD_Flags |= (XGI_SD_SUPPORTPALMN | XGI_SD_SUPPORTNTSCJ); -- } -- if (pXGI->XGI_Pr->VBType & VB_XGIVB) { -- pXGI->XGI_SD_Flags |= XGI_SD_SUPPORTTVPOS; -- } -- if (pXGI->XGI_Pr-> -- VBType & (VB_XGI301 | VB_XGI301B | VB_XGI301C | VB_XGI302B)) { -- pXGI->XGI_SD_Flags |= (XGI_SD_SUPPORTSCART | XGI_SD_SUPPORTVGA2); -- } -- -- if ((pXGI->XGI_Pr-> -- VBType & (VB_XGI301C | VB_XGI302B | VB_XGI301LV | VB_XGI302LV)) -- && (pXGI->VBFlags & CRT2_LCD)) { -- pXGI->XGI_SD_Flags |= XGI_SD_SUPPORTLCDA; -- } -- -- pXGI->VBFlags |= pXGI->ForceCRT1Type; -- --#ifdef TWDEBUG -- xf86DrvMsg(0, X_INFO, "SDFlags %lx\n", pXGI->XGI_SD_Flags); --#endif -- -- -- if (!IS_DUAL_HEAD(pXGI) || IS_SECOND_HEAD(pXGI)) { -- xf86DrvMsg(pScrn->scrnIndex, pXGI->CRT1gammaGiven ? X_CONFIG : X_INFO, -- "CRT1 gamma correction is %s\n", -- pXGI->CRT1gamma ? "enabled" : "disabled"); -- } -- -- /* Eventually overrule TV Type (SVIDEO, COMPOSITE, SCART, HIVISION, YPBPR) */ -- if (pXGI->XGI_Pr->VBType & VB_XGIVB) { -- if (pXGI->ForceTVType != -1) { -- pXGI->VBFlags &= ~(TV_INTERFACE); -- pXGI->VBFlags |= pXGI->ForceTVType; -- if (pXGI->VBFlags & TV_YPBPR) { -- pXGI->VBFlags &= ~(TV_STANDARD); -- pXGI->VBFlags &= ~(TV_YPBPRAR); -- pXGI->VBFlags |= pXGI->ForceYPbPrType; -- pXGI->VBFlags |= pXGI->ForceYPbPrAR; -- } -- } -- } -- -- /* Check if CRT1 used or needed. There are three cases where this can -- * happen: -- * - No video bridge. -- * - No CRT2 output. -- * - Depth = 8 and bridge=LVDS|301B-DH -- * - LCDA -- */ -- if (((pXGI->XGI_Pr->VBType & VB_XGIVB) == 0) -- || ((pXGI->VBFlags & (CRT2_VGA | CRT2_LCD | CRT2_TV)) == 0) -- || ((pScrn->bitsPerPixel == 8) -- && (pXGI->XGI_Pr->VBType & VB_XGI301LV302LV)) -- || (pXGI->VBFlags & CRT1_LCDA)) { -- pXGI->CRT1off = 0; -- } -- -- -- /* Handle TVStandard option */ -- if ((pXGI->NonDefaultPAL != -1) || (pXGI->NonDefaultNTSC != -1)) { -- if (!(pXGI->XGI_Pr->VBType & VB_XGIVB)) { -- xf86DrvMsg(pScrn->scrnIndex, X_INFO, -- "PALM, PALN and NTSCJ not supported on this hardware\n"); -- pXGI->NonDefaultPAL = pXGI->NonDefaultNTSC = -1; -- pXGI->VBFlags &= ~(TV_PALN | TV_PALM | TV_NTSCJ); -- pXGI->XGI_SD_Flags &= -- ~(XGI_SD_SUPPORTPALMN | XGI_SD_SUPPORTNTSCJ); -- } -- } -- --#ifdef XGI_CP -- XGI_CP_DRIVER_RECONFIGOPT --#endif -- /* Do some MergedFB mode initialisation */ --#ifdef XGIMERGED -- if (pXGI->MergedFB) { -- pXGI->CRT2pScrn = xalloc(sizeof(ScrnInfoRec)); -- if (!pXGI->CRT2pScrn) { -- XGIErrorLog(pScrn, -- "Failed to allocate memory for 2nd pScrn, %s\n", -- mergeddisstr); -- pXGI->MergedFB = FALSE; -- } -- else { -- memcpy(pXGI->CRT2pScrn, pScrn, sizeof(ScrnInfoRec)); -- } -- } --#endif -- PDEBUG(ErrorF("3674 pXGI->VBFlags =%x\n", pXGI->VBFlags)); -- -- /* Determine CRT1<>CRT2 mode -- * Note: When using VESA or if the bridge is in slavemode, display -- * is ALWAYS in MIRROR_MODE! -- * This requires extra checks in functions using this flag! -- * (see xgi_video.c for example) -- */ -- if (pXGI->VBFlags & DISPTYPE_DISP2) { -- if (pXGI->CRT1off) { /* CRT2 only ------------------------------- */ -- if (IS_DUAL_HEAD(pXGI)) { -- XGIErrorLog(pScrn, -- "CRT1 not detected or forced off. Dual Head mode can't initialize.\n"); -- if (pXGIEnt) -- pXGIEnt->DisableDual = TRUE; -- if (pXGIEnt) -- pXGIEnt->ErrorAfterFirst = TRUE; -- if (pXGI->pInt) -- xf86FreeInt10(pXGI->pInt); -- pXGI->pInt = NULL; -- xgiRestoreExtRegisterLock(pXGI, srlockReg, crlockReg); -- XGIFreeRec(pScrn); -- return FALSE; -- } --#ifdef XGIMERGED -- if (pXGI->MergedFB) { -- if (pXGI->MergedFBAuto) { -- xf86DrvMsg(pScrn->scrnIndex, X_INFO, mergednocrt1, -- mergeddisstr); -- } -- else { -- XGIErrorLog(pScrn, mergednocrt1, mergeddisstr); -- } -- if (pXGI->CRT2pScrn) -- xfree(pXGI->CRT2pScrn); -- pXGI->CRT2pScrn = NULL; -- pXGI->MergedFB = FALSE; -- } --#endif -- pXGI->VBFlags |= VB_DISPMODE_SINGLE; -- } -- /* CRT1 and CRT2 - mirror or dual head ----- */ -- else if (IS_DUAL_HEAD(pXGI)) { -- pXGI->VBFlags |= (VB_DISPMODE_DUAL | DISPTYPE_CRT1); -- if (pXGIEnt) -- pXGIEnt->DisableDual = FALSE; -- } -- else -- pXGI->VBFlags |= (VB_DISPMODE_MIRROR | DISPTYPE_CRT1); -- } -- else { /* CRT1 only ------------------------------- */ -- if (IS_DUAL_HEAD(pXGI)) { -- XGIErrorLog(pScrn, -- "No CRT2 output selected or no bridge detected. " -- "Dual Head mode can't initialize.\n"); -- if (pXGIEnt) -- pXGIEnt->ErrorAfterFirst = TRUE; -- if (pXGI->pInt) -- xf86FreeInt10(pXGI->pInt); -- pXGI->pInt = NULL; -- xgiRestoreExtRegisterLock(pXGI, srlockReg, crlockReg); -- XGIFreeRec(pScrn); -- return FALSE; -- } -- --#ifdef XGIMERGED -- if (pXGI->MergedFB) { -- if (pXGI->MergedFBAuto) { -- xf86DrvMsg(pScrn->scrnIndex, X_INFO, mergednocrt2, -- mergeddisstr); -- } -- else { -- XGIErrorLog(pScrn, mergednocrt2, mergeddisstr); -- } -- if (pXGI->CRT2pScrn) -- xfree(pXGI->CRT2pScrn); -- pXGI->CRT2pScrn = NULL; -- pXGI->MergedFB = FALSE; -- } --#endif -- PDEBUG(ErrorF("3782 pXGI->VBFlags =%x\n", pXGI->VBFlags)); -- pXGI->VBFlags |= (VB_DISPMODE_SINGLE | DISPTYPE_CRT1); -- } -- -- /* Init Ptrs for Save/Restore functions and calc MaxClock */ -- XGIDACPreInit(pScrn); -- -- /* ********** end of VBFlags setup ********** */ -- -- /* VBFlags are initialized now. Back them up for SlaveMode modes. */ -- pXGI->VBFlags_backup = pXGI->VBFlags; -- -- /* Find out about paneldelaycompensation and evaluate option */ -- if (!IS_DUAL_HEAD(pXGI) || !IS_SECOND_HEAD(pXGI)) { -- -- } -- -- /* In dual head mode, both heads (currently) share the maxxfbmem equally. -- * If memory sharing is done differently, the following has to be changed; -- * the other modules (eg. accel and Xv) use dhmOffset for hardware -- * pointer settings relative to VideoRAM start and won't need to be changed. -- */ -- if (IS_DUAL_HEAD(pXGI)) { -- if (!IS_SECOND_HEAD(pXGI)) { -- /* ===== First head (always CRT2) ===== */ -- /* We use only half of the memory available */ -- pXGI->maxxfbmem /= 2; -- /* Initialize dhmOffset */ -- pXGI->dhmOffset = 0; -- /* Copy framebuffer addresses & sizes to entity */ -- pXGIEnt->masterFbAddress = pXGI->FbAddress; -- pXGIEnt->masterFbSize = pXGI->maxxfbmem; -- pXGIEnt->slaveFbAddress = pXGI->FbAddress + pXGI->maxxfbmem; -- pXGIEnt->slaveFbSize = pXGI->maxxfbmem; -- xf86DrvMsg(pScrn->scrnIndex, X_PROBED, -- "%ldKB video RAM at 0x%lx available for master head (CRT2)\n", -- pXGI->maxxfbmem / 1024, pXGI->FbAddress); -- } -- else { -- /* ===== Second head (always CRT1) ===== */ -- /* We use only half of the memory available */ -- pXGI->maxxfbmem /= 2; -- /* Adapt FBAddress */ -- pXGI->FbAddress += pXGI->maxxfbmem; -- /* Initialize dhmOffset */ -- pXGI->dhmOffset = pXGI->availMem - pXGI->maxxfbmem; -- xf86DrvMsg(pScrn->scrnIndex, X_PROBED, -- "%ldKB video RAM at 0x%lx available for slave head (CRT1)\n", -- pXGI->maxxfbmem / 1024, pXGI->FbAddress); -- } -- } -- else -- pXGI->dhmOffset = 0; -- -- /* Note: Do not use availMem for anything from now. Use -- * maxxfbmem instead. (availMem does not take dual head -- * mode into account.) -- */ -- --#if !defined(__powerpc__) -- /* Now load and initialize VBE module. */ -- if (xf86LoadSubModule(pScrn, "vbe")) { -- xf86LoaderReqSymLists(vbeSymbols, NULL); -- pXGI->pVbe = VBEExtendedInit(pXGI->pInt, pXGI->pEnt->index, -- SET_BIOS_SCRATCH | RESTORE_BIOS_SCRATCH); -- if (!pXGI->pVbe) { -- xf86DrvMsg(pScrn->scrnIndex, X_WARNING, -- "Could not initialize VBE module for DDC\n"); -- } -- } -- else { -- xf86DrvMsg(pScrn->scrnIndex, X_WARNING, -- "Could not load VBE module\n"); -- } -- -- XGIDDCPreInit(pScrn); --#endif -- /* From here, we mainly deal with clocks and modes */ -- -- /* Set the min pixel clock */ -- pXGI->MinClock = 5000; -- -- xf86DrvMsg(pScrn->scrnIndex, X_DEFAULT, "Min pixel clock is %d MHz\n", -- pXGI->MinClock / 1000); -- -- from = X_PROBED; -- /* -- * If the user has specified ramdac speed in the XF86Config -- * file, we respect that setting. -- */ -- if (pXGI->pEnt->device->dacSpeeds[0]) { -- int speed = 0; -- switch (pScrn->bitsPerPixel) { -- case 8: -- speed = pXGI->pEnt->device->dacSpeeds[DAC_BPP8]; -- break; -- case 16: -- speed = pXGI->pEnt->device->dacSpeeds[DAC_BPP16]; -- break; -- case 24: -- speed = pXGI->pEnt->device->dacSpeeds[DAC_BPP24]; -- break; -- case 32: -- speed = pXGI->pEnt->device->dacSpeeds[DAC_BPP32]; -- break; -- } -- if (speed == 0) -- pXGI->MaxClock = pXGI->pEnt->device->dacSpeeds[0]; -- else -- pXGI->MaxClock = speed; -- from = X_CONFIG; -- } -- xf86DrvMsg(pScrn->scrnIndex, from, "Max pixel clock is %d MHz\n", -- pXGI->MaxClock / 1000); -- -- /* -- * Setup the ClockRanges, which describe what clock ranges are available, -- * and what sort of modes they can be used for. -- */ -- clockRanges = xnfcalloc(sizeof(ClockRange), 1); -- clockRanges->next = NULL; -- clockRanges->minClock = pXGI->MinClock; -- clockRanges->maxClock = pXGI->MaxClock; -- clockRanges->clockIndex = -1; /* programmable */ -- clockRanges->interlaceAllowed = TRUE; -- clockRanges->doubleScanAllowed = TRUE; -- -- /* -- * xf86ValidateModes will check that the mode HTotal and VTotal values -- * don't exceed the chipset's limit if pScrn->maxHValue and -- * pScrn->maxVValue are set. Since our XGIValidMode() already takes -- * care of this, we don't worry about setting them here. -- */ -- -- /* Select valid modes from those available */ --#ifdef XGIMERGED -- pXGI->CheckForCRT2 = FALSE; --#endif -- XGIDumpMonPtr(pScrn->monitor); -- i = xf86ValidateModes(pScrn, pScrn->monitor->Modes, pScrn->display->modes, clockRanges, NULL, 256, 2048, /* min / max pitch */ -- pScrn->bitsPerPixel * 8, 128, 2048, /* min / max height */ -- pScrn->display->virtualX, -- pScrn->display->virtualY, -- pXGI->maxxfbmem, LOOKUP_BEST_REFRESH); -- -- if (i == -1) { -- XGIErrorLog(pScrn, "xf86ValidateModes() error\n"); -- -- if (pXGIEnt) -- pXGIEnt->ErrorAfterFirst = TRUE; -- -- if (pXGI->pInt) -- xf86FreeInt10(pXGI->pInt); -- xgiRestoreExtRegisterLock(pXGI, srlockReg, crlockReg); -- XGIFreeRec(pScrn); -- return FALSE; -- } -- -- /* Check the virtual screen against the available memory */ -- -- memreq = (pScrn->virtualX * ((pScrn->bitsPerPixel + 7) / 8)) -- * pScrn->virtualY; -- -- if (memreq > pXGI->maxxfbmem) { -- XGIErrorLog(pScrn, -- "Virtual screen too big for memory; %ldK needed, %ldK available\n", -- memreq / 1024, pXGI->maxxfbmem / 1024); -- -- if (pXGIEnt) -- pXGIEnt->ErrorAfterFirst = TRUE; -- -- if (pXGI->pInt) -- xf86FreeInt10(pXGI->pInt); -- pXGI->pInt = NULL; -- xgiRestoreExtRegisterLock(pXGI, srlockReg, crlockReg); -- XGIFreeRec(pScrn); -- return FALSE; -- } -- else if (pXGI->loadDRI && !IS_DUAL_HEAD(pXGI)) { -- pXGI->maxxfbmem = memreq; -- pXGI->DRIheapstart = pXGI->DRIheapend = 0; -- -- if (pXGI->maxxfbmem == pXGI->availMem) { -- xf86DrvMsg(pScrn->scrnIndex, X_WARNING, -- "All video memory used for framebuffer. DRI will be disabled.\n"); -- pXGI->loadDRI = FALSE; -- } -- else { -- pXGI->DRIheapstart = pXGI->maxxfbmem; -- pXGI->DRIheapend = pXGI->availMem; -- } -- } -- -- -- /* Dual Head: -- * -) Go through mode list and mark all those modes as bad, -- * which are unsuitable for dual head mode. -- * -) Find the highest used pixelclock on the master head. -- */ -- if (IS_DUAL_HEAD(pXGI) && !IS_SECOND_HEAD(pXGI)) { -- pXGIEnt->maxUsedClock = 0; -- -- if ((p = first = pScrn->modes)) { -- do { -- n = p->next; -- -- /* Modes that require the bridge to operate in SlaveMode -- * are not suitable for Dual Head mode. -- */ -- -- /* Search for the highest clock on first head in order to calculate -- * max clock for second head (CRT1) -- */ -- if ((p->status == MODE_OK) -- && (p->Clock > pXGIEnt->maxUsedClock)) { -- pXGIEnt->maxUsedClock = p->Clock; -- } -- -- p = n; -- -- } while (p != NULL && p != first); -- } -- } -- -- /* Prune the modes marked as invalid */ -- xf86PruneDriverModes(pScrn); -- -- if (i == 0 || pScrn->modes == NULL) { -- XGIErrorLog(pScrn, "No valid modes found\n"); -- -- if (pXGIEnt) -- pXGIEnt->ErrorAfterFirst = TRUE; -- -- if (pXGI->pInt) -- xf86FreeInt10(pXGI->pInt); -- xgiRestoreExtRegisterLock(pXGI, srlockReg, crlockReg); -- XGIFreeRec(pScrn); -- return FALSE; -- } -- -- xf86SetCrtcForModes(pScrn, INTERLACE_HALVE_V); -- -- /* Set the current mode to the first in the list */ -- pScrn->currentMode = pScrn->modes; -- -- /* Copy to CurrentLayout */ -- pXGI->CurrentLayout.mode = pScrn->currentMode; -- pXGI->CurrentLayout.displayWidth = pScrn->displayWidth; -- --#ifdef XGIMERGED -- if (pXGI->MergedFB) { -- xf86DrvMsg(pScrn->scrnIndex, X_INFO, modesforstr, 1); -- } --#endif -- -- /* Print the list of modes being used */ -- xf86PrintModes(pScrn); -- --#ifdef XGIMERGED -- if (pXGI->MergedFB) { -- BOOLEAN acceptcustommodes = TRUE; -- BOOLEAN includelcdmodes = TRUE; -- BOOLEAN isfordvi = FALSE; -- -- xf86DrvMsg(pScrn->scrnIndex, X_INFO, crtsetupstr, 2); -- -- clockRanges->next = NULL; -- clockRanges->minClock = pXGI->MinClock; -- clockRanges->clockIndex = -1; -- clockRanges->interlaceAllowed = FALSE; -- clockRanges->doubleScanAllowed = FALSE; -- -- xf86DrvMsg(pScrn->scrnIndex, X_DEFAULT, -- "Min pixel clock for CRT2 is %d MHz\n", -- clockRanges->minClock / 1000); -- xf86DrvMsg(pScrn->scrnIndex, X_DEFAULT, -- "Max pixel clock for CRT2 is %d MHz\n", -- clockRanges->maxClock / 1000); -- -- if ((pXGI->XGI_Pr-> -- VBType & (VB_XGI301 | VB_XGI301B | VB_XGI301C | VB_XGI302B))) -- { -- if (!(pXGI->VBFlags & (CRT2_LCD | CRT2_VGA))) -- includelcdmodes = FALSE; -- if (pXGI->VBFlags & CRT2_LCD) -- isfordvi = TRUE; -- if (pXGI->VBFlags & CRT2_TV) -- acceptcustommodes = FALSE; -- } -- else { -- includelcdmodes = FALSE; -- acceptcustommodes = FALSE; -- } -- } -- -- if (pXGI->MergedFB) { -- -- pXGI->CheckForCRT2 = TRUE; -- i = xf86ValidateModes(pXGI->CRT2pScrn, -- pXGI->CRT2pScrn->monitor->Modes, -- pXGI->CRT2pScrn->display->modes, clockRanges, -- NULL, 256, 4088, -- pXGI->CRT2pScrn->bitsPerPixel * 8, 128, 4096, -- pScrn->display->virtualX ? pScrn->virtualX : 0, -- pScrn->display->virtualY ? pScrn->virtualY : 0, -- pXGI->maxxfbmem, LOOKUP_BEST_REFRESH); -- pXGI->CheckForCRT2 = FALSE; -- -- if (i == -1) { -- XGIErrorLog(pScrn, "xf86ValidateModes() error, %s.\n", -- mergeddisstr); -- XGIFreeCRT2Structs(pXGI); -- pXGI->MergedFB = FALSE; -- } -- -- } -- -- if (pXGI->MergedFB) { -- -- if ((p = first = pXGI->CRT2pScrn->modes)) { -- do { -- n = p->next; -- p = n; -- } while (p != NULL && p != first); -- } -- -- xf86PruneDriverModes(pXGI->CRT2pScrn); -- -- if (i == 0 || pXGI->CRT2pScrn->modes == NULL) { -- XGIErrorLog(pScrn, "No valid modes found for CRT2; %s\n", -- mergeddisstr); -- XGIFreeCRT2Structs(pXGI); -- pXGI->MergedFB = FALSE; -- } -- -- } -- -- if (pXGI->MergedFB) { -- -- xf86SetCrtcForModes(pXGI->CRT2pScrn, INTERLACE_HALVE_V); -- -- xf86DrvMsg(pScrn->scrnIndex, X_INFO, modesforstr, 2); -- -- xf86PrintModes(pXGI->CRT2pScrn); -- -- pXGI->CRT1Modes = pScrn->modes; -- pXGI->CRT1CurrentMode = pScrn->currentMode; -- -- xf86DrvMsg(pScrn->scrnIndex, X_INFO, -- "Generating MergedFB mode list\n"); -- -- pScrn->modes = XGIGenerateModeList(pScrn, pXGI->MetaModes, -- pXGI->CRT1Modes, -- pXGI->CRT2pScrn->modes, -- pXGI->CRT2Position); -- -- if (!pScrn->modes) { -- -- XGIErrorLog(pScrn, -- "Failed to parse MetaModes or no modes found. %s.\n", -- mergeddisstr); -- XGIFreeCRT2Structs(pXGI); -- pScrn->modes = pXGI->CRT1Modes; -- pXGI->CRT1Modes = NULL; -- pXGI->MergedFB = FALSE; -- -- } -- -- } -- -- if (pXGI->MergedFB) { -- -- /* If no virtual dimension was given by the user, -- * calculate a sane one now. Adapts pScrn->virtualX, -- * pScrn->virtualY and pScrn->displayWidth. -- */ -- XGIRecalcDefaultVirtualSize(pScrn); -- -- pScrn->modes = pScrn->modes->next; /* We get the last from GenerateModeList(), skip to first */ -- pScrn->currentMode = pScrn->modes; -- -- /* Update CurrentLayout */ -- pXGI->CurrentLayout.mode = pScrn->currentMode; -- pXGI->CurrentLayout.displayWidth = pScrn->displayWidth; -- -- } --#endif -- -- /* Set display resolution */ --#ifdef XGIMERGED -- if (pXGI->MergedFB) { -- XGIMergedFBSetDpi(pScrn, pXGI->CRT2pScrn, pXGI->CRT2Position); -- } -- else --#endif -- xf86SetDpi(pScrn, 0, 0); -- -- /* Load fb module */ -- switch (pScrn->bitsPerPixel) { -- case 8: -- case 16: -- case 24: -- case 32: -- if (!xf86LoadSubModule(pScrn, "fb")) { -- XGIErrorLog(pScrn, "Failed to load fb module"); -- -- if (pXGIEnt) -- pXGIEnt->ErrorAfterFirst = TRUE; -- -- if (pXGI->pInt) -- xf86FreeInt10(pXGI->pInt); -- xgiRestoreExtRegisterLock(pXGI, srlockReg, crlockReg); -- XGIFreeRec(pScrn); -- return FALSE; -- } -- break; -- default: -- XGIErrorLog(pScrn, "Unsupported framebuffer bpp (%d)\n", -- pScrn->bitsPerPixel); -- -- if (pXGIEnt) -- pXGIEnt->ErrorAfterFirst = TRUE; -- -- if (pXGI->pInt) -- xf86FreeInt10(pXGI->pInt); -- xgiRestoreExtRegisterLock(pXGI, srlockReg, crlockReg); -- XGIFreeRec(pScrn); -- return FALSE; -- } -- xf86LoaderReqSymLists(fbSymbols, NULL); -- -- /* Load XAA if needed */ -- if (!pXGI->NoAccel) { -- xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Accel enabled\n"); -- if (!xf86LoadSubModule(pScrn, "xaa")) { -- XGIErrorLog(pScrn, "Could not load xaa module\n"); -- -- if (pXGIEnt) -- pXGIEnt->ErrorAfterFirst = TRUE; -- -- if (pXGI->pInt) -- xf86FreeInt10(pXGI->pInt); -- xgiRestoreExtRegisterLock(pXGI, srlockReg, crlockReg); -- XGIFreeRec(pScrn); -- return FALSE; -- } -- xf86LoaderReqSymLists(xaaSymbols, NULL); -- } -- -- /* Load shadowfb if needed */ -- if (pXGI->ShadowFB) { -- if (!xf86LoadSubModule(pScrn, "shadowfb")) { -- XGIErrorLog(pScrn, "Could not load shadowfb module\n"); -- -- if (pXGIEnt) -- pXGIEnt->ErrorAfterFirst = TRUE; -- -- if (pXGI->pInt) -- xf86FreeInt10(pXGI->pInt); -- xgiRestoreExtRegisterLock(pXGI, srlockReg, crlockReg); -- XGIFreeRec(pScrn); -- return FALSE; -- } -- xf86LoaderReqSymLists(shadowSymbols, NULL); -- } -- -- /* Load the dri module if requested. */ --#ifdef XF86DRI -- if(pXGI->loadDRI) { -- if (xf86LoadSubModule(pScrn, "dri")) { -- xf86LoaderReqSymLists(driSymbols, drmSymbols, NULL); -- } -- else { -- if (!IS_DUAL_HEAD(pXGI)) -- xf86DrvMsg(pScrn->scrnIndex, X_ERROR, -- "Remove >Load \"dri\"< from the Module section of your XF86Config file\n"); -- } -- } --#endif -- -- -- /* Now load and initialize VBE module for VESA and mode restoring. */ -- if (pXGI->pVbe) { -- vbeFree(pXGI->pVbe); -- pXGI->pVbe = NULL; -- } -- --#ifdef XGIDUALHEAD -- xf86SetPrimInitDone(pScrn->entityList[0]); --#endif -- -- xgiRestoreExtRegisterLock(pXGI, srlockReg, crlockReg); -- -- if (pXGI->pInt) -- xf86FreeInt10(pXGI->pInt); -- pXGI->pInt = NULL; -- -- if (IS_DUAL_HEAD(pXGI)) { -- pXGI->XGI_SD_Flags |= XGI_SD_ISDUALHEAD; -- if (IS_SECOND_HEAD(pXGI)) -- pXGI->XGI_SD_Flags |= XGI_SD_ISDHSECONDHEAD; -- else -- pXGI->XGI_SD_Flags &= ~(XGI_SD_SUPPORTXVGAMMA1); --#ifdef PANORAMIX -- if (!noPanoramiXExtension) { -- pXGI->XGI_SD_Flags |= XGI_SD_ISDHXINERAMA; -- pXGI->XGI_SD_Flags &= ~(XGI_SD_SUPPORTXVGAMMA1); -- } --#endif -- } -- --#ifdef XGIMERGED -- if (pXGI->MergedFB) -- pXGI->XGI_SD_Flags |= XGI_SD_ISMERGEDFB; --#endif -- -- if (pXGI->enablexgictrl) -- pXGI->XGI_SD_Flags |= XGI_SD_ENABLED; -- -- return TRUE; --} -- -- --/* -- * Map the framebuffer and MMIO memory. -- */ -- --static Bool --XGIMapMem(ScrnInfoPtr pScrn) --{ -- XGIPtr pXGI = XGIPTR(pScrn);; -- --#ifdef XSERVER_LIBPCIACCESS -- unsigned i; -- -- for (i = 0; i < 2; i++) { -- int err; -- -- err = pci_device_map_region(pXGI->PciInfo, i, TRUE); -- if (err) { -- xf86DrvMsg(pScrn->scrnIndex, X_ERROR, -- "Internal error: cound not map PCI region %u\n", i); -- return FALSE; -- } -- } -- -- pXGI->FbBase = pXGI->PciInfo->regions[0].memory; -- pXGI->IOBase = pXGI->PciInfo->regions[1].memory; --#else -- int mmioFlags; -- -- /* -- * Map IO registers to virtual address space -- */ --#if !defined(__alpha__) -- mmioFlags = VIDMEM_MMIO; --#else -- /* -- * For Alpha, we need to map SPARSE memory, since we need -- * byte/short access. -- */ -- mmioFlags = VIDMEM_MMIO | VIDMEM_SPARSE; --#endif -- pXGI->IOBase = xf86MapPciMem(pScrn->scrnIndex, mmioFlags, -- pXGI->PciTag, pXGI->IOAddress, 0x10000); -- if (pXGI->IOBase == NULL) -- return FALSE; -- --#ifdef __alpha__ -- /* -- * for Alpha, we need to map DENSE memory as well, for -- * setting CPUToScreenColorExpandBase. -- */ -- pXGI->IOBaseDense = xf86MapPciMem(pScrn->scrnIndex, VIDMEM_MMIO, -- pXGI->PciTag, pXGI->IOAddress, 0x10000); -- -- if (pXGI->IOBaseDense == NULL) -- return FALSE; --#endif /* __alpha__ */ -- -- pXGI->FbBase = xf86MapPciMem(pScrn->scrnIndex, VIDMEM_FRAMEBUFFER, -- pXGI->PciTag, -- (unsigned long) pXGI->FbAddress, -- pXGI->FbMapSize); -- -- PDEBUG(ErrorF("pXGI->FbBase = 0x%08lx\n", (ULONG) (pXGI->FbBase))); -- -- if (pXGI->FbBase == NULL) -- return FALSE; --#endif -- -- return TRUE; --} -- -- --/* -- * Unmap the framebuffer and MMIO memory. -- */ -- --static Bool --XGIUnmapMem(ScrnInfoPtr pScrn) --{ -- XGIPtr pXGI = XGIPTR(pScrn); -- XGIEntPtr pXGIEnt = ENTITY_PRIVATE(pXGI); -- -- -- /* In dual head mode, we must not unmap if the other head still -- * assumes memory as mapped -- */ -- if (IS_DUAL_HEAD(pXGI)) { -- if (pXGIEnt->MapCountIOBase) { -- pXGIEnt->MapCountIOBase--; -- if ((pXGIEnt->MapCountIOBase == 0) || (pXGIEnt->forceUnmapIOBase)) { --#ifdef XSERVER_LIBPCIACCESS -- pci_device_unmap_region(pXGI->PciInfo, 1); --#else -- xf86UnMapVidMem(pScrn->scrnIndex, (pointer) pXGIEnt->IOBase, -- (pXGI->mmioSize * 1024)); --#endif -- pXGIEnt->IOBase = NULL; -- pXGIEnt->MapCountIOBase = 0; -- pXGIEnt->forceUnmapIOBase = FALSE; -- } -- pXGI->IOBase = NULL; -- } --#ifdef __alpha__ --#ifdef XSERVER_LIBPCIACCESS --#error "How to do dense mapping on Alpha?" --#else -- if (pXGIEnt->MapCountIOBaseDense) { -- pXGIEnt->MapCountIOBaseDense--; -- if ((pXGIEnt->MapCountIOBaseDense == 0) -- || (pXGIEnt->forceUnmapIOBaseDense)) { -- xf86UnMapVidMem(pScrn->scrnIndex, -- (pointer) pXGIEnt->IOBaseDense, -- (pXGI->mmioSize * 1024)); -- pXGIEnt->IOBaseDense = NULL; -- pXGIEnt->MapCountIOBaseDense = 0; -- pXGIEnt->forceUnmapIOBaseDense = FALSE; -- } -- pXGI->IOBaseDense = NULL; -- } --#endif --#endif /* __alpha__ */ -- if (pXGIEnt->MapCountFbBase) { -- pXGIEnt->MapCountFbBase--; -- if ((pXGIEnt->MapCountFbBase == 0) || (pXGIEnt->forceUnmapFbBase)) { --#ifdef XSERVER_LIBPCIACCESS -- pci_device_unmap_region(pXGI->PciInfo, 0); --#else -- xf86UnMapVidMem(pScrn->scrnIndex, (pointer) pXGIEnt->FbBase, -- pXGI->FbMapSize); --#endif -- pXGIEnt->FbBase = NULL; -- pXGIEnt->MapCountFbBase = 0; -- pXGIEnt->forceUnmapFbBase = FALSE; -- -- } -- pXGI->FbBase = NULL; -- } -- } -- else { --#ifdef XSERVER_LIBPCIACCESS -- pci_device_unmap_region(pXGI->PciInfo, 0); -- pci_device_unmap_region(pXGI->PciInfo, 1); --#else -- xf86UnMapVidMem(pScrn->scrnIndex, (pointer) pXGI->IOBase, -- (pXGI->mmioSize * 1024)); -- xf86UnMapVidMem(pScrn->scrnIndex, (pointer) pXGI->FbBase, -- pXGI->FbMapSize); --#endif -- pXGI->IOBase = NULL; -- pXGI->FbBase = NULL; -- --#ifdef __alpha__ --#ifdef XSERVER_LIBPCIACCESS --#error "How to do dense mapping on Alpha?" --#else -- xf86UnMapVidMem(pScrn->scrnIndex, (pointer) pXGI->IOBaseDense, -- (pXGI->mmioSize * 1024)); -- pXGI->IOBaseDense = NULL; --#endif --#endif -- } -- -- return TRUE; --} -- --/* -- * This function saves the video state. -- */ --static void --XGISave(ScrnInfoPtr pScrn) --{ -- XGIPtr pXGI; -- vgaRegPtr vgaReg; -- XGIRegPtr xgiReg; -- -- PDEBUG(ErrorF("XGISave()\n")); -- -- pXGI = XGIPTR(pScrn); -- -- /* We always save master & slave */ -- if (IS_DUAL_HEAD(pXGI) && IS_SECOND_HEAD(pXGI)) -- return; -- -- vgaReg = &VGAHWPTR(pScrn)->SavedReg; -- xgiReg = &pXGI->SavedReg; -- -- vgaHWSave(pScrn, vgaReg, VGA_SR_ALL); -- -- xgiSaveUnlockExtRegisterLock(pXGI, &xgiReg->xgiRegs3C4[0x05], -- &xgiReg->xgiRegs3D4[0x80]); -- -- (*pXGI->XGISave) (pScrn, xgiReg); -- -- /* "Save" these again as they may have been changed prior to XGISave() call */ --} -- -- --/* -- * Initialise a new mode. This is currently done using the -- * "initialise struct, restore/write struct to HW" model for -- * the old chipsets (5597/530/6326). For newer chipsets, -- * we use our own mode switching code (or VESA). -- */ -- --static Bool --XGIModeInit(ScrnInfoPtr pScrn, DisplayModePtr mode) --{ -- vgaHWPtr hwp = VGAHWPTR(pScrn); -- vgaRegPtr vgaReg; -- XGIPtr pXGI = XGIPTR(pScrn); -- XGIRegPtr xgiReg; --#ifdef __powerpc__ -- unsigned char tmpval; --#endif -- -- -- /* PDEBUG(ErrorF("XGIModeInit(). \n")); */ -- PDEBUG(ErrorF -- ("XGIModeInit Resolution (%d, %d) \n", mode->HDisplay, -- mode->VDisplay)); -- PDEBUG(ErrorF("XGIModeInit VVRefresh (%8.3f) \n", mode->VRefresh)); -- PDEBUG(ErrorF("XGIModeInit Color Depth (%d) \n", pScrn->depth)); -- -- /* Jong Lin 08-26-2005; save current mode */ -- Volari_SetDefaultIdleWait(pXGI, mode->HDisplay, pScrn->depth); -- -- andXGIIDXREG(XGICR, 0x11, 0x7f); /* Unlock CRTC registers */ -- -- XGIModifyModeInfo(mode); /* Quick check of the mode parameters */ -- -- -- if (IS_DUAL_HEAD(pXGI)) { -- XGIEntPtr pXGIEnt = ENTITY_PRIVATE(pXGI); -- -- if (!(*pXGI->ModeInit) (pScrn, mode)) { -- XGIErrorLog(pScrn, "ModeInit() failed\n"); -- return FALSE; -- } -- -- pScrn->vtSema = TRUE; -- -- /* Head 2 (slave) is always CRT1 */ -- XGIPreSetMode(pScrn, mode, XGI_MODE_CRT1); -- if (!XGIBIOSSetModeCRT1(pXGI->XGI_Pr, &pXGI->xgi_HwDevExt, pScrn, -- mode)) { -- XGIErrorLog(pScrn, "XGIBIOSSetModeCRT1() failed\n"); -- return FALSE; -- } -- XGIPostSetMode(pScrn, &pXGI->ModeReg); -- XGIAdjustFrame(pXGIEnt->pScrn_1->scrnIndex, pXGIEnt->pScrn_1->frameX0, -- pXGIEnt->pScrn_1->frameY0, 0); -- } -- else -- { -- /* For other chipsets, use the old method */ -- -- /* Initialise the ModeReg values */ -- if (!vgaHWInit(pScrn, mode)) { -- XGIErrorLog(pScrn, "vgaHWInit() failed\n"); -- return FALSE; -- } -- -- /* Reset our PIOOffset as vgaHWInit might have reset it */ -- VGAHWPTR(pScrn)->PIOOffset = pXGI->IODBase - 0x380 + --#ifdef XSERVER_LIBPCIACCESS -- (pXGI->PciInfo->regions[2].base_addr & 0xFFFC) --#else -- (pXGI->PciInfo->ioBase[2] & 0xFFFC) --#endif -- ; -- -- /* Prepare the register contents */ -- if (!(*pXGI->ModeInit) (pScrn, mode)) { -- XGIErrorLog(pScrn, "ModeInit() failed\n"); -- return FALSE; -- } -- -- pScrn->vtSema = TRUE; -- -- /* Program the registers */ -- vgaHWProtect(pScrn, TRUE); -- vgaReg = &hwp->ModeReg; -- xgiReg = &pXGI->ModeReg; -- -- vgaReg->Attribute[0x10] = 0x01; -- if (pScrn->bitsPerPixel > 8) { -- vgaReg->Graphics[0x05] = 0x00; -- } -- -- vgaHWRestore(pScrn, vgaReg, VGA_SR_MODE); -- -- (*pXGI->XGIRestore) (pScrn, xgiReg); -- --#ifdef TWDEBUG -- xf86DrvMsg(pScrn->scrnIndex, X_INFO, -- "REAL REGISTER CONTENTS AFTER SETMODE:\n"); -- (*pXGI->ModeInit) (pScrn, mode); --#endif -- -- vgaHWProtect(pScrn, FALSE); -- } -- -- -- if (pXGI->Chipset == PCI_CHIP_XGIXG40 || -- pXGI->Chipset == PCI_CHIP_XGIXG20) { -- /* PDEBUG(XGIDumpRegs(pScrn)) ; */ -- PDEBUG(ErrorF(" *** PreSetMode(). \n")); -- XGIPreSetMode(pScrn, mode, XGI_MODE_SIMU); -- /* PDEBUG(XGIDumpRegs(pScrn)) ; */ -- PDEBUG(ErrorF(" *** Start SetMode() \n")); -- -- if (!XGIBIOSSetMode(pXGI->XGI_Pr, &pXGI->xgi_HwDevExt, pScrn, mode)) { -- XGIErrorLog(pScrn, "XGIBIOSSetModeCRT() failed\n"); -- return FALSE; -- } -- Volari_EnableAccelerator(pScrn); -- /* XGIPostSetMode(pScrn, &pXGI->ModeReg); */ -- /* outXGIIDXREG(XGISR, 0x20, 0xA1) ; */ -- /* PDEBUG(XGIDumpRegs(pScrn)) ; */ -- } -- -- /* Update Currentlayout */ -- pXGI->CurrentLayout.mode = mode; -- --#ifdef __powerpc__ -- inXGIIDXREG(XGICR, 0x4D, tmpval); -- if (pScrn->depth == 16) -- tmpval = (tmpval & 0xE0) | 0x0B; //word swap -- else if (pScrn->depth == 24) -- tmpval = (tmpval & 0xE0) | 0x15; //dword swap -- else -- tmpval = tmpval & 0xE0; // no swap -- -- outXGIIDXREG(XGICR, 0x4D, tmpval); --#endif -- -- return TRUE; --} -- -- --/* -- * Restore the initial mode. To be used internally only! -- */ --static void --XGIRestore(ScrnInfoPtr pScrn) --{ -- XGIPtr pXGI = XGIPTR(pScrn); -- XGIRegPtr xgiReg = &pXGI->SavedReg; -- vgaHWPtr hwp = VGAHWPTR(pScrn); -- vgaRegPtr vgaReg = &hwp->SavedReg; -- -- -- PDEBUG(ErrorF("XGIRestore():\n")); -- -- /* Wait for the accelerators */ -- if (pXGI->AccelInfoPtr) { -- (*pXGI->AccelInfoPtr->Sync) (pScrn); -- } -- -- vgaHWProtect(pScrn, TRUE); -- --#ifdef UNLOCK_ALWAYS -- xgiSaveUnlockExtRegisterLock(pXGI, NULL, NULL); --#endif -- -- (*pXGI->XGIRestore) (pScrn, xgiReg); -- -- vgaHWProtect(pScrn, TRUE); -- if (pXGI->Primary) { -- vgaHWRestore(pScrn, vgaReg, VGA_SR_ALL); -- } -- -- xgiRestoreExtRegisterLock(pXGI, xgiReg->xgiRegs3C4[5], -- xgiReg->xgiRegs3D4[0x80]); -- vgaHWProtect(pScrn, FALSE); --} -- -- --/* Our generic BlockHandler for Xv */ --static void --XGIBlockHandler(int i, pointer blockData, pointer pTimeout, pointer pReadmask) --{ -- ScreenPtr pScreen = screenInfo.screens[i]; -- ScrnInfoPtr pScrn = xf86Screens[i]; -- XGIPtr pXGI = XGIPTR(pScrn); -- -- pScreen->BlockHandler = pXGI->BlockHandler; -- (*pScreen->BlockHandler) (i, blockData, pTimeout, pReadmask); -- pScreen->BlockHandler = XGIBlockHandler; -- -- if (pXGI->VideoTimerCallback) { -- (*pXGI->VideoTimerCallback) (pScrn, currentTime.milliseconds); -- } -- -- if (pXGI->RenderCallback) { -- (*pXGI->RenderCallback) (pScrn); -- } --} -- --/* Mandatory -- * This gets called at the start of each server generation -- * -- * We use pScrn and not CurrentLayout here, because the -- * properties we use have not changed (displayWidth, -- * depth, bitsPerPixel) -- */ --static Bool --XGIScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) --{ -- ScrnInfoPtr pScrn; -- vgaHWPtr hwp; -- XGIPtr pXGI; -- int ret; -- VisualPtr visual; -- unsigned long OnScreenSize; -- int height, width, displayWidth; -- unsigned char *FBStart; -- XGIEntPtr pXGIEnt = NULL; -- -- ErrorF("XGIScreenInit\n"); -- pScrn = xf86Screens[pScreen->myNum]; -- -- hwp = VGAHWPTR(pScrn); -- -- pXGI = XGIPTR(pScrn); -- --#if !defined(__powerpc__) -- if (!IS_DUAL_HEAD(pXGI) || !IS_SECOND_HEAD(pXGI)) { -- if (xf86LoadSubModule(pScrn, "vbe")) { -- xf86LoaderReqSymLists(vbeSymbols, NULL); -- pXGI->pVbe = VBEExtendedInit(NULL, pXGI->pEnt->index, -- SET_BIOS_SCRATCH | -- RESTORE_BIOS_SCRATCH); -- } -- else { -- XGIErrorLog(pScrn, "Failed to load VBE submodule\n"); -- } -- } --#endif /* if !defined(__powerpc__) */ -- -- if (IS_DUAL_HEAD(pXGI)) { -- pXGIEnt = ENTITY_PRIVATE(pXGI); -- pXGIEnt->refCount++; -- } -- -- /* Map the VGA memory and get the VGA IO base */ -- if (pXGI->Primary) { -- hwp->MapSize = 0x10000; /* Standard 64k VGA window */ -- if (!vgaHWMapMem(pScrn)) { -- XGIErrorLog(pScrn, "Could not map VGA memory window\n"); -- return FALSE; -- } -- } -- vgaHWGetIOBase(hwp); -- -- /* Patch the PIOOffset inside vgaHW to use -- * our relocated IO ports. -- */ -- VGAHWPTR(pScrn)->PIOOffset = pXGI->IODBase - 0x380 + --#ifdef XSERVER_LIBPCIACCESS -- (pXGI->PciInfo->regions[2].base_addr & 0xFFFC) --#else -- (pXGI->PciInfo->ioBase[2] & 0xFFFC) --#endif -- ; -- -- /* Map the XGI memory and MMIO areas */ -- if (!XGIMapMem(pScrn)) { -- XGIErrorLog(pScrn, "XGIMapMem() failed\n"); -- return FALSE; -- } -- --#ifdef UNLOCK_ALWAYS -- xgiSaveUnlockExtRegisterLock(pXGI, NULL, NULL); --#endif -- -- /* Save the current state */ -- XGISave(pScrn); -- -- -- PDEBUG(ErrorF("--- ScreenInit --- \n")); -- PDEBUG(XGIDumpRegs(pScrn)); -- -- /* Initialise the first mode */ -- if (!XGIModeInit(pScrn, pScrn->currentMode)) { -- XGIErrorLog(pScrn, "XGIModeInit() failed\n"); -- return FALSE; -- } -- -- PDEBUG(ErrorF("--- XGIModeInit --- \n")); -- PDEBUG(XGIDumpRegs(pScrn)); -- -- /* Darken the screen for aesthetic reasons */ -- /* Not using Dual Head variant on purpose; we darken -- * the screen for both displays, and un-darken -- * it when the second head is finished -- */ -- XGISaveScreen(pScreen, SCREEN_SAVER_ON); -- -- /* Set the viewport */ -- XGIAdjustFrame(scrnIndex, pScrn->frameX0, pScrn->frameY0, 0); -- -- /* -- * The next step is to setup the screen's visuals, and initialise the -- * framebuffer code. In cases where the framebuffer's default -- * choices for things like visual layouts and bits per RGB are OK, -- * this may be as simple as calling the framebuffer's ScreenInit() -- * function. If not, the visuals will need to be setup before calling -- * a fb ScreenInit() function and fixed up after. -- * -- * For most PC hardware at depths >= 8, the defaults that cfb uses -- * are not appropriate. In this driver, we fixup the visuals after. -- */ -- -- /* -- * Reset visual list. -- */ -- miClearVisualTypes(); -- -- /* Setup the visuals we support. */ -- -- /* -- * For bpp > 8, the default visuals are not acceptable because we only -- * support TrueColor and not DirectColor. -- */ -- if (!miSetVisualTypes(pScrn->depth, -- (pScrn->bitsPerPixel > 8) ? -- TrueColorMask : miGetDefaultVisualMask(pScrn-> -- depth), -- pScrn->rgbBits, pScrn->defaultVisual)) { -- XGISaveScreen(pScreen, SCREEN_SAVER_OFF); -- XGIErrorLog(pScrn, "miSetVisualTypes() failed (bpp %d)\n", -- pScrn->bitsPerPixel); -- return FALSE; -- } -- -- width = pScrn->virtualX; -- height = pScrn->virtualY; -- displayWidth = pScrn->displayWidth; -- -- if (pXGI->Rotate) { -- height = pScrn->virtualX; -- width = pScrn->virtualY; -- } -- -- if (pXGI->ShadowFB) { -- pXGI->ShadowPitch = BitmapBytePad(pScrn->bitsPerPixel * width); -- pXGI->ShadowPtr = xalloc(pXGI->ShadowPitch * height); -- displayWidth = pXGI->ShadowPitch / (pScrn->bitsPerPixel >> 3); -- FBStart = pXGI->ShadowPtr; -- } -- else { -- pXGI->ShadowPtr = NULL; -- FBStart = pXGI->FbBase; -- } -- -- if (!miSetPixmapDepths()) { -- XGISaveScreen(pScreen, SCREEN_SAVER_OFF); -- XGIErrorLog(pScrn, "miSetPixmapDepths() failed\n"); -- return FALSE; -- } -- -- /* Point cmdQueuePtr to pXGIEnt for shared usage -- * (same technique is then eventually used in DRIScreeninit). -- */ -- if (IS_SECOND_HEAD(pXGI)) -- pXGI->cmdQueueLenPtr = &(XGIPTR(pXGIEnt->pScrn_1)->cmdQueueLen); -- else -- pXGI->cmdQueueLenPtr = &(pXGI->cmdQueueLen); -- -- pXGI->cmdQueueLen = 0; /* Force an EngineIdle() at start */ -- --#ifdef XF86DRI -- if(pXGI->loadDRI) { -- /* No DRI in dual head mode */ -- if (IS_DUAL_HEAD(pXGI)) { -- pXGI->directRenderingEnabled = FALSE; -- xf86DrvMsg(pScrn->scrnIndex, X_INFO, -- "DRI not supported in Dual Head mode\n"); -- } -- else if (pXGI->Chipset == PCI_CHIP_XGIXG20) { -- PDEBUG(ErrorF("--- DRI not supported \n")); -- xf86DrvMsg(pScrn->scrnIndex, X_NOT_IMPLEMENTED, -- "DRI not supported on this chipset\n"); -- pXGI->directRenderingEnabled = FALSE; -- } -- else { -- pXGI->directRenderingEnabled = XGIDRIScreenInit(pScreen); -- PDEBUG(ErrorF("--- DRI supported \n")); -- } -- } --#endif -- -- /* -- * Call the framebuffer layer's ScreenInit function, and fill in other -- * pScreen fields. -- */ -- switch (pScrn->bitsPerPixel) { -- case 24: -- case 8: -- case 16: -- case 32: -- ret = fbScreenInit(pScreen, FBStart, width, -- height, pScrn->xDpi, pScrn->yDpi, -- displayWidth, pScrn->bitsPerPixel); -- break; -- default: -- ret = FALSE; -- break; -- } -- if (!ret) { -- XGIErrorLog(pScrn, "Unsupported bpp (%d) or fbScreenInit() failed\n", -- pScrn->bitsPerPixel); -- XGISaveScreen(pScreen, SCREEN_SAVER_OFF); -- return FALSE; -- } -- -- if (pScrn->bitsPerPixel > 8) { -- /* Fixup RGB ordering */ -- visual = pScreen->visuals + pScreen->numVisuals; -- while (--visual >= pScreen->visuals) { -- if ((visual->class | DynamicClass) == DirectColor) { -- visual->offsetRed = pScrn->offset.red; -- visual->offsetGreen = pScrn->offset.green; -- visual->offsetBlue = pScrn->offset.blue; -- visual->redMask = pScrn->mask.red; -- visual->greenMask = pScrn->mask.green; -- visual->blueMask = pScrn->mask.blue; -- } -- } -- } -- -- /* Initialize RENDER ext; must be after RGB ordering fixed */ -- fbPictureInit(pScreen, 0, 0); -- -- /* hardware cursor needs to wrap this layer <-- TW: what does that mean? */ -- if (!pXGI->ShadowFB) -- XGIDGAInit(pScreen); -- -- xf86SetBlackWhitePixels(pScreen); -- -- if (!pXGI->NoAccel) { -- /* Volari_EnableAccelerator(pScrn); */ -- PDEBUG(ErrorF("---Volari Accel.. \n")); -- Volari_AccelInit(pScreen); -- } -- -- PDEBUG(ErrorF("--- AccelInit --- \n")); -- PDEBUG(XGIDumpRegs(pScrn)); -- -- miInitializeBackingStore(pScreen); -- xf86SetBackingStore(pScreen); -- xf86SetSilkenMouse(pScreen); -- -- /* Initialise cursor functions */ -- miDCInitialize(pScreen, xf86GetPointerScreenFuncs()); -- -- if (pXGI->HWCursor) { -- XGIHWCursorInit(pScreen); -- } -- -- /* Initialise default colourmap */ -- if (!miCreateDefColormap(pScreen)) { -- XGISaveScreen(pScreen, SCREEN_SAVER_OFF); -- XGIErrorLog(pScrn, "miCreateDefColormap() failed\n"); -- return FALSE; -- } -- if (!xf86HandleColormaps -- (pScreen, 256, (pScrn->depth == 8) ? 8 : pScrn->rgbBits, -- XGILoadPalette, NULL, -- CMAP_PALETTED_TRUECOLOR | CMAP_RELOAD_ON_MODE_SWITCH)) { -- PDEBUG(ErrorF("XGILoadPalette() check-return. \n")); -- XGISaveScreen(pScreen, SCREEN_SAVER_OFF); -- XGIErrorLog(pScrn, "xf86HandleColormaps() failed\n"); -- return FALSE; -- } -- --/* -- if (!xf86HandleColormaps(pScreen, 256, 8, XGILoadPalette, NULL, -- CMAP_RELOAD_ON_MODE_SWITCH)) -- { -- return FALSE; -- } --*/ -- xf86DPMSInit(pScreen, (DPMSSetProcPtr) XGIDisplayPowerManagementSet, 0); -- -- /* Init memPhysBase and fbOffset in pScrn */ -- pScrn->memPhysBase = pXGI->FbAddress; -- pScrn->fbOffset = 0; -- -- pXGI->ResetXv = pXGI->ResetXvGamma = NULL; -- --#if defined(XvExtension) -- if (!pXGI->NoXvideo) { -- XGIInitVideo(pScreen); -- } --#endif -- --#ifdef XF86DRI -- if (pXGI->directRenderingEnabled) { -- /* Now that mi, drm and others have done their thing, -- * complete the DRI setup. -- */ -- pXGI->directRenderingEnabled = XGIDRIFinishScreenInit(pScreen); -- } -- -- xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Direct rendering %sabled\n", -- (pXGI->directRenderingEnabled) ? "en" : "dis"); -- if (pXGI->directRenderingEnabled) { -- /* TODO */ -- /* XGISetLFBConfig(pXGI); */ -- } --#endif -- -- /* Wrap some funcs and setup remaining SD flags */ -- -- pXGI->XGI_SD_Flags &= ~(XGI_SD_PSEUDOXINERAMA); -- -- pXGI->CloseScreen = pScreen->CloseScreen; -- pScreen->CloseScreen = XGICloseScreen; -- if (IS_DUAL_HEAD(pXGI)) -- pScreen->SaveScreen = XGISaveScreenDH; -- else -- pScreen->SaveScreen = XGISaveScreen; -- -- /* Install BlockHandler */ -- pXGI->BlockHandler = pScreen->BlockHandler; -- pScreen->BlockHandler = XGIBlockHandler; -- -- /* Report any unused options (only for the first generation) */ -- if (serverGeneration == 1) { -- xf86ShowUnusedOptions(pScrn->scrnIndex, pScrn->options); -- } -- -- /* Clear frame buffer */ -- /* For CRT2, we don't do that at this point in dual head -- * mode since the mode isn't switched at this time (it will -- * be reset when setting the CRT1 mode). Hence, we just -- * save the necessary data and clear the screen when -- * going through this for CRT1. -- */ -- -- OnScreenSize = pScrn->displayWidth * pScrn->currentMode->VDisplay -- * (pScrn->bitsPerPixel >> 3); -- -- /* Turn on the screen now */ -- /* We do this in dual head mode after second head is finished */ -- if (IS_DUAL_HEAD(pXGI)) { -- if (IS_SECOND_HEAD(pXGI)) { -- bzero(pXGI->FbBase, OnScreenSize); -- bzero(pXGIEnt->FbBase1, pXGIEnt->OnScreenSize1); -- XGISaveScreen(pScreen, SCREEN_SAVER_OFF); -- } -- else { -- pXGIEnt->FbBase1 = pXGI->FbBase; -- pXGIEnt->OnScreenSize1 = OnScreenSize; -- } -- } -- else { -- XGISaveScreen(pScreen, SCREEN_SAVER_OFF); -- bzero(pXGI->FbBase, OnScreenSize); -- } -- -- pXGI->XGI_SD_Flags &= ~XGI_SD_ISDEPTH8; -- if (pXGI->CurrentLayout.bitsPerPixel == 8) { -- pXGI->XGI_SD_Flags |= XGI_SD_ISDEPTH8; -- pXGI->XGI_SD_Flags &= ~XGI_SD_SUPPORTXVGAMMA1; -- } -- PDEBUG(ErrorF("XGIScreenInit() End. \n")); -- XGIDumpPalette(pScrn); -- return TRUE; --} -- --/* Usually mandatory */ --Bool --XGISwitchMode(int scrnIndex, DisplayModePtr mode, int flags) --{ -- ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; -- XGIPtr pXGI = XGIPTR(pScrn); -- -- ErrorF("XGISwitchMode\n"); -- -- if (!pXGI->NoAccel) { -- if (pXGI->AccelInfoPtr) { -- (*pXGI->AccelInfoPtr->Sync) (pScrn); -- PDEBUG(ErrorF("XGISwitchMode Accel Enabled. \n")); -- } -- } -- PDEBUG(ErrorF -- ("XGISwitchMode (%d, %d) \n", mode->HDisplay, mode->VDisplay)); -- -- if (!(XGIModeInit(xf86Screens[scrnIndex], mode))) -- return FALSE; -- -- /* Since RandR (indirectly) uses SwitchMode(), we need to -- * update our Xinerama info here, too, in case of resizing -- */ -- return TRUE; --} -- --/* static void --XGISetStartAddressCRT1(XGIPtr pXGI, unsigned long base) --{ -- unsigned char cr11backup; -- -- inXGIIDXREG(XGICR, 0x11, cr11backup); -- andXGIIDXREG(XGICR, 0x11, 0x7F); -- outXGIIDXREG(XGICR, 0x0D, base & 0xFF); -- outXGIIDXREG(XGICR, 0x0C, (base >> 8) & 0xFF); -- outXGIIDXREG(XGISR, 0x0D, (base >> 16) & 0xFF); -- -- -- setXGIIDXREG(XGICR, 0x11, 0x7F,(cr11backup & 0x80)); --} */ -- --#ifdef XGIMERGED --/* static Bool --InRegion(int x, int y, region r) --{ -- return (r.x0 <= x) && (x <= r.x1) && (r.y0 <= y) && (y <= r.y1); --} */ -- --/* static void --XGIAdjustFrameHW_CRT1(ScrnInfoPtr pScrn, int x, int y) --{ -- XGIPtr pXGI = XGIPTR(pScrn); -- unsigned long base; -- -- base = y * pXGI->CurrentLayout.displayWidth + x; -- switch(pXGI->CurrentLayout.bitsPerPixel) -- { -- case 16: base >>= 1; break; -- case 32: break; -- default: base >>= 2; -- } -- XGISetStartAddressCRT1(pXGI, base); --} */ -- --/* static void --XGIMergePointerMoved(int scrnIndex, int x, int y) --{ -- ScrnInfoPtr pScrn1 = xf86Screens[scrnIndex]; -- XGIPtr pXGI = XGIPTR(pScrn1); -- ScrnInfoPtr pScrn2 = pXGI->CRT2pScrn; -- region out, in1, in2, f2, f1; -- int deltax, deltay; -- -- f1.x0 = pXGI->CRT1frameX0; -- f1.x1 = pXGI->CRT1frameX1; -- f1.y0 = pXGI->CRT1frameY0; -- f1.y1 = pXGI->CRT1frameY1; -- f2.x0 = pScrn2->frameX0; -- f2.x1 = pScrn2->frameX1; -- f2.y0 = pScrn2->frameY0; -- f2.y1 = pScrn2->frameY1; -- -- out.x0 = pScrn1->frameX0; -- out.x1 = pScrn1->frameX1; -- out.y0 = pScrn1->frameY0; -- out.y1 = pScrn1->frameY1; -- -- in1 = out; -- in2 = out; -- switch(((XGIMergedDisplayModePtr)pXGI->CurrentLayout.mode->Private)->CRT2Position) -- { -- case xgiLeftOf: -- in1.x0 = f1.x0; -- in2.x1 = f2.x1; -- break; -- case xgiRightOf: -- in1.x1 = f1.x1; -- in2.x0 = f2.x0; -- break; -- case xgiBelow: -- in1.y1 = f1.y1; -- in2.y0 = f2.y0; -- break; -- case xgiAbove: -- in1.y0 = f1.y0; -- in2.y1 = f2.y1; -- break; -- case xgiClone: -- break; -- } -- -- deltay = 0; -- deltax = 0; -- -- if(InRegion(x, y, out)) -- { -- -- if(InRegion(x, y, in1) && !InRegion(x, y, f1)) -- { -- REBOUND(f1.x0, f1.x1, x); -- REBOUND(f1.y0, f1.y1, y); -- deltax = 1; -- } -- if(InRegion(x, y, in2) && !InRegion(x, y, f2)) -- { -- REBOUND(f2.x0, f2.x1, x); -- REBOUND(f2.y0, f2.y1, y); -- deltax = 1; -- } -- -- } -- else -- { -- -- if(out.x0 > x) -- { -- deltax = x - out.x0; -- } -- if(out.x1 < x) -- { -- deltax = x - out.x1; -- } -- if(deltax) -- { -- pScrn1->frameX0 += deltax; -- pScrn1->frameX1 += deltax; -- f1.x0 += deltax; -- f1.x1 += deltax; -- f2.x0 += deltax; -- f2.x1 += deltax; -- } -- -- if(out.y0 > y) -- { -- deltay = y - out.y0; -- } -- if(out.y1 < y) -- { -- deltay = y - out.y1; -- } -- if(deltay) -- { -- pScrn1->frameY0 += deltay; -- pScrn1->frameY1 += deltay; -- f1.y0 += deltay; -- f1.y1 += deltay; -- f2.y0 += deltay; -- f2.y1 += deltay; -- } -- -- switch(((XGIMergedDisplayModePtr)pXGI->CurrentLayout.mode->Private)->CRT2Position) -- { -- case xgiLeftOf: -- if(x >= f1.x0) -- { REBOUND(f1.y0, f1.y1, y); } -- if(x <= f2.x1) -- { REBOUND(f2.y0, f2.y1, y); } -- break; -- case xgiRightOf: -- if(x <= f1.x1) -- { REBOUND(f1.y0, f1.y1, y); } -- if(x >= f2.x0) -- { REBOUND(f2.y0, f2.y1, y); } -- break; -- case xgiBelow: -- if(y <= f1.y1) -- { REBOUND(f1.x0, f1.x1, x); } -- if(y >= f2.y0) -- { REBOUND(f2.x0, f2.x1, x); } -- break; -- case xgiAbove: -- if(y >= f1.y0) -- { REBOUND(f1.x0, f1.x1, x); } -- if(y <= f2.y1) -- { REBOUND(f2.x0, f2.x1, x); } -- break; -- case xgiClone: -- break; -- } -- -- } -- -- if(deltax || deltay) -- { -- pXGI->CRT1frameX0 = f1.x0; -- pXGI->CRT1frameY0 = f1.y0; -- pScrn2->frameX0 = f2.x0; -- pScrn2->frameY0 = f2.y0; -- -- pXGI->CRT1frameX1 = pXGI->CRT1frameX0 + CDMPTR->CRT1->HDisplay - 1; -- pXGI->CRT1frameY1 = pXGI->CRT1frameY0 + CDMPTR->CRT1->VDisplay - 1; -- pScrn2->frameX1 = pScrn2->frameX0 + CDMPTR->CRT2->HDisplay - 1; -- pScrn2->frameY1 = pScrn2->frameY0 + CDMPTR->CRT2->VDisplay - 1; -- pScrn1->frameX1 = pScrn1->frameX0 + pXGI->CurrentLayout.mode->HDisplay - 1; -- pScrn1->frameY1 = pScrn1->frameY0 + pXGI->CurrentLayout.mode->VDisplay - 1; -- -- XGIAdjustFrameHW_CRT1(pScrn1, pXGI->CRT1frameX0, pXGI->CRT1frameY0); -- } --} */ -- -- --/* static void --XGIAdjustFrameMerged(int scrnIndex, int x, int y, int flags) --{ -- ScrnInfoPtr pScrn1 = xf86Screens[scrnIndex]; -- XGIPtr pXGI = XGIPTR(pScrn1); -- ScrnInfoPtr pScrn2 = pXGI->CRT2pScrn; -- int VTotal = pXGI->CurrentLayout.mode->VDisplay; -- int HTotal = pXGI->CurrentLayout.mode->HDisplay; -- int VMax = VTotal; -- int HMax = HTotal; -- -- BOUND(x, 0, pScrn1->virtualX - HTotal); -- BOUND(y, 0, pScrn1->virtualY - VTotal); -- -- switch(SDMPTR(pScrn1)->CRT2Position) -- { -- case xgiLeftOf: -- pScrn2->frameX0 = x; -- BOUND(pScrn2->frameY0, y, y + VMax - CDMPTR->CRT2->VDisplay); -- pXGI->CRT1frameX0 = x + CDMPTR->CRT2->HDisplay; -- BOUND(pXGI->CRT1frameY0, y, y + VMax - CDMPTR->CRT1->VDisplay); -- break; -- case xgiRightOf: -- pXGI->CRT1frameX0 = x; -- BOUND(pXGI->CRT1frameY0, y, y + VMax - CDMPTR->CRT1->VDisplay); -- pScrn2->frameX0 = x + CDMPTR->CRT1->HDisplay; -- BOUND(pScrn2->frameY0, y, y + VMax - CDMPTR->CRT2->VDisplay); -- break; -- case xgiAbove: -- BOUND(pScrn2->frameX0, x, x + HMax - CDMPTR->CRT2->HDisplay); -- pScrn2->frameY0 = y; -- BOUND(pXGI->CRT1frameX0, x, x + HMax - CDMPTR->CRT1->HDisplay); -- pXGI->CRT1frameY0 = y + CDMPTR->CRT2->VDisplay; -- break; -- case xgiBelow: -- BOUND(pXGI->CRT1frameX0, x, x + HMax - CDMPTR->CRT1->HDisplay); -- pXGI->CRT1frameY0 = y; -- BOUND(pScrn2->frameX0, x, x + HMax - CDMPTR->CRT2->HDisplay); -- pScrn2->frameY0 = y + CDMPTR->CRT1->VDisplay; -- break; -- case xgiClone: -- BOUND(pXGI->CRT1frameX0, x, x + HMax - CDMPTR->CRT1->HDisplay); -- BOUND(pXGI->CRT1frameY0, y, y + VMax - CDMPTR->CRT1->VDisplay); -- BOUND(pScrn2->frameX0, x, x + HMax - CDMPTR->CRT2->HDisplay); -- BOUND(pScrn2->frameY0, y, y + VMax - CDMPTR->CRT2->VDisplay); -- break; -- } -- -- BOUND(pXGI->CRT1frameX0, 0, pScrn1->virtualX - CDMPTR->CRT1->HDisplay); -- BOUND(pXGI->CRT1frameY0, 0, pScrn1->virtualY - CDMPTR->CRT1->VDisplay); -- BOUND(pScrn2->frameX0, 0, pScrn1->virtualX - CDMPTR->CRT2->HDisplay); -- BOUND(pScrn2->frameY0, 0, pScrn1->virtualY - CDMPTR->CRT2->VDisplay); -- -- pScrn1->frameX0 = x; -- pScrn1->frameY0 = y; -- -- pXGI->CRT1frameX1 = pXGI->CRT1frameX0 + CDMPTR->CRT1->HDisplay - 1; -- pXGI->CRT1frameY1 = pXGI->CRT1frameY0 + CDMPTR->CRT1->VDisplay - 1; -- pScrn2->frameX1 = pScrn2->frameX0 + CDMPTR->CRT2->HDisplay - 1; -- pScrn2->frameY1 = pScrn2->frameY0 + CDMPTR->CRT2->VDisplay - 1; -- pScrn1->frameX1 = pScrn1->frameX0 + pXGI->CurrentLayout.mode->HDisplay - 1; -- pScrn1->frameY1 = pScrn1->frameY0 + pXGI->CurrentLayout.mode->VDisplay - 1; -- -- XGIAdjustFrameHW_CRT1(pScrn1, pXGI->CRT1frameX0, pXGI->CRT1frameY0); --} */ --#endif -- --/* -- * This function is used to initialize the Start Address - the first -- * displayed location in the video memory. -- * -- * Usually mandatory -- */ --void --XGIAdjustFrame(int scrnIndex, int x, int y, int flags) --{ -- ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; -- XGIPtr pXGI = XGIPTR(pScrn); -- unsigned long base; -- unsigned char ucSR5Stat, ucTemp; -- -- ErrorF("AdjustFrame %d\n", scrnIndex); -- inXGIIDXREG(XGISR, 0x05, ucSR5Stat); -- if (ucSR5Stat == 0xA1) -- ucSR5Stat = 0x86; -- outXGIIDXREG(XGISR, 0x05, 0x86); -- -- base = (pScrn->bitsPerPixel + 7) / 8; -- base *= x; -- base += pXGI->scrnOffset * y; -- base >>= 2; -- -- switch (pXGI->Chipset) { -- case PCI_CHIP_XGIXG40: -- default: -- -- ucTemp = base & 0xFF; -- outXGIIDXREG(XGICR, 0x0D, ucTemp); -- ucTemp = (base >> 8) & 0xFF; -- outXGIIDXREG(XGICR, 0x0C, ucTemp); -- ucTemp = (base >> 16) & 0xFF; -- outXGIIDXREG(XGISR, 0x0D, ucTemp); -- ucTemp = (base >> 24) & 0x01; -- setXGIIDXREG(XGISR, 0x37, 0xFE, ucTemp); -- --/* if (pXGI->VBFlags) { -- XGI_UnLockCRT2(&(pXGI->xgi_HwDevExt),pXGI->pVBInfo); -- ucTemp = base & 0xFF ; outXGIIDXREG( XGIPART1, 6 , ucTemp ) ; -- ucTemp = (base>>8) & 0xFF ; outXGIIDXREG( XGIPART1, 5 , ucTemp ) ; -- ucTemp = (base>>16) & 0xFF ; outXGIIDXREG( XGIPART1, 4 , ucTemp ) ; -- ucTemp = (base>>24) & 0x01 ; ucTemp <<= 7 ; -- setXGIIDXREG( XGIPART1, 0x2, 0x7F, ucTemp ) ; -- -- XGI_LockCRT2(&(pXGI->xgi_HwDevExt),pXGI->pVBInfo); -- } -- */ -- break; -- -- } -- -- outXGIIDXREG(XGISR, 0x05, ucSR5Stat); -- --} -- --/* -- * This is called when VT switching back to the X server. Its job is -- * to reinitialise the video mode. -- * Mandatory! -- */ --static Bool --XGIEnterVT(int scrnIndex, int flags) --{ -- ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; -- XGIPtr pXGI = XGIPTR(pScrn); -- -- xgiSaveUnlockExtRegisterLock(pXGI, NULL, NULL); -- -- if (!XGIModeInit(pScrn, pScrn->currentMode)) { -- XGIErrorLog(pScrn, "XGIEnterVT: XGIModeInit() failed\n"); -- return FALSE; -- } -- -- XGIAdjustFrame(scrnIndex, pScrn->frameX0, pScrn->frameY0, 0); -- --#ifdef XF86DRI -- if (pXGI->directRenderingEnabled) { -- DRIUnlock(screenInfo.screens[scrnIndex]); -- } --#endif -- -- if ((!IS_DUAL_HEAD(pXGI) || !IS_SECOND_HEAD(pXGI)) && (pXGI->ResetXv)) { -- (pXGI->ResetXv) (pScrn); -- } -- -- return TRUE; --} -- --/* -- * This is called when VT switching away from the X server. Its job is -- * to restore the previous (text) mode. -- * Mandatory! -- */ --static void --XGILeaveVT(int scrnIndex, int flags) --{ -- ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; -- vgaHWPtr hwp = VGAHWPTR(pScrn); -- XGIPtr pXGI = XGIPTR(pScrn); --#ifdef XF86DRI -- ScreenPtr pScreen; -- -- PDEBUG(ErrorF("XGILeaveVT()\n")); -- if (pXGI->directRenderingEnabled) { -- pScreen = screenInfo.screens[scrnIndex]; -- DRILock(pScreen, 0); -- } --#endif -- -- if (IS_DUAL_HEAD(pXGI) && IS_SECOND_HEAD(pXGI)) -- return; -- -- if (pXGI->CursorInfoPtr) { -- /* Because of the test and return above, we know that this is not -- * the second head. -- */ -- pXGI->CursorInfoPtr->HideCursor(pScrn); -- XGI_WaitBeginRetrace(pXGI->RelIO); -- } -- -- XGIRestore(pScrn); -- -- -- /* We use (otherwise unused) bit 7 to indicate that we are running to keep -- * xgifb to change the displaymode (this would result in lethal display -- * corruption upon quitting X or changing to a VT until a reboot). -- */ -- vgaHWLock(hwp); --} -- -- --/* -- * This is called at the end of each server generation. It restores the -- * original (text) mode. It should really also unmap the video memory too. -- * Mandatory! -- */ --static Bool --XGICloseScreen(int scrnIndex, ScreenPtr pScreen) --{ -- ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; -- vgaHWPtr hwp = VGAHWPTR(pScrn); -- XGIPtr pXGI = XGIPTR(pScrn); -- -- --#ifdef XF86DRI -- if (pXGI->directRenderingEnabled) { -- XGIDRICloseScreen(pScreen); -- pXGI->directRenderingEnabled = FALSE; -- } --#endif -- -- if (pScrn->vtSema) { -- if (pXGI->CursorInfoPtr -- && (!IS_DUAL_HEAD(pXGI) || !IS_SECOND_HEAD(pXGI))) { -- pXGI->CursorInfoPtr->HideCursor(pScrn); -- XGI_WaitBeginRetrace(pXGI->RelIO); -- } -- -- -- XGIRestore(pScrn); -- vgaHWLock(hwp); -- } -- -- /* We should restore the mode number in case vtsema = false as well, -- * but since we haven't register access then we can't do it. I think -- * I need to rework the save/restore stuff, like saving the video -- * status when returning to the X server and by that save me the -- * trouble if xgifb was started from a textmode VT while X was on. -- */ -- -- XGIUnmapMem(pScrn); -- vgaHWUnmapMem(pScrn); -- -- if (IS_DUAL_HEAD(pXGI)) { -- XGIEntPtr pXGIEnt = ENTITY_PRIVATE(pXGI); -- pXGIEnt->refCount--; -- } -- -- if (pXGI->pInt) { -- xf86FreeInt10(pXGI->pInt); -- pXGI->pInt = NULL; -- } -- -- if (pXGI->AccelLinearScratch) { -- xf86FreeOffscreenLinear(pXGI->AccelLinearScratch); -- pXGI->AccelLinearScratch = NULL; -- } -- -- if (pXGI->AccelInfoPtr) { -- XAADestroyInfoRec(pXGI->AccelInfoPtr); -- pXGI->AccelInfoPtr = NULL; -- } -- -- if (pXGI->CursorInfoPtr) { -- xf86DestroyCursorInfoRec(pXGI->CursorInfoPtr); -- pXGI->CursorInfoPtr = NULL; -- } -- -- if (pXGI->ShadowPtr) { -- xfree(pXGI->ShadowPtr); -- pXGI->ShadowPtr = NULL; -- } -- -- if (pXGI->DGAModes) { -- xfree(pXGI->DGAModes); -- pXGI->DGAModes = NULL; -- } -- -- if (pXGI->adaptor) { -- xfree(pXGI->adaptor); -- pXGI->adaptor = NULL; -- pXGI->ResetXv = pXGI->ResetXvGamma = NULL; -- } -- -- pScrn->vtSema = FALSE; -- -- /* Restore Blockhandler */ -- pScreen->BlockHandler = pXGI->BlockHandler; -- -- pScreen->CloseScreen = pXGI->CloseScreen; -- -- return (*pScreen->CloseScreen) (scrnIndex, pScreen); --} -- -- --/* Free up any per-generation data structures */ -- --/* Optional */ --static void --XGIFreeScreen(int scrnIndex, int flags) --{ -- if (xf86LoaderCheckSymbol("vgaHWFreeHWRec")) { -- vgaHWFreeHWRec(xf86Screens[scrnIndex]); -- } -- -- XGIFreeRec(xf86Screens[scrnIndex]); --} -- -- --/* Checks if a mode is suitable for the selected chipset. */ -- --static int --XGIValidMode(int scrnIndex, DisplayModePtr mode, Bool verbose, int flags) --{ -- ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; -- XGIPtr pXGI = XGIPTR(pScrn); -- int HDisplay = mode->HDisplay; -- int VDisplay = mode->VDisplay; -- int Clock = mode->Clock; -- int i = 0; -- int VRefresh; -- -- VRefresh = -- (int) ((float) (Clock * 1000) / -- (float) (mode->VTotal * mode->HTotal) + 0.5); -- -- PDEBUG5(ErrorF("XGIValidMode().")); -- PDEBUG5(ErrorF -- ("CLK=%5.3fMhz %dx%d@%d ", (float) Clock / 1000, HDisplay, -- VDisplay, VRefresh)); -- PDEBUG5(ErrorF("(VT,HT)=(%d,%d)\n", mode->VTotal, mode->HTotal)); -- -- if (pXGI->VBFlags & CRT2_LCD) { -- if ((HDisplay > 1600 && VDisplay > 1200) -- || (HDisplay < 640 && VDisplay < 480)) { -- PDEBUG5(ErrorF("skip by LCD limit\n")); -- return (MODE_NOMODE); -- } -- /* if( VRefresh != 60) return(MODE_NOMODE) ; */ -- } -- else if (pXGI->VBFlags & CRT2_TV) { -- if ((HDisplay > 1024 && VDisplay > 768) || -- (HDisplay < 640 && VDisplay < 480) || (VRefresh != 60)) { -- PDEBUG5(ErrorF("skip by TV limit\n")); -- return (MODE_NOMODE); -- } -- } -- else if (pXGI->VBFlags & CRT2_VGA) { -- if ((HDisplay > 1600 && VDisplay > 1200) || -- (HDisplay < 640 && VDisplay < 480)) { -- PDEBUG5(ErrorF("skip by CRT2 limit\n")); -- return (MODE_NOMODE); -- } -- } -- -- if (pXGI->Chipset == PCI_CHIP_XGIXG20) { -- XgiMode = XG20_Mode; -- } -- else { -- XgiMode = XGI_Mode; -- } -- -- while ((XgiMode[i].Clock != Clock) || -- (XgiMode[i].HDisplay != HDisplay) || -- (XgiMode[i].VDisplay != VDisplay)) { -- if (XgiMode[i].Clock == 0) { -- PDEBUG5(ErrorF -- ("--- NO_Mode support for %dx%d@%dHz\n", HDisplay, -- VDisplay, VRefresh)); -- return (MODE_NOMODE); -- } -- else -- i++; -- } -- PDEBUG5(ErrorF("Mode OK\n")); -- -- return (MODE_OK); --} -- --/* Do screen blanking -- * -- * Mandatory -- */ --static Bool --XGISaveScreen(ScreenPtr pScreen, int mode) --{ -- ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; -- -- if ((pScrn != NULL) && pScrn->vtSema) { -- -- XGIPtr pXGI = XGIPTR(pScrn); -- --#ifdef UNLOCK_ALWAYS -- xgiSaveUnlockExtRegisterLock(pXGI, NULL, NULL); --#endif -- } -- -- return vgaHWSaveScreen(pScreen, mode); --} -- --/* SaveScreen for dual head mode */ --static Bool --XGISaveScreenDH(ScreenPtr pScreen, int mode) --{ --#ifdef XGIDUALHEAD -- ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; -- -- if ((pScrn != NULL) && pScrn->vtSema) { -- XGIPtr pXGI = XGIPTR(pScrn); -- -- if (IS_SECOND_HEAD(pXGI) -- && ((!(pXGI->VBFlags & CRT1_LCDA)) -- || (pXGI->XGI_Pr->VBType & VB_XGI301C))) { -- -- /* Slave head is always CRT1 */ -- if (pXGI->VBFlags & CRT1_LCDA) -- pXGI->Blank = xf86IsUnblank(mode) ? FALSE : TRUE; -- -- return vgaHWSaveScreen(pScreen, mode); -- } -- else { -- /* Master head is always CRT2 */ -- /* But we land here if CRT1 is LCDA, too */ -- -- /* We can only blank LCD, not other CRT2 devices */ -- if (!(pXGI->VBFlags & (CRT2_LCD | CRT1_LCDA))) -- return TRUE; -- -- /* enable access to extended sequencer registers */ --#ifdef UNLOCK_ALWAYS -- xgiSaveUnlockExtRegisterLock(pXGI, NULL, NULL); --#endif -- } -- } --#endif -- return TRUE; --} -- --#ifdef DEBUG --static void --XGIDumpModeInfo(ScrnInfoPtr pScrn, DisplayModePtr mode) --{ -- xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Clock : %x\n", mode->Clock); -- xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Hz Display : %x\n", -- mode->CrtcHDisplay); -- xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Hz Blank Start : %x\n", -- mode->CrtcHBlankStart); -- xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Hz Sync Start : %x\n", -- mode->CrtcHSyncStart); -- xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Hz Sync End : %x\n", -- mode->CrtcHSyncEnd); -- xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Hz Blank End : %x\n", -- mode->CrtcHBlankEnd); -- xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Hz Total : %x\n", mode->CrtcHTotal); -- xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Hz Skew : %x\n", mode->CrtcHSkew); -- xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Hz HAdjusted : %x\n", -- mode->CrtcHAdjusted); -- xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Vt Display : %x\n", -- mode->CrtcVDisplay); -- xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Vt Blank Start : %x\n", -- mode->CrtcVBlankStart); -- xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Vt Sync Start : %x\n", -- mode->CrtcVSyncStart); -- xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Vt Sync End : %x\n", -- mode->CrtcVSyncEnd); -- xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Vt Blank End : %x\n", -- mode->CrtcVBlankEnd); -- xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Vt Total : %x\n", mode->CrtcVTotal); -- xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Vt VAdjusted : %x\n", -- mode->CrtcVAdjusted); --} --#endif -- --static void --XGIModifyModeInfo(DisplayModePtr mode) --{ -- if (mode->CrtcHBlankStart == mode->CrtcHDisplay) -- mode->CrtcHBlankStart++; -- if (mode->CrtcHBlankEnd == mode->CrtcHTotal) -- mode->CrtcHBlankEnd--; -- if (mode->CrtcVBlankStart == mode->CrtcVDisplay) -- mode->CrtcVBlankStart++; -- if (mode->CrtcVBlankEnd == mode->CrtcVTotal) -- mode->CrtcVBlankEnd--; --} -- --/* Things to do before a ModeSwitch. We set up the -- * video bridge configuration and the TurboQueue. -- */ --void --XGIPreSetMode(ScrnInfoPtr pScrn, DisplayModePtr mode, int viewmode) --{ -- XGIPtr pXGI = XGIPTR(pScrn); -- unsigned char CR30, CR31, CR33; -- unsigned char CR3B = 0; -- unsigned char CR17, CR38 = 0; -- unsigned char CR35 = 0, CR79 = 0; -- unsigned long vbflag; -- int temp = 0; -- int crt1rateindex = 0; -- DisplayModePtr mymode; --#ifdef XGIMERGED -- DisplayModePtr mymode2 = NULL; --#endif -- --#ifdef XGIMERGED -- if (pXGI->MergedFB) { -- mymode = ((XGIMergedDisplayModePtr) mode->Private)->CRT1; -- mymode2 = ((XGIMergedDisplayModePtr) mode->Private)->CRT2; -- } -- else --#endif -- mymode = mode; -- -- vbflag = pXGI->VBFlags; -- PDEBUG(ErrorF("VBFlags=0x%lx\n", pXGI->VBFlags)); -- --#ifdef UNLOCK_ALWAYS -- xgiSaveUnlockExtRegisterLock(pXGI, NULL, NULL); /* Unlock Registers */ --#endif -- -- inXGIIDXREG(XGICR, 0x30, CR30); -- inXGIIDXREG(XGICR, 0x31, CR31); -- inXGIIDXREG(XGICR, 0x33, CR33); -- -- inXGIIDXREG(XGICR, 0x3b, CR3B); -- xf86DrvMsgVerb(pScrn->scrnIndex, X_PROBED, 4, -- "Before: CR30=0x%02x, CR31=0x%02x, CR33=0x%02x, CR%02x=0x%02x\n", -- CR30, CR31, CR33, temp, CR38); -- -- xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 4, "VBFlags=0x%lx\n", -- pXGI->VBFlags); -- -- CR30 = 0x00; -- CR31 &= ~0x60; /* Clear VB_Drivermode & VB_OutputDisable */ -- CR31 |= 0x04; /* Set VB_NotSimuMode (not for 30xB/1400x1050?) */ -- CR35 = 0x00; -- -- -- if (!pXGI->AllowHotkey) { -- CR31 |= 0x80; /* Disable hotkey-switch */ -- } -- CR79 &= ~0x10; /* Enable Backlight control on 315 series */ -- -- -- if ((vbflag & CRT1_LCDA) && (viewmode == XGI_MODE_CRT1)) { -- -- CR38 |= 0x02; -- -- } -- else { -- -- switch (vbflag & (CRT2_TV | CRT2_LCD | CRT2_VGA)) { -- -- case CRT2_TV: -- -- CR38 &= ~0xC0; /* Clear Pal M/N bits */ -- -- if (vbflag & TV_YPBPR) { /* Video bridge */ -- if (pXGI->XGI_SD_Flags & XGI_SD_SUPPORTYPBPR) { -- CR30 |= 0x80; -- CR38 |= 0x08; -- if (vbflag & TV_YPBPR525P) -- CR38 |= 0x10; -- else if (vbflag & TV_YPBPR750P) -- CR38 |= 0x20; -- else if (vbflag & TV_YPBPR1080I) -- CR38 |= 0x30; -- CR31 &= ~0x01; -- if (pXGI->XGI_SD_Flags & XGI_SD_SUPPORTYPBPRAR) { -- CR3B &= ~0x03; -- if ((vbflag & TV_YPBPRAR) == TV_YPBPR43LB) -- CR3B |= 0x00; -- else if ((vbflag & TV_YPBPRAR) == TV_YPBPR43) -- CR3B |= 0x03; -- else if ((vbflag & TV_YPBPRAR) == TV_YPBPR169) -- CR3B |= 0x01; -- else -- CR3B |= 0x03; -- } -- } -- } -- else { /* All */ -- if (vbflag & TV_SCART) -- CR30 |= 0x10; -- if (vbflag & TV_SVIDEO) -- CR30 |= 0x08; -- if (vbflag & TV_AVIDEO) -- CR30 |= 0x04; -- if (!(CR30 & 0x1C)) -- CR30 |= 0x08; /* default: SVIDEO */ -- -- if (vbflag & TV_PAL) { -- CR31 |= 0x01; -- CR35 |= 0x01; -- if (pXGI->XGI_Pr->VBType & VB_XGIVB) { -- if (vbflag & TV_PALM) { -- CR38 |= 0x40; -- CR35 |= 0x04; -- } -- else if (vbflag & TV_PALN) { -- CR38 |= 0x80; -- CR35 |= 0x08; -- } -- } -- } -- else { -- CR31 &= ~0x01; -- CR35 &= ~0x01; -- if (vbflag & TV_NTSCJ) { -- CR38 |= 0x40; /* TW, not BIOS */ -- CR35 |= 0x02; -- } -- } -- if (vbflag & TV_SCART) { -- CR31 |= 0x01; -- CR35 |= 0x01; -- } -- } -- -- CR31 &= ~0x04; /* Clear NotSimuMode */ --#ifdef XGI_CP -- XGI_CP_DRIVER_CONFIG --#endif -- break; -- -- case CRT2_LCD: -- CR30 |= 0x20; -- break; -- -- case CRT2_VGA: -- CR30 |= 0x40; -- break; -- -- default: -- CR30 |= 0x00; -- CR31 |= 0x20; /* VB_OUTPUT_DISABLE */ -- } -- -- } -- -- if (vbflag & CRT1_LCDA) { -- switch (viewmode) { -- case XGI_MODE_CRT1: -- CR38 |= 0x01; -- break; -- case XGI_MODE_CRT2: -- if (vbflag & (CRT2_TV | CRT2_VGA)) { -- CR30 |= 0x02; -- CR38 |= 0x01; -- } -- else { -- CR38 |= 0x03; -- } -- break; -- case XGI_MODE_SIMU: -- default: -- if (vbflag & (CRT2_TV | CRT2_LCD | CRT2_VGA)) { -- CR30 |= 0x01; -- } -- break; -- } -- } -- else { -- if (vbflag & (CRT2_TV | CRT2_LCD | CRT2_VGA)) { -- CR30 |= 0x01; -- } -- } -- -- CR31 |= 0x40; /* Set Drivermode */ -- CR31 &= ~0x06; /* Disable SlaveMode, disable SimuMode in SlaveMode */ -- crt1rateindex = XGISearchCRT1Rate(pScrn, mymode); -- -- if (IS_DUAL_HEAD(pXGI)) { -- if (IS_SECOND_HEAD(pXGI)) { -- /* CRT1 */ -- CR33 &= 0xf0; -- if (!(vbflag & CRT1_LCDA)) { -- CR33 |= (crt1rateindex & 0x0f); -- } -- } -- else { -- /* CRT2 */ -- CR33 &= 0x0f; -- if (vbflag & CRT2_VGA) { -- CR33 |= ((crt1rateindex << 4) & 0xf0); -- } -- } -- } -- else --#ifdef XGIMERGED -- if (pXGI->MergedFB) { -- CR33 = 0; -- if (!(vbflag & CRT1_LCDA)) { -- CR33 |= (crt1rateindex & 0x0f); -- } -- if (vbflag & CRT2_VGA) { -- CR33 |= (XGISearchCRT1Rate(pScrn, mymode2) << 4); -- } -- } -- else --#endif -- { -- CR33 = 0; -- if (!(vbflag & CRT1_LCDA)) { -- CR33 |= (crt1rateindex & 0x0f); -- } -- if (vbflag & CRT2_VGA) { -- CR33 |= ((crt1rateindex & 0x0f) << 4); -- } -- if (vbflag & CRT2_ENABLE) { -- if (pXGI->CRT1off) -- CR33 &= 0xf0; -- } -- } -- outXGIIDXREG(XGICR, 0x30, CR30); -- outXGIIDXREG(XGICR, 0x31, CR31); -- outXGIIDXREG(XGICR, 0x33, CR33); -- if (temp) { -- outXGIIDXREG(XGICR, temp, CR38); -- } -- xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 4, -- "After: CR30=0x%02x,CR31=0x%02x,CR33=0x%02x,CR%02x=%02x\n", -- CR30, CR31, CR33, temp, CR38); -- -- if (pXGI->VBFlags & CRT2_ENABLE) { -- /* Switch on CRT1 for modes that require the bridge in SlaveMode */ -- andXGIIDXREG(XGISR, 0x1f, 0x3f); -- inXGIIDXREG(XGICR, 0x17, CR17); -- if (!(CR17 & 0x80)) { -- orXGIIDXREG(XGICR, 0x17, 0x80); -- outXGIIDXREG(XGISR, 0x00, 0x01); -- usleep(10000); -- outXGIIDXREG(XGISR, 0x00, 0x03); -- } -- } --} -- --/* PostSetMode: -- * -) Disable CRT1 for saving bandwidth. This doesn't work with VESA; -- * VESA uses the bridge in SlaveMode and switching CRT1 off while -- * the bridge is in SlaveMode not that clever... -- * -) Check if overlay can be used (depending on dotclock) -- * -) Check if Panel Scaler is active on LVDS for overlay re-scaling -- * -) Save TV registers for further processing -- * -) Apply TV settings -- */ --static void --XGIPostSetMode(ScrnInfoPtr pScrn, XGIRegPtr xgiReg) --{ -- XGIPtr pXGI = XGIPTR(pScrn); --/* unsigned char usScratchCR17; -- Bool flag = FALSE; -- Bool doit = TRUE; */ -- int myclock; -- unsigned char sr2b, sr2c, tmpreg; -- float num, denum, postscalar, divider; -- PDEBUG(ErrorF(" XGIPostSetMode(). \n")); --#ifdef TWDEBUG -- xf86DrvMsg(pScrn->scrnIndex, X_INFO, "CRT1off is %d\n", pXGI->CRT1off); --#endif -- --#ifdef UNLOCK_ALWAYS -- xgiSaveUnlockExtRegisterLock(pXGI, NULL, NULL); --#endif -- -- /* Determine if the video overlay can be used */ -- if (!pXGI->NoXvideo) { -- inXGIIDXREG(XGISR, 0x2b, sr2b); -- inXGIIDXREG(XGISR, 0x2c, sr2c); -- divider = (sr2b & 0x80) ? 2.0 : 1.0; -- postscalar = (sr2c & 0x80) ? -- ((((sr2c >> 5) & 0x03) == 0x02) ? 6.0 : 8.0) : -- (((sr2c >> 5) & 0x03) + 1.0); -- num = (sr2b & 0x7f) + 1.0; -- denum = (sr2c & 0x1f) + 1.0; -- myclock = -- (int) ((14318 * (divider / postscalar) * (num / denum)) / 1000); -- -- pXGI->MiscFlags &= ~(MISC_CRT1OVERLAY | MISC_CRT1OVERLAYGAMMA); --/* switch(pXGI->xgi_HwDevExt.jChipType) { -- break; -- } -- */ -- if (!(pXGI->MiscFlags & MISC_CRT1OVERLAY)) { -- if (!IS_DUAL_HEAD(pXGI) || IS_SECOND_HEAD(pXGI)) -- xf86DrvMsgVerb(pScrn->scrnIndex, X_WARNING, 3, -- "Current dotclock (%dMhz) too high for video overlay on CRT1\n", -- myclock); -- } -- } -- -- /* Determine if the Panel Link scaler is active */ -- pXGI->MiscFlags &= ~MISC_PANELLINKSCALER; -- if (pXGI->VBFlags & (CRT2_LCD | CRT1_LCDA)) { -- if (pXGI->VBFlags & CRT1_LCDA) { -- inXGIIDXREG(XGIPART1, 0x35, tmpreg); -- tmpreg &= 0x04; -- if (!tmpreg) -- pXGI->MiscFlags |= MISC_PANELLINKSCALER; -- } -- } -- -- /* Determine if our very special TV mode is active */ -- pXGI->MiscFlags &= ~MISC_TVNTSC1024; -- if ((pXGI->XGI_Pr->VBType & VB_XGIVB) && (pXGI->VBFlags & CRT2_TV) -- && (!(pXGI->VBFlags & TV_HIVISION))) { -- if (((pXGI->VBFlags & TV_YPBPR) && (pXGI->VBFlags & TV_YPBPR525I)) -- || ((!(pXGI->VBFlags & TV_YPBPR)) -- && (pXGI->VBFlags & (TV_NTSC | TV_PALM)))) { -- inXGIIDXREG(XGICR, 0x34, tmpreg); -- tmpreg &= 0x7f; -- if ((tmpreg == 0x64) || (tmpreg == 0x4a) || (tmpreg == 0x38)) { -- pXGI->MiscFlags |= MISC_TVNTSC1024; -- } -- } -- } -- -- /* Reset XV gamma correction */ -- if (pXGI->ResetXvGamma) { -- (pXGI->ResetXvGamma) (pScrn); -- } -- -- /* Apply TV settings given by options -- * Do this even in DualHeadMode: -- * - if this is called by SetModeCRT1, CRT2 mode has been reset by SetModeCRT1 -- * - if this is called by SetModeCRT2, CRT2 mode has changed (duh!) -- * -> Hence, in both cases, the settings must be re-applied. -- */ --} -- -- --USHORT --XGI_CalcModeIndex(ScrnInfoPtr pScrn, DisplayModePtr mode, -- unsigned long VBFlags) --{ -- XGIPtr pXGI = XGIPTR(pScrn); -- UShort i = (pXGI->CurrentLayout.bitsPerPixel + 7) / 8 - 1; -- -- if ((VBFlags & CRT1_LCDA)) { -- if ((mode->HDisplay > pXGI->LCDwidth) || -- (mode->VDisplay > pXGI->LCDheight)) { -- return 0; -- } -- } -- -- return XGI_GetModeID(VBFlags, mode->HDisplay, mode->VDisplay, -- i, pXGI->LCDwidth, pXGI->LCDheight); --} -- --/* Calculate the vertical refresh rate from a mode */ --int --XGICalcVRate(DisplayModePtr mode) --{ -- float hsync, refresh = 0; -- -- if (mode->HSync > 0.0) -- hsync = mode->HSync; -- else if (mode->HTotal > 0) -- hsync = (float) mode->Clock / (float) mode->HTotal; -- else -- hsync = 0.0; -- -- if (mode->VTotal > 0) -- refresh = hsync * 1000.0 / mode->VTotal; -- -- if (mode->Flags & V_INTERLACE) -- refresh *= 2.0; -- -- if (mode->Flags & V_DBLSCAN) -- refresh /= 2.0; -- -- if (mode->VScan > 1) -- refresh /= mode->VScan; -- -- if (mode->VRefresh > 0.0) -- refresh = mode->VRefresh; -- -- if (hsync == 0 || refresh == 0) -- return (0); -- -- return ((int) (refresh)); --} -- --/* Calculate CR33 (rate index) for CRT1. -- * Calculation is done using currentmode, therefore it is -- * recommended to set VertRefresh and HorizSync to correct -- * values in config file. -- */ --unsigned char --XGISearchCRT1Rate(ScrnInfoPtr pScrn, DisplayModePtr mode) --{ --/* XGIPtr pXGI = XGIPTR(pScrn); */ -- int i = 0; -- int irefresh; -- unsigned short xres = mode->HDisplay; -- unsigned short yres = mode->VDisplay; -- unsigned char index; -- BOOLEAN checkxgi730 = FALSE; -- -- irefresh = XGICalcVRate(mode); -- if (!irefresh) { -- if (xres == 800 || xres == 1024 || xres == 1280) -- return 0x02; -- else -- return 0x01; -- } -- --#ifdef TWDEBUG -- xf86DrvMsg(0, X_INFO, "Debug: CalcVRate returned %d\n", irefresh); --#endif -- -- /* We need the REAL refresh rate here */ -- if (mode->Flags & V_INTERLACE) -- irefresh /= 2; -- -- /* Do not multiply by 2 when DBLSCAN! */ -- --#ifdef TWDEBUG -- xf86DrvMsg(0, X_INFO, "Debug: Rate after correction = %d\n", irefresh); --#endif -- -- index = 0; -- while ((xgix_vrate[i].idx != 0) && (xgix_vrate[i].xres <= xres)) { -- if ((xgix_vrate[i].xres == xres) && (xgix_vrate[i].yres == yres)) { -- if ((checkxgi730 == FALSE) -- || (xgix_vrate[i].XGI730valid32bpp == TRUE)) { -- if (xgix_vrate[i].refresh == irefresh) { -- index = xgix_vrate[i].idx; -- break; -- } -- else if (xgix_vrate[i].refresh > irefresh) { -- if ((xgix_vrate[i].refresh - irefresh) <= 3) { -- index = xgix_vrate[i].idx; -- } -- else if (((checkxgi730 == FALSE) -- || (xgix_vrate[i - 1].XGI730valid32bpp == TRUE)) -- && ((irefresh - xgix_vrate[i - 1].refresh) <= 2) -- && (xgix_vrate[i].idx != 1)) { -- index = xgix_vrate[i - 1].idx; -- } -- break; -- } -- else if ((irefresh - xgix_vrate[i].refresh) <= 2) { -- index = xgix_vrate[i].idx; -- break; -- } -- } -- } -- i++; -- } -- if (index > 0) -- return index; -- else { -- /* Default Rate index */ -- if (xres == 800 || xres == 1024 || xres == 1280) -- return 0x02; -- else -- return 0x01; -- } --} -- -- --#define MODEID_OFF 0x449 -- --unsigned char --XGI_GetSetModeID(ScrnInfoPtr pScrn, unsigned char id) --{ -- return (XGI_GetSetBIOSScratch(pScrn, MODEID_OFF, id)); --} -- --unsigned char --XGI_GetSetBIOSScratch(ScrnInfoPtr pScrn, USHORT offset, unsigned char value) --{ -- unsigned char ret = 0; --#if (defined(i386) || defined(__i386) || defined(__i386__) || defined(__AMD64__)) -- unsigned char *base; -- -- base = xf86MapVidMem(pScrn->scrnIndex, VIDMEM_MMIO, 0, 0x2000); -- if (!base) { -- XGIErrorLog(pScrn, "(Could not map BIOS scratch area)\n"); -- return 0; -- } -- -- ret = *(base + offset); -- -- /* value != 0xff means: set register */ -- if (value != 0xff) -- *(base + offset) = value; -- -- xf86UnMapVidMem(pScrn->scrnIndex, base, 0x2000); --#endif -- return ret; --} -- --void --xgiSaveUnlockExtRegisterLock(XGIPtr pXGI, unsigned char *reg1, -- unsigned char *reg2) --{ -- register unsigned char val; -- unsigned long mylockcalls; -- -- pXGI->lockcalls++; -- mylockcalls = pXGI->lockcalls; -- -- /* check if already unlocked */ -- inXGIIDXREG(XGISR, 0x05, val); -- if (val != 0xa1) { -- /* save State */ -- if (reg1) -- *reg1 = val; -- /* unlock */ --/* -- outb (0x3c4, 0x20); -- val4 = inb (0x3c5); -- val4 |= 0x20; -- outb (0x3c5, val4); --*/ -- outXGIIDXREG(XGISR, 0x05, 0x86); -- inXGIIDXREG(XGISR, 0x05, val); -- if (val != 0xA1) { --#ifdef TWDEBUG -- unsigned char val1, val2; -- int i; --#endif -- XGIErrorLog(pXGI->pScrn, -- "Failed to unlock sr registers (%p, %lx, 0x%02x; %ld)\n", -- (void *) pXGI, (unsigned long) pXGI->RelIO, val, -- mylockcalls); --#ifdef TWDEBUG -- for (i = 0; i <= 0x3f; i++) { -- inXGIIDXREG(XGISR, i, val1); -- inXGIIDXREG(0x3c4, i, val2); -- xf86DrvMsg(pXGI->pScrn->scrnIndex, X_INFO, -- "SR%02d: RelIO=0x%02x 0x3c4=0x%02x (%d)\n", -- i, val1, val2, mylockcalls); -- } --#endif -- } -- } --} -- --void --xgiRestoreExtRegisterLock(XGIPtr pXGI, unsigned char reg1, unsigned char reg2) --{ -- /* restore lock */ --#ifndef UNLOCK_ALWAYS -- outXGIIDXREG(XGISR, 0x05, reg1 == 0xA1 ? 0x86 : 0x00); --#endif --} -- -- --#ifdef DEBUG --void --XGIDumpSR(ScrnInfoPtr pScrn) --{ -- XGIPtr pXGI = XGIPTR(pScrn); -- -- int i, j; -- unsigned long temp; -- -- ErrorF -- ("----------------------------------------------------------------------\n"); -- ErrorF("SR xx\n"); -- ErrorF -- ("----------------------------------------------------------------------\n"); -- for (i = 0; i < 0x40; i += 0x10) { -- ErrorF("SR[%02X]:", i); -- for (j = 0; j < 16; j++) { -- inXGIIDXREG(XGISR, (i + j), temp); -- ErrorF(" %02lX", temp); -- } -- ErrorF("\n"); -- } -- ErrorF("\n"); --} -- --void --XGIDumpCR(ScrnInfoPtr pScrn) --{ -- XGIPtr pXGI = XGIPTR(pScrn); -- -- int i, j; -- unsigned long temp; -- -- ErrorF -- ("----------------------------------------------------------------------\n"); -- ErrorF("CR xx\n"); -- ErrorF -- ("----------------------------------------------------------------------\n"); -- for (i = 0; i < 0x100; i += 0x10) { -- ErrorF("CR[%02X]:", i); -- for (j = 0; j < 16; j++) { -- inXGIIDXREG(XGICR, (i + j), temp); -- ErrorF(" %02lX", temp); -- } -- ErrorF("\n"); -- } --} -- --void --XGIDumpGR(ScrnInfoPtr pScrn) --{ -- XGIPtr pXGI = XGIPTR(pScrn); -- -- int i; -- unsigned long temp; -- -- ErrorF -- ("----------------------------------------------------------------------\n"); -- ErrorF("GR xx\n"); -- ErrorF -- ("----------------------------------------------------------------------\n"); -- ErrorF("GR:"); -- for (i = 0; i < 0x9; i += 0x10) { -- inXGIIDXREG(XGISR, i, temp); -- ErrorF(" %02lX", temp); -- } -- ErrorF("\n"); --} -- -- --void --XGIDumpPart0(ScrnInfoPtr pScrn) --{ -- XGIPtr pXGI = XGIPTR(pScrn); -- int i, j; -- unsigned long temp; -- -- ErrorF -- ("----------------------------------------------------------------------\n"); -- ErrorF("PART0 xx\n"); -- ErrorF -- ("----------------------------------------------------------------------\n"); -- for (i = 0; i < 0x50; i += 0x10) { -- ErrorF("PART0[%02X]:", i); -- for (j = 0; j < 0x10; j++) { -- inXGIIDXREG(XGIPART0, (i + j), temp); -- ErrorF(" %02lX", temp); -- } -- ErrorF("\n"); -- } --} -- --void --XGIDumpPart05(ScrnInfoPtr pScrn) --{ -- XGIPtr pXGI = XGIPTR(pScrn); -- int i, j; -- unsigned long temp; -- ErrorF -- ("----------------------------------------------------------------------\n"); -- ErrorF("PART05 xx\n"); -- ErrorF -- ("----------------------------------------------------------------------\n"); -- for (i = 0; i < 0x50; i += 0x10) { -- ErrorF("PART05[%02X]:", i); -- for (j = 0; j < 0x10; j++) { -- inXGIIDXREG(XGIPART05, (i + j), temp); -- ErrorF(" %02lX", temp); -- } -- ErrorF("\n"); -- } --} -- --void --XGIDumpPart1(ScrnInfoPtr pScrn) --{ -- XGIPtr pXGI = XGIPTR(pScrn); -- -- int i, j; -- unsigned long temp; -- -- ErrorF -- ("----------------------------------------------------------------------\n"); -- ErrorF("PART1 xx\n"); -- ErrorF -- ("----------------------------------------------------------------------\n"); -- for (i = 0; i < 0x100; i += 0x10) { -- ErrorF("PART1[%02X]:", i); -- for (j = 0; j < 0x10; j++) { -- inXGIIDXREG(XGIPART1, (i + j), temp); -- ErrorF(" %02lX", temp); -- } -- ErrorF("\n"); -- } --} -- --void --XGIDumpPart2(ScrnInfoPtr pScrn) --{ -- XGIPtr pXGI = XGIPTR(pScrn); -- -- int i, j; -- unsigned long temp; -- -- ErrorF -- ("----------------------------------------------------------------------\n"); -- ErrorF("PART2 xx\n"); -- ErrorF -- ("----------------------------------------------------------------------\n"); -- for (i = 0; i < 0x100; i += 0x10) { -- ErrorF("PART2[%02X]:", i); -- for (j = 0; j < 0x10; j++) { -- inXGIIDXREG(XGIPART2, (i + j), temp); -- ErrorF(" %02lX", temp); -- } -- ErrorF("\n"); -- } --} -- --void --XGIDumpPart3(ScrnInfoPtr pScrn) --{ -- XGIPtr pXGI = XGIPTR(pScrn); -- -- int i, j; -- unsigned long temp; -- -- ErrorF -- ("----------------------------------------------------------------------\n"); -- ErrorF("PART3 xx\n"); -- ErrorF -- ("----------------------------------------------------------------------\n"); -- -- for (i = 0; i < 0x100; i += 0x10) { -- ErrorF("PART3[%02X]:", i); -- for (j = 0; j < 0x10; j++) { -- inXGIIDXREG(XGIPART3, (i + j), temp); -- ErrorF(" %02lX", temp); -- } -- ErrorF("\n"); -- } --} -- --void --XGIDumpPart4(ScrnInfoPtr pScrn) --{ -- XGIPtr pXGI = XGIPTR(pScrn); -- -- int i, j; -- unsigned long temp; -- -- ErrorF -- ("----------------------------------------------------------------------\n"); -- ErrorF("PART4 xx\n"); -- ErrorF -- ("----------------------------------------------------------------------\n"); -- for (i = 0; i < 0x100; i += 0x10) { -- ErrorF("PART4[%02X]:", i); -- for (j = 0; j < 0x10; j++) { -- inXGIIDXREG(XGIPART4, (i + j), temp); -- ErrorF(" %02lX", temp); -- } -- ErrorF("\n"); -- } --} -- --void --XGIDumpMMIO(ScrnInfoPtr pScrn) --{ -- XGIPtr pXGI = XGIPTR(pScrn); -- -- int i; -- unsigned long temp; --/* -- ErrorF("----------------------------------------------------------------------\n") ; -- ErrorF("MMIO 85xx\n") ; -- ErrorF("----------------------------------------------------------------------\n") ; -- for( i = 0x8500 ; i < 0x8600 ; i+=0x10 ) -- { -- ErrorF("[%04X]: %08lX %08lX %08lX %08lX\n",i, -- XGIMMIOLONG(i), -- XGIMMIOLONG(i+4), -- XGIMMIOLONG(i+8), -- XGIMMIOLONG(i+12)) ; -- } --*/ --} --#endif /* DEBUG */ -- --void --XGIDumpRegs(ScrnInfoPtr pScrn) --{ --#ifdef DEBUG -- -- XGIPtr pXGI = XGIPTR(pScrn); -- -- XGIDumpSR(pScrn); -- XGIDumpCR(pScrn); --// XGIDumpGR(pScrn); --// XGIDumpPalette(pScrn); -- XGIDumpMMIO(pScrn); -- if (pXGI->Chipset != PCI_CHIP_XGIXG20) { -- XGIDumpPart0(pScrn); -- XGIDumpPart05(pScrn); -- XGIDumpPart1(pScrn); -- XGIDumpPart2(pScrn); -- XGIDumpPart3(pScrn); -- XGIDumpPart4(pScrn); -- } -- --#endif /* DEBUG */ --} -- -- --void --XGIDumpPalette(ScrnInfoPtr pScrn) --{ --#ifdef DEBUG -- XGIPtr pXGI = XGIPTR(pScrn); -- unsigned temp[3]; -- int i, j; -- -- ErrorF -- ("----------------------------------------------------------------------\n"); -- ErrorF("Palette \n"); -- ErrorF -- ("----------------------------------------------------------------------\n"); -- for (i = 0; i < 0xFF; i += 0x04) { -- for (j = 0; j < 16; j++) { -- outb(0x3c7, i + j); -- temp[0] = inb(0x3c9); -- temp[1] = inb(0x3c9); -- temp[2] = inb(0x3c9); -- -- ErrorF("PA[%02X]: %02X %02X %02X", i + j, -- temp[0], temp[1], temp[2]); -- } -- ErrorF("\n"); -- } -- ErrorF("\n"); --#endif --} -+/* -+ * XGI driver main code -+ * -+ * Copyright (C) 2001-2004 by Thomas Winischhofer, Vienna, Austria. -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * 1) Redistributions of source code must retain the above copyright -+ * notice, this list of conditions and the following disclaimer. -+ * 2) Redistributions in binary form must reproduce the above copyright -+ * notice, this list of conditions and the following disclaimer in the -+ * documentation and/or other materials provided with the distribution. -+ * 3) The name of the author may not be used to endorse or promote products -+ * derived from this software without specific prior written permission. -+ * -+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESSED OR -+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, -+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -+ * -+ * Author: Thomas Winischhofer -+ * - driver entirely rewritten since 2001, only basic structure taken from -+ * old code (except xgi_dri.c, xgi_shadow.c, xgi_accel.c and parts of -+ * xgi_dga.c; these were mostly taken over; xgi_dri.c was changed for -+ * new versions of the DRI layer) -+ * -+ * This notice covers the entire driver code unless otherwise indicated. -+ * -+ * Formerly based on code which is -+ * Copyright (C) 1998, 1999 by Alan Hourihane, Wigan, England. -+ * Written by: -+ * Alan Hourihane , -+ * Mike Chapman , -+ * Juanjo Santamarta , -+ * Mitani Hiroshi , -+ * David Thomas . -+ */ -+ -+#ifdef HAVE_CONFIG_H -+#include "config.h" -+#endif -+ -+/* Jong 09/27/2007; added for PACKAGE_VERSION_MAJOR,... */ -+#define PACKAGE_VERSION_MAJOR 1 -+#define PACKAGE_VERSION_MINOR 1 -+#define PACKAGE_VERSION_PATCHLEVEL 0 -+ -+#include "fb.h" -+#include "mibank.h" -+#include "micmap.h" -+#include "xf86.h" -+#include "xf86Priv.h" -+#include "xf86_OSproc.h" -+#include "xf86Resources.h" -+#include "dixstruct.h" -+#include "xf86Version.h" -+#include "xf86PciInfo.h" -+#include "xf86Pci.h" -+#include "xf86cmap.h" -+#include "vgaHW.h" -+#include "xf86RAC.h" -+#include "shadowfb.h" -+#include "vbe.h" -+ -+#include "mipointer.h" -+#include "mibstore.h" -+ -+#include "xgi.h" -+#include "xgi_regs.h" -+#include "xgi_vb.h" -+#include "xgi_dac.h" -+#include "vb_def.h" -+#include "xgi_driver.h" -+#include "valid_mode.h" -+ -+#define _XF86DGA_SERVER_ -+#include -+ -+#include "globals.h" -+ -+#define DPMS_SERVER -+#include -+ -+#if defined(XvExtension) -+#include "xf86xv.h" -+#include -+#endif -+ -+#ifdef XF86DRI -+#include "dri.h" -+#endif -+ -+#ifdef HAVE_UNISTD_H -+#include -+#endif -+ -+#include -+#include -+ -+#ifdef XSERVER_LIBPCIACCESS -+static Bool XGIPciProbe(DriverPtr drv, int entity_num, -+ struct pci_device *dev, intptr_t match_data); -+#else -+static Bool XGIProbe(DriverPtr drv, int flags); -+#endif -+ -+void Volari_EnableAccelerator(ScrnInfoPtr pScrn); -+/* Globals (yes, these ARE really required to be global) */ -+ -+#ifdef XGIDUALHEAD -+static int XGIEntityIndex = -1; -+#endif -+ -+/* Jong 09/19/2007; support modeline */ -+int g_CountOfUserDefinedModes=0; -+xf86MonPtr g_pMonitorDVI=NULL; /* Jong 12/04/2007; used for filtering of CRT1 modes */ -+ -+/* -+ * This is intentionally screen-independent. It indicates the binding -+ * choice made in the first PreInit. -+ */ -+static int pix24bpp = 0; -+int FbDevExist; -+ -+#define FBIOGET_FSCREENINFO 0x4602 -+#define FB_ACCEL_XGI_GLAMOUR 41 -+ -+struct fb_fix_screeninfo -+{ -+ char id[16]; /* identification string eg "TT Builtin" */ -+ unsigned long smem_start; /* Start of frame buffer mem */ -+ /* (physical address) */ -+ unsigned long smem_len; /* Length of frame buffer mem */ -+ unsigned long type; /* see FB_TYPE_* */ -+ unsigned long type_aux; /* Interleave for interleaved Planes */ -+ unsigned long visual; /* see FB_VISUAL_* */ -+ unsigned short xpanstep; /* zero if no hardware panning */ -+ unsigned short ypanstep; /* zero if no hardware panning */ -+ unsigned short ywrapstep; /* zero if no hardware ywrap */ -+ unsigned long line_length; /* length of a line in bytes */ -+ unsigned long mmio_start; /* Start of Memory Mapped I/O */ -+ /* (physical address) */ -+ unsigned long mmio_len; /* Length of Memory Mapped I/O */ -+ unsigned long accel; /* Type of acceleration available */ -+ unsigned short reserved[3]; /* Reserved for future compatibility */ -+}; -+ -+#ifdef XSERVER_LIBPCIACCESS -+#define XGI_DEVICE_MATCH(d, i) \ -+ { 0x18ca, (d), PCI_MATCH_ANY, PCI_MATCH_ANY, 0, 0, (i) } -+ -+static const struct pci_id_match xgi_device_match[] = { -+ XGI_DEVICE_MATCH(PCI_CHIP_XGIXG40, 0), -+ XGI_DEVICE_MATCH(PCI_CHIP_XGIXG20, 1), -+ XGI_DEVICE_MATCH(PCI_CHIP_XGIXG21, 2), -+ XGI_DEVICE_MATCH(PCI_CHIP_XGIXG27, 3), -+ { 0, 0, 0 }, -+}; -+#endif -+ -+/* -+ * This contains the functions needed by the server after loading the driver -+ * module. It must be supplied, and gets passed back by the SetupProc -+ * function in the dynamic case. In the static case, a reference to this -+ * is compiled in, and this requires that the name of this DriverRec be -+ * an upper-case version of the driver name. -+ */ -+ -+DriverRec XGI = { -+ XGI_CURRENT_VERSION, -+ XGI_DRIVER_NAME, -+ XGIIdentify, -+#ifdef XSERVER_LIBPCIACCESS -+ NULL, -+#else -+ XGIProbe, -+#endif -+ XGIAvailableOptions, -+ NULL, -+ 0, -+ NULL, -+ -+#ifdef XSERVER_LIBPCIACCESS -+ xgi_device_match, -+ XGIPciProbe -+#endif -+}; -+ -+static SymTabRec XGIChipsets[] = { -+ {PCI_CHIP_XGIXG40, "Volari V8_V5_V3XT"}, -+ {PCI_CHIP_XGIXG20, "Volari Z7_Z9_Z9s"}, -+ {PCI_CHIP_XGIXG21, "Volari Z9_Z9s"}, -+ {PCI_CHIP_XGIXG27, "Volari Z11"}, -+ {-1, NULL} -+}; -+ -+static PciChipsets XGIPciChipsets[] = { -+ {PCI_CHIP_XGIXG40, PCI_CHIP_XGIXG40, RES_SHARED_VGA}, -+ {PCI_CHIP_XGIXG20, PCI_CHIP_XGIXG20, RES_SHARED_VGA}, -+ {PCI_CHIP_XGIXG21, PCI_CHIP_XGIXG21, RES_SHARED_VGA }, -+ {PCI_CHIP_XGIXG27, PCI_CHIP_XGIXG27, RES_SHARED_VGA }, -+ {-1, -1, RES_UNDEFINED} -+}; -+ -+static const char *xaaSymbols[] = { -+ "XAACopyROP", -+ "XAACreateInfoRec", -+ "XAADestroyInfoRec", -+ "XAAFillMono8x8PatternRects", -+ "XAAPatternROP", -+ "XAAHelpPatternROP", -+ "XAAInit", -+ NULL -+}; -+ -+static const char *vgahwSymbols[] = { -+ "vgaHWFreeHWRec", -+ "vgaHWGetHWRec", -+ "vgaHWGetIOBase", -+ "vgaHWGetIndex", -+ "vgaHWInit", -+ "vgaHWLock", -+ "vgaHWMapMem", -+ "vgaHWUnmapMem", -+ "vgaHWProtect", -+ "vgaHWRestore", -+ "vgaHWSave", -+ "vgaHWSaveScreen", -+ "vgaHWUnlock", -+ NULL -+}; -+ -+static const char *fbSymbols[] = { -+ "fbPictureInit", -+ "fbScreenInit", -+ NULL -+}; -+ -+static const char *shadowSymbols[] = { -+ "ShadowFBInit", -+ NULL -+}; -+ -+static const char *ramdacSymbols[] = { -+ "xf86CreateCursorInfoRec", -+ "xf86DestroyCursorInfoRec", -+ "xf86InitCursor", -+ NULL -+}; -+ -+ -+static const char *ddcSymbols[] = { -+ "xf86PrintEDID", -+ "xf86SetDDCproperties", -+ "xf86InterpretEDID", -+ NULL -+}; -+ -+ -+/* static const char *i2cSymbols[] = { -+ "xf86I2CBusInit", -+ "xf86CreateI2CBusRec", -+ NULL -+}; */ -+ -+static const char *int10Symbols[] = { -+ "xf86FreeInt10", -+ "xf86InitInt10", -+ "xf86ExecX86int10", -+ NULL -+}; -+ -+static const char *vbeSymbols[] = { -+ "VBEExtendedInit", -+ "vbeDoEDID", -+ "vbeFree", -+ "VBEGetVBEInfo", -+ "VBEFreeVBEInfo", -+ "VBEGetModeInfo", -+ "VBEFreeModeInfo", -+ "VBESaveRestore", -+ "VBESetVBEMode", -+ "VBEGetVBEMode", -+ "VBESetDisplayStart", -+ "VBESetGetLogicalScanlineLength", -+ NULL -+}; -+ -+#ifdef XF86DRI -+static const char *drmSymbols[] = { -+ "drmAddMap", -+ "drmAgpAcquire", -+ "drmAgpAlloc", -+ "drmAgpBase", -+ "drmAgpBind", -+ "drmAgpEnable", -+ "drmAgpFree", -+ "drmAgpGetMode", -+ "drmAgpRelease", -+ "drmCtlInstHandler", -+ "drmGetInterruptFromBusID", -+ "drmXGIAgpInit", -+ NULL -+}; -+ -+static const char *driSymbols[] = { -+ "DRICloseScreen", -+ "DRICreateInfoRec", -+ "DRIDestroyInfoRec", -+ "DRIFinishScreenInit", -+ "DRIGetSAREAPrivate", -+ "DRILock", -+ "DRIQueryVersion", -+ "DRIScreenInit", -+ "DRIUnlock", -+#ifdef XGINEWDRI2 -+ "GlxSetVisualConfigs", -+ "DRICreatePCIBusID", -+#endif -+ NULL -+}; -+#endif -+ -+static MODULESETUPPROTO(xgiSetup); -+ -+static XF86ModuleVersionInfo xgiVersRec = { -+ XGI_DRIVER_NAME, -+ MODULEVENDORSTRING, -+ MODINFOSTRING1, -+ MODINFOSTRING2, -+#ifdef XORG_VERSION_CURRENT -+ XORG_VERSION_CURRENT, -+#else -+ XF86_VERSION_CURRENT, -+#endif -+ PACKAGE_VERSION_MAJOR, PACKAGE_VERSION_MINOR, PACKAGE_VERSION_PATCHLEVEL, -+ ABI_CLASS_VIDEODRV, /* This is a video driver */ -+#ifdef ABI_VIDEODRV_VERSION -+ ABI_VIDEODRV_VERSION, -+#else -+ 6, -+#endif -+ MOD_CLASS_VIDEODRV, -+ {0, 0, 0, 0} -+}; -+ -+XF86ModuleData xgiModuleData = { &xgiVersRec, xgiSetup, NULL }; -+ -+/*** static string ***/ -+#ifdef XGIMERGED -+static const char *mergednocrt1 = "CRT1 not detected or forced off. %s.\n"; -+static const char *mergednocrt2 = -+ "No CRT2 output selected or no bridge detected. %s.\n"; -+static const char *mergeddisstr = "MergedFB mode disabled"; -+static const char *modesforstr = -+ "Modes for CRT%d: *********************************************\n"; -+static const char *crtsetupstr = -+ "------------------------ CRT%d setup -------------------------\n"; -+#endif -+ -+typedef struct -+{ -+ int width, height; -+ float VRefresh, HSync, DCLK; -+} ModeTiming; -+ -+static const ModeTiming establish_timing[] = { -+ {800, 600, 60, 37.9, 40}, /* t1 D[0] */ -+ {800, 600, 56, 35.1, 36}, /* t1 D[1] */ -+ {640, 480, 75, 37.5, 31.5}, /* t1 D[2] */ -+ {640, 480, 72, 37.9, 31.5}, /* t1 D[3] */ -+ {-1, -1, -1, -1}, /* t1 D[4] 640x480@67Hz, ignore */ -+ {640, 480, 60, 31.5, 25.175}, /* t1 D[5] */ -+ {-1, -1, -1, -1}, /* t1 D[6] */ -+ {-1, -1, -1, -1}, /* t1 D[7] */ -+ {1280, 1024, 75, 80.0, 135}, /* t2 D[0] */ -+ {1024, 768, 75, 60.0, 78.75}, /* t2 D[1] */ -+ {1024, 768, 70, 56.5, 75}, /* t2 D[2] */ -+ {1024, 768, 60, 48.4, 65}, /* t2 D[3] */ -+ {-1, -1, -1, -1}, /* t2 D[4] 1024x768@87I, ignore */ -+ {-1, -1, -1, -1}, /* t2 D[5] 832x624@75Hz, ignore */ -+ {800, 600, 75, 46.9, 49.5}, /* t2 D[6] */ -+ {800, 600, 72, 48.1, 50} /* t2 D[7] */ -+}; -+ -+static const ModeTiming StdTiming[] = { -+ {640, 480, 60, 31.5, 25.175}, -+ {640, 480, 72, 37.9, 31.5}, -+ {640, 480, 75, 37.5, 31.5}, -+ {640, 480, 85, 43.3, 36.0}, -+ -+ {800, 600, 56, 35.1, 36}, -+ {800, 600, 60, 37.9, 40}, -+ {800, 600, 72, 48.1, 50}, -+ {800, 600, 75, 46.9, 49.5}, -+ {800, 600, 85, 53.7, 56.25}, -+ -+ {1024, 768, 43, 35.5, 44.9}, -+ {1024, 768, 60, 48.4, 65}, -+ {1024, 768, 70, 56.5, 75}, -+ {1024, 768, 75, 60, 78.75}, -+ {1024, 768, 85, 68.7, 94.5}, -+ -+ {1152, 864, 75, 67.5, 108}, -+ -+ {1280, 960, 60, 60, 108}, -+ {1280, 960, 85, 85.9, 148.5}, -+ {1280, 1024, 60, 64.0, 108}, -+ {1280, 1024, 75, 80, 135}, -+ {1280, 1024, 85, 91.1, 157.5}, -+ -+ {1600, 1200, 60, 75, 162.0}, -+ {1600, 1200, 65, 81.3, 175.5}, -+ {1600, 1200, 70, 87.5, 189}, -+ {1600, 1200, 75, 93.8, 202}, -+ {1600, 1200, 85, 106.3, 229.5}, -+ -+ {1792, 1344, 60, 83.64, 204.75}, -+ {1792, 1344, 75, 106.27, 261}, -+ -+ {1856, 1392, 60, 86.33, 218.25}, -+ {1856, 1392, 75, 112.50, 288}, -+ -+ {1920, 1440, 60, 90, 234}, -+ {1920, 1440, 75, 112.5, 297}, -+ {-1, -1, -1, -1, -1}, -+}; -+ -+ -+static void XGIDumpPalette(ScrnInfoPtr pScrn); -+#ifdef DEBUG -+static void XGIDumpSR(ScrnInfoPtr pScrn); -+static void XGIDumpCR(ScrnInfoPtr pScrn); -+static void XGIDumpGR(ScrnInfoPtr pScrn); -+static void XGIDumpPart1(ScrnInfoPtr pScrn); -+static void XGIDumpPart2(ScrnInfoPtr pScrn); -+static void XGIDumpPart3(ScrnInfoPtr pScrn); -+static void XGIDumpPart4(ScrnInfoPtr pScrn); -+static void XGIDumpMMIO(ScrnInfoPtr pScrn); -+#endif -+ -+static int XGICalcVRate(DisplayModePtr mode); -+static unsigned char XGISearchCRT1Rate(ScrnInfoPtr pScrn, -+ DisplayModePtr mode); -+static void xgiSaveUnlockExtRegisterLock(XGIPtr pXGI, unsigned char *reg1, -+ unsigned char *reg2); -+static void xgiRestoreExtRegisterLock(XGIPtr pXGI, unsigned char reg1, -+ unsigned char reg2); -+ -+/* Jong 12/05/2007; check mode with monitor DDC */ -+static bool XGICheckModeByDDC(DisplayModePtr pMode, xf86MonPtr pMonitorDDC); -+ -+/* Jong 12/05/2007; filter mode list by monitor DDC */ -+static void XGIFilterModeByDDC(DisplayModePtr pModeList, xf86MonPtr pMonitorDDC); -+ -+static pointer -+xgiSetup(pointer module, pointer opts, int *errmaj, int *errmin) -+{ -+ static Bool setupDone = FALSE; -+ -+ if (!setupDone) { -+ setupDone = TRUE; -+ xf86AddDriver(&XGI, module, HaveDriverFuncs); -+ LoaderRefSymLists(vgahwSymbols, fbSymbols, xaaSymbols, -+ shadowSymbols, ramdacSymbols, ddcSymbols, -+ vbeSymbols, int10Symbols, -+#ifdef XF86DRI -+ drmSymbols, driSymbols, -+#endif -+ NULL); -+ return (pointer) TRUE; -+ } -+ -+ if (errmaj) -+ *errmaj = LDR_ONCEONLY; -+ return NULL; -+} -+ -+ -+static XGIPtr -+XGIGetRec(ScrnInfoPtr pScrn) -+{ -+ /* -+ * Allocate an XGIRec, and hook it into pScrn->driverPrivate. -+ * pScrn->driverPrivate is initialised to NULL, so we can check if -+ * the allocation has already been done. -+ */ -+ if (pScrn->driverPrivate == NULL) { -+ XGIPtr pXGI = xnfcalloc(sizeof(XGIRec), 1); -+ -+ /* Initialise it to 0 */ -+ memset(pXGI, 0, sizeof(XGIRec)); -+ -+ pScrn->driverPrivate = pXGI; -+ pXGI->pScrn = pScrn; -+ } -+ -+ return (XGIPtr) pScrn->driverPrivate; -+} -+ -+static void -+XGIFreeRec(ScrnInfoPtr pScrn) -+{ -+ XGIPtr pXGI = XGIPTR(pScrn); -+ XGIEntPtr pXGIEnt = NULL; -+ -+ /* Just to make sure... */ -+ if (!pXGI) -+ return; -+ -+ pXGIEnt = ENTITY_PRIVATE(pXGI); -+ if (pXGIEnt) { -+ if (!IS_SECOND_HEAD(pXGI)) { -+ /* Free memory only if we are first head; in case of an error -+ * during init of the second head, the server will continue - -+ * and we need the BIOS image and VB_DEVICE_INFO for the first -+ * head. -+ */ -+ if (pXGIEnt->BIOS) -+ xfree(pXGIEnt->BIOS); -+ pXGIEnt->BIOS = pXGI->BIOS = NULL; -+ if (pXGIEnt->XGI_Pr) -+ xfree(pXGIEnt->XGI_Pr); -+ pXGIEnt->XGI_Pr = pXGI->XGI_Pr = NULL; -+ if (pXGIEnt->RenderAccelArray) -+ xfree(pXGIEnt->RenderAccelArray); -+ pXGIEnt->RenderAccelArray = pXGI->RenderAccelArray = NULL; -+ } -+ else { -+ pXGI->BIOS = NULL; -+ pXGI->XGI_Pr = NULL; -+ pXGI->RenderAccelArray = NULL; -+ } -+ } -+ else { -+ if (pXGI->BIOS) -+ xfree(pXGI->BIOS); -+ pXGI->BIOS = NULL; -+ if (pXGI->XGI_Pr) -+ xfree(pXGI->XGI_Pr); -+ pXGI->XGI_Pr = NULL; -+ if (pXGI->RenderAccelArray) -+ xfree(pXGI->RenderAccelArray); -+ pXGI->RenderAccelArray = NULL; -+ } -+ -+#ifdef XGIMERGED -+ if (pXGI->MetaModes) -+ xfree(pXGI->MetaModes); -+ pXGI->MetaModes = NULL; -+ -+ if (pXGI->CRT1Modes) { -+ if (pXGI->CRT1Modes != pScrn->modes) { -+ if (pScrn->modes) { -+ pScrn->currentMode = pScrn->modes; -+ do { -+ DisplayModePtr p = pScrn->currentMode->next; -+ if (pScrn->currentMode->Private) -+ xfree(pScrn->currentMode->Private); -+ xfree(pScrn->currentMode); -+ pScrn->currentMode = p; -+ } while (pScrn->currentMode != pScrn->modes); -+ } -+ pScrn->currentMode = pXGI->CRT1CurrentMode; -+ pScrn->modes = pXGI->CRT1Modes; -+ pXGI->CRT1CurrentMode = NULL; -+ pXGI->CRT1Modes = NULL; -+ } -+ } -+#endif -+ if (pXGI->pVbe) -+ vbeFree(pXGI->pVbe); -+ pXGI->pVbe = NULL; -+ if (pScrn->driverPrivate == NULL) -+ return; -+ xfree(pScrn->driverPrivate); -+ pScrn->driverPrivate = NULL; -+} -+ -+static void -+XGIDisplayPowerManagementSet(ScrnInfoPtr pScrn, int PowerManagementMode, -+ int flags) -+{ -+ XGIPtr pXGI = XGIPTR(pScrn); -+ BOOLEAN docrt1 = TRUE, docrt2 = TRUE; -+ unsigned char sr1 = 0, cr17 = 0, cr63 = 0, sr11 = 0, pmreg = 0, sr7 = 0; -+ unsigned char p1_13 = 0, p2_0 = 0, oldpmreg = 0; -+ BOOLEAN backlight = TRUE; -+ -+ xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 3, -+ "XGIDisplayPowerManagementSet(%d)\n", PowerManagementMode); -+ -+ if (IS_DUAL_HEAD(pXGI)) { -+ if (IS_SECOND_HEAD(pXGI)) -+ docrt2 = FALSE; -+ else -+ docrt1 = FALSE; -+ } -+ -+#ifdef UNLOCK_ALWAYS -+ xgiSaveUnlockExtRegisterLock(pXGI, NULL, NULL); -+#endif -+ -+ switch (PowerManagementMode) { -+ -+ case DPMSModeOn: /* HSync: On, VSync: On */ -+ if (docrt1) -+ pXGI->Blank = FALSE; -+ -+ sr1 = 0x00; -+ cr17 = 0x80; -+ pmreg = 0x00; -+ cr63 = 0x00; -+ sr7 = 0x10; -+ sr11 = (pXGI->LCDon & 0x0C); -+ p2_0 = 0x20; -+ p1_13 = 0x00; -+ backlight = TRUE; -+ break; -+ -+ case DPMSModeSuspend: /* HSync: On, VSync: Off */ -+ if (docrt1) -+ pXGI->Blank = TRUE; -+ -+ sr1 = 0x20; -+ cr17 = 0x80; -+ pmreg = 0x80; -+ cr63 = 0x40; -+ sr7 = 0x00; -+ sr11 = 0x08; -+ p2_0 = 0x40; -+ p1_13 = 0x80; -+ backlight = FALSE; -+ break; -+ -+ case DPMSModeStandby: /* HSync: Off, VSync: On */ -+ if (docrt1) -+ pXGI->Blank = TRUE; -+ -+ sr1 = 0x20; -+ cr17 = 0x80; -+ pmreg = 0x40; -+ cr63 = 0x40; -+ sr7 = 0x00; -+ sr11 = 0x08; -+ p2_0 = 0x80; -+ p1_13 = 0x40; -+ backlight = FALSE; -+ break; -+ -+ case DPMSModeOff: /* HSync: Off, VSync: Off */ -+ if (docrt1) -+ pXGI->Blank = TRUE; -+ -+ sr1 = 0x20; -+ cr17 = 0x00; -+ pmreg = 0xc0; -+ cr63 = 0x40; -+ sr7 = 0x00; -+ sr11 = 0x08; -+ p2_0 = 0xc0; -+ p1_13 = 0xc0; -+ backlight = FALSE; -+ break; -+ -+ default: -+ return; -+ } -+ -+ if (docrt1) { -+ /* Set/Clear "Display On" bit -+ */ -+ setXGIIDXREG(XGISR, 0x01, ~0x20, sr1); -+ -+ if ((!(pXGI->VBFlags & CRT1_LCDA)) -+ || (pXGI->XGI_Pr->VBType & VB_XGI301C)) { -+ inXGIIDXREG(XGISR, 0x1f, oldpmreg); -+ if (!pXGI->CRT1off) { -+ setXGIIDXREG(XGISR, 0x1f, 0x3f, pmreg); -+ } -+ } -+ oldpmreg &= 0xc0; -+ } -+ -+ if ((docrt1) && (pmreg != oldpmreg) -+ && ((!(pXGI->VBFlags & CRT1_LCDA)) -+ || (pXGI->XGI_Pr->VBType & VB_XGI301C))) { -+ outXGIIDXREG(XGISR, 0x00, 0x01); /* Synchronous Reset */ -+ usleep(10000); -+ outXGIIDXREG(XGISR, 0x00, 0x03); /* End Reset */ -+ } -+ -+} -+ -+/* Mandatory */ -+static void -+XGIIdentify(int flags) -+{ -+ xf86PrintChipsets(XGI_NAME, "driver for XGI chipsets", XGIChipsets); -+ PDEBUG(ErrorF(" --- XGIIdentify \n")); -+} -+ -+static void -+XGIErrorLog(ScrnInfoPtr pScrn, const char *format, ...) -+{ -+ va_list ap; -+ static const char *str = -+ "**************************************************\n"; -+ -+ va_start(ap, format); -+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR, str); -+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR, " ERROR:\n"); -+ xf86VDrvMsgVerb(pScrn->scrnIndex, X_ERROR, 1, format, ap); -+ va_end(ap); -+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR, -+ " END OF MESSAGE\n"); -+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR, str); -+} -+ -+#ifdef XSERVER_LIBPCIACCESS -+static Bool XGIPciProbe(DriverPtr drv, int entity_num, -+ struct pci_device *dev, intptr_t match_data) -+{ -+ ScrnInfoPtr pScrn; -+ -+ -+ pScrn = xf86ConfigPciEntity(NULL, 0, entity_num, NULL, -+ NULL, NULL, NULL, NULL, NULL); -+ if (pScrn != NULL) { -+ XGIPtr pXGI; -+ -+ /* Fill in what we can of the ScrnInfoRec */ -+ pScrn->driverVersion = XGI_CURRENT_VERSION; -+ pScrn->driverName = XGI_DRIVER_NAME; -+ pScrn->name = XGI_NAME; -+ pScrn->Probe = NULL; -+ pScrn->PreInit = XGIPreInit; -+ pScrn->ScreenInit = XGIScreenInit; -+ pScrn->SwitchMode = XGISwitchMode; -+ pScrn->AdjustFrame = XGIAdjustFrame; -+ pScrn->EnterVT = XGIEnterVT; -+ pScrn->LeaveVT = XGILeaveVT; -+ pScrn->FreeScreen = XGIFreeScreen; -+ pScrn->ValidMode = XGIValidMode; -+ -+ -+ pXGI = XGIGetRec(pScrn); -+ if (pXGI == NULL) { -+ return FALSE; -+ } -+ -+ pXGI->PciInfo = dev; -+ } -+ -+ return (pScrn != NULL); -+} -+ -+#else -+ -+/* Mandatory */ -+static Bool -+XGIProbe(DriverPtr drv, int flags) -+{ -+ int i; -+ GDevPtr *devSections; -+ int *usedChips; -+ int numDevSections; -+ int numUsed; -+ Bool foundScreen = FALSE; -+ -+ /* -+ * The aim here is to find all cards that this driver can handle, -+ * and for the ones not already claimed by another driver, claim the -+ * slot, and allocate a ScrnInfoRec. -+ * -+ * This should be a minimal probe, and it should under no circumstances -+ * change the state of the hardware. Because a device is found, don't -+ * assume that it will be used. Don't do any initialisations other than -+ * the required ScrnInfoRec initialisations. Don't allocate any new -+ * data structures. -+ * -+ */ -+ -+ /* -+ * Next we check, if there has been a chipset override in the config file. -+ * For this we must find out if there is an active device section which -+ * is relevant, i.e., which has no driver specified or has THIS driver -+ * specified. -+ */ -+ -+ if ((numDevSections = -+ xf86MatchDevice(XGI_DRIVER_NAME, &devSections)) <= 0) { -+ /* -+ * There's no matching device section in the config file, so quit -+ * now. -+ */ -+ return FALSE; -+ } -+ -+ PDEBUG(ErrorF(" --- XGIProbe \n")); -+ /* -+ * We need to probe the hardware first. We then need to see how this -+ * fits in with what is given in the config file, and allow the config -+ * file info to override any contradictions. -+ */ -+ -+ /* -+ * All of the cards this driver supports are PCI, so the "probing" just -+ * amounts to checking the PCI data that the server has already collected. -+ */ -+ if (xf86GetPciVideoInfo() == NULL) { -+ /* -+ * We won't let anything in the config file override finding no -+ * PCI video cards at all. This seems reasonable now, but we'll see. -+ */ -+ return FALSE; -+ } -+ -+ numUsed = xf86MatchPciInstances(XGI_NAME, PCI_VENDOR_XGI, -+ XGIChipsets, XGIPciChipsets, devSections, -+ numDevSections, drv, &usedChips); -+ -+ /* Free it since we don't need that list after this */ -+ xfree(devSections); -+ if (numUsed <= 0) -+ return FALSE; -+ -+ if (flags & PROBE_DETECT) { -+ foundScreen = TRUE; -+ } -+ else -+ for (i = 0; i < numUsed; i++) { -+ ScrnInfoPtr pScrn; -+#ifdef XGIDUALHEAD -+ EntityInfoPtr pEnt; -+#endif -+ -+ /* Allocate a ScrnInfoRec and claim the slot */ -+ pScrn = NULL; -+ -+ if ((pScrn = xf86ConfigPciEntity(pScrn, 0, usedChips[i], -+ XGIPciChipsets, NULL, NULL, -+ NULL, NULL, NULL))) { -+ /* Fill in what we can of the ScrnInfoRec */ -+ pScrn->driverVersion = XGI_CURRENT_VERSION; -+ pScrn->driverName = XGI_DRIVER_NAME; -+ pScrn->name = XGI_NAME; -+ pScrn->Probe = XGIProbe; -+ pScrn->PreInit = XGIPreInit; -+ pScrn->ScreenInit = XGIScreenInit; -+ pScrn->SwitchMode = XGISwitchMode; -+ pScrn->AdjustFrame = XGIAdjustFrame; -+ pScrn->EnterVT = XGIEnterVT; -+ pScrn->LeaveVT = XGILeaveVT; -+ pScrn->FreeScreen = XGIFreeScreen; -+ pScrn->ValidMode = XGIValidMode; -+ foundScreen = TRUE; -+ } -+#ifdef XGIDUALHEAD -+ pEnt = xf86GetEntityInfo(usedChips[i]); -+ -+#endif -+ } -+ xfree(usedChips); -+ -+ return foundScreen; -+} -+#endif -+ -+ -+/* Some helper functions for MergedFB mode */ -+ -+#ifdef XGIMERGED -+ -+/* Copy and link two modes form mergedfb mode -+ * (Code base taken from mga driver) -+ * Copys mode i, links the result to dest, and returns it. -+ * Links i and j in Private record. -+ * If dest is NULL, return value is copy of i linked to itself. -+ * For mergedfb auto-config, we only check the dimension -+ * against virtualX/Y, if they were user-provided. -+ */ -+static DisplayModePtr -+XGICopyModeNLink(ScrnInfoPtr pScrn, DisplayModePtr dest, -+ DisplayModePtr i, DisplayModePtr j, XGIScrn2Rel srel) -+{ -+ XGIPtr pXGI = XGIPTR(pScrn); -+ DisplayModePtr mode; -+ int dx = 0, dy = 0; -+ -+ if (!((mode = xalloc(sizeof(DisplayModeRec))))) -+ return dest; -+ memcpy(mode, i, sizeof(DisplayModeRec)); -+ if (!((mode->Private = xalloc(sizeof(XGIMergedDisplayModeRec))))) { -+ xfree(mode); -+ return dest; -+ } -+ ((XGIMergedDisplayModePtr) mode->Private)->CRT1 = i; -+ ((XGIMergedDisplayModePtr) mode->Private)->CRT2 = j; -+ ((XGIMergedDisplayModePtr) mode->Private)->CRT2Position = srel; -+ mode->PrivSize = 0; -+ -+ switch (srel) { -+ case xgiLeftOf: -+ case xgiRightOf: -+ if (!(pScrn->display->virtualX)) { -+ dx = i->HDisplay + j->HDisplay; -+ } -+ else { -+ dx = min(pScrn->virtualX, i->HDisplay + j->HDisplay); -+ } -+ dx -= mode->HDisplay; -+ if (!(pScrn->display->virtualY)) { -+ dy = max(i->VDisplay, j->VDisplay); -+ } -+ else { -+ dy = min(pScrn->virtualY, max(i->VDisplay, j->VDisplay)); -+ } -+ dy -= mode->VDisplay; -+ break; -+ case xgiAbove: -+ case xgiBelow: -+ if (!(pScrn->display->virtualY)) { -+ dy = i->VDisplay + j->VDisplay; -+ } -+ else { -+ dy = min(pScrn->virtualY, i->VDisplay + j->VDisplay); -+ } -+ dy -= mode->VDisplay; -+ if (!(pScrn->display->virtualX)) { -+ dx = max(i->HDisplay, j->HDisplay); -+ } -+ else { -+ dx = min(pScrn->virtualX, max(i->HDisplay, j->HDisplay)); -+ } -+ dx -= mode->HDisplay; -+ break; -+ case xgiClone: -+ if (!(pScrn->display->virtualX)) { -+ dx = max(i->HDisplay, j->HDisplay); -+ } -+ else { -+ dx = min(pScrn->virtualX, max(i->HDisplay, j->HDisplay)); -+ } -+ dx -= mode->HDisplay; -+ if (!(pScrn->display->virtualY)) { -+ dy = max(i->VDisplay, j->VDisplay); -+ } -+ else { -+ dy = min(pScrn->virtualY, max(i->VDisplay, j->VDisplay)); -+ } -+ dy -= mode->VDisplay; -+ break; -+ } -+ mode->HDisplay += dx; -+ mode->HSyncStart += dx; -+ mode->HSyncEnd += dx; -+ mode->HTotal += dx; -+ mode->VDisplay += dy; -+ mode->VSyncStart += dy; -+ mode->VSyncEnd += dy; -+ mode->VTotal += dy; -+ mode->Clock = 0; -+ -+ if (((mode->HDisplay * ((pScrn->bitsPerPixel + 7) / 8) * mode->VDisplay) > -+ pXGI->maxxfbmem) || (mode->HDisplay > 4088) -+ || (mode->VDisplay > 4096)) { -+ -+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR, -+ "Skipped %dx%d, not enough video RAM or beyond hardware specs\n", -+ mode->HDisplay, mode->VDisplay); -+ xfree(mode->Private); -+ xfree(mode); -+ -+ return dest; -+ } -+ -+#ifdef XGIXINERAMA -+ if (srel != xgiClone) { -+ pXGI->AtLeastOneNonClone = TRUE; -+ } -+#endif -+ -+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, -+ "Merged %dx%d and %dx%d to %dx%d%s\n", -+ i->HDisplay, i->VDisplay, j->HDisplay, j->VDisplay, -+ mode->HDisplay, mode->VDisplay, -+ (srel == xgiClone) ? " (Clone)" : ""); -+ -+ mode->next = mode; -+ mode->prev = mode; -+ -+ if (dest) { -+ mode->next = dest->next; /* Insert node after "dest" */ -+ dest->next->prev = mode; -+ mode->prev = dest; -+ dest->next = mode; -+ } -+ -+ return mode; -+} -+ -+/* Helper function to find a mode from a given name -+ * (Code base taken from mga driver) -+ */ -+static DisplayModePtr -+XGIGetModeFromName(char *str, DisplayModePtr i) -+{ -+ DisplayModePtr c = i; -+ if (!i) -+ return NULL; -+ do { -+ if (strcmp(str, c->name) == 0) -+ return c; -+ c = c->next; -+ } while (c != i); -+ return NULL; -+} -+ -+static DisplayModePtr -+XGIFindWidestTallestMode(DisplayModePtr i, Bool tallest) -+{ -+ DisplayModePtr c = i, d = NULL; -+ int max = 0; -+ if (!i) -+ return NULL; -+ do { -+ if (tallest) { -+ if (c->VDisplay > max) { -+ max = c->VDisplay; -+ d = c; -+ } -+ } -+ else { -+ if (c->HDisplay > max) { -+ max = c->HDisplay; -+ d = c; -+ } -+ } -+ c = c->next; -+ } while (c != i); -+ return d; -+} -+ -+static DisplayModePtr -+XGIGenerateModeListFromLargestModes(ScrnInfoPtr pScrn, -+ DisplayModePtr i, DisplayModePtr j, -+ XGIScrn2Rel srel) -+{ -+#ifdef XGIXINERAMA -+ XGIPtr pXGI = XGIPTR(pScrn); -+#endif -+ DisplayModePtr mode1 = NULL; -+ DisplayModePtr mode2 = NULL; -+ DisplayModePtr result = NULL; -+ -+#ifdef XGIXINERAMA -+ pXGI->AtLeastOneNonClone = FALSE; -+#endif -+ -+ switch (srel) { -+ case xgiLeftOf: -+ case xgiRightOf: -+ mode1 = XGIFindWidestTallestMode(i, FALSE); -+ mode2 = XGIFindWidestTallestMode(j, FALSE); -+ break; -+ case xgiAbove: -+ case xgiBelow: -+ mode1 = XGIFindWidestTallestMode(i, TRUE); -+ mode2 = XGIFindWidestTallestMode(j, TRUE); -+ break; -+ case xgiClone: -+ mode1 = i; -+ mode2 = j; -+ } -+ -+ if (mode1 && mode2) { -+ return (XGICopyModeNLink(pScrn, result, mode1, mode2, srel)); -+ } -+ else { -+ return NULL; -+ } -+} -+ -+/* Generate the merged-fb mode modelist from metamodes -+ * (Code base taken from mga driver) -+ */ -+static DisplayModePtr -+XGIGenerateModeListFromMetaModes(ScrnInfoPtr pScrn, char *str, -+ DisplayModePtr i, DisplayModePtr j, -+ XGIScrn2Rel srel) -+{ -+#ifdef XGIXINERAMA -+ XGIPtr pXGI = XGIPTR(pScrn); -+#endif -+ char *strmode = str; -+ char modename[256]; -+ Bool gotdash = FALSE; -+ XGIScrn2Rel sr; -+ DisplayModePtr mode1 = NULL; -+ DisplayModePtr mode2 = NULL; -+ DisplayModePtr result = NULL; -+ -+#ifdef XGIXINERAMA -+ pXGI->AtLeastOneNonClone = FALSE; -+#endif -+ -+ do { -+ switch (*str) { -+ case 0: -+ case '-': -+ case ' ': -+ if ((strmode != str)) { -+ -+ strncpy(modename, strmode, str - strmode); -+ modename[str - strmode] = 0; -+ -+ if (gotdash) { -+ if (mode1 == NULL) -+ return NULL; -+ mode2 = XGIGetModeFromName(modename, j); -+ if (!mode2) { -+ xf86DrvMsg(pScrn->scrnIndex, X_WARNING, -+ "Mode \"%s\" is not a supported mode for CRT2\n", -+ modename); -+ xf86DrvMsg(pScrn->scrnIndex, X_WARNING, -+ "Skipping metamode \"%s-%s\".\n", -+ mode1->name, modename); -+ mode1 = NULL; -+ } -+ } -+ else { -+ mode1 = XGIGetModeFromName(modename, i); -+ if (!mode1) { -+ char *tmps = str; -+ xf86DrvMsg(pScrn->scrnIndex, X_WARNING, -+ "Mode \"%s\" is not a supported mode for CRT1\n", -+ modename); -+ gotdash = FALSE; -+ while (*tmps == ' ') -+ tmps++; -+ if (*tmps == '-') { /* skip the next mode */ -+ tmps++; -+ while ((*tmps == ' ') && (*tmps != 0)) -+ tmps++; /* skip spaces */ -+ while ((*tmps != ' ') && (*tmps != '-') -+ && (*tmps != 0)) -+ tmps++; /* skip modename */ -+ strncpy(modename, strmode, tmps - strmode); -+ modename[tmps - strmode] = 0; -+ str = tmps - 1; -+ } -+ xf86DrvMsg(pScrn->scrnIndex, X_WARNING, -+ "Skipping metamode \"%s\".\n", modename); -+ mode1 = NULL; -+ } -+ } -+ gotdash = FALSE; -+ } -+ strmode = str + 1; -+ gotdash |= (*str == '-'); -+ -+ if (*str != 0) -+ break; -+ /* Fall through otherwise */ -+ -+ default: -+ if (!gotdash && mode1) { -+ sr = srel; -+ if (!mode2) { -+ mode2 = XGIGetModeFromName(mode1->name, j); -+ sr = xgiClone; -+ } -+ if (!mode2) { -+ xf86DrvMsg(pScrn->scrnIndex, X_WARNING, -+ "Mode: \"%s\" is not a supported mode for CRT2\n", -+ mode1->name); -+ xf86DrvMsg(pScrn->scrnIndex, X_WARNING, -+ "Skipping metamode \"%s\".\n", modename); -+ mode1 = NULL; -+ } -+ else { -+ result = -+ XGICopyModeNLink(pScrn, result, mode1, mode2, sr); -+ mode1 = NULL; -+ mode2 = NULL; -+ } -+ } -+ break; -+ -+ } -+ -+ } while (*(str++) != 0); -+ -+ return result; -+} -+ -+static DisplayModePtr -+XGIGenerateModeList(ScrnInfoPtr pScrn, char *str, -+ DisplayModePtr i, DisplayModePtr j, XGIScrn2Rel srel) -+{ -+ if (str != NULL) { -+ return (XGIGenerateModeListFromMetaModes(pScrn, str, i, j, srel)); -+ } -+ else { -+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, -+ "No MetaModes given, linking %s modes by default\n", -+ (srel == xgiClone) ? "first" : -+ (((srel == xgiLeftOf) -+ || (srel == xgiRightOf)) ? "widest" : "tallest")); -+ return (XGIGenerateModeListFromLargestModes(pScrn, i, j, srel)); -+ } -+} -+ -+static void -+XGIRecalcDefaultVirtualSize(ScrnInfoPtr pScrn) -+{ -+ DisplayModePtr mode, bmode; -+ int max; -+ static const char *str = "MergedFB: Virtual %s %d\n"; -+ -+ if (!(pScrn->display->virtualX)) { -+ mode = bmode = pScrn->modes; -+ max = 0; -+ do { -+ if (mode->HDisplay > max) -+ max = mode->HDisplay; -+ mode = mode->next; -+ } while (mode != bmode); -+ pScrn->virtualX = max; -+ pScrn->displayWidth = max; -+ xf86DrvMsg(pScrn->scrnIndex, X_PROBED, str, "width", max); -+ } -+ if (!(pScrn->display->virtualY)) { -+ mode = bmode = pScrn->modes; -+ max = 0; -+ do { -+ if (mode->VDisplay > max) -+ max = mode->VDisplay; -+ mode = mode->next; -+ } while (mode != bmode); -+ pScrn->virtualY = max; -+ xf86DrvMsg(pScrn->scrnIndex, X_PROBED, str, "height", max); -+ } -+} -+ -+static void -+XGIMergedFBSetDpi(ScrnInfoPtr pScrn1, ScrnInfoPtr pScrn2, XGIScrn2Rel srel) -+{ -+ XGIPtr pXGI = XGIPTR(pScrn1); -+ MessageType from = X_DEFAULT; -+ xf86MonPtr DDC1 = (xf86MonPtr) (pScrn1->monitor->DDC); -+ xf86MonPtr DDC2 = (xf86MonPtr) (pScrn2->monitor->DDC); -+ int ddcWidthmm = 0, ddcHeightmm = 0; -+ const char *dsstr = "MergedFB: Display dimensions: (%d, %d) mm\n"; -+ -+ /* This sets the DPI for MergedFB mode. The problem is that -+ * this can never be exact, because the output devices may -+ * have different dimensions. This function tries to compromise -+ * through a few assumptions, and it just calculates an average DPI -+ * value for both monitors. -+ */ -+ -+ /* Given DisplaySize should regard BOTH monitors */ -+ pScrn1->widthmm = pScrn1->monitor->widthmm; -+ pScrn1->heightmm = pScrn1->monitor->heightmm; -+ -+ /* Get DDC display size; if only either CRT1 or CRT2 provided these, -+ * assume equal dimensions for both, otherwise add dimensions -+ */ -+ if ((DDC1 && (DDC1->features.hsize > 0 && DDC1->features.vsize > 0)) && -+ (DDC2 && (DDC2->features.hsize > 0 && DDC2->features.vsize > 0))) { -+ ddcWidthmm = max(DDC1->features.hsize, DDC2->features.hsize) * 10; -+ ddcHeightmm = max(DDC1->features.vsize, DDC2->features.vsize) * 10; -+ switch (srel) { -+ case xgiLeftOf: -+ case xgiRightOf: -+ ddcWidthmm = (DDC1->features.hsize + DDC2->features.hsize) * 10; -+ break; -+ case xgiAbove: -+ case xgiBelow: -+ ddcHeightmm = (DDC1->features.vsize + DDC2->features.vsize) * 10; -+ default: -+ break; -+ } -+ } -+ else if (DDC1 && (DDC1->features.hsize > 0 && DDC1->features.vsize > 0)) { -+ ddcWidthmm = DDC1->features.hsize * 10; -+ ddcHeightmm = DDC1->features.vsize * 10; -+ switch (srel) { -+ case xgiLeftOf: -+ case xgiRightOf: -+ ddcWidthmm *= 2; -+ break; -+ case xgiAbove: -+ case xgiBelow: -+ ddcHeightmm *= 2; -+ default: -+ break; -+ } -+ } -+ else if (DDC2 && (DDC2->features.hsize > 0 && DDC2->features.vsize > 0)) { -+ ddcWidthmm = DDC2->features.hsize * 10; -+ ddcHeightmm = DDC2->features.vsize * 10; -+ switch (srel) { -+ case xgiLeftOf: -+ case xgiRightOf: -+ ddcWidthmm *= 2; -+ break; -+ case xgiAbove: -+ case xgiBelow: -+ ddcHeightmm *= 2; -+ default: -+ break; -+ } -+ } -+ -+ if (monitorResolution > 0) { -+ -+ /* Set command line given values (overrules given options) */ -+ pScrn1->xDpi = monitorResolution; -+ pScrn1->yDpi = monitorResolution; -+ from = X_CMDLINE; -+ -+ } -+ else if (pXGI->MergedFBXDPI) { -+ -+ /* Set option-wise given values (overrule DisplaySize) */ -+ pScrn1->xDpi = pXGI->MergedFBXDPI; -+ pScrn1->yDpi = pXGI->MergedFBYDPI; -+ from = X_CONFIG; -+ -+ } -+ else if (pScrn1->widthmm > 0 || pScrn1->heightmm > 0) { -+ -+ /* Set values calculated from given DisplaySize */ -+ from = X_CONFIG; -+ if (pScrn1->widthmm > 0) { -+ pScrn1->xDpi = -+ (int) ((double) pScrn1->virtualX * 25.4 / pScrn1->widthmm); -+ } -+ if (pScrn1->heightmm > 0) { -+ pScrn1->yDpi = -+ (int) ((double) pScrn1->virtualY * 25.4 / pScrn1->heightmm); -+ } -+ xf86DrvMsg(pScrn1->scrnIndex, from, dsstr, pScrn1->widthmm, -+ pScrn1->heightmm); -+ -+ } -+ else if (ddcWidthmm && ddcHeightmm) { -+ -+ /* Set values from DDC-provided display size */ -+ from = X_PROBED; -+ xf86DrvMsg(pScrn1->scrnIndex, from, dsstr, ddcWidthmm, ddcHeightmm); -+ pScrn1->widthmm = ddcWidthmm; -+ pScrn1->heightmm = ddcHeightmm; -+ if (pScrn1->widthmm > 0) { -+ pScrn1->xDpi = -+ (int) ((double) pScrn1->virtualX * 25.4 / pScrn1->widthmm); -+ } -+ if (pScrn1->heightmm > 0) { -+ pScrn1->yDpi = -+ (int) ((double) pScrn1->virtualY * 25.4 / pScrn1->heightmm); -+ } -+ -+ } -+ else { -+ -+ pScrn1->xDpi = pScrn1->yDpi = DEFAULT_DPI; -+ -+ } -+ -+ /* Sanity check */ -+ if (pScrn1->xDpi > 0 && pScrn1->yDpi <= 0) -+ pScrn1->yDpi = pScrn1->xDpi; -+ if (pScrn1->yDpi > 0 && pScrn1->xDpi <= 0) -+ pScrn1->xDpi = pScrn1->yDpi; -+ -+ pScrn2->xDpi = pScrn1->xDpi; -+ pScrn2->yDpi = pScrn1->yDpi; -+ -+ xf86DrvMsg(pScrn1->scrnIndex, from, "MergedFB: DPI set to (%d, %d)\n", -+ pScrn1->xDpi, pScrn1->yDpi); -+} -+ -+static void -+XGIFreeCRT2Structs(XGIPtr pXGI) -+{ -+ if (pXGI->CRT2pScrn) { -+ if (pXGI->CRT2pScrn->modes) { -+ while (pXGI->CRT2pScrn->modes) -+ xf86DeleteMode(&pXGI->CRT2pScrn->modes, -+ pXGI->CRT2pScrn->modes); -+ } -+ if (pXGI->CRT2pScrn->monitor) { -+ if (pXGI->CRT2pScrn->monitor->Modes) { -+ while (pXGI->CRT2pScrn->monitor->Modes) -+ xf86DeleteMode(&pXGI->CRT2pScrn->monitor->Modes, -+ pXGI->CRT2pScrn->monitor->Modes); -+ } -+ if (pXGI->CRT2pScrn->monitor->DDC) -+ xfree(pXGI->CRT2pScrn->monitor->DDC); -+ xfree(pXGI->CRT2pScrn->monitor); -+ } -+ xfree(pXGI->CRT2pScrn); -+ pXGI->CRT2pScrn = NULL; -+ } -+} -+ -+#endif /* End of MergedFB helpers */ -+ -+static xf86MonPtr -+XGIInternalDDC(ScrnInfoPtr pScrn, int crtno) -+{ -+ XGIPtr pXGI = XGIPTR(pScrn); -+ unsigned char buffer[256]; -+ -+ int RealOff; -+ unsigned char *page; -+ -+ xf86MonPtr pMonitor = NULL; -+ xf86Int10InfoPtr pInt = NULL; /* Our int10 */ -+ -+ /*yilin 03/10/2008: set the monitor default size to 310mm x 240mm to fix KDE font too small problem*/ -+ pScrn->monitor->widthmm = 310; -+ pScrn->monitor->heightmm = 240; -+ -+ static char *crtno_means_str[] = { -+ "CRT1", "DVI", "CRT2" -+ }; -+ -+ if (crtno > 2 || crtno < 0) { -+ xf86DrvMsg(pScrn->scrnIndex, X_WARNING, -+ "XGIInternalDDC(): Can not get EDID for crtno = %d,abort.\n", -+ crtno); -+ } -+ else { -+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, -+ "XGIInternalDDC(): getting EDID for %s.\n", -+ crtno_means_str[crtno]); -+ } -+ -+ if (xf86LoadSubModule(pScrn, "int10")) { -+ xf86LoaderReqSymLists(int10Symbols, NULL); -+ pInt = xf86InitInt10(pXGI->pEnt->index); -+ if (pInt == NULL) { -+ xf86DrvMsg(pScrn->scrnIndex, X_WARNING, -+ "XGIInternalDDC(): Can not initialize pInt, abort.\n"); -+ return NULL; -+ } -+ -+ page = xf86Int10AllocPages(pInt, 1, &RealOff); -+ if (page == NULL) { -+ xf86FreeInt10(pInt); -+ xf86DrvMsg(pScrn->scrnIndex, X_WARNING, -+ "XGIInternalDDC(): Can not initialize real mode buffer, abort.\n"); -+ return NULL; -+ } -+ } -+ -+ if (pInt) { -+ pInt->ax = 0x4f15; /* VESA DDC supporting */ -+ pInt->bx = 1; /* get EDID */ -+ pInt->cx = crtno; /* port 0 or 1 for CRT 1 or 2 */ -+ pInt->es = SEG_ADDR(RealOff); -+ pInt->di = SEG_OFF(RealOff); -+ pInt->num = 0x10; -+ xf86ExecX86int10(pInt); -+ -+ PDEBUG3(ErrorF -+ ("ax = %04X bx = %04X cx = %04X dx = %04X si = %04X di = %04X es = %04X\n", -+ pInt->ax, pInt->bx, pInt->cx, pInt->dx, pInt->si, pInt->di, -+ pInt->es)); -+ -+ if ((pInt->ax & 0xff00) == 0) { -+ int i; -+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, -+ "XGIInternalDDC(): VESA get DDC success for CRT %d.\n", -+ crtno + 1); -+ -+ for (i = 0; i < 128; i++) { -+ buffer[i] = page[i]; -+ } -+ -+#ifdef DEBUG5 -+ for (i = 0; i < 128; i += 16) { -+ unsigned j; -+ ErrorF("EDID[%02X]", i); -+ for (j = 0; j < 16; j++) { -+ ErrorF(" %02X", buffer[i + j]); -+ } -+ ErrorF("\n"); -+ } -+#endif /* DEBUG3 */ -+ -+ xf86LoaderReqSymLists(ddcSymbols, NULL); -+ -+ /* Jong 09/04/2007; Alan fixed abnormal EDID data */ -+ /* pMonitor = xf86InterpretEDID(pScrn->scrnIndex, buffer) ; */ -+ if ( (buffer[0]==0) && (buffer[7]==0) ) -+ { -+ for (i=1;i<7;i++) -+ { -+ if (buffer[i]!=0xFF) -+ break; -+ } -+ if (i==7) -+ { -+ pMonitor = xf86InterpretEDID(pScrn->scrnIndex, buffer); -+ } -+ } -+ -+ if (pMonitor == NULL) { -+ xf86DrvMsg(pScrn->scrnIndex, X_WARNING, -+ "CRT%d DDC EDID corrupt\n", crtno + 1); -+ return (NULL); -+ } -+ xf86UnloadSubModule("ddc"); -+ } -+ else { -+ xf86DrvMsg(pScrn->scrnIndex, X_WARNING, -+ "XGIInternalDDC(): VESA get DDC fail for CRT %d.\n", -+ crtno + 1); -+ } -+ -+ xf86Int10FreePages(pInt, page, 1); -+ xf86FreeInt10(pInt); -+ } -+ return pMonitor; -+} -+ -+/* static xf86MonPtr -+XGIDoPrivateDDC(ScrnInfoPtr pScrn, int *crtnum) -+{ -+ XGIPtr pXGI = XGIPTR(pScrn); -+ -+ if(IS_DUAL_HEAD(pXGI)) -+ { -+ if(IS_SECOND_HEAD(pXGI)) -+ { -+ *crtnum = 1; -+ return(XGIInternalDDC(pScrn, 0)); -+ } -+ else -+ { -+ *crtnum = 2; -+ return(XGIInternalDDC(pScrn, 1)); -+ } -+ } -+ else if(pXGI->CRT1off) -+ { -+ *crtnum = 2; -+ return(XGIInternalDDC(pScrn, 1)); -+ } -+ else -+ { -+ *crtnum = 1; -+ return(XGIInternalDDC(pScrn, 0)); -+ } -+} */ -+ -+ -+#ifdef DEBUG5 -+static void -+XGIDumpMonitorInfo(xf86MonPtr pMonitor) -+{ -+ struct detailed_timings *pd_timings; -+ Uchar *pserial; -+ Uchar *pascii_data; -+ Uchar *pname; -+ struct monitor_ranges *pranges; -+ struct std_timings *pstd_t; -+ struct whitePoints *pwp; -+ int i, j; -+ -+ if (pMonitor == NULL) { -+ ErrorF("Monitor is NULL"); -+ return; -+ } -+ -+ ErrorF("pMonitor->scrnIndex = %d\n", pMonitor->scrnIndex); -+ ErrorF -+ ("vendor = %c%c%c%c, prod_id = %x serial = %d week = %d year = %d\n", -+ pMonitor->vendor.name[0], pMonitor->vendor.name[1], -+ pMonitor->vendor.name[2], pMonitor->vendor.name[3], -+ pMonitor->vendor.prod_id, pMonitor->vendor.serial, -+ pMonitor->vendor.week, pMonitor->vendor.year); -+ -+ ErrorF("ver = %d %d\n", pMonitor->ver.version, pMonitor->ver.revision); -+ ErrorF("intput type = %d voltage = %d setup = %d sync = %d\n", -+ pMonitor->features.input_type, -+ pMonitor->features.input_voltage, -+ pMonitor->features.input_setup, pMonitor->features.input_sync); -+ ErrorF("hsize = %d vsize = %d gamma=%8.3f\n", -+ pMonitor->features.hsize, -+ pMonitor->features.vsize, pMonitor->features.gamma); -+ -+ ErrorF("dpms = %d display_type = %d msc = %d\n", -+ pMonitor->features.dpms, -+ pMonitor->features.display_type, pMonitor->features.msc); -+ ErrorF -+ ("redx,redy,greenx,greeny,bluex,bluey,whitex,whitey = %8.3f,%8.3f,%8.3f,%8.3f,%8.3f,%8.3f,%8.3f,%8.3f\n", -+ pMonitor->features.redx, pMonitor->features.redy, -+ pMonitor->features.greenx, pMonitor->features.greeny, -+ pMonitor->features.bluex, pMonitor->features.bluey, -+ pMonitor->features.whitex, pMonitor->features.whitey); -+ -+ ErrorF("established_timings = (t1)%d%d%d%d%d%d%d%d", -+ (pMonitor->timings1.t1 >> 7) & 1, -+ (pMonitor->timings1.t1 >> 6) & 1, -+ (pMonitor->timings1.t1 >> 5) & 1, -+ (pMonitor->timings1.t1 >> 4) & 1, -+ (pMonitor->timings1.t1 >> 3) & 1, -+ (pMonitor->timings1.t1 >> 2) & 1, -+ (pMonitor->timings1.t1 >> 1) & 1, -+ (pMonitor->timings1.t1 >> 0) & 1); -+ ErrorF("(t2) %d%d%d%d%d%d%d%d", -+ (pMonitor->timings1.t1 >> 7) & 1, -+ (pMonitor->timings1.t1 >> 6) & 1, -+ (pMonitor->timings1.t1 >> 5) & 1, -+ (pMonitor->timings1.t1 >> 4) & 1, -+ (pMonitor->timings1.t1 >> 3) & 1, -+ (pMonitor->timings1.t1 >> 2) & 1, -+ (pMonitor->timings1.t1 >> 1) & 1, -+ (pMonitor->timings1.t1 >> 0) & 1); -+ ErrorF("(t_manu)%d%d%d%d%d%d%d%d\n", -+ (pMonitor->timings1.t_manu >> 7) & 1, -+ (pMonitor->timings1.t_manu >> 6) & 1, -+ (pMonitor->timings1.t_manu >> 5) & 1, -+ (pMonitor->timings1.t_manu >> 4) & 1, -+ (pMonitor->timings1.t_manu >> 3) & 1, -+ (pMonitor->timings1.t_manu >> 2) & 1, -+ (pMonitor->timings1.t_manu >> 1) & 1, -+ (pMonitor->timings1.t_manu >> 0) & 1); -+ -+ for (i = 0; i < 7; i++) { -+ ErrorF -+ ("std timing %d: hsize = %d, vsize = %d, refresh = %d, id = %d\n", -+ i, pMonitor->timings2[i].hsize, pMonitor->timings2[i].vsize, -+ pMonitor->timings2[i].refresh, pMonitor->timings2[i].id); -+ } -+ -+ for (i = 0; i < 4; i++) { -+ ErrorF("Detail timing section %d\n", i); -+ ErrorF("type = %x\n", pMonitor->det_mon[i].type); -+ switch (pMonitor->det_mon[i].type) { -+ case DS_SERIAL: -+ ErrorF("type = %x DS_SERIAL = %x\n", pMonitor->det_mon[i].type, -+ DS_SERIAL); -+ break; -+ case DS_ASCII_STR: -+ ErrorF("type = %x DS_ASCII_STR = %x\n", pMonitor->det_mon[i].type, -+ DS_ASCII_STR); -+ break; -+ case DS_NAME: -+ ErrorF("type = %x DS_NAME = %x\n", pMonitor->det_mon[i].type, -+ DS_NAME); -+ break; -+ case DS_RANGES: -+ ErrorF("type = %x DS_RANGES = %x\n", pMonitor->det_mon[i].type, -+ DS_RANGES); -+ break; -+ case DS_WHITE_P: -+ ErrorF("type = %x DS_WHITE_P = %x\n", pMonitor->det_mon[i].type, -+ DS_WHITE_P); -+ break; -+ case DS_STD_TIMINGS: -+ ErrorF("type = %x DS_STD_TIMINGS = %x\n", -+ pMonitor->det_mon[i].type, DS_STD_TIMINGS); -+ break; -+ } -+ switch (pMonitor->det_mon[i].type) { -+ case DS_SERIAL: -+ pserial = pMonitor->det_mon[i].section.serial; -+ ErrorF("seial: "); -+ for (j = 0; j < 13; j++) { -+ ErrorF("%02X", pserial[j]); -+ } -+ ErrorF("\n"); -+ break; -+ case DS_ASCII_STR: -+ pascii_data = pMonitor->det_mon[i].section.ascii_data; -+ ErrorF("ascii: "); -+ for (j = 0; j < 13; j++) { -+ ErrorF("%c", pascii_data[j]); -+ } -+ ErrorF("\n"); -+ break; -+ case DS_NAME: -+ pname = pMonitor->det_mon[i].section.name; -+ ErrorF("name: "); -+ for (j = 0; j < 13; j++) { -+ ErrorF("%c", pname[j]); -+ } -+ ErrorF("\n"); -+ break; -+ case DS_RANGES: -+ pranges = &(pMonitor->det_mon[i].section.ranges); -+ ErrorF -+ ("min_v = %d max_v = %d min_h = %d max_h = %d max_clock = %d\n", -+ pranges->min_v, pranges->max_v, pranges->min_h, -+ pranges->max_h, pranges->max_clock); -+ break; -+ case DS_WHITE_P: -+ pwp = pMonitor->det_mon[i].section.wp; -+ for (j = 0; j < 2; j++) { -+ ErrorF -+ ("wp[%d].index = %d white_x = %8.3f white_y = %8.3f white_gamma = %8.3f\n", -+ j, pwp[j].index, pwp[j].white_x, pwp[j].white_y, -+ pwp[j].white_gamma); -+ } -+ break; -+ case DS_STD_TIMINGS: -+ pstd_t = pMonitor->det_mon[i].section.std_t; -+ for (j = 0; j < 5; j++) { -+ ErrorF -+ ("std_t[%d] hsize = %d vsize = %d refresh = %d id = %d\n", -+ j, pstd_t[j].hsize, pstd_t[j].vsize, pstd_t[j].refresh, -+ pstd_t[j].id); -+ } -+ break; -+ case DT: -+ -+ pd_timings = &pMonitor->det_mon[i].section.d_timings; -+ ErrorF("Detail Timing Descriptor\n"); -+ ErrorF("clock = %d\n", pd_timings->clock); -+ ErrorF("h_active = %d\n", pd_timings->h_active); -+ ErrorF("h_blanking = %d\n", pd_timings->h_blanking); -+ ErrorF("v_active = %d\n", pd_timings->v_active); -+ ErrorF("v_blanking = %d\n", pd_timings->v_blanking); -+ ErrorF("h_sync_off = %d\n", pd_timings->h_sync_off); -+ ErrorF("h_sync_width = %d\n", pd_timings->h_sync_width); -+ ErrorF("v_sync_off = %d\n", pd_timings->v_sync_off); -+ ErrorF("v_sync_width = %d\n", pd_timings->v_sync_width); -+ ErrorF("h_size = %d\n", pd_timings->h_size); -+ ErrorF("v_size = %d\n", pd_timings->v_size); -+ ErrorF("h_border = %d\n", pd_timings->h_border); -+ ErrorF("v_border = %d\n", pd_timings->v_border); -+ ErrorF("interlaced = %d stereo = %x sync = %x misc = %x\n", -+ pd_timings->interlaced, -+ pd_timings->stereo, pd_timings->sync, pd_timings->misc); -+ break; -+ } -+ } -+ -+ for (i = 0; i < 128; i += 16) { -+ ErrorF("rawData[%02X]:", i); -+ for (j = 0; j < 16; j++) { -+ ErrorF(" %02X", pMonitor->rawData[i + j]); -+ } -+ ErrorF("\n"); -+ } -+} -+#endif -+ -+static void -+XGIGetMonitorRangeByDDC(MonitorRangePtr range, xf86MonPtr pMonitor) -+{ -+ int i, j; -+ float VF, HF; -+ struct detailed_timings *pd_timings; -+ struct monitor_ranges *pranges; -+ struct std_timings *pstd_t; -+ -+ if ((range == NULL) || (pMonitor == NULL)) { -+ return; /* ignore */ -+ } -+ -+ PDEBUG5(ErrorF -+ ("establish timing t1 = %02x t2=%02x\n", pMonitor->timings1.t1, -+ pMonitor->timings1.t2)); -+ -+ for (i = 0, j = 0; i < 8; i++, j++) -+ { -+ if (establish_timing[j].width == -1) { -+ continue; -+ } -+ -+ if (pMonitor->timings1.t1 & (1 << i)) -+ { -+ PDEBUG5(ErrorF("Support %dx%d@%4.1fHz Hseq = %8.3fKHz\n", -+ establish_timing[j].width, -+ establish_timing[j].height, -+ establish_timing[j].VRefresh, -+ establish_timing[j].HSync)); -+ -+ if (range->loH > establish_timing[j].HSync) { -+ range->loH = establish_timing[j].HSync; -+ } -+ -+ if (range->hiH < establish_timing[j].HSync) { -+ range->hiH = establish_timing[j].HSync; -+ } -+ -+ if (range->loV > establish_timing[j].VRefresh) { -+ range->loV = establish_timing[j].VRefresh; -+ } -+ -+ if (range->hiV < establish_timing[j].VRefresh) { -+ range->hiV = establish_timing[j].VRefresh; -+ } -+ } -+ } -+ -+ PDEBUG5(ErrorF -+ ("check establish timing t1:range ( %8.3f %8.3f %8.3f %8.3f )\n", -+ range->loH, range->loV, range->hiH, range->hiV)); -+ -+ for (i = 0; i < 8; i++, j++) { -+ if (establish_timing[j].width == -1) { -+ continue; -+ } -+ -+ if (pMonitor->timings1.t2 & (1 << i)) { -+ PDEBUG5(ErrorF("Support %dx%d@%4.1fHz Hseq = %8.3fKHz\n", -+ establish_timing[j].width, -+ establish_timing[j].height, -+ establish_timing[j].VRefresh, -+ establish_timing[j].HSync)); -+ -+ if (range->loH > establish_timing[j].HSync) { -+ range->loH = establish_timing[j].HSync; -+ } -+ -+ if (range->hiH < establish_timing[j].HSync) { -+ range->hiH = establish_timing[j].HSync; -+ } -+ -+ if (range->loV > establish_timing[j].VRefresh) { -+ range->loV = establish_timing[j].VRefresh; -+ } -+ -+ if (range->hiV < establish_timing[j].VRefresh) { -+ range->hiV = establish_timing[j].VRefresh; -+ } -+ } -+ } -+ PDEBUG5(ErrorF -+ ("check establish timing t2:range ( %8.3f %8.3f %8.3f %8.3f )\n", -+ range->loH, range->loV, range->hiH, range->hiV)); -+ -+ for (i = 0; i < 8; i++) { -+ for (j = 0; StdTiming[j].width != -1; j++) { -+ if ((StdTiming[j].width == pMonitor->timings2[i].hsize) && -+ (StdTiming[j].height == pMonitor->timings2[i].vsize) && -+ (StdTiming[j].VRefresh == pMonitor->timings2[i].refresh)) { -+ PDEBUG5(ErrorF("pMonitor->timings2[%d]= %d %d %d %d\n", -+ i, -+ pMonitor->timings2[i].hsize, -+ pMonitor->timings2[i].vsize, -+ pMonitor->timings2[i].refresh, -+ pMonitor->timings2[i].id)); -+ HF = StdTiming[j].HSync; -+ VF = StdTiming[j].VRefresh; -+ if (range->loH > HF) -+ range->loH = HF; -+ if (range->loV > VF) -+ range->loV = VF; -+ if (range->hiH < HF) -+ range->hiH = HF; -+ if (range->hiV < VF) -+ range->hiV = VF; -+ break; -+ } -+ } -+ } -+ PDEBUG5(ErrorF -+ ("check standard timing :range ( %8.3f %8.3f %8.3f %8.3f )\n", -+ range->loH, range->loV, range->hiH, range->hiV)); -+ -+ for (i = 0; i < 4; i++) { -+ switch (pMonitor->det_mon[i].type) { -+ case DS_RANGES: -+ pranges = &(pMonitor->det_mon[i].section.ranges); -+ PDEBUG5(ErrorF -+ ("min_v = %d max_v = %d min_h = %d max_h = %d max_clock = %d\n", -+ pranges->min_v, pranges->max_v, pranges->min_h, -+ pranges->max_h, pranges->max_clock)); -+ -+ if (range->loH > pranges->min_h) -+ range->loH = pranges->min_h; -+ if (range->loV > pranges->min_v) -+ range->loV = pranges->min_v; -+ if (range->hiH < pranges->max_h) -+ range->hiH = pranges->max_h; -+ if (range->hiV < pranges->max_v) -+ range->hiV = pranges->max_v; -+ PDEBUG5(ErrorF -+ ("range(%8.3f %8.3f %8.3f %8.3f)\n", range->loH, -+ range->loV, range->hiH, range->hiV)); -+ break; -+ -+ case DS_STD_TIMINGS: -+ pstd_t = pMonitor->det_mon[i].section.std_t; -+ for (j = 0; j < 5; j++) { -+ int k; -+ PDEBUG5(ErrorF -+ ("std_t[%d] hsize = %d vsize = %d refresh = %d id = %d\n", -+ j, pstd_t[j].hsize, pstd_t[j].vsize, -+ pstd_t[j].refresh, pstd_t[j].id)); -+ for (k = 0; StdTiming[k].width != -1; k++) { -+ if ((StdTiming[k].width == pstd_t[j].hsize) && -+ (StdTiming[k].height == pstd_t[j].vsize) && -+ (StdTiming[k].VRefresh == pstd_t[j].refresh)) { -+ if (range->loH > StdTiming[k].HSync) -+ range->loH = StdTiming[k].HSync; -+ if (range->hiH < StdTiming[k].HSync) -+ range->hiH = StdTiming[k].HSync; -+ if (range->loV > StdTiming[k].VRefresh) -+ range->loV = StdTiming[k].VRefresh; -+ if (range->hiV < StdTiming[k].VRefresh) -+ range->hiV = StdTiming[k].VRefresh; -+ break; -+ } -+ -+ } -+ } -+ break; -+ -+ case DT: -+ -+ pd_timings = &pMonitor->det_mon[i].section.d_timings; -+ -+ HF = pd_timings->clock / (pd_timings->h_active + -+ pd_timings->h_blanking); -+ VF = HF / (pd_timings->v_active + pd_timings->v_blanking); -+ HF /= 1000; /* into KHz Domain */ -+ if (range->loH > HF) -+ range->loH = HF; -+ if (range->hiH < HF) -+ range->hiH = HF; -+ if (range->loV > VF) -+ range->loV = VF; -+ if (range->hiV < VF) -+ range->hiV = VF; -+ PDEBUG(ErrorF -+ ("Detailing Timing: HF = %f VF = %f range (%8.3f %8.3f %8.3f %8.3f)\n", -+ HF, VF, range->loH, range->loV, range->hiH, range->hiV)); -+ break; -+ } -+ } -+ PDEBUG5(ErrorF -+ ("Done range(%8.3f %8.3f %8.3f %8.3f)\n", range->loH, range->loV, -+ range->hiH, range->hiV)); -+ -+} -+ -+static void -+XGISyncDDCMonitorRange(MonPtr monitor, MonitorRangePtr range) -+{ -+ int i; -+ if ((monitor == NULL) || (range == NULL)) { -+ return; -+ } -+ -+ for (i = 0; i < monitor->nHsync; i++) { -+ monitor->hsync[i].lo = range->loH; -+ monitor->hsync[i].hi = range->hiH; -+ } -+ -+ for (i = 0; i < monitor->nVrefresh; i++) { -+ monitor->vrefresh[i].lo = range->loV; -+ monitor->vrefresh[i].hi = range->hiV; -+ } -+} -+ -+static void -+XGIDDCPreInit(ScrnInfoPtr pScrn) -+{ -+ -+ XGIPtr pXGI = XGIPTR(pScrn); -+ xf86MonPtr pMonitor = NULL; -+ xf86MonPtr pMonitorDVI = NULL; -+ Bool didddc2; -+ -+ static const char *ddcsstr = -+ "CRT%d DDC monitor info: ************************************\n"; -+ static const char *ddcestr = -+ "End of CRT%d DDC monitor info ******************************\n"; -+ -+ /* Now for something completely different: DDC. -+ * For 300 and 315/330 series, we provide our -+ * own functions (in order to probe CRT2 as well) -+ * If these fail, use the VBE. -+ * All other chipsets will use VBE. No need to re-invent -+ * the wheel there. -+ */ -+ -+ pXGI->pVbe = NULL; -+ didddc2 = FALSE; -+ -+ /* In dual head mode, probe DDC using VBE only for CRT1 (second head) */ -+ if (IS_DUAL_HEAD(pXGI) && (!didddc2) && !IS_SECOND_HEAD(pXGI)) -+ didddc2 = TRUE; -+ -+ if (!didddc2) { -+ /* If CRT1 is off or LCDA, skip DDC via VBE */ -+ if ((pXGI->CRT1off) || (pXGI->VBFlags & CRT1_LCDA)) -+ didddc2 = TRUE; -+ } -+ -+ /* Now (re-)load and initialize the DDC module */ -+ if (!didddc2) { -+ -+ if (xf86LoadSubModule(pScrn, "ddc")) { -+ -+ xf86LoaderReqSymLists(ddcSymbols, NULL); -+ -+ pMonitor = XGIInternalDDC(pScrn, 0); -+ if (pMonitor == NULL) { -+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, -+ "Could not retrieve DDC data\n"); -+ } -+ -+ if (pXGI->xgi_HwDevExt.jChipType == XG21) { -+ PDEBUG(ErrorF("Getting XG21 DVI EDID...\n")); -+ pMonitorDVI = XGIInternalDDC(pScrn, 1); -+ if (pMonitorDVI == NULL) { -+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, -+ "Could not retrieve DVI DDC data\n"); -+ } -+ else /* Jong 12/04/2007; used for filtering of CRT1 modes */ -+ g_pMonitorDVI=pMonitorDVI; -+ -+ if ((pMonitor == NULL) && (pMonitorDVI != NULL)) { -+ pMonitor = pMonitorDVI; -+ } -+ } -+ -+ } -+ } -+ -+ /* initialize */ -+ -+ if (pMonitor) { -+ pXGI->CRT1Range.loH = 1000; -+ pXGI->CRT1Range.loV = 1000; -+ pXGI->CRT1Range.hiH = 0; -+ pXGI->CRT1Range.hiV = 0; -+ XGIGetMonitorRangeByDDC(&(pXGI->CRT1Range), pMonitor); -+ } -+ else { -+ pXGI->CRT1Range.loH = 0; -+ pXGI->CRT1Range.loV = 0; -+ pXGI->CRT1Range.hiH = 1000; -+ pXGI->CRT1Range.hiV = 1000; -+ } -+ -+ if (pMonitorDVI) { -+ pXGI->CRT2Range.loV = 1000; -+ pXGI->CRT2Range.loH = 1000; -+ pXGI->CRT2Range.hiH = 0; -+ pXGI->CRT2Range.hiV = 0; -+ XGIGetMonitorRangeByDDC(&(pXGI->CRT2Range), pMonitorDVI); -+ } -+ else { -+ pXGI->CRT2Range.loH = 0; -+ pXGI->CRT2Range.loV = 0; -+ pXGI->CRT2Range.hiH = 1000; -+ pXGI->CRT2Range.hiV = 1000; -+ } -+ -+ if (pXGI->xgi_HwDevExt.jChipType == XG21) { -+ /* Mode range intersecting */ -+ if (pXGI->CRT1Range.loH < pXGI->CRT2Range.loH) { -+ pXGI->CRT1Range.loH = pXGI->CRT2Range.loH; -+ } -+ if (pXGI->CRT1Range.loV < pXGI->CRT2Range.loV) { -+ pXGI->CRT1Range.loV = pXGI->CRT2Range.loV; -+ } -+ if (pXGI->CRT1Range.hiH > pXGI->CRT2Range.hiH) { -+ pXGI->CRT1Range.hiH = pXGI->CRT2Range.hiH; -+ } -+ if (pXGI->CRT1Range.hiV > pXGI->CRT2Range.hiV) { -+ pXGI->CRT1Range.hiV = pXGI->CRT2Range.hiV; -+ } -+ } -+ -+ if (pMonitor) { -+ XGISyncDDCMonitorRange(pScrn->monitor, &pXGI->CRT1Range); -+ } -+ -+ if (pScrn->monitor) { -+ pScrn->monitor->DDC = pMonitor; -+ } -+ -+ return; -+ -+#ifdef XGIMERGED -+ if (pXGI->MergedFB) { -+ pXGI->CRT2pScrn->monitor = xalloc(sizeof(MonRec)); -+ if (pXGI->CRT2pScrn->monitor) { -+ DisplayModePtr tempm = NULL, currentm = NULL, newm = NULL; -+ memcpy(pXGI->CRT2pScrn->monitor, pScrn->monitor, sizeof(MonRec)); -+ pXGI->CRT2pScrn->monitor->DDC = NULL; -+ pXGI->CRT2pScrn->monitor->Modes = NULL; -+ tempm = pScrn->monitor->Modes; -+ while (tempm) { -+ if (!(newm = xalloc(sizeof(DisplayModeRec)))) -+ break; -+ memcpy(newm, tempm, sizeof(DisplayModeRec)); -+ if (!(newm->name = xalloc(strlen(tempm->name) + 1))) { -+ xfree(newm); -+ break; -+ } -+ strcpy(newm->name, tempm->name); -+ if (!pXGI->CRT2pScrn->monitor->Modes) -+ pXGI->CRT2pScrn->monitor->Modes = newm; -+ if (currentm) { -+ currentm->next = newm; -+ newm->prev = currentm; -+ } -+ currentm = newm; -+ tempm = tempm->next; -+ } -+ -+ if ((pMonitor = XGIInternalDDC(pXGI->CRT2pScrn, 1))) { -+ xf86DrvMsg(pScrn->scrnIndex, X_PROBED, ddcsstr, 2); -+ xf86PrintEDID(pMonitor); -+ xf86DrvMsg(pScrn->scrnIndex, X_PROBED, ddcestr, 2); -+ xf86SetDDCproperties(pXGI->CRT2pScrn, pMonitor); -+ -+ pXGI->CRT2pScrn->monitor->DDC = pMonitor; -+ -+ /* use DDC data if no ranges in config file */ -+ if (!pXGI->CRT2HSync) { -+ pXGI->CRT2pScrn->monitor->nHsync = 0; -+ } -+ if (!pXGI->CRT2VRefresh) { -+ pXGI->CRT2pScrn->monitor->nVrefresh = 0; -+ } -+ } -+ else { -+ xf86DrvMsg(pScrn->scrnIndex, X_PROBED, -+ "Failed to read DDC data for CRT2\n"); -+ } -+ } -+ else { -+ XGIErrorLog(pScrn, -+ "Failed to allocate memory for CRT2 monitor, %s.\n", -+ mergeddisstr); -+ if (pXGI->CRT2pScrn) -+ xfree(pXGI->CRT2pScrn); -+ pXGI->CRT2pScrn = NULL; -+ pXGI->MergedFB = FALSE; -+ } -+ } -+#endif -+ -+#ifdef XGIMERGED -+ if (pXGI->MergedFB) { -+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, crtsetupstr, 1); -+ } -+#endif -+ -+ /* end of DDC */ -+} -+ -+#ifdef DEBUG5 -+static void -+XGIDumpModePtr(DisplayModePtr mode) -+{ -+ if (mode == NULL) -+ return; -+ -+ ErrorF("Dump DisplayModePtr mode\n"); -+ ErrorF("name = %s\n", mode->name); -+ /* ModeStatus status; */ -+ ErrorF("type = %d\n", mode->type); -+ ErrorF("Clock = %d\n", mode->Clock); -+ ErrorF("HDisplay = %d\n", mode->HDisplay); -+ ErrorF("HSyncStart = %d\n", mode->HSyncStart); -+ ErrorF("HSyncEnd = %d\n", mode->HSyncEnd); -+ ErrorF("HTotal = %d\n", mode->HTotal); -+ ErrorF("HSkew = %d\n", mode->HSkew); -+ ErrorF("VDisplay = %d\n", mode->VDisplay); -+ ErrorF("VSyncStart = %d\n", mode->VSyncStart); -+ ErrorF("VSyncEnd = %d\n", mode->VSyncEnd); -+ ErrorF("VTotal = %d\n", mode->VTotal); -+ ErrorF("VScan = %d\n", mode->VScan); -+ ErrorF("Flags = %d\n", mode->Flags); -+ -+ -+ ErrorF("ClockIndex = %d\n", mode->ClockIndex); -+ ErrorF("SynthClock = %d\n", mode->SynthClock); -+ ErrorF("CrtcHDisplay = %d\n", mode->CrtcHDisplay); -+ ErrorF("CrtcHBlankStart = %d\n", mode->CrtcHBlankStart); -+ ErrorF("CrtcHSyncStart = %d\n", mode->CrtcHSyncStart); -+ ErrorF("CrtcHSyncEnd = %d\n", mode->CrtcHSyncEnd); -+ ErrorF("CrtcHBlankEnd = %d\n", mode->CrtcHBlankEnd); -+ ErrorF("CrtcHTotal = %d\n", mode->CrtcHTotal); -+ ErrorF("CrtcHSkew = %d\n", mode->CrtcHSkew); -+ ErrorF("CrtcVDisplay = %d\n", mode->CrtcVDisplay); -+ ErrorF("CrtcVBlankStart = %d\n", mode->CrtcVBlankStart); -+ ErrorF("CrtcVSyncStart = %d\n", mode->CrtcVSyncStart); -+ ErrorF("CrtcVSyncEnd = %d\n", mode->CrtcVSyncEnd); -+ ErrorF("CrtcVBlankEnd = %d\n", mode->CrtcVBlankEnd); -+ ErrorF("CrtcVTotal = %d\n", mode->CrtcVTotal); -+ ErrorF("CrtcHAdjusted = %s\n", (mode->CrtcHAdjusted) ? "TRUE" : "FALSE"); -+ ErrorF("CrtcVAdjusted = %s\n", (mode->CrtcVAdjusted) ? "TRUE" : "FALSE"); -+ ErrorF("PrivSize = %d\n", mode->PrivSize); -+ /* INT32 * Private; */ -+ ErrorF("PrivFlags = %d\n", mode->PrivFlags); -+ ErrorF("HSync = %8.3f\n", mode->HSync); -+ ErrorF("VRefresh = %8.3f\n", mode->VRefresh); -+} -+#endif -+ -+static void -+XGIDumpMonPtr(MonPtr pMonitor) -+{ -+#ifdef DEBUG5 -+ int i; -+# if 0 -+ DisplayModePtr mode; -+#endif -+ -+ ErrorF("XGIDumpMonPtr() ... \n"); -+ if (pMonitor == NULL) { -+ ErrorF("pMonitor is NULL\n"); -+ } -+ -+ ErrorF("id = %s, vendor = %s model = %s\n", -+ pMonitor->id, pMonitor->vendor, pMonitor->model); -+ ErrorF("nHsync = %d\n", pMonitor->nHsync); -+ ErrorF("nVrefresh = %d\n", pMonitor->nVrefresh); -+ -+ for (i = 0; i < MAX_HSYNC; i++) { -+ ErrorF("hsync[%d] = (%8.3f,%8.3f)\n", i, pMonitor->hsync[i].lo, -+ pMonitor->hsync[i].hi); -+ } -+ -+ for (i = 0; i < MAX_VREFRESH; i++) { -+ ErrorF("vrefresh[%d] = (%8.3f,%8.3f)\n", i, pMonitor->vrefresh[i].lo, -+ pMonitor->vrefresh[i].hi); -+ } -+ -+ ErrorF("widthmm = %d, heightmm = %d\n", -+ pMonitor->widthmm, pMonitor->heightmm); -+ ErrorF("options = %p, DDC = %p\n", pMonitor->options, pMonitor->DDC); -+# if 0 -+ mode = pMonitor->Modes; -+ while (1) { -+ XGIDumpModePtr(mode); -+ if (mode == pMonitor->Last) { -+ break; -+ } -+ mode = mode->next; -+ } -+# endif -+#endif /* DEBUG5 */ -+} -+ -+/* Jong 09/19/2007; support modeline of custom modes */ -+int ModifyTypeOfSupportMode(DisplayModePtr availModes) -+{ -+ int CountOfModifiedModes=0; -+ DisplayModePtr p=availModes; -+ -+ while(p) -+ { -+ /* if( (p->HDisplay == 1440) && (p->VDisplay == 900)) */ -+ if( p->type == 0) /* externel support modeline */ -+ { -+ p->type = M_T_USERDEF; -+ CountOfModifiedModes++; -+ } -+ -+ p=p->next; -+ } -+ -+ return(CountOfModifiedModes); -+} -+ -+ -+/* Mandatory */ -+static Bool -+XGIPreInit(ScrnInfoPtr pScrn, int flags) -+{ -+ XGIPtr pXGI; -+ MessageType from; -+ unsigned long int i; -+ int temp; -+ ClockRangePtr clockRanges; -+ int pix24flags; -+ int fd; -+ struct fb_fix_screeninfo fix; -+ XGIEntPtr pXGIEnt = NULL; -+ size_t memreq; -+ -+#if defined(XGIMERGED) || defined(XGIDUALHEAD) -+ DisplayModePtr first, p, n; -+#endif -+ unsigned char srlockReg, crlockReg; -+ vbeInfoPtr pVbe; -+ -+ /****************** Code Start ***********************/ -+ -+ ErrorF("XGIPreInit\n"); -+ -+ if (flags & PROBE_DETECT) { -+ if (xf86LoadSubModule(pScrn, "vbe")) { -+ int index = xf86GetEntityInfo(pScrn->entityList[0])->index; -+ -+ if ((pVbe = VBEExtendedInit(NULL, index, 0))) { -+ ConfiguredMonitor = vbeDoEDID(pVbe, NULL); -+ vbeFree(pVbe); -+ } -+ } -+ return TRUE; -+ } -+ -+ /* -+ * Note: This function is only called once at server startup, and -+ * not at the start of each server generation. This means that -+ * only things that are persistent across server generations can -+ * be initialised here. xf86Screens[] is the array of all screens, -+ * (pScrn is a pointer to one of these). Privates allocated using -+ * xf86AllocateScrnInfoPrivateIndex() are too, and should be used -+ * for data that must persist across server generations. -+ * -+ * Per-generation data should be allocated with -+ * AllocateScreenPrivateIndex() from the ScreenInit() function. -+ */ -+ -+ /* Check the number of entities, and fail if it isn't one. */ -+ if (pScrn->numEntities != 1) { -+ XGIErrorLog(pScrn, "Number of entities is not 1\n"); -+ return FALSE; -+ } -+ -+ /* The vgahw module should be loaded here when needed */ -+ if (!xf86LoadSubModule(pScrn, "vgahw")) { -+ XGIErrorLog(pScrn, "Could not load vgahw module\n"); -+ return FALSE; -+ } -+ -+ xf86LoaderReqSymLists(vgahwSymbols, NULL); -+ -+ /* Due to the liberal license terms this is needed for -+ * keeping the copyright notice readable and intact in -+ * binary distributions. Removing this is a copyright -+ * infringement. Please read the license terms above. -+ */ -+ -+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, -+ "XGI driver (%s)\n", XGI_RELEASE_DATE); -+ -+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, -+ "Copyright (C) 2001-2004 Thomas Winischhofer and others\n"); -+ -+ /* Allocate a vgaHWRec */ -+ if (!vgaHWGetHWRec(pScrn)) { -+ XGIErrorLog(pScrn, "Could not allocate VGA private\n"); -+ return FALSE; -+ } -+ -+ /* Allocate the XGIRec driverPrivate */ -+ pXGI = XGIGetRec(pScrn); -+ if (pXGI == NULL) { -+ XGIErrorLog(pScrn, "Could not allocate memory for pXGI private\n"); -+ return FALSE; -+ } -+ -+ pXGI->IODBase = pScrn->domainIOBase; -+ -+ -+ /* Get the entity, and make sure it is PCI. */ -+ pXGI->pEnt = xf86GetEntityInfo(pScrn->entityList[0]); -+ if (pXGI->pEnt->location.type != BUS_PCI) { -+ XGIErrorLog(pScrn, "Entity's bus type is not PCI\n"); -+ XGIFreeRec(pScrn); -+ return FALSE; -+ } -+ -+#ifdef XGIDUALHEAD -+ /* Allocate an entity private if necessary */ -+ if (xf86IsEntityShared(pScrn->entityList[0])) { -+ pXGIEnt = xf86GetEntityPrivate(pScrn->entityList[0], -+ XGIEntityIndex)->ptr; -+ pXGI->entityPrivate = pXGIEnt; -+ -+ /* If something went wrong, quit here */ -+ if ((pXGIEnt->DisableDual) || (pXGIEnt->ErrorAfterFirst)) { -+ XGIErrorLog(pScrn, -+ "First head encountered fatal error, can't continue\n"); -+ XGIFreeRec(pScrn); -+ return FALSE; -+ } -+ } -+#endif -+ -+ /* Find the PCI info for this screen */ -+#ifndef XSERVER_LIBPCIACCESS -+ pXGI->PciInfo = xf86GetPciInfoForEntity(pXGI->pEnt->index); -+ pXGI->PciTag = pciTag(pXGI->PciInfo->bus, pXGI->PciInfo->device, -+ pXGI->PciInfo->func); -+#endif -+ -+ pXGI->Primary = xf86IsPrimaryPci(pXGI->PciInfo); -+ xf86DrvMsg(pScrn->scrnIndex, X_PROBED, -+ "This adapter is %s display adapter\n", -+ (pXGI->Primary ? "primary" : "secondary")); -+ -+ if (pXGI->Primary) { -+ VGAHWPTR(pScrn)->MapSize = 0x10000; /* Standard 64k VGA window */ -+ if (!vgaHWMapMem(pScrn)) { -+ XGIErrorLog(pScrn, "Could not map VGA memory\n"); -+ XGIFreeRec(pScrn); -+ return FALSE; -+ } -+ } -+ vgaHWGetIOBase(VGAHWPTR(pScrn)); -+ -+ /* We "patch" the PIOOffset inside vgaHW in order to force -+ * the vgaHW module to use our relocated i/o ports. -+ */ -+ VGAHWPTR(pScrn)->PIOOffset = pXGI->IODBase - 0x380 + -+#ifdef XSERVER_LIBPCIACCESS -+ (pXGI->PciInfo->regions[2].base_addr & 0xFFFC) -+#else -+ (pXGI->PciInfo->ioBase[2] & 0xFFFC) -+#endif -+ ; -+ -+ pXGI->pInt = NULL; -+ if (!pXGI->Primary) { -+#if !defined(__alpha__) -+#if !defined(__powerpc__) -+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, -+ "Initializing display adapter through int10\n"); -+ -+ if (xf86LoadSubModule(pScrn, "int10")) { -+ xf86LoaderReqSymLists(int10Symbols, NULL); -+ pXGI->pInt = xf86InitInt10(pXGI->pEnt->index); -+ } -+ else { -+ XGIErrorLog(pScrn, "Could not load int10 module\n"); -+ } -+#endif /* !defined(__powerpc__) */ -+#endif /* !defined(__alpha__) */ -+ } -+ -+ xf86SetOperatingState(resVgaMem, pXGI->pEnt->index, ResUnusedOpr); -+ -+ /* Operations for which memory access is required */ -+ pScrn->racMemFlags = RAC_FB | RAC_COLORMAP | RAC_CURSOR | RAC_VIEWPORT; -+ /* Operations for which I/O access is required */ -+ pScrn->racIoFlags = RAC_COLORMAP | RAC_CURSOR | RAC_VIEWPORT; -+ -+ /* The ramdac module should be loaded here when needed */ -+ if (!xf86LoadSubModule(pScrn, "ramdac")) { -+ XGIErrorLog(pScrn, "Could not load ramdac module\n"); -+ -+ if (pXGIEnt) -+ pXGIEnt->ErrorAfterFirst = TRUE; -+ -+ if (pXGI->pInt) -+ xf86FreeInt10(pXGI->pInt); -+ XGIFreeRec(pScrn); -+ return FALSE; -+ } -+ -+ xf86LoaderReqSymLists(ramdacSymbols, NULL); -+ -+ /* Set pScrn->monitor */ -+ pScrn->monitor = pScrn->confScreen->monitor; -+ -+ /* Jong 09/19/2007; modify type of support modes to M_T_USERDEF */ -+ g_CountOfUserDefinedModes=ModifyTypeOfSupportMode(pScrn->monitor->Modes); -+ -+ /* -+ * Set the Chipset and ChipRev, allowing config file entries to -+ * override. DANGEROUS! -+ */ -+ if (pXGI->pEnt->device->chipset && *pXGI->pEnt->device->chipset) { -+ PDEBUG(ErrorF(" --- Chipset 1 \n")); -+ pScrn->chipset = pXGI->pEnt->device->chipset; -+ pXGI->Chipset = xf86StringToToken(XGIChipsets, pScrn->chipset); -+ from = X_CONFIG; -+ } -+ else if (pXGI->pEnt->device->chipID >= 0) { -+ PDEBUG(ErrorF(" --- Chipset 2 \n")); -+ pXGI->Chipset = pXGI->pEnt->device->chipID; -+ pScrn->chipset = -+ (char *) xf86TokenToString(XGIChipsets, pXGI->Chipset); -+ -+ from = X_CONFIG; -+ xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "ChipID override: 0x%04X\n", -+ pXGI->Chipset); -+ } -+ else { -+ PDEBUG(ErrorF(" --- Chipset 3 \n")); -+ from = X_PROBED; -+ pXGI->Chipset = DEVICE_ID(pXGI->PciInfo); -+ pScrn->chipset = -+ (char *) xf86TokenToString(XGIChipsets, pXGI->Chipset); -+ } -+ if (pXGI->pEnt->device->chipRev >= 0) { -+ pXGI->ChipRev = pXGI->pEnt->device->chipRev; -+ xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "ChipRev override: %d\n", -+ pXGI->ChipRev); -+ } -+ else { -+ pXGI->ChipRev = CHIP_REVISION(pXGI->PciInfo); -+ } -+ pXGI->xgi_HwDevExt.jChipRevision = pXGI->ChipRev; -+ -+ PDEBUG(ErrorF(" --- Chipset : %s \n", pScrn->chipset)); -+ -+ -+ /* -+ * This shouldn't happen because such problems should be caught in -+ * XGIProbe(), but check it just in case. -+ */ -+ if (pScrn->chipset == NULL) { -+ XGIErrorLog(pScrn, "ChipID 0x%04X is not recognised\n", -+ pXGI->Chipset); -+ -+ if (pXGIEnt) -+ pXGIEnt->ErrorAfterFirst = TRUE; -+ -+ if (pXGI->pInt) -+ xf86FreeInt10(pXGI->pInt); -+ XGIFreeRec(pScrn); -+ return FALSE; -+ } -+ -+ if (pXGI->Chipset < 0) { -+ XGIErrorLog(pScrn, "Chipset \"%s\" is not recognised\n", -+ pScrn->chipset); -+ -+ if (pXGIEnt) -+ pXGIEnt->ErrorAfterFirst = TRUE; -+ -+ if (pXGI->pInt) -+ xf86FreeInt10(pXGI->pInt); -+ XGIFreeRec(pScrn); -+ return FALSE; -+ } -+ -+ /* Determine chipset and VGA engine type */ -+ pXGI->ChipFlags = 0; -+ pXGI->XGI_SD_Flags = 0; -+ -+ switch (pXGI->Chipset) { -+ case PCI_CHIP_XGIXG40: -+ case PCI_CHIP_XGIXG20: -+ case PCI_CHIP_XGIXG21: -+ pXGI->xgi_HwDevExt.jChipType = XG40; -+ pXGI->myCR63 = 0x63; -+ pXGI->mmioSize = 64; -+ break; -+ -+ case PCI_CHIP_XGIXG27: -+ pXGI->xgi_HwDevExt.jChipType = XG27; -+ pXGI->myCR63 = 0x63; -+ pXGI->mmioSize = 64; -+ break; -+ -+ default: -+ /* This driver currently only supports V3XE, V3XT, V5, V8 (all of -+ * which are XG40 chips) and Z7 (which is XG20). -+ */ -+ if (pXGI->pInt) { -+ xf86FreeInt10(pXGI->pInt); -+ } -+ XGIFreeRec(pScrn); -+ return FALSE; -+ } -+ -+/* load frame_buffer */ -+ -+ FbDevExist = FALSE; -+ if((pXGI->Chipset != PCI_CHIP_XGIXG20)&&(pXGI->Chipset != PCI_CHIP_XGIXG21)&&( pXGI->Chipset != PCI_CHIP_XGIXG27 )) -+ { -+ if ((fd = open("/dev/fb", 'r')) != -1) { -+ PDEBUG(ErrorF("--- open /dev/fb.... \n")); -+ ioctl(fd, FBIOGET_FSCREENINFO, &fix); -+ if (fix.accel == FB_ACCEL_XGI_GLAMOUR) { -+ PDEBUG(ErrorF("--- fix.accel.... \n")); -+ FbDevExist = TRUE; -+ } -+ else -+ PDEBUG(ErrorF("--- no fix.accel.... 0x%08lx \n", fix.accel)); -+ close(fd); -+ } -+ } -+ -+ -+ /* -+ * The first thing we should figure out is the depth, bpp, etc. -+ * Additionally, determine the size of the HWCursor memory area. -+ */ -+ pXGI->CursorSize = 4096; -+ pix24flags = Support32bppFb; -+ -+#ifdef XGIDUALHEAD -+ /* In case of Dual Head, we need to determine if we are the "master" head or -+ * the "slave" head. In order to do that, we set PrimInit to DONE in the -+ * shared entity at the end of the first initialization. The second -+ * initialization then knows that some things have already been done. THIS -+ * ALWAYS ASSUMES THAT THE FIRST DEVICE INITIALIZED IS THE MASTER! -+ */ -+ -+ if (xf86IsEntityShared(pScrn->entityList[0])) { -+ if (pXGIEnt->lastInstance > 0) { -+ if (!xf86IsPrimInitDone(pScrn->entityList[0])) { -+ /* First Head (always CRT2) */ -+ pXGI->SecondHead = FALSE; -+ pXGIEnt->pScrn_1 = pScrn; -+ pXGIEnt->CRT2ModeNo = -1; -+ pXGIEnt->CRT2ModeSet = FALSE; -+ pXGI->DualHeadMode = TRUE; -+ pXGIEnt->DisableDual = FALSE; -+ pXGIEnt->BIOS = NULL; -+ pXGIEnt->XGI_Pr = NULL; -+ pXGIEnt->RenderAccelArray = NULL; -+ } -+ else { -+ /* Second Head (always CRT1) */ -+ pXGI->SecondHead = TRUE; -+ pXGIEnt->pScrn_2 = pScrn; -+ pXGI->DualHeadMode = TRUE; -+ } -+ } -+ else { -+ /* Only one screen in config file - disable dual head mode */ -+ pXGI->SecondHead = FALSE; -+ pXGI->DualHeadMode = FALSE; -+ pXGIEnt->DisableDual = TRUE; -+ } -+ } -+ else { -+ /* Entity is not shared - disable dual head mode */ -+ pXGI->SecondHead = FALSE; -+ pXGI->DualHeadMode = FALSE; -+ } -+#endif -+ -+ /* Allocate VB_DEVICE_INFO (for mode switching code) and initialize it */ -+ pXGI->XGI_Pr = NULL; -+ if (pXGIEnt && pXGIEnt->XGI_Pr) { -+ pXGI->XGI_Pr = pXGIEnt->XGI_Pr; -+ } -+ -+ if (!pXGI->XGI_Pr) { -+ if (!(pXGI->XGI_Pr = xnfcalloc(sizeof(VB_DEVICE_INFO), 1))) { -+ XGIErrorLog(pScrn, -+ "Could not allocate memory for XGI_Pr private\n"); -+ -+ if (pXGIEnt) -+ pXGIEnt->ErrorAfterFirst = TRUE; -+ if (pXGI->pInt) -+ xf86FreeInt10(pXGI->pInt); -+ XGIFreeRec(pScrn); -+ return FALSE; -+ } -+ -+ if (pXGIEnt) -+ pXGIEnt->XGI_Pr = pXGI->XGI_Pr; -+ -+ memset(pXGI->XGI_Pr, 0, sizeof(VB_DEVICE_INFO)); -+ } -+ -+ /* Get our relocated IO registers */ -+ pXGI->RelIO = (XGIIOADDRESS) (pXGI->IODBase | -+#ifdef XSERVER_LIBPCIACCESS -+ (pXGI->PciInfo->regions[2].base_addr & 0xFFFC) -+#else -+ (pXGI->PciInfo->ioBase[2] & 0xFFFC) -+#endif -+ ); -+ pXGI->xgi_HwDevExt.pjIOAddress = (XGIIOADDRESS) (pXGI->RelIO + 0x30); -+ xf86DrvMsg(pScrn->scrnIndex, from, "Relocated IO registers at 0x%lX\n", -+ (unsigned long) pXGI->RelIO); -+ -+ if (!xf86SetDepthBpp(pScrn, 0, 0, 0, pix24flags)) { -+ XGIErrorLog(pScrn, "xf86SetDepthBpp() error\n"); -+ -+ if (pXGIEnt) -+ pXGIEnt->ErrorAfterFirst = TRUE; -+ -+ if (pXGI->pInt) -+ xf86FreeInt10(pXGI->pInt); -+ XGIFreeRec(pScrn); -+ return FALSE; -+ } -+ -+ /* Check that the returned depth is one we support */ -+ temp = 0; -+ switch (pScrn->depth) { -+ case 8: -+ case 16: -+ case 24: -+#if !defined(__powerpc__) -+ case 15: -+#endif -+ break; -+ default: -+ temp = 1; -+ } -+ -+ if (temp) { -+ XGIErrorLog(pScrn, -+ "Given color depth (%d) is not supported by this driver/chipset\n", -+ pScrn->depth); -+ if (pXGI->pInt) -+ xf86FreeInt10(pXGI->pInt); -+ XGIFreeRec(pScrn); -+ return FALSE; -+ } -+ -+ xf86PrintDepthBpp(pScrn); -+ -+ /* Get the depth24 pixmap format */ -+ if (pScrn->depth == 24 && pix24bpp == 0) { -+ pix24bpp = xf86GetBppFromDepth(pScrn, 24); -+ } -+ -+ /* -+ * This must happen after pScrn->display has been set because -+ * xf86SetWeight references it. -+ */ -+ if (pScrn->depth > 8) { -+ /* The defaults are OK for us */ -+ rgb zeros = { 0, 0, 0 }; -+ -+ if (!xf86SetWeight(pScrn, zeros, zeros)) { -+ XGIErrorLog(pScrn, "xf86SetWeight() error\n"); -+ -+ if (pXGIEnt) -+ pXGIEnt->ErrorAfterFirst = TRUE; -+ -+ if (pXGI->pInt) -+ xf86FreeInt10(pXGI->pInt); -+ XGIFreeRec(pScrn); -+ return FALSE; -+ } -+ else { -+ Bool ret = FALSE; -+ switch (pScrn->depth) { -+ case 15: -+ if ((pScrn->weight.red != 5) || -+ (pScrn->weight.green != 5) || (pScrn->weight.blue != 5)) -+ ret = TRUE; -+ break; -+ case 16: -+ if ((pScrn->weight.red != 5) || -+ (pScrn->weight.green != 6) || (pScrn->weight.blue != 5)) -+ ret = TRUE; -+ break; -+ case 24: -+ if ((pScrn->weight.red != 8) || -+ (pScrn->weight.green != 8) || (pScrn->weight.blue != 8)) -+ ret = TRUE; -+ break; -+ } -+ if (ret) { -+ XGIErrorLog(pScrn, -+ "RGB weight %d%d%d at depth %d not supported by hardware\n", -+ (int) pScrn->weight.red, -+ (int) pScrn->weight.green, -+ (int) pScrn->weight.blue, pScrn->depth); -+ -+ if (pXGIEnt) -+ pXGIEnt->ErrorAfterFirst = TRUE; -+ -+ if (pXGI->pInt) -+ xf86FreeInt10(pXGI->pInt); -+ XGIFreeRec(pScrn); -+ return FALSE; -+ } -+ } -+ } -+ -+ /* Set the current layout parameters */ -+ pXGI->CurrentLayout.bitsPerPixel = pScrn->bitsPerPixel; -+ pXGI->CurrentLayout.depth = pScrn->depth; -+ /* (Inside this function, we can use pScrn's contents anyway) */ -+ -+ if (!xf86SetDefaultVisual(pScrn, -1)) { -+ XGIErrorLog(pScrn, "xf86SetDefaultVisual() error\n"); -+ -+ if (pXGIEnt) -+ pXGIEnt->ErrorAfterFirst = TRUE; -+ -+ if (pXGI->pInt) -+ xf86FreeInt10(pXGI->pInt); -+ XGIFreeRec(pScrn); -+ return FALSE; -+ } -+ else { -+ /* We don't support DirectColor at > 8bpp */ -+ if (pScrn->depth > 8 && pScrn->defaultVisual != TrueColor) { -+ XGIErrorLog(pScrn, -+ "Given default visual (%s) is not supported at depth %d\n", -+ xf86GetVisualName(pScrn->defaultVisual), -+ pScrn->depth); -+ -+ if (pXGIEnt) -+ pXGIEnt->ErrorAfterFirst = TRUE; -+ -+ if (pXGI->pInt) -+ xf86FreeInt10(pXGI->pInt); -+ XGIFreeRec(pScrn); -+ return FALSE; -+ } -+ } -+ -+ /* Due to palette & timing problems we don't support 8bpp in DHM */ -+ if ((IS_DUAL_HEAD(pXGI)) && (pScrn->bitsPerPixel == 8)) { -+ XGIErrorLog(pScrn, -+ "Color depth 8 not supported in Dual Head mode.\n"); -+ if (pXGIEnt) -+ pXGIEnt->ErrorAfterFirst = TRUE; -+ if (pXGI->pInt) -+ xf86FreeInt10(pXGI->pInt); -+ XGIFreeRec(pScrn); -+ return FALSE; -+ } -+ -+ /* -+ * The cmap layer needs this to be initialised. -+ */ -+ { -+ Gamma zeros = { 0.0, 0.0, 0.0 }; -+ -+ if (!xf86SetGamma(pScrn, zeros)) { -+ XGIErrorLog(pScrn, "xf86SetGamma() error\n"); -+ -+ if (pXGIEnt) -+ pXGIEnt->ErrorAfterFirst = TRUE; -+ -+ if (pXGI->pInt) -+ xf86FreeInt10(pXGI->pInt); -+ XGIFreeRec(pScrn); -+ return FALSE; -+ } -+ } -+ -+ /* We use a programamble clock */ -+ pScrn->progClock = TRUE; -+ -+ /* Set the bits per RGB for 8bpp mode */ -+ if (pScrn->depth == 8) { -+ pScrn->rgbBits = 6; -+ } -+ -+ from = X_DEFAULT; -+ -+ /* Unlock registers */ -+ xgiSaveUnlockExtRegisterLock(pXGI, &srlockReg, &crlockReg); -+ -+ /* Read BIOS for 300 and 315/330 series customization */ -+ pXGI->xgi_HwDevExt.pjVirtualRomBase = NULL; -+ pXGI->BIOS = NULL; -+ pXGI->xgi_HwDevExt.UseROM = FALSE; -+ -+ /* Evaluate options */ -+ xgiOptions(pScrn); -+ -+#ifdef XGIMERGED -+ /* Due to palette & timing problems we don't support 8bpp in MFBM */ -+ if ((pXGI->MergedFB) && (pScrn->bitsPerPixel == 8)) { -+ XGIErrorLog(pScrn, "MergedFB: Color depth 8 not supported, %s\n", -+ mergeddisstr); -+ pXGI->MergedFB = pXGI->MergedFBAuto = FALSE; -+ } -+#endif -+ -+ /* Do basic configuration */ -+ -+ XGISetup(pScrn); -+ -+ from = X_PROBED; -+#ifdef XSERVER_LIBPCIACCESS -+ pXGI->FbAddress = pXGI->PciInfo->regions[0].base_addr & 0xFFFFFFF0; -+#else -+ if (pXGI->pEnt->device->MemBase != 0) { -+ /* -+ * XXX Should check that the config file value matches one of the -+ * PCI base address values. -+ */ -+ pXGI->FbAddress = pXGI->pEnt->device->MemBase; -+ from = X_CONFIG; -+ } -+ else { -+ pXGI->FbAddress = pXGI->PciInfo->memBase[0] & 0xFFFFFFF0; -+ } -+#endif -+ -+ pXGI->realFbAddress = pXGI->FbAddress; -+ -+ xf86DrvMsg(pScrn->scrnIndex, from, -+ "%sinear framebuffer at 0x%lX\n", -+ IS_DUAL_HEAD(pXGI) ? "Global l" : "L", -+ (unsigned long) pXGI->FbAddress); -+ -+#ifdef XSERVER_LIBPCIACCESS -+ pXGI->IOAddress = pXGI->PciInfo->regions[1].base_addr & 0xFFFFFFF0; -+#else -+ if (pXGI->pEnt->device->IOBase != 0) { -+ /* -+ * XXX Should check that the config file value matches one of the -+ * PCI base address values. -+ */ -+ pXGI->IOAddress = pXGI->pEnt->device->IOBase; -+ from = X_CONFIG; -+ } -+ else { -+ pXGI->IOAddress = pXGI->PciInfo->memBase[1] & 0xFFFFFFF0; -+ } -+#endif -+ -+ xf86DrvMsg(pScrn->scrnIndex, from, -+ "MMIO registers at 0x%lX (size %ldK)\n", -+ (unsigned long) pXGI->IOAddress, pXGI->mmioSize); -+ pXGI->xgi_HwDevExt.bIntegratedMMEnabled = TRUE; -+ -+ /* Register the PCI-assigned resources. */ -+ if (xf86RegisterResources(pXGI->pEnt->index, NULL, ResExclusive)) { -+ XGIErrorLog(pScrn, -+ "xf86RegisterResources() found resource conflicts\n"); -+ -+ if (pXGIEnt) -+ pXGIEnt->ErrorAfterFirst = TRUE; -+ -+ if (pXGI->pInt) -+ xf86FreeInt10(pXGI->pInt); -+ xgiRestoreExtRegisterLock(pXGI, srlockReg, crlockReg); -+ XGIFreeRec(pScrn); -+ return FALSE; -+ } -+ -+ from = X_PROBED; -+ if (pXGI->pEnt->device->videoRam != 0) { -+ -+ xf86DrvMsg(pScrn->scrnIndex, X_WARNING, -+ "Option \"VideoRAM\" ignored\n"); -+ } -+ -+ xf86DrvMsg(pScrn->scrnIndex, from, "VideoRAM: %d KB\n", pScrn->videoRam); -+ -+ pXGI->FbMapSize = pXGI->availMem = pScrn->videoRam * 1024; -+ pXGI->xgi_HwDevExt.ulVideoMemorySize = pScrn->videoRam * 1024; -+ pXGI->xgi_HwDevExt.bSkipDramSizing = TRUE; -+ -+ /* Calculate real availMem according to Accel/TurboQueue and -+ * HWCursur setting. -+ * -+ * TQ is max 64KiB. Reduce the available memory by 64KiB, and locate the -+ * TQ at the beginning of this last 64KiB block. This is done even when -+ * using the HWCursor, because the cursor only takes 2KiB and the queue -+ * does not seem to last that far anyway. -+ * -+ * The TQ must be located at 32KB boundaries. -+ */ -+ if (pScrn->videoRam < 3072) { -+ if (pXGI->TurboQueue) { -+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, -+ "Not enough video RAM for TurboQueue. TurboQueue disabled\n"); -+ pXGI->TurboQueue = FALSE; -+ } -+ } -+ -+ pXGI->availMem -= (pXGI->TurboQueue) ? (64 * 1024) : pXGI->CursorSize; -+ -+ -+ /* In dual head mode, we share availMem equally - so align it -+ * to 8KB; this way, the address of the FB of the second -+ * head is aligned to 4KB for mapping. -+ * -+ * Check MaxXFBMem setting. Since DRI is not supported in dual head -+ * mode, we don't need the MaxXFBMem setting. -+ */ -+ if (IS_DUAL_HEAD(pXGI)) { -+ if (pXGI->maxxfbmem) { -+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, -+ "MaxXFBMem not used in Dual Head mode. Using all VideoRAM.\n"); -+ } -+ -+ pXGI->availMem &= 0xFFFFE000; -+ pXGI->maxxfbmem = pXGI->availMem; -+ } -+ else if (pXGI->maxxfbmem) { -+ if (pXGI->maxxfbmem > pXGI->availMem) { -+ if (pXGI->xgifbMem) { -+ pXGI->maxxfbmem = pXGI->xgifbMem * 1024; -+ xf86DrvMsg(pScrn->scrnIndex, X_WARNING, -+ "Invalid MaxXFBMem setting. Using xgifb heap start information\n"); -+ } -+ else { -+ xf86DrvMsg(pScrn->scrnIndex, X_WARNING, -+ "Invalid MaxXFBMem setting. Using all VideoRAM for framebuffer\n"); -+ pXGI->maxxfbmem = pXGI->availMem; -+ } -+ } -+ else if (pXGI->xgifbMem) { -+ if (pXGI->maxxfbmem > pXGI->xgifbMem * 1024) { -+ xf86DrvMsg(pScrn->scrnIndex, X_WARNING, -+ "MaxXFBMem beyond xgifb heap start. Using xgifb heap start\n"); -+ pXGI->maxxfbmem = pXGI->xgifbMem * 1024; -+ } -+ } -+ } -+ else if (pXGI->xgifbMem) { -+ pXGI->maxxfbmem = pXGI->xgifbMem * 1024; -+ } -+ else -+ pXGI->maxxfbmem = pXGI->availMem; -+ -+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Using %ldK of framebuffer memory\n", -+ pXGI->maxxfbmem / 1024); -+ -+ pXGI->CRT1off = -1; -+ -+ /* Detect video bridge and sense TV/VGA2 */ -+ XGIVGAPreInit(pScrn); -+ -+ /* Detect CRT1 (via DDC1 and DDC2, hence via VGA port; regardless of LCDA) */ -+ XGICRT1PreInit(pScrn); -+ -+ /* Detect LCD (connected via CRT2, regardless of LCDA) and LCD resolution */ -+ XGILCDPreInit(pScrn); -+ -+ /* LCDA only supported under these conditions: */ -+ if (pXGI->ForceCRT1Type == CRT1_LCDA) { -+ if (! -+ (pXGI->XGI_Pr-> -+ VBType & (VB_XGI301C | VB_XGI302B | VB_XGI301LV | -+ VB_XGI302LV))) { -+ xf86DrvMsg(pScrn->scrnIndex, X_WARNING, -+ "Chipset/Video bridge does not support LCD-via-CRT1\n"); -+ pXGI->ForceCRT1Type = CRT1_VGA; -+ } -+ else if (!(pXGI->VBFlags & CRT2_LCD)) { -+ xf86DrvMsg(pScrn->scrnIndex, X_WARNING, -+ "No digitally connected LCD panel found, LCD-via-CRT1 " -+ "disabled\n"); -+ pXGI->ForceCRT1Type = CRT1_VGA; -+ } -+ } -+ -+ /* Setup SD flags */ -+ pXGI->XGI_SD_Flags |= XGI_SD_ADDLSUPFLAG; -+ -+ if (pXGI->XGI_Pr->VBType & VB_XGIVB) { -+ pXGI->XGI_SD_Flags |= XGI_SD_SUPPORTTV; -+ } -+ -+#ifdef ENABLE_YPBPR -+ if (pXGI->XGI_Pr->VBType & (VB_XGI301 | VB_XGI301B | VB_XGI302B)) { -+ pXGI->XGI_SD_Flags |= XGI_SD_SUPPORTHIVISION; -+ } -+#endif -+ -+#ifdef TWDEBUG /* @@@ TEST @@@ */ -+ pXGI->XGI_SD_Flags |= XGI_SD_SUPPORTYPBPRAR; -+ xf86DrvMsg(0, X_INFO, "TEST: Support Aspect Ratio\n"); -+#endif -+ -+ /* Detect CRT2-TV and PAL/NTSC mode */ -+ XGITVPreInit(pScrn); -+ -+ /* Detect CRT2-VGA */ -+ XGICRT2PreInit(pScrn); -+ PDEBUG(ErrorF("3496 pXGI->VBFlags =%x\n", pXGI->VBFlags)); -+ -+ if (!(pXGI->XGI_SD_Flags & XGI_SD_SUPPORTYPBPR)) { -+ if ((pXGI->ForceTVType != -1) && (pXGI->ForceTVType & TV_YPBPR)) { -+ pXGI->ForceTVType = -1; -+ xf86DrvMsg(pScrn->scrnIndex, X_WARNING, -+ "YPbPr TV output not supported\n"); -+ } -+ } -+ -+ if (!(pXGI->XGI_SD_Flags & XGI_SD_SUPPORTHIVISION)) { -+ if ((pXGI->ForceTVType != -1) && (pXGI->ForceTVType & TV_HIVISION)) { -+ pXGI->ForceTVType = -1; -+ xf86DrvMsg(pScrn->scrnIndex, X_WARNING, -+ "HiVision TV output not supported\n"); -+ } -+ } -+ -+ if (pXGI->XGI_Pr->VBType & VB_XGIVB) { -+ pXGI->XGI_SD_Flags |= (XGI_SD_SUPPORTPALMN | XGI_SD_SUPPORTNTSCJ); -+ } -+ if (pXGI->XGI_Pr->VBType & VB_XGIVB) { -+ pXGI->XGI_SD_Flags |= XGI_SD_SUPPORTTVPOS; -+ } -+ if (pXGI->XGI_Pr-> -+ VBType & (VB_XGI301 | VB_XGI301B | VB_XGI301C | VB_XGI302B)) { -+ pXGI->XGI_SD_Flags |= (XGI_SD_SUPPORTSCART | XGI_SD_SUPPORTVGA2); -+ } -+ -+ if ((pXGI->XGI_Pr-> -+ VBType & (VB_XGI301C | VB_XGI302B | VB_XGI301LV | VB_XGI302LV)) -+ && (pXGI->VBFlags & CRT2_LCD)) { -+ pXGI->XGI_SD_Flags |= XGI_SD_SUPPORTLCDA; -+ } -+ -+ pXGI->VBFlags |= pXGI->ForceCRT1Type; -+ -+#ifdef TWDEBUG -+ xf86DrvMsg(0, X_INFO, "SDFlags %lx\n", pXGI->XGI_SD_Flags); -+#endif -+ -+ -+ if (!IS_DUAL_HEAD(pXGI) || IS_SECOND_HEAD(pXGI)) { -+ xf86DrvMsg(pScrn->scrnIndex, pXGI->CRT1gammaGiven ? X_CONFIG : X_INFO, -+ "CRT1 gamma correction is %s\n", -+ pXGI->CRT1gamma ? "enabled" : "disabled"); -+ } -+ -+ /* Eventually overrule TV Type (SVIDEO, COMPOSITE, SCART, HIVISION, YPBPR) */ -+ if (pXGI->XGI_Pr->VBType & VB_XGIVB) { -+ if (pXGI->ForceTVType != -1) { -+ pXGI->VBFlags &= ~(TV_INTERFACE); -+ pXGI->VBFlags |= pXGI->ForceTVType; -+ if (pXGI->VBFlags & TV_YPBPR) { -+ pXGI->VBFlags &= ~(TV_STANDARD); -+ pXGI->VBFlags &= ~(TV_YPBPRAR); -+ pXGI->VBFlags |= pXGI->ForceYPbPrType; -+ pXGI->VBFlags |= pXGI->ForceYPbPrAR; -+ } -+ } -+ } -+ -+ /* Check if CRT1 used or needed. There are three cases where this can -+ * happen: -+ * - No video bridge. -+ * - No CRT2 output. -+ * - Depth = 8 and bridge=LVDS|301B-DH -+ * - LCDA -+ */ -+ if (((pXGI->XGI_Pr->VBType & VB_XGIVB) == 0) -+ || ((pXGI->VBFlags & (CRT2_VGA | CRT2_LCD | CRT2_TV)) == 0) -+ || ((pScrn->bitsPerPixel == 8) -+ && (pXGI->XGI_Pr->VBType & VB_XGI301LV302LV)) -+ || (pXGI->VBFlags & CRT1_LCDA)) { -+ pXGI->CRT1off = 0; -+ } -+ -+ -+ /* Handle TVStandard option */ -+ if ((pXGI->NonDefaultPAL != -1) || (pXGI->NonDefaultNTSC != -1)) { -+ if (!(pXGI->XGI_Pr->VBType & VB_XGIVB)) { -+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, -+ "PALM, PALN and NTSCJ not supported on this hardware\n"); -+ pXGI->NonDefaultPAL = pXGI->NonDefaultNTSC = -1; -+ pXGI->VBFlags &= ~(TV_PALN | TV_PALM | TV_NTSCJ); -+ pXGI->XGI_SD_Flags &= -+ ~(XGI_SD_SUPPORTPALMN | XGI_SD_SUPPORTNTSCJ); -+ } -+ } -+ -+#ifdef XGI_CP -+ XGI_CP_DRIVER_RECONFIGOPT -+#endif -+ /* Do some MergedFB mode initialisation */ -+#ifdef XGIMERGED -+ if (pXGI->MergedFB) { -+ pXGI->CRT2pScrn = xalloc(sizeof(ScrnInfoRec)); -+ if (!pXGI->CRT2pScrn) { -+ XGIErrorLog(pScrn, -+ "Failed to allocate memory for 2nd pScrn, %s\n", -+ mergeddisstr); -+ pXGI->MergedFB = FALSE; -+ } -+ else { -+ memcpy(pXGI->CRT2pScrn, pScrn, sizeof(ScrnInfoRec)); -+ } -+ } -+#endif -+ PDEBUG(ErrorF("3674 pXGI->VBFlags =%x\n", pXGI->VBFlags)); -+ -+ /* Determine CRT1<>CRT2 mode -+ * Note: When using VESA or if the bridge is in slavemode, display -+ * is ALWAYS in MIRROR_MODE! -+ * This requires extra checks in functions using this flag! -+ * (see xgi_video.c for example) -+ */ -+ if (pXGI->VBFlags & DISPTYPE_DISP2) { -+ if (pXGI->CRT1off) { /* CRT2 only ------------------------------- */ -+ if (IS_DUAL_HEAD(pXGI)) { -+ XGIErrorLog(pScrn, -+ "CRT1 not detected or forced off. Dual Head mode can't initialize.\n"); -+ if (pXGIEnt) -+ pXGIEnt->DisableDual = TRUE; -+ if (pXGIEnt) -+ pXGIEnt->ErrorAfterFirst = TRUE; -+ if (pXGI->pInt) -+ xf86FreeInt10(pXGI->pInt); -+ pXGI->pInt = NULL; -+ xgiRestoreExtRegisterLock(pXGI, srlockReg, crlockReg); -+ XGIFreeRec(pScrn); -+ return FALSE; -+ } -+#ifdef XGIMERGED -+ if (pXGI->MergedFB) { -+ if (pXGI->MergedFBAuto) { -+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, mergednocrt1, -+ mergeddisstr); -+ } -+ else { -+ XGIErrorLog(pScrn, mergednocrt1, mergeddisstr); -+ } -+ if (pXGI->CRT2pScrn) -+ xfree(pXGI->CRT2pScrn); -+ pXGI->CRT2pScrn = NULL; -+ pXGI->MergedFB = FALSE; -+ } -+#endif -+ pXGI->VBFlags |= VB_DISPMODE_SINGLE; -+ } -+ /* CRT1 and CRT2 - mirror or dual head ----- */ -+ else if (IS_DUAL_HEAD(pXGI)) { -+ pXGI->VBFlags |= (VB_DISPMODE_DUAL | DISPTYPE_CRT1); -+ if (pXGIEnt) -+ pXGIEnt->DisableDual = FALSE; -+ } -+ else -+ pXGI->VBFlags |= (VB_DISPMODE_MIRROR | DISPTYPE_CRT1); -+ } -+ else { /* CRT1 only ------------------------------- */ -+ if (IS_DUAL_HEAD(pXGI)) { -+ XGIErrorLog(pScrn, -+ "No CRT2 output selected or no bridge detected. " -+ "Dual Head mode can't initialize.\n"); -+ if (pXGIEnt) -+ pXGIEnt->ErrorAfterFirst = TRUE; -+ if (pXGI->pInt) -+ xf86FreeInt10(pXGI->pInt); -+ pXGI->pInt = NULL; -+ xgiRestoreExtRegisterLock(pXGI, srlockReg, crlockReg); -+ XGIFreeRec(pScrn); -+ return FALSE; -+ } -+ -+#ifdef XGIMERGED -+ if (pXGI->MergedFB) { -+ if (pXGI->MergedFBAuto) { -+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, mergednocrt2, -+ mergeddisstr); -+ } -+ else { -+ XGIErrorLog(pScrn, mergednocrt2, mergeddisstr); -+ } -+ if (pXGI->CRT2pScrn) -+ xfree(pXGI->CRT2pScrn); -+ pXGI->CRT2pScrn = NULL; -+ pXGI->MergedFB = FALSE; -+ } -+#endif -+ PDEBUG(ErrorF("3782 pXGI->VBFlags =%x\n", pXGI->VBFlags)); -+ pXGI->VBFlags |= (VB_DISPMODE_SINGLE | DISPTYPE_CRT1); -+ } -+ -+ /* Init Ptrs for Save/Restore functions and calc MaxClock */ -+ XGIDACPreInit(pScrn); -+ -+ /* ********** end of VBFlags setup ********** */ -+ -+ /* VBFlags are initialized now. Back them up for SlaveMode modes. */ -+ pXGI->VBFlags_backup = pXGI->VBFlags; -+ -+ /* Find out about paneldelaycompensation and evaluate option */ -+ if (!IS_DUAL_HEAD(pXGI) || !IS_SECOND_HEAD(pXGI)) { -+ -+ } -+ -+ /* In dual head mode, both heads (currently) share the maxxfbmem equally. -+ * If memory sharing is done differently, the following has to be changed; -+ * the other modules (eg. accel and Xv) use dhmOffset for hardware -+ * pointer settings relative to VideoRAM start and won't need to be changed. -+ */ -+ if (IS_DUAL_HEAD(pXGI)) { -+ if (!IS_SECOND_HEAD(pXGI)) { -+ /* ===== First head (always CRT2) ===== */ -+ /* We use only half of the memory available */ -+ pXGI->maxxfbmem /= 2; -+ /* Initialize dhmOffset */ -+ pXGI->dhmOffset = 0; -+ /* Copy framebuffer addresses & sizes to entity */ -+ pXGIEnt->masterFbAddress = pXGI->FbAddress; -+ pXGIEnt->masterFbSize = pXGI->maxxfbmem; -+ pXGIEnt->slaveFbAddress = pXGI->FbAddress + pXGI->maxxfbmem; -+ pXGIEnt->slaveFbSize = pXGI->maxxfbmem; -+ xf86DrvMsg(pScrn->scrnIndex, X_PROBED, -+ "%ldKB video RAM at 0x%lx available for master head (CRT2)\n", -+ pXGI->maxxfbmem / 1024, pXGI->FbAddress); -+ } -+ else { -+ /* ===== Second head (always CRT1) ===== */ -+ /* We use only half of the memory available */ -+ pXGI->maxxfbmem /= 2; -+ /* Adapt FBAddress */ -+ pXGI->FbAddress += pXGI->maxxfbmem; -+ /* Initialize dhmOffset */ -+ pXGI->dhmOffset = pXGI->availMem - pXGI->maxxfbmem; -+ xf86DrvMsg(pScrn->scrnIndex, X_PROBED, -+ "%ldKB video RAM at 0x%lx available for slave head (CRT1)\n", -+ pXGI->maxxfbmem / 1024, pXGI->FbAddress); -+ } -+ } -+ else -+ pXGI->dhmOffset = 0; -+ -+ /* Note: Do not use availMem for anything from now. Use -+ * maxxfbmem instead. (availMem does not take dual head -+ * mode into account.) -+ */ -+ -+#if !defined(__powerpc__) -+ /* Now load and initialize VBE module. */ -+ if (xf86LoadSubModule(pScrn, "vbe")) { -+ xf86LoaderReqSymLists(vbeSymbols, NULL); -+ pXGI->pVbe = VBEExtendedInit(pXGI->pInt, pXGI->pEnt->index, -+ SET_BIOS_SCRATCH | RESTORE_BIOS_SCRATCH); -+ if (!pXGI->pVbe) { -+ xf86DrvMsg(pScrn->scrnIndex, X_WARNING, -+ "Could not initialize VBE module for DDC\n"); -+ } -+ } -+ else { -+ xf86DrvMsg(pScrn->scrnIndex, X_WARNING, -+ "Could not load VBE module\n"); -+ } -+ -+ XGIDDCPreInit(pScrn); -+#endif -+ /* From here, we mainly deal with clocks and modes */ -+ -+ /* Set the min pixel clock */ -+ pXGI->MinClock = 5000; -+ -+ xf86DrvMsg(pScrn->scrnIndex, X_DEFAULT, "Min pixel clock is %d MHz\n", -+ pXGI->MinClock / 1000); -+ -+ from = X_PROBED; -+ /* -+ * If the user has specified ramdac speed in the XF86Config -+ * file, we respect that setting. -+ */ -+ if (pXGI->pEnt->device->dacSpeeds[0]) { -+ int speed = 0; -+ switch (pScrn->bitsPerPixel) { -+ case 8: -+ speed = pXGI->pEnt->device->dacSpeeds[DAC_BPP8]; -+ break; -+ case 16: -+ speed = pXGI->pEnt->device->dacSpeeds[DAC_BPP16]; -+ break; -+ case 24: -+ speed = pXGI->pEnt->device->dacSpeeds[DAC_BPP24]; -+ break; -+ case 32: -+ speed = pXGI->pEnt->device->dacSpeeds[DAC_BPP32]; -+ break; -+ } -+ if (speed == 0) -+ pXGI->MaxClock = pXGI->pEnt->device->dacSpeeds[0]; -+ else -+ pXGI->MaxClock = speed; -+ from = X_CONFIG; -+ } -+ xf86DrvMsg(pScrn->scrnIndex, from, "Max pixel clock is %d MHz\n", -+ pXGI->MaxClock / 1000); -+ -+ /* -+ * Setup the ClockRanges, which describe what clock ranges are available, -+ * and what sort of modes they can be used for. -+ */ -+ clockRanges = xnfcalloc(sizeof(ClockRange), 1); -+ clockRanges->next = NULL; -+ clockRanges->minClock = pXGI->MinClock; -+ clockRanges->maxClock = pXGI->MaxClock; -+ clockRanges->clockIndex = -1; /* programmable */ -+ clockRanges->interlaceAllowed = TRUE; -+ clockRanges->doubleScanAllowed = TRUE; -+ -+ /* -+ * xf86ValidateModes will check that the mode HTotal and VTotal values -+ * don't exceed the chipset's limit if pScrn->maxHValue and -+ * pScrn->maxVValue are set. Since our XGIValidMode() already takes -+ * care of this, we don't worry about setting them here. -+ */ -+ -+ /* Select valid modes from those available */ -+#ifdef XGIMERGED -+ pXGI->CheckForCRT2 = FALSE; -+#endif -+ XGIDumpMonPtr(pScrn->monitor); -+ -+ /* Jong 12/05/2007; filter support modes of CRT1 by CRT2 DDC */ -+ /* XGIFilterModeByDDC(pScrn->monitor->Modes, g_pMonitorDVI); */ /* Do it in XGIValidMode() */ -+ -+ i = xf86ValidateModes(pScrn, pScrn->monitor->Modes, pScrn->display->modes, clockRanges, NULL, 256, 2048, /* min / max pitch */ -+ pScrn->bitsPerPixel * 8, 128, 2048, /* min / max height */ -+ pScrn->display->virtualX, -+ pScrn->display->virtualY, -+ pXGI->maxxfbmem, LOOKUP_BEST_REFRESH); -+ -+ if (i == -1) { -+ XGIErrorLog(pScrn, "xf86ValidateModes() error\n"); -+ -+ if (pXGIEnt) -+ pXGIEnt->ErrorAfterFirst = TRUE; -+ -+ if (pXGI->pInt) -+ xf86FreeInt10(pXGI->pInt); -+ xgiRestoreExtRegisterLock(pXGI, srlockReg, crlockReg); -+ XGIFreeRec(pScrn); -+ return FALSE; -+ } -+ -+ /* Check the virtual screen against the available memory */ -+ -+ memreq = (pScrn->virtualX * ((pScrn->bitsPerPixel + 7) / 8)) -+ * pScrn->virtualY; -+ -+ if (memreq > pXGI->maxxfbmem) { -+ XGIErrorLog(pScrn, -+ "Virtual screen too big for memory; %ldK needed, %ldK available\n", -+ memreq / 1024, pXGI->maxxfbmem / 1024); -+ -+ if (pXGIEnt) -+ pXGIEnt->ErrorAfterFirst = TRUE; -+ -+ if (pXGI->pInt) -+ xf86FreeInt10(pXGI->pInt); -+ pXGI->pInt = NULL; -+ xgiRestoreExtRegisterLock(pXGI, srlockReg, crlockReg); -+ XGIFreeRec(pScrn); -+ return FALSE; -+ } -+ else if (pXGI->loadDRI && !IS_DUAL_HEAD(pXGI)) { -+ pXGI->maxxfbmem = memreq; -+ pXGI->DRIheapstart = pXGI->DRIheapend = 0; -+ -+ if (pXGI->maxxfbmem == pXGI->availMem) { -+ xf86DrvMsg(pScrn->scrnIndex, X_WARNING, -+ "All video memory used for framebuffer. DRI will be disabled.\n"); -+ pXGI->loadDRI = FALSE; -+ } -+ else { -+ pXGI->DRIheapstart = pXGI->maxxfbmem; -+ pXGI->DRIheapend = pXGI->availMem; -+ } -+ } -+ -+ -+ /* Dual Head: -+ * -) Go through mode list and mark all those modes as bad, -+ * which are unsuitable for dual head mode. -+ * -) Find the highest used pixelclock on the master head. -+ */ -+ if (IS_DUAL_HEAD(pXGI) && !IS_SECOND_HEAD(pXGI)) { -+ pXGIEnt->maxUsedClock = 0; -+ -+ if ((p = first = pScrn->modes)) { -+ do { -+ n = p->next; -+ -+ /* Modes that require the bridge to operate in SlaveMode -+ * are not suitable for Dual Head mode. -+ */ -+ -+ /* Search for the highest clock on first head in order to calculate -+ * max clock for second head (CRT1) -+ */ -+ if ((p->status == MODE_OK) -+ && (p->Clock > pXGIEnt->maxUsedClock)) { -+ pXGIEnt->maxUsedClock = p->Clock; -+ } -+ -+ p = n; -+ -+ } while (p != NULL && p != first); -+ } -+ } -+ -+ /* Prune the modes marked as invalid */ -+ xf86PruneDriverModes(pScrn); -+ -+ if (i == 0 || pScrn->modes == NULL) { -+ XGIErrorLog(pScrn, "No valid modes found\n"); -+ -+ if (pXGIEnt) -+ pXGIEnt->ErrorAfterFirst = TRUE; -+ -+ if (pXGI->pInt) -+ xf86FreeInt10(pXGI->pInt); -+ xgiRestoreExtRegisterLock(pXGI, srlockReg, crlockReg); -+ XGIFreeRec(pScrn); -+ return FALSE; -+ } -+ -+ xf86SetCrtcForModes(pScrn, INTERLACE_HALVE_V); -+ -+ /* Set the current mode to the first in the list */ -+ pScrn->currentMode = pScrn->modes; -+ -+ /* Copy to CurrentLayout */ -+ pXGI->CurrentLayout.mode = pScrn->currentMode; -+ pXGI->CurrentLayout.displayWidth = pScrn->displayWidth; -+ -+#ifdef XGIMERGED -+ if (pXGI->MergedFB) { -+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, modesforstr, 1); -+ } -+#endif -+ -+ /* Print the list of modes being used */ -+ xf86PrintModes(pScrn); -+ -+#ifdef XGIMERGED -+ if (pXGI->MergedFB) { -+ BOOLEAN acceptcustommodes = TRUE; -+ BOOLEAN includelcdmodes = TRUE; -+ BOOLEAN isfordvi = FALSE; -+ -+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, crtsetupstr, 2); -+ -+ clockRanges->next = NULL; -+ clockRanges->minClock = pXGI->MinClock; -+ clockRanges->clockIndex = -1; -+ clockRanges->interlaceAllowed = FALSE; -+ clockRanges->doubleScanAllowed = FALSE; -+ -+ xf86DrvMsg(pScrn->scrnIndex, X_DEFAULT, -+ "Min pixel clock for CRT2 is %d MHz\n", -+ clockRanges->minClock / 1000); -+ xf86DrvMsg(pScrn->scrnIndex, X_DEFAULT, -+ "Max pixel clock for CRT2 is %d MHz\n", -+ clockRanges->maxClock / 1000); -+ -+ if ((pXGI->XGI_Pr-> -+ VBType & (VB_XGI301 | VB_XGI301B | VB_XGI301C | VB_XGI302B))) -+ { -+ if (!(pXGI->VBFlags & (CRT2_LCD | CRT2_VGA))) -+ includelcdmodes = FALSE; -+ if (pXGI->VBFlags & CRT2_LCD) -+ isfordvi = TRUE; -+ if (pXGI->VBFlags & CRT2_TV) -+ acceptcustommodes = FALSE; -+ } -+ else { -+ includelcdmodes = FALSE; -+ acceptcustommodes = FALSE; -+ } -+ } -+ -+ if (pXGI->MergedFB) { -+ -+ pXGI->CheckForCRT2 = TRUE; -+ i = xf86ValidateModes(pXGI->CRT2pScrn, -+ pXGI->CRT2pScrn->monitor->Modes, -+ pXGI->CRT2pScrn->display->modes, clockRanges, -+ NULL, 256, 4088, -+ pXGI->CRT2pScrn->bitsPerPixel * 8, 128, 4096, -+ pScrn->display->virtualX ? pScrn->virtualX : 0, -+ pScrn->display->virtualY ? pScrn->virtualY : 0, -+ pXGI->maxxfbmem, LOOKUP_BEST_REFRESH); -+ pXGI->CheckForCRT2 = FALSE; -+ -+ if (i == -1) { -+ XGIErrorLog(pScrn, "xf86ValidateModes() error, %s.\n", -+ mergeddisstr); -+ XGIFreeCRT2Structs(pXGI); -+ pXGI->MergedFB = FALSE; -+ } -+ -+ } -+ -+ if (pXGI->MergedFB) { -+ -+ if ((p = first = pXGI->CRT2pScrn->modes)) { -+ do { -+ n = p->next; -+ p = n; -+ } while (p != NULL && p != first); -+ } -+ -+ xf86PruneDriverModes(pXGI->CRT2pScrn); -+ -+ if (i == 0 || pXGI->CRT2pScrn->modes == NULL) { -+ XGIErrorLog(pScrn, "No valid modes found for CRT2; %s\n", -+ mergeddisstr); -+ XGIFreeCRT2Structs(pXGI); -+ pXGI->MergedFB = FALSE; -+ } -+ -+ } -+ -+ if (pXGI->MergedFB) { -+ -+ xf86SetCrtcForModes(pXGI->CRT2pScrn, INTERLACE_HALVE_V); -+ -+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, modesforstr, 2); -+ -+ xf86PrintModes(pXGI->CRT2pScrn); -+ -+ pXGI->CRT1Modes = pScrn->modes; -+ pXGI->CRT1CurrentMode = pScrn->currentMode; -+ -+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, -+ "Generating MergedFB mode list\n"); -+ -+ pScrn->modes = XGIGenerateModeList(pScrn, pXGI->MetaModes, -+ pXGI->CRT1Modes, -+ pXGI->CRT2pScrn->modes, -+ pXGI->CRT2Position); -+ -+ if (!pScrn->modes) { -+ -+ XGIErrorLog(pScrn, -+ "Failed to parse MetaModes or no modes found. %s.\n", -+ mergeddisstr); -+ XGIFreeCRT2Structs(pXGI); -+ pScrn->modes = pXGI->CRT1Modes; -+ pXGI->CRT1Modes = NULL; -+ pXGI->MergedFB = FALSE; -+ -+ } -+ -+ } -+ -+ if (pXGI->MergedFB) { -+ -+ /* If no virtual dimension was given by the user, -+ * calculate a sane one now. Adapts pScrn->virtualX, -+ * pScrn->virtualY and pScrn->displayWidth. -+ */ -+ XGIRecalcDefaultVirtualSize(pScrn); -+ -+ pScrn->modes = pScrn->modes->next; /* We get the last from GenerateModeList(), skip to first */ -+ pScrn->currentMode = pScrn->modes; -+ -+ /* Update CurrentLayout */ -+ pXGI->CurrentLayout.mode = pScrn->currentMode; -+ pXGI->CurrentLayout.displayWidth = pScrn->displayWidth; -+ -+ } -+#endif -+ -+ /* Set display resolution */ -+#ifdef XGIMERGED -+ if (pXGI->MergedFB) { -+ XGIMergedFBSetDpi(pScrn, pXGI->CRT2pScrn, pXGI->CRT2Position); -+ } -+ else -+#endif -+ xf86SetDpi(pScrn, 0, 0); -+ -+ /*yilin@20080407 fix the font too small problem at low resolution*/ -+ if((pScrn->xDpi < 65)||(pScrn->yDpi < 65)) -+ { -+ pScrn->xDpi = 75; -+ pScrn->yDpi = 75; -+ } -+ -+ /* Load fb module */ -+ switch (pScrn->bitsPerPixel) { -+ case 8: -+ case 16: -+ case 24: -+ case 32: -+ if (!xf86LoadSubModule(pScrn, "fb")) { -+ XGIErrorLog(pScrn, "Failed to load fb module"); -+ -+ if (pXGIEnt) -+ pXGIEnt->ErrorAfterFirst = TRUE; -+ -+ if (pXGI->pInt) -+ xf86FreeInt10(pXGI->pInt); -+ xgiRestoreExtRegisterLock(pXGI, srlockReg, crlockReg); -+ XGIFreeRec(pScrn); -+ return FALSE; -+ } -+ break; -+ default: -+ XGIErrorLog(pScrn, "Unsupported framebuffer bpp (%d)\n", -+ pScrn->bitsPerPixel); -+ -+ if (pXGIEnt) -+ pXGIEnt->ErrorAfterFirst = TRUE; -+ -+ if (pXGI->pInt) -+ xf86FreeInt10(pXGI->pInt); -+ xgiRestoreExtRegisterLock(pXGI, srlockReg, crlockReg); -+ XGIFreeRec(pScrn); -+ return FALSE; -+ } -+ xf86LoaderReqSymLists(fbSymbols, NULL); -+ -+ /* Load XAA if needed */ -+ if (!pXGI->NoAccel) { -+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Accel enabled\n"); -+ if (!xf86LoadSubModule(pScrn, "xaa")) { -+ XGIErrorLog(pScrn, "Could not load xaa module\n"); -+ -+ if (pXGIEnt) -+ pXGIEnt->ErrorAfterFirst = TRUE; -+ -+ if (pXGI->pInt) -+ xf86FreeInt10(pXGI->pInt); -+ xgiRestoreExtRegisterLock(pXGI, srlockReg, crlockReg); -+ XGIFreeRec(pScrn); -+ return FALSE; -+ } -+ xf86LoaderReqSymLists(xaaSymbols, NULL); -+ } -+ -+ /* Load shadowfb if needed */ -+ if (pXGI->ShadowFB) { -+ if (!xf86LoadSubModule(pScrn, "shadowfb")) { -+ XGIErrorLog(pScrn, "Could not load shadowfb module\n"); -+ -+ if (pXGIEnt) -+ pXGIEnt->ErrorAfterFirst = TRUE; -+ -+ if (pXGI->pInt) -+ xf86FreeInt10(pXGI->pInt); -+ xgiRestoreExtRegisterLock(pXGI, srlockReg, crlockReg); -+ XGIFreeRec(pScrn); -+ return FALSE; -+ } -+ xf86LoaderReqSymLists(shadowSymbols, NULL); -+ } -+ -+ /* Load the dri module if requested. */ -+#ifdef XF86DRI -+ if(pXGI->loadDRI) { -+ if (xf86LoadSubModule(pScrn, "dri")) { -+ xf86LoaderReqSymLists(driSymbols, drmSymbols, NULL); -+ } -+ else { -+ if (!IS_DUAL_HEAD(pXGI)) -+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR, -+ "Remove >Load \"dri\"< from the Module section of your XF86Config file\n"); -+ } -+ } -+#endif -+ -+ -+ /* Now load and initialize VBE module for VESA and mode restoring. */ -+ if (pXGI->pVbe) { -+ vbeFree(pXGI->pVbe); -+ pXGI->pVbe = NULL; -+ } -+ -+#ifdef XGIDUALHEAD -+ xf86SetPrimInitDone(pScrn->entityList[0]); -+#endif -+ -+ xgiRestoreExtRegisterLock(pXGI, srlockReg, crlockReg); -+ -+ if (pXGI->pInt) -+ xf86FreeInt10(pXGI->pInt); -+ pXGI->pInt = NULL; -+ -+ if (IS_DUAL_HEAD(pXGI)) { -+ pXGI->XGI_SD_Flags |= XGI_SD_ISDUALHEAD; -+ if (IS_SECOND_HEAD(pXGI)) -+ pXGI->XGI_SD_Flags |= XGI_SD_ISDHSECONDHEAD; -+ else -+ pXGI->XGI_SD_Flags &= ~(XGI_SD_SUPPORTXVGAMMA1); -+#ifdef PANORAMIX -+ if (!noPanoramiXExtension) { -+ pXGI->XGI_SD_Flags |= XGI_SD_ISDHXINERAMA; -+ pXGI->XGI_SD_Flags &= ~(XGI_SD_SUPPORTXVGAMMA1); -+ } -+#endif -+ } -+ -+#ifdef XGIMERGED -+ if (pXGI->MergedFB) -+ pXGI->XGI_SD_Flags |= XGI_SD_ISMERGEDFB; -+#endif -+ -+ if (pXGI->enablexgictrl) -+ pXGI->XGI_SD_Flags |= XGI_SD_ENABLED; -+ -+ return TRUE; -+} -+ -+ -+/* -+ * Map the framebuffer and MMIO memory. -+ */ -+ -+static Bool -+XGIMapMem(ScrnInfoPtr pScrn) -+{ -+ XGIPtr pXGI = XGIPTR(pScrn);; -+ -+#ifdef XSERVER_LIBPCIACCESS -+ unsigned i; -+ -+ for (i = 0; i < 2; i++) { -+ int err; -+ -+ err = pci_device_map_region(pXGI->PciInfo, i, TRUE); -+ if (err) { -+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR, -+ "Internal error: cound not map PCI region %u\n", i); -+ return FALSE; -+ } -+ } -+ -+ pXGI->FbBase = pXGI->PciInfo->regions[0].memory; -+ pXGI->IOBase = pXGI->PciInfo->regions[1].memory; -+#else -+ int mmioFlags; -+ -+ /* -+ * Map IO registers to virtual address space -+ */ -+#if !defined(__alpha__) -+ mmioFlags = VIDMEM_MMIO; -+#else -+ /* -+ * For Alpha, we need to map SPARSE memory, since we need -+ * byte/short access. -+ */ -+ mmioFlags = VIDMEM_MMIO | VIDMEM_SPARSE; -+#endif -+ pXGI->IOBase = xf86MapPciMem(pScrn->scrnIndex, mmioFlags, -+ pXGI->PciTag, pXGI->IOAddress, 0x10000); -+ if (pXGI->IOBase == NULL) -+ return FALSE; -+ -+#ifdef __alpha__ -+ /* -+ * for Alpha, we need to map DENSE memory as well, for -+ * setting CPUToScreenColorExpandBase. -+ */ -+ pXGI->IOBaseDense = xf86MapPciMem(pScrn->scrnIndex, VIDMEM_MMIO, -+ pXGI->PciTag, pXGI->IOAddress, 0x10000); -+ -+ if (pXGI->IOBaseDense == NULL) -+ return FALSE; -+#endif /* __alpha__ */ -+ -+ pXGI->FbBase = xf86MapPciMem(pScrn->scrnIndex, VIDMEM_FRAMEBUFFER, -+ pXGI->PciTag, -+ (unsigned long) pXGI->FbAddress, -+ pXGI->FbMapSize); -+ -+ PDEBUG(ErrorF("pXGI->FbBase = 0x%08lx\n", (ULONG) (pXGI->FbBase))); -+ -+ if (pXGI->FbBase == NULL) -+ return FALSE; -+#endif -+ -+ return TRUE; -+} -+ -+ -+/* -+ * Unmap the framebuffer and MMIO memory. -+ */ -+ -+static Bool -+XGIUnmapMem(ScrnInfoPtr pScrn) -+{ -+ XGIPtr pXGI = XGIPTR(pScrn); -+ XGIEntPtr pXGIEnt = ENTITY_PRIVATE(pXGI); -+ -+ -+ /* In dual head mode, we must not unmap if the other head still -+ * assumes memory as mapped -+ */ -+ if (IS_DUAL_HEAD(pXGI)) { -+ if (pXGIEnt->MapCountIOBase) { -+ pXGIEnt->MapCountIOBase--; -+ if ((pXGIEnt->MapCountIOBase == 0) || (pXGIEnt->forceUnmapIOBase)) { -+#ifdef XSERVER_LIBPCIACCESS -+ pci_device_unmap_region(pXGI->PciInfo, 1); -+#else -+ xf86UnMapVidMem(pScrn->scrnIndex, (pointer) pXGIEnt->IOBase, -+ (pXGI->mmioSize * 1024)); -+#endif -+ pXGIEnt->IOBase = NULL; -+ pXGIEnt->MapCountIOBase = 0; -+ pXGIEnt->forceUnmapIOBase = FALSE; -+ } -+ pXGI->IOBase = NULL; -+ } -+#ifdef __alpha__ -+#ifdef XSERVER_LIBPCIACCESS -+#error "How to do dense mapping on Alpha?" -+#else -+ if (pXGIEnt->MapCountIOBaseDense) { -+ pXGIEnt->MapCountIOBaseDense--; -+ if ((pXGIEnt->MapCountIOBaseDense == 0) -+ || (pXGIEnt->forceUnmapIOBaseDense)) { -+ xf86UnMapVidMem(pScrn->scrnIndex, -+ (pointer) pXGIEnt->IOBaseDense, -+ (pXGI->mmioSize * 1024)); -+ pXGIEnt->IOBaseDense = NULL; -+ pXGIEnt->MapCountIOBaseDense = 0; -+ pXGIEnt->forceUnmapIOBaseDense = FALSE; -+ } -+ pXGI->IOBaseDense = NULL; -+ } -+#endif -+#endif /* __alpha__ */ -+ if (pXGIEnt->MapCountFbBase) { -+ pXGIEnt->MapCountFbBase--; -+ if ((pXGIEnt->MapCountFbBase == 0) || (pXGIEnt->forceUnmapFbBase)) { -+#ifdef XSERVER_LIBPCIACCESS -+ pci_device_unmap_region(pXGI->PciInfo, 0); -+#else -+ xf86UnMapVidMem(pScrn->scrnIndex, (pointer) pXGIEnt->FbBase, -+ pXGI->FbMapSize); -+#endif -+ pXGIEnt->FbBase = NULL; -+ pXGIEnt->MapCountFbBase = 0; -+ pXGIEnt->forceUnmapFbBase = FALSE; -+ -+ } -+ pXGI->FbBase = NULL; -+ } -+ } -+ else { -+#ifdef XSERVER_LIBPCIACCESS -+ pci_device_unmap_region(pXGI->PciInfo, 0); -+ pci_device_unmap_region(pXGI->PciInfo, 1); -+#else -+ xf86UnMapVidMem(pScrn->scrnIndex, (pointer) pXGI->IOBase, -+ (pXGI->mmioSize * 1024)); -+ xf86UnMapVidMem(pScrn->scrnIndex, (pointer) pXGI->FbBase, -+ pXGI->FbMapSize); -+#endif -+ pXGI->IOBase = NULL; -+ pXGI->FbBase = NULL; -+ -+#ifdef __alpha__ -+#ifdef XSERVER_LIBPCIACCESS -+#error "How to do dense mapping on Alpha?" -+#else -+ xf86UnMapVidMem(pScrn->scrnIndex, (pointer) pXGI->IOBaseDense, -+ (pXGI->mmioSize * 1024)); -+ pXGI->IOBaseDense = NULL; -+#endif -+#endif -+ } -+ -+ return TRUE; -+} -+ -+/* -+ * This function saves the video state. -+ */ -+static void -+XGISave(ScrnInfoPtr pScrn) -+{ -+ XGIPtr pXGI; -+ vgaRegPtr vgaReg; -+ XGIRegPtr xgiReg; -+ -+ PDEBUG(ErrorF("XGISave()\n")); -+ -+ pXGI = XGIPTR(pScrn); -+ -+ /* We always save master & slave */ -+ if (IS_DUAL_HEAD(pXGI) && IS_SECOND_HEAD(pXGI)) -+ return; -+ -+ vgaReg = &VGAHWPTR(pScrn)->SavedReg; -+ xgiReg = &pXGI->SavedReg; -+ -+ vgaHWSave(pScrn, vgaReg, VGA_SR_ALL); -+ -+ xgiSaveUnlockExtRegisterLock(pXGI, &xgiReg->xgiRegs3C4[0x05], -+ &xgiReg->xgiRegs3D4[0x80]); -+ -+ (*pXGI->XGISave) (pScrn, xgiReg); -+ -+ /* "Save" these again as they may have been changed prior to XGISave() call */ -+} -+ -+ -+/* -+ * Initialise a new mode. This is currently done using the -+ * "initialise struct, restore/write struct to HW" model for -+ * the old chipsets (5597/530/6326). For newer chipsets, -+ * we use our own mode switching code (or VESA). -+ */ -+ -+static Bool -+XGIModeInit(ScrnInfoPtr pScrn, DisplayModePtr mode) -+{ -+ vgaHWPtr hwp = VGAHWPTR(pScrn); -+ vgaRegPtr vgaReg; -+ XGIPtr pXGI = XGIPTR(pScrn); -+ XGIRegPtr xgiReg; -+#ifdef __powerpc__ -+ unsigned char tmpval; -+#endif -+ -+ -+ /* PDEBUG(ErrorF("XGIModeInit(). \n")); */ -+ PDEBUG(ErrorF -+ ("XGIModeInit Resolution (%d, %d) \n", mode->HDisplay, -+ mode->VDisplay)); -+ PDEBUG(ErrorF("XGIModeInit VVRefresh (%8.3f) \n", mode->VRefresh)); -+ PDEBUG(ErrorF("XGIModeInit Color Depth (%d) \n", pScrn->depth)); -+ -+ /* Jong Lin 08-26-2005; save current mode */ -+ Volari_SetDefaultIdleWait(pXGI, mode->HDisplay, pScrn->depth); -+ -+ andXGIIDXREG(XGICR, 0x11, 0x7f); /* Unlock CRTC registers */ -+ -+ XGIModifyModeInfo(mode); /* Quick check of the mode parameters */ -+ -+ -+ if (IS_DUAL_HEAD(pXGI)) { -+ XGIEntPtr pXGIEnt = ENTITY_PRIVATE(pXGI); -+ -+ if (!(*pXGI->ModeInit) (pScrn, mode)) { -+ XGIErrorLog(pScrn, "ModeInit() failed\n"); -+ return FALSE; -+ } -+ -+ pScrn->vtSema = TRUE; -+ -+ /* Head 2 (slave) is always CRT1 */ -+ XGIPreSetMode(pScrn, mode, XGI_MODE_CRT1); -+ if (!XGIBIOSSetModeCRT1(pXGI->XGI_Pr, &pXGI->xgi_HwDevExt, pScrn, -+ mode)) { -+ XGIErrorLog(pScrn, "XGIBIOSSetModeCRT1() failed\n"); -+ return FALSE; -+ } -+ XGIPostSetMode(pScrn, &pXGI->ModeReg); -+ XGIAdjustFrame(pXGIEnt->pScrn_1->scrnIndex, pXGIEnt->pScrn_1->frameX0, -+ pXGIEnt->pScrn_1->frameY0, 0); -+ } -+ else -+ { -+ /* For other chipsets, use the old method */ -+ -+ /* Initialise the ModeReg values */ -+ if (!vgaHWInit(pScrn, mode)) { -+ XGIErrorLog(pScrn, "vgaHWInit() failed\n"); -+ return FALSE; -+ } -+ -+ /* Reset our PIOOffset as vgaHWInit might have reset it */ -+ VGAHWPTR(pScrn)->PIOOffset = pXGI->IODBase - 0x380 + -+#ifdef XSERVER_LIBPCIACCESS -+ (pXGI->PciInfo->regions[2].base_addr & 0xFFFC) -+#else -+ (pXGI->PciInfo->ioBase[2] & 0xFFFC) -+#endif -+ ; -+ -+ /* Prepare the register contents */ -+ if (!(*pXGI->ModeInit) (pScrn, mode)) { -+ XGIErrorLog(pScrn, "ModeInit() failed\n"); -+ return FALSE; -+ } -+ -+ pScrn->vtSema = TRUE; -+ -+ /* Program the registers */ -+ vgaHWProtect(pScrn, TRUE); -+ vgaReg = &hwp->ModeReg; -+ xgiReg = &pXGI->ModeReg; -+ -+ vgaReg->Attribute[0x10] = 0x01; -+ if (pScrn->bitsPerPixel > 8) { -+ vgaReg->Graphics[0x05] = 0x00; -+ } -+ -+ vgaHWRestore(pScrn, vgaReg, VGA_SR_MODE); -+ -+ (*pXGI->XGIRestore) (pScrn, xgiReg); -+ -+#ifdef TWDEBUG -+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, -+ "REAL REGISTER CONTENTS AFTER SETMODE:\n"); -+ (*pXGI->ModeInit) (pScrn, mode); -+#endif -+ -+ vgaHWProtect(pScrn, FALSE); -+ } -+ -+ -+ if((pXGI->Chipset == PCI_CHIP_XGIXG40)||(pXGI->Chipset == PCI_CHIP_XGIXG20)||(pXGI->Chipset == PCI_CHIP_XGIXG21)||(pXGI->Chipset == PCI_CHIP_XGIXG27)) -+ { -+ /* PDEBUG(XGIDumpRegs(pScrn)) ; */ -+ PDEBUG(ErrorF(" *** PreSetMode(). \n")); -+ XGIPreSetMode(pScrn, mode, XGI_MODE_SIMU); -+ /* PDEBUG(XGIDumpRegs(pScrn)) ; */ -+ PDEBUG(ErrorF(" *** Start SetMode() \n")); -+ -+ if (!XGIBIOSSetMode(pXGI->XGI_Pr, &pXGI->xgi_HwDevExt, pScrn, mode)) { -+ XGIErrorLog(pScrn, "XGIBIOSSetModeCRT() failed\n"); -+ return FALSE; -+ } -+ Volari_EnableAccelerator(pScrn); -+ /* XGIPostSetMode(pScrn, &pXGI->ModeReg); */ -+ /* outXGIIDXREG(XGISR, 0x20, 0xA1) ; */ -+ /* PDEBUG(XGIDumpRegs(pScrn)) ; */ -+ } -+ -+ /* Update Currentlayout */ -+ pXGI->CurrentLayout.mode = mode; -+ -+#ifdef __powerpc__ -+ inXGIIDXREG(XGICR, 0x4D, tmpval); -+ if (pScrn->depth == 16) -+ tmpval = (tmpval & 0xE0) | 0x0B; //word swap -+ else if (pScrn->depth == 24) -+ tmpval = (tmpval & 0xE0) | 0x15; //dword swap -+ else -+ tmpval = tmpval & 0xE0; // no swap -+ -+ outXGIIDXREG(XGICR, 0x4D, tmpval); -+#endif -+ -+ return TRUE; -+} -+ -+ -+/* -+ * Restore the initial mode. To be used internally only! -+ */ -+static void -+XGIRestore(ScrnInfoPtr pScrn) -+{ -+ XGIPtr pXGI = XGIPTR(pScrn); -+ XGIRegPtr xgiReg = &pXGI->SavedReg; -+ vgaHWPtr hwp = VGAHWPTR(pScrn); -+ vgaRegPtr vgaReg = &hwp->SavedReg; -+ -+ -+ PDEBUG(ErrorF("XGIRestore():\n")); -+ -+ /* Wait for the accelerators */ -+ if (pXGI->AccelInfoPtr) { -+ (*pXGI->AccelInfoPtr->Sync) (pScrn); -+ } -+ -+ vgaHWProtect(pScrn, TRUE); -+ -+#ifdef UNLOCK_ALWAYS -+ xgiSaveUnlockExtRegisterLock(pXGI, NULL, NULL); -+#endif -+ -+ (*pXGI->XGIRestore) (pScrn, xgiReg); -+ -+ /* Jong 11/14/2007; resolve no display of DVI after leaving VT */ -+ /* But there's no int10 for PPC... */ -+ /* XGIRestorePrevMode(pScrn) ; */ -+ /* works but mode is not exactly right because there're more than one mode 0x03 in table XGI330_SModeIDTable[] */ -+ XGISetModeNew( &pXGI->xgi_HwDevExt, pXGI->XGI_Pr, 0x03); -+ -+ vgaHWProtect(pScrn, TRUE); -+ if (pXGI->Primary) { -+ vgaHWRestore(pScrn, vgaReg, VGA_SR_ALL); -+ } -+ -+ xgiRestoreExtRegisterLock(pXGI, xgiReg->xgiRegs3C4[5], -+ xgiReg->xgiRegs3D4[0x80]); -+ vgaHWProtect(pScrn, FALSE); -+} -+ -+ -+/* Our generic BlockHandler for Xv */ -+static void -+XGIBlockHandler(int i, pointer blockData, pointer pTimeout, pointer pReadmask) -+{ -+ ScreenPtr pScreen = screenInfo.screens[i]; -+ ScrnInfoPtr pScrn = xf86Screens[i]; -+ XGIPtr pXGI = XGIPTR(pScrn); -+ -+ pScreen->BlockHandler = pXGI->BlockHandler; -+ (*pScreen->BlockHandler) (i, blockData, pTimeout, pReadmask); -+ pScreen->BlockHandler = XGIBlockHandler; -+ -+ if (pXGI->VideoTimerCallback) { -+ (*pXGI->VideoTimerCallback) (pScrn, currentTime.milliseconds); -+ } -+ -+ if (pXGI->RenderCallback) { -+ (*pXGI->RenderCallback) (pScrn); -+ } -+} -+ -+/* Mandatory -+ * This gets called at the start of each server generation -+ * -+ * We use pScrn and not CurrentLayout here, because the -+ * properties we use have not changed (displayWidth, -+ * depth, bitsPerPixel) -+ */ -+static Bool -+XGIScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) -+{ -+ ScrnInfoPtr pScrn; -+ vgaHWPtr hwp; -+ XGIPtr pXGI; -+ int ret; -+ VisualPtr visual; -+ unsigned long OnScreenSize; -+ int height, width, displayWidth; -+ unsigned char *FBStart; -+ XGIEntPtr pXGIEnt = NULL; -+ -+ ErrorF("XGIScreenInit\n"); -+ pScrn = xf86Screens[pScreen->myNum]; -+ -+ /* Jong 08/30/2007; no virtual screen for all cases */ -+ /* Jong 08/22/2007; support modeline */ -+ /* if(g_CountOfUserDefinedModes > 0) */ -+ { -+ pScrn->virtualX=pScrn->currentMode->HDisplay; -+ pScrn->virtualY=pScrn->currentMode->VDisplay; -+ pScrn->displayWidth=pScrn->currentMode->HDisplay; -+ pScrn->frameX0=0; -+ pScrn->frameY0=0; -+ pScrn->frameX1=pScrn->currentMode->HDisplay-1; -+ pScrn->frameY1=pScrn->currentMode->VDisplay-1; -+ } -+ -+ hwp = VGAHWPTR(pScrn); -+ -+ pXGI = XGIPTR(pScrn); -+ -+#if !defined(__powerpc__) -+ if (!IS_DUAL_HEAD(pXGI) || !IS_SECOND_HEAD(pXGI)) { -+ if (xf86LoadSubModule(pScrn, "vbe")) { -+ xf86LoaderReqSymLists(vbeSymbols, NULL); -+ pXGI->pVbe = VBEExtendedInit(NULL, pXGI->pEnt->index, -+ SET_BIOS_SCRATCH | -+ RESTORE_BIOS_SCRATCH); -+ } -+ else { -+ XGIErrorLog(pScrn, "Failed to load VBE submodule\n"); -+ } -+ } -+#endif /* if !defined(__powerpc__) */ -+ -+ if (IS_DUAL_HEAD(pXGI)) { -+ pXGIEnt = ENTITY_PRIVATE(pXGI); -+ pXGIEnt->refCount++; -+ } -+ -+ /* Map the VGA memory and get the VGA IO base */ -+ if (pXGI->Primary) { -+ hwp->MapSize = 0x10000; /* Standard 64k VGA window */ -+ if (!vgaHWMapMem(pScrn)) { -+ XGIErrorLog(pScrn, "Could not map VGA memory window\n"); -+ return FALSE; -+ } -+ } -+ vgaHWGetIOBase(hwp); -+ -+ /* Patch the PIOOffset inside vgaHW to use -+ * our relocated IO ports. -+ */ -+ VGAHWPTR(pScrn)->PIOOffset = pXGI->IODBase - 0x380 + -+#ifdef XSERVER_LIBPCIACCESS -+ (pXGI->PciInfo->regions[2].base_addr & 0xFFFC) -+#else -+ (pXGI->PciInfo->ioBase[2] & 0xFFFC) -+#endif -+ ; -+ -+ /* Map the XGI memory and MMIO areas */ -+ if (!XGIMapMem(pScrn)) { -+ XGIErrorLog(pScrn, "XGIMapMem() failed\n"); -+ return FALSE; -+ } -+ -+#ifdef UNLOCK_ALWAYS -+ xgiSaveUnlockExtRegisterLock(pXGI, NULL, NULL); -+#endif -+ -+ /* Save the current state */ -+ XGISave(pScrn); -+ -+ -+ PDEBUG(ErrorF("--- ScreenInit --- \n")); -+ PDEBUG(XGIDumpRegs(pScrn)); -+ -+ /* Initialise the first mode */ -+ if (!XGIModeInit(pScrn, pScrn->currentMode)) { -+ XGIErrorLog(pScrn, "XGIModeInit() failed\n"); -+ return FALSE; -+ } -+ -+ PDEBUG(ErrorF("--- XGIModeInit --- \n")); -+ PDEBUG(XGIDumpRegs(pScrn)); -+ -+ /* Darken the screen for aesthetic reasons */ -+ /* Not using Dual Head variant on purpose; we darken -+ * the screen for both displays, and un-darken -+ * it when the second head is finished -+ */ -+ XGISaveScreen(pScreen, SCREEN_SAVER_ON); -+ -+ /* Set the viewport */ -+ XGIAdjustFrame(scrnIndex, pScrn->frameX0, pScrn->frameY0, 0); -+ -+ /* -+ * The next step is to setup the screen's visuals, and initialise the -+ * framebuffer code. In cases where the framebuffer's default -+ * choices for things like visual layouts and bits per RGB are OK, -+ * this may be as simple as calling the framebuffer's ScreenInit() -+ * function. If not, the visuals will need to be setup before calling -+ * a fb ScreenInit() function and fixed up after. -+ * -+ * For most PC hardware at depths >= 8, the defaults that cfb uses -+ * are not appropriate. In this driver, we fixup the visuals after. -+ */ -+ -+ /* -+ * Reset visual list. -+ */ -+ miClearVisualTypes(); -+ -+ /* Setup the visuals we support. */ -+ -+ /* -+ * For bpp > 8, the default visuals are not acceptable because we only -+ * support TrueColor and not DirectColor. -+ */ -+ if (!miSetVisualTypes(pScrn->depth, -+ (pScrn->bitsPerPixel > 8) ? -+ TrueColorMask : miGetDefaultVisualMask(pScrn-> -+ depth), -+ pScrn->rgbBits, pScrn->defaultVisual)) { -+ XGISaveScreen(pScreen, SCREEN_SAVER_OFF); -+ XGIErrorLog(pScrn, "miSetVisualTypes() failed (bpp %d)\n", -+ pScrn->bitsPerPixel); -+ return FALSE; -+ } -+ -+ width = pScrn->virtualX; -+ height = pScrn->virtualY; -+ displayWidth = pScrn->displayWidth; -+ -+ if (pXGI->Rotate) { -+ height = pScrn->virtualX; -+ width = pScrn->virtualY; -+ } -+ -+ if (pXGI->ShadowFB) { -+ pXGI->ShadowPitch = BitmapBytePad(pScrn->bitsPerPixel * width); -+ pXGI->ShadowPtr = xalloc(pXGI->ShadowPitch * height); -+ displayWidth = pXGI->ShadowPitch / (pScrn->bitsPerPixel >> 3); -+ FBStart = pXGI->ShadowPtr; -+ } -+ else { -+ pXGI->ShadowPtr = NULL; -+ FBStart = pXGI->FbBase; -+ } -+ -+ if (!miSetPixmapDepths()) { -+ XGISaveScreen(pScreen, SCREEN_SAVER_OFF); -+ XGIErrorLog(pScrn, "miSetPixmapDepths() failed\n"); -+ return FALSE; -+ } -+ -+ /* Point cmdQueuePtr to pXGIEnt for shared usage -+ * (same technique is then eventually used in DRIScreeninit). -+ */ -+ if (IS_SECOND_HEAD(pXGI)) -+ pXGI->cmdQueueLenPtr = &(XGIPTR(pXGIEnt->pScrn_1)->cmdQueueLen); -+ else -+ pXGI->cmdQueueLenPtr = &(pXGI->cmdQueueLen); -+ -+ pXGI->cmdQueueLen = 0; /* Force an EngineIdle() at start */ -+ -+#ifdef XF86DRI -+ if(pXGI->loadDRI) { -+ /* No DRI in dual head mode */ -+ if (IS_DUAL_HEAD(pXGI)) { -+ pXGI->directRenderingEnabled = FALSE; -+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, -+ "DRI not supported in Dual Head mode\n"); -+ } -+ else if ((pXGI->Chipset == PCI_CHIP_XGIXG20)||(pXGI->Chipset == PCI_CHIP_XGIXG21)||(pXGI->Chipset == PCI_CHIP_XGIXG27)) { -+ PDEBUG(ErrorF("--- DRI not supported \n")); -+ xf86DrvMsg(pScrn->scrnIndex, X_NOT_IMPLEMENTED, -+ "DRI not supported on this chipset\n"); -+ pXGI->directRenderingEnabled = FALSE; -+ } -+ else { -+ pXGI->directRenderingEnabled = XGIDRIScreenInit(pScreen); -+ PDEBUG(ErrorF("--- DRI supported \n")); -+ } -+ } -+#endif -+ -+ /* -+ * Call the framebuffer layer's ScreenInit function, and fill in other -+ * pScreen fields. -+ */ -+ switch (pScrn->bitsPerPixel) { -+ case 24: -+ case 8: -+ case 16: -+ case 32: -+ ret = fbScreenInit(pScreen, FBStart, width, -+ height, pScrn->xDpi, pScrn->yDpi, -+ displayWidth, pScrn->bitsPerPixel); -+ break; -+ default: -+ ret = FALSE; -+ break; -+ } -+ if (!ret) { -+ XGIErrorLog(pScrn, "Unsupported bpp (%d) or fbScreenInit() failed\n", -+ pScrn->bitsPerPixel); -+ XGISaveScreen(pScreen, SCREEN_SAVER_OFF); -+ return FALSE; -+ } -+ -+ if (pScrn->bitsPerPixel > 8) { -+ /* Fixup RGB ordering */ -+ visual = pScreen->visuals + pScreen->numVisuals; -+ while (--visual >= pScreen->visuals) { -+ if ((visual->class | DynamicClass) == DirectColor) { -+ visual->offsetRed = pScrn->offset.red; -+ visual->offsetGreen = pScrn->offset.green; -+ visual->offsetBlue = pScrn->offset.blue; -+ visual->redMask = pScrn->mask.red; -+ visual->greenMask = pScrn->mask.green; -+ visual->blueMask = pScrn->mask.blue; -+ } -+ } -+ } -+ -+ /* Initialize RENDER ext; must be after RGB ordering fixed */ -+ fbPictureInit(pScreen, 0, 0); -+ -+ /* hardware cursor needs to wrap this layer <-- TW: what does that mean? */ -+ if (!pXGI->ShadowFB) -+ XGIDGAInit(pScreen); -+ -+ xf86SetBlackWhitePixels(pScreen); -+ -+ if (!pXGI->NoAccel) { -+ /* Volari_EnableAccelerator(pScrn); */ -+ PDEBUG(ErrorF("---Volari Accel.. \n")); -+ Volari_AccelInit(pScreen); -+ } -+ -+ PDEBUG(ErrorF("--- AccelInit --- \n")); -+ PDEBUG(XGIDumpRegs(pScrn)); -+ -+ miInitializeBackingStore(pScreen); -+ xf86SetBackingStore(pScreen); -+ xf86SetSilkenMouse(pScreen); -+ -+ /* Initialise cursor functions */ -+ miDCInitialize(pScreen, xf86GetPointerScreenFuncs()); -+ -+ if (pXGI->HWCursor) { -+ XGIHWCursorInit(pScreen); -+ } -+ -+ /* Initialise default colourmap */ -+ if (!miCreateDefColormap(pScreen)) { -+ XGISaveScreen(pScreen, SCREEN_SAVER_OFF); -+ XGIErrorLog(pScrn, "miCreateDefColormap() failed\n"); -+ return FALSE; -+ } -+ if (!xf86HandleColormaps -+ (pScreen, 256, (pScrn->depth == 8) ? 8 : pScrn->rgbBits, -+ XGILoadPalette, NULL, -+ CMAP_PALETTED_TRUECOLOR | CMAP_RELOAD_ON_MODE_SWITCH)) { -+ PDEBUG(ErrorF("XGILoadPalette() check-return. \n")); -+ XGISaveScreen(pScreen, SCREEN_SAVER_OFF); -+ XGIErrorLog(pScrn, "xf86HandleColormaps() failed\n"); -+ return FALSE; -+ } -+ -+/* -+ if (!xf86HandleColormaps(pScreen, 256, 8, XGILoadPalette, NULL, -+ CMAP_RELOAD_ON_MODE_SWITCH)) -+ { -+ return FALSE; -+ } -+*/ -+ xf86DPMSInit(pScreen, (DPMSSetProcPtr) XGIDisplayPowerManagementSet, 0); -+ -+ /* Init memPhysBase and fbOffset in pScrn */ -+ pScrn->memPhysBase = pXGI->FbAddress; -+ pScrn->fbOffset = 0; -+ -+ pXGI->ResetXv = pXGI->ResetXvGamma = NULL; -+ -+#if defined(XvExtension) -+ if (!pXGI->NoXvideo) { -+ XGIInitVideo(pScreen); -+ } -+#endif -+ -+#ifdef XF86DRI -+ if (pXGI->directRenderingEnabled) { -+ /* Now that mi, drm and others have done their thing, -+ * complete the DRI setup. -+ */ -+ pXGI->directRenderingEnabled = XGIDRIFinishScreenInit(pScreen); -+ } -+ -+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Direct rendering %sabled\n", -+ (pXGI->directRenderingEnabled) ? "en" : "dis"); -+ if (pXGI->directRenderingEnabled) { -+ /* TODO */ -+ /* XGISetLFBConfig(pXGI); */ -+ } -+#endif -+ -+ /* Wrap some funcs and setup remaining SD flags */ -+ -+ pXGI->XGI_SD_Flags &= ~(XGI_SD_PSEUDOXINERAMA); -+ -+ pXGI->CloseScreen = pScreen->CloseScreen; -+ pScreen->CloseScreen = XGICloseScreen; -+ if (IS_DUAL_HEAD(pXGI)) -+ pScreen->SaveScreen = XGISaveScreenDH; -+ else -+ pScreen->SaveScreen = XGISaveScreen; -+ -+ /* Install BlockHandler */ -+ pXGI->BlockHandler = pScreen->BlockHandler; -+ pScreen->BlockHandler = XGIBlockHandler; -+ -+ /* Report any unused options (only for the first generation) */ -+ if (serverGeneration == 1) { -+ xf86ShowUnusedOptions(pScrn->scrnIndex, pScrn->options); -+ } -+ -+ /* Clear frame buffer */ -+ /* For CRT2, we don't do that at this point in dual head -+ * mode since the mode isn't switched at this time (it will -+ * be reset when setting the CRT1 mode). Hence, we just -+ * save the necessary data and clear the screen when -+ * going through this for CRT1. -+ */ -+ -+ OnScreenSize = pScrn->displayWidth * pScrn->currentMode->VDisplay -+ * (pScrn->bitsPerPixel >> 3); -+ -+ /* Turn on the screen now */ -+ /* We do this in dual head mode after second head is finished */ -+ if (IS_DUAL_HEAD(pXGI)) { -+ if (IS_SECOND_HEAD(pXGI)) { -+ bzero(pXGI->FbBase, OnScreenSize); -+ bzero(pXGIEnt->FbBase1, pXGIEnt->OnScreenSize1); -+ XGISaveScreen(pScreen, SCREEN_SAVER_OFF); -+ } -+ else { -+ pXGIEnt->FbBase1 = pXGI->FbBase; -+ pXGIEnt->OnScreenSize1 = OnScreenSize; -+ } -+ } -+ else { -+ XGISaveScreen(pScreen, SCREEN_SAVER_OFF); -+ bzero(pXGI->FbBase, OnScreenSize); -+ } -+ -+ pXGI->XGI_SD_Flags &= ~XGI_SD_ISDEPTH8; -+ if (pXGI->CurrentLayout.bitsPerPixel == 8) { -+ pXGI->XGI_SD_Flags |= XGI_SD_ISDEPTH8; -+ pXGI->XGI_SD_Flags &= ~XGI_SD_SUPPORTXVGAMMA1; -+ } -+ PDEBUG(ErrorF("XGIScreenInit() End. \n")); -+ PDEBUG(XGIDumpPalette(pScrn)); -+ PDEBUG(XGIDumpRegs(pScrn)); -+ -+ return TRUE; -+} -+ -+/* Usually mandatory */ -+Bool -+XGISwitchMode(int scrnIndex, DisplayModePtr mode, int flags) -+{ -+ ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; -+ XGIPtr pXGI = XGIPTR(pScrn); -+ -+ ErrorF("XGISwitchMode\n"); -+ -+ if (!pXGI->NoAccel) { -+ if (pXGI->AccelInfoPtr) { -+ (*pXGI->AccelInfoPtr->Sync) (pScrn); -+ PDEBUG(ErrorF("XGISwitchMode Accel Enabled. \n")); -+ } -+ } -+ PDEBUG(ErrorF -+ ("XGISwitchMode (%d, %d) \n", mode->HDisplay, mode->VDisplay)); -+ -+ if (!(XGIModeInit(xf86Screens[scrnIndex], mode))) -+ return FALSE; -+ -+ /* Since RandR (indirectly) uses SwitchMode(), we need to -+ * update our Xinerama info here, too, in case of resizing -+ */ -+ return TRUE; -+} -+ -+/* static void -+XGISetStartAddressCRT1(XGIPtr pXGI, unsigned long base) -+{ -+ unsigned char cr11backup; -+ -+ inXGIIDXREG(XGICR, 0x11, cr11backup); -+ andXGIIDXREG(XGICR, 0x11, 0x7F); -+ outXGIIDXREG(XGICR, 0x0D, base & 0xFF); -+ outXGIIDXREG(XGICR, 0x0C, (base >> 8) & 0xFF); -+ outXGIIDXREG(XGISR, 0x0D, (base >> 16) & 0xFF); -+ -+ -+ setXGIIDXREG(XGICR, 0x11, 0x7F,(cr11backup & 0x80)); -+} */ -+ -+#ifdef XGIMERGED -+/* static Bool -+InRegion(int x, int y, region r) -+{ -+ return (r.x0 <= x) && (x <= r.x1) && (r.y0 <= y) && (y <= r.y1); -+} */ -+ -+/* static void -+XGIAdjustFrameHW_CRT1(ScrnInfoPtr pScrn, int x, int y) -+{ -+ XGIPtr pXGI = XGIPTR(pScrn); -+ unsigned long base; -+ -+ base = y * pXGI->CurrentLayout.displayWidth + x; -+ switch(pXGI->CurrentLayout.bitsPerPixel) -+ { -+ case 16: base >>= 1; break; -+ case 32: break; -+ default: base >>= 2; -+ } -+ XGISetStartAddressCRT1(pXGI, base); -+} */ -+ -+/* static void -+XGIMergePointerMoved(int scrnIndex, int x, int y) -+{ -+ ScrnInfoPtr pScrn1 = xf86Screens[scrnIndex]; -+ XGIPtr pXGI = XGIPTR(pScrn1); -+ ScrnInfoPtr pScrn2 = pXGI->CRT2pScrn; -+ region out, in1, in2, f2, f1; -+ int deltax, deltay; -+ -+ f1.x0 = pXGI->CRT1frameX0; -+ f1.x1 = pXGI->CRT1frameX1; -+ f1.y0 = pXGI->CRT1frameY0; -+ f1.y1 = pXGI->CRT1frameY1; -+ f2.x0 = pScrn2->frameX0; -+ f2.x1 = pScrn2->frameX1; -+ f2.y0 = pScrn2->frameY0; -+ f2.y1 = pScrn2->frameY1; -+ -+ out.x0 = pScrn1->frameX0; -+ out.x1 = pScrn1->frameX1; -+ out.y0 = pScrn1->frameY0; -+ out.y1 = pScrn1->frameY1; -+ -+ in1 = out; -+ in2 = out; -+ switch(((XGIMergedDisplayModePtr)pXGI->CurrentLayout.mode->Private)->CRT2Position) -+ { -+ case xgiLeftOf: -+ in1.x0 = f1.x0; -+ in2.x1 = f2.x1; -+ break; -+ case xgiRightOf: -+ in1.x1 = f1.x1; -+ in2.x0 = f2.x0; -+ break; -+ case xgiBelow: -+ in1.y1 = f1.y1; -+ in2.y0 = f2.y0; -+ break; -+ case xgiAbove: -+ in1.y0 = f1.y0; -+ in2.y1 = f2.y1; -+ break; -+ case xgiClone: -+ break; -+ } -+ -+ deltay = 0; -+ deltax = 0; -+ -+ if(InRegion(x, y, out)) -+ { -+ -+ if(InRegion(x, y, in1) && !InRegion(x, y, f1)) -+ { -+ REBOUND(f1.x0, f1.x1, x); -+ REBOUND(f1.y0, f1.y1, y); -+ deltax = 1; -+ } -+ if(InRegion(x, y, in2) && !InRegion(x, y, f2)) -+ { -+ REBOUND(f2.x0, f2.x1, x); -+ REBOUND(f2.y0, f2.y1, y); -+ deltax = 1; -+ } -+ -+ } -+ else -+ { -+ -+ if(out.x0 > x) -+ { -+ deltax = x - out.x0; -+ } -+ if(out.x1 < x) -+ { -+ deltax = x - out.x1; -+ } -+ if(deltax) -+ { -+ pScrn1->frameX0 += deltax; -+ pScrn1->frameX1 += deltax; -+ f1.x0 += deltax; -+ f1.x1 += deltax; -+ f2.x0 += deltax; -+ f2.x1 += deltax; -+ } -+ -+ if(out.y0 > y) -+ { -+ deltay = y - out.y0; -+ } -+ if(out.y1 < y) -+ { -+ deltay = y - out.y1; -+ } -+ if(deltay) -+ { -+ pScrn1->frameY0 += deltay; -+ pScrn1->frameY1 += deltay; -+ f1.y0 += deltay; -+ f1.y1 += deltay; -+ f2.y0 += deltay; -+ f2.y1 += deltay; -+ } -+ -+ switch(((XGIMergedDisplayModePtr)pXGI->CurrentLayout.mode->Private)->CRT2Position) -+ { -+ case xgiLeftOf: -+ if(x >= f1.x0) -+ { REBOUND(f1.y0, f1.y1, y); } -+ if(x <= f2.x1) -+ { REBOUND(f2.y0, f2.y1, y); } -+ break; -+ case xgiRightOf: -+ if(x <= f1.x1) -+ { REBOUND(f1.y0, f1.y1, y); } -+ if(x >= f2.x0) -+ { REBOUND(f2.y0, f2.y1, y); } -+ break; -+ case xgiBelow: -+ if(y <= f1.y1) -+ { REBOUND(f1.x0, f1.x1, x); } -+ if(y >= f2.y0) -+ { REBOUND(f2.x0, f2.x1, x); } -+ break; -+ case xgiAbove: -+ if(y >= f1.y0) -+ { REBOUND(f1.x0, f1.x1, x); } -+ if(y <= f2.y1) -+ { REBOUND(f2.x0, f2.x1, x); } -+ break; -+ case xgiClone: -+ break; -+ } -+ -+ } -+ -+ if(deltax || deltay) -+ { -+ pXGI->CRT1frameX0 = f1.x0; -+ pXGI->CRT1frameY0 = f1.y0; -+ pScrn2->frameX0 = f2.x0; -+ pScrn2->frameY0 = f2.y0; -+ -+ pXGI->CRT1frameX1 = pXGI->CRT1frameX0 + CDMPTR->CRT1->HDisplay - 1; -+ pXGI->CRT1frameY1 = pXGI->CRT1frameY0 + CDMPTR->CRT1->VDisplay - 1; -+ pScrn2->frameX1 = pScrn2->frameX0 + CDMPTR->CRT2->HDisplay - 1; -+ pScrn2->frameY1 = pScrn2->frameY0 + CDMPTR->CRT2->VDisplay - 1; -+ pScrn1->frameX1 = pScrn1->frameX0 + pXGI->CurrentLayout.mode->HDisplay - 1; -+ pScrn1->frameY1 = pScrn1->frameY0 + pXGI->CurrentLayout.mode->VDisplay - 1; -+ -+ XGIAdjustFrameHW_CRT1(pScrn1, pXGI->CRT1frameX0, pXGI->CRT1frameY0); -+ } -+} */ -+ -+ -+/* static void -+XGIAdjustFrameMerged(int scrnIndex, int x, int y, int flags) -+{ -+ ScrnInfoPtr pScrn1 = xf86Screens[scrnIndex]; -+ XGIPtr pXGI = XGIPTR(pScrn1); -+ ScrnInfoPtr pScrn2 = pXGI->CRT2pScrn; -+ int VTotal = pXGI->CurrentLayout.mode->VDisplay; -+ int HTotal = pXGI->CurrentLayout.mode->HDisplay; -+ int VMax = VTotal; -+ int HMax = HTotal; -+ -+ BOUND(x, 0, pScrn1->virtualX - HTotal); -+ BOUND(y, 0, pScrn1->virtualY - VTotal); -+ -+ switch(SDMPTR(pScrn1)->CRT2Position) -+ { -+ case xgiLeftOf: -+ pScrn2->frameX0 = x; -+ BOUND(pScrn2->frameY0, y, y + VMax - CDMPTR->CRT2->VDisplay); -+ pXGI->CRT1frameX0 = x + CDMPTR->CRT2->HDisplay; -+ BOUND(pXGI->CRT1frameY0, y, y + VMax - CDMPTR->CRT1->VDisplay); -+ break; -+ case xgiRightOf: -+ pXGI->CRT1frameX0 = x; -+ BOUND(pXGI->CRT1frameY0, y, y + VMax - CDMPTR->CRT1->VDisplay); -+ pScrn2->frameX0 = x + CDMPTR->CRT1->HDisplay; -+ BOUND(pScrn2->frameY0, y, y + VMax - CDMPTR->CRT2->VDisplay); -+ break; -+ case xgiAbove: -+ BOUND(pScrn2->frameX0, x, x + HMax - CDMPTR->CRT2->HDisplay); -+ pScrn2->frameY0 = y; -+ BOUND(pXGI->CRT1frameX0, x, x + HMax - CDMPTR->CRT1->HDisplay); -+ pXGI->CRT1frameY0 = y + CDMPTR->CRT2->VDisplay; -+ break; -+ case xgiBelow: -+ BOUND(pXGI->CRT1frameX0, x, x + HMax - CDMPTR->CRT1->HDisplay); -+ pXGI->CRT1frameY0 = y; -+ BOUND(pScrn2->frameX0, x, x + HMax - CDMPTR->CRT2->HDisplay); -+ pScrn2->frameY0 = y + CDMPTR->CRT1->VDisplay; -+ break; -+ case xgiClone: -+ BOUND(pXGI->CRT1frameX0, x, x + HMax - CDMPTR->CRT1->HDisplay); -+ BOUND(pXGI->CRT1frameY0, y, y + VMax - CDMPTR->CRT1->VDisplay); -+ BOUND(pScrn2->frameX0, x, x + HMax - CDMPTR->CRT2->HDisplay); -+ BOUND(pScrn2->frameY0, y, y + VMax - CDMPTR->CRT2->VDisplay); -+ break; -+ } -+ -+ BOUND(pXGI->CRT1frameX0, 0, pScrn1->virtualX - CDMPTR->CRT1->HDisplay); -+ BOUND(pXGI->CRT1frameY0, 0, pScrn1->virtualY - CDMPTR->CRT1->VDisplay); -+ BOUND(pScrn2->frameX0, 0, pScrn1->virtualX - CDMPTR->CRT2->HDisplay); -+ BOUND(pScrn2->frameY0, 0, pScrn1->virtualY - CDMPTR->CRT2->VDisplay); -+ -+ pScrn1->frameX0 = x; -+ pScrn1->frameY0 = y; -+ -+ pXGI->CRT1frameX1 = pXGI->CRT1frameX0 + CDMPTR->CRT1->HDisplay - 1; -+ pXGI->CRT1frameY1 = pXGI->CRT1frameY0 + CDMPTR->CRT1->VDisplay - 1; -+ pScrn2->frameX1 = pScrn2->frameX0 + CDMPTR->CRT2->HDisplay - 1; -+ pScrn2->frameY1 = pScrn2->frameY0 + CDMPTR->CRT2->VDisplay - 1; -+ pScrn1->frameX1 = pScrn1->frameX0 + pXGI->CurrentLayout.mode->HDisplay - 1; -+ pScrn1->frameY1 = pScrn1->frameY0 + pXGI->CurrentLayout.mode->VDisplay - 1; -+ -+ XGIAdjustFrameHW_CRT1(pScrn1, pXGI->CRT1frameX0, pXGI->CRT1frameY0); -+} */ -+#endif -+ -+/* -+ * This function is used to initialize the Start Address - the first -+ * displayed location in the video memory. -+ * -+ * Usually mandatory -+ */ -+void -+XGIAdjustFrame(int scrnIndex, int x, int y, int flags) -+{ -+ ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; -+ XGIPtr pXGI = XGIPTR(pScrn); -+ unsigned long base; -+ unsigned char ucSR5Stat, ucTemp; -+ -+ ErrorF("AdjustFrame %d\n", scrnIndex); -+ inXGIIDXREG(XGISR, 0x05, ucSR5Stat); -+ if (ucSR5Stat == 0xA1) -+ ucSR5Stat = 0x86; -+ outXGIIDXREG(XGISR, 0x05, 0x86); -+ -+ base = (pScrn->bitsPerPixel + 7) / 8; -+ base *= x; -+ base += pXGI->scrnOffset * y; -+ base >>= 2; -+ -+ switch (pXGI->Chipset) { -+ case PCI_CHIP_XGIXG40: -+ case PCI_CHIP_XGIXG20: -+ case PCI_CHIP_XGIXG21: -+ case PCI_CHIP_XGIXG27: -+ default: -+ -+ ucTemp = base & 0xFF; -+ outXGIIDXREG(XGICR, 0x0D, ucTemp); -+ ucTemp = (base >> 8) & 0xFF; -+ outXGIIDXREG(XGICR, 0x0C, ucTemp); -+ ucTemp = (base >> 16) & 0xFF; -+ outXGIIDXREG(XGISR, 0x0D, ucTemp); -+ ucTemp = (base >> 24) & 0x01; -+ setXGIIDXREG(XGISR, 0x37, 0xFE, ucTemp); -+ -+/* if (pXGI->VBFlags) { -+ XGI_UnLockCRT2(&(pXGI->xgi_HwDevExt),pXGI->pVBInfo); -+ ucTemp = base & 0xFF ; outXGIIDXREG( XGIPART1, 6 , ucTemp ) ; -+ ucTemp = (base>>8) & 0xFF ; outXGIIDXREG( XGIPART1, 5 , ucTemp ) ; -+ ucTemp = (base>>16) & 0xFF ; outXGIIDXREG( XGIPART1, 4 , ucTemp ) ; -+ ucTemp = (base>>24) & 0x01 ; ucTemp <<= 7 ; -+ setXGIIDXREG( XGIPART1, 0x2, 0x7F, ucTemp ) ; -+ -+ XGI_LockCRT2(&(pXGI->xgi_HwDevExt),pXGI->pVBInfo); -+ } -+ */ -+ break; -+ -+ } -+ -+ outXGIIDXREG(XGISR, 0x05, ucSR5Stat); -+ -+} -+ -+/* -+ * This is called when VT switching back to the X server. Its job is -+ * to reinitialise the video mode. -+ * Mandatory! -+ */ -+static Bool -+XGIEnterVT(int scrnIndex, int flags) -+{ -+ ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; -+ XGIPtr pXGI = XGIPTR(pScrn); -+ -+ xgiSaveUnlockExtRegisterLock(pXGI, NULL, NULL); -+ -+ if (!XGIModeInit(pScrn, pScrn->currentMode)) { -+ XGIErrorLog(pScrn, "XGIEnterVT: XGIModeInit() failed\n"); -+ return FALSE; -+ } -+ -+ XGIAdjustFrame(scrnIndex, pScrn->frameX0, pScrn->frameY0, 0); -+ -+#ifdef XF86DRI -+ if (pXGI->directRenderingEnabled) { -+ DRIUnlock(screenInfo.screens[scrnIndex]); -+ } -+#endif -+ -+ if ((!IS_DUAL_HEAD(pXGI) || !IS_SECOND_HEAD(pXGI)) && (pXGI->ResetXv)) { -+ (pXGI->ResetXv) (pScrn); -+ } -+ -+ return TRUE; -+} -+ -+/* -+ * This is called when VT switching away from the X server. Its job is -+ * to restore the previous (text) mode. -+ * Mandatory! -+ */ -+static void -+XGILeaveVT(int scrnIndex, int flags) -+{ -+ ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; -+ vgaHWPtr hwp = VGAHWPTR(pScrn); -+ XGIPtr pXGI = XGIPTR(pScrn); -+#ifdef XF86DRI -+ ScreenPtr pScreen; -+ -+ PDEBUG(ErrorF("XGILeaveVT()\n")); -+ if (pXGI->directRenderingEnabled) { -+ pScreen = screenInfo.screens[scrnIndex]; -+ DRILock(pScreen, 0); -+ } -+#endif -+ -+ if (IS_DUAL_HEAD(pXGI) && IS_SECOND_HEAD(pXGI)) -+ return; -+ -+ if (pXGI->CursorInfoPtr) { -+ /* Because of the test and return above, we know that this is not -+ * the second head. -+ */ -+ pXGI->CursorInfoPtr->HideCursor(pScrn); -+ XGI_WaitBeginRetrace(pXGI->RelIO); -+ } -+ -+ XGIRestore(pScrn); -+ -+ -+ /* We use (otherwise unused) bit 7 to indicate that we are running to keep -+ * xgifb to change the displaymode (this would result in lethal display -+ * corruption upon quitting X or changing to a VT until a reboot). -+ */ -+ vgaHWLock(hwp); -+} -+ -+ -+/* -+ * This is called at the end of each server generation. It restores the -+ * original (text) mode. It should really also unmap the video memory too. -+ * Mandatory! -+ */ -+static Bool -+XGICloseScreen(int scrnIndex, ScreenPtr pScreen) -+{ -+ ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; -+ vgaHWPtr hwp = VGAHWPTR(pScrn); -+ XGIPtr pXGI = XGIPTR(pScrn); -+ -+ -+#ifdef XF86DRI -+ if (pXGI->directRenderingEnabled) { -+ XGIDRICloseScreen(pScreen); -+ pXGI->directRenderingEnabled = FALSE; -+ } -+#endif -+ -+ if (pScrn->vtSema) { -+ if (pXGI->CursorInfoPtr -+ && (!IS_DUAL_HEAD(pXGI) || !IS_SECOND_HEAD(pXGI))) { -+ pXGI->CursorInfoPtr->HideCursor(pScrn); -+ XGI_WaitBeginRetrace(pXGI->RelIO); -+ } -+ -+ -+ XGIRestore(pScrn); -+ vgaHWLock(hwp); -+ } -+ -+ /* We should restore the mode number in case vtsema = false as well, -+ * but since we haven't register access then we can't do it. I think -+ * I need to rework the save/restore stuff, like saving the video -+ * status when returning to the X server and by that save me the -+ * trouble if xgifb was started from a textmode VT while X was on. -+ */ -+ -+ XGIUnmapMem(pScrn); -+ vgaHWUnmapMem(pScrn); -+ -+ if (IS_DUAL_HEAD(pXGI)) { -+ XGIEntPtr pXGIEnt = ENTITY_PRIVATE(pXGI); -+ pXGIEnt->refCount--; -+ } -+ -+ if (pXGI->pInt) { -+ xf86FreeInt10(pXGI->pInt); -+ pXGI->pInt = NULL; -+ } -+ -+ if (pXGI->AccelLinearScratch) { -+ xf86FreeOffscreenLinear(pXGI->AccelLinearScratch); -+ pXGI->AccelLinearScratch = NULL; -+ } -+ -+ if (pXGI->AccelInfoPtr) { -+ XAADestroyInfoRec(pXGI->AccelInfoPtr); -+ pXGI->AccelInfoPtr = NULL; -+ } -+ -+ if (pXGI->CursorInfoPtr) { -+ xf86DestroyCursorInfoRec(pXGI->CursorInfoPtr); -+ pXGI->CursorInfoPtr = NULL; -+ } -+ -+ if (pXGI->ShadowPtr) { -+ xfree(pXGI->ShadowPtr); -+ pXGI->ShadowPtr = NULL; -+ } -+ -+ if (pXGI->DGAModes) { -+ xfree(pXGI->DGAModes); -+ pXGI->DGAModes = NULL; -+ } -+ -+ if (pXGI->adaptor) { -+ xfree(pXGI->adaptor); -+ pXGI->adaptor = NULL; -+ pXGI->ResetXv = pXGI->ResetXvGamma = NULL; -+ } -+ -+ pScrn->vtSema = FALSE; -+ -+ /* Restore Blockhandler */ -+ pScreen->BlockHandler = pXGI->BlockHandler; -+ -+ pScreen->CloseScreen = pXGI->CloseScreen; -+ -+ return (*pScreen->CloseScreen) (scrnIndex, pScreen); -+} -+ -+ -+/* Free up any per-generation data structures */ -+ -+/* Optional */ -+static void -+XGIFreeScreen(int scrnIndex, int flags) -+{ -+ if (xf86LoaderCheckSymbol("vgaHWFreeHWRec")) { -+ vgaHWFreeHWRec(xf86Screens[scrnIndex]); -+ } -+ -+ XGIFreeRec(xf86Screens[scrnIndex]); -+} -+ -+ -+/* Checks if a mode is suitable for the selected chipset. */ -+ -+static int -+XGIValidMode(int scrnIndex, DisplayModePtr mode, Bool verbose, int flags) -+{ -+ ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; -+ XGIPtr pXGI = XGIPTR(pScrn); -+ int HDisplay = mode->HDisplay; -+ int VDisplay = mode->VDisplay; -+ int Clock = mode->Clock; -+ int i = 0; -+ int VRefresh; -+ -+ VRefresh = -+ (int) ((float) (Clock * 1000) / -+ (float) (mode->VTotal * mode->HTotal) + 0.5); -+ -+ /* Jong 08/21/2007; support modeline */ -+ /* We skip mode checking here and need improvement further */ -+ if(mode->type == M_T_USERDEF) -+ return(MODE_OK); -+ -+ PDEBUG5(ErrorF("XGIValidMode().")); -+ PDEBUG5(ErrorF -+ ("CLK=%5.3fMhz %dx%d@%d ", (float) Clock / 1000, HDisplay, -+ VDisplay, VRefresh)); -+ PDEBUG5(ErrorF("(VT,HT)=(%d,%d)\n", mode->VTotal, mode->HTotal)); -+ -+ if (pXGI->VBFlags & CRT2_LCD) { -+ if ((HDisplay > 1600 && VDisplay > 1200) -+ || (HDisplay < 640 && VDisplay < 480)) { -+ PDEBUG5(ErrorF("skip by LCD limit\n")); -+ return (MODE_NOMODE); -+ } -+ /* if( VRefresh != 60) return(MODE_NOMODE) ; */ -+ } -+ else if (pXGI->VBFlags & CRT2_TV) { -+ if ((HDisplay > 1024 && VDisplay > 768) || -+ (HDisplay < 640 && VDisplay < 480) || (VRefresh != 60)) { -+ PDEBUG5(ErrorF("skip by TV limit\n")); -+ return (MODE_NOMODE); -+ } -+ } -+ else if (pXGI->VBFlags & CRT2_VGA) { -+ if ((HDisplay > 1600 && VDisplay > 1200) || -+ (HDisplay < 640 && VDisplay < 480)) { -+ PDEBUG5(ErrorF("skip by CRT2 limit\n")); -+ return (MODE_NOMODE); -+ } -+ } -+ -+ if ((pXGI->Chipset == PCI_CHIP_XGIXG20) ||(pXGI->Chipset == PCI_CHIP_XGIXG21) ||( pXGI->Chipset == PCI_CHIP_XGIXG27 )) { -+ XgiMode = XG20_Mode; -+ } -+ else { -+ XgiMode = XGI_Mode; -+ } -+ -+ while ((XgiMode[i].Clock != Clock) || -+ (XgiMode[i].HDisplay != HDisplay) || -+ (XgiMode[i].VDisplay != VDisplay)) { -+ if (XgiMode[i].Clock == 0) { -+ PDEBUG5(ErrorF -+ ("--- NO_Mode support for %dx%d@%dHz\n", HDisplay, -+ VDisplay, VRefresh)); -+ return (MODE_NOMODE); -+ } -+ else -+ i++; -+ } -+ PDEBUG5(ErrorF("Mode OK\n")); -+ -+ /* Jong 12/05/2007; filter mode of CRT1 with CRT2 DDC for XG21 */ -+ if(g_pMonitorDVI) -+ { -+ if(XGICheckModeByDDC(mode, g_pMonitorDVI) == FALSE) -+ return (MODE_NOMODE); -+ } -+ -+ return (MODE_OK); -+} -+ -+/* Do screen blanking -+ * -+ * Mandatory -+ */ -+static Bool -+XGISaveScreen(ScreenPtr pScreen, int mode) -+{ -+ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; -+ -+ if ((pScrn != NULL) && pScrn->vtSema) { -+ -+ XGIPtr pXGI = XGIPTR(pScrn); -+ -+#ifdef UNLOCK_ALWAYS -+ xgiSaveUnlockExtRegisterLock(pXGI, NULL, NULL); -+#endif -+ } -+ -+ return vgaHWSaveScreen(pScreen, mode); -+} -+ -+/* SaveScreen for dual head mode */ -+static Bool -+XGISaveScreenDH(ScreenPtr pScreen, int mode) -+{ -+#ifdef XGIDUALHEAD -+ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; -+ -+ if ((pScrn != NULL) && pScrn->vtSema) { -+ XGIPtr pXGI = XGIPTR(pScrn); -+ -+ if (IS_SECOND_HEAD(pXGI) -+ && ((!(pXGI->VBFlags & CRT1_LCDA)) -+ || (pXGI->XGI_Pr->VBType & VB_XGI301C))) { -+ -+ /* Slave head is always CRT1 */ -+ if (pXGI->VBFlags & CRT1_LCDA) -+ pXGI->Blank = xf86IsUnblank(mode) ? FALSE : TRUE; -+ -+ return vgaHWSaveScreen(pScreen, mode); -+ } -+ else { -+ /* Master head is always CRT2 */ -+ /* But we land here if CRT1 is LCDA, too */ -+ -+ /* We can only blank LCD, not other CRT2 devices */ -+ if (!(pXGI->VBFlags & (CRT2_LCD | CRT1_LCDA))) -+ return TRUE; -+ -+ /* enable access to extended sequencer registers */ -+#ifdef UNLOCK_ALWAYS -+ xgiSaveUnlockExtRegisterLock(pXGI, NULL, NULL); -+#endif -+ } -+ } -+#endif -+ return TRUE; -+} -+ -+#ifdef DEBUG -+static void -+XGIDumpModeInfo(ScrnInfoPtr pScrn, DisplayModePtr mode) -+{ -+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Clock : %x\n", mode->Clock); -+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Hz Display : %x\n", -+ mode->CrtcHDisplay); -+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Hz Blank Start : %x\n", -+ mode->CrtcHBlankStart); -+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Hz Sync Start : %x\n", -+ mode->CrtcHSyncStart); -+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Hz Sync End : %x\n", -+ mode->CrtcHSyncEnd); -+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Hz Blank End : %x\n", -+ mode->CrtcHBlankEnd); -+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Hz Total : %x\n", mode->CrtcHTotal); -+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Hz Skew : %x\n", mode->CrtcHSkew); -+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Hz HAdjusted : %x\n", -+ mode->CrtcHAdjusted); -+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Vt Display : %x\n", -+ mode->CrtcVDisplay); -+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Vt Blank Start : %x\n", -+ mode->CrtcVBlankStart); -+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Vt Sync Start : %x\n", -+ mode->CrtcVSyncStart); -+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Vt Sync End : %x\n", -+ mode->CrtcVSyncEnd); -+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Vt Blank End : %x\n", -+ mode->CrtcVBlankEnd); -+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Vt Total : %x\n", mode->CrtcVTotal); -+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Vt VAdjusted : %x\n", -+ mode->CrtcVAdjusted); -+} -+#endif -+ -+static void -+XGIModifyModeInfo(DisplayModePtr mode) -+{ -+ if (mode->CrtcHBlankStart == mode->CrtcHDisplay) -+ mode->CrtcHBlankStart++; -+ if (mode->CrtcHBlankEnd == mode->CrtcHTotal) -+ mode->CrtcHBlankEnd--; -+ if (mode->CrtcVBlankStart == mode->CrtcVDisplay) -+ mode->CrtcVBlankStart++; -+ if (mode->CrtcVBlankEnd == mode->CrtcVTotal) -+ mode->CrtcVBlankEnd--; -+} -+ -+/* Things to do before a ModeSwitch. We set up the -+ * video bridge configuration and the TurboQueue. -+ */ -+void -+XGIPreSetMode(ScrnInfoPtr pScrn, DisplayModePtr mode, int viewmode) -+{ -+ XGIPtr pXGI = XGIPTR(pScrn); -+ unsigned char CR30, CR31, CR33; -+ unsigned char CR3B = 0; -+ unsigned char CR17, CR38 = 0; -+ unsigned char CR35 = 0, CR79 = 0; -+ unsigned long vbflag; -+ int temp = 0; -+ int crt1rateindex = 0; -+ DisplayModePtr mymode; -+#ifdef XGIMERGED -+ DisplayModePtr mymode2 = NULL; -+#endif -+ -+#ifdef XGIMERGED -+ if (pXGI->MergedFB) { -+ mymode = ((XGIMergedDisplayModePtr) mode->Private)->CRT1; -+ mymode2 = ((XGIMergedDisplayModePtr) mode->Private)->CRT2; -+ } -+ else -+#endif -+ mymode = mode; -+ -+ vbflag = pXGI->VBFlags; -+ PDEBUG(ErrorF("VBFlags=0x%lx\n", pXGI->VBFlags)); -+ -+#ifdef UNLOCK_ALWAYS -+ xgiSaveUnlockExtRegisterLock(pXGI, NULL, NULL); /* Unlock Registers */ -+#endif -+ -+ inXGIIDXREG(XGICR, 0x30, CR30); -+ inXGIIDXREG(XGICR, 0x31, CR31); -+ inXGIIDXREG(XGICR, 0x33, CR33); -+ -+ inXGIIDXREG(XGICR, 0x3b, CR3B); -+ xf86DrvMsgVerb(pScrn->scrnIndex, X_PROBED, 4, -+ "Before: CR30=0x%02x, CR31=0x%02x, CR33=0x%02x, CR%02x=0x%02x\n", -+ CR30, CR31, CR33, temp, CR38); -+ -+ xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 4, "VBFlags=0x%lx\n", -+ pXGI->VBFlags); -+ -+ CR30 = 0x00; -+ CR31 &= ~0x60; /* Clear VB_Drivermode & VB_OutputDisable */ -+ CR31 |= 0x04; /* Set VB_NotSimuMode (not for 30xB/1400x1050?) */ -+ CR35 = 0x00; -+ -+ -+ if (!pXGI->AllowHotkey) { -+ CR31 |= 0x80; /* Disable hotkey-switch */ -+ } -+ CR79 &= ~0x10; /* Enable Backlight control on 315 series */ -+ -+ -+ if ((vbflag & CRT1_LCDA) && (viewmode == XGI_MODE_CRT1)) { -+ -+ CR38 |= 0x02; -+ -+ } -+ else { -+ -+ switch (vbflag & (CRT2_TV | CRT2_LCD | CRT2_VGA)) { -+ -+ case CRT2_TV: -+ -+ CR38 &= ~0xC0; /* Clear Pal M/N bits */ -+ -+ if (vbflag & TV_YPBPR) { /* Video bridge */ -+ if (pXGI->XGI_SD_Flags & XGI_SD_SUPPORTYPBPR) { -+ CR30 |= 0x80; -+ CR38 |= 0x08; -+ if (vbflag & TV_YPBPR525P) -+ CR38 |= 0x10; -+ else if (vbflag & TV_YPBPR750P) -+ CR38 |= 0x20; -+ else if (vbflag & TV_YPBPR1080I) -+ CR38 |= 0x30; -+ CR31 &= ~0x01; -+ if (pXGI->XGI_SD_Flags & XGI_SD_SUPPORTYPBPRAR) { -+ CR3B &= ~0x03; -+ if ((vbflag & TV_YPBPRAR) == TV_YPBPR43LB) -+ CR3B |= 0x00; -+ else if ((vbflag & TV_YPBPRAR) == TV_YPBPR43) -+ CR3B |= 0x03; -+ else if ((vbflag & TV_YPBPRAR) == TV_YPBPR169) -+ CR3B |= 0x01; -+ else -+ CR3B |= 0x03; -+ } -+ } -+ } -+ else { /* All */ -+ if (vbflag & TV_SCART) -+ CR30 |= 0x10; -+ if (vbflag & TV_SVIDEO) -+ CR30 |= 0x08; -+ if (vbflag & TV_AVIDEO) -+ CR30 |= 0x04; -+ if (!(CR30 & 0x1C)) -+ CR30 |= 0x08; /* default: SVIDEO */ -+ -+ if (vbflag & TV_PAL) { -+ CR31 |= 0x01; -+ CR35 |= 0x01; -+ if (pXGI->XGI_Pr->VBType & VB_XGIVB) { -+ if (vbflag & TV_PALM) { -+ CR38 |= 0x40; -+ CR35 |= 0x04; -+ } -+ else if (vbflag & TV_PALN) { -+ CR38 |= 0x80; -+ CR35 |= 0x08; -+ } -+ } -+ } -+ else { -+ CR31 &= ~0x01; -+ CR35 &= ~0x01; -+ if (vbflag & TV_NTSCJ) { -+ CR38 |= 0x40; /* TW, not BIOS */ -+ CR35 |= 0x02; -+ } -+ } -+ if (vbflag & TV_SCART) { -+ CR31 |= 0x01; -+ CR35 |= 0x01; -+ } -+ } -+ -+ CR31 &= ~0x04; /* Clear NotSimuMode */ -+#ifdef XGI_CP -+ XGI_CP_DRIVER_CONFIG -+#endif -+ break; -+ -+ case CRT2_LCD: -+ CR30 |= 0x20; -+ break; -+ -+ case CRT2_VGA: -+ CR30 |= 0x40; -+ break; -+ -+ default: -+ CR30 |= 0x00; -+ CR31 |= 0x20; /* VB_OUTPUT_DISABLE */ -+ } -+ -+ } -+ -+ if (vbflag & CRT1_LCDA) { -+ switch (viewmode) { -+ case XGI_MODE_CRT1: -+ CR38 |= 0x01; -+ break; -+ case XGI_MODE_CRT2: -+ if (vbflag & (CRT2_TV | CRT2_VGA)) { -+ CR30 |= 0x02; -+ CR38 |= 0x01; -+ } -+ else { -+ CR38 |= 0x03; -+ } -+ break; -+ case XGI_MODE_SIMU: -+ default: -+ if (vbflag & (CRT2_TV | CRT2_LCD | CRT2_VGA)) { -+ CR30 |= 0x01; -+ } -+ break; -+ } -+ } -+ else { -+ if (vbflag & (CRT2_TV | CRT2_LCD | CRT2_VGA)) { -+ CR30 |= 0x01; -+ } -+ } -+ -+ CR31 |= 0x40; /* Set Drivermode */ -+ CR31 &= ~0x06; /* Disable SlaveMode, disable SimuMode in SlaveMode */ -+ crt1rateindex = XGISearchCRT1Rate(pScrn, mymode); -+ -+ if (IS_DUAL_HEAD(pXGI)) { -+ if (IS_SECOND_HEAD(pXGI)) { -+ /* CRT1 */ -+ CR33 &= 0xf0; -+ if (!(vbflag & CRT1_LCDA)) { -+ CR33 |= (crt1rateindex & 0x0f); -+ } -+ } -+ else { -+ /* CRT2 */ -+ CR33 &= 0x0f; -+ if (vbflag & CRT2_VGA) { -+ CR33 |= ((crt1rateindex << 4) & 0xf0); -+ } -+ } -+ } -+ else -+#ifdef XGIMERGED -+ if (pXGI->MergedFB) { -+ CR33 = 0; -+ if (!(vbflag & CRT1_LCDA)) { -+ CR33 |= (crt1rateindex & 0x0f); -+ } -+ if (vbflag & CRT2_VGA) { -+ CR33 |= (XGISearchCRT1Rate(pScrn, mymode2) << 4); -+ } -+ } -+ else -+#endif -+ { -+ CR33 = 0; -+ if (!(vbflag & CRT1_LCDA)) { -+ CR33 |= (crt1rateindex & 0x0f); -+ } -+ if (vbflag & CRT2_VGA) { -+ CR33 |= ((crt1rateindex & 0x0f) << 4); -+ } -+ if (vbflag & CRT2_ENABLE) { -+ if (pXGI->CRT1off) -+ CR33 &= 0xf0; -+ } -+ } -+ outXGIIDXREG(XGICR, 0x30, CR30); -+ outXGIIDXREG(XGICR, 0x31, CR31); -+ outXGIIDXREG(XGICR, 0x33, CR33); -+ if (temp) { -+ outXGIIDXREG(XGICR, temp, CR38); -+ } -+ xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 4, -+ "After: CR30=0x%02x,CR31=0x%02x,CR33=0x%02x,CR%02x=%02x\n", -+ CR30, CR31, CR33, temp, CR38); -+ -+ if (pXGI->VBFlags & CRT2_ENABLE) { -+ /* Switch on CRT1 for modes that require the bridge in SlaveMode */ -+ andXGIIDXREG(XGISR, 0x1f, 0x3f); -+ inXGIIDXREG(XGICR, 0x17, CR17); -+ if (!(CR17 & 0x80)) { -+ orXGIIDXREG(XGICR, 0x17, 0x80); -+ outXGIIDXREG(XGISR, 0x00, 0x01); -+ usleep(10000); -+ outXGIIDXREG(XGISR, 0x00, 0x03); -+ } -+ } -+} -+ -+/* PostSetMode: -+ * -) Disable CRT1 for saving bandwidth. This doesn't work with VESA; -+ * VESA uses the bridge in SlaveMode and switching CRT1 off while -+ * the bridge is in SlaveMode not that clever... -+ * -) Check if overlay can be used (depending on dotclock) -+ * -) Check if Panel Scaler is active on LVDS for overlay re-scaling -+ * -) Save TV registers for further processing -+ * -) Apply TV settings -+ */ -+static void -+XGIPostSetMode(ScrnInfoPtr pScrn, XGIRegPtr xgiReg) -+{ -+ XGIPtr pXGI = XGIPTR(pScrn); -+/* unsigned char usScratchCR17; -+ Bool flag = FALSE; -+ Bool doit = TRUE; */ -+ int myclock; -+ unsigned char sr2b, sr2c, tmpreg; -+ float num, denum, postscalar, divider; -+ PDEBUG(ErrorF(" XGIPostSetMode(). \n")); -+#ifdef TWDEBUG -+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, "CRT1off is %d\n", pXGI->CRT1off); -+#endif -+ -+#ifdef UNLOCK_ALWAYS -+ xgiSaveUnlockExtRegisterLock(pXGI, NULL, NULL); -+#endif -+ -+ /* Determine if the video overlay can be used */ -+ if (!pXGI->NoXvideo) { -+ inXGIIDXREG(XGISR, 0x2b, sr2b); -+ inXGIIDXREG(XGISR, 0x2c, sr2c); -+ divider = (sr2b & 0x80) ? 2.0 : 1.0; -+ postscalar = (sr2c & 0x80) ? -+ ((((sr2c >> 5) & 0x03) == 0x02) ? 6.0 : 8.0) : -+ (((sr2c >> 5) & 0x03) + 1.0); -+ num = (sr2b & 0x7f) + 1.0; -+ denum = (sr2c & 0x1f) + 1.0; -+ myclock = -+ (int) ((14318 * (divider / postscalar) * (num / denum)) / 1000); -+ -+ pXGI->MiscFlags &= ~(MISC_CRT1OVERLAY | MISC_CRT1OVERLAYGAMMA); -+/* switch(pXGI->xgi_HwDevExt.jChipType) { -+ break; -+ } -+ */ -+ if (!(pXGI->MiscFlags & MISC_CRT1OVERLAY)) { -+ if (!IS_DUAL_HEAD(pXGI) || IS_SECOND_HEAD(pXGI)) -+ xf86DrvMsgVerb(pScrn->scrnIndex, X_WARNING, 3, -+ "Current dotclock (%dMhz) too high for video overlay on CRT1\n", -+ myclock); -+ } -+ } -+ -+ /* Determine if the Panel Link scaler is active */ -+ pXGI->MiscFlags &= ~MISC_PANELLINKSCALER; -+ if (pXGI->VBFlags & (CRT2_LCD | CRT1_LCDA)) { -+ if (pXGI->VBFlags & CRT1_LCDA) { -+ inXGIIDXREG(XGIPART1, 0x35, tmpreg); -+ tmpreg &= 0x04; -+ if (!tmpreg) -+ pXGI->MiscFlags |= MISC_PANELLINKSCALER; -+ } -+ } -+ -+ /* Determine if our very special TV mode is active */ -+ pXGI->MiscFlags &= ~MISC_TVNTSC1024; -+ if ((pXGI->XGI_Pr->VBType & VB_XGIVB) && (pXGI->VBFlags & CRT2_TV) -+ && (!(pXGI->VBFlags & TV_HIVISION))) { -+ if (((pXGI->VBFlags & TV_YPBPR) && (pXGI->VBFlags & TV_YPBPR525I)) -+ || ((!(pXGI->VBFlags & TV_YPBPR)) -+ && (pXGI->VBFlags & (TV_NTSC | TV_PALM)))) { -+ inXGIIDXREG(XGICR, 0x34, tmpreg); -+ tmpreg &= 0x7f; -+ if ((tmpreg == 0x64) || (tmpreg == 0x4a) || (tmpreg == 0x38)) { -+ pXGI->MiscFlags |= MISC_TVNTSC1024; -+ } -+ } -+ } -+ -+ /* Reset XV gamma correction */ -+ if (pXGI->ResetXvGamma) { -+ (pXGI->ResetXvGamma) (pScrn); -+ } -+ -+ /* Apply TV settings given by options -+ * Do this even in DualHeadMode: -+ * - if this is called by SetModeCRT1, CRT2 mode has been reset by SetModeCRT1 -+ * - if this is called by SetModeCRT2, CRT2 mode has changed (duh!) -+ * -> Hence, in both cases, the settings must be re-applied. -+ */ -+} -+ -+ -+USHORT -+XGI_CalcModeIndex(ScrnInfoPtr pScrn, DisplayModePtr mode, -+ unsigned long VBFlags) -+{ -+ XGIPtr pXGI = XGIPTR(pScrn); -+ UShort i = (pXGI->CurrentLayout.bitsPerPixel + 7) / 8 - 1; -+ -+ if ((VBFlags & CRT1_LCDA)) { -+ if ((mode->HDisplay > pXGI->LCDwidth) || -+ (mode->VDisplay > pXGI->LCDheight)) { -+ return 0; -+ } -+ } -+ -+ return XGI_GetModeID(VBFlags, mode->HDisplay, mode->VDisplay, -+ i, pXGI->LCDwidth, pXGI->LCDheight); -+} -+ -+/* Calculate the vertical refresh rate from a mode */ -+int -+XGICalcVRate(DisplayModePtr mode) -+{ -+ float hsync, refresh = 0; -+ -+ if (mode->HSync > 0.0) -+ hsync = mode->HSync; -+ else if (mode->HTotal > 0) -+ hsync = (float) mode->Clock / (float) mode->HTotal; -+ else -+ hsync = 0.0; -+ -+ if (mode->VTotal > 0) -+ refresh = hsync * 1000.0 / mode->VTotal; -+ -+ if (mode->Flags & V_INTERLACE) -+ refresh *= 2.0; -+ -+ if (mode->Flags & V_DBLSCAN) -+ refresh /= 2.0; -+ -+ if (mode->VScan > 1) -+ refresh /= mode->VScan; -+ -+ if (mode->VRefresh > 0.0) -+ refresh = mode->VRefresh; -+ -+ if (hsync == 0 || refresh == 0) -+ return (0); -+ -+ return ((int) (refresh)); -+} -+ -+/* Calculate CR33 (rate index) for CRT1. -+ * Calculation is done using currentmode, therefore it is -+ * recommended to set VertRefresh and HorizSync to correct -+ * values in config file. -+ */ -+unsigned char -+XGISearchCRT1Rate(ScrnInfoPtr pScrn, DisplayModePtr mode) -+{ -+ XGIPtr pXGI = XGIPTR(pScrn); -+ int i = 0; -+ int irefresh; -+ unsigned short xres = mode->HDisplay; -+ unsigned short yres = mode->VDisplay; -+ unsigned char index; -+ BOOLEAN checkxgi730 = FALSE; -+ -+ irefresh = XGICalcVRate(mode); -+ if (!irefresh) { -+ if (xres == 800 || xres == 1024 || xres == 1280) -+ return 0x02; -+ else -+ return 0x01; -+ } -+ -+#ifdef TWDEBUG -+ xf86DrvMsg(0, X_INFO, "Debug: CalcVRate returned %d\n", irefresh); -+#endif -+ -+ /* We need the REAL refresh rate here */ -+ if (mode->Flags & V_INTERLACE) -+ irefresh /= 2; -+ -+ /* Do not multiply by 2 when DBLSCAN! */ -+ -+#ifdef TWDEBUG -+ xf86DrvMsg(0, X_INFO, "Debug: Rate after correction = %d\n", irefresh); -+#endif -+ -+ index = 0; -+ while ((xgix_vrate[i].idx != 0) && (xgix_vrate[i].xres <= xres)) { -+ if ((xgix_vrate[i].xres == xres) && (xgix_vrate[i].yres == yres)) { -+ if ((checkxgi730 == FALSE) -+ || (xgix_vrate[i].XGI730valid32bpp == TRUE)) { -+ if (xgix_vrate[i].refresh == irefresh) { -+ index = xgix_vrate[i].idx; -+ break; -+ } -+ else if (xgix_vrate[i].refresh > irefresh) { -+ if ((xgix_vrate[i].refresh - irefresh) <= 3) { -+ index = xgix_vrate[i].idx; -+ } -+ else if (((checkxgi730 == FALSE) -+ || (xgix_vrate[i - 1].XGI730valid32bpp == TRUE)) -+ && ((irefresh - xgix_vrate[i - 1].refresh) <= 2) -+ && (xgix_vrate[i].idx != 1)) { -+ index = xgix_vrate[i - 1].idx; -+ } -+ break; -+ } -+ else if ((irefresh - xgix_vrate[i].refresh) <= 2) { -+ index = xgix_vrate[i].idx; -+ break; -+ } -+ } -+ } -+ i++; -+ } -+ -+ /* Jong 10/19/2007; merge code */ -+ /* Adjust to match table of VBIOS */ -+ switch(pXGI->Chipset) -+ { -+ case PCI_CHIP_XGIXG20: -+ case PCI_CHIP_XGIXG21: -+ if((xres == 640) && (yres == 480)) -+ { -+ if (xgix_vrate[index].refresh>85) -+ { -+ index = 4; -+ } -+ } -+ -+ if((xres == 800) && (yres == 600)) -+ { -+ if (xgix_vrate[index].refresh>85) -+ { -+ index = 5; -+ } -+ -+ if (index>0) -+ { -+ index --; -+ } -+ } -+ -+ if((xres == 1024) && (yres == 768)) -+ { -+ if (xgix_vrate[index].refresh>85) -+ { -+ index = 5; -+ } -+ -+ if (index>0) -+ { -+ index --; -+ } -+ } -+ -+ if((xres == 1280) && (yres == 1024)) -+ { -+ if (index>0) -+ { -+ index --; -+ } -+ } -+ -+ if((xres == 1600) && (yres == 1200)) -+ { -+ if (xgix_vrate[index].refresh>85) -+ { -+ index = 5; -+ } -+ } -+ -+ if((xres >= 1920) && (yres >= 1440)) -+ { -+ index = 0; -+ } -+ -+ break; -+ -+ case PCI_CHIP_XGIXG27: -+ -+ if((xres == 640) && (yres == 480)) -+ { -+ if (xgix_vrate[index].refresh>85) -+ { -+ index = 4; -+ } -+ } -+ -+ if((xres == 800) && (yres == 600)) -+ { -+ if (xgix_vrate[index].refresh>85) -+ { -+ index = 5; -+ } -+ -+ if (index>0) -+ { -+ index --; -+ } -+ } -+ -+ if((xres == 1024) && (yres == 768)) -+ { -+ if (xgix_vrate[index].refresh>85) -+ { -+ index = 5; -+ } -+ -+ if (index>0) -+ { -+ index --; -+ } -+ } -+ -+ if((xres == 1280) && (yres == 1024)) -+ { -+ if (index>0) -+ { -+ index --; -+ } -+ } -+ -+ if((xres == 1600) && (yres == 1200)) -+ { -+ if (xgix_vrate[index].refresh>85) -+ { -+ index = 5; -+ } -+ } -+ -+ break; -+ -+ default: -+ break; -+ } -+ -+ if (index > 0) -+ return index; -+ else { -+ /* Default Rate index */ -+ if (xres == 800 || xres == 1024 || xres == 1280) -+ return 0x02; -+ else -+ return 0x01; -+ } -+} -+ -+ -+#define MODEID_OFF 0x449 -+ -+unsigned char -+XGI_GetSetModeID(ScrnInfoPtr pScrn, unsigned char id) -+{ -+ return (XGI_GetSetBIOSScratch(pScrn, MODEID_OFF, id)); -+} -+ -+unsigned char -+XGI_GetSetBIOSScratch(ScrnInfoPtr pScrn, USHORT offset, unsigned char value) -+{ -+ unsigned char ret = 0; -+#if (defined(i386) || defined(__i386) || defined(__i386__) || defined(__AMD64__)) -+ unsigned char *base; -+ -+ base = xf86MapVidMem(pScrn->scrnIndex, VIDMEM_MMIO, 0, 0x2000); -+ if (!base) { -+ XGIErrorLog(pScrn, "(Could not map BIOS scratch area)\n"); -+ return 0; -+ } -+ -+ ret = *(base + offset); -+ -+ /* value != 0xff means: set register */ -+ if (value != 0xff) -+ *(base + offset) = value; -+ -+ xf86UnMapVidMem(pScrn->scrnIndex, base, 0x2000); -+#endif -+ return ret; -+} -+ -+void -+xgiSaveUnlockExtRegisterLock(XGIPtr pXGI, unsigned char *reg1, -+ unsigned char *reg2) -+{ -+ register unsigned char val; -+ unsigned long mylockcalls; -+ -+ pXGI->lockcalls++; -+ mylockcalls = pXGI->lockcalls; -+ -+ /* check if already unlocked */ -+ inXGIIDXREG(XGISR, 0x05, val); -+ if (val != 0xa1) { -+ /* save State */ -+ if (reg1) -+ *reg1 = val; -+ /* unlock */ -+/* -+ outb (0x3c4, 0x20); -+ val4 = inb (0x3c5); -+ val4 |= 0x20; -+ outb (0x3c5, val4); -+*/ -+ outXGIIDXREG(XGISR, 0x05, 0x86); -+ inXGIIDXREG(XGISR, 0x05, val); -+ if (val != 0xA1) { -+#ifdef TWDEBUG -+ unsigned char val1, val2; -+ int i; -+#endif -+ XGIErrorLog(pXGI->pScrn, -+ "Failed to unlock sr registers (%p, %lx, 0x%02x; %ld)\n", -+ (void *) pXGI, (unsigned long) pXGI->RelIO, val, -+ mylockcalls); -+#ifdef TWDEBUG -+ for (i = 0; i <= 0x3f; i++) { -+ inXGIIDXREG(XGISR, i, val1); -+ inXGIIDXREG(0x3c4, i, val2); -+ xf86DrvMsg(pXGI->pScrn->scrnIndex, X_INFO, -+ "SR%02d: RelIO=0x%02x 0x3c4=0x%02x (%d)\n", -+ i, val1, val2, mylockcalls); -+ } -+#endif -+ } -+ } -+} -+ -+void -+xgiRestoreExtRegisterLock(XGIPtr pXGI, unsigned char reg1, unsigned char reg2) -+{ -+ /* restore lock */ -+#ifndef UNLOCK_ALWAYS -+ outXGIIDXREG(XGISR, 0x05, reg1 == 0xA1 ? 0x86 : 0x00); -+#endif -+} -+ -+/* Jong 12/03/2007; */ -+/* -+void XGICheckModeForMonitor(ScrnInfoPtr pScrn, ) -+{ -+ DisplayModePtr pCRT1Modes=pScrn->monitor->Modes; -+ -+ if ((p = first = pScrn->monitor->Modes)) { -+ do { -+ xf86CheckModeForMonitor(p, -+ n = p->next; -+ p = n; -+ } while (p != NULL && p != first); -+ } -+ -+ xf86PruneDriverModes(pXGI->CRT2pScrn); -+} -+*/ -+ -+/* Jong 12/05/2007; filter mode list by monitor DDC */ -+static void XGIFilterModeByDDC(DisplayModePtr pModeList, xf86MonPtr pMonitorDDC) -+{ -+ DisplayModePtr first, p; -+ -+ if ((p = first = pModeList)) -+ { -+ do -+ { -+ if(XGICheckModeByDDC(p, pMonitorDDC) == FALSE) -+ xf86DeleteMode(&pModeList, pModeList); -+ -+ p = p->next; -+ } while (p != NULL && p != first); -+ } -+} -+ -+/* Jong 12/05/2007; filter mode list by monitor DDC */ -+static bool XGICheckModeByDDC(DisplayModePtr pMode, xf86MonPtr pMonitorDDC) -+{ -+ int i, j; -+ float VF, HF; -+ struct detailed_timings *pd_timings; -+ struct monitor_ranges *pranges; -+ struct std_timings *pstd_t; -+ -+ int VRefresh=pMode->VRefresh; -+ -+ if ((pMode == NULL) || (pMonitorDDC == NULL)) { -+ return(FALSE); /* ignore */ -+ } -+ -+ if( pMode->VRefresh == 0) -+ VRefresh = (int)((float)(pMode->Clock*1000)/(float)(pMode->VTotal*pMode->HTotal)+0.5); -+ -+ -+ for (i = 0, j = 0; i < 8; i++, j++) -+ { -+ if (establish_timing[j].width == -1) -+ { -+ continue; -+ } -+ -+ if (pMonitorDDC->timings1.t1 & (1 << i)) -+ { -+ if( (establish_timing[j].width == pMode->HDisplay) && -+ (establish_timing[j].height == pMode->VDisplay) && -+ (establish_timing[j].VRefresh == VRefresh) ) -+ return(TRUE); -+ } -+ } -+ -+ for (i = 0; i < 8; i++, j++) -+ { -+ if (establish_timing[j].width == -1) -+ { -+ continue; -+ } -+ -+ if (pMonitorDDC->timings1.t2 & (1 << i)) -+ { -+ if( (establish_timing[j].width == pMode->HDisplay) && -+ (establish_timing[j].height == pMode->VDisplay) && -+ (establish_timing[j].VRefresh == VRefresh) ) -+ return(TRUE); -+ } -+ } -+ -+ for (i = 0; i < 8; i++) -+ { -+ if ((pMode->HDisplay == pMonitorDDC->timings2[i].hsize) && -+ (pMode->VDisplay == pMonitorDDC->timings2[i].vsize) && -+ (VRefresh == pMonitorDDC->timings2[i].refresh)) -+ return(TRUE); -+ } -+ -+/* Jong 12/05/2007; Don't know how to do? */ -+#if 0 -+ for (i = 0; i < 4; i++) -+ { -+ switch (pMonitorDDC->det_mon[i].type) -+ { -+ case DS_RANGES: -+ pranges = &(pMonitorDDC->det_mon[i].section.ranges); -+ PDEBUG5(ErrorF -+ ("min_v = %d max_v = %d min_h = %d max_h = %d max_clock = %d\n", -+ pranges->min_v, pranges->max_v, pranges->min_h, -+ pranges->max_h, pranges->max_clock)); -+ -+ if (range->loH > pranges->min_h) -+ range->loH = pranges->min_h; -+ if (range->loV > pranges->min_v) -+ range->loV = pranges->min_v; -+ if (range->hiH < pranges->max_h) -+ range->hiH = pranges->max_h; -+ if (range->hiV < pranges->max_v) -+ range->hiV = pranges->max_v; -+ PDEBUG5(ErrorF -+ ("range(%8.3f %8.3f %8.3f %8.3f)\n", range->loH, -+ range->loV, range->hiH, range->hiV)); -+ break; -+ -+ case DS_STD_TIMINGS: -+ pstd_t = pMonitorDDC->det_mon[i].section.std_t; -+ for (j = 0; j < 5; j++) { -+ int k; -+ PDEBUG5(ErrorF -+ ("std_t[%d] hsize = %d vsize = %d refresh = %d id = %d\n", -+ j, pstd_t[j].hsize, pstd_t[j].vsize, -+ pstd_t[j].refresh, pstd_t[j].id)); -+ for (k = 0; StdTiming[k].width != -1; k++) { -+ if ((StdTiming[k].width == pstd_t[j].hsize) && -+ (StdTiming[k].height == pstd_t[j].vsize) && -+ (StdTiming[k].VRefresh == pstd_t[j].refresh)) { -+ if (range->loH > StdTiming[k].HSync) -+ range->loH = StdTiming[k].HSync; -+ if (range->hiH < StdTiming[k].HSync) -+ range->hiH = StdTiming[k].HSync; -+ if (range->loV > StdTiming[k].VRefresh) -+ range->loV = StdTiming[k].VRefresh; -+ if (range->hiV < StdTiming[k].VRefresh) -+ range->hiV = StdTiming[k].VRefresh; -+ break; -+ } -+ -+ } -+ } -+ break; -+ -+ case DT: -+ -+ pd_timings = &pMonitorDDC->det_mon[i].section.d_timings; -+ -+ HF = pd_timings->clock / (pd_timings->h_active + -+ pd_timings->h_blanking); -+ VF = HF / (pd_timings->v_active + pd_timings->v_blanking); -+ HF /= 1000; /* into KHz Domain */ -+ if (range->loH > HF) -+ range->loH = HF; -+ if (range->hiH < HF) -+ range->hiH = HF; -+ if (range->loV > VF) -+ range->loV = VF; -+ if (range->hiV < VF) -+ range->hiV = VF; -+ PDEBUG(ErrorF -+ ("Detailing Timing: HF = %f VF = %f range (%8.3f %8.3f %8.3f %8.3f)\n", -+ HF, VF, range->loH, range->loV, range->hiH, range->hiV)); -+ break; -+ } -+ } -+#endif -+ -+ return(FALSE); -+} -+ -+#ifdef DEBUG -+void -+XGIDumpSR(ScrnInfoPtr pScrn) -+{ -+ XGIPtr pXGI = XGIPTR(pScrn); -+ -+ int i, j; -+ unsigned long temp; -+ -+ ErrorF -+ ("----------------------------------------------------------------------\n"); -+ ErrorF("SR xx\n"); -+ ErrorF -+ ("----------------------------------------------------------------------\n"); -+ for (i = 0; i < 0x40; i += 0x10) { -+ ErrorF("SR[%02X]:", i); -+ for (j = 0; j < 16; j++) { -+ inXGIIDXREG(XGISR, (i + j), temp); -+ ErrorF(" %02lX", temp); -+ } -+ ErrorF("\n"); -+ } -+ ErrorF("\n"); -+} -+ -+void -+XGIDumpCR(ScrnInfoPtr pScrn) -+{ -+ XGIPtr pXGI = XGIPTR(pScrn); -+ -+ int i, j; -+ unsigned long temp; -+ -+ ErrorF -+ ("----------------------------------------------------------------------\n"); -+ ErrorF("CR xx\n"); -+ ErrorF -+ ("----------------------------------------------------------------------\n"); -+ for (i = 0; i < 0x100; i += 0x10) { -+ ErrorF("CR[%02X]:", i); -+ for (j = 0; j < 16; j++) { -+ inXGIIDXREG(XGICR, (i + j), temp); -+ ErrorF(" %02lX", temp); -+ } -+ ErrorF("\n"); -+ } -+} -+ -+void -+XGIDumpGR(ScrnInfoPtr pScrn) -+{ -+ XGIPtr pXGI = XGIPTR(pScrn); -+ -+ int i; -+ unsigned long temp; -+ -+ ErrorF -+ ("----------------------------------------------------------------------\n"); -+ ErrorF("GR xx\n"); -+ ErrorF -+ ("----------------------------------------------------------------------\n"); -+ ErrorF("GR:"); -+ for (i = 0; i < 0x9; i += 0x10) { -+ inXGIIDXREG(XGISR, i, temp); -+ ErrorF(" %02lX", temp); -+ } -+ ErrorF("\n"); -+} -+ -+#if 0 -+void -+XGIDumpPart0(ScrnInfoPtr pScrn) -+{ -+ XGIPtr pXGI = XGIPTR(pScrn); -+ int i, j; -+ unsigned long temp; -+ -+ ErrorF -+ ("----------------------------------------------------------------------\n"); -+ ErrorF("PART0 xx\n"); -+ ErrorF -+ ("----------------------------------------------------------------------\n"); -+ for (i = 0; i < 0x50; i += 0x10) { -+ ErrorF("PART0[%02X]:", i); -+ for (j = 0; j < 0x10; j++) { -+ inXGIIDXREG(XGIPART0, (i + j), temp); -+ ErrorF(" %02lX", temp); -+ } -+ ErrorF("\n"); -+ } -+} -+ -+void -+XGIDumpPart05(ScrnInfoPtr pScrn) -+{ -+ XGIPtr pXGI = XGIPTR(pScrn); -+ int i, j; -+ unsigned long temp; -+ ErrorF -+ ("----------------------------------------------------------------------\n"); -+ ErrorF("PART05 xx\n"); -+ ErrorF -+ ("----------------------------------------------------------------------\n"); -+ for (i = 0; i < 0x50; i += 0x10) { -+ ErrorF("PART05[%02X]:", i); -+ for (j = 0; j < 0x10; j++) { -+ inXGIIDXREG(XGIPART05, (i + j), temp); -+ ErrorF(" %02lX", temp); -+ } -+ ErrorF("\n"); -+ } -+} -+ -+void -+XGIDumpPart1(ScrnInfoPtr pScrn) -+{ -+ XGIPtr pXGI = XGIPTR(pScrn); -+ -+ int i, j; -+ unsigned long temp; -+ -+ ErrorF -+ ("----------------------------------------------------------------------\n"); -+ ErrorF("PART1 xx\n"); -+ ErrorF -+ ("----------------------------------------------------------------------\n"); -+ for (i = 0; i < 0x100; i += 0x10) { -+ ErrorF("PART1[%02X]:", i); -+ for (j = 0; j < 0x10; j++) { -+ inXGIIDXREG(XGIPART1, (i + j), temp); -+ ErrorF(" %02lX", temp); -+ } -+ ErrorF("\n"); -+ } -+} -+ -+void -+XGIDumpPart2(ScrnInfoPtr pScrn) -+{ -+ XGIPtr pXGI = XGIPTR(pScrn); -+ -+ int i, j; -+ unsigned long temp; -+ -+ ErrorF -+ ("----------------------------------------------------------------------\n"); -+ ErrorF("PART2 xx\n"); -+ ErrorF -+ ("----------------------------------------------------------------------\n"); -+ for (i = 0; i < 0x100; i += 0x10) { -+ ErrorF("PART2[%02X]:", i); -+ for (j = 0; j < 0x10; j++) { -+ inXGIIDXREG(XGIPART2, (i + j), temp); -+ ErrorF(" %02lX", temp); -+ } -+ ErrorF("\n"); -+ } -+} -+ -+void -+XGIDumpPart3(ScrnInfoPtr pScrn) -+{ -+ XGIPtr pXGI = XGIPTR(pScrn); -+ -+ int i, j; -+ unsigned long temp; -+ -+ ErrorF -+ ("----------------------------------------------------------------------\n"); -+ ErrorF("PART3 xx\n"); -+ ErrorF -+ ("----------------------------------------------------------------------\n"); -+ -+ for (i = 0; i < 0x100; i += 0x10) { -+ ErrorF("PART3[%02X]:", i); -+ for (j = 0; j < 0x10; j++) { -+ inXGIIDXREG(XGIPART3, (i + j), temp); -+ ErrorF(" %02lX", temp); -+ } -+ ErrorF("\n"); -+ } -+} -+ -+void -+XGIDumpPart4(ScrnInfoPtr pScrn) -+{ -+ XGIPtr pXGI = XGIPTR(pScrn); -+ -+ int i, j; -+ unsigned long temp; -+ -+ ErrorF -+ ("----------------------------------------------------------------------\n"); -+ ErrorF("PART4 xx\n"); -+ ErrorF -+ ("----------------------------------------------------------------------\n"); -+ for (i = 0; i < 0x100; i += 0x10) { -+ ErrorF("PART4[%02X]:", i); -+ for (j = 0; j < 0x10; j++) { -+ inXGIIDXREG(XGIPART4, (i + j), temp); -+ ErrorF(" %02lX", temp); -+ } -+ ErrorF("\n"); -+ } -+} -+#endif -+ -+void -+XGIDumpMMIO(ScrnInfoPtr pScrn) -+{ -+ XGIPtr pXGI = XGIPTR(pScrn); -+ -+ int i; -+ unsigned long temp; -+/* -+ ErrorF("----------------------------------------------------------------------\n") ; -+ ErrorF("MMIO 85xx\n") ; -+ ErrorF("----------------------------------------------------------------------\n") ; -+ for( i = 0x8500 ; i < 0x8600 ; i+=0x10 ) -+ { -+ ErrorF("[%04X]: %08lX %08lX %08lX %08lX\n",i, -+ XGIMMIOLONG(i), -+ XGIMMIOLONG(i+4), -+ XGIMMIOLONG(i+8), -+ XGIMMIOLONG(i+12)) ; -+ } -+*/ -+} -+#endif /* DEBUG */ -+ -+void -+XGIDumpRegs(ScrnInfoPtr pScrn) -+{ -+#ifdef DEBUG -+ -+ XGIPtr pXGI = XGIPTR(pScrn); -+ -+ XGIDumpSR(pScrn); -+ XGIDumpCR(pScrn); -+// XGIDumpGR(pScrn); -+// XGIDumpPalette(pScrn); -+ XGIDumpMMIO(pScrn); -+ -+ /* -+ if (pXGI->Chipset != PCI_CHIP_XGIXG20) { -+ XGIDumpPart0(pScrn); -+ XGIDumpPart05(pScrn); -+ XGIDumpPart1(pScrn); -+ XGIDumpPart2(pScrn); -+ XGIDumpPart3(pScrn); -+ XGIDumpPart4(pScrn); -+ } */ -+ -+#endif /* DEBUG */ -+} -+ -+ -+void -+XGIDumpPalette(ScrnInfoPtr pScrn) -+{ -+#ifdef DEBUG -+ XGIPtr pXGI = XGIPTR(pScrn); -+ unsigned temp[3]; -+ int i, j; -+ -+ ErrorF -+ ("----------------------------------------------------------------------\n"); -+ ErrorF("Palette \n"); -+ ErrorF -+ ("----------------------------------------------------------------------\n"); -+ for (i = 0; i < 0xFF; i += 0x04) { -+ for (j = 0; j < 16; j++) { -+ outb(0x3c7, i + j); -+ temp[0] = inb(0x3c9); -+ temp[1] = inb(0x3c9); -+ temp[2] = inb(0x3c9); -+ -+ ErrorF("PA[%02X]: %02X %02X %02X", i + j, -+ temp[0], temp[1], temp[2]); -+ } -+ ErrorF("\n"); -+ } -+ ErrorF("\n"); -+#endif -+} -diff --git a/src/xgi_driver.h b/src/xgi_driver.h -index cce0764..4004ccd 100644 ---- a/src/xgi_driver.h -+++ b/src/xgi_driver.h -@@ -41,43 +41,81 @@ static const struct _xgi_vrate { - {1, 320, 200, 70, TRUE}, - {1, 320, 240, 60, TRUE}, - {1, 400, 300, 60, TRUE}, -- {1, 512, 384, 60, TRUE}, -+ {1, 512, 384, 60, TRUE}, - {1, 640, 400, 72, TRUE}, -- {1, 640, 480, 60, TRUE}, {2, 640, 480, 72, TRUE}, {3, 640, 480, 75, TRUE}, -- {4, 640, 480, 85, TRUE}, {5, 640, 480, 100, TRUE}, {6, 640, 480, 120, TRUE}, -- {7, 640, 480, 160, FALSE}, {8, 640, 480, 200, FALSE}, -+ {1, 640, 480, 60, TRUE}, -+ {2, 640, 480, 72, TRUE}, -+ {3, 640, 480, 75, TRUE}, -+ {4, 640, 480, 85, TRUE}, -+ {5, 640, 480, 100, TRUE}, -+ {6, 640, 480, 120, TRUE}, -+ {7, 640, 480, 160, FALSE}, -+ {8, 640, 480, 200, FALSE}, - {1, 720, 480, 60, TRUE}, - {1, 720, 576, 58, TRUE}, - {1, 768, 576, 58, TRUE}, -- {1, 800, 480, 60, TRUE}, {2, 800, 480, 75, TRUE}, {3, 800, 480, 85, TRUE}, -- {1, 800, 600, 56, TRUE}, {2, 800, 600, 60, TRUE}, {3, 800, 600, 72, TRUE}, -- {4, 800, 600, 75, TRUE}, {5, 800, 600, 85, TRUE}, {6, 800, 600, 105, TRUE}, -- {7, 800, 600, 120, FALSE}, {8, 800, 600, 160, FALSE}, -- {1, 848, 480, 39, TRUE}, {2, 848, 480, 60, TRUE}, -- {1, 856, 480, 39, TRUE}, {2, 856, 480, 60, TRUE}, -- {1, 1024, 576, 60, TRUE}, {2, 1024, 576, 75, TRUE}, {3, 1024, 576, 85, TRUE}, -+ {1, 800, 480, 60, TRUE}, -+ {2, 800, 480, 75, TRUE}, -+ {3, 800, 480, 85, TRUE}, -+ {1, 800, 600, 56, TRUE}, -+ {2, 800, 600, 60, TRUE}, -+ {3, 800, 600, 72, TRUE}, -+ {4, 800, 600, 75, TRUE}, -+ {5, 800, 600, 85, TRUE}, -+ {6, 800, 600, 105, TRUE}, -+ {7, 800, 600, 120, FALSE}, -+ {8, 800, 600, 160, FALSE}, -+ {1, 848, 480, 39, TRUE}, -+ {2, 848, 480, 60, TRUE}, -+ {1, 856, 480, 39, TRUE}, -+ {2, 856, 480, 60, TRUE}, -+ {1, 1024, 576, 60, TRUE}, -+ {2, 1024, 576, 75, TRUE}, -+ {3, 1024, 576, 85, TRUE}, - {1, 1024, 600, 60, TRUE}, -- {1, 1024, 768, 43, TRUE}, {2, 1024, 768, 60, TRUE}, {3, 1024, 768, 70, FALSE}, -- {4, 1024, 768, 75, FALSE}, {5, 1024, 768, 85, TRUE}, {6, 1024, 768, 100, TRUE}, -+ {1, 1024, 768, 43, TRUE}, -+ {2, 1024, 768, 60, TRUE}, -+ {3, 1024, 768, 70, FALSE}, -+ {4, 1024, 768, 75, FALSE}, -+ {5, 1024, 768, 85, TRUE}, -+ {6, 1024, 768, 100, TRUE}, - {7, 1024, 768, 120, TRUE}, - {1, 1152, 768, 60, TRUE}, -- {1, 1152, 864, 75, TRUE}, {2, 1152, 864, 84, FALSE}, -- {1, 1280, 720, 60, TRUE}, {2, 1280, 720, 75, FALSE}, {3, 1280, 720, 85, TRUE}, -+ {1, 1152, 864, 75, TRUE}, -+ {2, 1152, 864, 84, FALSE}, -+ {1, 1280, 720, 60, TRUE}, -+ {2, 1280, 720, 75, FALSE}, -+ {3, 1280, 720, 85, TRUE}, - {1, 1280, 768, 60, TRUE}, - {1, 1280, 800, 60, TRUE}, -- {1, 1280, 960, 60, TRUE}, {2, 1280, 960, 85, TRUE}, -- {1, 1280, 1024, 43, FALSE}, {2, 1280, 1024, 60, TRUE}, {3, 1280, 1024, 75, FALSE}, -+ {1, 1280, 960, 60, TRUE}, -+ {2, 1280, 960, 85, TRUE}, -+ {1, 1280, 1024, 43, FALSE}, -+ {2, 1280, 1024, 60, TRUE}, -+ {3, 1280, 1024, 75, FALSE}, - {4, 1280, 1024, 85, TRUE}, - {1, 1360, 768, 60, TRUE}, -- {1, 1400, 1050, 60, TRUE}, {2, 1400, 1050, 75, TRUE}, -- {1, 1600, 1200, 60, TRUE}, {2, 1600, 1200, 65, TRUE}, {3, 1600, 1200, 70, TRUE}, -- {4, 1600, 1200, 75, TRUE}, {5, 1600, 1200, 85, TRUE}, {6, 1600, 1200, 100, TRUE}, -+ {1, 1400, 1050, 60, TRUE}, -+ {2, 1400, 1050, 75, TRUE}, -+ {1, 1600, 1200, 60, TRUE}, -+ {2, 1600, 1200, 65, TRUE}, -+ {3, 1600, 1200, 70, TRUE}, -+ {4, 1600, 1200, 75, TRUE}, -+ {5, 1600, 1200, 85, TRUE}, -+ {6, 1600, 1200, 100, TRUE}, - {7, 1600, 1200, 120, TRUE}, - {1, 1680, 1050, 60, TRUE}, -- {1, 1920, 1440, 60, TRUE}, {2, 1920, 1440, 65, TRUE}, {3, 1920, 1440, 70, TRUE}, -- {4, 1920, 1440, 75, TRUE}, {5, 1920, 1440, 85, TRUE}, {6, 1920, 1440, 100, TRUE}, -- {1, 2048, 1536, 60, TRUE}, {2, 2048, 1536, 65, TRUE}, {3, 2048, 1536, 70, TRUE}, -- {4, 2048, 1536, 75, TRUE}, {5, 2048, 1536, 85, TRUE}, -+ {1, 1920, 1440, 60, TRUE}, -+ {2, 1920, 1440, 65, TRUE}, -+ {3, 1920, 1440, 70, TRUE}, -+ {4, 1920, 1440, 75, TRUE}, -+ {5, 1920, 1440, 85, TRUE}, -+ {6, 1920, 1440, 100, TRUE}, -+ {1, 2048, 1536, 60, TRUE}, -+ {2, 2048, 1536, 65, TRUE}, -+ {3, 2048, 1536, 70, TRUE}, -+ {4, 2048, 1536, 75, TRUE}, -+ {5, 2048, 1536, 85, TRUE}, - {0, 0, 0, 0, FALSE} - }; - -diff --git a/src/xgi_opt.c b/src/xgi_opt.c -index cf92655..4aac85e 100644 ---- a/src/xgi_opt.c -+++ b/src/xgi_opt.c -@@ -276,7 +276,7 @@ xgiOptions(ScrnInfoPtr pScrn) - xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "2D Acceleration disabled\n"); - } - -- if (PCI_CHIP_XGIXG20 == pXGI->Chipset) -+ if ((pXGI->Chipset== PCI_CHIP_XGIXG20)||(pXGI->Chipset== PCI_CHIP_XGIXG21)||(pXGI->Chipset== PCI_CHIP_XGIXG27)) - pXGI->NoXvideo = TRUE; - - /* SWCursor -diff --git a/src/xgi_pci.h b/src/xgi_pci.h -index 4f9d258..bf8cf61 100644 ---- a/src/xgi_pci.h -+++ b/src/xgi_pci.h -@@ -1,34 +1,36 @@ --/* Copyright (C) 2003-2006 by XGI Technology, Taiwan. -- * -- * All Rights Reserved. -- * -- * Permission is hereby granted, free of charge, to any person obtaining -- * a copy of this software and associated documentation files (the -- * "Software"), to deal in the Software without restriction, including -- * without limitation on the rights to use, copy, modify, merge, -- * publish, distribute, sublicense, and/or sell copies of the Software, -- * and to permit persons to whom the Software is furnished to do so, -- * subject to the following conditions: -- * -- * The above copyright notice and this permission notice (including the -- * next paragraph) shall be included in all copies or substantial -- * portions of the Software. -- * -- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -- * NON-INFRINGEMENT. IN NO EVENT SHALL XGI AND/OR -- * ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -- * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -- * DEALINGS IN THE SOFTWARE. -- */ -- --/****************************************************************** -- * Define XGI new PCI device ID. -- ******************************************************************/ -- -- --#define PCI_VENDOR_XGI 0x18CA --#define PCI_CHIP_XGIXG40 0x0040 --#define PCI_CHIP_XGIXG20 0x0020 -+/* Copyright (C) 2003-2006 by XGI Technology, Taiwan. -+ * -+ * All Rights Reserved. -+ * -+ * Permission is hereby granted, free of charge, to any person obtaining -+ * a copy of this software and associated documentation files (the -+ * "Software"), to deal in the Software without restriction, including -+ * without limitation on the rights to use, copy, modify, merge, -+ * publish, distribute, sublicense, and/or sell copies of the Software, -+ * and to permit persons to whom the Software is furnished to do so, -+ * subject to the following conditions: -+ * -+ * The above copyright notice and this permission notice (including the -+ * next paragraph) shall be included in all copies or substantial -+ * portions of the Software. -+ * -+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -+ * NON-INFRINGEMENT. IN NO EVENT SHALL XGI AND/OR -+ * ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -+ * DEALINGS IN THE SOFTWARE. -+ */ -+ -+/****************************************************************** -+ * Define XGI new PCI device ID. -+ ******************************************************************/ -+ -+ -+#define PCI_VENDOR_XGI 0x18CA -+#define PCI_CHIP_XGIXG40 0x0040 -+#define PCI_CHIP_XGIXG20 0x0020 -+#define PCI_CHIP_XGIXG21 0x0021 /* Jong 01/07/2008; support New XG21 */ -+#define PCI_CHIP_XGIXG27 0x0027 -diff --git a/src/xgi_regs.h b/src/xgi_regs.h -diff --git a/src/xgi_setup.c b/src/xgi_setup.c -index a06916b..0265d36 100644 ---- a/src/xgi_setup.c -+++ b/src/xgi_setup.c -@@ -1,421 +1,686 @@ --/* -- * Basic hardware and memory detection -- * -- * Copyright (C) 2001-2004 by Thomas Winischhofer, Vienna, Austria. -- * -- * Redistribution and use in source and binary forms, with or without -- * modification, are permitted provided that the following conditions -- * are met: -- * 1) Redistributions of source code must retain the above copyright -- * notice, this list of conditions and the following disclaimer. -- * 2) Redistributions in binary form must reproduce the above copyright -- * notice, this list of conditions and the following disclaimer in the -- * documentation and/or other materials provided with the distribution. -- * 3) The name of the author may not be used to endorse or promote products -- * derived from this software without specific prior written permission. -- * -- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESSED OR -- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, -- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -- * -- * Author: Thomas Winischhofer -- * -- * Ideas and methods for old series based on code by Can-Ru Yeou, XGI Inc. -- * -- */ -- --#ifdef HAVE_CONFIG_H --#include "config.h" --#endif -- --#include "xf86PciInfo.h" --#include "xf86Pci.h" --#include "xf86.h" --#include "fb.h" --#include "xf1bpp.h" --#include "xf4bpp.h" --#include "xf86_OSproc.h" --#include "xf86Resources.h" --#include "xf86Version.h" -- --#include "xf86cmap.h" -- --#include "xgi.h" --#include "xgi_regs.h" --#include "xgi_dac.h" --/* #include "valid_mode.h" */ -- --#define _XF86DGA_SERVER_ --#include -- --#include "globals.h" --#define DPMS_SERVER --#include -- --#include "vb_def.h" --extern int FbDevExist; -- --static Bool bAccessVGAPCIInfo(PXGI_HW_DEVICE_INFO pHwDevInfo, ULONG ulOffset, -- ULONG ulSet, ULONG *pulValue); --static Bool bAccessNBridgePCIInfo(PXGI_HW_DEVICE_INFO pHwDevInfo, -- ULONG ulOffset, ULONG ulSet, ULONG *pulValue); --static Bool XGI_IsXG21(ScrnInfoPtr pScrn); -- --static void XGI_InitHwDevInfo(ScrnInfoPtr pScrn); -- --static void --xgiXG40_Setup(ScrnInfoPtr pScrn) --{ -- static const char *const dramChannelStr[5] = { -- "", "Single", "Dual", "", "Quad" -- }; -- -- static const char *const dramTypeStr[4] = { -- "DDR SDRAM", -- "DDR2 SDRAM", -- "DDR2x SDRAM", -- "" -- }; -- --/********************************************************************* -- * Setup -- * Decide the following item of execution data: -- * -- * pXGI->BusWidth -- * pXGI->videoRam (with KB unit) -- * pXGI->CursorOffset (with Byte Unit) -- * pXGI->cmdQueueSize (with Byte Unit) -- * pXGI->cmdQueueSizeMask (with Byte Unit) -- * pXGI->cmdQueueOffset (with Byte Unit) -- * pXGI->cmdQueueLen = 0 ; // init value -- * pXGI->cmdQueueLenMin = 0x200 ; // init value -- * pXGI->cmdQueueLenMax = pXGI->cmdQueueSize - pXGI->cmdQueueLenMin ; -- *********************************************************************/ -- -- XGIPtr pXGI = XGIPTR(pScrn); -- unsigned int ulMemConfig = 0; -- unsigned mem_per_channel; -- unsigned mem_channels = 1; -- unsigned long ulDramType = 0; -- -- PDEBUG4(ErrorF("xgiXG40_Setup()\n")) ; -- -- pXGI->MemClock = XG40Mclk(pXGI); -- -- /* SR14 DRAM Size Register -- * Default value: XXh -- * D[7:4] Memory size per channel {BChMemSize} -- * 0011: 8 MB -- * 0100: 16 MB -- * 0101: 32 MB -- * 0110: 64 MB -- * 0111: 128 MB -- * 1000: 256MB -- * others: reserved -- * D[3:2] Number of dram channels [1:0] {BChNum} -- * 00: uni-channel -- * 01: reserved -- * 10: dual-channel -- * 11: quad-channel -- * D1 Data width per channel selection {BDataWidth} -- * 0: 32-bits -- * 1: 64-bits -- * D0 Dram channel mapping {BReverseChMapping} -- * 0: Normal mapping -- * 1: Reversal mapping -- * Dual-channel: Logical channel A/B to physical channel B/A -- * Quad-channel: Logical channel A/B/C/D to physical channel -- * C/D/A/B -- */ -- -- outXGIIDXREG(XGISR, 0x5, 0x86) ; -- inXGIIDXREG(XGISR, 0x14, ulMemConfig) ; -- -- /* FIXME: Is this correct? The SiS driver detects this differently -- * FIXME: for XG20. -- */ -- inXGIIDXREG(XGISR, 0x3A, ulDramType) ; -- -- PDEBUG(ErrorF("xg40_Setup(): ulMemConfig = %02X\n",ulMemConfig)) ; -- PDEBUG(ErrorF("xg40_Setup(): ulDramType = %02X\n",ulDramType)) ; -- -- /* FIXME: Is this correct? The SiS driver detects this differently -- * FIXME: for XG20. -- */ -- pXGI->BusWidth = (ulMemConfig & 0x02) ? 64 : 32; -- -- mem_per_channel = ((ulMemConfig >> 4) >= 3) -- ? (1 << (ulMemConfig >> 4)) * 1024 -- : 8 * 1024; -- -- -- /* All XG20 family chips are single channel, so only test the channel -- * count field on XG40 family chips. -- */ -- if (pXGI->Chipset == PCI_CHIP_XGIXG40) { -- /* Check the PCI revision field. For whatever reason, rev. 2 XG40 -- * chips encode the DRAM channel count differently than other -- * revisions. -- */ -- if (pXGI->ChipRev == 2) { -- switch ((ulMemConfig >> 2) & 0x1) { -- case 1: -- /* Dual channel */ -- mem_channels = 2; -- break ; -- } -- } -- else { -- switch ((ulMemConfig >> 2) & 0x3) { -- case 2: -- /* Dual channel */ -- mem_channels = 2; -- break ; -- case 3: -- /* Quad channel */ -- mem_channels = 4; -- break ; -- } -- } -- } -- -- pScrn->videoRam = mem_per_channel * mem_channels; -- -- /* SR15 DRAM Address Mapping Register -- * Default value: XXh -- * D7 Channel interleaving configuration { BChConfig } -- * 0: Divide the whole memory into 2/4 equal-sized regions , each mapped to one channel -- * 1: Divide the whole memory into 2 regions according to BTilingSize[1:0] . The low-address region -- * will be channel-interleaved as per BFineGranSize; the high-address region will be channel- -- * interleaved as per BCoarseGranSize[1:0] -- * D[6:5] Memory size of tile-mapped region {BTilingSize} -- * 00: 4 MB -- * 01: 8 MB -- * 10: 16 MB -- * 11: 32 MB -- * The following bits are effective only when D7=1 -- * D4 Channel-interleaving granularity for tile-mapped region {BFineGranSize} -- * 0: 64 B -- * 1: 128 B -- * D[3:2] Channel-interleaving granularity for linearly mapped region {BCoarseGranSize} -- * 00: 1KB -- * 01: 2KB -- * 10: 4KB -- * 11: 1MB -- * D[1:0] reserved -- */ -- -- /* Accelerator parameter Initialization */ -- -- pXGI->cmdQueueSize = (pXGI->Chipset == PCI_CHIP_XGIXG20) -- ? VOLARI_CQSIZEXG20 : VOLARI_CQSIZE; -- pXGI->cmdQueueSizeMask = pXGI->cmdQueueSize - 1 ; -- pXGI->pCQ_shareWritePort = &(pXGI->cmdQueue_shareWP_only2D); -- -- -- /* If FbDevExist, X.org driver uses 8MB only. The rest of the framebuffer -- * is used by the fbdev driver. -- */ -- if (FbDevExist) { -- /* FIXME: Is it even possible to have less than 8Mb of video memory? -- */ -- if (pScrn->videoRam < 8*1024) { -- pXGI->cmdQueueOffset = 4*1024*1024 - pXGI->cmdQueueSize; -- } -- else if (pScrn->videoRam < 16*1024) { -- pXGI->cmdQueueOffset = 8*1024*1024 - pXGI->cmdQueueSize; -- } -- else { -- pXGI->cmdQueueOffset = 13*1024*1024 - pXGI->cmdQueueSize; -- } -- } -- else { -- pXGI->cmdQueueOffset = (pScrn->videoRam)*1024 - pXGI->cmdQueueSize; -- } -- -- pXGI->CursorOffset = pXGI->cmdQueueOffset - 64*1024; -- PDEBUG4(ErrorF("pScrn->videoRam = %08lX pXGI->cmdQueueSize = %08lX\n", -- pScrn->videoRam, pXGI->cmdQueueSize)) ; -- PDEBUG4(ErrorF("pXGI->cmdQueueOffset = %08lX pXGI->CursorOffset = %08lX\n", -- pXGI->cmdQueueOffset, pXGI->CursorOffset)) ; -- -- pXGI->cmdQueueLen = 0 ; -- pXGI->cmdQueueLenMin = 0x200 ; -- pXGI->cmdQueueLenMax = pXGI->cmdQueueSize - pXGI->cmdQueueLenMin ; -- -- /* Dual Chip support put here -- */ -- xf86DrvMsg(pScrn->scrnIndex, X_PROBED, -- "Detected DRAM type : %s channel %s\n", -- dramChannelStr[mem_channels], -- dramTypeStr[(ulDramType & 0x02) >> 1]); -- xf86DrvMsg(pScrn->scrnIndex, X_PROBED, -- "Detected memory clock : %3.3fMHz\n", -- pXGI->MemClock/1000.0); -- xf86DrvMsg(pScrn->scrnIndex, X_PROBED, -- "Detected VRAM bus width is %d\n", pXGI->BusWidth); -- xf86DrvMsg(pScrn->scrnIndex, X_PROBED, -- "Detected Cmd Queue size is %d KB\n", pXGI->cmdQueueSize / 1024); -- xf86DrvMsg(pScrn->scrnIndex, X_PROBED, -- "Detected Cmd Queue Offset is %d\n", pXGI->cmdQueueOffset ) ; -- XGI_InitHwDevInfo(pScrn); --} -- --void --XGISetup(ScrnInfoPtr pScrn) --{ -- XGIPtr pXGI = XGIPTR(pScrn); -- -- pXGI->Flags = 0; -- pXGI->VBFlags = 0; -- -- switch (pXGI->Chipset) { -- case PCI_CHIP_XGIXG40: -- case PCI_CHIP_XGIXG20: -- default: -- xgiXG40_Setup(pScrn); -- break; -- } --} -- --Bool --XGI_IsXG21(ScrnInfoPtr pScrn) --{ -- XGIPtr pXGI = XGIPTR(pScrn); -- Bool is_XG21 = FALSE; -- -- if (pXGI->Chipset == PCI_CHIP_XGIXG20) { -- int temp; -- -- orXGIIDXREG(XGICR, Index_CR_GPIO_Reg3, GPIOG_EN); -- inXGIIDXREG(XGICR, Index_CR_GPIO_Reg1, temp); -- -- is_XG21 = ((temp & GPIOG_READ) != 0); -- } -- -- return is_XG21; --} -- --void --XGI_InitHwDevInfo(ScrnInfoPtr pScrn) --{ -- XGIPtr pXGI = XGIPTR(pScrn); -- PXGI_HW_DEVICE_INFO pHwDevInfo = &pXGI->xgi_HwDevExt; -- int i; -- -- pHwDevInfo->pDevice = pXGI ; -- pHwDevInfo->pjVirtualRomBase = pXGI->BIOS ; -- pHwDevInfo->pjCustomizedROMImage = NULL ; -- pHwDevInfo->pjVideoMemoryAddress = (UCHAR*)(pXGI->FbBase) ; -- PDEBUG(ErrorF("pXGI->FbBase = 0x%08lx\n",(ULONG)(pXGI->FbBase))) ; -- PDEBUG(ErrorF("pHwDevInfo->pjVideoMemoryAddress = 0x%08lx\n",(ULONG)(pHwDevInfo->pjVideoMemoryAddress))) ; -- pHwDevInfo->ulVideoMemorySize = pXGI->FbMapSize ; -- pHwDevInfo->pjIOAddress = pXGI->RelIO + 0x30 ; -- -- switch (pXGI->Chipset) { -- case PCI_CHIP_XGIXG40: -- pHwDevInfo->jChipType = XG40 ; -- break ; -- case PCI_CHIP_XGIXG20: -- pHwDevInfo->jChipType = XGI_IsXG21(pScrn)?XG21:XG20 ; -- break ; -- default: -- pHwDevInfo->jChipType = XG40 ; -- break ; -- } -- -- pHwDevInfo->jChipRevision = pXGI->ChipRev; -- pHwDevInfo->ujVBChipID = VB_CHIP_UNKNOWN ; -- pHwDevInfo->ulExternalChip = 0 ; -- -- pHwDevInfo->ulCRT2LCDType = LCD_1024x768 ; -- pHwDevInfo->bIntegratedMMEnabled = FALSE ; -- pHwDevInfo->bSkipDramSizing = TRUE ; -- -- pHwDevInfo->pSR = pXGI->SRList ; -- pHwDevInfo->pCR = pXGI->CRList ; -- pHwDevInfo->pQueryVGAConfigSpace = (PXGI_QUERYSPACE) bAccessVGAPCIInfo; -- -- for( i = 0 ; i < ExtRegSize ; i++ ){ -- pHwDevInfo->pSR[i].jIdx = 0xFF ; -- pHwDevInfo->pSR[i].jVal = 0xFF ; -- pHwDevInfo->pCR[i].jIdx = 0xFF ; -- pHwDevInfo->pCR[i].jVal = 0xFF ; -- } -- -- for( i = 0 ; i < VBIOS_VER_MAX_LENGTH ; i++ ){ -- pHwDevInfo -> szVBIOSVer[i] = '\0' ; -- } -- -- -- XGINew_InitVBIOSData(pHwDevInfo, pXGI->XGI_Pr); -- PDEBUG(ErrorF("XGINew_InitVBIOSData(pHwDevInfo) done\n")) ; -- -- ErrorF("XGI_InitVBIOSData VBType = %x\n", pXGI->XGI_Pr->VBType); -- XGI_New_GetVBType(pXGI->XGI_Pr, pHwDevInfo); //yilin -- ErrorF("XGI_New_GetVBType VBType = %x\n", pXGI->XGI_Pr->VBType); -- -- // pHwDevInfo->ujVBChipID = VB_CHIP_301 ; //yilin -- if( pXGI->XGI_Pr->VBType & (VB_XGI301 | VB_XGI301B | VB_XGI301C)) -- { -- PDEBUG(ErrorF("VB chip = 301 \n")) ; -- pHwDevInfo->ujVBChipID = VB_CHIP_301 ; -- } -- else if( pXGI->VBFlags & ( VB_XGI302B| VB_XGI302LV )) -- { -- pHwDevInfo->ujVBChipID = VB_CHIP_302 ; -- } --/* -- else if (pXGI->VBFlags & VB_LVDS) { -- pHwDevInfo->ulExternalChip |= 0x01 ; -- } --*/ //yilin -- -- -- PDEBUG(ErrorF("pHwDevInfo->jChipType = %08lX done\n",pHwDevInfo->jChipType)) ; --} -- --Bool --bAccessVGAPCIInfo(PXGI_HW_DEVICE_INFO pHwDevInfo, ULONG ulOffset, ULONG ulSet, ULONG *pulValue) --{ -- XGIPtr pXGI ; --#ifdef XSERVER_LIBPCIACCESS -- int err; --#else -- PCITAG pciDev; --#endif -- -- if (!pHwDevInfo || !pulValue) { -- return FALSE; -- } -- -- pXGI = (XGIPtr)pHwDevInfo->pDevice ; --#ifdef XSERVER_LIBPCIACCESS -- if (ulSet) { -- err = pci_device_cfg_write_u32(pXGI->PciInfo, *pulValue, -- ulOffset & ~3); -- } else { -- err = pci_device_cfg_write_u32(pXGI->PciInfo, pulValue, -- ulOffset & ~3); -- } -- -- return (err == 0); --#else -- pciDev = pXGI->PciTag ; -- -- if (ulSet) { -- pciWriteLong(pciDev, ulOffset&0xFFFFFFFc, *pulValue); -- } else { -- *pulValue = pciReadLong(pciDev, ulOffset&0xFFFFFFFc); -- } -- -- return TRUE ; --#endif --} -+/* -+ * Basic hardware and memory detection -+ * -+ * Copyright (C) 2001-2004 by Thomas Winischhofer, Vienna, Austria. -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * 1) Redistributions of source code must retain the above copyright -+ * notice, this list of conditions and the following disclaimer. -+ * 2) Redistributions in binary form must reproduce the above copyright -+ * notice, this list of conditions and the following disclaimer in the -+ * documentation and/or other materials provided with the distribution. -+ * 3) The name of the author may not be used to endorse or promote products -+ * derived from this software without specific prior written permission. -+ * -+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESSED OR -+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, -+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -+ * -+ * Author: Thomas Winischhofer -+ * -+ * Ideas and methods for old series based on code by Can-Ru Yeou, XGI Inc. -+ * -+ */ -+ -+#ifdef HAVE_CONFIG_H -+#include "config.h" -+#endif -+ -+#include "xf86PciInfo.h" -+#include "xf86Pci.h" -+#include "xf86.h" -+#include "fb.h" -+#include "xf1bpp.h" -+#include "xf4bpp.h" -+#include "xf86_OSproc.h" -+#include "xf86Resources.h" -+#include "xf86Version.h" -+ -+#include "xf86cmap.h" -+ -+#include "xgi.h" -+#include "xgi_regs.h" -+#include "xgi_dac.h" -+/* #include "valid_mode.h" */ -+ -+#define _XF86DGA_SERVER_ -+#include -+ -+#include "globals.h" -+#define DPMS_SERVER -+#include -+ -+#include "vb_def.h" -+extern int FbDevExist; -+ -+static Bool bAccessVGAPCIInfo(PXGI_HW_DEVICE_INFO pHwDevInfo, ULONG ulOffset, -+ ULONG ulSet, ULONG *pulValue); -+static Bool bAccessNBridgePCIInfo(PXGI_HW_DEVICE_INFO pHwDevInfo, -+ ULONG ulOffset, ULONG ulSet, ULONG *pulValue); -+static Bool XGI_IsXG21(ScrnInfoPtr pScrn); -+ -+static void XGI_InitHwDevInfo(ScrnInfoPtr pScrn); -+ -+/* Jong 10/16/2007; merge code */ -+static void -+xgiXG2X_Setup(ScrnInfoPtr pScrn) -+{ -+ -+/********************************************************************* -+ * Setup -+ * Decide the following item of execution data: -+ * -+ * pXGI->BusWidth -+ * pXGI->videoRam (with KB unit) -+ * pXGI->CursorOffset (with Byte Unit) -+ * pXGI->cmdQueueSize (with Byte Unit) -+ * pXGI->cmdQueueSizeMask (with Byte Unit) -+ * pXGI->cmdQueueOffset (with Byte Unit) -+ * pXGI->cmdQueueLen = 0 ; // init value -+ * pXGI->cmdQueueLenMin = 0x200 ; // init value -+ * pXGI->cmdQueueLenMax = pXGI->cmdQueueSize - pXGI->cmdQueueLenMin ; -+ *********************************************************************/ -+ -+ XGIPtr pXGI = XGIPTR(pScrn); -+ unsigned int ulMemConfig = 0; -+ unsigned long ulMemSize = 0; -+ unsigned long ulDramType = 0; -+ char *dramTypeStr ; -+ unsigned long ulTemp ; -+ -+ /* DumpDDIName("xgiXG2X_Setup()\n") ; */ -+ -+ inXGIIDXREG(XGICR, 0x48, ulTemp) ; -+ if(ulTemp & (1<<0)) /* GPIOH, CR48 D[0] read */ -+ { -+ dramTypeStr = "DDRII DRAM" ; -+ } -+ else -+ { -+ dramTypeStr = "DDR DRAM" ; -+ } -+ -+ -+ pXGI->MemClock = XG40Mclk(pXGI); -+ -+ /********************************************************************************************************* -+ * SR14 DRAM Size Register -+ * Default value: XXh -+ * D[7:4] Memory size per channel {BChMemSize} -+ * 0011: 8 MB -+ * 0100: 16 MB -+ * 0101: 32 MB -+ * 0110: 64 MB -+ * 0111: 128 MB -+ * 1000: 256MB -+ * others: reserved -+ * D[3:2] Number of dram channels [1:0] {BChNum} -+ * 00: uni-channel -+ * 01: reserved -+ * 10: dual-channel. -+ * 11: quad-channel -+ * D1 Data width per channel selection {BDataWidth} -+ * 0: 32-bits -+ * 1: 64-bits -+ * D0 Dram channel mapping {BReverseChMapping} -+ * 0: Normal mapping -+ * 1: Reversal mapping -+ * Dual-channel: Logical channel A/B to physical channel B/A -+ * Quad-channel: Logical channel A/B/C/D to physical channel C/D/A/B -+ * -+ *********************************************************************************************************/ -+ -+ outXGIIDXREG(XGISR, 0x5, 0x86) ; -+ inXGIIDXREG(XGISR, 0x14, ulMemConfig) ; -+ inXGIIDXREG(XGISR, 0x3A, ulDramType) ; -+ -+ PDEBUG(ErrorF("xg40_Setup(): ulMemConfig = %02X\n",ulMemConfig)) ; -+ PDEBUG(ErrorF("xg40_Setup(): ulDramType = %02X\n",ulDramType)) ; -+ -+ pXGI->BusWidth = (ulMemConfig & (1<<1) )?64:32 ; -+ -+ switch(ulMemConfig>>4) -+ { -+ case 8: -+ ulMemSize = 256*1024 ; -+ break ; -+ case 7: -+ ulMemSize = 128*1024 ; -+ break ; -+ case 6: -+ ulMemSize = 64*1024 ; -+ break ; -+ case 5: -+ ulMemSize = 32*1024 ; -+ break ; -+ case 4: -+ ulMemSize = 16*1024 ; -+ break ; -+ case 3: -+ ulMemSize = 8*1024 ; -+ break ; -+ default: -+ ulMemSize = 8*1024 ; -+ } -+ -+ if( pXGI->Chipset == PCI_CHIP_XGIXG40) -+ { -+ if ( (pciReadLong(pXGI->PciTag, 0x08) & 0xFF ) == 2 ) -+ { -+ switch((ulMemConfig>>2)&0x1) -+ { -+ case 0: -+ /* Uni channel */ -+ ulMemSize *= 1 ; -+ break ; -+ case 1: -+ /* Dual channel */ -+ ulMemSize *= 2 ; -+ break ; -+ } -+ } -+ else -+ { -+ switch((ulMemConfig>>2)&0x3) -+ { -+ case 2: -+ /* Dual channel */ -+ ulMemSize *= 2 ; -+ break ; -+ case 3: -+ /* Quad channel */ -+ ulMemSize *= 4 ; -+ break ; -+ } -+ } -+ } -+ -+ pScrn->videoRam = ulMemSize ; -+ -+ /********************************************************************************************************* -+ * SR15 DRAM Address Mapping Register -+ * Default value: XXh -+ * D7 Channel interleaving configuration { BChConfig } -+ * 0: Divide the whole memory into 2/4 equal-sized regions , each mapped to one channel -+ * 1: Divide the whole memory into 2 regions according to BTilingSize[1:0] . The low-address region -+ * will be channel-interleaved as per BFineGranSize; the high-address region will be channel- -+ * interleaved as per BCoarseGranSize[1:0] -+ * D[6:5] Memory size of tile-mapped region {BTilingSize} -+ * 00: 4 MB -+ * 01: 8 MB -+ * 10: 16 MB -+ * 11: 32 MB -+ * The following bits are effective only when D7=1 -+ * D4 Channel-interleaving granularity for tile-mapped region {BFineGranSize} -+ * 0: 64 B -+ * 1: 128 B -+ * D[3:2] Channel-interleaving granularity for linearly mapped region {BCoarseGranSize} -+ * 00: 1KB -+ * 01: 2KB -+ * 10: 4KB -+ * 11: 1MB -+ * D[1:0] reserved -+ *********************************************************************************************************/ -+ -+ /* Accelerator parameter Initialization */ -+ if(( pXGI->Chipset == PCI_CHIP_XGIXG20 )||( pXGI->Chipset == PCI_CHIP_XGIXG21 )||( pXGI->Chipset == PCI_CHIP_XGIXG27 )) -+ { -+ pXGI->cmdQueueSize = VOLARI_CQSIZEXG20; -+ /* XgiMode = XG20_Mode ; */ -+ PDEBUG(ErrorF(" ---XG20_Mode \n")); -+ } -+ -+ -+ pXGI->cmdQueueSizeMask = pXGI->cmdQueueSize - 1 ; -+ pXGI->pCQ_shareWritePort = &(pXGI->cmdQueue_shareWP_only2D); -+ -+ -+ /* -+ If FbDevExist, XFree86 driver use the 8MB only. The rest -+ frame buffer is used by other AP. -+ */ -+ -+ if( FbDevExist && (pXGI->Chipset != PCI_CHIP_XGIXG20 ) && (pXGI->Chipset != PCI_CHIP_XGIXG21 ) && (pXGI->Chipset != PCI_CHIP_XGIXG27 ) ) -+ { -+ if( pScrn->videoRam < 8*1024 ) -+ { -+ pXGI->cmdQueueOffset = 4*1024*1024 - pXGI->cmdQueueSize ; -+ } -+ else if( pScrn->videoRam < 16*1024 ) -+ { -+ pXGI->cmdQueueOffset = 8*1024*1024 - pXGI->cmdQueueSize ; -+ } -+ else -+ { -+ pXGI->cmdQueueOffset = 13*1024*1024 - pXGI->cmdQueueSize ; -+ } -+ } -+ else -+ { -+ pXGI->cmdQueueOffset = (pScrn->videoRam)*1024 - pXGI->cmdQueueSize ; -+ } -+ -+ pXGI->CursorOffset = pXGI->cmdQueueOffset - 64*1024 ; -+ PDEBUG4(ErrorF("pScrn->videoRam = %08lX pXGI->cmdQueueSize = %08lX\n", -+ pScrn->videoRam, pXGI->cmdQueueSize)) ; -+ PDEBUG4(ErrorF("pXGI->cmdQueueOffset = %08lX pXGI->CursorOffset = %08lX\n", -+ pXGI->cmdQueueOffset, pXGI->CursorOffset)) ; -+ -+ pXGI->cmdQueueLen = 0 ; -+ pXGI->cmdQueueLenMin = 0x200 ; -+ pXGI->cmdQueueLenMax = pXGI->cmdQueueSize - pXGI->cmdQueueLenMin ; -+ -+ /***************************************************************** -+ * Dual Chip support put here * -+ *****************************************************************/ -+ xf86DrvMsg(pScrn->scrnIndex, X_PROBED, -+ "Detected DRAM type : %s\n", dramTypeStr); -+ xf86DrvMsg(pScrn->scrnIndex, X_PROBED, -+ "Detected memory clock : %3.3fMHz\n", -+ pXGI->MemClock/1000.0); -+ xf86DrvMsg(pScrn->scrnIndex, X_PROBED, -+ "Detected VRAM bus width is %d\n", pXGI->BusWidth); -+ xf86DrvMsg(pScrn->scrnIndex, X_PROBED, -+ "Detected Cmd Queue size is %d KB\n", pXGI->cmdQueueSize / 1024); -+ xf86DrvMsg(pScrn->scrnIndex, X_PROBED, -+ "Detected Cmd Queue Offset is %d\n", pXGI->cmdQueueOffset ) ; -+ XGI_InitHwDevInfo(pScrn); -+} -+ -+static void -+xgiXG40_Setup(ScrnInfoPtr pScrn) -+{ -+ static const char *const dramChannelStr[5] = { -+ "", "Single", "Dual", "", "Quad" -+ }; -+ -+ static const char *const dramTypeStr[4] = { -+ "DDR SDRAM", -+ "DDR2 SDRAM", -+ "DDR2x SDRAM", -+ "" -+ }; -+ -+/********************************************************************* -+ * Setup -+ * Decide the following item of execution data: -+ * -+ * pXGI->BusWidth -+ * pXGI->videoRam (with KB unit) -+ * pXGI->CursorOffset (with Byte Unit) -+ * pXGI->cmdQueueSize (with Byte Unit) -+ * pXGI->cmdQueueSizeMask (with Byte Unit) -+ * pXGI->cmdQueueOffset (with Byte Unit) -+ * pXGI->cmdQueueLen = 0 ; // init value -+ * pXGI->cmdQueueLenMin = 0x200 ; // init value -+ * pXGI->cmdQueueLenMax = pXGI->cmdQueueSize - pXGI->cmdQueueLenMin ; -+ *********************************************************************/ -+ -+ XGIPtr pXGI = XGIPTR(pScrn); -+ unsigned int ulMemConfig = 0; -+ unsigned mem_per_channel; -+ unsigned mem_channels = 1; -+ unsigned long ulDramType = 0; -+ -+ PDEBUG4(ErrorF("xgiXG40_Setup()\n")) ; -+ -+ pXGI->MemClock = XG40Mclk(pXGI); -+ -+ /* SR14 DRAM Size Register -+ * Default value: XXh -+ * D[7:4] Memory size per channel {BChMemSize} -+ * 0011: 8 MB -+ * 0100: 16 MB -+ * 0101: 32 MB -+ * 0110: 64 MB -+ * 0111: 128 MB -+ * 1000: 256MB -+ * others: reserved -+ * D[3:2] Number of dram channels [1:0] {BChNum} -+ * 00: uni-channel -+ * 01: reserved -+ * 10: dual-channel -+ * 11: quad-channel -+ * D1 Data width per channel selection {BDataWidth} -+ * 0: 32-bits -+ * 1: 64-bits -+ * D0 Dram channel mapping {BReverseChMapping} -+ * 0: Normal mapping -+ * 1: Reversal mapping -+ * Dual-channel: Logical channel A/B to physical channel B/A -+ * Quad-channel: Logical channel A/B/C/D to physical channel -+ * C/D/A/B -+ */ -+ -+ outXGIIDXREG(XGISR, 0x5, 0x86) ; -+ inXGIIDXREG(XGISR, 0x14, ulMemConfig) ; -+ -+ /* FIXME: Is this correct? The SiS driver detects this differently -+ * FIXME: for XG20. -+ */ -+ inXGIIDXREG(XGISR, 0x3A, ulDramType) ; -+ -+ PDEBUG(ErrorF("xg40_Setup(): ulMemConfig = %02X\n",ulMemConfig)) ; -+ PDEBUG(ErrorF("xg40_Setup(): ulDramType = %02X\n",ulDramType)) ; -+ -+ /* FIXME: Is this correct? The SiS driver detects this differently -+ * FIXME: for XG20. -+ */ -+ pXGI->BusWidth = (ulMemConfig & 0x02) ? 64 : 32; -+ -+ mem_per_channel = ((ulMemConfig >> 4) >= 3) -+ ? (1 << (ulMemConfig >> 4)) * 1024 -+ : 8 * 1024; -+ -+ -+ /* All XG20 family chips are single channel, so only test the channel -+ * count field on XG40 family chips. -+ */ -+ if (pXGI->Chipset == PCI_CHIP_XGIXG40) { -+ /* Check the PCI revision field. For whatever reason, rev. 2 XG40 -+ * chips encode the DRAM channel count differently than other -+ * revisions. -+ */ -+ if (pXGI->ChipRev == 2) { -+ switch ((ulMemConfig >> 2) & 0x1) { -+ case 1: -+ /* Dual channel */ -+ mem_channels = 2; -+ break ; -+ } -+ } -+ else { -+ switch ((ulMemConfig >> 2) & 0x3) { -+ case 2: -+ /* Dual channel */ -+ mem_channels = 2; -+ break ; -+ case 3: -+ /* Quad channel */ -+ mem_channels = 4; -+ break ; -+ } -+ } -+ } -+ -+ pScrn->videoRam = mem_per_channel * mem_channels; -+ -+ /* SR15 DRAM Address Mapping Register -+ * Default value: XXh -+ * D7 Channel interleaving configuration { BChConfig } -+ * 0: Divide the whole memory into 2/4 equal-sized regions , each mapped to one channel -+ * 1: Divide the whole memory into 2 regions according to BTilingSize[1:0] . The low-address region -+ * will be channel-interleaved as per BFineGranSize; the high-address region will be channel- -+ * interleaved as per BCoarseGranSize[1:0] -+ * D[6:5] Memory size of tile-mapped region {BTilingSize} -+ * 00: 4 MB -+ * 01: 8 MB -+ * 10: 16 MB -+ * 11: 32 MB -+ * The following bits are effective only when D7=1 -+ * D4 Channel-interleaving granularity for tile-mapped region {BFineGranSize} -+ * 0: 64 B -+ * 1: 128 B -+ * D[3:2] Channel-interleaving granularity for linearly mapped region {BCoarseGranSize} -+ * 00: 1KB -+ * 01: 2KB -+ * 10: 4KB -+ * 11: 1MB -+ * D[1:0] reserved -+ */ -+ -+ /* Accelerator parameter Initialization */ -+ -+ pXGI->cmdQueueSize = ((pXGI->Chipset == PCI_CHIP_XGIXG20)||(pXGI->Chipset == PCI_CHIP_XGIXG21||(pXGI->Chipset == PCI_CHIP_XGIXG27))) -+ ? VOLARI_CQSIZEXG20 : VOLARI_CQSIZE; -+ pXGI->cmdQueueSizeMask = pXGI->cmdQueueSize - 1 ; -+ pXGI->pCQ_shareWritePort = &(pXGI->cmdQueue_shareWP_only2D); -+ -+ -+ /* If FbDevExist, X.org driver uses 8MB only. The rest of the framebuffer -+ * is used by the fbdev driver. -+ */ -+ if (FbDevExist) { -+ /* FIXME: Is it even possible to have less than 8Mb of video memory? -+ */ -+ if (pScrn->videoRam < 8*1024) { -+ pXGI->cmdQueueOffset = 4*1024*1024 - pXGI->cmdQueueSize; -+ } -+ else if (pScrn->videoRam < 16*1024) { -+ pXGI->cmdQueueOffset = 8*1024*1024 - pXGI->cmdQueueSize; -+ } -+ else { -+ pXGI->cmdQueueOffset = 13*1024*1024 - pXGI->cmdQueueSize; -+ } -+ } -+ else { -+ pXGI->cmdQueueOffset = (pScrn->videoRam)*1024 - pXGI->cmdQueueSize; -+ } -+ -+ pXGI->CursorOffset = pXGI->cmdQueueOffset - 64*1024; -+ PDEBUG4(ErrorF("pScrn->videoRam = %08lX pXGI->cmdQueueSize = %08lX\n", -+ pScrn->videoRam, pXGI->cmdQueueSize)) ; -+ PDEBUG4(ErrorF("pXGI->cmdQueueOffset = %08lX pXGI->CursorOffset = %08lX\n", -+ pXGI->cmdQueueOffset, pXGI->CursorOffset)) ; -+ -+ pXGI->cmdQueueLen = 0 ; -+ pXGI->cmdQueueLenMin = 0x200 ; -+ pXGI->cmdQueueLenMax = pXGI->cmdQueueSize - pXGI->cmdQueueLenMin ; -+ -+ /* Dual Chip support put here -+ */ -+ xf86DrvMsg(pScrn->scrnIndex, X_PROBED, -+ "Detected DRAM type : %s channel %s\n", -+ dramChannelStr[mem_channels], -+ dramTypeStr[(ulDramType & 0x02) >> 1]); -+ xf86DrvMsg(pScrn->scrnIndex, X_PROBED, -+ "Detected memory clock : %3.3fMHz\n", -+ pXGI->MemClock/1000.0); -+ xf86DrvMsg(pScrn->scrnIndex, X_PROBED, -+ "Detected VRAM bus width is %d\n", pXGI->BusWidth); -+ xf86DrvMsg(pScrn->scrnIndex, X_PROBED, -+ "Detected Cmd Queue size is %d KB\n", pXGI->cmdQueueSize / 1024); -+ xf86DrvMsg(pScrn->scrnIndex, X_PROBED, -+ "Detected Cmd Queue Offset is %d\n", pXGI->cmdQueueOffset ) ; -+ XGI_InitHwDevInfo(pScrn); -+} -+ -+void -+XGISetup(ScrnInfoPtr pScrn) -+{ -+ XGIPtr pXGI = XGIPTR(pScrn); -+ -+ pXGI->Flags = 0; -+ pXGI->VBFlags = 0; -+ -+ /* Jong 10/16/2007; merge code */ -+ switch (pXGI->Chipset) { -+ case PCI_CHIP_XGIXG20: -+ case PCI_CHIP_XGIXG21: -+ case PCI_CHIP_XGIXG27: -+ xgiXG2X_Setup(pScrn); -+ break; -+ -+ case PCI_CHIP_XGIXG40: -+ default: -+ xgiXG40_Setup(pScrn); -+ break; -+ } -+} -+ -+/* Jong 01/07/2008; Force to disable 2D engine by SR3A[6]=1 */ -+Bool ForceToDisable2DEngine(ScrnInfoPtr pScrn) -+{ -+ XGIPtr pXGI ; -+ Bool bReturn=FALSE; -+ CARD8 bForce; -+ -+ pXGI = XGIPTR(pScrn); -+ -+ if(pXGI->Chipset == PCI_CHIP_XGIXG21) -+ { -+ inXGIIDXREG(XGISR, 0x3A, bForce) ; -+ bForce &= 0x40; -+ -+ if(bForce == 0) -+ bReturn=FALSE; -+ else -+ bReturn=TRUE; -+ } -+ else -+ { -+ bReturn=FALSE; -+ } -+ -+ return(bReturn); -+} -+ -+Bool -+XGI_IsXG21(ScrnInfoPtr pScrn) -+{ -+ XGIPtr pXGI = XGIPTR(pScrn); -+ Bool is_XG21 = FALSE; -+ -+ if (pXGI->Chipset == PCI_CHIP_XGIXG20) { -+ int temp; -+ -+ orXGIIDXREG(XGICR, Index_CR_GPIO_Reg3, GPIOG_EN); -+ inXGIIDXREG(XGICR, Index_CR_GPIO_Reg1, temp); -+ -+ is_XG21 = ((temp & GPIOG_READ) != 0); -+ } -+ -+ return is_XG21; -+} -+ -+void -+XGI_InitHwDevInfo(ScrnInfoPtr pScrn) -+{ -+ XGIPtr pXGI = XGIPTR(pScrn); -+ PXGI_HW_DEVICE_INFO pHwDevInfo = &pXGI->xgi_HwDevExt; -+ int i; -+ -+ pHwDevInfo->pDevice = pXGI ; -+ pHwDevInfo->pjVirtualRomBase = pXGI->BIOS ; -+ pHwDevInfo->pjCustomizedROMImage = NULL ; -+ pHwDevInfo->pjVideoMemoryAddress = (UCHAR*)(pXGI->FbBase) ; -+ PDEBUG(ErrorF("pXGI->FbBase = 0x%08lx\n",(ULONG)(pXGI->FbBase))) ; -+ PDEBUG(ErrorF("pHwDevInfo->pjVideoMemoryAddress = 0x%08lx\n",(ULONG)(pHwDevInfo->pjVideoMemoryAddress))) ; -+ pHwDevInfo->ulVideoMemorySize = pXGI->FbMapSize ; -+ pHwDevInfo->pjIOAddress = pXGI->RelIO + 0x30 ; -+ -+ switch (pXGI->Chipset) { -+ case PCI_CHIP_XGIXG40: -+ pHwDevInfo->jChipType = XG40 ; -+ break ; -+ case PCI_CHIP_XGIXG20: -+ pHwDevInfo->jChipType = XGI_IsXG21(pScrn)?XG21:XG20 ; -+ break ; -+ case PCI_CHIP_XGIXG27: -+ pHwDevInfo->jChipType = XG27; -+ break; -+ case PCI_CHIP_XGIXG21: -+ pHwDevInfo->jChipType = XG21; -+ break; -+ default: -+ pHwDevInfo->jChipType = XG40 ; -+ break ; -+ } -+ -+ pHwDevInfo->jChipRevision = pXGI->ChipRev; -+ pHwDevInfo->ujVBChipID = VB_CHIP_UNKNOWN ; -+ pHwDevInfo->ulExternalChip = 0 ; -+ -+ pHwDevInfo->ulCRT2LCDType = LCD_1024x768 ; -+ pHwDevInfo->bIntegratedMMEnabled = FALSE ; -+ pHwDevInfo->bSkipDramSizing = TRUE ; -+ -+ pHwDevInfo->pSR = pXGI->SRList ; -+ pHwDevInfo->pCR = pXGI->CRList ; -+ pHwDevInfo->pQueryVGAConfigSpace = (PXGI_QUERYSPACE) bAccessVGAPCIInfo; -+ -+ for( i = 0 ; i < ExtRegSize ; i++ ){ -+ pHwDevInfo->pSR[i].jIdx = 0xFF ; -+ pHwDevInfo->pSR[i].jVal = 0xFF ; -+ pHwDevInfo->pCR[i].jIdx = 0xFF ; -+ pHwDevInfo->pCR[i].jVal = 0xFF ; -+ } -+ -+ for( i = 0 ; i < VBIOS_VER_MAX_LENGTH ; i++ ){ -+ pHwDevInfo -> szVBIOSVer[i] = '\0' ; -+ } -+ -+ -+ XGINew_InitVBIOSData(pHwDevInfo, pXGI->XGI_Pr); -+ PDEBUG(ErrorF("XGINew_InitVBIOSData(pHwDevInfo) done\n")) ; -+ -+ ErrorF("XGI_InitVBIOSData VBType = %x\n", pXGI->XGI_Pr->VBType); -+ XGI_New_GetVBType(pXGI->XGI_Pr, pHwDevInfo); //yilin -+ ErrorF("XGI_New_GetVBType VBType = %x\n", pXGI->XGI_Pr->VBType); -+ -+ // pHwDevInfo->ujVBChipID = VB_CHIP_301 ; //yilin -+ if( pXGI->XGI_Pr->VBType & (VB_XGI301 | VB_XGI301B | VB_XGI301C)) -+ { -+ PDEBUG(ErrorF("VB chip = 301 \n")) ; -+ pHwDevInfo->ujVBChipID = VB_CHIP_301 ; -+ } -+ else if( pXGI->VBFlags & ( VB_XGI302B| VB_XGI302LV )) -+ { -+ pHwDevInfo->ujVBChipID = VB_CHIP_302 ; -+ } -+/* -+ else if (pXGI->VBFlags & VB_LVDS) { -+ pHwDevInfo->ulExternalChip |= 0x01 ; -+ } -+*/ //yilin -+ -+ -+ PDEBUG(ErrorF("pHwDevInfo->jChipType = %08lX done\n",pHwDevInfo->jChipType)) ; -+} -+ -+Bool -+bAccessVGAPCIInfo(PXGI_HW_DEVICE_INFO pHwDevInfo, ULONG ulOffset, ULONG ulSet, ULONG *pulValue) -+{ -+ XGIPtr pXGI ; -+#ifdef XSERVER_LIBPCIACCESS -+ int err; -+#else -+ PCITAG pciDev; -+#endif -+ -+ if (!pHwDevInfo || !pulValue) { -+ return FALSE; -+ } -+ -+ pXGI = (XGIPtr)pHwDevInfo->pDevice ; -+#ifdef XSERVER_LIBPCIACCESS -+ if (ulSet) { -+ err = pci_device_cfg_write_u32(pXGI->PciInfo, *pulValue, -+ ulOffset & ~3); -+ } else { -+ err = pci_device_cfg_write_u32(pXGI->PciInfo, pulValue, -+ ulOffset & ~3); -+ } -+ -+ return (err == 0); -+#else -+ pciDev = pXGI->PciTag ; -+ -+ if (ulSet) { -+ pciWriteLong(pciDev, ulOffset&0xFFFFFFFc, *pulValue); -+ } else { -+ *pulValue = pciReadLong(pciDev, ulOffset&0xFFFFFFFc); -+ } -+ -+ return TRUE ; -+#endif -+} -diff --git a/src/xgi_vb.c b/src/xgi_vb.c -diff --git a/src/xgi_vb.h b/src/xgi_vb.h -diff --git a/src/xgi_vga.c b/src/xgi_vga.c -index 8ff0cb0..4639d3e 100644 ---- a/src/xgi_vga.c -+++ b/src/xgi_vga.c -@@ -1,263 +1,276 @@ --/* -- * Mode setup and basic video bridge detection -- * -- * Copyright (C) 2001-2004 by Thomas Winischhofer, Vienna, Austria. -- * -- * Redistribution and use in source and binary forms, with or without -- * modification, are permitted provided that the following conditions -- * are met: -- * 1) Redistributions of source code must retain the above copyright -- * notice, this list of conditions and the following disclaimer. -- * 2) Redistributions in binary form must reproduce the above copyright -- * notice, this list of conditions and the following disclaimer in the -- * documentation and/or other materials provided with the distribution. -- * 3) The name of the author may not be used to endorse or promote products -- * derived from this software without specific prior written permission. -- * -- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESSED OR -- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, -- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -- * -- * Author: Thomas Winischhofer -- * -- * Init() function for old series (except for TV and FIFO calculation) -- * previously based on code which is Copyright (C) 1998,1999 by Alan -- * Hourihane, Wigan, England -- */ -- --#ifdef HAVE_CONFIG_H --#include "config.h" --#endif -- --#include "xf86.h" --#include "xf86_OSproc.h" --#include "xf86Version.h" --#include "xf86PciInfo.h" --#include "xf86Pci.h" -- --#include "xgi.h" --#include "xgi_regs.h" --#include "xgi_dac.h" -- --#include "vb_def.h" -- --Bool XG40Init(ScrnInfoPtr pScrn, DisplayModePtr mode); -- --#define Midx 0 --#define Nidx 1 --#define VLDidx 2 --#define Pidx 3 -- --Bool --XG40Init(ScrnInfoPtr pScrn, DisplayModePtr mode) --{ -- XGIPtr pXGI = XGIPTR(pScrn); -- XGIRegPtr pReg = &pXGI->ModeReg; -- vgaRegPtr vgaReg = &VGAHWPTR(pScrn)->ModeReg; -- int vgaIOBase; -- unsigned short temp; -- int offset; -- int clock = mode->Clock; -- unsigned int vclk[5]; -- -- int num, denum, div, sbit, scale; -- unsigned short Threshold_Low, Threshold_High; -- --PDEBUG(ErrorF("XG40Init()\n")); -- -- xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 4, "XG40Init()\n"); -- xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 4, -- "virtualX = %d depth = %d Logical width = %d\n", -- pScrn->virtualX, pScrn->bitsPerPixel, -- pScrn->virtualX * pScrn->bitsPerPixel/8); -- -- vgaHWGetIOBase(VGAHWPTR(pScrn)); -- vgaIOBase = VGAHWPTR(pScrn)->IOBase; -- -- (*pXGI->XGISave)(pScrn, pReg); -- -- outw(VGA_SEQ_INDEX, 0x8605); -- -- pReg->xgiRegs3C4[6] &= ~GENMASK(4:2); -- -- switch (pScrn->bitsPerPixel) { -- case 8: -- pXGI->DstColor = 0 ; -- pReg->xgiRegs3C4[6] |= 0x03; -- PDEBUG(ErrorF("8: pXGI->DstColor = %08lX\n",pXGI->DstColor)) ; -- break; -- case 16: -- pXGI->DstColor = 1 << 16 ; -- PDEBUG(ErrorF("16: pXGI->DstColor = %08lX\n",pXGI->DstColor)) ; -- if (pScrn->depth==15) { -- pReg->xgiRegs3C4[6] |= ((1 << 2) | 0x03); -- } else { -- pReg->xgiRegs3C4[6] |= ((2 << 2) | 0x03); -- } -- break; -- case 24: -- pReg->xgiRegs3C4[6] |= ((3 << 2) | 0x03); -- break; -- case 32: -- PDEBUG(ErrorF("32: pXGI->DstColor = %08lX\n",pXGI->DstColor)) ; -- pXGI->DstColor = 2 << 16 ; -- pReg->xgiRegs3C4[6] |= ((4 << 2) | 0x03); -- break; -- } -- -- pXGI->scrnOffset = pScrn->displayWidth * ((pScrn->bitsPerPixel+7)/8); -- pXGI->scrnOffset += 15 ; -- pXGI->scrnOffset >>= 4 ; -- pXGI->scrnOffset <<= 4 ; -- -- PDEBUG(ErrorF("XG40Init: pScrn->displayWidth = %ld\n",pScrn->displayWidth )) ; -- PDEBUG(ErrorF("XG40Init: pScrn->bitsPerPixel = %ld\n",pScrn->bitsPerPixel )) ; -- PDEBUG(ErrorF("XG40Init: pXGI->scrnOffset = %ld\n",pXGI->scrnOffset )) ; -- -- pReg->xgiRegs3D4[0x19] = 0; -- pReg->xgiRegs3D4[0x1A] &= 0xFC; -- -- if (mode->Flags & V_INTERLACE) { -- offset = pXGI->scrnOffset >> 2; -- pReg->xgiRegs3C4[0x06] |= 0x20; -- -- temp = (mode->CrtcHSyncStart >> 3) - -- (mode->CrtcHTotal >> 3)/2; -- pReg->xgiRegs3D4[0x19] = GETVAR8(temp); -- pReg->xgiRegs3D4[0x1A] |= GETBITS(temp, 9:8); -- } else { -- offset = pXGI->scrnOffset >> 3; -- pReg->xgiRegs3C4[0x06] &= ~0x20; -- } -- -- pReg->xgiRegs3C4[0x07] |= 0x10; /* enable High Speed DAC */ -- pReg->xgiRegs3C4[0x07] &= 0xFC; -- if (clock < 100000) -- pReg->xgiRegs3C4[0x07] |= 0x03; -- else if (clock < 200000) -- pReg->xgiRegs3C4[0x07] |= 0x02; -- else if (clock < 250000) -- pReg->xgiRegs3C4[0x07] |= 0x01; -- -- /* Extended Vertical Overflow */ -- pReg->xgiRegs3C4[0x0A] = -- GETBITSTR(mode->CrtcVTotal -2, 10:10, 0:0) | -- GETBITSTR(mode->CrtcVDisplay -1, 10:10, 1:1) | -- GETBITSTR(mode->CrtcVBlankStart , 10:10, 2:2) | -- GETBITSTR(mode->CrtcVSyncStart , 10:10, 3:3) | -- GETBITSTR(mode->CrtcVBlankEnd , 8:8, 4:4) | -- GETBITSTR(mode->CrtcVSyncEnd , 4:4, 5:5) ; -- -- /* Extended Horizontal Overflow */ -- pReg->xgiRegs3C4[0x0B] = -- GETBITSTR((mode->CrtcHTotal >> 3) - 5, 9:8, 1:0) | -- GETBITSTR((mode->CrtcHDisplay >> 3) - 1, 9:8, 3:2) | -- GETBITSTR((mode->CrtcHBlankStart >> 3) , 9:8, 5:4) | -- GETBITSTR((mode->CrtcHSyncStart >> 3) , 9:8, 7:6) ; -- -- pReg->xgiRegs3C4[0x0C] &= 0xF8; -- pReg->xgiRegs3C4[0x0C] |= -- GETBITSTR(mode->CrtcHBlankEnd >> 3, 7:6, 1:0) | -- GETBITSTR(mode->CrtcHSyncEnd >> 3, 5:5, 2:2) ; -- -- /* Screen Offset */ -- vgaReg->CRTC[0x13] = GETVAR8(offset); -- pReg->xgiRegs3C4[0x0E] &= 0xF0; -- pReg->xgiRegs3C4[0x0E] |= GETBITS(offset, 11:8); -- -- /* line compare */ -- if (mode->CrtcHDisplay > 0) -- pReg->xgiRegs3C4[0x0F] |= 0x08; -- else -- pReg->xgiRegs3C4[0x0F] &= 0xF7; -- -- pReg->xgiRegs3C4[0x10] = -- ((mode->CrtcHDisplay *((pScrn->bitsPerPixel+7)/8) + 63) >> 6)+1; -- -- /* Enable Linear */ -- pReg->xgiRegs3C4[0x20] |= 0x81; -- -- -- /* Set vclk */ -- if (compute_vclk(clock, &num, &denum, &div, &sbit, &scale)) { -- pReg->xgiRegs3C4[0x2B] = (num -1) & 0x7f; -- if (div == 2) -- pReg->xgiRegs3C4[0x2B] |= 0x80; -- pReg->xgiRegs3C4[0x2C] = ((denum -1) & 0x1f); -- pReg->xgiRegs3C4[0x2C] |= (((scale-1)&3) << 5); -- if (sbit) -- pReg->xgiRegs3C4[0x2C] |= 0x80; -- pReg->xgiRegs3C4[0x2D] = 0x80; -- } -- else { -- /* if compute_vclk cannot handle the request clock try XGICalcClock! */ -- XGICalcClock(pScrn, clock, 2, vclk); -- pReg->xgiRegs3C4[0x2B] = (vclk[Midx] - 1) & 0x7f ; -- pReg->xgiRegs3C4[0x2B] |= ((vclk[VLDidx] == 2 ) ? 1 : 0 ) << 7 ; -- -- /* bits [4:0] contain denumerator -MC */ -- pReg->xgiRegs3C4[0x2C] = (vclk[Nidx] -1) & 0x1f ; -- -- if (vclk[Pidx] <= 4) { -- /* postscale 1,2,3,4 */ -- pReg->xgiRegs3C4[0x2C] |= (vclk[Pidx] -1 ) << 5 ; -- pReg->xgiRegs3C4[0x2C] &= 0x7F; -- } else { -- /* postscale 6,8 */ -- pReg->xgiRegs3C4[0x2C] |= ((vclk[Pidx] / 2) -1 ) << 5 ; -- pReg->xgiRegs3C4[0x2C] |= 0x80; -- } -- pReg->xgiRegs3C4[0x2D] = 0x80; -- } /* end of set vclk */ -- -- if (clock > 150000) { /* enable two-pixel mode */ -- pReg->xgiRegs3C4[0x07] |= 0x80; -- pReg->xgiRegs3C4[0x32] |= 0x08; -- } else { -- pReg->xgiRegs3C4[0x07] &= 0x7F; -- pReg->xgiRegs3C4[0x32] &= 0xF7; -- } -- -- /*pReg->xgiRegs3C2 = inb(0x3CC) | 0x0C;*/ /* Programmable Clock */ -- pReg->xgiRegs3C2 = inb(pXGI->RelIO+0x4c) | 0x0C; /*Programmable Clock*/ -- -- if (!pXGI->NoAccel) { -- /* Enable 2D accelerator. -- */ -- pReg->xgiRegs3C4[0x1E] |= (SR1E_ENABLE_2D | SR1E_ENABLE_3D); -- } -- -- /* set threshold value */ -- (*pXGI->SetThreshold)(pScrn, mode, &Threshold_Low, &Threshold_High); -- pReg->xgiRegs3C4[0x08] = GETBITSTR(Threshold_Low, 3:0, 7:4) | 0xF; -- pReg->xgiRegs3C4[0x0F] &= ~GENMASK(5:5); -- pReg->xgiRegs3C4[0x0F] |= GETBITSTR(Threshold_Low, 4:4, 5:5); -- pReg->xgiRegs3C4[0x09] &= ~GENMASK(3:0); -- pReg->xgiRegs3C4[0x09] |= GETBITS(Threshold_High, 3:0); -- -- return(TRUE); --} -- --/* Detect video bridge and set VBFlags accordingly */ --void XGIVGAPreInit(ScrnInfoPtr pScrn) --{ -- XGIPtr pXGI = XGIPTR(pScrn); -- -- switch (pXGI->Chipset) { -- case PCI_CHIP_XGIXG40: -- case PCI_CHIP_XGIXG20: -- default: -- pXGI->ModeInit = XG40Init; -- break; -- } -- -- --} -- -+/* -+ * Mode setup and basic video bridge detection -+ * -+ * Copyright (C) 2001-2004 by Thomas Winischhofer, Vienna, Austria. -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * 1) Redistributions of source code must retain the above copyright -+ * notice, this list of conditions and the following disclaimer. -+ * 2) Redistributions in binary form must reproduce the above copyright -+ * notice, this list of conditions and the following disclaimer in the -+ * documentation and/or other materials provided with the distribution. -+ * 3) The name of the author may not be used to endorse or promote products -+ * derived from this software without specific prior written permission. -+ * -+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESSED OR -+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, -+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -+ * -+ * Author: Thomas Winischhofer -+ * -+ * Init() function for old series (except for TV and FIFO calculation) -+ * previously based on code which is Copyright (C) 1998,1999 by Alan -+ * Hourihane, Wigan, England -+ */ -+ -+#ifdef HAVE_CONFIG_H -+#include "config.h" -+#endif -+ -+#include "xf86.h" -+#include "xf86_OSproc.h" -+#include "xf86Version.h" -+#include "xf86PciInfo.h" -+#include "xf86Pci.h" -+ -+#include "xgi.h" -+#include "xgi_regs.h" -+#include "xgi_dac.h" -+ -+#include "vb_def.h" -+ -+Bool XG40Init(ScrnInfoPtr pScrn, DisplayModePtr mode); -+ -+/* Jong 01/07/2008; force to disable 2D */ -+extern Bool ForceToDisable2DEngine(ScrnInfoPtr pScrn); -+ -+#define Midx 0 -+#define Nidx 1 -+#define VLDidx 2 -+#define Pidx 3 -+ -+Bool -+XG40Init(ScrnInfoPtr pScrn, DisplayModePtr mode) -+{ -+ XGIPtr pXGI = XGIPTR(pScrn); -+ XGIRegPtr pReg = &pXGI->ModeReg; -+ vgaRegPtr vgaReg = &VGAHWPTR(pScrn)->ModeReg; -+ int vgaIOBase; -+ unsigned short temp; -+ int offset; -+ int clock = mode->Clock; -+ unsigned int vclk[5]; -+ -+ int num, denum, div, sbit, scale; -+ unsigned short Threshold_Low, Threshold_High; -+ -+PDEBUG(ErrorF("XG40Init()\n")); -+ -+ xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 4, "XG40Init()\n"); -+ xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 4, -+ "virtualX = %d depth = %d Logical width = %d\n", -+ pScrn->virtualX, pScrn->bitsPerPixel, -+ pScrn->virtualX * pScrn->bitsPerPixel/8); -+ -+ vgaHWGetIOBase(VGAHWPTR(pScrn)); -+ vgaIOBase = VGAHWPTR(pScrn)->IOBase; -+ -+ (*pXGI->XGISave)(pScrn, pReg); -+ -+ outw(VGA_SEQ_INDEX, 0x8605); -+ -+ pReg->xgiRegs3C4[6] &= ~GENMASK(4:2); -+ -+ switch (pScrn->bitsPerPixel) { -+ case 8: -+ pXGI->DstColor = 0 ; -+ pReg->xgiRegs3C4[6] |= 0x03; -+ PDEBUG(ErrorF("8: pXGI->DstColor = %08lX\n",pXGI->DstColor)) ; -+ break; -+ case 16: -+ pXGI->DstColor = 1 << 16 ; -+ PDEBUG(ErrorF("16: pXGI->DstColor = %08lX\n",pXGI->DstColor)) ; -+ if (pScrn->depth==15) { -+ pReg->xgiRegs3C4[6] |= ((1 << 2) | 0x03); -+ } else { -+ pReg->xgiRegs3C4[6] |= ((2 << 2) | 0x03); -+ } -+ break; -+ case 24: -+ pReg->xgiRegs3C4[6] |= ((3 << 2) | 0x03); -+ break; -+ case 32: -+ PDEBUG(ErrorF("32: pXGI->DstColor = %08lX\n",pXGI->DstColor)) ; -+ pXGI->DstColor = 2 << 16 ; -+ pReg->xgiRegs3C4[6] |= ((4 << 2) | 0x03); -+ break; -+ } -+ -+ pXGI->scrnOffset = pScrn->displayWidth * ((pScrn->bitsPerPixel+7)/8); -+ pXGI->scrnOffset += 15 ; -+ pXGI->scrnOffset >>= 4 ; -+ pXGI->scrnOffset <<= 4 ; -+ -+ PDEBUG(ErrorF("XG40Init: pScrn->displayWidth = %ld\n",pScrn->displayWidth )) ; -+ PDEBUG(ErrorF("XG40Init: pScrn->bitsPerPixel = %ld\n",pScrn->bitsPerPixel )) ; -+ PDEBUG(ErrorF("XG40Init: pXGI->scrnOffset = %ld\n",pXGI->scrnOffset )) ; -+ -+ pReg->xgiRegs3D4[0x19] = 0; -+ pReg->xgiRegs3D4[0x1A] &= 0xFC; -+ -+ if (mode->Flags & V_INTERLACE) { -+ offset = pXGI->scrnOffset >> 2; -+ pReg->xgiRegs3C4[0x06] |= 0x20; -+ -+ temp = (mode->CrtcHSyncStart >> 3) - -+ (mode->CrtcHTotal >> 3)/2; -+ pReg->xgiRegs3D4[0x19] = GETVAR8(temp); -+ pReg->xgiRegs3D4[0x1A] |= GETBITS(temp, 9:8); -+ } else { -+ offset = pXGI->scrnOffset >> 3; -+ pReg->xgiRegs3C4[0x06] &= ~0x20; -+ } -+ -+ pReg->xgiRegs3C4[0x07] |= 0x10; /* enable High Speed DAC */ -+ pReg->xgiRegs3C4[0x07] &= 0xFC; -+ if (clock < 100000) -+ pReg->xgiRegs3C4[0x07] |= 0x03; -+ else if (clock < 200000) -+ pReg->xgiRegs3C4[0x07] |= 0x02; -+ else if (clock < 250000) -+ pReg->xgiRegs3C4[0x07] |= 0x01; -+ -+ /* Extended Vertical Overflow */ -+ pReg->xgiRegs3C4[0x0A] = -+ GETBITSTR(mode->CrtcVTotal -2, 10:10, 0:0) | -+ GETBITSTR(mode->CrtcVDisplay -1, 10:10, 1:1) | -+ GETBITSTR(mode->CrtcVBlankStart , 10:10, 2:2) | -+ GETBITSTR(mode->CrtcVSyncStart , 10:10, 3:3) | -+ GETBITSTR(mode->CrtcVBlankEnd , 8:8, 4:4) | -+ GETBITSTR(mode->CrtcVSyncEnd , 4:4, 5:5) ; -+ -+ /* Extended Horizontal Overflow */ -+ pReg->xgiRegs3C4[0x0B] = -+ GETBITSTR((mode->CrtcHTotal >> 3) - 5, 9:8, 1:0) | -+ GETBITSTR((mode->CrtcHDisplay >> 3) - 1, 9:8, 3:2) | -+ GETBITSTR((mode->CrtcHBlankStart >> 3) , 9:8, 5:4) | -+ GETBITSTR((mode->CrtcHSyncStart >> 3) , 9:8, 7:6) ; -+ -+ pReg->xgiRegs3C4[0x0C] &= 0xF8; -+ pReg->xgiRegs3C4[0x0C] |= -+ GETBITSTR(mode->CrtcHBlankEnd >> 3, 7:6, 1:0) | -+ GETBITSTR(mode->CrtcHSyncEnd >> 3, 5:5, 2:2) ; -+ -+ /* Screen Offset */ -+ vgaReg->CRTC[0x13] = GETVAR8(offset); -+ pReg->xgiRegs3C4[0x0E] &= 0xF0; -+ pReg->xgiRegs3C4[0x0E] |= GETBITS(offset, 11:8); -+ -+ /* line compare */ -+ if (mode->CrtcHDisplay > 0) -+ pReg->xgiRegs3C4[0x0F] |= 0x08; -+ else -+ pReg->xgiRegs3C4[0x0F] &= 0xF7; -+ -+ pReg->xgiRegs3C4[0x10] = -+ ((mode->CrtcHDisplay *((pScrn->bitsPerPixel+7)/8) + 63) >> 6)+1; -+ -+ /* Enable Linear */ -+ pReg->xgiRegs3C4[0x20] |= 0x81; -+ -+ -+ /* Set vclk */ -+ if (compute_vclk(clock, &num, &denum, &div, &sbit, &scale)) { -+ pReg->xgiRegs3C4[0x2B] = (num -1) & 0x7f; -+ if (div == 2) -+ pReg->xgiRegs3C4[0x2B] |= 0x80; -+ pReg->xgiRegs3C4[0x2C] = ((denum -1) & 0x1f); -+ pReg->xgiRegs3C4[0x2C] |= (((scale-1)&3) << 5); -+ if (sbit) -+ pReg->xgiRegs3C4[0x2C] |= 0x80; -+ pReg->xgiRegs3C4[0x2D] = 0x80; -+ } -+ else { -+ /* if compute_vclk cannot handle the request clock try XGICalcClock! */ -+ XGICalcClock(pScrn, clock, 2, vclk); -+ pReg->xgiRegs3C4[0x2B] = (vclk[Midx] - 1) & 0x7f ; -+ pReg->xgiRegs3C4[0x2B] |= ((vclk[VLDidx] == 2 ) ? 1 : 0 ) << 7 ; -+ -+ /* bits [4:0] contain denumerator -MC */ -+ pReg->xgiRegs3C4[0x2C] = (vclk[Nidx] -1) & 0x1f ; -+ -+ if (vclk[Pidx] <= 4) { -+ /* postscale 1,2,3,4 */ -+ pReg->xgiRegs3C4[0x2C] |= (vclk[Pidx] -1 ) << 5 ; -+ pReg->xgiRegs3C4[0x2C] &= 0x7F; -+ } else { -+ /* postscale 6,8 */ -+ pReg->xgiRegs3C4[0x2C] |= ((vclk[Pidx] / 2) -1 ) << 5 ; -+ pReg->xgiRegs3C4[0x2C] |= 0x80; -+ } -+ pReg->xgiRegs3C4[0x2D] = 0x80; -+ } /* end of set vclk */ -+ -+ if (clock > 150000) { /* enable two-pixel mode */ -+ pReg->xgiRegs3C4[0x07] |= 0x80; -+ pReg->xgiRegs3C4[0x32] |= 0x08; -+ } else { -+ pReg->xgiRegs3C4[0x07] &= 0x7F; -+ pReg->xgiRegs3C4[0x32] &= 0xF7; -+ } -+ -+ /*pReg->xgiRegs3C2 = inb(0x3CC) | 0x0C;*/ /* Programmable Clock */ -+ pReg->xgiRegs3C2 = inb(pXGI->RelIO+0x4c) | 0x0C; /*Programmable Clock*/ -+ -+ if (!pXGI->NoAccel) { -+ /* Enable 2D accelerator. -+ */ -+ /* Jong 01/07/2008; disable 2D engine depend on SR3A[6]:1-> force to siable 2D */ -+ if(pXGI->Chipset != PCI_CHIP_XGIXG21) -+ pReg->xgiRegs3C4[0x1E] |= 0x42; -+ else -+ { -+ if(ForceToDisable2DEngine(pScrn)) -+ pReg->xgiRegs3C4[0x1E] |= 0x02; -+ } -+ -+ } -+ -+ /* set threshold value */ -+ (*pXGI->SetThreshold)(pScrn, mode, &Threshold_Low, &Threshold_High); -+ pReg->xgiRegs3C4[0x08] = GETBITSTR(Threshold_Low, 3:0, 7:4) | 0xF; -+ pReg->xgiRegs3C4[0x0F] &= ~GENMASK(5:5); -+ pReg->xgiRegs3C4[0x0F] |= GETBITSTR(Threshold_Low, 4:4, 5:5); -+ pReg->xgiRegs3C4[0x09] &= ~GENMASK(3:0); -+ pReg->xgiRegs3C4[0x09] |= GETBITS(Threshold_High, 3:0); -+ -+ return(TRUE); -+} -+ -+/* Detect video bridge and set VBFlags accordingly */ -+void XGIVGAPreInit(ScrnInfoPtr pScrn) -+{ -+ XGIPtr pXGI = XGIPTR(pScrn); -+ -+ switch (pXGI->Chipset) { -+ case PCI_CHIP_XGIXG40: -+ case PCI_CHIP_XGIXG20: -+ case PCI_CHIP_XGIXG21: -+ case PCI_CHIP_XGIXG27: -+ default: -+ pXGI->ModeInit = XG40Init; -+ break; -+ } -+ -+ -+} -+ -diff --git a/src/xgi_video.c b/src/xgi_video.c -diff --git a/src/xgi_video.h b/src/xgi_video.h -diff --git a/src/xgi_videohw.c b/src/xgi_videohw.c -diff --git a/src/xgi_videohw.h b/src/xgi_videohw.h