diff options
author | Ian Romanick <idr@us.ibm.com> | 2008-04-14 16:39:24 -0700 |
---|---|---|
committer | Ian Romanick <idr@us.ibm.com> | 2008-04-14 16:39:24 -0700 |
commit | 06c189acc994e656064b210da5f572363f4e0f91 (patch) | |
tree | de06641cbf3b772a680083005e0cae3442bcc65b | |
parent | 190559d2da3da9500553e159475086ea2f870a5f (diff) |
Remove anything related to BIOS mode setting
-rw-r--r-- | src/Makefile.am | 3 | ||||
-rw-r--r-- | src/xg47_bios.c | 1838 | ||||
-rw-r--r-- | src/xg47_bios.h | 47 | ||||
-rw-r--r-- | src/xg47_mode.c | 507 | ||||
-rw-r--r-- | src/xg47_mode.h | 3 | ||||
-rw-r--r-- | src/xg47_native_mode.c | 2 | ||||
-rw-r--r-- | src/xg47_videohw.c | 6 | ||||
-rw-r--r-- | src/xgi.h | 45 | ||||
-rw-r--r-- | src/xgi_bios.c | 965 | ||||
-rw-r--r-- | src/xgi_bios.h | 51 | ||||
-rw-r--r-- | src/xgi_driver.c | 85 | ||||
-rw-r--r-- | src/xgi_misc.c | 29 | ||||
-rw-r--r-- | src/xgi_misc.h | 2 | ||||
-rw-r--r-- | src/xgi_mode.c | 30 |
14 files changed, 8 insertions, 3605 deletions
diff --git a/src/Makefile.am b/src/Makefile.am index 8261e96..29915cd 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -31,8 +31,6 @@ xgixp_drv_ladir = @moduledir@/drivers xgixp_drv_la_SOURCES = \ xg47_accel.c \ xg47_accel.h \ - xg47_bios.c \ - xg47_bios.h \ xg47_cmdlist.c \ xg47_cmdlist.h \ xg47_cursor.c \ @@ -52,7 +50,6 @@ xgixp_drv_la_SOURCES = \ xg47_videohw.c \ xg47_videohw.h \ xgi.h \ - xgi_bios.c \ xgi_bios.h \ xgi_cursor.c \ xgi_cursor.h \ diff --git a/src/xg47_bios.c b/src/xg47_bios.c deleted file mode 100644 index cbd36c1..0000000 --- a/src/xg47_bios.c +++ /dev/null @@ -1,1838 +0,0 @@ -/*************************************************************************** - * 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 "xgi.h" -#include "xgi_regs.h" -#include "xgi_bios.h" -#include "xgi_mode.h" -#include "xg47_tv.h" -#include "xg47_mode.h" - -static Bool XG47BiosDTVControl(XGIPtr pXGI, unsigned cmd, - const CARD16 *piWord); - -static CARD16 XGIGetRefreshSupport(XGIPtr pXGI, unsigned device, - XGIModePtr mode, unsigned colorIndex); - -extern CARD8 vclk18; -extern CARD8 vclk19; -extern CARD8 vclk28; - -extern CARD8 GR3CE_45; -extern CARD8 GR3CE_45_SingleView; - - -/* - * Definition of video mode refresh rate (!!! CAN NOT BE MODIFIED !!!). - */ -const CARD16 XG47RefreshTable[] = { - 0, - 44, /* VVMX_INDEX_REF44 */ - 48, /* ZVMX_INDEX_REF48 */ - 0xb2, /* 50i */ - 0x132, /* 50r */ - 50, /* 50 */ - 0xbc, /* 60i */ - 0x13c, /* 60r */ - 60, /* ZVMX_INDEX_REF60 */ - 70, /* ZVMX_INDEX_REF70 */ - 72, /* ZVMX_INDEX_REF72 */ - 75, /* ZVMX_INDEX_REF75 */ - 85, /* ZVMX_INDEX_REF85 */ - 100, /* ZVMX_INDEX_REF90 */ - 120, /* ZVMX_INDEX_REF95 */ -}; - - -/** - * Convert refresh rate value to index. - * - * \param value Refresh rate value whose index is to be found. - * - * \return - * Index of the specificed refresh rate in the refresh rate table, or zero - * on failure. - */ -static unsigned XG47ConvertRefValueToIndex(unsigned value) -{ - unsigned index; - - for (index = 0; index < VREF_MAX_NUMBER; index++) { - if (value == XG47RefreshTable[index]) { - return index; - } - } - - return 0; -} - -/* - * Convert refresh rate index to value. - * - * Entry : index, refresh rate index number. - * Return: refresh rate value. - */ - -CARD16 XG47GetRefreshRateByIndex(CARD8 index) -{ - return XG47RefreshTable[index]; -} - -/* - * from bios dll: somecmd.c - */ -static CARD8 crtc59 = 0x80; - -void XG47WaitLcdPowerSequence(XGIPtr pXGI, CARD8 bNew) -{ - CARD32 i; - - OUTB(XGI_REG_GRX, 0x24); - if (bNew & 0x10) - { - for (i=0; i < 0xfffff; i++) - { - /* - * It should check [3:0] here, - * but in XP4 Rev. A, backlight control doesn't works - */ - if((INB(XGI_REG_GRX+1) & 0x07) == 0x07) - break; - } - } - else - { - for (i=0; i < 0xfffff; i++) - { - if(!(INB(XGI_REG_GRX+1) & 0x07)) - break; - } - } - - OUTB(XGI_REG_GRX, 0x23); - /* wait active */ - for (i=0; i < 0xfffff; i++) - { - if(INB(XGI_REG_GRX+1) & 0x10) - break; - } - /* wait deactive */ - for (i=0; i < 0xfffff; i++) - { - if(!(INB(XGI_REG_GRX+1) & 0x10)) - break; - } -} - -void XG47CloseAllDevice(XGIPtr pXGI, CARD8 device2Close) -{ - CARD8 curr, bNew; - - OUTB(XGI_REG_CRX, SOFT_PAD59_INDEX); - if (pXGI->biosDllOperationFlag & DEVICE_CLOSED) - { - /* - * if devices had been closed already, don't save 3x5.59.bit1 - * again, or you'll always get 3x5.59.bit1 as 1 (0x02) - */ - crtc59 &= 0x02; /* get previos 3x5.59.bit1 */ - crtc59 |= (INB(XGI_REG_CRX+1) & 0xFD); /* save for open_all (except bit1) */ - } - else - crtc59 = (INB(XGI_REG_CRX+1) & 0xFF); /* save for open_all (all) */ - - /* inhibit SMI switching */ - OUTB(XGI_REG_CRX+1, (CARD8)INB(XGI_REG_CRX+1) | 0x02); - - /* CRT display */ - if(device2Close & DEV_SUPPORT_CRT) - { - /* DAC power off */ - OUTB(XGI_REG_SRX,0x24); - OUTB(XGI_REG_SRX+1, (CARD8)INB(XGI_REG_SRX+1) & 0xFE); - } - - /* TV display */ - if(device2Close & DEV_SUPPORT_TV) - { - if ((pXGI->biosDevSupport & DEV_SUPPORT_TV) - && !(pXGI->biosDevSupport & SUPPORT_CURRENT_NO_TV)) { - XG47BiosDTVControl(pXGI, DISABLE_TV_DISPLAY, NULL); - } - } - - /* LCD display */ - if(device2Close & DEV_SUPPORT_LCD) - { - OUTB(XGI_REG_GRX, 0x33); - curr = (CARD8)INB(XGI_REG_GRX+1); - if (curr & 0x10) - { - /* - * Before close device, wait for VBlank, - * otherwise sometimes dot noise will appear. - */ - - OUTB(XGI_REG_GRX, 0x5b); - if(INB(XGI_REG_GRX+1) & 0x10) - XGIWaitVerticalOnCRTC2(pXGI, 1); - else - XGIWaitVerticalOnCRTC1(pXGI, 1); - - /* Turn off the LCD interface logic */ - OUTB(XGI_REG_GRX, 0x33); - bNew = (curr & ~0x10) | 0x20; - OUTB(XGI_REG_GRX+1, bNew); - - XG47WaitLcdPowerSequence(pXGI, bNew); - - /* LVDS PD line off */ - OUTB(XGI_REG_GRX, 0x71); - OUTB(XGI_REG_GRX+1, (CARD8)INB(XGI_REG_GRX+1) & ~0x02); - } - - OUTB(XGI_REG_GRX,0x5b); - if (INB(XGI_REG_GRX+1) & DEV_SUPPORT_LCD) - { - /* Shadow off */ - OUTB(XGI_REG_GRX, 0x30); - OUTB(XGI_REG_GRX+1, INB(XGI_REG_GRX+1)&~0x81); - OUTB(XGI_REG_GRX, 0x44); - OUTB(XGI_REG_GRX+1, INB(XGI_REG_GRX+1)&~0x03); - - - /* - * Disable centering - * Centering function should work if only shadow enabled. But h/w always works. - * So we need disable if LCD is not on. BIOS already take care of most cases. - * However we have issue if we change device from LCD to other device in Windows, - * because BIOS skip shadow and LCD on/off control. - * So we turn centering bit off here. - */ - OUTB(XGI_REG_GRX, 0x69); /*Vertical*/ - OUTB(XGI_REG_GRX+1, INB(XGI_REG_GRX+1)&~0x80); - OUTB(XGI_REG_GRX, 0x6d); /*Horizontal*/ - OUTB(XGI_REG_GRX+1, INB(XGI_REG_GRX+1)&~0x80); - - /* Disable scaling */ - OUTB(XGI_REG_GRX, 0xd1); - OUTB(XGI_REG_GRX+1, INB(XGI_REG_GRX+1)&~0x03); - } - } - - OUTB(XGI_REG_GRX, 0x5B); - curr = (CARD8)INB(XGI_REG_GRX+1); - - /* 2nd display */ - if(device2Close & DEV_SUPPORT_DVI) - { - OUTB(XGI_REG_CRX, 0x5A); - if (INB(XGI_REG_CRX+1) & 0x04) - { - OUTB(XGI_REG_GRX, 0x5A); - if((INB(XGI_REG_GRX+1) & 0x80) - && (curr & DEV_SUPPORT_DVI) - && !(curr & DEV_SUPPORT_LCD)) - { - /* Shadow on */ - OUTB(XGI_REG_GRX, 0x30); - OUTB(XGI_REG_GRX+1, INB(XGI_REG_GRX+1)&~0x81); - OUTB(XGI_REG_GRX, 0x44); - OUTB(XGI_REG_GRX+1, INB(XGI_REG_GRX+1)&~0x03); - - /* Enable scaling */ - OUTB(XGI_REG_GRX, 0xd1); - OUTB(XGI_REG_GRX+1, INB(XGI_REG_GRX+1)&~0x03); - } - } - - /* 2nd DAC off */ - OUTB(XGI_REG_CRX, 0xd7); - OUTB(XGI_REG_CRX+1, INB(XGI_REG_CRX+1) | 0x40); - - /* disable TMDS */ - OUTB(XGI_REG_GRX, 0x3d); - OUTB(XGI_REG_GRX+1, INB(XGI_REG_GRX+1) & ~0x01); - OUTB(XGI_REG_GRX, 0x26); - OUTB(XGI_REG_GRX+1, INB(XGI_REG_GRX+1) | 0x30); - /* - OUTB(XGI_REG_GRX,0x27); - OUTB(XGI_REG_GRX+1, INB(XGI_REG_GRX+1) | 0x01); - */ - if (curr & 0x80) - XGIWaitVerticalOnCRTC2(pXGI, 20); - else - XGIWaitVerticalOnCRTC1(pXGI, 20); - } - - pXGI->biosDllOperationFlag |= DEVICE_CLOSED; /* close complete. */ -} - -void XG47OpenAllDevice(XGIPtr pXGI, CARD8 device2Open) -{ - CARD8 curr, bNew, bDPMS_status; - - /* Jong 09/14/2006; get DPMS status of devices */ - OUTB(XGI_REG_GRX,0x55); - bDPMS_status = (CARD8)INB(XGI_REG_GRX+1); - - /* Jong 09/14/2006; check current available devices */ - OUTB(XGI_REG_GRX,0x5b); - curr = (CARD8)INB(XGI_REG_GRX+1); - - /* Jong 09/14/2006; (curr & 0x0f) means current device status of single view */ - /* (curr >> 4) means current device status of multiple view */ - /* device2Open means devices which we want to open */ - /* ((curr & 0x0f) | (curr >> 4)) means devices which are available no matter they are in single view or multiple view */ - /* device2Open &= ((curr & 0x0f) | (curr >> 4)) means devices which are available and we want to open */ - /* Why we got curr=0x02 even CRT and DVI have connected displays ??? */ - /* device2Open &= ((curr & 0x0f) | (curr >> 4)); */ - - /* Jong 09/14/2006; Force to open CRT and DVI for test */ - /* Work!!!! */ - device2Open=0x0A; - - if(!device2Open) - return; - - /* CRT display */ - if ((device2Open & DEV_SUPPORT_CRT) - && (!(bDPMS_status & 0x03))) - { - /* DAC power on */ - OUTB(XGI_REG_SRX,0x24); - OUTB(XGI_REG_SRX+1, (CARD8)INB(XGI_REG_SRX+1) | 0x01); - /* CRT on */ - OUTB(XGI_REG_GRX, 0x33); - OUTB(XGI_REG_GRX+1, (CARD8)INB(XGI_REG_GRX+1) | 0x20); - /* Sync on */ - OUTB(XGI_REG_GRX,0x23); - OUTB(XGI_REG_GRX+1,(CARD8)INB(XGI_REG_GRX+1) & ~0x03); - } - - /* LCD display */ - if(device2Open & DEV_SUPPORT_LCD) - { - if(curr & DEV_SUPPORT_LCD) - { - /* Shadow on */ - OUTB(XGI_REG_GRX, 0x30); - OUTB(XGI_REG_GRX+1, INB(XGI_REG_GRX+1)|0x81); - OUTB(XGI_REG_GRX, 0x44); - OUTB(XGI_REG_GRX+1, INB(XGI_REG_GRX+1)|0x03); - - /*we already control the H/V DE control on/off in BIOS code*/ - /*Enable centering*/ -#if 0 - OUTB(XGI_REG_GRX, 0x5d); - if ((INB(XGI_REG_GRX+1) & GRAF_EXPANSION) == 0) - { - OUTB(XGI_REG_GRX, 0x69); /*Vertical*/ - OUTB(XGI_REG_GRX+1, INB(XGI_REG_GRX+1) | 0x80); - OUTB(XGI_REG_GRX, 0x6d); /*Horizontal*/ - OUTB(XGI_REG_GRX+1, INB(XGI_REG_GRX+1) | 0x80); - } -#endif - - /* Enable scaling */ - OUTB(XGI_REG_GRX, 0xd1); - OUTB(XGI_REG_GRX+1, INB(XGI_REG_GRX+1)|0x03); - } - - if (!(bDPMS_status & 0x10)) - { - OUTB(XGI_REG_GRX, 0x33); - curr = (CARD8)INB(XGI_REG_GRX+1); - - if (!(curr & 0x10)) - { - OUTB(XGI_REG_GRX, 0x36); - if ((INB(XGI_REG_GRX+1) & 0x8) == 0) - { - /* Turn on the LCD interface logic */ - bNew = curr | 0x10; - OUTB(XGI_REG_GRX, 0x33); - OUTB(XGI_REG_GRX+1, bNew); - - XG47WaitLcdPowerSequence(pXGI, bNew); - } - - /* LVDS PD line on */ - OUTB(XGI_REG_GRX, 0x71); - OUTB(XGI_REG_GRX+1, (CARD8)INB(XGI_REG_GRX+1) | 0x02); - - /* - * XG47 Rev. A0 patch begin - * Reset dual channel LVDS even/odd sequence. - * Rev. A1 will fix. - */ - - /* Wit V Sync. start */ - OUTB(XGI_REG_GRX,0x5b); - curr = (CARD8)INB(XGI_REG_GRX+1); - if(curr & DEV_SUPPORT_LCD) - { - while(!(INB(0x3da) & 0x08)); - } - else - { - OUTB(XGI_REG_SRX, 0xDC); - while (!(INB(XGI_REG_SRX+1) & 0x01)); - } - - /* Power down LVDS and back on */ - OUTB(XGI_REG_GRX, 0x71); - OUTB(XGI_REG_GRX+1,(CARD8)INB(XGI_REG_GRX+1) & ~0x02); - OUTB(XGI_REG_GRX, 0x71); - OUTB(XGI_REG_GRX+1,(CARD8)INB(XGI_REG_GRX+1) | 0x02); - /* XG47 Rev. A0 patch end */ - } - } - } - - /* Jong 09/14/2006; why to call with second time */ - OUTB(XGI_REG_GRX, 0x5B); - curr = (CARD8)INB(XGI_REG_GRX+1); - - /* 2nd display */ - if(device2Open & DEV_SUPPORT_DVI) - { - /* Jong 09/14/2006; System status flag 1 (3D5.5A)*/ - /* 3x5_5A: 7 6 5 4 3 2 1 0 - | | | | | | | * - Digital monitor in 1st port - | | | | | | * - - 1st monitor attached - | | | | | * - - - Digital monitor in 2nd port - | | | | * - - - - 2nd monitor attached - | | | * - - - - - TV connected - | | * - - - - - - Copy of 3x5.2F.5 - | * - - - - - - - Display control - * - - - - - - - - In-POST */ - - OUTB(XGI_REG_CRX, 0x5A); - - /* Jong 09/14/2006; Digital monitor in 2nd port */ - if (INB(XGI_REG_CRX+1) & 0x04) - { - OUTB(XGI_REG_GRX, 0x5A); - - /* Jong 09/14/2006; why to check if it is fixed timing for digital display??? */ - if((INB(XGI_REG_GRX+1) & 0x80) - && (curr & DEV_SUPPORT_DVI) - && !(curr & DEV_SUPPORT_LCD)) - { - /* Shadow on */ - OUTB(XGI_REG_GRX, 0x30); - OUTB(XGI_REG_GRX+1, INB(XGI_REG_GRX+1)|0x81); - OUTB(XGI_REG_GRX, 0x44); - OUTB(XGI_REG_GRX+1, INB(XGI_REG_GRX+1)|0x03); - - /* Enable scaling */ - OUTB(XGI_REG_GRX, 0xd1); - OUTB(XGI_REG_GRX+1, INB(XGI_REG_GRX+1)|0x03); - } - - /* Jong 09/14/2006; why to do this ??? */ - if (!(bDPMS_status & 0x0C)) - { - /* Enable TMDS, RevB always on */ - OUTB(XGI_REG_GRX,0x3d); - OUTB(XGI_REG_GRX+1,(int)INB(XGI_REG_GRX+1) | 0x01); - OUTB(XGI_REG_GRX,0x26); - OUTB(XGI_REG_GRX+1,(int)INB(XGI_REG_GRX+1) & ~0x30); - if (curr & 0x80) - XGIWaitVerticalOnCRTC2(pXGI, 15); - else - XGIWaitVerticalOnCRTC1(pXGI, 15); - - /* - * OUTB(XGI_REG_GRX,0x27); - * OUTB(XGI_REG_GRX+1,(int)INB(XGI_REG_GRX+1) & ~0x01); - */ - } - } - /* Jong 09/14/2006; indicate analog display in 2nd port */ - /* Set 2nd DAC (Digital Alalog Converter) on */ - else - { - OUTB(XGI_REG_CRX, 0xd7); - OUTB(XGI_REG_CRX+1, (INB(XGI_REG_CRX+1) & ~0x40) | 0x80); - if (!(bDPMS_status & DEV_SUPPORT_DVI)) - { - /* Program external de-mux */ - OUTB(XGI_REG_GRX, 0x27); - OUTB(XGI_REG_GRX+1, INB(XGI_REG_GRX+1) | 0x02); - OUTB(XGI_REG_GRX, 0x26); - OUTB(XGI_REG_GRX+1, INB(XGI_REG_GRX+1) & ~0x30); - } - } - } - - /* Call BIOS function DeviceSwitchPosHook to let BIOS know current - * device status. - */ - bNew = 0x0; - - OUTB(XGI_REG_CRX,0xc0); - bNew |= (CARD8)INB(XGI_REG_CRX+1) & 0xe0; - - OUTB(XGI_REG_GRX,0x36); - OUTB(XGI_REG_GRX+1,(CARD8)INB(XGI_REG_GRX+1) | 0x01); - bDPMS_status |= ((bDPMS_status << 1) & 0x20); /* Merge 2 CRT bits to 1bit and put in bit 1 */ - bDPMS_status &= ~0x01; - bDPMS_status |= (bDPMS_status >> 4); /* Move LCD flag to bit 0 */ - pXGI->pInt10->ax = 0x120d; - pXGI->pInt10->bx = 0x0414; - pXGI->pInt10->cx = (CARD16)bNew << 8 | (CARD16)(device2Open & (~bDPMS_status)); - pXGI->pInt10->num = 0x10; - xf86ExecX86int10(pXGI->pInt10); - - if(!(pXGI->pInt10->ax >> 8)) - { - while(1) - { - OUTB(XGI_REG_GRX, 0x36); - if(!((CARD8)INB(XGI_REG_GRX+1) & 0x01)) - break; - } - } - OUTB(XGI_REG_GRX, 0x36); - OUTB(XGI_REG_GRX+1,(CARD8)INB(XGI_REG_GRX+1) & ~0x01); - - /* allow SMI switching, Do not touch bit 6 and 3 */ - OUTB(XGI_REG_CRX, SOFT_PAD59_INDEX); - OUTB(XGI_REG_CRX+1,(((CARD8)INB(XGI_REG_CRX+1) & 0x48) | (crtc59 & ~0x48))); - - /* turn on display */ - /* Jong 09/14/2006; XGI_REG_SRX=0x03C4; 0x01:Clocking Mode Register */ - OUTB(XGI_REG_SRX, 0x01); - /* Jong 09/14/2006; turn screen on and selects normal screen operation */ - OUTB(XGI_REG_SRX+1,(CARD8)INB(XGI_REG_SRX+1) & ~0x20); - - /* TV display */ - if(device2Open & DEV_SUPPORT_TV) - { - /* Program external de-mux */ - OUTB(XGI_REG_GRX,0x27); - OUTB(XGI_REG_GRX+1,(int)INB(XGI_REG_GRX+1) & ~0x02); - if ((pXGI->biosDevSupport & DEV_SUPPORT_TV) - && !(pXGI->biosDevSupport & SUPPORT_CURRENT_NO_TV)) { - XG47BiosDTVControl(pXGI, ENABLE_TV_DISPLAY, NULL); - } - } - - pXGI->biosDllOperationFlag &= (~DEVICE_CLOSED); /* OPEN complete */ -} - -/* - * from bios dll: modeset.c - */ - -/*Input - * device: Bit3~0: DVI/TV/CRT/LCD - * mode: Pointer to the XGIModeRec for the mode - * colorIndex: the color index - * 0x2 - 8 bpp - * 0x6 - 16 bpp - * 0x8 - 32 bpp A8R8G8B8 - * 0xA - 32 bpp A2R10G10B10 - *Modification - * Update the mode table: myVideoModeInfoTable in first time call - *Return - * refresh rates supported by specified video mode and device - * (See BIOS spec: Get refresh rate support for definition) - * - */ -CARD16 XGIGetRefreshSupport(XGIPtr pXGI, unsigned device, - XGIModeRec *mode, unsigned colorIndex) -{ - static const int dev_to_idx_table[16] = { - ~0, 0, 1, ~0, 2, ~0, ~0, ~0, - 3, ~0, ~0, ~0, ~0, ~0, ~0, ~0, - }; - const int j = dev_to_idx_table[device & 0x0f]; - - if (j == ~0) { - return 0; - } - - if (mode->refBIOS[j] == 0) { - mode->refBIOS[j] = XGIGetRefreshRateCapability(pXGI, - mode->modeNo & 0x7f, - colorIndex); - } - - return mode->refBIOS[j]; -} - - -/** - * Massage the refreshrate list in the mode to one supported by the driver - */ -static void massage_refresh_rate(XGIAskModePtr pMode) -{ - int refRateIndex = XG47ConvertRefValueToIndex(pMode->refRate); - - for (/* empty */; refRateIndex > 0; refRateIndex--) { - if (XGICheckRefreshRateSupport(pMode->refSupport, refRateIndex)) - break; - } - - if (refRateIndex <= 0) { - for (refRateIndex = 1; - refRateIndex <= VREF_MAX_NUMBER; - refRateIndex++) { - if (XGICheckRefreshRateSupport(pMode->refSupport, refRateIndex)) { - break; - } - } - } - - pMode->refRate = XG47GetRefreshRateByIndex(refRateIndex); -} - - -/* - * Check if the mode is supported in our chip - * (???and get video mode extension based on given information???) - * - * Entry : The mode for primary view - * The mode for second view. NULL if in single view mode - * - * Return: TRUE - The mode is supported - * FALSE - The mode is NOT supported -*/ -static ModeStatus XG47GetValidMode(XGIPtr pXGI, XGIAskModePtr pMode0, - XGIAskModePtr pMode1) -{ - CARD8 tv_ntsc_pal, tv_ntsc_pal_org; - CARD8 tv_3cf_5b, want_3cf_5a; - CARD16 refSupport; - CARD16 modeNo, modeSpec=0; - CARD16 j; - unsigned long ret_value; - - - if ((pMode0 == NULL) && (pMode1 == NULL)) { - return MODE_ERROR; - } - - XGIGetSetChipSupportDevice(pXGI, TRUE); - - if (pMode0) { - XGIModeRec *const mode = XG47GetModeFromRes(pMode0->width, - pMode0->height); - - /* Check with mode index table */ - pMode0->modeNo &= ~0x7F; /* only clear mode number */ - if (mode == NULL) { - return MODE_NOMODE; - } - - pMode0->modeNo |= mode->modeNo & 0x7f; - -#ifdef XGI_DUMP_DUALVIEW - ErrorF("Jong-Debug-Found a supported mode-pMode0->modeNo=%d\n", - pMode0->modeNo); -#endif - - /* display device */ - want_3cf_5a = (CARD8)(pMode0->condition & 0x0000000F); - - /* - * TV format - */ - OUTB(XGI_REG_CRX, 0xC0); - tv_ntsc_pal = (CARD8)INB(XGI_REG_CRX+1) & 0xE0; - - OUTB(XGI_REG_GRX, 0x5A); - tv_3cf_5b = (CARD8)INB(XGI_REG_GRX+1); - - if ((pMode0->condition & DEV_SUPPORT_TV)) { - tv_ntsc_pal = 0; /* NTSC */ - if(pMode0->condition & ZVMX_ATTRIB_NTSCJ) - tv_ntsc_pal = 0x20; - if(pMode0->condition & ZVMX_ATTRIB_PALM) - tv_ntsc_pal = 0x40; - if(pMode0->condition & ZVMX_ATTRIB_PAL) - tv_ntsc_pal = 0x80; - } - - /* Check video BIOS support or not */ - - /* Jong 09/14/2006; why? */ - vAcquireRegIOProtect(pXGI); - - OUTB(XGI_REG_GRX, 0x5A); - OUTB(XGI_REG_GRX+1, ((tv_3cf_5b & 0xF0) | want_3cf_5a)); - OUTB(XGI_REG_CRX, 0xC0); - tv_ntsc_pal_org = (CARD8)INB(XGI_REG_CRX+1); - OUTB(XGI_REG_CRX + 1, ((tv_ntsc_pal_org & 0x1F) | tv_ntsc_pal)); - - modeNo = pMode0->modeNo & 0x7F; - modeSpec |= XGIGetColorIndex(pMode0->pixelSize); - if (modeSpec & 0x08) { - /* 32 bit true color */ - modeSpec |= (pMode0->modeNo & 0x0100) >> 7; /* 10 bits */ - } - - refSupport = XGIGetRefreshSupport(pXGI, pMode0->condition, mode, - modeSpec); - if (!refSupport) { - xf86DrvMsg(pXGI->pScrn->scrnIndex, X_ERROR, - "%s:%u: refSupport = 0, pMode0->condition = 0x%x\n", - __func__, __LINE__, pMode0->condition); - return MODE_BAD; - } - - /* - * CRT, DVI device - */ - /* Jong 09/14/2006; why? */ - vAcquireRegIOProtect(pXGI); - - OUTB(XGI_REG_GRX, 0x5A); - OUTB(XGI_REG_GRX+1, tv_3cf_5b); - - /* Jong 09/14/2006; TV Status flag 1 */ - OUTB(XGI_REG_CRX, 0xC0); - OUTB(XGI_REG_CRX+1, tv_ntsc_pal_org); - - if((CARD8)(pMode0->condition & 0x0F) == DEV_SUPPORT_CRT) - refSupport &= mode->refSupport[1]; - if((CARD8)(pMode0->condition & 0x0F) == DEV_SUPPORT_DVI) - refSupport &= mode->refSupport[3]; - if(pMode0->condition & DEV_SUPPORT_TV) - refSupport &= mode->refSupport[2]; - if(pMode0->condition & DEV_SUPPORT_LCD) - refSupport &= mode->refSupport[0]; - - pMode0->refSupport = refSupport; - if (!refSupport) { - xf86DrvMsg(pXGI->pScrn->scrnIndex, X_ERROR, - "%s:%u: refSupport = 0, pMode0->condition = 0x%x\n", - __func__, __LINE__, pMode0->condition); - xf86DrvMsg(pXGI->pScrn->scrnIndex, X_INFO, - "%s:%u: mode->refSupport[0..3] = 0x%04x 0x%04x 0x%04x 0x%04x\n", - __func__, __LINE__, - mode->refSupport[0], mode->refSupport[1], - mode->refSupport[2], mode->refSupport[3]); - return MODE_BAD; - } - - massage_refresh_rate(pMode0); - } - - /* Check mode for dual view. - */ - if (pMode1) { - XGIModeRec *const mode = XG47GetModeFromRes(pMode1->width, - pMode1->height); - -#ifdef XGI_DUMP_DUALVIEW - ErrorF("Jong-Debug-pMode1->modeNo=%d--\n", pMode1->modeNo); -#endif - - /* Check the memory requirements for this mode. If it's larger than - * the reported on-card memory, reject the mode. - */ - ret_value = (pMode1->width * pMode1->height * (pMode1->pixelSize/8)); - if (ret_value > pXGI->freeFbSize) { - return MODE_MEM; - } - - pMode1->modeNo &= ~0x7F; - - if (mode == NULL) { - return MODE_NOMODE; - } - - pMode1->modeNo |= mode->modeNo & 0x7f; - - if (pMode1->condition & DEV_SUPPORT_LCD) { - pMode1->refRate = pXGI->lcdRefRate; - pMode1->refSupport =(CARD16)XG47ConvertRefValueToIndex(pXGI->lcdRefRate); - } else { - /* - * Refresh Rate for second view. - */ - CARD8 save; - - vAcquireRegIOProtect(pXGI); - OUTB(XGI_REG_GRX, 0x5A); - save = INB(XGI_REG_GRX + 1); - OUTB(XGI_REG_GRX + 1, ((save & 0xF0) | (pMode1->condition & 0x0F))); - - refSupport = XGIGetRefreshSupport(pXGI, pMode1->condition, mode, - XGIGetColorIndex(pMode1->pixelSize)); - vAcquireRegIOProtect(pXGI); - OUTB(XGI_REG_GRX, 0x5A); - OUTB(XGI_REG_GRX+1, save); - - pMode1->refSupport = refSupport; - if (!refSupport) { - xf86DrvMsg(pXGI->pScrn->scrnIndex, X_ERROR, - "%s:%u: pMode1->refSupport = 0, pMode1->condition = 0x%x\n", - __func__, __LINE__, pMode1->condition); - return MODE_BAD; - } - - massage_refresh_rate(pMode0); - } - } else { - int refRateIndex; - - for (j = 0; j < VREF_MAX_NUMBER; j++) { - if ((pMode0->refSupport >> j) & 0x01) { - if (!XGICheckModeSupported(pXGI, pMode0, pMode1, - XG47GetRefreshRateByIndex(j+1))) { - pMode0->refSupport &= ~(1U << j); - } - } - } - - - refRateIndex = XG47ConvertRefValueToIndex(pMode0->refRate); - if (!XGICheckRefreshRateSupport(pMode0->refSupport, refRateIndex)) { - /* If the current refresh rate can not be supported, - * find lowest one. - */ - for (refRateIndex = 1; - refRateIndex < VREF_MAX_NUMBER; - refRateIndex++) { - if (XGICheckRefreshRateSupport(pMode0->refSupport, - refRateIndex)) { - break; - } - } - - pMode0->refRate = XG47GetRefreshRateByIndex(refRateIndex); - } - - if (!pMode0->refRate) { - return MODE_V_ILLEGAL; - } - } - - return MODE_OK; -} - -void XG47BiosValueInit(ScrnInfoPtr pScrn) -{ - XGIPtr pXGI = XGIPTR(pScrn); - CARD16 engineClock, memClock; - CARD8 value[23]; - - - /* - * Default Display Device Info - */ - pXGI->biosDevSupport = SUPPORT_DEV_DVI \ - | SUPPORT_DEV_CRT \ - | SUPPORT_DEV_LCD \ - | SUPPORT_PANEL_CENTERING \ - | SUPPORT_PANEL_EXPANSION \ - | SUPPORT_DEV2_DVI \ - | SUPPORT_DEV2_CRT \ - | SUPPORT_DEV2_LCD; - - pXGI->biosOrgDevSupport = pXGI->biosDevSupport; - - /* - * Display Device Info from BIOS - */ - if (!(pXGI->biosCapability & BIOS_TV_CAPABILITY)) - { - /* does not support TV */ - pXGI->biosDevSupport |= SUPPORT_CURRENT_NO_TV; - pXGI->biosOrgDevSupport |= SUPPORT_CURRENT_NO_TV; - } - else - { - /* support TV */ - pXGI->biosDevSupport |= SUPPORT_TV_NATIVE \ - | SUPPORT_TV_OVERSCAN \ - | SUPPORT_TV_UNDERSCAN \ - | SUPPORT_TV_PAL \ - | SUPPORT_TV_NTSC \ - | SUPPORT_DEV2_TV \ - | SUPPORT_DEV_TV; - pXGI->biosOrgDevSupport |= pXGI->biosDevSupport; - } - - if (pXGI->lcdWidth > (pXGI->lcdHeight/3*4)) - { - /* wide panel */ - pXGI->biosDevSupport |= SUPPORT_PANEL_V_EXPANSION; - pXGI->biosOrgDevSupport |= SUPPORT_PANEL_V_EXPANSION; - } - - if (!(pXGI->biosCapability & BIOS_LCD_SUPPORT)) - { - pXGI->biosDevSupport &=0xfeff00fe; - pXGI->biosOrgDevSupport &=0xfeff00fe; - } - - if (!(pXGI->biosCapability & BIOS_DVI_SUPPORT)) - { - pXGI->biosDevSupport &=0xf7fffff7; - pXGI->biosOrgDevSupport &=0xf7fffff7; - } - - if (!(pXGI->biosCapability & BIOS_CRT_SUPPORT)) - { - pXGI->biosDevSupport &=0xfdfffffd; - pXGI->biosOrgDevSupport &=0xfdfffffd; - } - - /* - * Check TV - */ - - pXGI->pInt10->ax = 0x120E; - pXGI->pInt10->bx = 0x0014; - pXGI->pInt10->num = 0x10; - xf86ExecX86int10(pXGI->pInt10); - - if ((pXGI->pInt10->ax >> 8) != 0x0) /* No TV */ - { - pXGI->biosDevSupport |= SUPPORT_CURRENT_NO_TV; - } - else - { - if (!(pXGI->pInt10->ax & 0x0004)) - { - pXGI->biosDevSupport |= ZVMX_ATTRIB_PALM; - pXGI->biosOrgDevSupport |= ZVMX_ATTRIB_PALM; - } - if (!(pXGI->pInt10->ax & 0x0002)) - { - pXGI->biosDevSupport |= ZVMX_ATTRIB_NTSCJ; - pXGI->biosOrgDevSupport |= ZVMX_ATTRIB_NTSCJ; - } - } - - /* - * Get LCD Timing Parameters - */ - if(XGIReadBiosData(pXGI, value)) - { - vclk18 = value[16]; - vclk19 = value[17]; - vclk28 = value[18] & 0x70; - GR3CE_45 = value[19]; - } - - OUTB(XGI_REG_GRX, 0x45); - GR3CE_45_SingleView = INB(XGI_REG_GRX + 1); - - /* - * Calculate Max. available Memory Bandwidth - */ - engineClock = XGIBiosCalculateClock(pXGI, 0x16, 0x17); - memClock = XGIBiosCalculateClock(pXGI, 0x1E, 0x1F); - pXGI->maxBandwidth = (engineClock <= memClock) ? engineClock : memClock; - pXGI->maxBandwidth = pXGI->maxBandwidth * 8 * 2; /* 64bit, DDR */ - OUTB(XGI_REG_CRX, 0x5D); - if(INB(XGI_REG_CRX + 1) & 0x01 ) - { - pXGI->maxBandwidth = pXGI->maxBandwidth * 8; /* 32bit, DDR *4*2 --> *8 */ - } - else - { - pXGI->maxBandwidth = pXGI->maxBandwidth * 16; /* 64bit, DDR *8*2 --> *16 */ - } - - pXGI->maxBandwidth = (CARD16)(((CARD32)pXGI->maxBandwidth * 60) / 100); - - /* - * Register Initialize - */ - - /* CRTC2 sync load enable */ - OUTB(XGI_REG_SRX, 0xBF); - OUTB(XGI_REG_SRX+1,(int)INB(XGI_REG_SRX+1) | 0x0C); - - /* DV DSTN position */ - if(pXGI->lcdType != FPTYPE_TFT) - { - OUTB(XGI_REG_GRX, 0x49); - OUTB(XGI_REG_GRX+1, ((pXGI->lcdHeight/2) & 0xFF)); - OUTB(XGI_REG_GRX, 0x4A); - OUTB(XGI_REG_GRX+1, ((((pXGI->lcdHeight/2) >> 8) & 0xFF) | 0x80)); - } - - /* Anti-tearing sync select */ - OUTB(0x2450, (CARD16)INB(0x2450) & 0xFB); /* HW recommend 2450[bit 2]=1'b0 */ - - /* W2 line buffer threshold */ - OUTB(0x2492,0x04); - - /* Set Flag to indicate the DLL is loaded. */ - OUTB(XGI_REG_CRX, 0x59); - OUTB(XGI_REG_CRX+1, (INB(XGI_REG_CRX+1) | 0x80)); -} - -#define ALL_TV_FORMATS \ - (ZVMX_ATTRIB_NTSCJ | ZVMX_ATTRIB_NTSC \ - | ZVMX_ATTRIB_PALM | ZVMX_ATTRIB_PAL) - -/* - * Validate Video Mode. - * - * Entry : wBitsPixel, bits/pixel of the display format. - * wSurfaceWidth, width of the screen surface in pixel. - * wSurfaceHeight, height of the screen surface in scanlines. - * Return: video mode information if none zero value, otherwise does not - * support this mode. - */ -ModeStatus XG47BiosValidMode(ScrnInfoPtr pScrn, XGIAskModePtr pMode, - CARD32 dualView) -{ - XGIPtr pXGI = XGIPTR(pScrn); - XGIAskModePtr pMode0, pMode1; - CARD32 temp; - CARD32 test=~0xF0; - - XGIGetSetChipSupportDevice(pXGI, FALSE); - pMode0 = pMode; - - - /* Single view or first view of dual view mode */ - if (!dualView || pXGI->FirstView) { - pMode1 = NULL; - pMode0->condition &= test; - } else { - /* dual view */ - /* pMode1 has wrong data; seems not to initialize */ - pMode1 = pMode0 + 1; - - /* Jong 09/12/2006; why not to &= ~0x0F */ - pMode1->condition &= test; - - pMode0=NULL; - } - -#if 0 - if (!dualView) { - pMode1 = NULL; - pMode0->condition &= ~0xF0; - } else { - /* dual view */ - pMode1 = pMode0 + 1; - pMode1->condition &= ~0xF0; - } -#endif - - /* get current all display device status and information */ - temp = XGIGetDisplayStatus(pXGI, 0); - - if (pMode0) { - /* check 1st display device input data */ - if (!(pMode0->condition & 0x0F)) - pMode0->condition |= (temp & 0x0F); - - /* Check LCD information (Expansion/Centering) */ - if (!(pMode0->condition & 0x0001C00)) - pMode0->condition |= (temp & 0x0001C00); - - /* Check TV format information */ - if (!(pMode0->condition & ALL_TV_FORMATS)) { - pMode0->condition |= (temp & ALL_TV_FORMATS); - } - - /* Check TV Overscan/Underscan mode info */ - if (!(pMode0->condition & 0x00C0000)) - pMode0->condition |= (temp & 0x00C0000); - - /* check valid 1st display device */ - if ((pMode0->condition & 0x0F) != - (pXGI->biosDevSupport & (pMode0->condition & 0x0F))) { - xf86DrvMsg(pXGI->pScrn->scrnIndex, X_ERROR, - "1st display device not supported by BIOS: 0x%02x 0x%02x\n", - (pMode0->condition & 0x0f), - (pXGI->biosDevSupport & 0x0f)); - return FALSE; - } - } - - if (pMode1) { - if (!(pMode1->condition & 0x0000C00)) - pMode1->condition |= (temp & 0x0000C00); - - /* check valid 2nd display device */ - if ((pMode1->condition & 0x0F) - != (pXGI->biosDevSupport & (pMode1->condition & 0x0F))) { - xf86DrvMsg(pXGI->pScrn->scrnIndex, X_ERROR, - "2nd display device not supported by BIOS: 0x%02x 0x%02x\n", - (pMode1->condition & 0x0f), - (pXGI->biosDevSupport & 0x0f)); - return FALSE; - } - } - - return XG47GetValidMode(pXGI, pMode0, pMode1); -} - -/* - * Set video mode patch based on mode extension number. - * - * Entry : dwModeExtension, video mode extersion number. - * dwConditionMask, setting condition mask. - * Return: LOWORD - TRUE for set video mode successful, - * otherwise return FALSE. - * HIWORD - refresh rate value returned. - */ -Bool XG47BiosModeInit(ScrnInfoPtr pScrn, - XGIAskModePtr pMode, - CARD32 dualView) -{ - XGIPtr pXGI = XGIPTR(pScrn); - XGIAskModePtr pMode0 = NULL; - XGIAskModePtr pMode1 = NULL; - CARD8 want_3cf_5a, tv_ntsc_pal, b3c5_de; - CARD16 w2_hzoom,w2_vzoom,w2_hstart,w2_hend,w2_vstart,w2_vend,w2_rowByte; - CARD8 w2_sync; - CARD16 modeinfo[4], modeSpec=0, temp_x, disLen; - CARD16 yres, xres, lineBuf; - CARD32 condition; - - /* Frame buffer address for video window 2 */ - CARD32 W2fbAddr=0; - - - /* Single view or first view of dual view */ - if (!dualView || (dualView == 0x01)) { - pMode0 = & pMode[0]; - condition = pMode0->condition; - } else { - /* Second view of dual view. - */ - pMode1 = & pMode[1]; - condition = pMode1->condition; - } - - /* Jong 10/04/2006; TV Status flag 2 */ - OUTB(XGI_REG_CRX, 0xC2); - OUTB(XGI_REG_CRX+1, (int)(INB(XGI_REG_CRX+1) & ~0x11)); - - if(condition & SUPPORT_TV_NATIVE) - OUTB(XGI_REG_CRX+1, (int)(INB(XGI_REG_CRX+1) | 0x10)); - if(condition & SUPPORT_TV_OVERSCAN) - OUTB(XGI_REG_CRX+1, (int)(INB(XGI_REG_CRX+1) | 0x01)); - - tv_ntsc_pal = 0; - - if (pMode0) { - if (pMode0->condition & ZVMX_ATTRIB_NTSCJ) - tv_ntsc_pal = 0x20; - if (pMode0->condition & ZVMX_ATTRIB_PALM) - tv_ntsc_pal = 0x40; - if (pMode0->condition & ZVMX_ATTRIB_PAL) - tv_ntsc_pal = 0x80; - - OUTB(XGI_REG_CRX, 0xC0); - OUTB(XGI_REG_CRX+1, ((INB(XGI_REG_CRX+1) & 0x1f) | tv_ntsc_pal)); - } - - /* dualView == 0x01 indicate first view - */ - if (!dualView || dualView == 0x01) { - /* Changing MV to single device, need to modify some MV - * configurations. For single device change, this is only dummy - * processing. - */ - if (!dualView) { - /* Close second view (Video Window 2; W2) */ - XGICloseSecondaryView(pXGI); - - /* Selects normal screen operation */ - OUTB(XGI_REG_SRX, 0x01); - OUTB(XGI_REG_SRX+1, INB(XGI_REG_SRX+1) & ~0x20); - } - - /* Combinate & set mode condition. */ - - /* want_3cf_5a indicate which devices need to be enabled and - * decided by condition - */ - want_3cf_5a = (condition & 0x0000000F); - - if (condition & ZVMX_ATTRIB_EXPANSION) { - modeSpec |= BIOS_EXPANSION; - } else if (condition & ZVMX_ATTRIB_V_EXPANSION) { - modeSpec |= BIOS_V_EXPANSION; - } - - /* Protection Register; Set register 0x11 to 0x92 to unprotect all - * extended registers without regarding 3C5.0E bit 7. - */ - vAcquireRegIOProtect(pXGI); - - /* Change of the display device can be done by altering this scratch - * pad register and followed by the set mode function call. - */ - OUTB(XGI_REG_GRX, 0x5A); - OUTB(XGI_REG_GRX+1, ((INB(XGI_REG_GRX+1) & 0xF0) | want_3cf_5a)); - - /* LUT read / write enable */ - OUTB(XGI_REG_SRX, 0xDD); - OUTB(XGI_REG_SRX+1, 0xE0); - - /* What is modeSpec for? It is used by calling BIOS to set mode. - */ - modeSpec |= XGIGetColorIndex(pMode0->pixelSize); - if (modeSpec & 0x08) { - /* 32 bit true color */ - modeSpec |= (pMode0->modeNo & 0x0100) >> 7; /* 10 bits */ - } - - /* Read information of LUT standby and gamma enable */ - OUTB(XGI_REG_SRX, 0xDE); - b3c5_de = INB(XGI_REG_SRX+1); - - /* Call BIOS to set mode. See page 2-37 of - * "Volari XP10 non-3D SPG v1.0.pdf" - */ - pXGI->pInt10->ax = 0x1200; - pXGI->pInt10->bx = 0x0014; - pXGI->pInt10->num = 0x10; - - /* VGA extended mode number */ - OUTB(XGI_REG_GRX, 0x5A); - OUTB(XGI_REG_CRX, 0x5A); - if ((INB(XGI_REG_GRX+1) & 0x80) && (INB(XGI_REG_CRX+1) & 0x04)) { - /* single sync digital */ - pXGI->pInt10->bx |= pXGI->digitalModeNo << 8; - } else { - pXGI->pInt10->bx |= (XGIConvertResToModeNo(pMode0->width, pMode0->height) - | (pMode0->modeNo & 0x80)) << 8; - } - - /* The 44i and 48i rates need to be handled specially. - */ - switch (pMode0->refRate & 0x0ff) { - case 44: - pXGI->pInt10->cx = (modeSpec << 8) | 0xD7; - break; - case 48: - pXGI->pInt10->cx = (modeSpec << 8) | 0xE0; - break; - default: - pXGI->pInt10->cx = (modeSpec << 8) | (pMode0->refRate & 0x01FF); - break; - } - - xf86ExecX86int10(pXGI->pInt10); - - /* Why need to restore b3c5_de which is saved before calling BIOS? */ - OUTB(XGI_REG_SRX, 0xDE); - OUTB(XGI_REG_SRX+1, b3c5_de); - - /* Set mode fail. */ - if (pXGI->pInt10->ax & 0xFF00) { - xf86DrvMsg(pXGI->pScrn->scrnIndex, X_ERROR, - "%s:%u: ax = 0x%04x\n", - __func__, __LINE__, pXGI->pInt10->ax); - return FALSE; - } - - pMode0->refRate = pXGI->pInt10->cx; - - - /* Notify expansion status to system BIOS */ - pXGI->pInt10->ax = 0x120C; - pXGI->pInt10->bx = 0x214; - pXGI->pInt10->cx = 0; - if (modeSpec & BIOS_EXPANSION) { - pXGI->pInt10->cx = 1; - } else if (modeSpec & BIOS_V_EXPANSION) { - pXGI->pInt10->cx = 2; - } - pXGI->pInt10->num = 0x10; - - xf86ExecX86int10(pXGI->pInt10); - - - /* Working status register 0: indicate intended status of display - * device and will take effect after calling set mode of BIOS. - */ - OUTB(XGI_REG_GRX, 0x5A); - - /* System status flag 1: indicate current status of output devices. - */ - OUTB(XGI_REG_CRX, 0x5A); - - if (((pMode0->width == 1920) || (pMode0->width == 2048)) - && !(((condition & DEV_SUPPORT_LCD) && (pXGI->lcdWidth <= 1600)) - || ((condition & DEV_SUPPORT_DVI) && (INB(XGI_REG_GRX+1) & 0x80) - && (INB(XGI_REG_CRX+1) & 4) && (pXGI->lcdWidth <= 1600)))) { - /*Disable Scaling Engine Control: Horizontal interpolation */ - OUTB(XGI_REG_GRX, 0xD3); - OUTB(XGI_REG_GRX+1, (int)(INB(XGI_REG_GRX+1) & ~0x80)); - - /* Disable Scaling Engine Control: Vertical interpolation */ - OUTB(XGI_REG_GRX,0xD5); - OUTB(XGI_REG_GRX+1, (int)(INB(XGI_REG_GRX+1) & ~0x80)); - } - } - - /* Check whether it's a MHS mode */ - OUTB(XGI_REG_GRX, 0x36); - if ((INB(XGI_REG_GRX+1) & 0x02)) { - if (pXGI->isInterpolation) { - /* Enable vertical interpolation of video Window 2 */ - OUTB(0x24aa, (CARD16)INB(0x24aa) & ~0x02); - } else { - /* Disable vertical interpolation of video Window 2 */ - OUTB(0x24aa, (CARD16)INB(0x24aa) | 0x02); - } - } - - /* dualView == 0x02 indicate second view - */ - if (dualView == 0x02) { - if (condition & SUPPORT_W2_CLOSE) { - /* Selects normal screen operation */ - OUTB(XGI_REG_SRX, 0x01); - OUTB(XGI_REG_SRX+1, INB(XGI_REG_SRX+1) & ~0x20); - return TRUE; - } - - /* Used to check 0x3E4-0x5B for dual view */ - want_3cf_5a = (CARD8)(condition & 0x0000000f) << 4; - - /* set flag of 0x5B for dual view */ - OUTB(XGI_REG_GRX, 0x5B); - OUTB(XGI_REG_GRX+1, (INB(XGI_REG_GRX+1) & ~0xF0) | want_3cf_5a); - - /* Debug different modes for dual view */ - modeSpec |= XGIGetColorIndex(pMode1->pixelSize); - - /* 32 bit true color */ - if (modeSpec & 0x08) { - modeSpec |= (pMode1->modeNo & 0x0100) >> 7; /* 10 bits */ - } - - - /* Call BIOS to set mode */ - pXGI->pInt10->ax = 0x1200; - pXGI->pInt10->bx = 0x0014; - if (condition & DEV_SUPPORT_LCD) { - pXGI->pInt10->bx |= (CARD16)pXGI->lcdModeNo << 8; - } else if (condition & DEV_SUPPORT_DVI) { - OUTB(XGI_REG_GRX, 0x5A); - OUTB(XGI_REG_CRX, 0x5A); - if ((INB(XGI_REG_GRX+1) & 0x80) && (INB(XGI_REG_CRX+1) & 0x04)) { - /* single sync digital */ - pXGI->pInt10->bx |= (CARD16)pXGI->digitalModeNo << 8; - } else { - pXGI->pInt10->bx |= ((CARD16)XGIConvertResToModeNo(pMode1->width, pMode1->height) - | (pMode1->modeNo & 0x80)) << 8; - } - } else if ((condition & DEV_SUPPORT_TV) && (pMode1->width > 1024)) { - pXGI->pInt10->bx |= (MODE_1024x768 & 0xFF00); - } else { - pXGI->pInt10->bx |= ((CARD16)XGIConvertResToModeNo(pMode1->width, pMode1->height) - | (pMode1->modeNo & 0x80)) << 8; - } - - /* D7 1: Set CRTC2 timing only */ - pXGI->pInt10->cx = 0x8000 | (modeSpec << 8) | (pMode1->refRate & 0x01FF); - - pXGI->pInt10->num = 0x10; - xf86ExecX86int10(pXGI->pInt10); - - /* w2 (CRTC 2) Zoom & Position. - */ - - /* Get horisontal start and end position of display */ - OUTB(XGI_REG_SRX, 0xC8); - w2_hstart = (CARD16)INB(XGI_REG_SRX+1); - OUTB(XGI_REG_SRX, 0xC9); - w2_hstart |= (CARD16)INB(XGI_REG_SRX+1) << 8; - - OUTB(XGI_REG_SRX,0xCA); - w2_hend = (CARD16)INB(XGI_REG_SRX+1); - OUTB(XGI_REG_SRX,0xCB); - w2_hend |= (CARD16)INB(XGI_REG_SRX+1) << 8; - - /* Get vertical start and end position of display */ - OUTB(XGI_REG_SRX,0xC4); - w2_vstart = (CARD16)INB(XGI_REG_SRX+1); - OUTB(XGI_REG_SRX,0xC5); - w2_vstart |= (CARD16)INB(XGI_REG_SRX+1) << 8; - - OUTB(XGI_REG_SRX,0xC6); - w2_vend = (CARD16)INB(XGI_REG_SRX+1); - OUTB(XGI_REG_SRX,0xC7); - w2_vend |= (CARD16)INB(XGI_REG_SRX+1) << 8; - - /* CRTC2 SYNC Pulse Width */ - OUTB(XGI_REG_SRX,0xCC); - w2_sync = INB(XGI_REG_SRX+1); - - /* Adjust Overlay position - * W2_Hstart = HDE start - 50 = (3C5.C9-C8) - 50 - * W2_Hend = HDE end - 51 = (3C5.CB-CA) - 51 - * W2_Vstart = VDE start - 6 = (3C5.C5-C4) - 4 - * W2_Vend = VDE end -2 = (3C5.C7-C6) - * Note: 1. Flick disbled, 24B0.[2:0] = 0 - * 2. W2 HDE is 0, 24AA.[7:4] = 0 - */ - w2_hstart -= 0x032; - w2_hend -= 0x033; /* Keep as same as DE. */ - w2_vstart -= 0x04; - - xres = pMode1->width; - yres = pMode1->height; - - if (condition & DEV_SUPPORT_LCD) { - /* Panel mode */ - if (condition & ZVMX_ATTRIB_EXPANSION) { - /* Horizontal Zoom */ - if (xres > pXGI->lcdWidth) { - xres = pXGI->lcdWidth; - } - - w2_hzoom = (CARD16)((CARD32)(xres-1) * 1024 / (pXGI->lcdWidth - 1)); - temp_x = (CARD16)((xres-1) * 1024 % (pXGI->lcdWidth - 1)); - if (temp_x >= ((pXGI->lcdWidth - 1) >> 1)) { - w2_hzoom++; - if (temp_x <= ((pXGI->lcdWidth - 1) * 9 / 10)) - w2_hend--; - } - } else { - w2_hzoom = 1024; - disLen = (CARD16)(pXGI->lcdHeight/3)*4; - if ((disLen < pXGI->lcdWidth) - && (xres < disLen) - && (condition & ZVMX_ATTRIB_V_EXPANSION)) { - w2_hstart += (CARD16)((pXGI->lcdWidth - disLen)>>1); - w2_hend = (CARD16)(w2_hstart + disLen) -1; - w2_hzoom = (CARD16)((CARD32)(xres-1) * 1024 / (disLen-1)); - temp_x = (CARD16)((xres-1) * 1024 % (disLen-1)); - if (temp_x >= ((disLen-1) >> 1)) { - w2_hzoom++; - } else { - w2_hend++; - } - } else if (xres < pXGI->lcdWidth) { - w2_hstart += (CARD16)((pXGI->lcdWidth - xres)>>1); - w2_hend -= (CARD16)((pXGI->lcdWidth - xres)>>1); - } - } - - if (condition & (ZVMX_ATTRIB_EXPANSION | ZVMX_ATTRIB_V_EXPANSION)) { - /* Vertical Zoom */ - if (yres > pXGI->lcdHeight) - yres = pXGI->lcdHeight; - - w2_vzoom = (CARD16)((CARD32)(yres-1) * 1024 / (pXGI->lcdHeight-1)); - if ((CARD32)(yres-1) * 1024 % (pXGI->lcdHeight-1)) - w2_vzoom++; - if (((CARD32)(yres-1) * 1024 % (pXGI->lcdHeight-1)) && - ((CARD32)(yres-1) * 1024 % (pXGI->lcdHeight-1)) < (CARD32)((pXGI->lcdHeight-1) >> 1)) - w2_vend--; - } else { - if (yres < pXGI->lcdHeight) { - w2_vstart += (CARD16)((pXGI->lcdHeight - yres)>>1); - w2_vend -= (CARD16)((pXGI->lcdHeight - yres)>>1); - } - w2_vzoom = 1024; - } - } else if (condition & DEV_SUPPORT_DVI) { - /* DVI mode */ - OUTB(XGI_REG_GRX,0x5a); - OUTB(XGI_REG_CRX,0x5a); - if ((INB(XGI_REG_GRX+1) & 0x80) && (INB(XGI_REG_CRX+1) & 0x04)) { - /* single sync digital */ - w2_hend--; - /* Horizontal Zoom */ - if (xres > pXGI->digitalWidth) - xres = pXGI->digitalWidth; - - w2_hzoom = (CARD16)((CARD32)(xres-1) * 1024 / (pXGI->digitalWidth - 1)); - if (((CARD32)(xres-1) * 1024 % (pXGI->digitalWidth - 1)) >= (CARD32)((pXGI->digitalWidth - 1) >> 1)) { - w2_hzoom++; - w2_hend--; - } - - /* Vertical Zoom */ - if (yres > pXGI->digitalHeight) - yres = pXGI->digitalHeight; - - w2_vzoom = (CARD16)((CARD32)(yres-1) * 1024 / (pXGI->digitalHeight -1)); - if ((CARD32)(yres-1) * 1024 % (pXGI->digitalHeight - 1)) - w2_vzoom++; - if (((CARD32)(yres-1) * 1024 % (pXGI->digitalHeight - 1)) && - ((CARD32)(yres-1) * 1024 % (pXGI->digitalHeight - 1)) < (CARD32)((pXGI->digitalHeight - 1) >> 1)) - w2_vend--; - } else { - if (xres == 320 || xres == 400 || xres == 512) { - w2_hzoom = 512; - w2_vzoom = 512; - } else if (xres == 720) { - /* scale up to 800x600 */ - w2_hzoom = 0x399; - if(yres == 576) - w2_vzoom = 0x3d7; - else /* 480 */ - w2_vzoom = 0x333; - } else { - w2_hzoom = 1024; - w2_vzoom = 1024; - } - } - } else if (condition & DEV_SUPPORT_CRT) { - /* CRT mode */ - if (xres == 320 || xres == 400 || xres == 512) { - w2_hzoom = 512; - w2_vzoom = 512; - } else { - w2_hzoom = 1024; - w2_vzoom = 1024; - } - } else { - /* TV mode */ - if (xres > 1024) { - xres = 1024; - yres = 768; - } - - if (xres == 320 || xres == 400 || xres == 512) { - w2_hzoom = 512; - w2_vzoom = 512; - } else { - w2_hzoom = 1024; - w2_vzoom = 1024; - } - - w2_hstart += 0x01A; - w2_hend += 0x019; - - w2_sync = (w2_sync>>1) + 8; - OUTB(XGI_REG_SRX,0xcc); - OUTB(XGI_REG_SRX+1, w2_sync); - - OUTB(XGI_REG_CRX,0xc0); - if (!(INB(XGI_REG_CRX+1) & 0x80)) { - w2_vstart -= 0x0c; - w2_vend -= 0x0c; - } - } - - temp_x = (CARD16)xres & 0xfff0; - if (((CARD16)xres & 0x000f) != 0) - temp_x += 0x10; - - w2_rowByte = (CARD16)(temp_x * (pMode1->pixelSize >> 3)) >> 4; - - lineBuf = xres >> 3; - - if (pMode1->pixelSize == 8) { - lineBuf >>= 1; - } else if (pMode1->pixelSize == 16) { - /* Disable dithering */ - OUTB(XGI_REG_GRX, 0x42); - OUTB(XGI_REG_GRX+1, INB(XGI_REG_GRX+1) & ~0x08); - } else if (pMode1->pixelSize == 32) { - lineBuf <<= 1; - } - - lineBuf++; - if (lineBuf > 0x3FF) - lineBuf = 0x3FF; /* Overflow */ - - vAcquireRegIOProtect(pXGI); - - /* Window 2 Starting address of (Y) frame buffer. - * - * We need to give an different address than (0,0) if MHS is - * required. Otherwise (0,0) is correct for simultaneous and content - * mode. - * - * Total 25 bits is effective. - */ - W2fbAddr = pScrn->memPhysBase; - XG47SetW2ViewBaseAddr(pScrn, (unsigned long)W2fbAddr); - -#ifdef XGI_DUMP_DUALVIEW - ErrorF("Jong-After calling- XG47SetW2ViewBaseAddr()-W2fbAddr=0x%x\n", - W2fbAddr); - XGIDumpRegisterValue(pScrn); -#endif - - /* W2 zooming factor */ - OUTW(0x249c, w2_hzoom); - OUTW(0x24a0, w2_vzoom); - - /* W2 start/end */ - OUTW(0x2494, w2_hstart); - OUTW(0x2496, w2_hend); - OUTW(0x2498, w2_vstart); - OUTW(0x249a, w2_vend); - - /* W2 row byte */ - OUTW(0x248c, w2_rowByte); - - /* Line buffer */ - OUTW(0x2490, lineBuf); - - /* disable color key mask for video */ - OUTW(0x24bc, 0x0); - OUTW(0x24be, 0x0); - - OUTB(XGI_REG_GRX, 0x5D); - modeSpec = (CARD8)INB(XGI_REG_GRX+1); /* LCD Expansion/Centering */ - - ErrorF("Jong-Debug-3CE-0x5D-modeSpec=0x%x\n", modeSpec); - - /* Set to RGB mode - * 0x24a9:[4]: W2_CSCPASS - * 1: window2 RGB format - * *0: window2 YUV format - */ - OUTB(0x24a9, ((CARD16)INB(0x24a9) & ~0x0F) | 0x1A); /* CSCPASS, RGB WINMD */ - - if ((!(modeSpec & GRAF_EXPANSION))||(pMode1->pixelSize == 8)) { - OUTB(0x24aa, (CARD16)INB(0x24aa) | 0x01); /* HINTEN, disable */ - } else { - OUTB(0x24aa, (CARD16)INB(0x24aa) & ~0x01); /* HINTEN, enable */ - } - - OUTB(0x24aa, (CARD16)INB(0x24aa) | 0x02); - if ((condition & DEV_SUPPORT_LCD) - && (pMode1->width < pXGI->lcdWidth)) { - if(pXGI->isInterpolation) - OUTB(0x24aa, INB(0x24aa) & ~0x02); - } - - if (pMode1->pixelSize == 8) { - OUTB(0x24a8, (INB(0x24a8) & ~0x07) | 0x01); - } else if(pMode1->pixelSize == 16) { - OUTB(0x24a8, (INB(0x24a8) & ~0x07) | 0x02); - } else { - /* 10 bits */ - if (pMode0->modeNo & 0x0100) { - OUTB(0x24a8, INB(0x24a8) | 0x07); - } else { - OUTB(0x24a8, (INB(0x24a8) & ~0x07) | 0x04); - } - } - - OUTB(0x24aa, (INB(0x24aa) & ~0x70)); /* HDE Adjust */ - - /* sharpness */ - OUTB(0x24ab, 0x10); - - /*disable sub-picture, and will correct 2nd view color */ - OUTB(0x2470, (CARD16)INB(0x2470) & ~0x06); - - OUTB(XGI_REG_GRX, 0x81); - OUTB(XGI_REG_GRX+1, INB(XGI_REG_GRX+1) | 0x80); - /* Enable Window 2 */ - OUTB(XGI_REG_GRX, 0x81); - OUTB(XGI_REG_GRX+1, INB(XGI_REG_GRX+1) | 0x01); - - /* Turn on video engine memory clock */ - OUTB(XGI_REG_GRX, 0xDA); - OUTB(XGI_REG_GRX+1, INB(XGI_REG_GRX+1) & ~0x10); - - /* Turn on video engine pixel clock */ - OUTB(XGI_REG_CRX, 0xBE); - OUTB(XGI_REG_CRX+1, INB(XGI_REG_CRX+1) | 0x04); - - /* Turn on video engine clock for w2 */ - OUTB(XGI_REG_SRX, 0x52); - OUTB(XGI_REG_SRX+1, INB(XGI_REG_SRX+1) | 0x40); - - if (want_3cf_5a & (DEV_SUPPORT_LCD << 4)) { - /* W2 on LCD */ - OUTB(XGI_REG_SRX, 0xBE); - OUTB(XGI_REG_SRX+1,(int)INB(XGI_REG_SRX+1) | 0x08); - - /* Set DE delay for CRTC2 */ - OUTB(XGI_REG_GRX, 0x45); - OUTB(XGI_REG_GRX+1, (INB(XGI_REG_GRX+1) & ~0x07)|(GR3CE_45 & 0x07)); - } - - if (want_3cf_5a & (DEV_SUPPORT_TV << 4)) { - /* W2 on TV */ - OUTB(XGI_REG_CRX, 0xD6); - OUTB(XGI_REG_CRX+1, INB(XGI_REG_CRX+1) | 0x04); - - /* UV order */ - OUTB(XGI_REG_SRX, 0xD8); - OUTB(XGI_REG_SRX+1, 0x11); - - /* Adjust VDHLOAD */ - OUTB(XGI_REG_CRX, 0xD2); - temp_x = (CARD16)INB(XGI_REG_CRX+1); - OUTB(XGI_REG_CRX, 0xD3); - temp_x |= (CARD16)(INB(XGI_REG_CRX+1) & 0x0F) << 8; - - OUTB(XGI_REG_CRX, 0xC0); - if(INB(XGI_REG_CRX+1) & 0x80) - temp_x += 0x14; - - OUTB(XGI_REG_CRX, 0xD2); - OUTB(XGI_REG_CRX+1, temp_x); - OUTB(XGI_REG_CRX, 0xD3); - OUTB(XGI_REG_CRX+1, (INB(XGI_REG_CRX+1) & 0xF0) | (temp_x >> 8)); - } - - if (want_3cf_5a & (DEV_SUPPORT_DVI << 4)) { - /* W2 on DVI, driving strength */ - - /* TMDS Power, disable internal TMDS */ - OUTB(XGI_REG_GRX, 0x3D); - OUTB(XGI_REG_GRX+1, INB(XGI_REG_GRX+1) | 0x01); - - /* LCD2 HS Delay */ - OUTB(XGI_REG_GRX, 0x46); - OUTB(XGI_REG_GRX+1, (INB(XGI_REG_GRX+1) & ~0x38) | 0x28); - - OUTB(XGI_REG_CRX, 0xD6); - OUTB(XGI_REG_CRX+1, INB(XGI_REG_CRX+1) & ~0x10); - - OUTB(XGI_REG_GRX, 0x2A); - OUTB(XGI_REG_GRX+1, INB(XGI_REG_GRX+1) | 0x40); - } - - /* Sset second view to CRT1/DVI2 with 0x3CE/0x3CF-0x2C:[6] - * DEV_SUPPORT_CRT = 0x0002; (DEV_SUPPORT_CRT << 4) = 0x0020 - * - * Why to check want_3cf_5a but not want_3cf_5b? - */ - if (want_3cf_5a & (DEV_SUPPORT_CRT << 4)) { - OUTB(XGI_REG_GRX, 0x2C); - OUTB(XGI_REG_GRX+1, INB(XGI_REG_GRX+1) | 0x40); - } - - OUTB(0x24c2,(CARD16)INB(0x24c2) | 0x20); /* MC5 */ - } - - /* TV - */ - if ((pXGI->biosDevSupport & SUPPORT_DEV_TV) - && !(pXGI->biosDevSupport & SUPPORT_CURRENT_NO_TV) - && (condition & DEV_SUPPORT_TV)) { - if (dualView == 0x02) { - modeinfo[0] = (CARD16)pMode1->width; - modeinfo[1] = (CARD16)pMode1->height; - modeinfo[2] = (CARD16)pMode1->pixelSize; - } else { - modeinfo[0] = (CARD16)pMode0->width; - modeinfo[1] = (CARD16)pMode0->height; - modeinfo[2] = (CARD16)pMode0->pixelSize; - } - - if (condition & SUPPORT_TV_NATIVE) { - if (condition & ZVMX_ATTRIB_PAL) { - if (modeinfo[0] >= 800 && modeinfo[1] > 514) { - modeinfo[0] = 800; - modeinfo[1] = 514; - } - } else { - if (modeinfo[0] >= 640 && modeinfo[1] > 432) { - modeinfo[0] = 640; - modeinfo[1] = 432; - } - } - } else { - if (modeinfo[0] >= 1024 && modeinfo[1] >= 768) { - modeinfo[0] = 1024; - modeinfo[1] = 768; - } - } - - /* Only one true color format(32bit). - */ - modeinfo[3] = 1; - - XG47BiosDTVControl(pXGI, INIT_TV_SCREEN, modeinfo); - } - - return TRUE; -} - - -Bool XG47BiosSpecialFeature(ScrnInfoPtr pScrn, unsigned long cmd, - const unsigned long *pInBuf) -{ - XGIPtr pXGI = XGIPTR(pScrn); - const CARD16 *const x = (const CARD16 *) pInBuf; - - - switch (cmd) { - case CLOSE_ALL_DEVICE: - vAcquireRegIOProtect(pXGI); - XG47CloseAllDevice(pXGI, (CARD8)x[0]); - return TRUE; - - case OPEN_ALL_DEVICE: - vAcquireRegIOProtect(pXGI); - XG47OpenAllDevice(pXGI, (CARD8)x[0]); - return TRUE; - - default: - if ((pXGI->biosOrgDevSupport & 0x000F0000) - && (cmd >= INIT_TV_SCREEN)) { - return XG47BiosDTVControl(pXGI, cmd, x); - } - break; - } - - return FALSE; -} - -Bool XG47BiosDTVControl(XGIPtr pXGI, unsigned cmd, const CARD16 *piWord) -{ - if (pXGI->dtvInfo == TV_INVALID) { - return FALSE; - } - - switch (cmd) { - case ENABLE_TV_DISPLAY: - XG47ControlTVDisplay(pXGI, TRUE); - break; - case DISABLE_TV_DISPLAY: - XG47ControlTVDisplay(pXGI, FALSE); - break; - case INIT_TV_SCREEN: - XG47InitTVScreen(pXGI, piWord[0], piWord[1], piWord[2], piWord[3]); - break; - default: - return FALSE; - } - - return TRUE; -} diff --git a/src/xg47_bios.h b/src/xg47_bios.h deleted file mode 100644 index 7ee2aa3..0000000 --- a/src/xg47_bios.h +++ /dev/null @@ -1,47 +0,0 @@ -/*************************************************************************** - * 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 _XG47_BIOS_H_ -#define _XG47_BIOS_H_ - -/* xg47_bios.c */ -extern ModeStatus XG47BiosValidMode(ScrnInfoPtr pScrn, XGIAskModePtr pMode, - CARD32 dualView); - -extern Bool XG47BiosModeInit(ScrnInfoPtr pScrn, - XGIAskModePtr pMode, - CARD32 dualView); -extern void XG47BiosValueInit(ScrnInfoPtr pScrn); - -extern Bool XG47BiosSpecialFeature(ScrnInfoPtr pScrn, unsigned long cmd, - const unsigned long *pInBuf); - -extern void XG47CloseAllDevice(XGIPtr pXGI, CARD8 device2Close); -extern void XG47OpenAllDevice(XGIPtr pXGI, CARD8 device2Open); -extern CARD16 XG47GetRefreshRateByIndex(CARD8 index); - -#endif diff --git a/src/xg47_mode.c b/src/xg47_mode.c index 1d33ea7..18862a9 100644 --- a/src/xg47_mode.c +++ b/src/xg47_mode.c @@ -37,266 +37,6 @@ /* Jong 09/15/2006; support dual view; default is single mode */ int g_DualViewMode=0; -/* - * Pixel(Video) clock information. - */ -XGIPixelClockRec XG47ModeVClockTable[]={ - {320, 200, 60, 13}, - {320, 200, 70, 13}, - {320, 240, 60, 13}, - /*{320, 240, 72, 16},*/ - {320, 240, 75, 16}, - {320, 240, 85, 18}, - {400, 300, 60, 20}, - {400, 300, 75, 25}, - {400, 300, 85, 28}, - /*{512, 384, 44, 23},*/ - {512, 384, 60, 33}, - /*{512, 384, 70, 38},*/ - {512, 384, 75, 39}, - {512, 384, 85, 48}, - {640, 400, 60, 25}, - {640, 400, 70, 25}, - {640, 400, 85, 31}, - {640, 432, 60, 25}, - {640, 480, 60, 25}, - /*{640, 480, 72, 31},*/ - {640, 480, 75, 32}, - {640, 480, 85, 36}, - {640, 480,100, 43}, - {640, 480,120, 52}, - {720, 480, 60, 28}, - {720, 540, 60, 30}, - {720, 576, 60, 32}, - {800, 514, 60, 40}, - {800, 600, 60, 40}, - {800, 600, 75, 50}, - {800, 600, 85, 56}, - {800, 600,100, 68}, - {800, 600,120, 84}, - {848, 480, 60, 31}, - {1024, 600, 60, 51}, - {1024, 768, 44, 45}, - {1024, 768, 60, 65}, - {1024, 768, 70, 75}, - {1024, 768, 75, 79}, - {1024, 768, 85, 95}, - {1024, 768,100,113}, - {1024, 768,120,139}, - {1152, 864, 60, 81}, - {1152, 864, 75,108}, - {1152, 864, 85,119}, - {1280, 600, 60,108}, - {1280, 768, 60, 74}, - {1280, 768, 60, 79}, - {1280, 800, 60,101}, - {1280, 960, 60,101}, - {1280, 960, 75,130}, - {1280, 960, 85,148}, - {1280,1024, 44, 78}, - {1280,1024, 60,108}, - {1280,1024, 75,135}, - {1280,1024, 85,158}, - {1280,1024,100,191}, - {1280,1024,120,234}, - {1400,1050, 60,122}, - {1400,1050, 75,155}, - {1400,1050, 85,179}, - {1440, 900, 60,129}, - {1600,1200, 48,130}, - {1600,1200, 0x13C,130}, - {1600,1200, 60,162}, - {1600,1200, 75,203}, - {1600,1200, 85,230}, - {1600,1200,100,281}, - {1680,1050, 60,178}, - {1920,1080, 0xbc,74}, - {1920,1080, 60,148}, - {1920,1200, 0x13C,154}, - {1920,1200, 60,234}, - {1920,1440, 60,234}, - {1920,1440, 75,297}, - {2048,1536, 60,267}, - {2048,1536, 75,340} -}; - -int XG47ModeVClockTableSize = sizeof(XG47ModeVClockTable) / sizeof(XGIPixelClockRec); - -XGIPixelClockRec XG47ModeVClockTable2[]={ - {1600,1200,60,130}, - {1920,1200,60,154} -}; -int XG47ModeVClockTableSize2 = sizeof(XG47ModeVClockTable2) / sizeof(XGIPixelClockRec); - -/* - * XG47 mode table - */ -static XGIModeRec XG47ModeTable[] = { -{ MODE_320x200, 320, 200, - { VMODE_REF_75Hz+VMODE_REF_60Hz, - VMODE_REF_70Hz, - VMODE_REF_60Hz, - VMODE_REF_70Hz }, - { 0,0,0,0 }, { 0 } -}, -{ MODE_320x240, 320, 240, - { VMODE_REF_75Hz+VMODE_REF_60Hz, - VMODE_REF_85Hz+VMODE_REF_75Hz+VMODE_REF_60Hz, - VMODE_REF_60Hz, - VMODE_REF_85Hz+VMODE_REF_75Hz+VMODE_REF_60Hz }, - { 0,0,0,0 }, { 0 } -}, -{ MODE_400x300, 400, 300, - { VMODE_REF_75Hz+VMODE_REF_60Hz, - VMODE_REF_85Hz+VMODE_REF_75Hz+VMODE_REF_60Hz, - VMODE_REF_60Hz, - VMODE_REF_85Hz+VMODE_REF_75Hz+VMODE_REF_60Hz }, - { 0,0,0,0 }, { 0 } -}, -{ MODE_512x384, 512, 384, - { VMODE_REF_60Hz, - VMODE_REF_85Hz+VMODE_REF_75Hz+VMODE_REF_60Hz+VMODE_REF_44Hz, - VMODE_REF_60Hz, - VMODE_REF_85Hz+VMODE_REF_75Hz+VMODE_REF_60Hz }, - { 0,0,0,0 }, { 0 } -}, -{ MODE_640x400, 640, 400, - { VMODE_REF_75Hz+VMODE_REF_60Hz, - VMODE_REF_85Hz+VMODE_REF_70Hz, - VMODE_REF_60Hz, - VMODE_REF_85Hz+VMODE_REF_70Hz }, - { 0,0,0,0 }, { 0 } -}, -{ MODE_640x432, 640, 432, - { 0x0000, VMODE_REF_60Hz, VMODE_REF_60Hz, VMODE_REF_60Hz }, - { 0,0,0,0 }, { 0 } -}, -{ MODE_640x480, 640, 480, - { VMODE_REF_75Hz+VMODE_REF_60Hz, 0xffff, VMODE_REF_60Hz, 0xffff }, /* Open All */ - { 0,0,0,0 }, { 0 } -}, -{ MODE_720x480, 720, 480, - { VMODE_REF_60Hz, VMODE_REF_60Hz, VMODE_REF_60Hz, VMODE_REF_60Hz }, - { 0,0,0,0 }, { 0 } -}, -{ MODE_720x576, 720, 576, - { VMODE_REF_60Hz, VMODE_REF_60Hz, VMODE_REF_60Hz, VMODE_REF_60Hz }, - { 0,0,0,0 }, { 0 } -}, -{ MODE_800x514, 800, 514, - { 0x0000, VMODE_REF_60Hz, VMODE_REF_60Hz, VMODE_REF_60Hz }, - { 0,0,0,0 }, { 0 } -}, -{ MODE_800x600, 800, 600, - { VMODE_REF_75Hz+VMODE_REF_60Hz, 0xffff, VMODE_REF_60Hz, 0xffff }, /* Open All */ - { 0,0,0,0 }, { 0 } -}, -{ MODE_848X480, 848, 480, - { 0x0000, VMODE_REF_60Hz, VMODE_REF_60Hz, VMODE_REF_60Hz }, - { 0,0,0,0 }, { 0 } -}, -{ MODE_1024x600, 1024, 600, - { VMODE_REF_60Hz, VMODE_REF_60Hz, VMODE_REF_60Hz, VMODE_REF_60Hz }, - { 0,0,0,0 }, { 0 } -}, -{ MODE_1024x768, 1024, 768, - { VMODE_REF_75Hz+VMODE_REF_60Hz, 0xffff, VMODE_REF_60Hz, 0xffff }, /* Open All */ - { 0,0,0,0 }, { 0 } -}, -{ MODE_1152x864, 1152, 864, - { VMODE_REF_60Hz, VMODE_REF_60Hz+VMODE_REF_75Hz+VMODE_REF_85Hz, - VMODE_REF_60Hz, VMODE_REF_60Hz+VMODE_REF_75Hz+VMODE_REF_85Hz }, - { 0,0,0,0 }, { 0 } -}, -{ MODE_1280x600, 1280, 600, - { VMODE_REF_60Hz, VMODE_REF_60Hz, VMODE_REF_60Hz, VMODE_REF_60Hz }, - { 0,0,0,0 }, { 0 } -}, -{ MODE_1280X720, 1280, 720, - { VMODE_REF_60Hz, 0xffff, VMODE_REF_60Hz, 0xffff }, - { 0,0,0,0 }, { 0 } -}, -{ MODE_1280x768, 1280, 768, - { VMODE_REF_60Hz, 0xffff, VMODE_REF_60Hz, 0xffff }, /* Open All */ - { 0,0,0,0 }, { 0 } -}, -{ MODE_1280x800, 1280, 800, - { VMODE_REF_60Hz, VMODE_REF_60Hz, VMODE_REF_60Hz, VMODE_REF_60Hz }, - { 0,0,0,0 }, { 0 } -}, -{ MODE_1280x960, 1280, 960, - { VMODE_REF_60Hz, 0xffff, VMODE_REF_60Hz, 0xffff }, /* Open All */ - { 0,0,0,0 }, { 0 } -}, -{ MODE_1280x1024, 1280,1024, - { VMODE_REF_75Hz+VMODE_REF_60Hz, 0xffff, VMODE_REF_60Hz, 0xffff }, /* Open All */ - { 0,0,0,0 }, { 0 } -}, -{ MODE_1440x900, 1440, 900, - { VMODE_REF_60Hz, VMODE_REF_60Hz, VMODE_REF_60Hz, VMODE_REF_60Hz }, - { 0,0,0,0 }, { 0 } -}, -{ MODE_1400x1050, 1440, 1050, - { VMODE_REF_60Hz, VMODE_REF_60Hz+VMODE_REF_75Hz+VMODE_REF_85Hz, - VMODE_REF_60Hz, VMODE_REF_60Hz+VMODE_REF_75Hz+VMODE_REF_85Hz }, - { 0,0,0,0 }, { 0 } -}, -{ MODE_1600x1200, 1600,1200, - { VMODE_REF_60Hz, 0xffff, VMODE_REF_60Hz, 0xffff }, /* Open All */ - { 0,0,0,0 }, { 0 } -}, -{ MODE_1680x1050, 1680, 1050, - { VMODE_REF_60Hz, 0xffff, VMODE_REF_60Hz, 0xffff }, - { 0,0,0,0 }, { 0 } -}, -{ MODE_1920X1080, 1920, 1080, - { VMODE_REF_60Hz, 0xffff, VMODE_REF_60Hz, 0xffff }, - { 0,0,0,0 }, { 0 } -}, -{ MODE_1920x1200, 1920, 1200, - { VMODE_REF_60Hz, 0xffff, VMODE_REF_60Hz, 0xffff }, - { 0,0,0,0 }, { 0 } -}, -{ MODE_1920x1440, 1920,1440, - { VMODE_REF_60Hz, 0xffff, VMODE_REF_60Hz, 0xffff }, - { 0,0,0,0 }, { 0 } -}, -{ MODE_2048x1536, 2048,1536, - { VMODE_REF_60Hz, 0xffff, VMODE_REF_60Hz, 0xffff }, - { 0,0,0,0 }, { 0 } -}, -{ MAX_MODE_NO, MAX_MODE_INT, MAX_MODE_INT, - { 0xFFFF,0xFFFF,0xFFFF,0xFFFF }, - { 0xFFFF,0xFFFF,0xFFFF,0xFFFF }, { 0xFFFF } -}, -{ MAX_MODE_NO, MAX_MODE_INT, MAX_MODE_INT, - { 0xFFFF,0xFFFF,0xFFFF,0xFFFF }, - { 0xFFFF,0xFFFF,0xFFFF,0xFFFF }, { 0xFFFF } -}, -{ MAX_MODE_NO, MAX_MODE_INT, MAX_MODE_INT, - { 0xFFFF,0xFFFF,0xFFFF,0xFFFF }, - { 0xFFFF,0xFFFF,0xFFFF,0xFFFF }, { 0xFFFF } -}, -}; - -static const int XG47ModeTableSize = sizeof(XG47ModeTable) - / sizeof(XGIModeRec); - -XGIModePtr XG47GetModeFromRes(unsigned width, unsigned height) -{ - int i; - - - for (i = 0; i < XG47ModeTableSize; i++) { - if ((XG47ModeTable[i].width == width) - && (XG47ModeTable[i].height == height)) { - return & XG47ModeTable[i]; - } - } - - return NULL; -} - void XG47LoadPalette(ScrnInfoPtr pScrn, int numColors, int *indicies, LOCO *colors, VisualPtr pVisual) @@ -349,227 +89,6 @@ unsigned int XG47DDCRead(ScrnInfoPtr pScrn) } -#ifndef NATIVE_MODE_SETTING -/** - * Save the initial screen mode when starting the X server - */ -void XG47ModeSave(ScrnInfoPtr pScrn, XGIRegPtr pXGIReg) -{ - XGIPtr pXGI = XGIPTR(pScrn); - CARD8 modeNo = IN3CFB(0x5C); - - /* 3cf:5c only stores 8-bits, but extended VESA modes can be 16-bits. - * If the mode is larger than the highest VGA mode, use a VESA call to - * get the full 16-bits of the current mode. - */ - if (modeNo > MAX_VGA_MODE_NO) { - pXGI->pInt10->ax = 0x4F03; - pXGI->pInt10->num = 0x10; - xf86ExecX86int10(pXGI->pInt10); - pXGI->isVGAMode = FALSE; - pXGI->textModeNo = pXGI->pInt10->bx; - } else { - pXGI->isVGAMode = TRUE; - pXGI->textModeNo = modeNo; - } - -} - -/** - * Restore the initial screen mode when exiting the X server - * - * \todo - * Determine if the VESA call could be used for the non-VGA and VGA case. - */ -void XG47ModeRestore(ScrnInfoPtr pScrn, XGIRegPtr pXGIReg) -{ - XGIPtr pXGI = XGIPTR(pScrn); - - /* Restore to single view */ - XGICloseSecondaryView(pXGI); - - /* Depending on whether the original mode was a VGA mode or an extended - * VESA mode, use the proper BIOS call to restore the mode. - */ - if (pXGI->isVGAMode) { - pXGI->pInt10->ax = pXGI->textModeNo; - pXGI->pInt10->num = 0x10; - xf86ExecX86int10(pXGI->pInt10); - } else { - pXGI->pInt10->ax = 0x4F02; - pXGI->pInt10->bx = pXGI->textModeNo; - pXGI->pInt10->num = 0x10; - xf86ExecX86int10(pXGI->pInt10); - } -} -#endif - -void XG47SetCRTCViewStride(ScrnInfoPtr pScrn) -{ - XGIPtr pXGI = XGIPTR(pScrn); - - /* display width * bytes-per-pixel / 8 */ - const unsigned stride = - (pScrn->displayWidth * (pScrn->bitsPerPixel >> 3)) >> 3; - - OUT3X5B(0x13, stride); - OUT3X5B(0x8B, (IN3X5B(0x8B) & 0xC0) | ((stride >> 8) & 0x3F)); -} - -#ifndef NATIVE_MODE_SETTING -void XG47SetCRTCViewBaseAddr(ScrnInfoPtr pScrn, unsigned long startAddr) -{ - XGIPtr pXGI = XGIPTR(pScrn); - - /* Set base address for CRTC - * - * It should be guaranteed that the base address is aligned with 32 (8 pixels x 4 bpp) bytes. - * so we needn't to set offset. - */ - - if (!pXGI->noAccel) pXGI->pXaaInfo->Sync(pScrn); - - startAddr >>= 2; - - OUT3X5B(0x0d, (CARD8)startAddr); - OUT3X5B(0x0c, (CARD8)(startAddr >> 0x08)); - OUT3X5B(0x8C, (CARD8)(startAddr >> 0x10)); - OUT3X5B(0x8D, (CARD8)(startAddr >> 0x18)); -} - -void XG47SetW2ViewStride(ScrnInfoPtr pScrn) -{ - XGIPtr pXGI = XGIPTR(pScrn); - unsigned long screenStride = 0; - - screenStride = (screenStride + 0x07) >> 4; - OUTB(0x248C, (CARD8)(screenStride)); - OUTB(0x248D, (CARD8)((INB(0x248D) & 0xF0) | ((screenStride >> 8) & 0xF))); -} - -void XG47SetW2ViewBaseAddr(ScrnInfoPtr pScrn, unsigned long startAddr) -{ - XGIPtr pXGI = XGIPTR(pScrn); - - /* Set Second View starting Address. */ - startAddr = (startAddr + 0x07) >> 4; - OUTB(0x2480, (CARD8)(startAddr & 0xFF)); - OUTB(0x2481, (CARD8)((startAddr >> 8) & 0xFF)); - OUTB(0x2482, (CARD8)((startAddr >> 16) & 0xFF)); - OUTB(0x2483, (CARD8)((INB(0x2483) & 0xFE) |((startAddr >> 24) & 0x1))); -} - - -static void fill_ask_mode(ScrnInfoPtr pScrn, DisplayModePtr dispMode, - XGIAskModeRec *askMode) -{ - XGIPtr pXGI = XGIPTR(pScrn); - CARD8 ConnectedDevices; - - askMode->width = dispMode->HDisplay; - askMode->height = dispMode->VDisplay; - askMode->pixelSize = pScrn->bitsPerPixel; - - switch (pXGI->displayDevice) { - case ST_DISP_LCD: - case ST_DISP_CRT: - case ST_DISP_TV: - case ST_DISP_DVI: - case ST_DISP_LCD_MV: - case ST_DISP_CRT_MV: - case ST_DISP_TV_MV: - case ST_DISP_DVI_MV: - askMode->condition = pXGI->displayDevice; - break; - default: - /* Use IN3X5B(0x5A) to check whether device is attached - * 0x22: single CRT - * 0x2e: DVI + CRT - * 0x2f: single DVI - * ... - * - * How about LCD ??? - */ - ConnectedDevices = IN3X5B(0x5A); - if (ConnectedDevices & 0x01) { - /* single DVI */ - askMode->condition = ST_DISP_DVI; - } else if ((ConnectedDevices & 0x0E) == 0x0E) { - /* DVI + CRT */ - askMode->condition = ST_DISP_CRT | ST_DISP_DVI; - } else if (ConnectedDevices & 0x02) { - /* single CRT */ - askMode->condition = ST_DISP_CRT; - } else if (ConnectedDevices & 0x10) { - /* TV : need to be verified more */ - askMode->condition = ST_DISP_TV; - } - - break; - } - - if (dispMode->VRefresh <= 0.0) { - dispMode->VRefresh = (dispMode->SynthClock * 1000.0) / - (dispMode->CrtcHTotal * dispMode->CrtcVTotal); - } - - if (((int)dispMode->VRefresh) >= 85) { - askMode->refRate = 85; - } else if (((int)dispMode->VRefresh) >= 75) { - askMode->refRate = 75; - } else { - askMode->refRate = 60; - } -} - - -Bool XG47ModeInit(ScrnInfoPtr pScrn, DisplayModePtr dispMode) -{ - XGIAskModeRec askMode[2]; - XGIPtr pXGI = XGIPTR(pScrn); - vgaHWPtr pVgaHW = VGAHWPTR(pScrn); - const int index = -#ifdef XGIDUALVIEW - (!g_DualViewMode || pXGI->FirstView) ? 0 : 1 -#else - 0 -#endif - ; - - askMode[0].modeNo = 0x00; - askMode[1].modeNo = 0x00; - - - vgaHWUnlock(pVgaHW); - - /* Initialise the ModeReg values */ - if (!vgaHWInit(pScrn, dispMode)) - return FALSE; - - - pScrn->vtSema = TRUE; - - - /* Use askMode[0] for single view or first view of dual view mode. - * Use askMode[1] for second view of dual view mode. - */ - fill_ask_mode(pScrn, dispMode, & askMode[index]); - if (!XGIBiosModeInit(pScrn, askMode, (g_DualViewMode != 0))) { - return FALSE; - } - - /* Fix bug of supporting different modes for each view of dual view mode - * don't set offset register when 2nd view. - */ - if (!g_DualViewMode || pXGI->FirstView) { - XG47SetCRTCViewStride(pScrn); - } - - return TRUE; -} -#endif - - /** * Validate a mode passed from the core X server. * @@ -578,32 +97,6 @@ Bool XG47ModeInit(ScrnInfoPtr pScrn, DisplayModePtr dispMode) int XG47ValidMode(ScrnInfoPtr pScrn, DisplayModePtr dispMode) { XGIPtr pXGI = XGIPTR(pScrn); -#ifndef NATIVE_MODE_SETTING - XGIAskModeRec askMode[2]; - ModeStatus status; - - - fill_ask_mode(pScrn, dispMode, & askMode[0]); - - /* Both askMode[0] and askMode[1] will be used in XG47BiosValidMode() - */ - status = pXGI->pBiosDll->biosValidMode(pScrn, askMode, 0); - if (status != MODE_OK) { - return status; - } - - /* judge the mode on LCD */ - if ((pXGI->displayDevice & ST_DISP_LCD) - || (IN3CFB(0x5B) & ST_DISP_LCD)) { - if ((pXGI->lcdWidth == 1600) && (dispMode->HDisplay == 1400)) { - return MODE_PANEL; - } - - if (dispMode->HDisplay > pXGI->lcdWidth) { - return MODE_PANEL; - } - } -#endif /* judge the mode on CRT, DVI */ if ((pXGI->displayDevice & ST_DISP_CRT) diff --git a/src/xg47_mode.h b/src/xg47_mode.h index 5c51a03..b8d3e26 100644 --- a/src/xg47_mode.h +++ b/src/xg47_mode.h @@ -45,11 +45,8 @@ extern void XG47SetW2ViewBaseAddr(ScrnInfoPtr pScrn, unsigned long startAddr); extern XGIModePtr XG47GetModeFromRes(unsigned width, unsigned height); -#ifdef NATIVE_MODE_SETTING extern void xg47_mode_save(ScrnInfoPtr pScrn, vgaRegPtr pVgaReg, XGIRegPtr pXGIReg); extern void XG47_mode_restore(ScrnInfoPtr pScrn, vgaRegPtr pVgaReg, XGIRegPtr pXGIReg); extern Bool XG47_NativeModeInit(ScrnInfoPtr pScrn, DisplayModePtr mode); -#endif /* NATIVE_MODE_SETTING */ - #endif diff --git a/src/xg47_native_mode.c b/src/xg47_native_mode.c index 8406b10..92c78dd 100644 --- a/src/xg47_native_mode.c +++ b/src/xg47_native_mode.c @@ -29,7 +29,6 @@ #include "xgi.h" -#ifdef NATIVE_MODE_SETTING #include "xgi_driver.h" #include "xgi_regs.h" #include "xgi_bios.h" @@ -542,4 +541,3 @@ void xg47_mode_save(ScrnInfoPtr pScrn, vgaRegPtr pVgaReg, XGIRegPtr regs) INB(0x3c6); regs->syndac_command = INB(0x3c6); } -#endif /* NATIVE_MODE_SETTING */ diff --git a/src/xg47_videohw.c b/src/xg47_videohw.c index 5d05abf..1daffef 100644 --- a/src/xg47_videohw.c +++ b/src/xg47_videohw.c @@ -1809,9 +1809,13 @@ void XG47PanningExpansionAdjust(ScrnInfoPtr pScrn, BoxPtr pDstBox) /* Expand dest rect too if expansion mode ON */ isPanelExpension = XG47IsExpansionMode(pScrn); +#if 0 panelSizeX = pXGI->lcdWidth; panelSizeY = pXGI->lcdHeight; - +#else + panelSizeX = 0; + panelSizeY = 0; +#endif panningX = modeSizeX = (CARD16) pScrn->currentMode->HDisplay; panningY = modeSizeY = (CARD16) pScrn->currentMode->VDisplay; @@ -362,20 +362,6 @@ typedef struct { CARD32 condition; } XGIAskModeRec, *XGIAskModePtr; -typedef ModeStatus (*FUN_XGIBiosValidMode)(ScrnInfoPtr, XGIAskModePtr, CARD32); -typedef Bool (*FUN_XGIBiosModeInit)(ScrnInfoPtr, XGIAskModePtr, CARD32); -typedef Bool (*FUN_XGIBiosSpecialFeature)(ScrnInfoPtr, unsigned long, - const unsigned long*); -typedef void (*FUN_XGIBiosValueInit)(ScrnInfoPtr); - -typedef struct { - unsigned long size; - FUN_XGIBiosValidMode biosValidMode; - FUN_XGIBiosModeInit biosModeInit; - FUN_XGIBiosSpecialFeature biosSpecialFeature; - FUN_XGIBiosValueInit biosValueInit; - unsigned long dtvType; -} XGIBiosDllRec, *XGIBiosDllPtr; /* * DTV_INFO : Data type for control the TVX @@ -397,14 +383,6 @@ typedef struct { CARD8 delta; /* Delta unit */ } XGIDigitalTVInfoRec, *XGIDigitalTVInfoPtr; -typedef struct { - CARD16 lcdType; - CARD16 lcdWidth; - CARD16 lcdHeight; - CARD16 lcdRefRate; - CARD8 lcdModeNo; -} XGILCDRec, *XGILCDPtr; - typedef enum { DISPHEAD_CRTC = 1, @@ -508,15 +486,6 @@ typedef struct { Bool dri_screen_open; - Bool isVGAMode; - CARD16 textModeNo; - - CARD32 biosCapability; - CARD32 biosDevSupport; - CARD32 biosOrgDevSupport; - CARD32 dtvInfo; - - CARD32 biosDllOperationFlag; CARD32 biosFbSize; /* bios report frame buffer size */ CARD32 freeFbSize; CARD16 maxBandwidth; @@ -543,23 +512,11 @@ typedef struct { Bool isNeedShadow; Bool isNeedStretch; - float memClock; int minClock; int maxClock; XGIDigitalTVInfoPtr pDtvInfo; - Bool lcdActive; - CARD16 lcdType; - CARD16 lcdWidth; - CARD16 lcdHeight; - CARD16 lcdRefRate; - CARD8 lcdModeNo; - - CARD16 digitalWidth; - CARD16 digitalHeight; - CARD8 digitalModeNo; - int currentClock; int rotate; float frequency; @@ -603,8 +560,6 @@ typedef struct { xf86Int10InfoPtr pInt10; vbeInfoPtr pVbe; - XGIBiosDllPtr pBiosDll; - XGIHeadID headID; XAAInfoRecPtr pXaaInfo; diff --git a/src/xgi_bios.c b/src/xgi_bios.c deleted file mode 100644 index d7d9994..0000000 --- a/src/xgi_bios.c +++ /dev/null @@ -1,965 +0,0 @@ -/*************************************************************************** - * 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 <assert.h> - -#include "xgi.h" -#include "xgi_regs.h" -#include "xgi_bios.h" -#include "xgi_mode.h" -#include "xg47_bios.h" -#include "xg47_mode.h" - -static void XGIBiosGetFramebufferSize(XGIPtr pXGI); - -extern XGIPixelClockRec XG47ModeVClockTable; -extern int XG47ModeVClockTableSize; -extern XGIPixelClockRec XG47ModeVClockTable2; -extern int XG47ModeVClockTableSize2; - -CARD8 vclk18; -CARD8 vclk19; -CARD8 vclk28; -CARD8 GR3CE_45; -CARD8 GR3CE_45_SingleView; - -/* - * from bios dll: Basefunc.c - */ -CARD16 XGIGetVClock_BandWidth(XGIPtr pXGI, - CARD16 xres, - CARD16 yres, - CARD16 depth, - CARD16 refRate, - CARD8 flag) -{ - XGIPixelClockPtr pPixelClk; - int i; - - if(flag & DEV_SUPPORT_LCD) - { - /* In reduced blanking mode, pixel clock is lower then normal. */ - if(pXGI->lcdWidth == 1280 && pXGI->lcdHeight == 600) - return(65); - else if(pXGI->lcdWidth == 1280 && pXGI->lcdHeight == 800) - return(71); - else if(pXGI->lcdWidth == 1400 && pXGI->lcdHeight == 1050) - return(108); - else if(pXGI->lcdWidth == 1440 && pXGI->lcdHeight == 900) - return(96); - else if(pXGI->lcdWidth == 1920 && pXGI->lcdHeight == 1200) - return(154); - } - - if ((((IN3CFB(0xB8) & 0x80) == 0x80) && ((IN3X5B(0x5A) & 0x03) == 0x03) - && (flag & DEV_SUPPORT_CRT)) - || (((IN3X5B(0x5A) & 0x0C) == 0x0c) && ((IN3CFB(0xB8) & 0x80) == 0x80) - && (flag & DEV_SUPPORT_DVI))) - { - /* - * if digital monitor && enabled reduced blank timing support - * we may need seperate flag of enable reduced blank timing - * support for two monitors. - */ - pPixelClk = &XG47ModeVClockTable2; - - for (i = 0; i < XG47ModeVClockTableSize2; i++) - { - if (pPixelClk[i].xres == xres - && pPixelClk[i].yres == yres - && pPixelClk[i].vref == refRate) - - return(pPixelClk[i].vclk); - } - } - - pPixelClk = &XG47ModeVClockTable; - for (i = 0; i < XG47ModeVClockTableSize; i++) - { - if (pPixelClk[i].xres == xres - && pPixelClk[i].yres == yres - && pPixelClk[i].vref == refRate) - - return(pPixelClk[i].vclk); - } - return 0; -} - -Bool XGICheckModeSupported(XGIPtr pXGI, - const XGIAskModeRec *pMode0, - const XGIAskModeRec *pMode1, - unsigned refRate) -{ - unsigned crtbw = 0; - unsigned w2bw = 0; - Bool flag = TRUE; - - - assert(pMode0 != NULL); - - if (pMode1 != NULL) { - if (pMode1->condition & DEV_SUPPORT_LCD) { - w2bw = XGIGetVClock_BandWidth(pXGI, - pXGI->lcdWidth, pXGI->lcdHeight, - pMode1->pixelSize, - pMode1->refRate, - ST_DISP_LCD); - - /* Enable interpolation if the panel does not support centering - * and the native resolution of the LCD, in either dimension, is - * larger than the resolution selected. - */ - pXGI->isInterpolation = - (((pMode1->condition & SUPPORT_PANEL_CENTERING) == 0) - && ((pXGI->lcdWidth > pMode1->width) - || (pXGI->lcdHeight > pMode1->height))); - } else { - /* DVI on W2 */ - w2bw = XGIGetVClock_BandWidth(pXGI, - pMode1->width, pMode1->height, - pMode1->pixelSize, - pMode1->refRate, - (pMode0->condition & 0x0F)); - } - - /* XG47 W2 can not support above 1920 modes with 32bits color under - * 250/250 275/275; only don't support 20x15x32 under 300/300. - */ - flag = (((pXGI->lcdWidth < 1920) && (pMode1->width < 1920)) - || (pMode1->pixelSize < 32)); - } - - crtbw = XGIGetVClock_BandWidth(pXGI, - pMode0->width, pMode0->height, - pMode0->pixelSize, refRate, - (pMode0->condition & 0x0F)) - * (pMode0->pixelSize / 8); - - if (!flag || ((crtbw == 0) && (w2bw == 0))) { - return FALSE; - } - - /* If there is sufficient bandwidth to drive both displays, we win. - */ - if ((crtbw + w2bw) < pXGI->maxBandwidth) { - return TRUE; - } - - /* Check bandwidth again with interpolation disabled on LCD display. */ - if (((crtbw+w2bw/2) < pXGI->maxBandwidth) - && (pMode1->condition & DEV_SUPPORT_LCD) && pXGI->isInterpolation) { - pXGI->isInterpolation = FALSE; - return TRUE; - } - - return FALSE; -} - -#ifndef NATIVE_MODE_SETTING -/* - * - */ -void XGIGetFlatPanelSize(XGIPtr pXGI) -{ - CARD8 index_save; - - pXGI->pInt10->ax = 0x120C; - pXGI->pInt10->bx = 0x0014; - pXGI->pInt10->num = 0x10; - xf86ExecX86int10(pXGI->pInt10); - - pXGI->lcdRefRate = (CARD16)XG47GetRefreshRateByIndex((CARD8)((pXGI->pInt10->cx>>8) & 0x0F)); - /*pXGI->lcdRefRate |= (pXGI->pInt10->cx & 0x0F00);*/ /* Used for BW Check later. */ - - pXGI->lcdWidth = pXGI->pInt10->bx; - pXGI->lcdHeight = pXGI->pInt10->dx; - - pXGI->lcdModeNo = XGIConvertResToModeNo(pXGI->lcdWidth, pXGI->lcdHeight); - - /* digital(single sync) display */ - - index_save = INB(XGI_REG_GRX); - OUTB(XGI_REG_GRX, 0x41); - switch (INB(XGI_REG_GRX+1) & 0xF0 >> 4) - { - case 1: - pXGI->digitalWidth = MONITOR_X640; - pXGI->digitalHeight = MONITOR_Y480; - break; - - case 2: - pXGI->digitalWidth = MONITOR_X800; - pXGI->digitalHeight = MONITOR_Y600; - break; - - case 3: - pXGI->digitalWidth = MONITOR_X1024; - pXGI->digitalHeight = MONITOR_Y768; - break; - - case 5: - pXGI->digitalWidth = MONITOR_X1280; - pXGI->digitalHeight = MONITOR_Y1024; - break; - - case 8: - pXGI->digitalWidth = MONITOR_X1600; - pXGI->digitalHeight = MONITOR_Y1200; - break; - } - - pXGI->digitalModeNo = XGIConvertResToModeNo(pXGI->digitalWidth, pXGI->digitalHeight); - OUTB(XGI_REG_GRX, index_save); -} - -void XGIGetFlatPanelType(XGIPtr pXGI) -{ - pXGI->lcdType = FPTYPE_TFT; -} - -void XGIBiosGetFramebufferSize(XGIPtr pXGI) -{ - pXGI->pInt10->ax = 0x1200; - pXGI->pInt10->bx = 0x0012; - pXGI->pInt10->num = 0x10; - xf86ExecX86int10(pXGI->pInt10); - - pXGI->biosFbSize = pXGI->pInt10->ax; - - if(pXGI->biosFbSize ==0) pXGI->biosFbSize = 1; - - pXGI->biosFbSize *= 0x100000; - - pXGI->freeFbSize = pXGI->biosFbSize; -} - -CARD8 XGIConvertResToModeNo(CARD16 width, CARD16 height) -{ - const XGIModeRec *const pMode = XG47GetModeFromRes(width, height); - - return (pMode == NULL) ? 0 : pMode->modeNo; -} - -void XGIWaitVerticalOnCRTC1(XGIPtr pXGI, CARD16 count) -{ - CARD16 i, loop; - - for(loop = 0; loop < count; loop++) - { - for(i=0; i < 0xffff; i++) - if (!((CARD8)INB(0x3DA) & 0x08)) break; - for(i=0; i < 0xffff; i++) - if ((CARD8)INB(0x3DA) & 0x08) break; - } -} - -void XGIWaitVerticalOnCRTC2(XGIPtr pXGI, CARD16 count) -{ - CARD16 i, loop; - - for(loop = 0; loop < count; loop++) - { - for(i = 0; i < 0xffff; i++) - { - OUTB(XGI_REG_SRX, 0xDC); - if (!(INB(XGI_REG_SRX+1) & 0x01)) break; - } - for(i = 0; i < 0xffff; i++) - { - OUTB(XGI_REG_SRX, 0xDC); - if (INB(XGI_REG_SRX+1) & 0x01) break; - } - } -} - -/* - * from bios dll: refresh.c - */ - -/* - * Check refresh rates supported by specified video mode. - * - * modeNo - BIOS mode number (See BIOS spec for definition) - * spec - Mode Specifier[15:8] (See BIOS spec: Set mode with refresh rate for definition) - * Return: - * refresh rates supported by specified video mode (See BIOS spec: Get refresh rate support for definition) - */ - -CARD16 XGIGetRefreshRateCapability(XGIPtr pXGI, CARD16 modeNo, CARD16 spec) -{ - CARD16 refRateCaps = 0; - - pXGI->pInt10->ax = 0x1201; - pXGI->pInt10->bx = (modeNo << 8) + 0x14; - pXGI->pInt10->cx = spec << 8; - pXGI->pInt10->num = 0x10; - xf86ExecX86int10(pXGI->pInt10); - - if ((pXGI->pInt10->ax & 0xFF00) == 0) - refRateCaps = pXGI->pInt10->bx; - - return refRateCaps; -} - -/* - * Check specified refresh rate index and support capability. - * - * Entry : refCaps, refresh rate support capability bits. - * refIndex, refresh rate index. - * Return: TRUE/FALSE. - */ -Bool XGICheckRefreshRateSupport(CARD16 refCaps, CARD8 refIndex) -{ - refIndex--; - refCaps >>= refIndex & 0x0F; - return (Bool)(refCaps & 0x0001); -} - -/* - * from bios dll: status.c - */ - -/* - * Get current display attributes. - * - * Entry : displayDevice - bit3~0: DVI/TV/CRT/LCD - * Bit - * [23:16] TV information - * [15:8] panel type and configuration - * [7:0] device type - * Return: - * current display attribute for specified device - * (See the definition of the condition member in ModeInformation structure) - */ -CARD32 XGIGetDisplayAttributes(XGIPtr pXGI, CARD32 displayDevice) -{ - CARD8 reg0; - - /* Check LCD additional information.*/ - if (displayDevice & DEV_SUPPORT_LCD) - { - /* Read LCD Type. */ - /* Jong 09/12/2006; XGI_REG_GRX is 0x03CE; 0x42 : TFT Panel Type Control */ - OUTB(XGI_REG_GRX, 0x42); - reg0 = (CARD8)INB(XGI_REG_GRX + 1); - if(reg0 & 0x80) - { - displayDevice &= ~ZVMX_ATTRIB_DSTN; - displayDevice |= ZVMX_ATTRIB_TFT; - } - else - { - displayDevice &= ~ZVMX_ATTRIB_TFT; - displayDevice |= ZVMX_ATTRIB_DSTN; - } - - /* Centering & Expension */ - /* Jong 09/12/2006; 0x5D : Miscellaneous register */ - OUTB(XGI_REG_GRX, 0x5D); - reg0 = (CARD8)INB(XGI_REG_GRX + 1); - if ((reg0 & GRAF_EXPANSION)) - { - displayDevice &= ~(ZVMX_ATTRIB_V_EXPANSION+ZVMX_ATTRIB_CENTERING); - displayDevice |= ZVMX_ATTRIB_EXPANSION; - } - else if (reg0 & GRAF_V_EXPANSION) - { - displayDevice &= ~(ZVMX_ATTRIB_EXPANSION+ZVMX_ATTRIB_CENTERING); - displayDevice |= ZVMX_ATTRIB_V_EXPANSION; - } - else - { - displayDevice &= ~(ZVMX_ATTRIB_V_EXPANSION+ZVMX_ATTRIB_EXPANSION); - displayDevice |= ZVMX_ATTRIB_CENTERING; - } - } - - /* Check TV additional information. */ - if (displayDevice & DEV_SUPPORT_TV) - { - /* Check TV overscan & underscan. */ - OUTB(XGI_REG_CRX, 0xC2); - reg0 = (CARD8)INB(XGI_REG_CRX + 1); - if ((reg0 & 0x01)) - { - displayDevice &= ~ZVMX_ATTRIB_UNDER; - displayDevice |= ZVMX_ATTRIB_OVER; - } - else - { - displayDevice &= ~ZVMX_ATTRIB_OVER; - displayDevice |= ZVMX_ATTRIB_UNDER; - } - - if ((reg0 & 0x10)) - { - displayDevice |= ZVMX_ATTRIB_NATIVE; - } - else - { - displayDevice &= ~ZVMX_ATTRIB_NATIVE; - } - - - /* Check TV PAL & NTSC. */ - OUTB(XGI_REG_CRX, 0xC0); - reg0 = (CARD8)INB(XGI_REG_CRX+1) & 0xE0; - if(reg0 == 0x80) - { - displayDevice &= ~ZVMX_ATTRIB_NTSC; /*PAL*/ - displayDevice &= ~ZVMX_ATTRIB_NTSCJ; - displayDevice |= ZVMX_ATTRIB_PAL; - displayDevice &= ~ZVMX_ATTRIB_PALM; - } - else if(reg0 == 0x40) - { - displayDevice &= ~ZVMX_ATTRIB_PAL; /*PAL_M*/ - displayDevice &= ~ZVMX_ATTRIB_NTSC; - displayDevice &= ~ZVMX_ATTRIB_NTSCJ; - displayDevice |= ZVMX_ATTRIB_PALM; - } - else if(reg0 == 0x20) - { - displayDevice &= ~ZVMX_ATTRIB_PAL; /*NTSC-J*/ - displayDevice &= ~ZVMX_ATTRIB_NTSC; - displayDevice |= ZVMX_ATTRIB_NTSCJ; - displayDevice &= ~ZVMX_ATTRIB_PALM; - } - else - { - displayDevice &= ~ZVMX_ATTRIB_PAL; /*NTSC*/ - displayDevice |= ZVMX_ATTRIB_NTSC; - displayDevice &= ~ZVMX_ATTRIB_NTSCJ; - displayDevice &= ~ZVMX_ATTRIB_PALM; - } - } - return displayDevice; -} - -/* - * Get current display attributes. - * - * Input: - * no - 0: return display attributes of all devices (TV/LCD/CRT/DVI) - * (Wu Yun: CRT/DVI currently does not have display attributes) - * no - 1: return display attributes of LCD device - * - * Return: - * current display attributes - * (See the definition of the condition member in ModeInformation structure) - * - */ -CARD32 XGIGetDisplayStatus(XGIPtr pXGI, CARD8 no) -{ - CARD8 reg0; - CARD32 displayDevice; - - if(no) - { - displayDevice = DEV_SUPPORT_LCD; - displayDevice |= XGIGetDisplayAttributes(pXGI, displayDevice); - } - else - { - /* Jong 09/12/2006; collect information of all devices */ - /* Call XGIGetDisplayAttributes() to fill device attributes defined in xgi_bios.h */ - displayDevice = 0x0000000F; - displayDevice |= XGIGetDisplayAttributes(pXGI, displayDevice); - - displayDevice &= 0x00FFFF00; - - /* Jong 09/14/2006; Working status register of device; CRT:0x02; DVI:0x08 */ - OUTB(XGI_REG_GRX, 0x5B); - reg0 = INB(XGI_REG_GRX+1); - - displayDevice |= (CARD32)(reg0 & 0x0F); - - /* Jong 09/14/2006; why? shitft to reserved bis */ - displayDevice |= (CARD32)(reg0 & 0xF0) << 20; - - /* Jong 09/14/2006; check if MHS (Multiple head support) */ - OUTB(XGI_REG_GRX, 0x36); - if(INB(XGI_REG_GRX+1) & 0x02) - { - /* Jong 09/14/2006; Extended/Standard set mode method*/ - displayDevice |= 0x80000000; - } - } - return displayDevice; -} - -/* - * Get support device status. - * - * Entry : NONE. - * Return: BIOS support display status. - * - * Hardware & BIOS support status - * 1:Support 0:Non-support - * DEVICE TV LCD DEVICE - * |--------'--------|--------'--------| - * |||||||| |||||||| |||||||| |||||||| - * |||||||| |||||||| |||||||| |||||||'- LCD. - * |||||||| |||||||| |||||||| ||||||'-- CRT. - * |||||||| |||||||| |||||||| |||||'--- TV. - * |||||||| |||||||| |||||||| ||||'---- DVI. - * |||||||| |||||||| |||||||| |||'----- - * |||||||| |||||||| |||||||| ||'------ - * |||||||| |||||||| |||||||| |'------- - * |||||||| |||||||| |||||||| '-------- - * |||||||| |||||||| |||||||'---------- - * |||||||| |||||||| ||||||'----------- - * |||||||| |||||||| |||||'------------ Expansion. - * |||||||| |||||||| ||||'------------- Centering. - * |||||||| |||||||| ''''-------------- - * |||||||| |||||||'------------------- NTSC. - * |||||||| ||||||'-------------------- PAL. - * |||||||| |||||'--------------------- underscan. - * |||||||| ||||'---------------------- overscan. - * |||||||| |||`----------------------- native mode. - * |||||||| ||`------------------------ TV chip is not available. - * |||||||| |`------------------------- Support PAL-M. - * |||||||| `-------------------------- Support NTSC-J. - * |||||||'---------------------------- LCD. - * ||||||'----------------------------- CRT. - * |||||'------------------------------ TV. - * ||||`------------------------------- DVI. - * ````-------------------------------- reserved. - * - * Current device(Primary/Secondary) status use same definition - */ -void XGIGetSetChipSupportDevice(XGIPtr pXGI, Bool reset_to_original) -{ - /* Jong 09/12/2006; XGI_REG_CRX is 0x03D4 */ - /* 0xC2 : TV Status flag 2 */ - OUTB(XGI_REG_CRX, 0xC2); - - if ((INB(XGI_REG_CRX+1)) & 0x40) /* Jong 09/12/2006; Yes */ - pXGI->biosDevSupport &= ~SUPPORT_CURRENT_NO_TV; - else - pXGI->biosDevSupport |= SUPPORT_CURRENT_NO_TV; - - if (reset_to_original) { - /* Reset orignal support. */ - pXGI->biosDevSupport = pXGI->biosOrgDevSupport; - } - - return; -} - -/* - * from bios dll: modeset.c - */ -CARD16 XGIGetColorIndex(CARD16 depth) -{ - switch(depth) - { - case 8: - return 0x02; - case 16: - return 0x06; - case 32: - return 0x08; - default: - return 0; - } -} - -/* - * from bios dll: biosdata.c - */ -Bool XGIReadBiosData(XGIPtr pXGI, CARD8 *array) -{ - pXGI->pInt10->ax = 0x1290; - pXGI->pInt10->bx = 0x0014; - pXGI->pInt10->dx = 0; - pXGI->pInt10->num = 0x10; - xf86ExecX86int10(pXGI->pInt10); - - /* If success, ah = 0 */ - if ((pXGI->pInt10->ax >> 8) || (pXGI->biosBase != NULL)) { - return FALSE; - } - - memcpy(array, (pXGI->biosBase + pXGI->pInt10->di), pXGI->pInt10->cx); - return TRUE; -} - -/* - * from bios dll: modeset.c - */ -void XGICloseSecondaryView(XGIPtr pXGI) -{ - CARD16 i; - - vAcquireRegIOProtect(pXGI); - - /* clear flag */ - /* Jong 09/20/2006; Working status register 1; 0xF0 is for MV */ - if (IN3CFB(0x5B) & 0xF0) - { - if (IN3CFB(0x5B) & (DEV_SUPPORT_DVI << 4)) - { - if (!(IN3X5B(SOFT_PAD59_INDEX) & 0x02)) - { - XG47CloseAllDevice(pXGI, DEV_SUPPORT_DVI); - - OUT3X5B(SOFT_PAD59_INDEX, IN3X5B(SOFT_PAD59_INDEX) & ~0x02); - } - - /* driving strength */ - OUTB(XGI_REG_GRX, 0x98); - OUTB(XGI_REG_GRX+1, 0x55); - OUTB(XGI_REG_GRX, 0x7B); - OUTB(XGI_REG_GRX+1, 0x55); - - /* disable internal TMDS */ - OUTB(XGI_REG_GRX, 0x3d); - OUTB(XGI_REG_GRX+1, INB(XGI_REG_GRX+1) & ~0x01); - /*OUTB(XGI_REG_GRX, 0x43);*/ - /*OUTB(XGI_REG_GRX+1, INB(XGI_REG_GRX+1) & ~0x08);*/ - OUTB(XGI_REG_GRX, 0x46); - OUTB(XGI_REG_GRX+1, (INB(XGI_REG_GRX+1) & ~0x38) | 0x08); - - /* TV VSync input buffer */ - OUTB(XGI_REG_CRX, 0xD6); - OUTB(XGI_REG_CRX+1, INB(XGI_REG_CRX+1) | 0x10); - - OUTB(XGI_REG_GRX, 0x2A); - OUTB(XGI_REG_GRX+1, INB(XGI_REG_GRX+1) & ~0x40); - - /* Turn back VCLK2 */ - OUTB(XGI_REG_SRX,0x1A); - OUTB(XGI_REG_SRX+1, vclk18); - OUTB(XGI_REG_SRX,0x1B); - OUTB(XGI_REG_SRX+1, vclk19); - OUTB(XGI_REG_SRX,0x28); - OUTB(XGI_REG_SRX+1, (INB(XGI_REG_SRX+1) & ~0x70) | vclk28); - - } - - if (IN3CFB(0x5B) & (DEV_SUPPORT_TV << 4)) - { - if (!(IN3X5B(SOFT_PAD59_INDEX) & 0x02)) - { - XG47CloseAllDevice(pXGI, DEV_SUPPORT_TV); - - OUTB(XGI_REG_CRX, SOFT_PAD59_INDEX); - OUTB(XGI_REG_CRX+1, INB(XGI_REG_CRX+1) & ~0x02); - } - OUTB(XGI_REG_CRX,0xD6); - OUTB(XGI_REG_CRX+1, INB(XGI_REG_CRX+1) & ~0x04); - } - - if (IN3CFB(0x5B) & (DEV_SUPPORT_CRT << 4)) - { - if (!(IN3X5B(SOFT_PAD59_INDEX) & 0x02)) - { - XG47CloseAllDevice(pXGI, DEV_SUPPORT_CRT); - - OUTB(XGI_REG_CRX, SOFT_PAD59_INDEX); - OUTB(XGI_REG_CRX+1, INB(XGI_REG_CRX+1) & ~0x02); - } - OUTB(XGI_REG_GRX,0x2C); - OUTB(XGI_REG_GRX+1, INB(XGI_REG_GRX+1) & ~0x40); - - /* Turn back VCLK2 */ - OUTB(XGI_REG_SRX,0x1a); - OUTB(XGI_REG_SRX+1, vclk18); - OUTB(XGI_REG_SRX,0x1b); - OUTB(XGI_REG_SRX+1, vclk19); - OUTB(XGI_REG_SRX,0x28); - OUTB(XGI_REG_SRX+1, INB(XGI_REG_SRX+1) & ~0x70 | vclk28); - } - - if (IN3CFB(0x5B) & (DEV_SUPPORT_LCD << 4)) - { - if (!(IN3X5B(SOFT_PAD59_INDEX) & 0x02)) - { - XG47CloseAllDevice(pXGI, DEV_SUPPORT_LCD); - - OUTB(XGI_REG_CRX, SOFT_PAD59_INDEX); - OUTB(XGI_REG_CRX+1, INB(XGI_REG_CRX+1) & ~0x02); - } - OUTB(XGI_REG_SRX,0xBE); - OUTB(XGI_REG_SRX+1, INB(XGI_REG_SRX+1) & ~0x08); - - /* Change LCD DE delay back for CRTC1 */ - OUTB(XGI_REG_GRX, 0x45); - OUTB((XGI_REG_GRX+1), (INB(XGI_REG_GRX+1) & ~0x07) | (GR3CE_45_SingleView & 0x07)); - } - - /* Enable dithering */ - OUTB(XGI_REG_GRX, 0x42); - OUTB(XGI_REG_GRX+1, INB(XGI_REG_GRX+1) | 0x08); - - OUTB(XGI_REG_SRX, 0xCE); - OUTB(XGI_REG_SRX+1, INB(XGI_REG_SRX+1) & ~0x02); - - /* Disable dual view */ - OUTB(XGI_REG_SRX, 0xDC); - for(i=0; i<0xFFFF; i++) - { - if ((INB(XGI_REG_SRX+1) & 0x01)) - break; - } - OUTB(XGI_REG_GRX, 0x81); - OUTB(XGI_REG_GRX+1, (int)INB(XGI_REG_GRX+1) & ~0x01); - - /* - * Please keep the order of below 2 I/O - *start to turn off video engine pixel clock - */ - OUTB(XGI_REG_CRX,0xBE); - OUTB(XGI_REG_CRX+1, INB(XGI_REG_CRX+1) & ~0x04); - - /* turn off video engine memory clock */ - OUTB(XGI_REG_GRX,0xDA); - OUTB(XGI_REG_GRX+1, (int)INB(XGI_REG_GRX+1) | 0x10); - /* end to turn off video engine pixel clock */ - - /* Turn off video engine clock for w2 */ - OUTB(XGI_REG_SRX,0x52); - OUTB(XGI_REG_SRX+1, INB(XGI_REG_SRX+1) & ~0x40); - - /* clear 2nd display */ - OUTB(XGI_REG_GRX, 0x5B); - OUTB(XGI_REG_GRX+1, (INB(XGI_REG_GRX+1) & 0x0f)); - - OUTB(0x24c2, (CARD16)INB(0x24c2) & ~0x20); - OUTB(0x24a9, (CARD16)INB(0x24a9) & ~0x0a); - OUTB(0x24a8, (CARD16)INB(0x24a8) & ~0x07); - } - - /* - * Zdu, 9/1/2000, Seems TSB machine did not wait LCD panel to be stabel to do - * further operation leading a hang when undocking switching device, now we added - * this wait and hang up disappeared. - */ - { - while(INB(0x3DA) & 0x8); - for(i=0; i < 0xffff; i++) - { - if(!(INB(0x3DA) & 0x8)) break; - } - while(INB(0x3DA) & 0x8); - for(i=0; i < 0xffff; i++) - { - if(!(INB(0x3DA) & 0x8)) break; - } - } -} -#endif - -/* - * from bios dll: initial.c - */ -unsigned XGIBiosCalculateClock(XGIPtr pXGI, unsigned low, unsigned high) -{ - const unsigned N = IN3C5B(low); - const unsigned tmp = IN3C5B(high); - const unsigned K = (tmp & 0xC0) >> 6; - const unsigned M = (tmp & 0x3F); - - return ((1431818 * (N + 8)) / ((M + 1) << K)) / 100000; -} - -#ifndef NATIVE_MODE_SETTING -/* - * below is bios call - */ -static Bool XGIBiosDllPunt(XGIPtr pXGI, unsigned long cmd, - const unsigned long *pInBuf) -{ - ScrnInfoPtr pScrn = pXGI->pScrn; - - if (pXGI->pBiosDll->biosSpecialFeature == NULL) { - return FALSE; - } - - return (*pXGI->pBiosDll->biosSpecialFeature)(pScrn, cmd, pInBuf); -} -#endif - -/* - * Init bios dll - */ -Bool XGIBiosDllInit(ScrnInfoPtr pScrn) -{ - XGIPtr pXGI = XGIPTR(pScrn); - CARD8 idxbak; - - (void) memset(pXGI->pBiosDll, 0, sizeof(*pXGI->pBiosDll)); - - switch (pXGI->chipset) { - case XG47: -#ifndef NATIVE_MODE_SETTING - pXGI->pBiosDll->biosValidMode = XG47BiosValidMode; - pXGI->pBiosDll->biosModeInit = XG47BiosModeInit; - pXGI->pBiosDll->biosSpecialFeature = XG47BiosSpecialFeature; - pXGI->pBiosDll->biosValueInit = XG47BiosValueInit; -#endif - - pXGI->lcdRefRate = 0x003C; /* 60Hz */ - - pXGI->lcdType = FPTYPE_UNKNOWN; - pXGI->lcdWidth = FPSIZE_UNKNOWN; - pXGI->lcdHeight = FPSIZE_UNKNOWN; - - pXGI->digitalWidth = FPSIZE_UNKNOWN; - pXGI->digitalHeight = FPSIZE_UNKNOWN; - - pXGI->biosDllOperationFlag = 0; - - XG47GetFramebufferSize(pXGI); - break; - default: -#ifndef NATIVE_MODE_SETTING - XGIBiosGetFramebufferSize(pXGI); -#endif - break; - } - - - /* check BIOS capability */ - pXGI->biosCapability = 0; - -#ifndef NATIVE_MODE_SETTING - pXGI->pInt10->ax = 0x1290; - pXGI->pInt10->bx = 0x0014; - pXGI->pInt10->dx = 0; - pXGI->pInt10->num = 0x10; - xf86ExecX86int10(pXGI->pInt10); - - pXGI->biosCapability = ((CARD32)pXGI->pInt10->bx << 16) | pXGI->pInt10->dx; - - - pXGI->pInt10->ax = 0x1280; - pXGI->pInt10->bx = 0x0014; - pXGI->pInt10->num = 0x10; - xf86ExecX86int10(pXGI->pInt10); - - pXGI->pInt10->bx &= 0x7FFF; /* Clear Master/Slave mode flag. */ - switch(pXGI->pInt10->bx) - { - case 0x0003: /* TV_TVX2 */ - pXGI->pBiosDll->dtvType = DTV_TVEXPRESS_XP4E; /* TV_TVX internal */ - pXGI->dtvInfo = TV_TVXI; - - XGI47BiosAttachDTV(pXGI); - break; - default: - pXGI->dtvInfo = 0xFFFFFFFF; - break; - } - - - /* - * Get display device - */ - XGIGetFlatPanelType(pXGI); - XGIGetFlatPanelSize(pXGI); - - XGIBiosValueInit(pXGI); -#else - pXGI->dtvInfo = 0xFFFFFFFF; -#endif - - return TRUE; -} - - -#ifndef NATIVE_MODE_SETTING -/* Jong 1109/2006; pMode[]->condition indicate which device needs to be open */ -Bool XGIBiosModeInit(ScrnInfoPtr pScrn, XGIAskModePtr pMode, Bool dualView) -{ - XGIPtr pXGI = XGIPTR(pScrn); - unsigned long devices; - Bool success; - ModeStatus status; - - - /* Ask BIOS if the mode is supported */ - status = (*pXGI->pBiosDll->biosValidMode)(pScrn, pMode, dualView); - if (status != MODE_OK) { - xf86DrvMsg(pXGI->pScrn->scrnIndex, X_ERROR, - "%s:%u: mode failed %d\n", __func__, __LINE__, status); - return FALSE; - } - - /* close all device before set mode */ - devices = 0xF; - XGIBiosCloseAllDevice(pXGI, &devices); - - if (!dualView) { - /* Single View mode. */ - success = (*pXGI->pBiosDll->biosModeInit)(pScrn, pMode, 0); - - /* Enable device pMode[0].condition: 0x02:CRT; 0x08:DVI - */ - devices = pMode[0].condition; - } else { - /* argument 3 : 1 means first view of dual view mode, 2 means - * second view of dual view mode. - */ - success = (*pXGI->pBiosDll->biosModeInit)(pScrn, pMode, - (pXGI->FirstView) ? 1 : 2); - } - - if (!success) { - return FALSE; - } - - XGIBiosOpenAllDevice(pXGI, &devices); - return TRUE; -} - -/* - * Used in Win2K driver for resuming from Hibernation/Standby, - */ -unsigned long XGIBiosValueInit(XGIPtr pXGI) -{ - ScrnInfoPtr pScrn = pXGI->pScrn; - if (pXGI->pBiosDll->biosValueInit) - (pXGI->pBiosDll->biosValueInit)(pScrn); - return TRUE; -} - -Bool XGIBiosCloseAllDevice(XGIPtr pXGI, unsigned long* pDevices) -{ - return XGIBiosDllPunt(pXGI, CLOSE_ALL_DEVICE, pDevices); -} - -Bool XGIBiosOpenAllDevice(XGIPtr pXGI, unsigned long* pDevices) -{ - return XGIBiosDllPunt(pXGI, OPEN_ALL_DEVICE, pDevices); -} -#endif diff --git a/src/xgi_bios.h b/src/xgi_bios.h index f935a17..91f2de2 100644 --- a/src/xgi_bios.h +++ b/src/xgi_bios.h @@ -372,56 +372,5 @@ typedef struct { #define NEED_3CF33_ON_DELAY 0x00000001 #define DEVICE_CLOSED 0x00000002 -/* xgi_bios.c */ -extern CARD16 XGIGetVClock_BandWidth(XGIPtr pXGI, - CARD16 xres, - CARD16 yres, - CARD16 depth, - CARD16 refRate, - CARD8 flag); - -extern Bool XGICheckModeSupported(XGIPtr pXGI, const XGIAskModeRec *pMode0, - const XGIAskModeRec *pMode1, unsigned refRate); - -extern void XGIGetFlatPanelSize(XGIPtr pXGI); -extern void XGIGetFlatPanelType(XGIPtr pXGI); -extern CARD8 XGIConvertResToModeNo(CARD16 width, - CARD16 height); - -extern void XGIWaitVerticalOnCRTC1(XGIPtr pXGI, CARD16 count); -extern void XGIWaitVerticalOnCRTC2(XGIPtr pXGI, CARD16 count); - -extern CARD16 XGIGetRefreshRateCapability(XGIPtr pXGI, - CARD16 modeNo, - CARD16 spec); - -extern Bool XGICheckRefreshRateSupport(CARD16 refCaps, - CARD8 refIndex); - -extern CARD32 XGIGetDisplayAttributes(XGIPtr pXGI, - CARD32 displayDevice); - -extern CARD32 XGIGetDisplayStatus(XGIPtr pXGI, CARD8 wno); -extern void XGIGetSetChipSupportDevice(XGIPtr pXGI, Bool reset_to_original); -extern CARD16 XGIGetColorIndex(CARD16 depth); - -extern Bool XGIReadBiosData(XGIPtr pXGI, CARD8 *array); - -extern unsigned XGIBiosCalculateClock(XGIPtr pXGI,unsigned low, - unsigned high); - -extern Bool XGIBiosDllInit(ScrnInfoPtr pScrn); - -extern Bool XGIBiosModeInit(ScrnInfoPtr pScrn, XGIAskModePtr pMode, - Bool dualView); - - -extern unsigned long XGIBiosValueInit(XGIPtr pXGI); -extern Bool XGIBiosCloseSecondView(XGIPtr pXGI); -extern Bool XGIBiosCloseAllDevice(XGIPtr pXGI, - unsigned long* pDevices); -extern Bool XGIBiosOpenAllDevice(XGIPtr pXGI, - unsigned long* pDevices); - #endif diff --git a/src/xgi_driver.c b/src/xgi_driver.c index 3d7cbb5..9292ef8 100644 --- a/src/xgi_driver.c +++ b/src/xgi_driver.c @@ -636,9 +636,6 @@ static XGIPtr XGIGetRec(ScrnInfoPtr pScrn) if (pScrn->driverPrivate == NULL) { XGIPtr pXGI = xnfcalloc(sizeof(XGIRec), 1); - /* Initialise it */ - pXGI->pBiosDll = xnfcalloc(sizeof(XGIBiosDllRec), 1); - pScrn->driverPrivate = pXGI; pXGI->pScrn = pScrn; } @@ -1027,13 +1024,6 @@ static Bool XGIPreInitInt10(ScrnInfoPtr pScrn) xf86LoaderReqSymLists(vbeSymbols, int10Symbols, NULL); -#ifndef NATIVE_MODE_SETTING - /* int10 is broken on some Alphas */ - pXGI->pVbe = VBEInit(NULL, pXGI->pEnt->index); - pXGI->pInt10 = pXGI->pVbe->pInt10; -#endif /* NATIVE_MODE_SETTING */ - - #if DBG_FLOW xf86DrvMsg(pScrn->scrnIndex, X_INFO, "-- Leave %s() %s:%d\n", __FUNCTION__, __FILE__, __LINE__); #endif @@ -1160,30 +1150,6 @@ static Bool XGIPreInitGamma(ScrnInfoPtr pScrn) } -static Bool XGIPreInitLcdSize(ScrnInfoPtr pScrn) -{ - XGIPtr pXGI = XGIPTR(pScrn); - - CARD16 lcdWidth = 0; - CARD16 lcdHeight = 0; - - pXGI->lcdActive = FALSE; - pXGI->lcdWidth = lcdWidth; - pXGI->lcdHeight = lcdHeight; - - /* get LCD size if display on LCD */ - if ((pXGI->displayDevice & ST_DISP_LCD) - || (IN3CFB(0x5B) & ST_DISP_LCD)) - { - XGIGetLcdSize(pScrn, &lcdWidth, &lcdHeight); - pXGI->lcdActive = TRUE; - pXGI->lcdWidth = lcdWidth; - pXGI->lcdHeight = lcdHeight; - } - - return TRUE; -} - /* This is called by XGIPreInit to validate modes * and compute parameters for all of the valid modes. */ @@ -1399,6 +1365,8 @@ static Bool XGIPreInitMemory(ScrnInfoPtr pScrn) MessageType from; + XG47GetFramebufferSize(pXGI); + /* Save offset of frame buffer for setting destination and source base in * acceleration functions. * @@ -1450,10 +1418,6 @@ static Bool XGIPreInitMemory(ScrnInfoPtr pScrn) xf86DrvMsg(pScrn->scrnIndex, from, "VideoRAM: %u KByte\n", pScrn->videoRam); - /* memory clock */ - pXGI->memClock = XGICalculateMemoryClock(pScrn); - xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "Memory Clock is %3.2f MHz\n", - pXGI->memClock); #if DBG_FLOW xf86DrvMsg(pScrn->scrnIndex, X_INFO, "-- Leave %s() %s:%d\n", __FUNCTION__, __FILE__, __LINE__); @@ -1733,7 +1697,6 @@ Bool XGIPreInit(ScrnInfoPtr pScrn, int flags) } if (!XGIPreInitInt10(pScrn)) goto fail; - if (!XGIBiosDllInit(pScrn)) goto fail; if (!XGIPreInitMemory(pScrn)) goto fail; /* pScrn->videoRam is determined by XGIPreInitMemory() */ @@ -1741,8 +1704,6 @@ Bool XGIPreInit(ScrnInfoPtr pScrn, int flags) if (!XGIMapFB(pScrn)) goto fail; - if (!XGIPreInitLcdSize(pScrn)) goto fail; - XGIPreInitDDC(pScrn); if (!XGIPreInitModes(pScrn)) goto fail; @@ -1871,14 +1832,7 @@ static void XGISave(ScrnInfoPtr pScrn) return; } -#ifndef NATIVE_MODE_SETTING - vgaHWSave(pScrn, pVgaReg, VGA_SR_MODE | VGA_SR_CMAP | - (IsPrimaryCard ? VGA_SR_FONTS : 0)); - - XGIModeSave(pScrn, pXGIReg); -#else xg47_mode_save(pScrn, pVgaReg, pXGIReg); -#endif #if DBG_FLOW xf86DrvMsg(pScrn->scrnIndex, X_INFO, "-- Leave %s() %s:%d\n", __FUNCTION__, __FILE__, __LINE__); @@ -1899,23 +1853,9 @@ static void XGIRestore(ScrnInfoPtr pScrn) { XGIPtr pXGI = XGIPTR(pScrn); XGIRegPtr pXGIReg = &pXGI->savedReg; - -#if DBG_FLOW - xf86DrvMsg(pScrn->scrnIndex, X_INFO, "++ Enter %s() %s:%d\n", __FUNCTION__, __FILE__, __LINE__); -#endif - -#ifndef NATIVE_MODE_SETTING - XGIModeRestore(pScrn, pXGIReg); -#else vgaRegPtr pVgaReg = &VGAHWPTR(pScrn)->SavedReg; xg47_mode_restore(pScrn, pVgaReg, pXGIReg); -#endif - -#if DBG_FLOW - xf86DrvMsg(pScrn->scrnIndex, X_INFO, "-- Leave %s() %s:%d\n", __FUNCTION__, __FILE__, __LINE__); -#endif - } Bool XGIFBManagerInit(ScreenPtr pScreen) @@ -2633,14 +2573,6 @@ static int XGIValidMode(int scrnIndex, DisplayModePtr mode, Bool verbose, int fl int ret; -#ifndef NATIVE_MODE_SETTING - if (!pXGI->pInt10) { - xf86DrvMsg(scrnIndex, X_ERROR, - "have not loaded int10 module successfully!\n"); - return MODE_ERROR; - } -#endif - ret = XG47ValidMode(pScrn, mode); /* This driver only uses the programmable clock mode. @@ -2666,18 +2598,7 @@ static Bool XGIModeInit(ScrnInfoPtr pScrn, DisplayModePtr mode) xf86DrvMsg(pScrn->scrnIndex, X_INFO, "++ Enter %s() %s:%d\n", __FUNCTION__, __FILE__, __LINE__); #endif - switch(pXGI->chipset) - { - case XG47: -#ifndef NATIVE_MODE_SETTING - ret = XG47ModeInit(pScrn, mode); -#else - ret = XG47_NativeModeInit(pScrn, mode); -#endif - break; - default: - break; - } + ret = XG47_NativeModeInit(pScrn, mode); #ifdef XGI_DUMP XGIDumpRegisterValue(pScrn); diff --git a/src/xgi_misc.c b/src/xgi_misc.c index bed66ca..f9a5e3c 100644 --- a/src/xgi_misc.c +++ b/src/xgi_misc.c @@ -36,35 +36,6 @@ #include "xgi_debug.h" -void XGIGetLcdSize(ScrnInfoPtr pScrn, CARD16 *lcdWidth, CARD16 *lcdHeight) -{ - XGIPtr pXGI = XGIPTR(pScrn); - - switch(pXGI->chipset) - { - case XG47: - default: - break; - } -} - -float XGICalculateMemoryClock(ScrnInfoPtr pScrn) -{ - XGIPtr pXGI = XGIPTR(pScrn); - float freq = 0.0; - - switch (pXGI->chipset) - { - case XG47: - freq = XGIBiosCalculateClock(pXGI, 0x1E, 0x1F); - break; - default: - break; - } - - return (freq); -} - #if 0 void XGIDumpRegisterValue(ScrnInfoPtr pScrn) { diff --git a/src/xgi_misc.h b/src/xgi_misc.h index 1b27e0b..bbd4806 100644 --- a/src/xgi_misc.h +++ b/src/xgi_misc.h @@ -29,8 +29,6 @@ #define _XGI_MISC_H_ /* xgi_misc.c */ -extern void XGIGetLcdSize(ScrnInfoPtr pScrn, CARD16 *lcdWidth, CARD16 *lcdHeight); -extern float XGICalculateMemoryClock(ScrnInfoPtr pScrn); extern void XGIDumpRegisterValue(ScrnInfoPtr pScrn); /* Jong 07/12/2006 */ diff --git a/src/xgi_mode.c b/src/xgi_mode.c index 689c807..f220e95 100644 --- a/src/xgi_mode.c +++ b/src/xgi_mode.c @@ -36,36 +36,6 @@ #include "xgi_mode.h" #include "xg47_mode.h" -#ifndef NATIVE_MODE_SETTING -void XGIModeSave(ScrnInfoPtr pScrn, XGIRegPtr pXGIReg) -{ - XGIPtr pXGI = XGIPTR(pScrn); - - switch (pXGI->chipset) - { - case XG47: - XG47ModeSave(pScrn, pXGIReg); - break; - default: - break; - } -} - -void XGIModeRestore(ScrnInfoPtr pScrn, XGIRegPtr pXGIReg) -{ - XGIPtr pXGI = XGIPTR(pScrn); - - switch (pXGI->chipset) - { - case XG47: - XG47ModeRestore(pScrn, pXGIReg); - break; - default: - break; - } -} -#endif - void XGILoadPalette(ScrnInfoPtr pScrn, int numColors, int *indicies, LOCO *colors, VisualPtr pVisual) { |