diff options
author | anholt <anholt> | 2003-08-27 00:59:01 +0000 |
---|---|---|
committer | anholt <anholt> | 2003-08-27 00:59:01 +0000 |
commit | 9ba8f9b5df3408efc828cce350ae41bc3a8b400f (patch) | |
tree | c19fc2c44ee4df22ff77b663eafefe228136165e /xc | |
parent | 34f950d7967b242c623dfbf443b64289072edf40 (diff) |
Merge from XFree86 CVS.
Diffstat (limited to 'xc')
16 files changed, 2173 insertions, 886 deletions
diff --git a/xc/programs/Xserver/hw/xfree86/drivers/sis/init.c b/xc/programs/Xserver/hw/xfree86/drivers/sis/init.c index a026af376..50dced605 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/sis/init.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/sis/init.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/init.c,v 1.13 2003/07/28 12:39:45 twini Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/init.c,v 1.15 2003/08/26 14:29:35 twini Exp $ */ /* * Mode switching code (CRT1 section) for * SiS 300/540/630/730/315/550/650/M650/651/M652/740/330/660/M660/760 @@ -80,8 +80,10 @@ BOOLEAN SiSSetMode(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, #pragma alloc_text(PAGE,SiSInit) #endif +#ifndef LINUX_XF86 static ULONG GetDRAMSize(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension); +#endif static void InitCommonPointer(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension) @@ -1801,18 +1803,19 @@ SiS_VerifyMclk(SiS_Private *SiS_Pr, ULONG FBAddr) } } -/* TW: Is this a 315E? */ +/* Is this a 315E? */ int Is315E(SiS_Private *SiS_Pr) { - USHORT data; - - data = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x5F); - if(data & 0x10) return 1; - else return 0; + if((HwDeviceExtension->jChipType == SIS_315H) || + (HwDeviceExtension->jChipType == SIS_315) || + (HwDeviceExtension->jChipType == SIS_315PRO)) { + if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x5F) & 0x10) return 1; + } + return 0; } -/* TW: For 315 only */ +/* For 315 only */ void SiS_SetDRAMSize_310(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension) { @@ -1820,15 +1823,6 @@ SiS_SetDRAMSize_310(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension) ULONG FBAddr = (ULONG)HwDeviceExtension->pjVideoMemoryAddress; USHORT data; -#ifdef SIS301 /* TW: SIS301 ??? */ - /*SiS_SetReg1(SiS_Pr->SiS_P3d4,0x30,0x40); */ -#endif -#ifdef SIS302 /* TW: SIS302 ??? */ - SiS_SetReg1(SiS_Pr->SiS_P3d4,0x30,0x4D); /* alan,should change value */ - SiS_SetReg1(SiS_Pr->SiS_P3d4,0x31,0xc0); /* alan,should change value */ - SiS_SetReg1(SiS_Pr->SiS_P3d4,0x34,0x3F); /* alan,should change value */ -#endif - SiSSetMode(SiS_Pr, HwDeviceExtension, 0x2e); data = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x21); @@ -1959,33 +1953,35 @@ void SiSRegInit(SiS_Private *SiS_Pr, USHORT BaseAddr) void SiSInitPCIetc(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension) { -/* #ifdef LINUX_XF86 */ - if ((HwDeviceExtension->jChipType == SIS_540)|| - (HwDeviceExtension->jChipType == SIS_630)|| - (HwDeviceExtension->jChipType == SIS_730)|| - (HwDeviceExtension->jChipType == SIS_300)) { - /* TW: Set - PCI LINEAR ADDRESSING ENABLE (0x80) - - PCI IO ENABLE (0x20) - - MMIO ENABLE (0x1) - */ - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x20,0xa1); - /* TW: Enable 2D (0x42) & 3D accelerator (0x18) */ - SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x1E,0xFF,0x5A); - } - if((HwDeviceExtension->jChipType == SIS_315H)|| - (HwDeviceExtension->jChipType == SIS_315) || - (HwDeviceExtension->jChipType == SIS_315PRO)|| - (HwDeviceExtension->jChipType == SIS_550) || - (HwDeviceExtension->jChipType == SIS_650) || - (HwDeviceExtension->jChipType == SIS_740) || - (HwDeviceExtension->jChipType == SIS_330) || - (HwDeviceExtension->jChipType == SIS_660) || - (HwDeviceExtension->jChipType == SIS_760)) { - /* TW: This seems to be done the same way on these chipsets */ + switch(HwDeviceExtension->jChipType) { + case SIS_300: + case SIS_540: + case SIS_630: + case SIS_730: + /* Set - PCI LINEAR ADDRESSING ENABLE (0x80) + * - PCI IO ENABLE (0x20) + * - MMIO ENABLE (0x1) + */ + SiS_SetReg1(SiS_Pr->SiS_P3c4,0x20,0xa1); + /* Enable 2D (0x42) & 3D accelerator (0x18) */ + SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x1E,0x5A); + break; + case SIS_315H: + case SIS_315: + case SIS_315PRO: + case SIS_650: + case SIS_740: + case SIS_330: + case SIS_660: + case SIS_760: + SiS_SetReg1(SiS_Pr->SiS_P3c4,0x20,0xa1); + SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x1E,0x5A); + break; + case SIS_550: SiS_SetReg1(SiS_Pr->SiS_P3c4,0x20,0xa1); - SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x1E,0xFF,0x5A); + /* No 3D engine ! */ + SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x1E,0x42); } -/* #endif */ } void @@ -2011,12 +2007,12 @@ SiSSetLVDSetc(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT } #endif + switch(HwDeviceExtension->jChipType) { #ifdef SIS300 - if((HwDeviceExtension->jChipType == SIS_540) || - (HwDeviceExtension->jChipType == SIS_630) || - (HwDeviceExtension->jChipType == SIS_730)) - { - /* TW: Check for SiS30x first */ + case SIS_540: + case SIS_630: + case SIS_730: + /* Check for SiS30x first */ temp = SiS_GetReg1(SiS_Pr->SiS_Part4Port,0x00); if((temp == 1) || (temp == 2)) return; temp = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x37); @@ -2024,62 +2020,58 @@ SiSSetLVDSetc(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT if((temp >= 2) && (temp <= 5)) SiS_Pr->SiS_IF_DEF_LVDS = 1; if(temp == 3) SiS_Pr->SiS_IF_DEF_TRUMPION = 1; if((temp == 4) || (temp == 5)) { - /* TW: Save power status (and error check) - UNUSED */ + /* Save power status (and error check) - UNUSED */ SiS_Pr->SiS_Backup70xx = SiS_GetCH700x(SiS_Pr, 0x0e); SiS_Pr->SiS_IF_DEF_CH70xx = 1; } - } + break; #endif #ifdef SIS315H - if((HwDeviceExtension->jChipType == SIS_550) || - (HwDeviceExtension->jChipType == SIS_650) || - (HwDeviceExtension->jChipType == SIS_740) || - (HwDeviceExtension->jChipType == SIS_330) || - (HwDeviceExtension->jChipType == SIS_660) || - (HwDeviceExtension->jChipType == SIS_760)) - { - /* TW: CR37 is different on 315 series */ -#if 0 - if(SiS_Pr->SiS_IF_DEF_FSTN) /* fstn: set CR37=0x04 */ - SiS_SetReg1(SiS_Pr->SiS_P3d4,0x37,0x04); /* (fake LVDS bridge) */ -#endif - + case SIS_550: + case SIS_650: + case SIS_740: + case SIS_330: + case SIS_660: + case SIS_760: temp=SiS_GetReg1(SiS_Pr->SiS_P3d4,0x37); temp = (temp & 0x0E) >> 1; if((temp >= 2) && (temp <= 3)) SiS_Pr->SiS_IF_DEF_LVDS = 1; - if(temp == 3) { - SiS_Pr->SiS_IF_DEF_CH70xx = 2; - } - - /* HiVision (HDTV) is done differently now. */ - /* SiS_Pr->SiS_IF_DEF_HiVision = 1; */ - } + if(temp == 3) SiS_Pr->SiS_IF_DEF_CH70xx = 2; + break; #endif + default: + break; + } } void SiSInitPtr(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension) { + switch(HwDeviceExtension->jChipType) { #ifdef SIS315H - if((HwDeviceExtension->jChipType == SIS_315H) || - (HwDeviceExtension->jChipType == SIS_315) || - (HwDeviceExtension->jChipType == SIS_315PRO) || - (HwDeviceExtension->jChipType == SIS_550) || - (HwDeviceExtension->jChipType == SIS_650) || - (HwDeviceExtension->jChipType == SIS_740) || - (HwDeviceExtension->jChipType == SIS_330) || - (HwDeviceExtension->jChipType == SIS_660) || - (HwDeviceExtension->jChipType == SIS_760)) - InitTo310Pointer(SiS_Pr, HwDeviceExtension); + case SIS_315H: + case SIS_315: + case SIS_315PRO: + case SIS_550: + case SIS_650: + case SIS_740: + case SIS_330: + case SIS_660: + case SIS_760: + InitTo310Pointer(SiS_Pr, HwDeviceExtension); + break; #endif - #ifdef SIS300 - if ((HwDeviceExtension->jChipType == SIS_540) || - (HwDeviceExtension->jChipType == SIS_630) || - (HwDeviceExtension->jChipType == SIS_730) || - (HwDeviceExtension->jChipType == SIS_300)) - InitTo300Pointer(SiS_Pr, HwDeviceExtension); + case SIS_300: + case SIS_540: + case SIS_630: + case SIS_730: + InitTo300Pointer(SiS_Pr, HwDeviceExtension); + break; #endif + default: + break; + } } void @@ -2641,9 +2633,11 @@ SiSSetMode(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT Mod SiS_SetHiVision(SiS_Pr,BaseAddr,HwDeviceExtension); SiS_GetLCDResInfo(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,HwDeviceExtension); - /* 3. Check memory size */ +#ifndef LINUX_XF86 + /* 3. Check memory size (Kernel framebuffer driver only) */ temp = SiS_CheckMemorySize(SiS_Pr,ROMAddr,HwDeviceExtension,ModeNo,ModeIdIndex); if(!temp) return(0); +#endif if(HwDeviceExtension->jChipType >= SIS_315H) { if(SiS_GetReg1(SiS_Pr->SiS_P3c4,0x17) & 0x08) { @@ -3098,6 +3092,7 @@ SiS_SearchVBModeID(SiS_Private *SiS_Pr, UCHAR *ROMAddr, USHORT *ModeNo) return ((BOOLEAN)ModeIdIndex); } +#ifndef LINUX_XF86 BOOLEAN SiS_CheckMemorySize(SiS_Private *SiS_Pr, UCHAR *ROMAddr,PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT ModeNo,USHORT ModeIdIndex) @@ -3125,6 +3120,7 @@ SiS_CheckMemorySize(SiS_Private *SiS_Pr, UCHAR *ROMAddr,PSIS_HW_DEVICE_INFO HwDe if(temp < memorysize) return(FALSE); else return(TRUE); } +#endif UCHAR SiS_GetModePtr(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex) @@ -4150,6 +4146,7 @@ SiS_WriteDAC(SiS_Private *SiS_Pr, USHORT DACData, USHORT shiftflag, SiS_SetReg3(DACData,(USHORT)bl); } +#ifndef LINUX_XF86 static ULONG GetDRAMSize(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension) { @@ -4158,11 +4155,11 @@ GetDRAMSize(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension) USHORT counter; #endif + switch(HwDeviceExtension->jChipType) { #ifdef SIS315H - if ((HwDeviceExtension->jChipType == SIS_315H) || - (HwDeviceExtension->jChipType == SIS_315) || - (HwDeviceExtension->jChipType == SIS_315PRO)) { - + case SIS_315H: + case SIS_315: + case SIS_315PRO: counter = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x14); AdapterMemorySize = 1 << ((counter & 0xF0) >> 4); counter >>= 2; @@ -4173,9 +4170,9 @@ GetDRAMSize(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension) AdapterMemorySize <<= 1; /* SINGLE_CHANNEL_2_RANK or DUAL_CHANNEL_1_RANK */ } AdapterMemorySize *= (1024*1024); + break; - } else if(HwDeviceExtension->jChipType == SIS_330) { - + case SIS_330: counter = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x14); AdapterMemorySize = 1 << ((counter & 0xF0) >> 4); counter &= 0x0c; @@ -4183,35 +4180,37 @@ GetDRAMSize(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension) AdapterMemorySize <<= 1; } AdapterMemorySize *= (1024*1024); + break; - } else if((HwDeviceExtension->jChipType == SIS_550) || - (HwDeviceExtension->jChipType == SIS_740) || - (HwDeviceExtension->jChipType == SIS_650) || - (HwDeviceExtension->jChipType == SIS_660) || - (HwDeviceExtension->jChipType == SIS_760)) { - + case SIS_550: + case SIS_650: + case SIS_740: + case SIS_660: + case SIS_760: counter = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x14) & 0x3F; counter++; AdapterMemorySize = counter * 4; AdapterMemorySize *= (1024*1024); - } + break; #endif #ifdef SIS300 - if ((HwDeviceExtension->jChipType==SIS_300) || - (HwDeviceExtension->jChipType==SIS_540) || - (HwDeviceExtension->jChipType==SIS_630) || - (HwDeviceExtension->jChipType==SIS_730)) { - + case SIS_300: + case SIS_540: + case SIS_630: + case SIS_730: AdapterMemorySize = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x14) & 0x3F; AdapterMemorySize++; AdapterMemorySize *= (1024*1024); - - } + break; #endif + default: + break; + } return AdapterMemorySize; } +#endif #ifndef LINUX_XF86 void @@ -4540,46 +4539,6 @@ SiS_DoCalcDelay(SiS_Private *SiS_Pr, USHORT MCLK, USHORT VCLK, USHORT colordepth return((USHORT)longtemp); } -#if 0 /* TW: Old fragment, unused */ -USHORT -SiS_CalcDelay(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT key) -{ - USHORT data,data2,temp0,temp1; - UCHAR ThLowA[]= {61,3,52,5,68,7,100,11, - 43,3,42,5,54,7, 78,11, - 34,3,37,5,47,7, 67,11}; - - UCHAR ThLowB[]= {81,4,72,6,88,8,120,12, - 55,4,54,6,66,8, 90,12, - 42,4,45,6,55,8, 75,12}; - - UCHAR ThTiming[]= {1,2,2,3,0,1,1,2}; - - data=SiS_GetReg1(SiS_Pr->SiS_P3c4,0x16); - data=data>>6; - data2=SiS_GetReg1(SiS_Pr->SiS_P3c4,0x14); - data2=(data2>>4)&0x0C; - data=data|data2; - data=data<1; - if(key==0) { - temp0=(USHORT)ThLowA[data]; - temp1=(USHORT)ThLowA[data+1]; - } else { - temp0=(USHORT)ThLowB[data]; - temp1=(USHORT)ThLowB[data+1]; - } - - data2=0; - data=SiS_GetReg1(SiS_Pr->SiS_P3c4,0x18); - if(data&0x02) data2=data2|0x01; - if(data&0x20) data2=data2|0x02; - if(data&0x40) data2=data2|0x04; - - data=temp1*ThTiming[data2]+temp0; - return(data); -} -#endif - void SiS_SetCRT1FIFO_630(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo, PSIS_HW_DEVICE_INFO HwDeviceExtension, diff --git a/xc/programs/Xserver/hw/xfree86/drivers/sis/init.h b/xc/programs/Xserver/hw/xfree86/drivers/sis/init.h index c340c2534..a3587487b 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/sis/init.h +++ b/xc/programs/Xserver/hw/xfree86/drivers/sis/init.h @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/init.h,v 1.15 2003/08/07 12:52:22 twini Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/init.h,v 1.17 2003/08/26 14:29:35 twini Exp $ */ /* * Data and prototypes for init.c * @@ -2182,6 +2182,7 @@ typedef struct _SiS_PlasmaTables USHORT vendor; UCHAR productnum; USHORT product[5]; + const char *DDCnames[5]; const char *plasmaname; UCHAR modenum; UCHAR plasmamodes[20]; /* | 0x80 = DVI-capable, | 0x40 = analog */ @@ -2289,13 +2290,17 @@ static const SiS_PlasmaTables SiS_PlasmaTable[] = { #if 0 /* Product IDs missing */ { 0x38a3, 4, { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, + { "", "", "", "", "" }, "NEC PlasmaSync 42VP4/42VP4D/42VP4G/42VP4DG", - 14, /* All DVI, except 0, 7, 13; 3, 15, 16 unknown */ - { 0|0x40, 1|0xc0, 2|0xc0, 3|0xc0, 4|0xc0, 7|0x40, 9|0xc0,10|0xc0,11|0xc0,12|0xc0, - 13|0x40,14|0xc0,15|0xc0,16|0xc0, 0 , 0 , 0 , 0 , 0 , 0 } + 11, /* All DVI, except 0, 7, 13 */ + { 0|0x40, 1|0xc0, 2|0xc0, 4|0xc0, 7|0x40, 9|0xc0,10|0xc0,11|0xc0,13|0x40,14|0xc0, + 17|0xc0, 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 } }, +#endif +#if 0 /* Product IDs missing */ { 0x38a3, 3, { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, + { "", "", "", "", "" }, "NEC PlasmaSync 42PD1/50PD1/50PD2", 5, /* DVI entirely unknown */ { 0|0x40, 1|0xc0, 2|0xc0, 4|0xc0, 9|0xc0, 0 , 0 , 0 , 0 , 0 , @@ -2303,6 +2308,7 @@ static const SiS_PlasmaTables SiS_PlasmaTable[] = { }, { 0x38a3, 1, { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, + { "", "", "", "", "" }, "NEC PlasmaSync 42PD3", 10, /* DVI entirely unknown */ { 0|0x40, 1|0xc0, 2|0xc0, 3|0xc0, 4|0xc0, 5|0xc0, 6|0xc0, 7|0x40, 8|0xc0, 9|0xc0, @@ -2310,6 +2316,7 @@ static const SiS_PlasmaTables SiS_PlasmaTable[] = { }, { 0x38a3, 2, { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, + { "", "", "", "", "" }, "NEC PlasmaSync 42VM3/61XM1", 11, /* DVI entirely unknown */ { 0|0x40, 1|0xc0, 2|0xc0, 3|0xc0, 4|0xc0, 5|0xc0, 6|0xc0, 8|0xc0, 9|0xc0,11|0xc0, @@ -2317,6 +2324,7 @@ static const SiS_PlasmaTables SiS_PlasmaTable[] = { }, { 0x38a3, 2, { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, + { "", "", "", "", "" }, "NEC PlasmaSync 42MP1/42MP2", 6, /* DVI entirely unknown */ { 0|0x40, 1|0xc0, 2|0xc0, 4|0xc0, 9|0xc0,11|0xc0, 0 , 0 , 0 , 0 , @@ -2324,6 +2332,7 @@ static const SiS_PlasmaTables SiS_PlasmaTable[] = { }, { 0x38a3, 1, { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, + { "", "", "", "", "" }, "NEC PlasmaSync 50MP1", 10, /* DVI entirely unknown */ { 0|0x40, 1|0xc0, 2|0xc0, 4|0xc0, 7|0x40, 9|0xc0,10|0xc0,11|0xc0,13|0x40,14|0xc0, @@ -2332,6 +2341,7 @@ static const SiS_PlasmaTables SiS_PlasmaTable[] = { #endif { 0x38a3, 4, { 0xa482, 0xa483, 0x0000, 0x0000, 0x0000 }, + { "PX-42VM", "", "", "", "" }, "NEC PlasmaSync 42MP3/42MP4/50MP2/61MP1", 11, /* All DVI except 0, 7, 13, 17 */ { 0|0x40, 1|0xc0, 2|0xc0, 4|0xc0, 7|0x40, 9|0xc0,10|0xc0,11|0xc0,13|0x40,14|0xc0, @@ -2340,6 +2350,7 @@ static const SiS_PlasmaTables SiS_PlasmaTable[] = { #if 0 /* Product IDs missing */ { 0x38a3, 1, { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, + { "", "", "", "", "" }, "NEC PlasmaSync 3300W", 3, { 0|0x40, 1|0xc0,18|0xc0, 0 , 0 , 0 , 0 , 0 , 0 , 0 , @@ -2347,6 +2358,7 @@ static const SiS_PlasmaTables SiS_PlasmaTable[] = { }, { 0x38a3, 1, { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, + { "", "", "", "", "" }, "NEC PlasmaSync 4200W", 4, /* DVI entirely unknown */ { 0|0x40, 1|0xc0, 2|0xc0, 4|0xc0, 0 , 0 , 0 , 0 , 0 , 0 , @@ -2354,6 +2366,7 @@ static const SiS_PlasmaTables SiS_PlasmaTable[] = { }, { 0x38a3, 1, { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, + { "", "", "", "", "" }, "NEC PlasmaSync 4210W", 6, /* DVI entirely unknown */ { 0|0x40, 1|0xc0, 2|0xc0, 4|0xc0, 9|0xc0,11|0xc0, 0 , 0 , 0 , 0 , @@ -2361,6 +2374,7 @@ static const SiS_PlasmaTables SiS_PlasmaTable[] = { }, { 0x38a3, 1, { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, + { "", "", "", "", "" }, "NEC PlasmaSync 5000W", 7, /* DVI entirely unknown */ { 0|0x40, 1|0xc0, 2|0xc0, 4|0xc0, 7|0x40, 9|0xc0,11|0xc0, 0 , 0 , 0 , @@ -2369,6 +2383,7 @@ static const SiS_PlasmaTables SiS_PlasmaTable[] = { #endif { 0x412f, 2, { 0x000c, 0x000b, 0x0000, 0x0000, 0x0000 }, + { "", "", "", "", "" }, "Pioneer 503CMX/PDA-5002", 6, /* DVI unknown */ { 1|0xc0, 2|0xc0, 9|0xc0,11|0xc0,12|0xc0,15|0xc0, 0 , 0 , 0 , 0 , @@ -2376,6 +2391,7 @@ static const SiS_PlasmaTables SiS_PlasmaTable[] = { }, { 0x34a9, 1, { 0xa00e, 0x0000, 0x0000, 0x0000, 0x0000 }, + { "", "", "", "", "" }, "Panasonic TH-42", 5, /* No DVI output */ { 1|0x40, 2|0x40, 4|0x40, 9|0x40,15|0x40, 0 , 0 , 0 , 0 , 0 , @@ -2437,8 +2453,10 @@ void SiS_SetEnableDstn(SiS_Private *SiS_Pr, int enable); void SiS_SetEnableFstn(SiS_Private *SiS_Pr, int enable); void SiS_Delay15us(SiS_Private *SiS_Pr); BOOLEAN SiS_SearchModeID(SiS_Private *SiS_Pr, UCHAR *ROMAddr, USHORT *ModeNo,USHORT *ModeIdIndex); +#ifndef LINUX_XF86 BOOLEAN SiS_CheckMemorySize(SiS_Private *SiS_Pr, UCHAR *ROMAddr,PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT ModeNo,USHORT ModeIdIndex); +#endif UCHAR SiS_GetModePtr(SiS_Private *SiS_Pr, UCHAR *ROMAddr, USHORT ModeNo,USHORT ModeIdIndex); void SiS_WhatTheHellIsThis(SiS_Private *SiS_Pr,PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT BaseAddr); void SiS_StrangeStuff(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension); diff --git a/xc/programs/Xserver/hw/xfree86/drivers/sis/init301.c b/xc/programs/Xserver/hw/xfree86/drivers/sis/init301.c index 2c245fc46..e9ffc557d 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/sis/init301.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/sis/init301.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/init301.c,v 1.22 2003/08/07 15:04:41 twini Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/init301.c,v 1.23 2003/08/26 14:29:35 twini Exp $ */ /* * Mode switching code (CRT2 section) * for SiS 300/305/540/630/730/315/550/650/M650/651/740/330/660/M660/760/M760 @@ -107,7 +107,7 @@ SiS_SetCRT2Group(SiS_Private *SiS_Pr, USHORT BaseAddr,UCHAR *ROMAddr,USHORT Mode ((SiS_Pr->SiS_VBType & VB_NoLCD) && (SiS_Pr->SiS_VBInfo & SetCRT2ToLCD)) || ((HwDeviceExtension->jChipType >= SIS_315H) && (SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV)) ) { SiS_GetLVDSDesData(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,RefreshRateTableIndex, - HwDeviceExtension); + HwDeviceExtension, BaseAddr); } else { SiS_Pr->SiS_LCDHDES = SiS_Pr->SiS_LCDVDES = 0; } @@ -2699,8 +2699,8 @@ SiS_GetMCLK(SiS_Private *SiS_Pr, UCHAR *ROMAddr, PSIS_HW_DEVICE_INFO HwDeviceExt /* Checked against 650/LVDS 1.10.07 BIOS */ void SiS_GetLVDSDesData(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex, - USHORT RefreshRateTableIndex, - PSIS_HW_DEVICE_INFO HwDeviceExtension) + USHORT RefreshRateTableIndex, PSIS_HW_DEVICE_INFO HwDeviceExtension, + USHORT BaseAddr) { USHORT modeflag; USHORT PanelIndex,ResIndex; @@ -2718,7 +2718,7 @@ SiS_GetLVDSDesData(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT Mode #ifdef SIS315H SiS_GetLVDSDesPtrA(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,RefreshRateTableIndex, - &PanelIndex,&ResIndex); + &PanelIndex,&ResIndex, HwDeviceExtension, BaseAddr); switch (PanelIndex) { @@ -2883,7 +2883,8 @@ SiS_GetLVDSDesPtr(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeI #ifdef SIS315H void SiS_GetLVDSDesPtrA(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex, - USHORT RefreshRateTableIndex,USHORT *PanelIndex,USHORT *ResIndex) + USHORT RefreshRateTableIndex,USHORT *PanelIndex,USHORT *ResIndex, + PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr) { USHORT tempbx=0,tempal; @@ -2895,7 +2896,7 @@ SiS_GetLVDSDesPtrA(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT Mode if(SiS_Pr->SiS_CustomT == CUT_CLEVO1024) { if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) { - if((SiS_GetReg1(SiS_Pr->SiS_P3d4,0x39) & 0x04)) { + if(SiS_IsDualLink(SiS_Pr, HwDeviceExtension, BaseAddr)) { tempbx = 80; if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) tempbx++; } @@ -3101,7 +3102,7 @@ SiS_SetCRT2ModeRegs(SiS_Private *SiS_Pr, USHORT BaseAddr, USHORT ModeNo, USHORT /* For 302LV dual-channel */ if(HwDeviceExtension->jChipType >= SIS_315H) { if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) { - if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x39) & 0x04) + if(SiS_IsDualLink(SiS_Pr, HwDeviceExtension, BaseAddr)) tempah |= 0x40; } } @@ -4108,7 +4109,8 @@ SiS_GetCRT2PtrA(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdI void SiS_GetCRT2Part2Ptr(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex, USHORT RefreshRateTableIndex,USHORT *CRT2Index, - USHORT *ResIndex,PSIS_HW_DEVICE_INFO HwDeviceExtension) + USHORT *ResIndex,PSIS_HW_DEVICE_INFO HwDeviceExtension, + USHORT BaseAddr) { USHORT tempbx,tempal; @@ -4131,7 +4133,7 @@ SiS_GetCRT2Part2Ptr(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT Mod } } else if(SiS_Pr->SiS_CustomT == CUT_CLEVO1024) { if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) { - if((SiS_GetReg1(SiS_Pr->SiS_P3d4,0x39) & 0x04)) { + if(SiS_IsDualLink(SiS_Pr, HwDeviceExtension, BaseAddr)) { tempbx = 103; if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) tempbx = 104; else if(SiS_Pr->SiS_SetFlag & LCDVESATiming) tempbx = 105; @@ -6501,6 +6503,20 @@ SiS_IsVAMode(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT } else #endif return(0); +} + +BOOLEAN +SiS_IsDualLink(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr) +{ +#ifdef SIS315H + if(HwDeviceExtension->jChipType >= SIS_315H) { + if((SiS_CRT2IsLCD(SiS_Pr, BaseAddr, HwDeviceExtension)) || + (SiS_IsVAMode(SiS_Pr, HwDeviceExtension, BaseAddr))) { + if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x39) & 0x04) return(1); + } + } +#endif + return(0); } BOOLEAN @@ -6628,16 +6644,6 @@ SiS_IsLCDOrLCDA(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHO } BOOLEAN -SiS_IsDisableCRT2(SiS_Private *SiS_Pr, USHORT BaseAddr) -{ - USHORT flag; - - flag = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x30); - if(flag & 0x20) return(0); - else return(1); -} - -BOOLEAN SiS_BridgeIsOn(SiS_Private *SiS_Pr, USHORT BaseAddr,PSIS_HW_DEVICE_INFO HwDeviceExtension) { USHORT flag; @@ -6732,6 +6738,14 @@ SiS_GetLCDResInfo(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo, } } +#ifdef SIS315H + if(HwDeviceExtension->jChipType >= SIS_315H) { + if(SiS_Pr->SiS_IF_DEF_LVDS == 0) { + SiS_SetRegAND(SiS_Pr->SiS_P3d4,0x39,~0x04); + } + } +#endif + if(!(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA))) return; if(!(SiS_Pr->SiS_VBInfo & (SetSimuScanMode | SwitchToCRT2))) return; @@ -6935,26 +6949,22 @@ SiS_GetLCDResInfo(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo, } #ifdef SIS315H - /* 650/30xLV 1.10.6s */ if(HwDeviceExtension->jChipType >= SIS_315H) { - if(SiS_Pr->SiS_IF_DEF_LVDS == 0) { - SiS_SetRegAND(SiS_Pr->SiS_P3d4,0x39,~0x04); - if(SiS_Pr->SiS_VBType & (VB_SIS302B | VB_SIS302LV)) { - /* Enable 302B/302LV dual link mode. - * (302B is a theory - not in any BIOS) - */ - if(SiS_Pr->SiS_CustomT == CUT_CLEVO1024) { - if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) { - /* (Sets this in SenseLCD; new paneltypes) */ - SiS_SetRegOR(SiS_Pr->SiS_P3d4,0x39,0x04); - } - } - if((SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) || - (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) || - (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200)) { + if(SiS_Pr->SiS_VBType & (VB_SIS302B | VB_SIS302LV)) { + /* Enable 302B/302LV dual link mode. + * (302B is a theory - not in any BIOS) + */ + if(SiS_Pr->SiS_CustomT == CUT_CLEVO1024) { + if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) { + /* (Sets this in SenseLCD; new paneltypes) */ SiS_SetRegOR(SiS_Pr->SiS_P3d4,0x39,0x04); } } + if((SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) || + (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) || + (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200)) { + SiS_SetRegOR(SiS_Pr->SiS_P3d4,0x39,0x04); + } } } #endif @@ -7440,10 +7450,8 @@ SiS_SetGroup2(SiS_Private *SiS_Pr, USHORT BaseAddr,UCHAR *ROMAddr, USHORT ModeNo tempcx = SiS_Pr->SiS_HT; /* 650/30xLV 1.10.6s */ - if(HwDeviceExtension->jChipType >= SIS_315H) { - if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x39) & 0x04) { - tempcx >>= 1; - } + if(SiS_IsDualLink(SiS_Pr, HwDeviceExtension, BaseAddr)) { + tempcx >>= 1; } tempcx--; @@ -7760,10 +7768,7 @@ SiS_SetGroup2(SiS_Private *SiS_Pr, USHORT BaseAddr,UCHAR *ROMAddr, USHORT ModeNo /* From here: Part2 LCD setup */ tempbx = SiS_Pr->SiS_HDE; - if(HwDeviceExtension->jChipType >= SIS_315H) { - /* 650/30xLV 1.10.6s */ - if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x39) & 0x04) tempbx >>= 1; - } + if(SiS_IsDualLink(SiS_Pr, HwDeviceExtension, BaseAddr)) tempbx >>= 1; tempbx--; /* RHACTE=HDE-1 */ temp = tempbx & 0x00FF; SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x2C,temp); @@ -7865,7 +7870,7 @@ SiS_SetGroup2(SiS_Private *SiS_Pr, USHORT BaseAddr,UCHAR *ROMAddr, USHORT ModeNo */ SiS_GetCRT2Part2Ptr(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,RefreshRateTableIndex, - &CRT2Index,&resindex,HwDeviceExtension); + &CRT2Index,&resindex,HwDeviceExtension,BaseAddr); switch(CRT2Index) { case Panel_1024x768 : CRT2Part2Ptr = SiS_Pr->SiS_CRT2Part2_1024x768_1; break; /* "Normal" */ @@ -8350,7 +8355,7 @@ SiS_SetGroup4(SiS_Private *SiS_Pr, USHORT BaseAddr,UCHAR *ROMAddr,USHORT ModeNo if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) { /* From 650/301LV (any, incl. 1.10.6s, 1.10.7w) */ /* This is a duplicate; done at the end, too */ - if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x39) & 0x04) { + if(SiS_IsDualLink(SiS_Pr, HwDeviceExtension, BaseAddr)) { SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x27,0x2c); } SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x2a,0x00); @@ -8414,9 +8419,8 @@ SiS_SetGroup4(SiS_Private *SiS_Pr, USHORT BaseAddr,UCHAR *ROMAddr,USHORT ModeNo temp = 0; if(SiS_Pr->SiS_VGAHDE == 1024) temp = 0x20; } - if(HwDeviceExtension->jChipType >= SIS_315H) { - if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x39) & 0x04) temp = 0; - } + + if(SiS_IsDualLink(SiS_Pr, HwDeviceExtension, BaseAddr)) temp = 0; if(SiS_Pr->SiS_VBType & VB_SIS301) { if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel1280x1024) @@ -8467,7 +8471,7 @@ SiS_SetGroup4(SiS_Private *SiS_Pr, USHORT BaseAddr,UCHAR *ROMAddr,USHORT ModeNo if(modeflag & HalfDCLK) tempax >>= 1; if((SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) || (SiS_Pr->SiS_HiVision & 0x03)) { if(HwDeviceExtension->jChipType >= SIS_315H) { - if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x39) & 0x04) tempax >>= 1; + if(SiS_IsDualLink(SiS_Pr, HwDeviceExtension, BaseAddr)) tempax >>= 1; else if(tempax > 800) tempax -= 800; } else { if(tempax > 800) tempax -= 800; @@ -8522,9 +8526,7 @@ SiS_SetGroup4(SiS_Private *SiS_Pr, USHORT BaseAddr,UCHAR *ROMAddr,USHORT ModeNo SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x1F,0xC0,temp); tempbx = SiS_Pr->SiS_HT; - if(HwDeviceExtension->jChipType >= SIS_315H) { - if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x39) & 0x04) tempbx >>= 1; - } + if(SiS_IsDualLink(SiS_Pr, HwDeviceExtension, BaseAddr)) tempbx >>= 1; tempbx >>= 1; tempbx -= 2; temp = ((tempbx & 0x0700) >> 8) << 3; @@ -8544,7 +8546,7 @@ SiS_SetGroup4(SiS_Private *SiS_Pr, USHORT BaseAddr,UCHAR *ROMAddr,USHORT ModeNo /* 315, 330, 650+301B BIOS don't do this at all */ /* This is a duplicate; done for LCDA as well (see above) */ if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) { - if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x39) & 0x04) { + if(SiS_IsDualLink(SiS_Pr, HwDeviceExtension, BaseAddr)) { SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x27,0x2c); } SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x2a,0x00); @@ -11835,6 +11837,24 @@ SiS_FinalizeLCD(SiS_Private *SiS_Pr, USHORT BaseAddr,UCHAR *ROMAddr,USHORT ModeN } } + if(SiS_Pr->SiS_CustomT == CUT_CLEVO10242) { + if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) { + if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) { /* Maybe all panels? */ + SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x24,0xfc,0x01); + if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) { + tempch = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x36) >> 4; + if(tempch == 3) { + SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x18,0x02); + SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1b,0x25); + SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1c,0x00); + SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1d,0x1b); + } + } + return; + } + } + } + if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) { if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) { SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x2a,0x00); diff --git a/xc/programs/Xserver/hw/xfree86/drivers/sis/init301.h b/xc/programs/Xserver/hw/xfree86/drivers/sis/init301.h index 55fe52ff2..b5d0c8375 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/sis/init301.h +++ b/xc/programs/Xserver/hw/xfree86/drivers/sis/init301.h @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/init301.h,v 1.17 2003/07/28 12:39:46 twini Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/init301.h,v 1.19 2003/08/26 14:29:36 twini Exp $ */ /* * Data and prototypes for init301.c * @@ -124,9 +124,9 @@ extern BOOLEAN SiS_SearchVBModeID(SiS_Private *SiS_Pr, UCHAR *RomAddr, USHORT BOOLEAN SiS_Is301B(SiS_Private *SiS_Pr, USHORT BaseAddr); BOOLEAN SiS_IsNotM650or651(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr); -BOOLEAN SiS_IsDisableCRT2(SiS_Private *SiS_Pr, USHORT BaseAddr); BOOLEAN SiS_IsVAMode(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr); BOOLEAN SiS_IsDualEdge(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr); +BOOLEAN SiS_IsDualLink(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr); BOOLEAN SiS_CRT2IsLCD(SiS_Private *SiS_Pr, USHORT BaseAddr, PSIS_HW_DEVICE_INFO HwDeviceExtension); void SiS_SetDefCRT2ExtRegs(SiS_Private *SiS_Pr, USHORT BaseAddr); USHORT SiS_GetRatePtrCRT2(SiS_Private *SiS_Pr, UCHAR *ROMAddr, USHORT ModeNo,USHORT ModeIdIndex, @@ -144,7 +144,7 @@ void SiS_GetCRT2PtrA(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHOR #endif void SiS_GetCRT2Part2Ptr(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex, USHORT RefreshRateTableIndex,USHORT *CRT2Index, USHORT *ResIndex, - PSIS_HW_DEVICE_INFO HwDeviceExtension); + PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr); void SiS_GetCRT2Data301(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex, USHORT RefreshRateTableIndex,PSIS_HW_DEVICE_INFO HwDeviceExtension); USHORT SiS_GetResInfo(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex); @@ -159,7 +159,8 @@ void SiS_SetCRT2ModeRegs(SiS_Private *SiS_Pr, USHORT BaseAddr,USHORT ModeNo, PSIS_HW_DEVICE_INFO ); void SiS_SetHiVision(SiS_Private *SiS_Pr, USHORT BaseAddr,PSIS_HW_DEVICE_INFO HwDeviceExtension); void SiS_GetLVDSDesData(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex, - USHORT RefreshRateTableIndex,PSIS_HW_DEVICE_INFO HwDeviceExtension); + USHORT RefreshRateTableIndex,PSIS_HW_DEVICE_INFO HwDeviceExtension, + USHORT BaseAddr); void SiS_SetCRT2Offset(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex, USHORT RefreshRateTableIndex,PSIS_HW_DEVICE_INFO HwDeviceExtension); USHORT SiS_GetOffset(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex, @@ -210,9 +211,10 @@ void SiS_SetCRT2ECLK(SiS_Private *SiS_Pr, UCHAR *ROMAddr, USHORT ModeNo,USHO void SiS_GetLVDSDesPtr(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex, USHORT RefreshRateTableIndex,USHORT *PanelIndex,USHORT *ResIndex, PSIS_HW_DEVICE_INFO HwDeviceExtension); -#ifdef SIS315H +#ifdef SIS315H void SiS_GetLVDSDesPtrA(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex, - USHORT RefreshRateTableIndex,USHORT *PanelIndex,USHORT *ResIndex); + USHORT RefreshRateTableIndex,USHORT *PanelIndex,USHORT *ResIndex, + PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr); #endif void SiS_SetTPData(SiS_Private *SiS_Pr); void SiS_SetChrontelGPIO(SiS_Private *SiS_Pr, USHORT myvbinfo); diff --git a/xc/programs/Xserver/hw/xfree86/drivers/sis/initdef.h b/xc/programs/Xserver/hw/xfree86/drivers/sis/initdef.h index 285e4e4ba..8f1744b5b 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/sis/initdef.h +++ b/xc/programs/Xserver/hw/xfree86/drivers/sis/initdef.h @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/initdef.h,v 1.15 2003/06/26 22:35:17 twini Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/initdef.h,v 1.16 2003/08/23 10:25:18 twini Exp $ */ /* * Global definitions for init.c and init301.c * @@ -54,13 +54,16 @@ #define VB_SIS301B302B (VB_SIS301B|VB_SIS302B) #define VB_SIS301LV302LV (VB_SIS301LV|VB_SIS302LV) -#define IS_SIS650 (HwDeviceExtension->jChipType == SIS_650) -#define IS_SIS740 (HwDeviceExtension->jChipType == SIS_740) #define IS_SIS330 (HwDeviceExtension->jChipType == SIS_330) #define IS_SIS550 (HwDeviceExtension->jChipType == SIS_550) +#define IS_SIS650 (HwDeviceExtension->jChipType == SIS_650) +#define IS_SIS740 (HwDeviceExtension->jChipType == SIS_740) #define IS_SIS651 (SiS_Pr->SiS_SysFlags & (SF_Is651 | SF_Is652)) #define IS_SISM650 (SiS_Pr->SiS_SysFlags & (SF_IsM650 | SF_IsM652 | SF_IsM653)) +#define IS_SIS661 (SiS_Pr->SiS_SysFlags & (SF_Is661 | SF_IsM651)) +#define IS_SIS741 (SiS_Pr->SiS_SysFlags & SF_IsM741) #define IS_SIS65x (IS_SIS651 || IS_SISM650) +#define IS_SIS661741 (SiS_Pr->SiS_SysFlags & (SF_Is661 | SF_IsM661 | SF_Is741)) #define IS_SIS660 (HwDeviceExtension->jChipType == SIS_660) #define IS_SIS760 (HwDeviceExtension->jChipType == SIS_760) #define IS_SIS650660 (IS_SIS650 || IS_SIS660) @@ -160,6 +163,9 @@ #define SF_Is652 0x0004 #define SF_IsM652 0x0008 #define SF_IsM653 0x0010 +#define SF_Is661 0x0020 +#define SF_IsM661 0x0040 +#define SF_Is741 0x0080 #define SF_Is660 0x8000 #define PanelRGB18Bit 0x0100 diff --git a/xc/programs/Xserver/hw/xfree86/drivers/sis/sis.h b/xc/programs/Xserver/hw/xfree86/drivers/sis/sis.h index 00aed5b4c..850f4eb56 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/sis/sis.h +++ b/xc/programs/Xserver/hw/xfree86/drivers/sis/sis.h @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/sis.h,v 1.42 2003/08/10 21:25:37 twini Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/sis.h,v 1.47 2003/08/26 16:38:01 twini Exp $ */ /* * Main global data and definitions * @@ -36,7 +36,7 @@ #define SISDRIVERVERSIONYEAR 3 #define SISDRIVERVERSIONMONTH 8 -#define SISDRIVERVERSIONDAY 10 +#define SISDRIVERVERSIONDAY 26 #define SISDRIVERREVISION 1 #define SISDRIVERIVERSION (SISDRIVERVERSIONYEAR << 16) | (SISDRIVERVERSIONMONTH << 8) \ @@ -115,6 +115,12 @@ typedef unsigned long IOADDRESS; #endif #endif +#if 1 +#define SISVRAMQ /* Use VRAM queue mode on 315 series */ +#endif + +#undef SIS315DRI /* define this if dri is adapted for 315/330 series */ + /* For SiS315/550/650/740/330/660 - these should be moved elsewhere! */ #ifndef PCI_CHIP_SIS315H #define PCI_CHIP_SIS315H 0x0310 @@ -135,7 +141,7 @@ typedef unsigned long IOADDRESS; #define PCI_CHIP_SIS330 0x0330 #endif #ifndef PCI_CHIP_SIS660 -#define PCI_CHIP_SIS660 0x6330 /* 660_VGA and 760_VGA */ +#define PCI_CHIP_SIS660 0x6330 /* 660_VGA and 760_VGA (obviously DOA) */ #endif #define SIS_NAME "SIS" @@ -267,6 +273,9 @@ typedef unsigned long IOADDRESS; #define PDEBUG(p) #endif +#define BITMASK(h,l) (((unsigned)(1U << ((h)-(l)+1))-1)<<(l)) +#define GENMASK(mask) BITMASK(1?mask,0?mask) + typedef unsigned long ULong; typedef unsigned short UShort; typedef unsigned char UChar; @@ -305,9 +314,14 @@ typedef unsigned char UChar; #define SiSCF_IsM652 0x00000008 #define SiSCF_IsM653 0x00000010 #define SiSCF_Is652 0x00000020 -#define SiSCF_Is65x (SiSCF_Is651 | SiSCF_IsM650 | SiSCF_IsM652 | SiSCF_IsM653 | SiSCF_Is652) -#define SiSCF_IsM660 0x00000100 -#define SiSCF_IsM760 0x00000200 +#define SiSCF_Is661FX 0x00000040 +#define SiSCF_IsM661FX 0x00000080 +#define SiSCF_Is661 (SiSCF_Is661FX | SiSCF_IsM661FX) +#define SiSCF_Is741 0x00000100 +#define SiSCF_Is65x (SiSCF_Is651|SiSCF_IsM650|SiSCF_IsM652|SiSCF_IsM653| \ + SiSCF_Is652|SiSCF_Is661FX|SiSCF_IsM661FX|SiSCF_Is741) +#define SiSCF_IsM660 0x00000200 +#define SiSCF_IsM760 0x00000400 #define SiSCF_Is66x (SiSCF_IsM660 | SiSCF_IsM760) #define SiSCF_XabreCore 0x00010000 #define SiSCF_Glamour3 0x40000000 @@ -387,6 +401,23 @@ typedef struct { ScrnInfoPtr pScrn_2; unsigned char * BIOS; SiS_Private * SiS_Pr; + unsigned long agpHandle; + CARD32 agpAddr; + unsigned char *agpBase; + unsigned int agpSize; + CARD32 agpCmdBufAddr; /* 300 series */ + unsigned char *agpCmdBufBase; + unsigned int agpCmdBufSize; + unsigned int agpCmdBufFree; + CARD32 agpVtxBufAddr; /* 315 series */ + unsigned char *agpVtxBufBase; + unsigned int agpVtxBufSize; + unsigned int agpVtxBufFree; +#ifdef XF86DRI + sisRegion agp; + int drmSubFD; +#endif + Bool AGPInitOK; int CRT1ModeNo; /* Current display mode for CRT1 */ DisplayModePtr CRT1DMode; /* Current display mode for CRT1 */ int CRT2ModeNo; /* Current display mode for CRT2 */ @@ -459,6 +490,7 @@ typedef struct { int UsePanelScaler; int AllowHotkey; BOOLEAN enablesisctrl; + unsigned long cmdQ_SharedWritePort_2D; #ifdef SIS_CP SIS_CP_H_ENT #endif @@ -563,6 +595,8 @@ typedef struct { CARD32 AccelFlags; Bool ClipEnabled; Bool DoColorExpand; + Bool ColorExpandBusy; + Bool alphaBlitBusy; SISRegRec SavedReg; SISRegRec ModeReg; xf86CursorInfoPtr CursorInfoPtr; @@ -583,19 +617,43 @@ typedef struct { void (*LoadCRT2Palette)(ScrnInfoPtr pScrn, int numColors, int *indicies, LOCO *colors, VisualPtr pVisual); - int cmdQueueLen; /* Current cmdQueueLength (for 2D and 3D) */ - int *cmdQueueLenPtr; + int cmdQueueLen; /* Current cmdQueueLength (for 2D and 3D) */ + unsigned long cmdQueueLenMax; + unsigned long cmdQueueLenMin; + unsigned long *cmdQueueBase; + int *cmdQueueLenPtr; /* Ptr to variable holding the current queue length */ + int *cmdQueueLenPtrBackup; /* Backup for DRI init/restore */ + unsigned int cmdQueueOffset; + unsigned int cmdQueueSize; + unsigned long cmdQueueSizeMask; + unsigned long cmdQ_SharedWritePort_2D; + unsigned long *cmdQ_SharedWritePort; + unsigned long *cmdQ_SharedWritePortBackup; + unsigned int cmdQueueSize_div2; + unsigned int cmdQueueSize_div4; + unsigned int cmdQueueSize_4_3; unsigned long agpHandle; CARD32 agpAddr; unsigned char *agpBase; unsigned int agpSize; - CARD32 agpCmdBufAddr; + CARD32 agpCmdBufAddr; /* 300 series */ unsigned char *agpCmdBufBase; unsigned int agpCmdBufSize; unsigned int agpCmdBufFree; + CARD32 agpVtxBufAddr; /* 315 series */ + unsigned char *agpVtxBufBase; + unsigned int agpVtxBufSize; + unsigned int agpVtxBufFree; +#ifdef XF86DRI + sisRegion agp; +#endif + Bool AGPInitOK; Bool irqEnabled; int irq; + void (*RenderCallback)(ScrnInfoPtr); + Time RenderTime; + int ColorExpandRingHead; int ColorExpandRingTail; int PerColorExpandBufferSize; @@ -603,6 +661,7 @@ typedef struct { int ColorExpandBufferCountMask; unsigned char *ColorExpandBufferAddr[32]; int ColorExpandBufferScreenOffset[32]; + long ColorExpandBase; int ImageWriteBufferSize; unsigned char *ImageWriteBufferAddr; @@ -699,6 +758,7 @@ typedef struct { int sis6326yfilterstrong; int sis6326tvplug; int sis6326fscadjust; + BOOL sisfbfound; BOOL donttrustpdc; /* Don't trust the detected PDC */ unsigned char sisfbpdc; unsigned char sisfblcda; diff --git a/xc/programs/Xserver/hw/xfree86/drivers/sis/sis300_accel.h b/xc/programs/Xserver/hw/xfree86/drivers/sis/sis300_accel.h index 308da24b7..3cc5a6607 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/sis/sis300_accel.h +++ b/xc/programs/Xserver/hw/xfree86/drivers/sis/sis300_accel.h @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/sis300_accel.h,v 1.12 2003/06/28 14:03:13 twini Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/sis300_accel.h,v 1.13 2003/08/23 10:25:19 twini Exp $ */ /* * 2D Acceleration for SiS300, SiS540, SiS630, SiS730, SiS530, SiS620 * Definitions for the SIS engine communication @@ -103,9 +103,11 @@ */ -/* TW: BR(16)+2 = 0x8242 */ +/* BR(16)+2 = 0x8242 */ -#define CmdQueLen pSiS->cmdQueueLen +/* As sis_dri.c relocated the cmd-q len to the sarea, don't use it directly here */ +/* #define CmdQueLen pSiS->cmdQueueLen */ +#define CmdQueLen (*(pSiS->cmdQueueLenPtr)) #define SiSIdle \ { \ diff --git a/xc/programs/Xserver/hw/xfree86/drivers/sis/sis310_accel.c b/xc/programs/Xserver/hw/xfree86/drivers/sis/sis310_accel.c index 566a1740a..a3b6e68ca 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/sis/sis310_accel.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/sis/sis310_accel.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/sis310_accel.c,v 1.9 2003/08/07 12:52:23 twini Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/sis310_accel.c,v 1.12 2003/08/26 16:38:01 twini Exp $ */ /* * 2D Acceleration for SiS 315 and Xabre series * (315/550/650/740/M650/651/652/M652/330/660/M660/760/M760) @@ -24,6 +24,7 @@ * PERFORMANCE OF THIS SOFTWARE. * * Based on sis300_accel.c + * 2003/08/18: Rewritten for using VRAM command queue (TW) * * Author: Thomas Winischhofer <thomas@winischhofer.net> * @@ -49,28 +50,35 @@ #define HEADOFFSET (pSiS->dhmOffset) #endif -#undef TRAP /* Use/Don't use Trapezoid Fills - * DOES NOT WORK. XAA eventually provides illegal - * trapezoid data (left and right edges cross each +#undef TRAP /* Use/Don't use Trapezoid Fills + * DOES NOT WORK. XAA sometimes provides illegal + * trapezoid data (left and right edges cross each * other) which causes drawing errors. Since * checking the trapezoid for such a case is very * time-intensive, it is faster to let it be done * by the generic polygon functions. + * Does not work on XABRE at all, hangs the engine. + * Even with correct trapezoids, this is slower than + * doing it by the CPU. */ -#define CTSCE /* Use/Don't use CPUToScreenColorExpand. Slower than the - * CPU sometimes, so we disable this on SiS650/740 where - * we know that we're running on a P4. +#undef CTSCE /* Use/Don't use CPUToScreenColorExpand. Disabled + * because it is slower than doing it by the CPU. + * Indirect mode does not work in VRAM queue mode. + * Does not work on Xabre (even in MMIO mode). + */ +#define CTSCE_DIRECT /* Use direct method - This works (on both 315 and Xabre at + * least in VRAM queue mode) but we don't use this either, + * because it's slower than doing it by the CPU. (Using it + * would require defining CTSCE) + */ + +#undef STSCE /* Use/Don't use ScreenToScreenColorExpand - does not work, + * see comments below. */ -#undef INCL_RENDER /* Use/Don't use RENDER extension acceleration - * DOES NOT WORK. The hardware does not support - * ARGB textures, but Alpha Blended BitBlits with - * a static alpha value only. This is completely - * useless as XFree does not provide any environment - * for such a function. The code is kept regardless - * as XFree 5 might support translucent windows where - * this function could make sense. +#undef INCL_RENDER /* Use/Don't use RENDER extension acceleration + * Should work, but how do I test this? */ #ifdef INCL_RENDER @@ -123,7 +131,23 @@ static void SiSSubsequentMonoPatternFillTrap(ScrnInfoPtr pScrn, int left, int dxL, int dyL, int eL, int right, int dxR, int dyR, int eR); #endif +#ifdef STSCE +static void SiSSetupForScreenToScreenColorExpand(ScrnInfoPtr pScrn, + int fg, int bg, + int rop, unsigned int planemask); +static void SiSSubsequentScreenToScreenColorExpand(ScrnInfoPtr pScrn, + int x, int y, int w, int h, + int srcx, int srcy, int skipleft); +#endif #ifdef CTSCE +#ifdef CTSCE_DIRECT +static void SiSSetupForCPUToScreenColorExpandFill(ScrnInfoPtr pScrn, + int fg, int bg, int rop, + unsigned int planemask); +static void SiSSubsequentCPUToScreenColorExpandFill(ScrnInfoPtr pScrn, + int x, int y, int w, int h, + int skipleft); +#else static void SiSSetupForScanlineCPUToScreenColorExpandFill(ScrnInfoPtr pScrn, int fg, int bg, int rop, unsigned int planemask); @@ -132,6 +156,7 @@ static void SiSSubsequentScanlineCPUToScreenColorExpandFill(ScrnInfoPtr pScrn, int skipleft); static void SiSSubsequentColorExpandScanline(ScrnInfoPtr pScrn, int bufno); #endif +#endif #ifdef INCL_RENDER #ifdef RENDER extern Bool SiSSetupForCPUToScreenAlphaTexture(ScrnInfoPtr pScrn, @@ -168,12 +193,14 @@ SiSInitializeAccelerator(ScrnInfoPtr pScrn) SISPtr pSiS = SISPTR(pScrn); pSiS->DoColorExpand = FALSE; + pSiS->alphaBlitBusy = FALSE; +#ifndef SISVRAMQ if(pSiS->ChipFlags & SiSCF_Integrated) { - /* CmdQueLen = ((128 * 1024) / 4) - 64; - decreases system latecy dramatically */ CmdQueLen = 0; } else { - CmdQueLen = ((128 * 1024) / 4) - 64; + CmdQueLen = ((128 * 1024) / 4) - 64; } +#endif } Bool @@ -187,7 +214,11 @@ SiS315AccelInit(ScreenPtr pScreen) int UsableFbSize; unsigned char *AvailBufBase; BoxRec Avail; +#ifdef CTSCE +#ifndef CTSCE_DIRECT int i; +#endif +#endif pSiS->AccelInfoPtr = infoPtr = XAACreateInfoRec(); if (!infoPtr) @@ -215,7 +246,10 @@ SiS315AccelInit(ScreenPtr pScreen) infoPtr->SetupForSolidFill = SiSSetupForSolidFill; infoPtr->SubsequentSolidFillRect = SiSSubsequentSolidFillRect; #ifdef TRAP - infoPtr->SubsequentSolidFillTrap = SiSSubsequentSolidFillTrap; + if((pSiS->Chipset != PCI_CHIP_SIS660) && + (pSiS->Chipset != PCI_CHIP_SIS330)) { + infoPtr->SubsequentSolidFillTrap = SiSSubsequentSolidFillTrap; + } #endif infoPtr->SolidFillFlags = NO_PLANEMASK; @@ -236,7 +270,10 @@ SiS315AccelInit(ScreenPtr pScreen) infoPtr->SetupForMono8x8PatternFill = SiSSetupForMonoPatternFill; infoPtr->SubsequentMono8x8PatternFillRect = SiSSubsequentMonoPatternFill; #ifdef TRAP - infoPtr->SubsequentMono8x8PatternFillTrap = SiSSubsequentMonoPatternFillTrap; + if((pSiS->Chipset != PCI_CHIP_SIS660) && + (pSiS->Chipset != PCI_CHIP_SIS330)) { + infoPtr->SubsequentMono8x8PatternFillTrap = SiSSubsequentMonoPatternFillTrap; + } #endif infoPtr->Mono8x8PatternFillFlags = NO_PLANEMASK | HARDWARE_PATTERN_SCREEN_ORIGIN | @@ -244,9 +281,12 @@ SiS315AccelInit(ScreenPtr pScreen) NO_TRANSPARENCY | BIT_ORDER_IN_BYTE_MSBFIRST ; -#if 0 +#ifdef STSCE /* Screen To Screen Color Expand */ - /* TW: The hardware does not support this the way we need it */ + /* The hardware does not support this the way we need it, because + * the mono-bitmap is not provided with a pitch of (width), but + * with a pitch of scrnOffset (= width * bpp / 8). + */ infoPtr->SetupForScreenToScreenColorExpandFill = SiSSetupForScreenToScreenColorExpand; infoPtr->SubsequentScreenToScreenColorExpandFill = @@ -255,20 +295,49 @@ SiS315AccelInit(ScreenPtr pScreen) BIT_ORDER_IN_BYTE_MSBFIRST ; #endif - /* per-scanline color expansion - indirect method */ - pSiS->ColorExpandBufferNumber = 16; - pSiS->ColorExpandBufferCountMask = 0x0F; - pSiS->PerColorExpandBufferSize = ((pScrn->virtualX + 31)/32) * 4; #ifdef CTSCE - /* 650, 740, 660: We don't use this, it's much slower than doing it by the CPU. - * On 650, 740, 660 we know that we are running on a P4; for other chipsets like - * 315, we don't. On 550, this should be faster than the CPU in any case. - * I now disabled this for the Xabre as well; people owning a "high speed 3D" card - * have presumably CPUs fast enough. +#ifdef CTSCE_DIRECT + /* CPU color expansion - direct method + * + * We somewhat fake this function here in the following way: + * XAA copies its mono-bitmap data not into an aperture, but + * into our video RAM buffer. We then do a ScreenToScreen + * color expand. + * Unfortunately, XAA sends the data to the aperture AFTER + * the call to Subsequent(), therefore we do not execute the + * command in Subsequent, but in the following call to Sync(). + * (Hence, the SYNC_AFTER_COLOR_EXPAND flag MUST BE SET) + * + * This is slower than doing it by the CPU. */ + + pSiS->ColorExpandBufferNumber = 48; + pSiS->PerColorExpandBufferSize = ((pScrn->virtualX + 31)/32) * 4; + infoPtr->SetupForCPUToScreenColorExpandFill = SiSSetupForCPUToScreenColorExpandFill; + infoPtr->SubsequentCPUToScreenColorExpandFill = SiSSubsequentCPUToScreenColorExpandFill; + infoPtr->ColorExpandRange = pSiS->ColorExpandBufferNumber * pSiS->PerColorExpandBufferSize; + infoPtr->CPUToScreenColorExpandFillFlags = + NO_PLANEMASK | + CPU_TRANSFER_PAD_DWORD | + SCANLINE_PAD_DWORD | + BIT_ORDER_IN_BYTE_MSBFIRST | + LEFT_EDGE_CLIPPING | + SYNC_AFTER_COLOR_EXPAND; +#else + /* CPU color expansion - per-scanline / indirect method + * + * SLOW! SLOWER! SLOWEST! + * + * Does not work on XABRE, hangs the engine (both VRAM and MMIO). + * Does not work in VRAM queue mode. + */ +#ifndef SISVRAMQ if((pSiS->Chipset != PCI_CHIP_SIS650) && (pSiS->Chipset != PCI_CHIP_SIS660) && (pSiS->Chipset != PCI_CHIP_SIS330)) { + pSiS->ColorExpandBufferNumber = 16; + pSiS->ColorExpandBufferCountMask = 0x0F; + pSiS->PerColorExpandBufferSize = ((pScrn->virtualX + 31)/32) * 4; infoPtr->NumScanlineColorExpandBuffers = pSiS->ColorExpandBufferNumber; infoPtr->ScanlineColorExpandBuffers = (unsigned char **)&pSiS->ColorExpandBufferAddr[0]; infoPtr->SetupForScanlineCPUToScreenColorExpandFill = SiSSetupForScanlineCPUToScreenColorExpandFill; @@ -280,30 +349,40 @@ SiS315AccelInit(ScreenPtr pScreen) SCANLINE_PAD_DWORD | BIT_ORDER_IN_BYTE_MSBFIRST | LEFT_EDGE_CLIPPING; + } else { +#endif + pSiS->ColorExpandBufferNumber = 0; + pSiS->PerColorExpandBufferSize = 0; +#ifndef SISVRAMQ } #endif +#endif +#else + pSiS->ColorExpandBufferNumber = 0; + pSiS->PerColorExpandBufferSize = 0; +#endif #ifdef INCL_RENDER #ifdef RENDER - /* Render - DOES NOT WORK */ + /* Render (can later also be used for Translucent windows with constant Alpha) */ if((pScrn->bitsPerPixel == 16) || (pScrn->bitsPerPixel == 32)) { infoPtr->SetupForCPUToScreenAlphaTexture = SiSSetupForCPUToScreenAlphaTexture; infoPtr->SubsequentCPUToScreenAlphaTexture = SiSSubsequentCPUToScreenTexture; infoPtr->CPUToScreenAlphaTextureFormats = SiSAlphaTextureFormats; - infoPtr->CPUToScreenAlphaTextureFlags = XAA_RENDER_NO_TILE | - XAA_RENDER_NO_SRC_ALPHA; - + infoPtr->CPUToScreenAlphaTextureFlags = XAA_RENDER_NO_TILE; + infoPtr->SetupForCPUToScreenTexture = SiSSetupForCPUToScreenTexture; infoPtr->SubsequentCPUToScreenTexture = SiSSubsequentCPUToScreenTexture; infoPtr->CPUToScreenTextureFormats = SiSTextureFormats; infoPtr->CPUToScreenTextureFlags = XAA_RENDER_NO_TILE; + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "RENDER acceleration enabled\n"); } #endif -#endif +#endif #ifdef SISDUALHEAD - if (pSiS->DualHeadMode) { - infoPtr->RestoreAccelState = SiSRestoreAccelState; + if(pSiS->DualHeadMode) { + infoPtr->RestoreAccelState = SiSRestoreAccelState; } #endif @@ -313,7 +392,7 @@ SiS315AccelInit(ScreenPtr pScreen) reservedFbSize = (pSiS->ColorExpandBufferNumber * pSiS->PerColorExpandBufferSize); - /* TW: New for MaxXFBmem Option */ + UsableFbSize = topFB - reservedFbSize; /* Layout: * |--------------++++++++++++++++++++^************==========~~~~~~~~~~~~| @@ -321,31 +400,39 @@ SiS315AccelInit(ScreenPtr pScreen) * topFB */ AvailBufBase = pSiS->FbBase + UsableFbSize; - for (i = 0; i < pSiS->ColorExpandBufferNumber; i++) { - pSiS->ColorExpandBufferAddr[i] = AvailBufBase + +#ifdef CTSCE + if(pSiS->ColorExpandBufferNumber) { +#ifdef CTSCE_DIRECT + infoPtr->ColorExpandBase = (unsigned char *)AvailBufBase; + pSiS->ColorExpandBase = UsableFbSize; +#else + for(i = 0; i < pSiS->ColorExpandBufferNumber; i++) { + pSiS->ColorExpandBufferAddr[i] = AvailBufBase + i * pSiS->PerColorExpandBufferSize; - pSiS->ColorExpandBufferScreenOffset[i] = UsableFbSize + + pSiS->ColorExpandBufferScreenOffset[i] = UsableFbSize + i * pSiS->PerColorExpandBufferSize; + } +#endif } +#endif Avail.x1 = 0; Avail.y1 = 0; Avail.x2 = pScrn->displayWidth; - Avail.y2 = UsableFbSize - / (pScrn->displayWidth * pScrn->bitsPerPixel/8) - 1; - if (Avail.y2 < 0) - Avail.y2 = 32767; - if (Avail.y2 < pScrn->currentMode->VDisplay) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "Not enough video RAM for accelerator. At least " - "%dKB needed, %dKB available\n", - ((((pScrn->displayWidth * pScrn->bitsPerPixel/8) /* TW: +8 for make it sure */ - * pScrn->currentMode->VDisplay) + reservedFbSize) / 1024) + 8, - pSiS->maxxfbmem/1024); - pSiS->NoAccel = TRUE; - pSiS->NoXvideo = TRUE; - XAADestroyInfoRec(pSiS->AccelInfoPtr); - pSiS->AccelInfoPtr = NULL; - return FALSE; + Avail.y2 = UsableFbSize / (pScrn->displayWidth * pScrn->bitsPerPixel/8) - 1; + + if(Avail.y2 < 0) Avail.y2 = 32767; + if(Avail.y2 < pScrn->currentMode->VDisplay) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Not enough video RAM for accelerator. At least " + "%dKB needed, %dKB available\n", + ((((pScrn->displayWidth * pScrn->bitsPerPixel/8) /* +8 for make it sure */ + * pScrn->currentMode->VDisplay) + reservedFbSize) / 1024) + 8, + pSiS->maxxfbmem/1024); + pSiS->NoAccel = TRUE; + pSiS->NoXvideo = TRUE; + XAADestroyInfoRec(pSiS->AccelInfoPtr); + pSiS->AccelInfoPtr = NULL; + return FALSE; } xf86DrvMsg(pScrn->scrnIndex, X_INFO, @@ -364,7 +451,18 @@ SiSSync(ScrnInfoPtr pScrn) PDEBUG(ErrorF("SiSSync()\n")); +#ifdef CTSCE +#ifdef CTSCE_DIRECT + if(pSiS->DoColorExpand) { + SiSDoCMD + pSiS->ColorExpandBusy = TRUE; + } +#endif +#endif + pSiS->DoColorExpand = FALSE; + pSiS->alphaBlitBusy = FALSE; + SiSIdle } @@ -374,8 +472,8 @@ SiSRestoreAccelState(ScrnInfoPtr pScrn) { SISPtr pSiS = SISPTR(pScrn); - /* TW: We don't need to do anything special here */ - pSiS->DoColorExpand = FALSE; + pSiS->ColorExpandBusy = FALSE; + pSiS->alphaBlitBusy = FALSE; SiSIdle } #endif @@ -430,24 +528,31 @@ static void SiSSetupForScreenToScreenCopy(ScrnInfoPtr pScrn, PDEBUG(ErrorF("Setup ScreenCopy(%d, %d, 0x%x, 0x%x, 0x%x)\n", xdir, ydir, rop, planemask, trans_color)); - /* "AGP base" - color depth depending value (see sis_vga.c) */ +#ifdef SISVRAMQ + SiSSetupDSTColorDepth(pSiS->SiS310_AccelDepth); + SiSCheckQueue(16 * 2); + SiSSetupSRCPitchDSTRect(pSiS->scrnOffset, pSiS->scrnOffset, -1) +#else SiSSetupDSTColorDepth(pSiS->DstColor); - /* SRC pitch */ SiSSetupSRCPitch(pSiS->scrnOffset) - /* DST pitch and height (-1 for disabling merge-clipping) */ SiSSetupDSTRect(pSiS->scrnOffset, -1) +#endif + /* Init CommandReg and set ROP */ - if (trans_color != -1) { - SiSSetupROP(0x0A) - SiSSetupSRCTrans(trans_color) - SiSSetupCMDFlag(TRANSPARENT_BITBLT) + if(trans_color != -1) { + SiSSetupROP(0x0A) + SiSSetupSRCTrans(trans_color) + SiSSetupCMDFlag(TRANSPARENT_BITBLT) } else { - SiSSetupROP(sisALUConv[rop]) - /* Set command - not needed, both 0 */ - /* SiSSetupCMDFlag(BITBLT | SRCVIDEO) */ + SiSSetupROP(sisALUConv[rop]) + /* Set command - not needed, both 0 */ + /* SiSSetupCMDFlag(BITBLT | SRCVIDEO) */ } - /* Set some color depth depending value (see sis_vga.c) */ + +#ifndef SISVRAMQ + /* Set some color depth depending value (see sis_vga.c) */ SiSSetupCMDFlag(pSiS->SiS310_AccelDepth) +#endif /* The chip is smart enough to know the direction */ } @@ -485,25 +590,33 @@ static void SiSSubsequentScreenToScreenCopy(ScrnInfoPtr pScrn, dst_y -= mymin; } } else { - if (src_y >= 2048) { - srcbase = pSiS->scrnOffset * src_y; - src_y = 0; + if(src_y >= 2048) { + srcbase = pSiS->scrnOffset * src_y; + src_y = 0; } - if ((dst_y >= pScrn->virtualY) || (dst_y >= 2048)) { - dstbase = pSiS->scrnOffset * dst_y; - dst_y = 0; + if((dst_y >= pScrn->virtualY) || (dst_y >= 2048)) { + dstbase = pSiS->scrnOffset * dst_y; + dst_y = 0; } } #ifdef SISDUALHEAD srcbase += HEADOFFSET; dstbase += HEADOFFSET; #endif + +#ifdef SISVRAMQ + SiSCheckQueue(16 * 3); + SiSSetupSRCDSTBase(srcbase, dstbase) + SiSSetupSRCDSTXY(src_x, src_y, dst_x, dst_y) + SiSSetRectDoCMD(width,height) +#else SiSSetupSRCBase(srcbase); SiSSetupDSTBase(dstbase); SiSSetupRect(width, height) SiSSetupSRCXY(src_x, src_y) SiSSetupDSTXY(dst_x, dst_y) SiSDoCMD +#endif } static void @@ -520,11 +633,20 @@ SiSSetupForSolidFill(ScrnInfoPtr pScrn, int color, rop = 5; /* NOOP */ } } - SiSSetupPATFG(color) + +#ifdef SISVRAMQ + SiSSetupDSTColorDepth(pSiS->SiS310_AccelDepth); + SiSCheckQueue(16 * 1); + SiSSetupPATFGDSTRect(color, pSiS->scrnOffset, -1) + SiSSetupROP(sisPatALUConv[rop]) + SiSSetupCMDFlag(PATFG) +#else + SiSSetupPATFG(color) SiSSetupDSTRect(pSiS->scrnOffset, -1) SiSSetupDSTColorDepth(pSiS->DstColor); SiSSetupROP(sisPatALUConv[rop]) SiSSetupCMDFlag(PATFG | pSiS->SiS310_AccelDepth) +#endif } static void @@ -537,28 +659,38 @@ SiSSubsequentSolidFillRect(ScrnInfoPtr pScrn, PDEBUG(ErrorF("Subsequent SolidFillRect(%d, %d, %d, %d)\n", x, y, w, h)); dstbase = 0; - if (y >= 2048) { - dstbase=pSiS->scrnOffset*y; - y = 0; + if(y >= 2048) { + dstbase = pSiS->scrnOffset * y; + y = 0; } #ifdef SISDUALHEAD dstbase += HEADOFFSET; #endif - SiSSetupDSTBase(dstbase) - SiSSetupDSTXY(x,y) - SiSSetupRect(w,h) + pSiS->CommandReg &= ~(T_XISMAJORL | T_XISMAJORR | T_L_X_INC | T_L_Y_INC | T_R_X_INC | T_R_Y_INC | TRAPAZOID_FILL); - SiSSetupCMDFlag(BITBLT) + + /* SiSSetupCMDFlag(BITBLT) - BITBLT = 0 */ + +#ifdef SISVRAMQ + SiSCheckQueue(16 * 2) + SiSSetupDSTXYRect(x,y,w,h) + SiSSetupDSTBaseDoCMD(dstbase) +#else + SiSSetupDSTBase(dstbase) + SiSSetupDSTXY(x,y) + SiSSetupRect(w,h) SiSDoCMD +#endif } /* Trapezoid */ /* This would work better if XAA would provide us with valid trapezoids. * In fact, with small trapezoids the left and the right edge often cross * each other which causes drawing errors (filling over whole scanline). + * DOES NOT WORK ON XABRE, HANGS THE ENGINE. */ #ifdef TRAP static void @@ -568,19 +700,21 @@ SiSSubsequentSolidFillTrap(ScrnInfoPtr pScrn, int y, int h, { SISPtr pSiS = SISPTR(pScrn); long dstbase; -#if 0 - float kL, kR; -#endif dstbase = 0; - if (y >= 2048) { - dstbase=pSiS->scrnOffset*y; - y = 0; + if(y >= 2048) { + dstbase = pSiS->scrnOffset * y; + y = 0; } #ifdef SISDUALHEAD dstbase += HEADOFFSET; #endif + +#ifdef SISVRAMQ /* Not optimized yet */ + SiSCheckQueue(16 * 10) +#else SiSSetupDSTBase(dstbase) +#endif #if 1 SiSSetupPATFG(0xff0000) /* FOR TESTING */ @@ -595,60 +729,41 @@ SiSSubsequentSolidFillTrap(ScrnInfoPtr pScrn, int y, int h, xf86DrvMsg(0, X_INFO, "Trap (%d %d %d %d) dxL %d dyL %d eL %d dxR %d dyR %d eR %d\n", left, right, y, h, dxL, dyL, eL, dxR, dyR, eR); - /* Unfortunately, we must check if the right and the left edge - * cross each other... INCOMPLETE (equation wrong) - */ -#if 0 - if (dxL == 0) kL = 0; - else kL = (float)dyL / (float)dxL; - if (dxR == 0) kR = 0; - else kR = (float)dyR / (float)dxR; - xf86DrvMsg(0, X_INFO, "kL %f kR %f!\n", kL, kR); - if ( (kR != kL) && - (!(kR == 0 && kL == 0)) && - (!(kR < 0 && kL > 0)) ) { - xf86DrvMsg(0, X_INFO, "Inside if (%f - %d)\n", ( kL * ( ( ((float)right - (float)left) / (kL - kR) ) - left) + y), h+y); - if ( ( ( kL * ( ( ((float)right - (float)left) / (kL - kR) ) - (float)left) + (float)y) < (h + y) ) ) { - xf86DrvMsg(0, X_INFO, "Cross detected!\n"); - } - } -#endif - /* Determine egde angles */ - if (dxL < 0) { dxL = -dxL; } - else { SiSSetupCMDFlag(T_L_X_INC) } - if (dxR < 0) { dxR = -dxR; } - else { SiSSetupCMDFlag(T_R_X_INC) } + if(dxL < 0) { dxL = -dxL; } + else { SiSSetupCMDFlag(T_L_X_INC) } + if(dxR < 0) { dxR = -dxR; } + else { SiSSetupCMDFlag(T_R_X_INC) } /* (Y direction always positive - do this anyway) */ - if (dyL < 0) { dyL = -dyL; } - else { SiSSetupCMDFlag(T_L_Y_INC) } - if (dyR < 0) { dyR = -dyR; } - else { SiSSetupCMDFlag(T_R_Y_INC) } + if(dyL < 0) { dyL = -dyL; } + else { SiSSetupCMDFlag(T_L_Y_INC) } + if(dyR < 0) { dyR = -dyR; } + else { SiSSetupCMDFlag(T_R_Y_INC) } /* Determine major axis */ - if (dxL >= dyL) { /* X is major axis */ - SiSSetupCMDFlag(T_XISMAJORL) - } - if (dxR >= dyR) { /* X is major axis */ - SiSSetupCMDFlag(T_XISMAJORR) - } + if(dxL >= dyL) { SiSSetupCMDFlag(T_XISMAJORL) } + if(dxR >= dyR) { SiSSetupCMDFlag(T_XISMAJORR) } + + SiSSetupCMDFlag(TRAPAZOID_FILL); +#ifdef SISVRAMQ + SiSSetupYHLR(y, h, left, right) + SiSSetupdLdR(dxL, dyL, dxR, dyR) + SiSSetupELER(eL, eR) + SiSSetupDSTBaseDoCMD(dstbase) +#else /* Set up deltas */ SiSSetupdL(dxL, dyL) SiSSetupdR(dxR, dyR) - /* Set up y, h, left, right */ - SiSSetupYH(y,h) - SiSSetupLR(left,right) - + SiSSetupYH(y, h) + SiSSetupLR(left, right) /* Set up initial error term */ SiSSetupEL(eL) SiSSetupER(eR) - - SiSSetupCMDFlag(TRAPAZOID_FILL); - SiSDoCMD +#endif } #endif @@ -660,13 +775,21 @@ SiSSetupForSolidLine(ScrnInfoPtr pScrn, int color, int rop, PDEBUG(ErrorF("Setup SolidLine(0x%x, 0x%x, 0x%x)\n", color, rop, planemask)); - +#ifdef SISVRAMQ + SiSSetupDSTColorDepth(pSiS->SiS310_AccelDepth); + SiSCheckQueue(16 * 3); + SiSSetupLineCountPeriod(1, 1) + SiSSetupPATFGDSTRect(color, pSiS->scrnOffset, -1) + SiSSetupROP(sisPatALUConv[rop]) + SiSSetupCMDFlag(PATFG | LINE) +#else SiSSetupLineCount(1) SiSSetupPATFG(color) SiSSetupDSTRect(pSiS->scrnOffset, -1) - SiSSetupDSTColorDepth(pSiS->DstColor); + SiSSetupDSTColorDepth(pSiS->DstColor) SiSSetupROP(sisPatALUConv[rop]) SiSSetupCMDFlag(PATFG | LINE | pSiS->SiS310_AccelDepth) +#endif } static void @@ -682,24 +805,31 @@ SiSSubsequentSolidTwoPointLine(ScrnInfoPtr pScrn, dstbase = 0; miny = (y1 > y2) ? y2 : y1; maxy = (y1 > y2) ? y1 : y2; - if (maxy >= 2048) { - dstbase = pSiS->scrnOffset*miny; - y1 -= miny; - y2 -= miny; + if(maxy >= 2048) { + dstbase = pSiS->scrnOffset*miny; + y1 -= miny; + y2 -= miny; } #ifdef SISDUALHEAD dstbase += HEADOFFSET; #endif - SiSSetupDSTBase(dstbase) - SiSSetupX0Y0(x1,y1) - SiSSetupX1Y1(x2,y2) - if (flags & OMIT_LAST) { - SiSSetupCMDFlag(NO_LAST_PIXEL) + if(flags & OMIT_LAST) { + SiSSetupCMDFlag(NO_LAST_PIXEL) } else { - pSiS->CommandReg &= ~(NO_LAST_PIXEL); + pSiS->CommandReg &= ~(NO_LAST_PIXEL); } + +#ifdef SISVRAMQ + SiSCheckQueue(16 * 2); + SiSSetupX0Y0X1Y1(x1,y1,x2,y2) + SiSSetupDSTBaseDoCMD(dstbase) +#else + SiSSetupDSTBase(dstbase) + SiSSetupX0Y0(x1,y1) + SiSSetupX1Y1(x2,y2) SiSDoCMD +#endif } static void @@ -714,22 +844,32 @@ SiSSubsequentSolidHorzVertLine(ScrnInfoPtr pScrn, len--; /* starting point is included! */ dstbase = 0; - if ((y >= 2048) || ((y + len) >= 2048)) { - dstbase = pSiS->scrnOffset * y; - y = 0; + if((y >= 2048) || ((y + len) >= 2048)) { + dstbase = pSiS->scrnOffset * y; + y = 0; } #ifdef SISDUALHEAD dstbase += HEADOFFSET; #endif - SiSSetupDSTBase(dstbase) +#ifdef SISVRAMQ + SiSCheckQueue(16 * 2); + if(dir == DEGREES_0) { + SiSSetupX0Y0X1Y1(x, y, (x + len), y) + } else { + SiSSetupX0Y0X1Y1(x, y, x, (y + len)) + } + SiSSetupDSTBaseDoCMD(dstbase) +#else + SiSSetupDSTBase(dstbase) SiSSetupX0Y0(x,y) - if (dir == DEGREES_0) { - SiSSetupX1Y1(x + len, y); + if(dir == DEGREES_0) { + SiSSetupX1Y1(x + len, y); } else { - SiSSetupX1Y1(x, y + len); + SiSSetupX1Y1(x, y + len); } SiSDoCMD +#endif } static void @@ -742,21 +882,34 @@ SiSSetupForDashedLine(ScrnInfoPtr pScrn, PDEBUG(ErrorF("Setup DashedLine(0x%x, 0x%x, 0x%x, 0x%x, %d, 0x%x:%x)\n", fg, bg, rop, planemask, length, *(pattern+4), *pattern)); +#ifdef SISVRAMQ + SiSSetupDSTColorDepth(pSiS->SiS310_AccelDepth); + SiSCheckQueue(16 * 3); + SiSSetupLineCountPeriod(1, length-1) + SiSSetupStyle(*pattern,*(pattern+4)) + SiSSetupPATFGDSTRect(fg, pSiS->scrnOffset, -1) +#else SiSSetupLineCount(1) SiSSetupDSTRect(pSiS->scrnOffset, -1) SiSSetupDSTColorDepth(pSiS->DstColor); SiSSetupStyleLow(*pattern) SiSSetupStyleHigh(*(pattern+4)) - SiSSetupStylePeriod(length-1); - SiSSetupROP(sisPatALUConv[rop]) + SiSSetupStylePeriod(length-1); SiSSetupPATFG(fg) +#endif + + SiSSetupROP(sisPatALUConv[rop]) + SiSSetupCMDFlag(LINE | LINE_STYLE) - if (bg != -1) { - SiSSetupPATBG(bg) + + if(bg != -1) { + SiSSetupPATBG(bg) } else { - SiSSetupCMDFlag(TRANSPARENT) + SiSSetupCMDFlag(TRANSPARENT) } +#ifndef SISVRAMQ SiSSetupCMDFlag(pSiS->SiS310_AccelDepth) +#endif } static void @@ -771,26 +924,33 @@ SiSSubsequentDashedTwoPointLine(ScrnInfoPtr pScrn, x1, y1, x2, y2, flags, phase)); dstbase = 0; - miny=(y1 > y2) ? y2 : y1; - maxy=(y1 > y2) ? y1 : y2; - if (maxy >= 2048) { - dstbase = pSiS->scrnOffset * miny; - y1 -= miny; - y2 -= miny; + miny = (y1 > y2) ? y2 : y1; + maxy = (y1 > y2) ? y1 : y2; + if(maxy >= 2048) { + dstbase = pSiS->scrnOffset * miny; + y1 -= miny; + y2 -= miny; } #ifdef SISDUALHEAD dstbase += HEADOFFSET; #endif - SiSSetupDSTBase(dstbase) - SiSSetupX0Y0(x1,y1) - SiSSetupX1Y1(x2,y2) - if (flags & OMIT_LAST) { - SiSSetupCMDFlag(NO_LAST_PIXEL) + if(flags & OMIT_LAST) { + SiSSetupCMDFlag(NO_LAST_PIXEL) } else { - pSiS->CommandReg &= ~(NO_LAST_PIXEL); + pSiS->CommandReg &= ~(NO_LAST_PIXEL); } + +#ifdef SISVRAMQ + SiSCheckQueue(16 * 2); + SiSSetupX0Y0X1Y1(x1,y1,x2,y2) + SiSSetupDSTBaseDoCMD(dstbase) +#else + SiSSetupDSTBase(dstbase) + SiSSetupX0Y0(x1,y1) + SiSSetupX1Y1(x2,y2) SiSDoCMD +#endif } static void @@ -802,12 +962,27 @@ SiSSetupForMonoPatternFill(ScrnInfoPtr pScrn, PDEBUG(ErrorF("Setup MonoPatFill(0x%x,0x%x, 0x%x,0x%x, 0x%x, 0x%x)\n", patx, paty, fg, bg, rop, planemask)); + +#ifdef SISVRAMQ + SiSSetupDSTColorDepth(pSiS->SiS310_AccelDepth); + SiSCheckQueue(16 * 3); + SiSSetupPATFGDSTRect(fg, pSiS->scrnOffset, -1) +#else SiSSetupDSTRect(pSiS->scrnOffset, -1) SiSSetupDSTColorDepth(pSiS->DstColor); +#endif + SiSSetupMONOPAT(patx,paty) - SiSSetupPATFG(fg) + SiSSetupROP(sisPatALUConv[rop]) + +#ifdef SISVRAMQ + SiSSetupCMDFlag(PATMONO) +#else + SiSSetupPATFG(fg) SiSSetupCMDFlag(PATMONO | pSiS->SiS310_AccelDepth) +#endif + SiSSetupPATBG(bg) } @@ -822,25 +997,36 @@ SiSSubsequentMonoPatternFill(ScrnInfoPtr pScrn, PDEBUG(ErrorF("Subsequent MonoPatFill(0x%x,0x%x, %d,%d, %d,%d)\n", patx, paty, x, y, w, h)); dstbase = 0; - if (y >= 2048) { - dstbase = pSiS->scrnOffset * y; - y = 0; + if(y >= 2048) { + dstbase = pSiS->scrnOffset * y; + y = 0; } #ifdef SISDUALHEAD dstbase += HEADOFFSET; #endif - SiSSetupDSTBase(dstbase) - SiSSetupDSTXY(x,y) - SiSSetupRect(w,h) + /* Clear commandReg because Setup can be used for Rect and Trap */ pSiS->CommandReg &= ~(T_XISMAJORL | T_XISMAJORR | T_L_X_INC | T_L_Y_INC | T_R_X_INC | T_R_Y_INC | TRAPAZOID_FILL); + +#ifdef SISVRAMQ + SiSCheckQueue(16 * 2); + SiSSetupDSTXYRect(x,y,w,h) + SiSSetupDSTBaseDoCMD(dstbase) +#else + SiSSetupDSTBase(dstbase) + SiSSetupDSTXY(x,y) + SiSSetupRect(w,h) SiSDoCMD +#endif } -/* Trapezoid */ +/* --- Trapezoid --- */ + +/* Does not work at all on Xabre */ + #ifdef TRAP static void SiSSubsequentMonoPatternFillTrap(ScrnInfoPtr pScrn, @@ -856,14 +1042,19 @@ SiSSubsequentMonoPatternFillTrap(ScrnInfoPtr pScrn, y, h, left, right, dxL, dxR, eL, eR)); dstbase = 0; - if (y >= 2048) { - dstbase=pSiS->scrnOffset*y; - y = 0; + if(y >= 2048) { + dstbase=pSiS->scrnOffset*y; + y = 0; } #ifdef SISDUALHEAD dstbase += HEADOFFSET; #endif + +#ifdef SISVRAMQ + SiSCheckQueue(16 * 4); +#else SiSSetupDSTBase(dstbase) +#endif /* Clear CommandReg because SetUp can be used for Rect and Trap */ pSiS->CommandReg &= ~(T_XISMAJORL | T_XISMAJORR | @@ -871,72 +1062,195 @@ SiSSubsequentMonoPatternFillTrap(ScrnInfoPtr pScrn, T_R_X_INC | T_R_Y_INC | BITBLT); - if (dxL < 0) { dxL = -dxL; } - else { SiSSetupCMDFlag(T_L_X_INC) } - if (dxR < 0) { dxR = -dxR; } - else { SiSSetupCMDFlag(T_R_X_INC) } + if(dxL < 0) { dxL = -dxL; } + else { SiSSetupCMDFlag(T_L_X_INC) } + if(dxR < 0) { dxR = -dxR; } + else { SiSSetupCMDFlag(T_R_X_INC) } - if (dyL < 0) { dyL = -dyL; } - else { SiSSetupCMDFlag(T_L_Y_INC) } - if (dyR < 0) { dyR = -dyR; } - else { SiSSetupCMDFlag(T_R_Y_INC) } + if(dyL < 0) { dyL = -dyL; } + else { SiSSetupCMDFlag(T_L_Y_INC) } + if(dyR < 0) { dyR = -dyR; } + else { SiSSetupCMDFlag(T_R_Y_INC) } /* Determine major axis */ - if (dxL >= dyL) { /* X is major axis */ - SiSSetupCMDFlag(T_XISMAJORL) - } - if (dxR >= dyR) { /* X is major axis */ - SiSSetupCMDFlag(T_XISMAJORR) - } + if(dxL >= dyL) { SiSSetupCMDFlag(T_XISMAJORL) } + if(dxR >= dyR) { SiSSetupCMDFlag(T_XISMAJORR) } - SiSSetupYH(y,h) - SiSSetupLR(left,right) + SiSSetupCMDFlag(TRAPAZOID_FILL); +#ifdef SISVRAMQ + SiSSetupYHLR(y, h, left, right) + SiSSetupdLdR(dxL, dyL, dxR, dyR) + SiSSetupELER(eL, eR) + SiSSetupDSTBaseDoCMD(dstbase) +#else + SiSSetupYH(y, h) + SiSSetupLR(left, right) SiSSetupdL(dxL, dyL) SiSSetupdR(dxR, dyR) - SiSSetupEL(eL) SiSSetupER(eR) - - SiSSetupCMDFlag(TRAPAZOID_FILL); - SiSDoCMD +#endif } #endif -/* ---- CPUToScreen Color Expand */ +/* ---- CPUToScreen Color Expand --- */ #ifdef CTSCE -/* We use the indirect method */ + +#ifdef CTSCE_DIRECT + +/* Direct method */ + +/* This is somewhat a fake. We let XAA copy its data not to an + * aperture, but to video RAM, and then do a ScreenToScreen + * color expansion. + * Since the data is sent AFTER the call to Subsequent, we + * don't execute the command here, but set a flag and do + * that in the (subsequent) call to Sync() + */ + +static void +SiSSetupForCPUToScreenColorExpandFill(ScrnInfoPtr pScrn, + int fg, int bg, int rop, unsigned int planemask) +{ + SISPtr pSiS=SISPTR(pScrn); + +#ifdef SISVRAMQ + SiSSetupDSTColorDepth(pSiS->SiS310_AccelDepth); + SiSSetupROP(sisALUConv[rop]); + SiSSetupSRCFGDSTRect(fg, pSiS->scrnOffset, -1) + if(bg == -1) { + SiSSetupCMDFlag(TRANSPARENT | ENCOLOREXP | SRCVIDEO); + } else { + SiSSetupSRCBG(bg); + SiSSetupCMDFlag(ENCOLOREXP | SRCVIDEO); + } +#else + SiSSetupSRCXY(0,0); + SiSSetupROP(sisALUConv[rop]); + SiSSetupSRCFG(fg); + SiSSetupDSTRect(pSiS->scrnOffset, -1); + SiSSetupDSTColorDepth(pSiS->DstColor); + if(bg == -1) { + SiSSetupCMDFlag(TRANSPARENT | ENCOLOREXP | SRCVIDEO + | pSiS->SiS310_AccelDepth); + } else { + SiSSetupSRCBG(bg); + SiSSetupCMDFlag(ENCOLOREXP | SRCVIDEO | pSiS->SiS310_AccelDepth); + } +#endif +} + +static void +SiSSubsequentCPUToScreenColorExpandFill( + ScrnInfoPtr pScrn, int x, int y, int w, + int h, int skipleft) +{ + SISPtr pSiS = SISPTR(pScrn); + int _x0, _y0, _x1, _y1; + long srcbase, dstbase; + + srcbase = pSiS->ColorExpandBase; + + dstbase = 0; + if(y >= 2048) { + dstbase = pSiS->scrnOffset*y; + y = 0; + } + +#ifdef SISDUALHEAD + srcbase += HEADOFFSET; + dstbase += HEADOFFSET; +#endif + +#ifdef SISVRAMQ + SiSSetupSRCDSTBase(srcbase,dstbase); +#else + SiSSetupSRCBase(srcbase); + SiSSetupDSTBase(dstbase) +#endif + + if(skipleft > 0) { + _x0 = x + skipleft; + _y0 = y; + _x1 = x + w; + _y1 = y + h; +#ifdef SISVRAMQ + SiSSetupClip(_x0, _y0, _x1, _y1); +#else + SiSSetupClipLT(_x0, _y0); + SiSSetupClipRB(_x1, _y1); +#endif + SiSSetupCMDFlag(CLIPENABLE); + } else { + pSiS->CommandReg &= (~CLIPENABLE); + } + +#ifdef SISVRAMQ + SiSSetupRectSRCPitch(w, h, ((((w + 7) >> 3) + 3) >> 2) << 2); + SiSSetupSRCDSTXY(0, 0, x, y); +#else + SiSSetupRect(w, h); + SiSSetupSRCPitch(((((w+7)/8)+3) >> 2) * 4); + SiSSetupDSTXY(x, y); +#endif + + if(pSiS->ColorExpandBusy) { + pSiS->ColorExpandBusy = FALSE; + SiSIdle + } + + pSiS->DoColorExpand = TRUE; +} + +#else + +/* Indirect method */ + +/* This is SLOW, slower than the CPU on most chipsets */ +/* Does not work in VRAM queue mode. */ + static void SiSSetupForScanlineCPUToScreenColorExpandFill(ScrnInfoPtr pScrn, int fg, int bg, int rop, unsigned int planemask) { SISPtr pSiS=SISPTR(pScrn); - /* FIXME: How do I check the "CPU driven blit stage" on the - * 315 series? - * That's the 300 series method but definitely wrong for - * 315 series (bit 28 is already used for idle!) - */ - /* while ((MMIO_IN16(pSiS->IOBase, Q_STATUS+2) & 0x1F00) != 0) {} */ +#ifdef SISVRAMQ + SiSSetupDSTColorDepth(pSiS->SiS310_AccelDepth); +#endif - /* TW: Do Idle instead... */ - SiSIdle + /* !!! DOES NOT WORK IN VRAM QUEUE MODE !!! */ + + /* (hence this is not optimized for VRAM mode) */ + SiSIdle SiSSetupSRCXY(0,0); + SiSSetupROP(sisALUConv[rop]); SiSSetupSRCFG(fg); SiSSetupDSTRect(pSiS->scrnOffset, -1); +#ifndef SISVRAMQ SiSSetupDSTColorDepth(pSiS->DstColor); - if (bg == -1) { - SiSSetupCMDFlag(TRANSPARENT | ENCOLOREXP | SRCCPUBLITBUF - | pSiS->SiS310_AccelDepth); +#endif + if(bg == -1) { +#ifdef SISVRAMQ + SiSSetupCMDFlag(TRANSPARENT | ENCOLOREXP | SRCCPUBLITBUF); +#else + SiSSetupCMDFlag(TRANSPARENT | ENCOLOREXP | SRCCPUBLITBUF + | pSiS->SiS310_AccelDepth); +#endif } else { - SiSSetupSRCBG(bg); - SiSSetupCMDFlag(ENCOLOREXP | SRCCPUBLITBUF - | pSiS->SiS310_AccelDepth); + SiSSetupSRCBG(bg); +#ifdef SISVRAMQ + SiSSetupCMDFlag(ENCOLOREXP | SRCCPUBLITBUF); +#else + SiSSetupCMDFlag(ENCOLOREXP | SRCCPUBLITBUF | pSiS->SiS310_AccelDepth); +#endif }; + } static void @@ -949,35 +1263,40 @@ SiSSubsequentScanlineCPUToScreenColorExpandFill( long dstbase; dstbase = 0; - if (y >= 2048) { - dstbase = pSiS->scrnOffset*y; - y = 0; + if(y >= 2048) { + dstbase = pSiS->scrnOffset*y; + y = 0; } #ifdef SISDUALHEAD dstbase += HEADOFFSET; #endif if((MMIO_IN16(pSiS->IOBase, Q_STATUS+2) & 0x8000) != 0x8000) { - SiSIdle; + SiSIdle; } SiSSetupDSTBase(dstbase) - if (skipleft > 0) { - _x0 = x+skipleft; - _y0 = y; - _x1 = x+w; - _y1 = y+h; - SiSSetupClipLT(_x0, _y0); - SiSSetupClipRB(_x1, _y1); - SiSSetupCMDFlag(CLIPENABLE); + if(skipleft > 0) { + _x0 = x+skipleft; + _y0 = y; + _x1 = x+w; + _y1 = y+h; +#ifdef SISVRAMQ + SiSSetupClip(_x0, _y0, _x1, _y1); +#else + SiSSetupClipLT(_x0, _y0); + SiSSetupClipRB(_x1, _y1); +#endif + SiSSetupCMDFlag(CLIPENABLE); } else { - pSiS->CommandReg &= (~CLIPENABLE); + pSiS->CommandReg &= (~CLIPENABLE); } SiSSetupRect(w, 1); SiSSetupSRCPitch(((((w+7)/8)+3) >> 2) * 4); pSiS->ycurrent = y; pSiS->xcurrent = x; + } static void @@ -992,7 +1311,7 @@ SiSSubsequentColorExpandScanline(ScrnInfoPtr pScrn, int bufno) #endif if((MMIO_IN16(pSiS->IOBase, Q_STATUS+2) & 0x8000) != 0x8000) { - SiSIdle; + SiSIdle; } SiSSetupSRCBase(cbo); @@ -1006,10 +1325,188 @@ SiSSubsequentColorExpandScanline(ScrnInfoPtr pScrn, int bufno) SiSIdle } #endif +#endif -/* ---- RENDER ---- */ +/* --- Screen To Screen Color Expand --- */ + +/* This method blits in a single task; this does not work because + * the hardware does not use the source pitch as scanline offset + * but to calculate pattern address from source X and Y and to + * limit the drawing width (similar to width set by SetupRect). + * XAA provides the pattern bitmap with scrnOffset (displayWidth * bpp/8) + * offset, but this is not supported by the hardware. + * DOES NOT WORK ON XABRE, HANGS ENGINE. + */ + +#ifdef STSCE +static void +SiSSetupForScreenToScreenColorExpand(ScrnInfoPtr pScrn, + int fg, int bg, + int rop, unsigned int planemask) +{ + SISPtr pSiS = SISPTR(pScrn); + +#ifdef SISVRAMQ + SiSSetupDSTColorDepth(pSiS->SiS310_AccelDepth); +#else + SiSSetupDSTColorDepth(pSiS->DstColor) +#endif + SiSSetupDSTRect(pSiS->scrnOffset, -1) + SiSSetupROP(sisALUConv[rop]) + SiSSetupSRCFG(fg) + /* SiSSetupSRCXY(0,0) */ + + if(bg == -1) { + SiSSetupCMDFlag(TRANSPARENT | ENCOLOREXP | SRCVIDEO); + } else { + SiSSetupSRCBG(bg); + SiSSetupCMDFlag(ENCOLOREXP | SRCVIDEO); + }; +} + +/* For testing, these are the methods: (use only one at a time!) */ + +#undef npitch /* Normal: Use srcx/y as srcx/y, use scrnOffset as source pitch + * Does not work on 315 series, because the hardware does not + * regard the src x and y. Apart from this problem: + * This would work if the hareware used the source pitch for + * incrementing the source address after each scanline - but + * it doesn't do this! The first line of the area is correctly + * color expanded, but since the source pitch is ignored and + * the source address not incremented correctly, the following + * lines are color expanded with any bit pattern that is left + * in the unused space of the source bitmap (which is organized + * with the depth of the screen framebuffer hence with a pitch + * of scrnOffset). + */ + +#undef pitchdw /* Use source pitch "displayWidth / 8" instead + * of scrnOffset (=displayWidth * bpp / 8) + * This can't work, because the pitch of the source + * bitmap is scrnoffset! + */ + +#define nopitch /* Calculate srcbase with srcx and srcy, set the + * pitch to scrnOffset (which IS the correct pitch + * for the source bitmap) and set srcx and srcy both + * to 0. + * This would work if the hareware used the source pitch for + * incrementing the source address after each scanline - but + * it doesn't do this! Again: The first line of the area is + * correctly color expanded, but since the source pitch is + * ignored for scanline address incremention, the following + * lines are not correctly color expanded. + * This is the only way it works (apart from the problem + * described above). The hardware does not regard the src + * x and y values in any way. + */ + +static void +SiSSubsequentScreenToScreenColorExpand(ScrnInfoPtr pScrn, + int x, int y, int w, int h, + int srcx, int srcy, int skipleft) +{ + SISPtr pSiS = SISPTR(pScrn); + long srcbase, dstbase; +#if 0 + int _x0, _y0, _x1, _y1; +#endif +#ifdef pitchdw + int newsrcx, newsrcy; + + /* srcx and srcy are provided based on a scrnOffset pitch ( = displayWidth * bpp / 8 ) + * We recalulate srcx and srcy based on pitch = displayWidth / 8 + */ + newsrcy = ((pSiS->scrnOffset * srcy) + (srcx * ((pScrn->bitsPerPixel+7)/8))) / + (pScrn->displayWidth/8); + newsrcx = ((pSiS->scrnOffset * srcy) + (srcx * ((pScrn->bitsPerPixel+7)/8))) % + (pScrn->displayWidth/8); +#endif + xf86DrvMsg(0, X_INFO, "Sub ScreenToScreen ColorExp(%d,%d, %d,%d, %d,%d, %d)\n", + x, y, w, h, srcx, srcy, skipleft); -/* DOES NOT WORK. SEE COMMENT ABOVE. */ + srcbase = dstbase = 0; + +#ifdef pitchdw + if(newsrcy >= 2048) { + srcbase = (pScrn->displayWidth / 8) * newsrcy; + newsrcy = 0; + } +#endif +#ifdef nopitch + srcbase = (pSiS->scrnOffset * srcy) + (srcx * ((pScrn->bitsPerPixel+7)/8)); +#endif +#ifdef npitch + if(srcy >= 2048) { + srcbase = pSiS->scrnOffset * srcy; + srcy = 0; + } +#endif + if(y >= 2048) { + dstbase = pSiS->scrnOffset * y; + y = 0; + } + +#ifdef SISDUALHEAD + srcbase += HEADOFFSET; + dstbase += HEADOFFSET; +#endif + + SiSSetupSRCBase(srcbase) + SiSSetupDSTBase(dstbase) + + /* 315 series seem to treat the src pitch as + * a "drawing limit", but still (as 300 series) + * does not use it for incrementing the + * address pointer for the next scanline. ARGH! + */ + +#ifdef pitchdw + SiSSetupSRCPitch(pScrn->displayWidth/8) +#endif +#ifdef nopitch + SiSSetupSRCPitch(pScrn->displayWidth/8) + /* SiSSetupSRCPitch(1024/8) */ /* For test */ +#endif +#ifdef npitch + SiSSetupSRCPitch(pScrn->displayWidth/8) + /* SiSSetupSRCPitch(pSiS->scrnOffset) */ +#endif + + SiSSetupRect(w,h) + +#if 0 /* How do I implement the offset? Not this way, that's for sure.. */ + if (skipleft > 0) { + _x0 = x+skipleft; + _y0 = y; + _x1 = x+w; + _y1 = y+h; + SiSSetupClipLT(_x0, _y0); + SiSSetupClipRB(_x1, _y1); + SiSSetupCMDFlag(CLIPENABLE); + } +#endif +#ifdef pitchdw + SiSSetupSRCXY(newsrcx, newsrcy) +#endif +#ifdef nopitch + SiSSetupSRCXY(0,0) +#endif +#ifdef npitch + SiSSetupSRCXY(srcx, srcy) +#endif + + SiSSetupDSTXY(x,y) + + SiSDoCMD +#ifdef SISVRAMQ + /* We MUST sync here, there must not be 2 or more color expansion commands in the queue */ + SiSIdle +#endif +} +#endif + +/* ---- RENDER ---- */ #ifdef INCL_RENDER #ifdef RENDER @@ -1018,14 +1515,34 @@ SiSRemoveLinear(FBLinearPtr linear) { SISPtr pSiS = (SISPtr)(linear->devPrivate.ptr); - pSiS->AccelLinearScratch = NULL; + pSiS->AccelLinearScratch = NULL; +} + +static void +SiSRenderCallback(ScrnInfoPtr pScrn) +{ + SISPtr pSiS = SISPTR(pScrn); + + if((currentTime.milliseconds > pSiS->RenderTime) && pSiS->AccelLinearScratch) { + xf86FreeOffscreenLinear(pSiS->AccelLinearScratch); + pSiS->AccelLinearScratch = NULL; + } + + if(!pSiS->AccelLinearScratch) { + pSiS->RenderCallback = NULL; + } } +#define RENDER_DELAY 15000 + static Bool SiSAllocateLinear(ScrnInfoPtr pScrn, int sizeNeeded) { SISPtr pSiS = SISPTR(pScrn); + pSiS->RenderTime = currentTime.milliseconds + RENDER_DELAY; + pSiS->RenderCallback = SiSRenderCallback; + if(pSiS->AccelLinearScratch) { if(pSiS->AccelLinearScratch->size >= sizeNeeded) return TRUE; @@ -1056,15 +1573,15 @@ SiSSetupForCPUToScreenAlphaTexture(ScrnInfoPtr pScrn, int height, int flags) { SISPtr pSiS = SISPTR(pScrn); - int pitch, sizeNeeded, offset, i; + int pitch, sizeNeeded, offset; #ifdef ACCELDEBUG xf86DrvMsg(0, X_INFO, "AT: RGB %x %x %x, w %d h %d A-pitch %d\n", red, green, blue, width, height, alphaPitch); - xf86DrvMsg(0, X_INFO, " %02x %02x %02x %02x %02x %02x %02x %02x\n", + /* xf86DrvMsg(0, X_INFO, " %02x %02x %02x %02x %02x %02x %02x %02x\n", alphaPtr[0],alphaPtr[1],alphaPtr[2],alphaPtr[3], - alphaPtr[4],alphaPtr[5],alphaPtr[6],alphaPtr[7]); -#endif + alphaPtr[4],alphaPtr[5],alphaPtr[6],alphaPtr[7]); */ +#endif if(op != PictOpOver) return FALSE; @@ -1084,31 +1601,33 @@ SiSSetupForCPUToScreenAlphaTexture(ScrnInfoPtr pScrn, if(pScrn->bitsPerPixel == 32) offset <<= 1; +#ifdef SISVRAMQ + SiSSetupDSTColorDepth(pSiS->SiS310_AccelDepth); + SiSSetupSRCPitchDSTRect((pitch << 2), pSiS->scrnOffset, -1); + SiSSetupROP(RENDER_OP) + SiSSetupCMDFlag(ALPHA_BLEND | SRCVIDEO | A_PERPIXELALPHA) +#else + SiSSetupDSTColorDepth(pSiS->DstColor); + SiSSetupSRCPitch((pitch << 2)); + SiSSetupDSTRect(pSiS->scrnOffset, -1) + SiSSetupROP(RENDER_OP) + SiSSetupCMDFlag(ALPHA_BLEND | SRCVIDEO | A_PERPIXELALPHA | pSiS->SiS310_AccelDepth) +#endif + + if(pSiS->alphaBlitBusy) { + pSiS->alphaBlitBusy = FALSE; + SiSIdle + } + XAA_888_plus_PICT_a8_to_8888( (blue >> 8) | (green & 0xff00) | ((red & 0xff00) << 8), alphaPtr, alphaPitch, (CARD32*)(pSiS->FbBase + offset), pitch, width, height); - - /* "AGP base" - color depth depending value (see sis_vga.c) */ - SiSSetupDSTColorDepth(pSiS->DstColor); - /* SRC pitch */ - SiSSetupSRCPitch((pitch << 2)); - /* DST pitch and height (-1 for disabling merge-clipping) */ - SiSSetupDSTRect(pSiS->scrnOffset, -1) - /* Init CommandReg and set ROP */ - SiSSetupROP(RENDER_OP) - /* Set command */ - SiSSetupCMDFlag(ALPHA_BLEND | SRCVIDEO) - - /* Set some color depth depending value (see sis_vga.c) */ - SiSSetupCMDFlag(pSiS->SiS310_AccelDepth) - - /* THIS is the problem: The hardware does not - * support ARGB textures, but a static alpha - * value only. Makes the whole thing pretty - * useless. - */ - SiSSetupAlpha(0x99) + +#if 0 + /* For constant alpha, we need to do this and set A_CONSTANTALPHA instead */ + SiSSetupAlpha(0x99) +#endif return TRUE; } @@ -1125,7 +1644,7 @@ SiSSetupForCPUToScreenTexture(ScrnInfoPtr pScrn, #ifdef ACCELDEBUG xf86DrvMsg(0, X_INFO, "T: type %d op %d w %d h %d T-pitch %d\n", texType, op, width, height, texPitch); -#endif +#endif if(op != PictOpOver) return FALSE; @@ -1145,28 +1664,34 @@ SiSSetupForCPUToScreenTexture(ScrnInfoPtr pScrn, if(pScrn->bitsPerPixel == 32) offset <<= 1; - { +#ifdef SISVRAMQ + SiSSetupDSTColorDepth(pSiS->SiS310_AccelDepth); + SiSSetupSRCPitchDSTRect((pitch << 2), pSiS->scrnOffset, -1); + SiSSetupROP(RENDER_OP) + SiSSetupCMDFlag(ALPHA_BLEND | SRCVIDEO | A_PERPIXELALPHA) +#else + SiSSetupDSTColorDepth(pSiS->DstColor); + SiSSetupSRCPitch((pitch << 2)); + SiSSetupDSTRect(pSiS->scrnOffset, -1) + SiSSetupROP(RENDER_OP) + SiSSetupCMDFlag(ALPHA_BLEND | SRCVIDEO | A_PERPIXELALPHA | pSiS->SiS310_AccelDepth) +#endif + + { CARD8 *dst = (CARD8*)(pSiS->FbBase + offset); i = height; + + if(pSiS->alphaBlitBusy) { + pSiS->alphaBlitBusy = FALSE; + SiSIdle + } + while(i--) { memcpy(dst, texPtr, width << 2); texPtr += texPitch; dst += pitch << 2; } } - - /* "AGP base" - color depth depending value (see sis_vga.c) */ - SiSSetupDSTColorDepth(pSiS->DstColor); - /* SRC pitch */ - SiSSetupSRCPitch((pitch << 4)); - /* DST pitch and height (-1 for disabling merge-clipping) */ - SiSSetupDSTRect(pSiS->scrnOffset, -1) - /* Init CommandReg and set ROP */ - SiSSetupROP(RENDER_OP) - /* Set command */ - SiSSetupCMDFlag(ALPHA_BLEND | SRCVIDEO) - /* Set some color depth depending value (see sis_vga.c) */ - SiSSetupCMDFlag(pSiS->SiS310_AccelDepth) return TRUE; } @@ -1185,8 +1710,8 @@ SiSSubsequentCPUToScreenTexture(ScrnInfoPtr pScrn, srcbase <<= 1; #ifdef ACCELDEBUG - xf86DrvMsg(0, X_INFO, "!: o %x sx %d sy %d dx %d dy %d w %d h %d\n", - srcbase, src_x, src_y, dst_x, dst_y, width, height); + xf86DrvMsg(0, X_INFO, "FIRE: dx %d dy %d w %d h %d\n", + dst_x, dst_y, width, height); #endif dstbase = 0; @@ -1198,12 +1723,21 @@ SiSSubsequentCPUToScreenTexture(ScrnInfoPtr pScrn, srcbase += HEADOFFSET; dstbase += HEADOFFSET; #endif + +#ifdef SISVRAMQ + SiSCheckQueue(16 * 3) + SiSSetupSRCDSTBase(srcbase,dstbase); + SiSSetupSRCDSTXY(src_x, src_y, dst_x, dst_y) + SiSSetRectDoCMD(width,height) +#else SiSSetupSRCBase(srcbase); SiSSetupDSTBase(dstbase); SiSSetupRect(width, height) SiSSetupSRCXY(src_x, src_y) SiSSetupDSTXY(dst_x, dst_y) SiSDoCMD +#endif + pSiS->alphaBlitBusy = TRUE; } #endif #endif diff --git a/xc/programs/Xserver/hw/xfree86/drivers/sis/sis310_accel.h b/xc/programs/Xserver/hw/xfree86/drivers/sis/sis310_accel.h index d87e83a8b..64dfaaf1e 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/sis/sis310_accel.h +++ b/xc/programs/Xserver/hw/xfree86/drivers/sis/sis310_accel.h @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/sis310_accel.h,v 1.7 2003/06/28 14:03:13 twini Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/sis310_accel.h,v 1.9 2003/08/26 14:29:36 twini Exp $ */ /* * 2D Acceleration for SiS 315 and Xabre series * Definitions for the SIS engine communication. @@ -24,20 +24,21 @@ * PERFORMANCE OF THIS SOFTWARE. * * Based on sis300_accel.h + * 2003/08/18: Added VRAM queue support * * Author: Thomas Winischhofer <thomas@winischhofer.net> * */ -/* SiS310 engine commands */ +/* SiS315 and 330 engine commands */ #define BITBLT 0x00000000 /* Blit */ #define COLOREXP 0x00000001 /* Color expand */ -#define ENCOLOREXP 0x00000002 /* Enhanced color expand */ +#define ENCOLOREXP 0x00000002 /* Enhanced color expand (315 only?) */ #define MULTIPLE_SCANLINE 0x00000003 /* ? */ #define LINE 0x00000004 /* Draw line */ #define TRAPAZOID_FILL 0x00000005 /* Fill trapezoid */ #define TRANSPARENT_BITBLT 0x00000006 /* Transparent Blit */ -#define ALPHA_BLEND 0x00000007 /* Alpha blending BitBlt */ +#define ALPHA_BLEND 0x00000007 /* Alpha blended BitBlt */ #define A3D_FUNCTION 0x00000008 /* 3D command ? */ #define CLEAR_Z_BUFFER 0x00000009 /* ? */ #define GRADIENT_FILL 0x0000000A /* Gradient fill */ @@ -66,8 +67,11 @@ #define OPAQUE 0x00000000 #define TRANSPARENT 0x00100000 -/* Subfunctions for Alpha Blending BitBlt */ -#define A_UNKNOWN 0x00100000 /* (Blits solid?) */ +/* Subfunctions for Alpha Blended BitBlt */ +#define A_CONSTANTALPHA 0x00000000 +#define A_PERPIXELALPHA 0x00080000 +#define A_NODESTALPHA 0x00100000 +#define A_3DFULLSCENE 0x00180000 /* ? */ #define DSTAGP 0x02000000 @@ -75,14 +79,14 @@ /* Subfunctions for Color/Enhanced Color Expansion */ #define COLOR_TO_MONO 0x00100000 -#define AA_TEXT 0x00200000 +#define AA_TEXT 0x00200000 /* ? (hangs the engine) */ /* Line */ #define LINE_STYLE 0x00800000 #define NO_RESET_COUNTER 0x00400000 #define NO_LAST_PIXEL 0x00200000 -/* Trapezoid */ +/* Trapezoid (315 only?) */ #define T_XISMAJORL 0x00800000 /* X axis is driving axis (left) */ #define T_XISMAJORR 0x08000000 /* X axis is driving axis (right) */ #define T_L_Y_INC 0x00000020 /* left edge direction Y */ @@ -151,7 +155,11 @@ #define Q_READ_PTR 0x85C8 /* Current read pointer (?) */ #define Q_STATUS 0x85CC /* queue status */ -/* Macros to do useful things with the SIS 315 BitBLT engine */ +/* VRAM queue operation command definitions */ +#define SIS_SKPC_HEADER 0x16800000L +#define SIS_NIL_CMD 0x168F0000L + +/* Macros to do useful things with the SiS315/330 BitBLT engine */ /* Q_STATUS: bit 31 = 1: All engines idle and all queues empty @@ -167,46 +175,505 @@ bits 7:0: 2D counter 1 Where is the command queue length (current amount of commands the queue - can accept) on the 315 series? (The current implementation works, but only - as long as there is no 3D driver which uses the queue without your knowledge) + can accept) on the 315 series in MMIO mode? (The current implementation works, + but only as long as there is no 3D driver which uses the queue without your + knowledge) */ -#define CmdQueLen pSiS->cmdQueueLen +/* As sis_dri.c relocated the cmd-q len to the sarea, don't use it directly here */ +/* #define CmdQueLen pSiS->cmdQueueLen */ +#define CmdQueLen (*(pSiS->cmdQueueLenPtr)) + +#define SiSQEmpty \ + { \ + while( (MMIO_IN16(pSiS->IOBase, Q_STATUS+2) & 0x0400) != 0x0400) {}; \ + while( (MMIO_IN16(pSiS->IOBase, Q_STATUS+2) & 0x0400) != 0x0400) {}; \ + } + +#define SiSResetCmd pSiS->CommandReg = 0; + +#define SiSSetupCMDFlag(flags) pSiS->CommandReg |= (flags); + +/* --- VRAM mode --- */ + +#define SiSGetSwWP() (CARD32)(*(pSiS->cmdQ_SharedWritePort)) +#define SiSGetHwRP() (CARD32)(MMIO_IN32(pSiS->IOBase, Q_READ_PTR)) + +#define SiSSyncWP MMIO_OUT32(pSiS->IOBase, Q_WRITE_PTR, (CARD32(*(pSiS->cmdQ_SharedWritePort)))); + +#define SiSSetHwWP(p) \ + *(pSiS->cmdQ_SharedWritePort) = (p); \ + MMIO_OUT32(pSiS->IOBase, Q_WRITE_PTR, (p)); \ + +#define SiSSetSwWP(p) *(pSiS->cmdQ_SharedWritePort) = (p); + +#define SiSCheckQueue(amount) + +#if 0 + { \ + CARD32 mcurrent, i=0, ttt = SiSGetSwWP(); \ + if((ttt + amount) >= pSiS->cmdQueueSize) { \ + do { \ + mcurrent = MMIO_IN32(pSiS->IOBase, Q_READ_PTR); \ + i++; \ + } while((mcurrent > ttt) || (mcurrent < ((ttt + amount) & pSiS->cmdQueueSizeMask))); \ + } else { \ + do { \ + mcurrent = MMIO_IN32(pSiS->IOBase, Q_READ_PTR); \ + i++; \ + } while((mcurrent > ttt) && (mcurrent < (ttt + amount))); \ + } \ + /* xf86DrvMsg(0, X_INFO, "ttt %x current %x, i %d\n", ttt, MMIO_IN32(pSiS->IOBase, Q_READ_PTR), i); */ \ + } +#endif + +#define SiSUpdateQueue \ + ttt += 16; \ + ttt &= pSiS->cmdQueueSizeMask; \ + if(!ttt) { \ + while(MMIO_IN32(pSiS->IOBase, Q_READ_PTR) < pSiS->cmdQueueSize_div4) {} \ + } else if(ttt == pSiS->cmdQueueSize_div4) { \ + CARD32 temppp; \ + do { \ + temppp = MMIO_IN32(pSiS->IOBase, Q_READ_PTR); \ + if(temppp < ttt || temppp > pSiS->cmdQueueSize_div2) break; \ + } while(1); \ + } else if(ttt == pSiS->cmdQueueSize_div2) { \ + CARD32 temppp; \ + do { \ + temppp = MMIO_IN32(pSiS->IOBase, Q_READ_PTR); \ + if(temppp < pSiS->cmdQueueSize_div2 || temppp > pSiS->cmdQueueSize_4_3) break; \ + } while(1); \ + } else if(ttt == pSiS->cmdQueueSize_4_3) { \ + while(MMIO_IN32(pSiS->IOBase, Q_READ_PTR) > ttt) {} \ + } + +#define SiSNILandUpdateSWQueue \ + *(CARD32 *)(tt + 8) = (CARD32)(SIS_NIL_CMD); \ + *(CARD32 *)(tt + 12) = (CARD32)(SIS_NIL_CMD); \ + SiSUpdateQueue; \ + SiSSetSwWP(ttt); + +#ifdef SISVRAMQ + +#define SiSIdle \ + { \ + while( (MMIO_IN16(pSiS->IOBase, Q_STATUS+2) & 0x8000) != 0x8000) {}; \ + while( (MMIO_IN16(pSiS->IOBase, Q_STATUS+2) & 0x8000) != 0x8000) {}; \ + } + +#define SiSSetupSRCDSTBase(srcbase,dstbase) \ + { \ + CARD32 ttt = SiSGetSwWP(); \ + CARD32 tt = (CARD32)pSiS->cmdQueueBase + ttt; \ + *(CARD32 *)(tt) = (CARD32)(SIS_SKPC_HEADER + SRC_ADDR); \ + *(CARD32 *)(tt + 4) = (CARD32)(srcbase); \ + *(CARD32 *)(tt + 8) = (CARD32)(SIS_SKPC_HEADER + DST_ADDR); \ + *(CARD32 *)(tt +12) = (CARD32)(dstbase); \ + SiSUpdateQueue \ + SiSSetSwWP(ttt); \ + } + +#define SiSSetupSRCDSTXY(sx,sy,dx,dy) \ + { \ + CARD32 ttt = SiSGetSwWP(); \ + CARD32 tt = (CARD32)pSiS->cmdQueueBase + ttt; \ + *(CARD32 *)(tt) = (CARD32)(SIS_SKPC_HEADER + SRC_Y); \ + *(CARD32 *)(tt + 4) = (CARD32)((sx)<<16 | (sy)); \ + *(CARD32 *)(tt + 8) = (CARD32)(SIS_SKPC_HEADER + DST_Y); \ + *(CARD32 *)(tt +12) = (CARD32)((dx)<<16 | (dy)); \ + SiSUpdateQueue \ + SiSSetSwWP(ttt); \ + } + +#define SiSSetupDSTXYRect(x,y,w,h) \ + { \ + CARD32 ttt = SiSGetSwWP(); \ + CARD32 tt = (CARD32)pSiS->cmdQueueBase + ttt; \ + *(CARD32 *)(tt) = (CARD32)(SIS_SKPC_HEADER + DST_Y); \ + *(CARD32 *)(tt + 4) = (CARD32)((x)<<16 | (y)); \ + *(CARD32 *)(tt + 8) = (CARD32)(SIS_SKPC_HEADER + RECT_WIDTH); \ + *(CARD32 *)(tt +12) = (CARD32)((h)<<16 | (w)); \ + SiSUpdateQueue \ + SiSSetSwWP(ttt); \ + } + +#define SiSSetupSRCPitchDSTRect(pitch,x,y) \ + { \ + CARD32 ttt = SiSGetSwWP(); \ + CARD32 tt = (CARD32)pSiS->cmdQueueBase + ttt; \ + *(CARD32 *)(tt) = (CARD32)(SIS_SKPC_HEADER + SRC_PITCH); \ + *(CARD32 *)(tt + 4) = (CARD32)(pitch); \ + *(CARD32 *)(tt + 8) = (CARD32)(SIS_SKPC_HEADER + DST_PITCH); \ + *(CARD32 *)(tt +12) = (CARD32)((y)<<16 | (x)); \ + SiSUpdateQueue \ + SiSSetSwWP(ttt); \ + } + +#define SiSSetupSRCBase(base) \ + { \ + CARD32 ttt = SiSGetSwWP(); \ + CARD32 tt = (CARD32)pSiS->cmdQueueBase + ttt; \ + *(CARD32 *)(tt) = (CARD32)(SIS_SKPC_HEADER + SRC_ADDR); \ + *(CARD32 *)(tt + 4) = (CARD32)(base); \ + SiSNILandUpdateSWQueue \ + } + +#define SiSSetupSRCPitch(pitch) \ + { \ + CARD32 ttt = SiSGetSwWP(); \ + CARD32 tt = (CARD32)pSiS->cmdQueueBase + ttt; \ + *(CARD32 *)(tt) = (CARD32)(SIS_SKPC_HEADER + SRC_PITCH); \ + *(CARD32 *)(tt + 4) = (CARD32)(pitch); \ + SiSNILandUpdateSWQueue \ + } + +#define SiSSetupSRCXY(x,y) \ + { \ + CARD32 ttt = SiSGetSwWP(); \ + CARD32 tt = (CARD32)pSiS->cmdQueueBase + ttt; \ + *(CARD32 *)(tt) = (CARD32)(SIS_SKPC_HEADER + SRC_Y); \ + *(CARD32 *)(tt + 4) = (CARD32)((x)<<16 | (y)); \ + SiSNILandUpdateSWQueue \ + } + +#define SiSSetupDSTBase(base) \ + { \ + CARD32 ttt = SiSGetSwWP(); \ + CARD32 tt = (CARD32)pSiS->cmdQueueBase + ttt; \ + *(CARD32 *)(tt) = (CARD32)(SIS_SKPC_HEADER + DST_ADDR); \ + *(CARD32 *)(tt + 4) = (CARD32)(base); \ + SiSNILandUpdateSWQueue \ + } + +#define SiSSetupDSTXY(x,y) \ + { \ + CARD32 ttt = SiSGetSwWP(); \ + CARD32 tt = (CARD32)pSiS->cmdQueueBase + ttt; \ + *(CARD32 *)(tt) = (CARD32)(SIS_SKPC_HEADER + DST_Y); \ + *(CARD32 *)(tt + 4) = (CARD32)((x)<<16 | (y)); \ + SiSNILandUpdateSWQueue \ + } + +#define SiSSetupDSTRect(x,y) \ + { \ + CARD32 ttt = SiSGetSwWP(); \ + CARD32 tt = (CARD32)pSiS->cmdQueueBase + ttt; \ + *(CARD32 *)(tt) = (CARD32)(SIS_SKPC_HEADER + DST_PITCH); \ + *(CARD32 *)(tt + 4) = (CARD32)((y)<<16 | (x)); \ + SiSNILandUpdateSWQueue \ + } + +#define SiSSetupDSTColorDepth(bpp) \ + pSiS->CommandReg = (((CARD32)(bpp)) & (GENMASK(17:16))); + +#define SiSSetupPATFGDSTRect(color,x,y) \ + { \ + CARD32 ttt = SiSGetSwWP(); \ + CARD32 tt = (CARD32)pSiS->cmdQueueBase + ttt; \ + *(CARD32 *)(tt) = (CARD32)(SIS_SKPC_HEADER + PAT_FGCOLOR); \ + *(CARD32 *)(tt + 4) = (CARD32)(color); \ + *(CARD32 *)(tt + 8) = (CARD32)(SIS_SKPC_HEADER + DST_PITCH); \ + *(CARD32 *)(tt +12) = (CARD32)((y)<<16 | (x)); \ + SiSUpdateQueue \ + SiSSetSwWP(ttt); \ + } + +#define SiSSetupSRCFGDSTRect(color,x,y) \ + { \ + CARD32 ttt = SiSGetSwWP(); \ + CARD32 tt = (CARD32)pSiS->cmdQueueBase + ttt; \ + *(CARD32 *)(tt) = (CARD32)(SIS_SKPC_HEADER + SRC_FGCOLOR); \ + *(CARD32 *)(tt + 4) = (CARD32)(color); \ + *(CARD32 *)(tt + 8) = (CARD32)(SIS_SKPC_HEADER + DST_PITCH); \ + *(CARD32 *)(tt +12) = (CARD32)((y)<<16 | (x)); \ + SiSUpdateQueue \ + SiSSetSwWP(ttt); \ + } + +#define SiSSetupRectSRCPitch(w,h,pitch) \ + { \ + CARD32 ttt = SiSGetSwWP(); \ + CARD32 tt = (CARD32)pSiS->cmdQueueBase + ttt; \ + *(CARD32 *)(tt) = (CARD32)(SIS_SKPC_HEADER + RECT_WIDTH); \ + *(CARD32 *)(tt + 4) = (CARD32)((h)<<16 | (w)); \ + *(CARD32 *)(tt + 8) = (CARD32)(SIS_SKPC_HEADER + SRC_PITCH); \ + *(CARD32 *)(tt +12) = (CARD32)(pitch); \ + SiSUpdateQueue \ + SiSSetSwWP(ttt); \ + } + +#define SiSSetupRect(w,h) \ + { \ + CARD32 ttt = SiSGetSwWP(); \ + CARD32 tt = (CARD32)pSiS->cmdQueueBase + ttt; \ + *(CARD32 *)(tt) = (CARD32)(SIS_SKPC_HEADER + RECT_WIDTH); \ + *(CARD32 *)(tt + 4) = (CARD32)((h)<<16 | (w)); \ + SiSNILandUpdateSWQueue \ + } + +#define SiSSetupPATFG(color) \ + { \ + CARD32 ttt = SiSGetSwWP(); \ + CARD32 tt = (CARD32)pSiS->cmdQueueBase + ttt; \ + *(CARD32 *)(tt) = (CARD32)(SIS_SKPC_HEADER + PAT_FGCOLOR); \ + *(CARD32 *)(tt + 4) = (CARD32)(color); \ + SiSNILandUpdateSWQueue \ + } + +#define SiSSetupPATBG(color) \ + { \ + CARD32 ttt = SiSGetSwWP(); \ + CARD32 tt = (CARD32)pSiS->cmdQueueBase + ttt; \ + *(CARD32 *)(tt) = (CARD32)(SIS_SKPC_HEADER + PAT_BGCOLOR); \ + *(CARD32 *)(tt + 4) = (CARD32)(color); \ + SiSNILandUpdateSWQueue \ + } + +#define SiSSetupSRCFG(color) \ + { \ + CARD32 ttt = SiSGetSwWP(); \ + CARD32 tt = (CARD32)pSiS->cmdQueueBase + ttt; \ + *(CARD32 *)(tt) = (CARD32)(SIS_SKPC_HEADER + SRC_FGCOLOR); \ + *(CARD32 *)(tt + 4) = (CARD32)(color); \ + SiSNILandUpdateSWQueue \ + } -/* TW: FIXME: CmdQueLen is... where....? */ +#define SiSSetupSRCBG(color) \ + { \ + CARD32 ttt = SiSGetSwWP(); \ + CARD32 tt = (CARD32)pSiS->cmdQueueBase + ttt; \ + *(CARD32 *)(tt) = (CARD32)(SIS_SKPC_HEADER + SRC_BGCOLOR); \ + *(CARD32 *)(tt + 4) = (CARD32)(color); \ + SiSNILandUpdateSWQueue \ + } + +#define SiSSetupSRCTrans(color) \ + { \ + CARD32 ttt = SiSGetSwWP(); \ + CARD32 tt = (CARD32)pSiS->cmdQueueBase + ttt; \ + *(CARD32 *)(tt) = (CARD32)(SIS_SKPC_HEADER + TRANS_SRC_KEY_HIGH); \ + *(CARD32 *)(tt + 4) = (CARD32)(color); \ + *(CARD32 *)(tt + 8) = (CARD32)(SIS_SKPC_HEADER + TRANS_SRC_KEY_LOW); \ + *(CARD32 *)(tt +12) = (CARD32)(color); \ + SiSUpdateQueue \ + SiSSetSwWP(ttt); \ + } + +#define SiSSetupDSTTrans(color) \ + { \ + CARD32 ttt = SiSGetSwWP(); \ + CARD32 tt = (CARD32)pSiS->cmdQueueBase + ttt; \ + *(CARD32 *)(tt) = (CARD32)(SIS_SKPC_HEADER + TRANS_DST_KEY_HIGH); \ + *(CARD32 *)(tt + 4) = (CARD32)(color); \ + *(CARD32 *)(tt + 8) = (CARD32)(SIS_SKPC_HEADER + TRANS_DST_KEY_LOW); \ + *(CARD32 *)(tt +12) = (CARD32)(color); \ + SiSUpdateQueue \ + SiSSetSwWP(ttt); \ + } + +#define SiSSetupMONOPAT(p0,p1) \ + { \ + CARD32 ttt = SiSGetSwWP(); \ + CARD32 tt = (CARD32)pSiS->cmdQueueBase + ttt; \ + *(CARD32 *)(tt) = (CARD32)(SIS_SKPC_HEADER + MONO_MASK); \ + *(CARD32 *)(tt + 4) = (CARD32)(p0); \ + *(CARD32 *)(tt + 8) = (CARD32)(SIS_SKPC_HEADER + MONO_MASK + 4); \ + *(CARD32 *)(tt +12) = (CARD32)(p1); \ + SiSUpdateQueue \ + SiSSetSwWP(ttt); \ + } + +#define SiSSetupClip(left,top,right,bottom) \ + { \ + CARD32 ttt = SiSGetSwWP(); \ + CARD32 tt = (CARD32)pSiS->cmdQueueBase + ttt; \ + *(CARD32 *)(tt) = (CARD32)(SIS_SKPC_HEADER + LEFT_CLIP); \ + *(CARD32 *)(tt + 4) = (CARD32)(((left) & 0xFFFF) | (top)<<16); \ + *(CARD32 *)(tt + 8) = (CARD32)(SIS_SKPC_HEADER + RIGHT_CLIP); \ + *(CARD32 *)(tt +12) = (CARD32)(((right) & 0xFFFF) | (bottom)<<16); \ + SiSUpdateQueue \ + SiSSetSwWP(ttt); \ + } + +#define SiSSetupDSTBaseDoCMD(base) \ + { \ + CARD32 ttt = SiSGetSwWP(); \ + CARD32 tt = (CARD32)pSiS->cmdQueueBase + ttt; \ + *(CARD32 *)(tt) = (CARD32)(SIS_SKPC_HEADER + DST_ADDR); \ + *(CARD32 *)(tt + 4) = (CARD32)(base); \ + *(CARD32 *)(tt + 8) = (CARD32)(SIS_SKPC_HEADER + COMMAND_READY); \ + *(CARD32 *)(tt +12) = (CARD32)(pSiS->CommandReg); \ + SiSUpdateQueue \ + SiSSetHwWP(ttt); \ + } + +#define SiSSetRectDoCMD(w,h) \ + { \ + CARD32 ttt = SiSGetSwWP(); \ + CARD32 tt = (CARD32)pSiS->cmdQueueBase + ttt; \ + *(CARD32 *)(tt) = (CARD32)(SIS_SKPC_HEADER + RECT_WIDTH); \ + *(CARD32 *)(tt + 4) = (CARD32)((h)<<16 | (w)); \ + *(CARD32 *)(tt + 8) = (CARD32)(SIS_SKPC_HEADER + COMMAND_READY); \ + *(CARD32 *)(tt +12) = (CARD32)(pSiS->CommandReg); \ + SiSUpdateQueue \ + SiSSetHwWP(ttt); \ + } + +#define SiSSetupROP(rop) \ + pSiS->CommandReg |= (rop) << 8; + +#define SiSDoCMD \ + { \ + CARD32 ttt = SiSGetSwWP(); \ + CARD32 tt = (CARD32)pSiS->cmdQueueBase + ttt; \ + *(CARD32 *)(tt) = (CARD32)(SIS_SKPC_HEADER + COMMAND_READY); \ + *(CARD32 *)(tt + 4) = (CARD32)(pSiS->CommandReg); \ + *(CARD32 *)(tt + 8) = (CARD32)(SIS_NIL_CMD); \ + *(CARD32 *)(tt + 12) = (CARD32)(SIS_NIL_CMD); \ + SiSUpdateQueue \ + SiSSetHwWP(ttt); \ + } + +/* Line */ + +#define SiSSetupX0Y0X1Y1(x1,y1,x2,y2) \ + { \ + CARD32 ttt = SiSGetSwWP(); \ + CARD32 tt = (CARD32)pSiS->cmdQueueBase + ttt; \ + *(CARD32 *)(tt) = (CARD32)(SIS_SKPC_HEADER + LINE_X0); \ + *(CARD32 *)(tt + 4) = (CARD32)((y1)<<16 | (x1)); \ + *(CARD32 *)(tt + 8) = (CARD32)(SIS_SKPC_HEADER + LINE_X1); \ + *(CARD32 *)(tt +12) = (CARD32)((y2)<<16 | (x2)); \ + SiSUpdateQueue \ + SiSSetSwWP(ttt); \ + } + +#define SiSSetupX0Y0(x,y) \ + { \ + CARD32 ttt = SiSGetSwWP(); \ + CARD32 tt = (CARD32)pSiS->cmdQueueBase + ttt; \ + *(CARD32 *)(tt) = (CARD32)(SIS_SKPC_HEADER + LINE_X0); \ + *(CARD32 *)(tt + 4) = (CARD32)((y)<<16 | (x)); \ + SiSNILandUpdateSWQueue \ + } + +#define SiSSetupX1Y1(x,y) \ + { \ + CARD32 ttt = SiSGetSwWP(); \ + CARD32 tt = (CARD32)pSiS->cmdQueueBase + ttt; \ + *(CARD32 *)(tt) = (CARD32)(SIS_SKPC_HEADER + LINE_X1); \ + *(CARD32 *)(tt + 4) = (CARD32)((y)<<16 | (x)); \ + SiSNILandUpdateSWQueue \ + } + +#define SiSSetupLineCountPeriod(c, p) \ + { \ + CARD32 ttt = SiSGetSwWP(); \ + CARD32 tt = (CARD32)pSiS->cmdQueueBase + ttt; \ + *(CARD32 *)(tt) = (CARD32)(SIS_SKPC_HEADER + LINE_COUNT); \ + *(CARD32 *)(tt + 4) = (CARD32)((p) << 16 | (c)); \ + SiSNILandUpdateSWQueue \ + } + +#define SiSSetupStyle(ls,hs) \ + { \ + CARD32 ttt = SiSGetSwWP(); \ + CARD32 tt = (CARD32)pSiS->cmdQueueBase + ttt; \ + *(CARD32 *)(tt) = (CARD32)(SIS_SKPC_HEADER + LINE_STYLE_0); \ + *(CARD32 *)(tt + 4) = (CARD32)(ls); \ + *(CARD32 *)(tt + 8) = (CARD32)(SIS_SKPC_HEADER + LINE_STYLE_1); \ + *(CARD32 *)(tt +12) = (CARD32)(hs); \ + SiSUpdateQueue \ + SiSSetSwWP(ttt); \ + } + +/* Trapezoid */ + +#define SiSSetupYHLR(y,h,left,right) \ + { \ + CARD32 ttt = SiSGetSwWP(); \ + CARD32 tt = (CARD32)pSiS->cmdQueueBase + ttt; \ + *(CARD32 *)(tt) = (CARD32)(SIS_SKPC_HEADER + TRAP_YH); \ + *(CARD32 *)(tt + 4) = (CARD32)((y)<<16 | (h)); \ + *(CARD32 *)(tt + 8) = (CARD32)(SIS_SKPC_HEADER + TRAP_LR); \ + *(CARD32 *)(tt +12) = (CARD32)((right)<<16 | (left)); \ + SiSUpdateQueue \ + SiSSetSwWP(ttt); \ + } + + +#define SiSSetupdLdR(dxL,dyL,fxR,dyR) \ + { \ + CARD32 ttt = SiSGetSwWP(); \ + CARD32 tt = (CARD32)pSiS->cmdQueueBase + ttt; \ + *(CARD32 *)(tt) = (CARD32)(SIS_SKPC_HEADER + TRAP_DL); \ + *(CARD32 *)(tt + 4) = (CARD32)((dyL)<<16 | (dxL)); \ + *(CARD32 *)(tt + 8) = (CARD32)(SIS_SKPC_HEADER + TRAP_DR); \ + *(CARD32 *)(tt +12) = (CARD32)((dyR)<<16 | (dxR)); \ + SiSUpdateQueue \ + SiSSetSwWP(ttt); \ + } + +#define SiSSetupELER(eL,eR) \ + { \ + CARD32 ttt = SiSGetSwWP(); \ + CARD32 tt = (CARD32)pSiS->cmdQueueBase + ttt; \ + *(CARD32 *)(tt) = (CARD32)(SIS_SKPC_HEADER + TRAP_EL); \ + *(CARD32 *)(tt + 4) = (CARD32)(eL); \ + *(CARD32 *)(tt + 8) = (CARD32)(SIS_SKPC_HEADER + TRAP_ER); \ + *(CARD32 *)(tt +12) = (CARD32)(eR); \ + SiSUpdateQueue \ + SiSSetSwWP(ttt); \ + } + +/* Alpha blended BitBlt (alpha = 8 bit) */ + +#define SiSSetPattern(num, value) \ + { \ + CARD32 ttt = SiSGetSwWP(); \ + CARD32 tt = (CARD32)pSiS->cmdQueueBase + ttt; \ + *(CARD32 *)(tt) = (CARD32)(SIS_SKPC_HEADER + (PATTERN_REG + (num * 4))); \ + *(CARD32 *)(tt + 4) = (CARD32)(value); \ + SiSNILandUpdateSWQueue \ + } + +#endif /* VRAM mode */ + +/* ---- MMIO mode ---- */ + +#ifndef SISVRAMQ + +/* FIXME: CmdQueLen is... where....? */ /* We assume a length of 4 bytes per command; since 512K of * of RAM are allocated, the number of commands is easily - * calculated (assuming that there is no 3D support yet) - * We calculate it very cautiously (128K only) and let the - * rest to the (never?)-to-come (?) 3D engine. (The 3D engine - * can use a similar technique, using the remaining 384K, - * hence a queue overflow is avoided) + * calculated (and written to the address pointed to by + * CmdQueueLenPtr, since sis_dri.c relocates this) * UPDATE: using the command queue without syncing totally * (ie assuming a QueueLength of 0) decreases system latency * dramatically on the integrated chipsets (sound gets interrupted, * etc.). We now sync every time... this is a little slower, - * but it keeps the rest of the box somewhat alive... + * but it keeps the rest of the box somewhat alive. */ #define SiSIdle \ { \ if(pSiS->ChipFlags & SiSCF_Integrated) { \ - /* CmdQueLen = ((128 * 1024) / 4) - 64; - decreases system latecy dramatically */ \ CmdQueLen = 0; \ } else { \ - CmdQueLen = ((128 * 1024) / 4) - 64; \ + CmdQueLen = ((512 * 1024) / 4) - 64; \ } \ while( (MMIO_IN16(pSiS->IOBase, Q_STATUS+2) & 0x8000) != 0x8000) {}; \ while( (MMIO_IN16(pSiS->IOBase, Q_STATUS+2) & 0x8000) != 0x8000) {}; \ } #define SiSSetupSRCBase(base) \ - if (CmdQueLen <= 0) SiSIdle;\ - MMIO_OUT32(pSiS->IOBase, SRC_ADDR, base);\ + if (CmdQueLen <= 0) SiSIdle; \ + MMIO_OUT32(pSiS->IOBase, SRC_ADDR, base); \ CmdQueLen--; #define SiSSetupSRCPitch(pitch) \ - if (CmdQueLen <= 0) SiSIdle;\ - MMIO_OUT16(pSiS->IOBase, SRC_PITCH, pitch);\ + if (CmdQueLen <= 0) SiSIdle; \ + MMIO_OUT16(pSiS->IOBase, SRC_PITCH, pitch); \ CmdQueLen--; #define SiSSetupSRCXY(x,y) \ @@ -235,69 +702,68 @@ CmdQueLen--; #define SiSSetupRect(w,h) \ - if (CmdQueLen <= 0) SiSIdle;\ + if(CmdQueLen <= 0) SiSIdle;\ MMIO_OUT32(pSiS->IOBase, RECT_WIDTH, (h)<<16 | (w) );\ CmdQueLen--; #define SiSSetupPATFG(color) \ - if (CmdQueLen <= 0) SiSIdle;\ + if(CmdQueLen <= 0) SiSIdle;\ MMIO_OUT32(pSiS->IOBase, PAT_FGCOLOR, color);\ CmdQueLen--; #define SiSSetupPATBG(color) \ - if (CmdQueLen <= 0) SiSIdle;\ + if(CmdQueLen <= 0) SiSIdle;\ MMIO_OUT32(pSiS->IOBase, PAT_BGCOLOR, color);\ CmdQueLen--; #define SiSSetupSRCFG(color) \ - if (CmdQueLen <= 0) SiSIdle;\ + if(CmdQueLen <= 0) SiSIdle;\ MMIO_OUT32(pSiS->IOBase, SRC_FGCOLOR, color);\ CmdQueLen--; #define SiSSetupSRCBG(color) \ - if (CmdQueLen <= 0) SiSIdle;\ - MMIO_OUT32(pSiS->IOBase, SRC_BGCOLOR, color);\ + if(CmdQueLen <= 0) SiSIdle; \ + MMIO_OUT32(pSiS->IOBase, SRC_BGCOLOR, color); \ CmdQueLen--; #define SiSSetupSRCTrans(color) \ - if (CmdQueLen <= 1) SiSIdle;\ + if(CmdQueLen <= 1) SiSIdle;\ MMIO_OUT32(pSiS->IOBase, TRANS_SRC_KEY_HIGH, color);\ MMIO_OUT32(pSiS->IOBase, TRANS_SRC_KEY_LOW, color);\ CmdQueLen -= 2; #define SiSSetupDSTTrans(color) \ - if (CmdQueLen <= 1) SiSIdle;\ + if(CmdQueLen <= 1) SiSIdle;\ MMIO_OUT32(pSiS->IOBase, TRANS_DST_KEY_HIGH, color); \ MMIO_OUT32(pSiS->IOBase, TRANS_DST_KEY_LOW, color); \ CmdQueLen -= 2; #define SiSSetupMONOPAT(p0,p1) \ - if (CmdQueLen <= 1) SiSIdle;\ + if(CmdQueLen <= 1) SiSIdle;\ MMIO_OUT32(pSiS->IOBase, MONO_MASK, p0);\ MMIO_OUT32(pSiS->IOBase, MONO_MASK+4, p1);\ CmdQueLen=CmdQueLen-2; #define SiSSetupClipLT(left,top) \ - if (CmdQueLen <= 0) SiSIdle;\ - MMIO_OUT32(pSiS->IOBase, LEFT_CLIP, ((left) & 0xFFFF) | (top)<<16 );\ + if(CmdQueLen <= 0) SiSIdle;\ + MMIO_OUT32(pSiS->IOBase, LEFT_CLIP, ((left) & 0xFFFF) | (top)<<16); \ CmdQueLen--; #define SiSSetupClipRB(right,bottom) \ - if (CmdQueLen <= 0) SiSIdle;\ - MMIO_OUT32(pSiS->IOBase, RIGHT_CLIP, ((right) & 0xFFFF) | (bottom)<<16 );\ + if(CmdQueLen <= 0) SiSIdle; \ + MMIO_OUT32(pSiS->IOBase, RIGHT_CLIP, ((right) & 0xFFFF) | (bottom)<<16); \ CmdQueLen--; #define SiSSetupROP(rop) \ pSiS->CommandReg = (rop) << 8; -#define SiSSetupCMDFlag(flags) \ - pSiS->CommandReg |= (flags); - #define SiSDoCMD \ if (CmdQueLen <= 1) SiSIdle;\ MMIO_OUT32(pSiS->IOBase, COMMAND_READY, pSiS->CommandReg); \ MMIO_OUT32(pSiS->IOBase, FIRE_TRIGGER, 0); \ - CmdQueLen=CmdQueLen-2; + CmdQueLen -= 2; + +/* Line */ #define SiSSetupX0Y0(x,y) \ if (CmdQueLen <= 0) SiSIdle;\ @@ -330,45 +796,50 @@ CmdQueLen--; /* Trapezoid */ + #define SiSSetupYH(y,h) \ if (CmdQueLen <= 0) SiSIdle;\ MMIO_OUT32(pSiS->IOBase, TRAP_YH, (y)<<16 | (h) );\ - CmdQueLen --; + CmdQueLen--; #define SiSSetupLR(left,right) \ if (CmdQueLen <= 0) SiSIdle;\ MMIO_OUT32(pSiS->IOBase, TRAP_LR, (right)<<16 | (left) );\ - CmdQueLen --; + CmdQueLen--; #define SiSSetupdL(dxL,dyL) \ if (CmdQueLen <= 0) SiSIdle;\ MMIO_OUT32(pSiS->IOBase, TRAP_DL, (dyL)<<16 | (dxL) );\ - CmdQueLen --; + CmdQueLen--; #define SiSSetupdR(dxR,dyR) \ if (CmdQueLen <= 0) SiSIdle;\ MMIO_OUT32(pSiS->IOBase, TRAP_DR, (dyR)<<16 | (dxR) );\ - CmdQueLen --; + CmdQueLen--; #define SiSSetupEL(eL) \ if (CmdQueLen <= 0) SiSIdle;\ MMIO_OUT32(pSiS->IOBase, TRAP_EL, eL);\ - CmdQueLen --; + CmdQueLen--; #define SiSSetupER(eR) \ if (CmdQueLen <= 0) SiSIdle;\ MMIO_OUT32(pSiS->IOBase, TRAP_ER, eR);\ - CmdQueLen --; + CmdQueLen--; + +/* Alpha blended BitBlt (alpha = 8 bit) */ -/* Alpha blending BitBlt (alpha = 8 bit) */ #define SiSSetupAlpha(alpha) \ if (CmdQueLen <= 0) SiSIdle;\ MMIO_OUT32(pSiS->IOBase, ALPHA_ALPHA, alpha);\ CmdQueLen--; -/* Set Pattern register */ +/* Set Pattern register */ + #define SiSSetPattern(num, value) \ if (CmdQueLen <= 0) SiSIdle; \ MMIO_OUT32(pSiS->IOBase, (PATTERN_REG + (num * 4)), value); \ CmdQueLen--; +#endif /* MMIO mode */ + diff --git a/xc/programs/Xserver/hw/xfree86/drivers/sis/sis_dac.c b/xc/programs/Xserver/hw/xfree86/drivers/sis/sis_dac.c index 593aeb782..d9f5852ea 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/sis/sis_dac.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/sis/sis_dac.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/sis_dac.c,v 1.37 2003/08/07 12:52:23 twini Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/sis_dac.c,v 1.38 2003/08/23 10:25:19 twini Exp $ */ /* * DAC helper functions (Save/Restore, MemClk, etc) * @@ -738,7 +738,7 @@ SiS315Save(ScrnInfoPtr pScrn, SISRegPtr sisReg) #endif } - /* TW: Save command queue location */ + /* Save command queue location */ sisReg->sisMMIO85C0 = MMIO_IN32(pSiS->IOBase, 0x85C0); /* Save CR registers */ @@ -819,6 +819,15 @@ SiS315Restore(ScrnInfoPtr pScrn, SISRegPtr sisReg) while ( (MMIO_IN32(pSiS->IOBase, 0x85CC) & 0x80000000) != 0x80000000){}; } + /* We reset the command queue before restoring. + * This might be required because we never know what + * console driver (like the kernel framebuffer driver) + * or application is running and which queue mode it + * uses. + */ + outSISIDXREG(SISSR, 0x27, 0x1F); + outSISIDXREG(SISSR, 0x26, 0x01); + /* Restore extended CR registers */ for (i = 0x19; i < 0x5C; i++) { outSISIDXREG(SISCR, i, sisReg->sisRegs3D4[i]); @@ -832,15 +841,6 @@ SiS315Restore(ScrnInfoPtr pScrn, SISRegPtr sisReg) outSISIDXREG(SISSR, 0x20, sisReg->sisRegs3C4[0x20]); } - /* We reset the command queue before restoring. - * This might be required because we never know what - * console driver (like the kernel framebuffer driver) - * or application is running and which queue mode it - * uses. - */ - outSISIDXREG(SISSR, 0x27, 0x1F); - outSISIDXREG(SISSR, 0x26, 0x01); - /* Restore extended SR registers */ for (i = 0x06; i <= 0x3F; i++) { outSISIDXREG(SISSR, i, sisReg->sisRegs3C4[i]); @@ -876,8 +876,10 @@ SiS315Restore(ScrnInfoPtr pScrn, SISRegPtr sisReg) outSISIDXREG(SISSR,0x2d,0x01); } +#ifndef SISVRAMQ /* Initialize read/write pointer for command queue */ MMIO_OUT32(pSiS->IOBase, 0x85C4, MMIO_IN32(pSiS->IOBase, 0x85C8)); +#endif /* Restore queue location */ MMIO_OUT32(pSiS->IOBase, 0x85C0, sisReg->sisMMIO85C0); diff --git a/xc/programs/Xserver/hw/xfree86/drivers/sis/sis_dri.c b/xc/programs/Xserver/hw/xfree86/drivers/sis/sis_dri.c index c689f1e5c..1c129cc00 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/sis/sis_dri.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/sis/sis_dri.c @@ -1,8 +1,11 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/sis_dri.c,v 1.28 2003/05/21 15:15:03 twini Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/sis_dri.c,v 1.30 2003/08/23 15:34:37 twini Exp $ */ /* - * DRI wrapper for 300, 540, 630, 730 + * DRI wrapper for 300 and 315 series + * + * Preliminary 315/330 support by Thomas Winischhofer * * Taken and modified from tdfx_dri.c, mga_dri.c + * */ #include "xf86.h" @@ -22,21 +25,19 @@ #include "xf86drmCompat.h" #endif -/* TW: Idle function for 300 series */ +/* Idle function for 300 series */ #define BR(x) (0x8200 | (x) << 2) #define SiSIdle \ while((MMIO_IN16(pSiS->IOBase, BR(16)+2) & 0xE000) != 0xE000){}; \ while((MMIO_IN16(pSiS->IOBase, BR(16)+2) & 0xE000) != 0xE000){}; \ MMIO_IN16(pSiS->IOBase, 0x8240); -/* TW: Idle function for 315 series */ +/* Idle function for 315/330 series */ #define Q_STATUS 0x85CC #define SiS315Idle \ { \ while( (MMIO_IN16(pSiS->IOBase, Q_STATUS+2) & 0x8000) != 0x8000){}; \ while( (MMIO_IN16(pSiS->IOBase, Q_STATUS+2) & 0x8000) != 0x8000){}; \ - while( (MMIO_IN16(pSiS->IOBase, Q_STATUS+2) & 0x8000) != 0x8000){}; \ - MMIO_IN16(pSiS->IOBase, Q_STATUS); \ } @@ -52,6 +53,10 @@ extern void GlxSetVisualConfigs( #define AGP_CMDBUF_PAGES 256 #define AGP_CMDBUF_SIZE (AGP_PAGE_SIZE * AGP_CMDBUF_PAGES) +/* 315/330 */ +#define AGP_VTXBUF_PAGES 512 +#define AGP_VTXBUF_SIZE (AGP_PAGE_SIZE * AGP_VTXBUF_PAGES) + static char SISKernelDriverName[] = "sis"; static char SISClientDriverName[] = "sis"; @@ -86,8 +91,8 @@ SISInitVisualConfigs(ScreenPtr pScreen) int i, db, z_stencil, accum; Bool useZ16 = FALSE; - if(getenv("SIS_FORCE_Z16")){ - useZ16 = TRUE; + if(getenv("SIS_FORCE_Z16")) { + useZ16 = TRUE; } switch (pScrn->bitsPerPixel) { @@ -96,30 +101,29 @@ SISInitVisualConfigs(ScreenPtr pScreen) break; case 16: case 32: - numConfigs = (useZ16)?8:16; + numConfigs = (useZ16) ? 8 : 16; - if (!(pConfigs = (__GLXvisualConfig*)xcalloc(sizeof(__GLXvisualConfig), + if(!(pConfigs = (__GLXvisualConfig*)xcalloc(sizeof(__GLXvisualConfig), numConfigs))) { - return FALSE; + return FALSE; } - if (!(pSISConfigs = (SISConfigPrivPtr)xcalloc(sizeof(SISConfigPrivRec), + if(!(pSISConfigs = (SISConfigPrivPtr)xcalloc(sizeof(SISConfigPrivRec), numConfigs))) { - xfree(pConfigs); - return FALSE; + xfree(pConfigs); + return FALSE; } - if (!(pSISConfigPtrs = (SISConfigPrivPtr*)xcalloc(sizeof(SISConfigPrivPtr), + if(!(pSISConfigPtrs = (SISConfigPrivPtr*)xcalloc(sizeof(SISConfigPrivPtr), numConfigs))) { - xfree(pConfigs); - xfree(pSISConfigs); - return FALSE; + xfree(pConfigs); + xfree(pSISConfigs); + return FALSE; } - for (i=0; i<numConfigs; i++) - pSISConfigPtrs[i] = &pSISConfigs[i]; + for(i=0; i<numConfigs; i++) pSISConfigPtrs[i] = &pSISConfigs[i]; i = 0; - for (accum = 0; accum <= 1; accum++) { - for (z_stencil=0; z_stencil<(useZ16?2:4); z_stencil++) { - for (db = 0; db <= 1; db++) { + for(accum = 0; accum <= 1; accum++) { + for(z_stencil=0; z_stencil<(useZ16?2:4); z_stencil++) { + for(db = 0; db <= 1; db++) { pConfigs[i].vid = -1; pConfigs[i].class = -1; pConfigs[i].rgba = TRUE; @@ -130,7 +134,7 @@ SISInitVisualConfigs(ScreenPtr pScreen) pConfigs[i].greenMask = -1; pConfigs[i].blueMask = -1; pConfigs[i].alphaMask = 0; - if (accum) { + if(accum) { pConfigs[i].accumRedSize = 16; pConfigs[i].accumGreenSize = 16; pConfigs[i].accumBlueSize = 16; @@ -141,13 +145,11 @@ SISInitVisualConfigs(ScreenPtr pScreen) pConfigs[i].accumBlueSize = 0; pConfigs[i].accumAlphaSize = 0; } - if (db) - pConfigs[i].doubleBuffer = TRUE; - else - pConfigs[i].doubleBuffer = FALSE; + if(db) pConfigs[i].doubleBuffer = TRUE; + else pConfigs[i].doubleBuffer = FALSE; pConfigs[i].stereo = FALSE; pConfigs[i].bufferSize = -1; - switch (z_stencil){ + switch(z_stencil) { case 0: pConfigs[i].depthSize = 0; pConfigs[i].stencilSize = 0; @@ -178,10 +180,10 @@ SISInitVisualConfigs(ScreenPtr pScreen) } } } - if (i != numConfigs) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + if(i != numConfigs) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "[dri] Incorrect initialization of visuals. Disabling DRI.\n"); - return FALSE; + return FALSE; } break; } @@ -200,18 +202,23 @@ Bool SISDRIScreenInit(ScreenPtr pScreen) SISPtr pSIS = SISPTR(pScrn); DRIInfoPtr pDRIInfo; SISDRIPtr pSISDRI; -#if 000 +#if 0 drmVersionPtr version; #endif + pSIS->cmdQueueLenPtrBackup = NULL; +#ifdef SIS315DRI + pSIS->cmdQ_SharedWritePortBackup = NULL; +#endif + /* Check that the GLX, DRI, and DRM modules have been loaded by testing * for canonical symbols in each module. */ - if (!xf86LoaderCheckSymbol("GlxSetVisualConfigs")) return FALSE; - if (!xf86LoaderCheckSymbol("DRIScreenInit")) return FALSE; - if (!xf86LoaderCheckSymbol("drmAvailable")) return FALSE; - if (!xf86LoaderCheckSymbol("DRIQueryVersion")) { + if(!xf86LoaderCheckSymbol("GlxSetVisualConfigs")) return FALSE; + if(!xf86LoaderCheckSymbol("DRIScreenInit")) return FALSE; + if(!xf86LoaderCheckSymbol("drmAvailable")) return FALSE; + if(!xf86LoaderCheckSymbol("DRIQueryVersion")) { xf86DrvMsg(pScreen->myNum, X_ERROR, - "[dri] SISDRIScreenInit failed (libdri.a too old)\n"); + "[dri] SISDRIScreenInit failed (libdri.a too old)\n"); return FALSE; } @@ -219,7 +226,7 @@ Bool SISDRIScreenInit(ScreenPtr pScreen) { int major, minor, patch; DRIQueryVersion(&major, &minor, &patch); - if (major != 4 || minor < 0) { + if(major != 4 || minor < 0) { xf86DrvMsg(pScreen->myNum, X_ERROR, "[dri] SISDRIScreenInit failed because of a version mismatch.\n" "[dri] libDRI version is %d.%d.%d but version 4.0.x is needed.\n" @@ -237,9 +244,9 @@ Bool SISDRIScreenInit(ScreenPtr pScreen) pDRIInfo->clientDriverName = SISClientDriverName; pDRIInfo->busIdString = xalloc(64); sprintf(pDRIInfo->busIdString, "PCI:%d:%d:%d", - ((pciConfigPtr)pSIS->PciInfo->thisCard)->busnum, - ((pciConfigPtr)pSIS->PciInfo->thisCard)->devnum, - ((pciConfigPtr)pSIS->PciInfo->thisCard)->funcnum); + ((pciConfigPtr)pSIS->PciInfo->thisCard)->busnum, + ((pciConfigPtr)pSIS->PciInfo->thisCard)->devnum, + ((pciConfigPtr)pSIS->PciInfo->thisCard)->funcnum); pDRIInfo->ddxDriverMajorVersion = 0; pDRIInfo->ddxDriverMinorVersion = 1; pDRIInfo->ddxDriverPatchVersion = 0; @@ -261,10 +268,10 @@ Bool SISDRIScreenInit(ScreenPtr pScreen) pDRIInfo->ddxDrawableTableEntry = SIS_MAX_DRAWABLES; - if (SAREA_MAX_DRAWABLES < SIS_MAX_DRAWABLES) - pDRIInfo->maxDrawableTableEntry = SAREA_MAX_DRAWABLES; + if(SAREA_MAX_DRAWABLES < SIS_MAX_DRAWABLES) + pDRIInfo->maxDrawableTableEntry = SAREA_MAX_DRAWABLES; else - pDRIInfo->maxDrawableTableEntry = SIS_MAX_DRAWABLES; + pDRIInfo->maxDrawableTableEntry = SIS_MAX_DRAWABLES; #ifdef NOT_DONE /* FIXME need to extend DRI protocol to pass this size back to client @@ -278,18 +285,18 @@ Bool SISDRIScreenInit(ScreenPtr pScreen) /* For now the mapping works by using a fixed size defined * in the SAREA header */ - if (sizeof(XF86DRISAREARec)+sizeof(SISSAREAPriv) > SAREA_MAX) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "Data does not fit in SAREA\n"); - return FALSE; + if(sizeof(XF86DRISAREARec)+sizeof(SISSAREAPriv) > SAREA_MAX) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Data does not fit in SAREA\n"); + return FALSE; } pDRIInfo->SAREASize = SAREA_MAX; #endif - if (!(pSISDRI = (SISDRIPtr)xcalloc(sizeof(SISDRIRec),1))) { - DRIDestroyInfoRec(pSIS->pDRIInfo); - pSIS->pDRIInfo=0; - return FALSE; + if(!(pSISDRI = (SISDRIPtr)xcalloc(sizeof(SISDRIRec),1))) { + DRIDestroyInfoRec(pSIS->pDRIInfo); + pSIS->pDRIInfo = 0; + return FALSE; } pDRIInfo->devPrivate = pSISDRI; pDRIInfo->devPrivateSize = sizeof(SISDRIRec); @@ -302,18 +309,18 @@ Bool SISDRIScreenInit(ScreenPtr pScreen) pDRIInfo->MoveBuffers = SISDRIMoveBuffers; pDRIInfo->bufferRequests = DRI_ALL_WINDOWS; - if (!DRIScreenInit(pScreen, pDRIInfo, &pSIS->drmSubFD)) { - xf86DrvMsg(pScreen->myNum, X_ERROR, - "[dri] DRIScreenInit failed. Disabling DRI.\n"); - xfree(pDRIInfo->devPrivate); - pDRIInfo->devPrivate=0; - DRIDestroyInfoRec(pSIS->pDRIInfo); - pSIS->pDRIInfo=0; - pSIS->drmSubFD = -1; - return FALSE; + if(!DRIScreenInit(pScreen, pDRIInfo, &pSIS->drmSubFD)) { + xf86DrvMsg(pScreen->myNum, X_ERROR, + "[dri] DRIScreenInit failed. Disabling DRI.\n"); + xfree(pDRIInfo->devPrivate); + pDRIInfo->devPrivate = 0; + DRIDestroyInfoRec(pSIS->pDRIInfo); + pSIS->pDRIInfo = 0; + pSIS->drmSubFD = -1; + return FALSE; } -#if 000 +#if 0 /* XXX Check DRM kernel version here */ version = drmGetVersion(info->drmFD); if (version) { @@ -337,49 +344,56 @@ Bool SISDRIScreenInit(ScreenPtr pScreen) pSISDRI->regs.size = SISIOMAPSIZE; pSISDRI->regs.map = 0; - if (drmAddMap(pSIS->drmSubFD, (drmHandle)pSIS->IOAddress, - pSISDRI->regs.size, DRM_REGISTERS, 0, - &pSISDRI->regs.handle)<0) - { - SISDRICloseScreen(pScreen); - return FALSE; + if(drmAddMap(pSIS->drmSubFD, (drmHandle)pSIS->IOAddress, + pSISDRI->regs.size, DRM_REGISTERS, 0, + &pSISDRI->regs.handle) < 0) { + SISDRICloseScreen(pScreen); + return FALSE; } xf86DrvMsg(pScreen->myNum, X_INFO, "[drm] Registers = 0x%08lx\n", pSISDRI->regs.handle); /* AGP */ - do{ + do { pSIS->agpSize = 0; pSIS->agpCmdBufSize = 0; pSISDRI->AGPCmdBufSize = 0; - if (drmAgpAcquire(pSIS->drmSubFD) < 0) { - xf86DrvMsg(pScreen->myNum, X_ERROR, "[drm] drmAgpAcquire failed\n"); - break; + if(drmAgpAcquire(pSIS->drmSubFD) < 0) { + xf86DrvMsg(pScreen->myNum, X_ERROR, "[drm] drmAgpAcquire failed\n"); + break; } - - /* TODO: default value is 2x? */ - if (drmAgpEnable(pSIS->drmSubFD, drmAgpGetMode(pSIS->drmSubFD)&~0x0) < 0) { - xf86DrvMsg(pScreen->myNum, X_ERROR, "[drm] drmAgpEnable failed\n"); - break; + + if(pSIS->VGAEngine == SIS_315_VGA) { +#ifdef SIS315DRI + /* Default to 1X agp mode in SIS315 */ + if(drmAgpEnable(pSIS->drmSubFD, drmAgpGetMode(pSIS->drmSubFD)&~0x00000002) < 0) { + xf86DrvMsg(pScreen->myNum, X_ERROR, "[drm] drmAgpEnable failed\n"); + break; + } +#endif + } else { + /* TODO: default value is 2x? */ + if(drmAgpEnable(pSIS->drmSubFD, drmAgpGetMode(pSIS->drmSubFD)&~0x0) < 0) { + xf86DrvMsg(pScreen->myNum, X_ERROR, "[drm] drmAgpEnable failed\n"); + break; + } } - xf86DrvMsg(pScreen->myNum, X_INFO, "[drm] drmAgpEnabled succeeded\n"); - if (drmAgpAlloc(pSIS->drmSubFD, AGP_SIZE, 0, NULL, &pSIS->agpHandle) < 0) { - xf86DrvMsg(pScreen->myNum, X_ERROR, - "[drm] drmAgpAlloc failed\n"); - drmAgpRelease(pSIS->drmSubFD); - break; + xf86DrvMsg(pScreen->myNum, X_INFO, "[drm] drmAgpEnabled succeeded\n"); + + if(drmAgpAlloc(pSIS->drmSubFD, AGP_SIZE, 0, NULL, &pSIS->agpHandle) < 0) { + xf86DrvMsg(pScreen->myNum, X_ERROR, "[drm] drmAgpAlloc failed\n"); + drmAgpRelease(pSIS->drmSubFD); + break; } - if (drmAgpBind(pSIS->drmSubFD, pSIS->agpHandle, 0) < 0) { - xf86DrvMsg(pScreen->myNum, X_ERROR, - "[drm] drmAgpBind failed\n"); - drmAgpFree(pSIS->drmSubFD, pSIS->agpHandle); - drmAgpRelease(pSIS->drmSubFD); - - break; + if(drmAgpBind(pSIS->drmSubFD, pSIS->agpHandle, 0) < 0) { + xf86DrvMsg(pScreen->myNum, X_ERROR, "[drm] drmAgpBind failed\n"); + drmAgpFree(pSIS->drmSubFD, pSIS->agpHandle); + drmAgpRelease(pSIS->drmSubFD); + break; } pSIS->agpSize = AGP_SIZE; @@ -387,25 +401,39 @@ Bool SISDRIScreenInit(ScreenPtr pScreen) /* pSIS->agpBase = */ pSISDRI->agp.size = pSIS->agpSize; - if (drmAddMap(pSIS->drmSubFD, (drmHandle)0, - pSISDRI->agp.size, DRM_AGP, 0, + if(drmAddMap(pSIS->drmSubFD, (drmHandle)0, + pSISDRI->agp.size, DRM_AGP, 0, &pSISDRI->agp.handle) < 0) { - xf86DrvMsg(pScreen->myNum, X_ERROR, + xf86DrvMsg(pScreen->myNum, X_ERROR, "[drm] Failed to map public agp area\n"); - pSISDRI->agp.size = 0; - break; - } - - pSIS->agpCmdBufSize = AGP_CMDBUF_SIZE; - pSIS->agpCmdBufAddr = pSIS->agpAddr; - pSIS->agpCmdBufBase = pSIS->agpCmdBufAddr - pSIS->agpAddr + - pSIS->agpBase; - pSIS->agpCmdBufFree = 0; + pSISDRI->agp.size = 0; + break; + } + + if(pSIS->VGAEngine == SIS_315_VGA) { +#ifdef SIS315DRI + pSIS->agpVtxBufSize = AGP_VTXBUF_SIZE; /* = 2MB */ + pSIS->agpVtxBufAddr = pSIS->agpAddr; + pSIS->agpVtxBufBase = pSIS->agpVtxBufAddr - pSIS->agpAddr + pSIS->agpBase; + pSIS->agpVtxBufFree = 0; + + pSISDRI->AGPVtxBufOffset = pSIS->agpVtxBufAddr - pSIS->agpAddr; + pSISDRI->AGPVtxBufSize = pSIS->agpVtxBufSize; + + drmSiSAgpInit(pSIS->drmSubFD, AGP_VTXBUF_SIZE,(AGP_SIZE - AGP_VTXBUF_SIZE)); +#endif + } else { + + pSIS->agpCmdBufSize = AGP_CMDBUF_SIZE; + pSIS->agpCmdBufAddr = pSIS->agpAddr; + pSIS->agpCmdBufBase = pSIS->agpCmdBufAddr - pSIS->agpAddr + pSIS->agpBase; + pSIS->agpCmdBufFree = 0; - pSISDRI->AGPCmdBufOffset = pSIS->agpCmdBufAddr - pSIS->agpAddr; - pSISDRI->AGPCmdBufSize = pSIS->agpCmdBufSize; + pSISDRI->AGPCmdBufOffset = pSIS->agpCmdBufAddr - pSIS->agpAddr; + pSISDRI->AGPCmdBufSize = pSIS->agpCmdBufSize; - drmSiSAgpInit(pSIS->drmSubFD, AGP_CMDBUF_SIZE,(AGP_SIZE - AGP_CMDBUF_SIZE)); + drmSiSAgpInit(pSIS->drmSubFD, AGP_CMDBUF_SIZE,(AGP_SIZE - AGP_CMDBUF_SIZE)); + } } while(0); @@ -415,24 +443,22 @@ Bool SISDRIScreenInit(ScreenPtr pScreen) ((pciConfigPtr)pSIS->PciInfo->thisCard)->devnum, ((pciConfigPtr)pSIS->PciInfo->thisCard)->funcnum); - if((drmCtlInstHandler(pSIS->drmSubFD, pSIS->irq)) != 0) - { - xf86DrvMsg(pScrn->scrnIndex, X_INFO, + if((drmCtlInstHandler(pSIS->drmSubFD, pSIS->irq)) != 0) { + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "[drm] failure adding irq %d handler, stereo disabled\n", pSIS->irq); - pSIS->irqEnabled = FALSE; - } - else - { - pSIS->irqEnabled = TRUE; - } + pSIS->irqEnabled = FALSE; + } else { + pSIS->irqEnabled = TRUE; + } pSISDRI->irqEnabled = pSIS->irqEnabled; - if (!(SISInitVisualConfigs(pScreen))) { - SISDRICloseScreen(pScreen); - return FALSE; + if(!(SISInitVisualConfigs(pScreen))) { + SISDRICloseScreen(pScreen); + return FALSE; } + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "[dri] visual configs initialized.\n" ); return TRUE; @@ -444,23 +470,36 @@ SISDRICloseScreen(ScreenPtr pScreen) ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; SISPtr pSIS = SISPTR(pScrn); + if(pSIS->VGAEngine == SIS_315_VGA) { +#ifdef SIS315DRI + if(pSIS->cmdQ_SharedWritePortBackup) { + pSIS->cmdQ_SharedWritePort = pSIS->cmdQ_SharedWritePortBackup; + } +#endif + } else { + if(pSIS->cmdQueueLenPtrBackup) { + pSIS->cmdQueueLenPtr = pSIS->cmdQueueLenPtrBackup; + *(pSIS->cmdQueueLenPtr) = 0; + } + } + DRICloseScreen(pScreen); - if (pSIS->pDRIInfo) { - if (pSIS->pDRIInfo->devPrivate) { - xfree(pSIS->pDRIInfo->devPrivate); - pSIS->pDRIInfo->devPrivate=0; - } - DRIDestroyInfoRec(pSIS->pDRIInfo); - pSIS->pDRIInfo=0; + if(pSIS->pDRIInfo) { + if(pSIS->pDRIInfo->devPrivate) { + xfree(pSIS->pDRIInfo->devPrivate); + pSIS->pDRIInfo->devPrivate=0; + } + DRIDestroyInfoRec(pSIS->pDRIInfo); + pSIS->pDRIInfo=0; } - if (pSIS->pVisualConfigs) xfree(pSIS->pVisualConfigs); - if (pSIS->pVisualConfigsPriv) xfree(pSIS->pVisualConfigsPriv); + if(pSIS->pVisualConfigs) xfree(pSIS->pVisualConfigs); + if(pSIS->pVisualConfigsPriv) xfree(pSIS->pVisualConfigsPriv); if(pSIS->agpSize){ - xf86DrvMsg(pScreen->myNum, X_INFO, "[drm] Freeing agp memory\n"); + xf86DrvMsg(pScreen->myNum, X_INFO, "[drm] Freeing agp memory\n"); drmAgpFree(pSIS->drmSubFD, pSIS->agpHandle); - xf86DrvMsg(pScreen->myNum, X_INFO, "[drm] Releasing agp module\n"); + xf86DrvMsg(pScreen->myNum, X_INFO, "[drm] Releasing agp module\n"); drmAgpRelease(pSIS->drmSubFD); } } @@ -514,28 +553,32 @@ SISDRIFinishScreenInit(ScreenPtr pScreen) { SISSAREAPriv *saPriv; - saPriv=(SISSAREAPriv*)DRIGetSAREAPrivate(pScreen); + saPriv = (SISSAREAPriv*)DRIGetSAREAPrivate(pScreen); assert(saPriv); saPriv->CtxOwner = -1; - saPriv->QueueLength = 0; + saPriv->QueueLength = *(pSiS->cmdQueueLenPtr); + pSiS->cmdQueueLenPtrBackup = pSiS->cmdQueueLenPtr; pSiS->cmdQueueLenPtr = &(saPriv->QueueLength); - saPriv->AGPCmdBufNext = 0; - /* frame control */ - saPriv->FrameCount = 0; - if (pSiS->VGAEngine == SIS_315_VGA) { /* 315 series */ -#if 0 - *(unsigned long *)(pSiS->IOBase+0x8a2c) = 0; /* FIXME: Where is this on the 315 series ? */ + if(pSiS->VGAEngine == SIS_315_VGA) { +#ifdef SIS315DRI + saPriv->AGPVtxBufNext = 0; + saPriv->sharedWPoffset = pSiS->cmdQ_SharedWritePort_2D; + pSiS->cmdQ_SharedWritePortBackup = pSiS->cmdQ_SharedWritePort; + pSiS->cmdQ_SharedWritePort = &(saPriv->sharedWPoffset); #endif - SiS315Idle - } else { /* 300 series (and below) */ + } else { + saPriv->AGPCmdBufNext = 0; + + /* frame control */ + saPriv->FrameCount = 0; *(unsigned long *)(pSiS->IOBase+0x8a2c) = 0; SiSIdle } } - + return DRIFinishScreenInit(pScreen); } @@ -563,14 +606,13 @@ SISDRISwapContext(ScreenPtr pScreen, DRISyncType syncType, * TODO: do this only if X-Server get lock. If kernel supports delayed * signal, needless to do this */ - if (pSiS->VGAEngine == SIS_315_VGA) { -#if 0 - *(pSiS->IOBase + 0x8B50) = 0xff; /* FIXME: Where is this on 315 series */ - *(unsigned int *)(pSiS->IOBase + 0x8B60) = -1; /* FIXME: Where is this on 315 series */ + if(pSiS->VGAEngine == SIS_315_VGA) { +#ifdef SIS315DRI + /* ? */ #endif } else { - *(pSiS->IOBase + 0x8B50) = 0xff; - *(unsigned int *)(pSiS->IOBase + 0x8B60) = -1; + *(pSiS->IOBase + 0x8B50) = 0xff; + *(unsigned int *)(pSiS->IOBase + 0x8B60) = -1; } } @@ -581,10 +623,12 @@ SISDRIInitBuffers(WindowPtr pWin, RegionPtr prgn, CARD32 index) ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; SISPtr pSiS = SISPTR(pScrn); - if (pSiS->VGAEngine == SIS_315_VGA) { - SiS315Idle /* 315 series */ + if(pSiS->VGAEngine == SIS_315_VGA) { +#ifdef SIS315DRI + SiS315Idle /* 315 series */ +#endif } else { - SiSIdle /* 300 series */ + SiSIdle /* 300 series */ } } @@ -596,10 +640,12 @@ SISDRIMoveBuffers(WindowPtr pParent, DDXPointRec ptOldOrg, ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; SISPtr pSiS = SISPTR(pScrn); - if (pSiS->VGAEngine == SIS_315_VGA) { - SiS315Idle /* 315 series */ + if(pSiS->VGAEngine == SIS_315_VGA) { +#ifdef SIS315DRI + SiS315Idle /* 315 series */ +#endif } else { - SiSIdle /* 300 series and below */ + SiSIdle /* 300 series */ } } diff --git a/xc/programs/Xserver/hw/xfree86/drivers/sis/sis_dri.h b/xc/programs/Xserver/hw/xfree86/drivers/sis/sis_dri.h index 32d477566..7491c8f0c 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/sis/sis_dri.h +++ b/xc/programs/Xserver/hw/xfree86/drivers/sis/sis_dri.h @@ -1,11 +1,11 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/sis_dri.h,v 1.2 2000/08/04 03:51:46 tsi Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/sis_dri.h,v 1.8 2003/08/23 15:34:38 twini Exp $ */ /* modified from tdfx_dri.h */ #ifndef _SIS_DRI_ #define _SIS_DRI_ -#include <xf86drm.h> +#include "xf86drm.h" #define SIS_MAX_DRAWABLES 256 #define SISIOMAPSIZE (64*1024) @@ -15,8 +15,21 @@ typedef struct { int QueueLength; unsigned int AGPCmdBufNext; unsigned int FrameCount; +#ifdef SIS315DRI + /* For 315 series */ + unsigned long sharedWPoffset; +#endif +#if 0 + unsigned char *AGPCmdBufBase; + unsigned long AGPCmdBufAddr; + unsigned long AGPCmdBufOffset; + unsigned int AGPCmdBufSize; + unsigned long AGPCmdBufNext; +#endif } SISSAREAPriv; +#define AGPVtxBufNext AGPCmdBufNext + #define SIS_FRONT 0 #define SIS_BACK 1 #define SIS_DEPTH 2 @@ -47,6 +60,9 @@ typedef struct { unsigned int scrnX, scrnY; } SISDRIRec, *SISDRIPtr; +#define AGPVtxBufOffset AGPCmdBufOffset +#define AGPVtxBufSize AGPCmdBufSize + typedef struct { /* Nothing here yet */ int dummy; @@ -57,4 +73,13 @@ typedef struct { int dummy; } SISDRIContextRec, *SISDRIContextPtr; +#ifdef XFree86Server + +#include "screenint.h" + +Bool SISDRIScreenInit(ScreenPtr pScreen); +void SISDRICloseScreen(ScreenPtr pScreen); +Bool SISDRIFinishScreenInit(ScreenPtr pScreen); + +#endif #endif diff --git a/xc/programs/Xserver/hw/xfree86/drivers/sis/sis_driver.c b/xc/programs/Xserver/hw/xfree86/drivers/sis/sis_driver.c index 2e548879b..554554613 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/sis/sis_driver.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/sis/sis_driver.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/sis_driver.c,v 1.102 2003/08/10 21:25:37 twini Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/sis_driver.c,v 1.110 2003/08/26 16:38:01 twini Exp $ */ /* * Copyright 2001, 2002, 2003 by Thomas Winischhofer, Vienna, Austria. * @@ -27,8 +27,8 @@ * - driver entirely rewritten, only basic structure taken from old code * (except sis_dri.c, sis_shadow.c and parts of sis_dga.c; * these were taken over) - * - 315 series (315/550/650/651/M650/652/M652/740) support - * - Xabre series (330/660/M660/760/M760) support + * - 315 series (315/550/650/651/M650/661FX/M661FX/740/741) support + * - Xabre series (330) support * - new mode switching code for 300, 315 and 330 series * - dual head support on 300, 315 and 330 series * - merged-framebuffer support on 300, 315 and 330 series @@ -239,9 +239,11 @@ static SymTabRec SISChipsets[] = { { PCI_CHIP_SIS315H, "SIS315H" }, { PCI_CHIP_SIS315PRO, "SIS315PRO" }, { PCI_CHIP_SIS550, "SIS550" }, - { PCI_CHIP_SIS650, "SIS650/M650/651/652/M652/740" }, + { PCI_CHIP_SIS650, "SIS650/M650/651/652/M652/661FX/M661FX/740/741" }, { PCI_CHIP_SIS330, "SIS330(Xabre)" }, +#if 0 { PCI_CHIP_SIS660, "SIS660/M660/760/M760" }, +#endif { -1, NULL } }; @@ -258,7 +260,9 @@ static PciChipsets SISPciChipsets[] = { { PCI_CHIP_SIS315PRO, PCI_CHIP_SIS315PRO, RES_SHARED_VGA }, { PCI_CHIP_SIS650, PCI_CHIP_SIS650, RES_SHARED_VGA }, { PCI_CHIP_SIS330, PCI_CHIP_SIS330, RES_SHARED_VGA }, +#if 0 { PCI_CHIP_SIS660, PCI_CHIP_SIS660, RES_SHARED_VGA }, +#endif { -1, -1, RES_UNDEFINED } }; @@ -292,11 +296,13 @@ static const char *vgahwSymbols[] = { NULL }; +#if defined(XFree86LOADER) static const char *miscfbSymbols[] = { "xf1bppScreenInit", "xf4bppScreenInit", NULL }; +#endif static const char *fbSymbols[] = { "fbPictureInit", @@ -327,12 +333,6 @@ static const char *ddcSymbols[] = { NULL }; -static const char *i2cSymbols[] = { - "xf86I2CBusInit", - "xf86CreateI2CBusRec", - NULL -}; - static const char *int10Symbols[] = { "xf86FreeInt10", "xf86InitInt10", @@ -419,7 +419,7 @@ sisSetup(pointer module, pointer opts, int *errmaj, int *errmin) if (!setupDone) { setupDone = TRUE; xf86AddDriver(&SIS, module, 0); - LoaderRefSymLists(vgahwSymbols, fbSymbols, i2cSymbols, xaaSymbols, + LoaderRefSymLists(vgahwSymbols, fbSymbols, xaaSymbols, miscfbSymbols, shadowSymbols, ramdacSymbols, vbeSymbols, int10Symbols, #ifdef XF86DRI @@ -2437,12 +2437,12 @@ SISPreInit(ScrnInfoPtr pScrn, int flags) pSiS->sisfbscalelcd = -1; pSiS->sisfbspecialtiming = CUT_NONE; pSiS->OldMode = 0; + pSiS->sisfbfound = FALSE; if(pSiS->VGAEngine == SIS_300_VGA || pSiS->VGAEngine == SIS_315_VGA) { int fd, i; sisfb_info mysisfbinfo; - BOOL found = FALSE; char name[10]; CARD32 sisfbversion; @@ -2467,11 +2467,11 @@ SISPreInit(ScrnInfoPtr pScrn, int flags) if((mysisfbinfo.sisfb_pcibus == pSiS->PciInfo->bus) && (mysisfbinfo.sisfb_pcislot == pSiS->PciInfo->device) && (mysisfbinfo.sisfb_pcifunc == pSiS->PciInfo->func) ) { - found = TRUE; + pSiS->sisfbfound = TRUE; } - } else found = TRUE; + } else pSiS->sisfbfound = TRUE; - if(found) { + if(pSiS->sisfbfound) { xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "%s: SiS kernel fb driver (sisfb) %d.%d.%d detected (PCI: %02d:%02d.%d)\n", &name[5], @@ -2498,10 +2498,10 @@ SISPreInit(ScrnInfoPtr pScrn, int flags) xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "sisfb: %sreserved hardware cursor, using %s command queue\n", (mysisfbinfo.sisfb_caps & 0x80) ? "" : "not ", - (mysisfbinfo.sisfb_caps & 0x40) ? "SiS300 series Turbo" : - (mysisfbinfo.sisfb_caps & 0x20) ? "SiS315 series AGP" : - (mysisfbinfo.sisfb_caps & 0x10) ? "SiS315 series VRAM" : - (mysisfbinfo.sisfb_caps & 0x08) ? "SiS315 series MMIO" : + (mysisfbinfo.sisfb_caps & 0x40) ? "SiS300 Turbo" : + (mysisfbinfo.sisfb_caps & 0x20) ? "SiS315/330 AGP" : + (mysisfbinfo.sisfb_caps & 0x10) ? "SiS315/330 VRAM" : + (mysisfbinfo.sisfb_caps & 0x08) ? "SiS315/330 MMIO" : "no"); } if(sisfbversion >= 0x01050A) { @@ -2527,8 +2527,8 @@ SISPreInit(ScrnInfoPtr pScrn, int flags) close (fd); } i++; - } while((i <= 7) && (!found)); - if(!found) xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "sisfb not found\n"); + } while((i <= 7) && (!pSiS->sisfbfound)); + if(!pSiS->sisfbfound) xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "sisfb not found\n"); } } @@ -2629,6 +2629,7 @@ SISPreInit(ScrnInfoPtr pScrn, int flags) pSiS->SiS_Pr->SiS_ChSW = FALSE; pSiS->SiS_Pr->SiS_CustomT = CUT_NONE; pSiS->SiS_Pr->CRT1UsesCustomMode = FALSE; + pSiS->SiS_Pr->LVDSHL = -1; } /* Get our relocated IO registers */ @@ -2686,7 +2687,8 @@ SISPreInit(ScrnInfoPtr pScrn, int flags) } } - if(!xf86SetDepthBpp(pScrn, 8, 8, 8, pix24flags)) { + + if(!xf86SetDepthBpp(pScrn, 0, 0, 0, pix24flags)) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "xf86SetDepthBpp() error\n"); #ifdef SISDUALHEAD @@ -3146,9 +3148,9 @@ SISPreInit(ScrnInfoPtr pScrn, int flags) } from = X_PROBED; - if (pSiS->pEnt->device->videoRam != 0) { - pScrn->videoRam = pSiS->pEnt->device->videoRam; - from = X_CONFIG; + if(pSiS->pEnt->device->videoRam != 0) { + pScrn->videoRam = pSiS->pEnt->device->videoRam; + from = X_CONFIG; } pSiS->RealVideoRam = pScrn->videoRam; @@ -3194,12 +3196,12 @@ SISPreInit(ScrnInfoPtr pScrn, int flags) case SIS_300_VGA: pSiS->TurboQueueLen = 512; if(pSiS->TurboQueue) { - pSiS->availMem -= (pSiS->TurboQueueLen*1024); - pSiS->cursorOffset = 512; + pSiS->availMem -= (pSiS->TurboQueueLen*1024); + pSiS->cursorOffset = 512; } - if(pSiS->HWCursor) { - pSiS->availMem -= pSiS->CursorSize; - if(pSiS->OptUseColorCursor) pSiS->availMem -= pSiS->CursorSize; + if(pSiS->HWCursor) { + pSiS->availMem -= pSiS->CursorSize; + if(pSiS->OptUseColorCursor) pSiS->availMem -= pSiS->CursorSize; } pSiS->CmdQueLenMask = 0xFFFF; pSiS->CmdQueLenFix = 0; @@ -3210,13 +3212,26 @@ SISPreInit(ScrnInfoPtr pScrn, int flags) break; case SIS_315_VGA: +#ifdef SISVRAMQ + pSiS->cmdQueueSizeMask = pSiS->cmdQueueSize - 1; /* VRAM Command Queue is variable */ + pSiS->cmdQueueOffset = (pScrn->videoRam * 1024) - pSiS->cmdQueueSize; + pSiS->cmdQueueLen = 0; + pSiS->cmdQueueLenMin = 0x200; + pSiS->cmdQueueLenMax = pSiS->cmdQueueSize - pSiS->cmdQueueLenMin; + pSiS->cmdQueueSize_div2 = pSiS->cmdQueueSize / 2; + pSiS->cmdQueueSize_div4 = pSiS->cmdQueueSize / 4; + pSiS->cmdQueueSize_4_3 = (pSiS->cmdQueueSize / 4) * 3; + pSiS->availMem -= pSiS->cmdQueueSize; + pSiS->cursorOffset = (pSiS->cmdQueueSize / 1024); +#else if(pSiS->TurboQueue) { - pSiS->availMem -= (512*1024); /* Command Queue is 512k */ - pSiS->cursorOffset = 512; + pSiS->availMem -= (512*1024); /* MMIO Command Queue is 512k */ + pSiS->cursorOffset = 512; } - if(pSiS->HWCursor) { - pSiS->availMem -= pSiS->CursorSize; - if(pSiS->OptUseColorCursor) pSiS->availMem -= pSiS->CursorSize; +#endif + if(pSiS->HWCursor) { + pSiS->availMem -= pSiS->CursorSize; + if(pSiS->OptUseColorCursor) pSiS->availMem -= pSiS->CursorSize; } pSiS->cursorBufferNum = 0; #ifdef SISDUALHEAD @@ -3323,15 +3338,16 @@ SISPreInit(ScrnInfoPtr pScrn, int flags) xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Using %dK of framebuffer memory\n", pSiS->maxxfbmem / 1024); - /* Check if the chipset supports two video overlays */ - if( (!pSiS->NoXvideo) && - ( pSiS->VGAEngine == SIS_300_VGA || - pSiS->VGAEngine == SIS_315_VGA || - pSiS->Chipset == PCI_CHIP_SIS530 || - pSiS->Chipset == PCI_CHIP_SIS6326 || - pSiS->Chipset == PCI_CHIP_SIS5597 ) ) { + /* Find out about sub-classes of some chipsets and check + * if the chipset supports two video overlays + */ + if(pSiS->VGAEngine == SIS_300_VGA || + pSiS->VGAEngine == SIS_315_VGA || + pSiS->Chipset == PCI_CHIP_SIS530 || + pSiS->Chipset == PCI_CHIP_SIS6326 || + pSiS->Chipset == PCI_CHIP_SIS5597) { pSiS->hasTwoOverlays = FALSE; - switch (pSiS->Chipset) { + switch(pSiS->Chipset) { case PCI_CHIP_SIS300: case PCI_CHIP_SIS630: case PCI_CHIP_SIS550: @@ -3380,7 +3396,7 @@ SISPreInit(ScrnInfoPtr pScrn, int flags) andSISIDXREG(SISCR, 0x5c, 0x07); inSISIDXREG(SISCR, 0x5c, tempreg1); tempreg1 &= 0xf8; - setSISIDXREG(SISCR, 0x5c, 0x07, 0xf8); + orSISIDXREG(SISCR, 0x5c, 0xf8); inSISIDXREG(SISCR, 0x5c, tempreg2); tempreg2 &= 0xf8; if((!tempreg1) || (tempreg2)) { @@ -3491,33 +3507,42 @@ SISPreInit(ScrnInfoPtr pScrn, int flags) } while(mychswtable[i].subsysVendor != 0); } - if((pSiS->sishw_ext.UseROM) && (pSiS->SiS_Pr->SiS_CustomT == CUT_NONE)) { + if(pSiS->SiS_Pr->SiS_CustomT == CUT_NONE) { int i = 0, j; - unsigned short bversptr = pSiS->BIOS[0x16] | (pSiS->BIOS[0x17] << 8); + unsigned short bversptr = 0; BOOLEAN footprint; unsigned long chksum = 0; - for(i=0; i<32768; i++) chksum += pSiS->BIOS[i]; + if(pSiS->sishw_ext.UseROM) { + bversptr = pSiS->BIOS[0x16] | (pSiS->BIOS[0x17] << 8); + for(i=0; i<32768; i++) chksum += pSiS->BIOS[i]; + } i = 0; do { if( (mycustomttable[i].chipID == pSiS->sishw_ext.jChipType) && ((!strlen(mycustomttable[i].biosversion)) || + (pSiS->sishw_ext.UseROM && (!strncmp(mycustomttable[i].biosversion, (char *)&pSiS->BIOS[bversptr], - strlen(mycustomttable[i].biosversion)))) && + strlen(mycustomttable[i].biosversion))))) && ((!strlen(mycustomttable[i].biosdate)) || + (pSiS->sishw_ext.UseROM && (!strncmp(mycustomttable[i].biosdate, (char *)&pSiS->BIOS[0x2c], - strlen(mycustomttable[i].biosdate)))) && + strlen(mycustomttable[i].biosdate))))) && ((!mycustomttable[i].bioschksum) || - (mycustomttable[i].bioschksum == chksum)) && + (pSiS->sishw_ext.UseROM && + (mycustomttable[i].bioschksum == chksum))) && (mycustomttable[i].pcisubsysvendor == pSiS->PciInfo->subsysVendor) && (mycustomttable[i].pcisubsyscard == pSiS->PciInfo->subsysCard) ) { footprint = TRUE; for(j=0; j<5; j++) { - if(mycustomttable[i].biosFootprintAddr[j]) { - if(pSiS->BIOS[mycustomttable[i].biosFootprintAddr[j]] != mycustomttable[i].biosFootprintData[j]) - footprint = FALSE; - } + if(pSiS->sishw_ext.UseROM) { + if(mycustomttable[i].biosFootprintAddr[j]) { + if(pSiS->BIOS[mycustomttable[i].biosFootprintAddr[j]] != + mycustomttable[i].biosFootprintData[j]) + footprint = FALSE; + } + } } if(footprint) { xf86DrvMsg(pScrn->scrnIndex, X_INFO, @@ -5789,7 +5814,7 @@ SISRestore(ScrnInfoPtr pScrn) xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 3, "Restoring by setting old mode 0x%02x\n", pSiS->OldMode); - if((pSiS->OldMode <= 0x13) && (pSiS->pVbe)) { + if(((pSiS->OldMode <= 0x13) || (!pSiS->sisfbfound)) && (pSiS->pVbe)) { if(VBESetVBEMode(pSiS->pVbe, pSiS->OldMode, NULL) == TRUE) { SISSpecialRestore(pScrn); SiS_GetSetModeID(pScrn,pSiS->OldMode); @@ -5837,6 +5862,22 @@ SISRestore(ScrnInfoPtr pScrn) } +#ifdef SISVRAMQ + /* Restore queue mode registers on 315/330 series */ + /* (This became necessary due to the switch to VRAM queue) */ + if(pSiS->VGAEngine == SIS_315_VGA) { + unsigned char tempCR55; + inSISIDXREG(SISCR,0x55,tempCR55); + andSISIDXREG(SISCR,0x55,0x33); + outSISIDXREG(SISSR,0x26,0x01); + MMIO_OUT32(pSiS->IOBase, 0x85c4, 0); + outSISIDXREG(SISSR,0x27,sisReg->sisRegs3C4[0x27]); + outSISIDXREG(SISSR,0x26,sisReg->sisRegs3C4[0x26]); + MMIO_OUT32(pSiS->IOBase, 0x85C0, sisReg->sisMMIO85C0); + outSISIDXREG(SISCR,0x55,tempCR55); + } +#endif + } else { if(pSiS->VBFlags & VB_VIDEOBRIDGE) { @@ -6012,7 +6053,11 @@ SISBlockHandler(int i, pointer blockData, pointer pTimeout, pointer pReadmask) pScreen->BlockHandler = SISBlockHandler; if(pSiS->VideoTimerCallback) { - (*pSiS->VideoTimerCallback)(pScrn, currentTime.milliseconds); + (*pSiS->VideoTimerCallback)(pScrn, currentTime.milliseconds); + } + + if(pSiS->RenderCallback) { + (*pSiS->RenderCallback)(pScrn); } } @@ -6105,7 +6150,7 @@ SISScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) * This is done on 300 and 315 series only. */ if(pSiS->UseVESA) { - SiSEnableTurboQueue(pScrn); + SiSEnableTurboQueue(pScrn); } /* Save the current state */ @@ -6411,6 +6456,11 @@ SISScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) case 24: refreshArea = SISRefreshArea24; break; case 32: refreshArea = SISRefreshArea32; break; } +#if XF86_VERSION_CURRENT >= XF86_VERSION_NUMERIC(4,3,0,0,0) + xf86DisableRandR(); + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Driver rotation enabled, RandR disabled\n"); +#endif } ShadowFBInit(pScreen, refreshArea); @@ -6444,10 +6494,10 @@ SISScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) #endif if(pSiS->hasTwoOverlays) xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Using SiS300/315 series HW Xv\n" ); + "Using SiS300/315/330 series HW Xv\n" ); else xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Using SiS300/315 series HW Xv by default on CRT%d\n", + "Using SiS300/315/330 series HW Xv by default on CRT%d\n", (pSiS->XvOnCRT2 ? 2 : 1)); SISInitVideo(pScreen); #ifdef SISDUALHEAD @@ -6478,17 +6528,17 @@ SISScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) #ifdef XF86DRI if(pSiS->directRenderingEnabled) { - /* Now that mi, drm and others have done their thing, - * complete the DRI setup. - */ - pSiS->directRenderingEnabled = SISDRIFinishScreenInit(pScreen); + /* Now that mi, drm and others have done their thing, + * complete the DRI setup. + */ + pSiS->directRenderingEnabled = SISDRIFinishScreenInit(pScreen); } if(pSiS->directRenderingEnabled) { - xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Direct rendering enabled\n"); - /* TODO */ - /* SISSetLFBConfig(pSiS); */ + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Direct rendering enabled\n"); + /* TODO */ + /* SISSetLFBConfig(pSiS); */ } else { - xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Direct rendering disabled\n"); + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Direct rendering disabled\n"); } #endif @@ -7206,7 +7256,7 @@ SISEnterVT(int scrnIndex, int flags) #ifdef XF86DRI /* this is to be done AFTER switching the mode */ if(pSiS->directRenderingEnabled) - DRIUnlock(screenInfo.screens[scrnIndex]); + DRIUnlock(screenInfo.screens[scrnIndex]); #endif return TRUE; @@ -7735,27 +7785,19 @@ SiSEnableTurboQueue(ScrnInfoPtr pScrn) outSISIDXREG(SISSR, 0x27, SR27); } break; + case SIS_315_VGA: - if (!pSiS->NoAccel) { + if(!pSiS->NoAccel) { /* On 315 series, there are three queue modes available * which are chosen by setting bits 7:5 in SR26: * 1. MMIO queue mode (bit 5, 0x20). The hardware will keep * track of the queue, the FIFO, command parsing and so * on. This is the one comparable to the 300 series. * 2. VRAM queue mode (bit 6, 0x40). In this case, one will - * have to do queue management himself. Register 0x85c4 will - * hold the location of the next free queue slot, 0x85c8 - * is the "queue read pointer" whose way of working is - * unknown to me. Anyway, this mode would require a - * translation of the MMIO commands to some kind of - * accelerator assembly and writing these commands - * to the memory location pointed to by 0x85c4. - * We will not use this, as nobody knows how this - * "assembly" works, and as it would require a complete - * re-write of the accelerator code. + * have to do queue management himself. * 3. AGP queue mode (bit 7, 0x80). Works as 2., but keeps the * queue in AGP memory space. - * We go MMIO here. + * We go MMIO or VRAM here. * SR26 bit 4 is called "Bypass H/W queue". * SR26 bit 1 is called "Enable Command Queue Auto Correction" * SR26 bit 0 resets the queue @@ -7766,31 +7808,68 @@ SiSEnableTurboQueue(ScrnInfoPtr pScrn) * 11 (0x0C) 4M * The queue location is to be written to 0x85C0. */ -#if 0 - if (pSiS->TurboQueue) { -#endif - /* We only use MMIO Cmd Queue, not VRAM or AGP */ - /* Set Command Queue Threshold to max value 11111b */ - outSISIDXREG(SISSR, 0x27, 0x1F); - /* Syncronous reset for Command Queue */ - outSISIDXREG(SISSR, 0x26, 0x01); - /* Do some magic (cp readport to writeport) */ - temp = MMIO_IN32(pSiS->IOBase, 0x85C8); - MMIO_OUT32(pSiS->IOBase, 0x85C4, temp); - /* Enable MMIO Command Queue mode (0x20), - * Enable_command_queue_auto_correction (0x02) - * (no idea, but sounds good, so use it) - * 512k (0x00) (does this apply to MMIO mode?) */ - outSISIDXREG(SISSR, 0x26, 0x22); - /* Calc Command Queue position (Q is always 512k)*/ - temp = (pScrn->videoRam - 512) * 1024; - /* Set Q position */ - MMIO_OUT32(pSiS->IOBase, 0x85C0, temp); -#if 0 - } else { - /* Is there a non-TurboQueue mode within MMIO mode? */ +#ifdef SISVRAMQ + /* We use VRAM Cmd Queue, not MMIO or AGP */ + unsigned char tempCR55; + +#ifdef SISDUALHEAD + if(pSiS->DualHeadMode) { + SISEntPtr pSiSEnt = pSiS->entityPrivate; + pSiS->cmdQ_SharedWritePort = &(pSiSEnt->cmdQ_SharedWritePort_2D); + } else +#endif + pSiS->cmdQ_SharedWritePort = &(pSiS->cmdQ_SharedWritePort_2D); + + /* Set Command Queue Threshold to max value 11111b (?) */ + outSISIDXREG(SISSR, 0x27, 0x1F); + /* No idea what this does */ + inSISIDXREG(SISCR, 0x55, tempCR55) ; + andSISIDXREG(SISCR, 0x55, 0x33) ; + /* Syncronous reset for Command Queue */ + outSISIDXREG(SISSR, 0x26, 0x01); + MMIO_OUT32(pSiS->IOBase, 0x85c4, 0); + /* Enable VRAM Command Queue mode */ + switch(pSiS->cmdQueueSize) { + case 1*1024*1024: SR26 = (0x40 | 0x04); break; + case 2*1024*1024: SR26 = (0x40 | 0x08); break; + case 4*1024*1024: SR26 = (0x40 | 0x0C); break; + default: + case 512*1024: SR26 = (0x40 | 0x00); + } + outSISIDXREG(SISSR, 0x26, SR26); + pSiS->cmdQ_SharedWritePort_2D = (unsigned long)(MMIO_IN32(pSiS->IOBase, 0x85c8)); + *(pSiS->cmdQ_SharedWritePort) = pSiS->cmdQ_SharedWritePort_2D; + MMIO_OUT32(pSiS->IOBase, 0x85c4, pSiS->cmdQ_SharedWritePort_2D); + MMIO_OUT32(pSiS->IOBase, 0x85C0, pSiS->cmdQueueOffset); + temp = (unsigned long)pSiS->FbBase; +#ifdef SISDUALHEAD + if(pSiS->DualHeadMode) { + SISEntPtr pSiSEnt = pSiS->entityPrivate; + temp = (unsigned long)pSiSEnt->FbBase; } #endif + temp += pSiS->cmdQueueOffset; + pSiS->cmdQueueBase = (unsigned long *)temp; + outSISIDXREG(SISCR, 0x55, tempCR55); +#else + /* We use MMIO Cmd Queue, not VRAM or AGP */ + /* Set Command Queue Threshold to max value 11111b */ + outSISIDXREG(SISSR, 0x27, 0x1F); + /* Syncronous reset for Command Queue */ + outSISIDXREG(SISSR, 0x26, 0x01); + /* Do some magic (cp readport to writeport) */ + temp = MMIO_IN32(pSiS->IOBase, 0x85C8); + MMIO_OUT32(pSiS->IOBase, 0x85C4, temp); + /* Enable MMIO Command Queue mode (0x20), + * Enable_command_queue_auto_correction (0x02) + * (no idea, but sounds good, so use it) + * 512k (0x00) (does this apply to MMIO mode?) */ + outSISIDXREG(SISSR, 0x26, 0x22); + /* Calc Command Queue position (Q is always 512k)*/ + temp = (pScrn->videoRam - 512) * 1024; + /* Set Q position */ + MMIO_OUT32(pSiS->IOBase, 0x85C0, temp); +#endif } break; default: @@ -8125,7 +8204,10 @@ void SiSPreSetMode(ScrnInfoPtr pScrn, DisplayModePtr mode) pSiS->SiS_Pr->SiS_UseOEM = pSiS->OptUseOEM; /* Enable TurboQueue */ - SiSEnableTurboQueue(pScrn); +#ifdef SISVRAMQ + if(pSiS->VGAEngine != SIS_315_VGA) +#endif + SiSEnableTurboQueue(pScrn); if((!pSiS->UseVESA) && (pSiS->VBFlags & CRT2_ENABLE)) { /* Switch on CRT1 for modes that require the bridge in SlaveMode */ @@ -9995,6 +10077,13 @@ void SiSPostSetMode(ScrnInfoPtr pScrn, SISRegPtr sisReg) } } +#ifdef SISVRAMQ + if(pSiS->VGAEngine == SIS_315_VGA) { + /* Re-Enable TurboQueue */ + SiSEnableTurboQueue(pScrn); + } +#endif + /* Apply TV settings given by options Do this even in DualHeadMode: - if this is called by SetModeCRT1, CRT2 mode has been reset by SetModeCRT1 diff --git a/xc/programs/Xserver/hw/xfree86/drivers/sis/sis_driver.h b/xc/programs/Xserver/hw/xfree86/drivers/sis/sis_driver.h index b987c8876..eb65ecb9b 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/sis/sis_driver.h +++ b/xc/programs/Xserver/hw/xfree86/drivers/sis/sis_driver.h @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/sis_driver.h,v 1.14 2003/08/07 12:52:23 twini Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/sis_driver.h,v 1.15 2003/08/26 14:29:36 twini Exp $ */ /* * Global data and definitions * @@ -170,10 +170,17 @@ const customttable mycustomttable[] = { }, { SIS_650, "", "", 0, - { 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0 }, + { 0x00c, 0, 0, 0, 0 }, + { 'e' , 0, 0, 0, 0 }, + 0x1558, 0x0287, + "Clevo", "L285/L287 (Version 1)", CUT_CLEVO1024, "CLEVO1024" + }, + { SIS_650, "", "", + 0, + { 0x00c, 0, 0, 0, 0 }, + { 'y' , 0, 0, 0, 0 }, 0x1558, 0x0287, - "Clevo", "L285/L287", CUT_CLEVO1024, "CLEVO1024" + "Clevo", "L285/L287 (Version 2)", CUT_CLEVO10242, "CLEVO10242" }, { 4321, "", "", /* This is hopefully NEVER autodetected */ 0, diff --git a/xc/programs/Xserver/hw/xfree86/drivers/sis/sis_opt.c b/xc/programs/Xserver/hw/xfree86/drivers/sis/sis_opt.c index 60883930f..df46af8b8 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/sis/sis_opt.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/sis/sis_opt.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/sis_opt.c,v 1.25 2003/08/10 21:25:38 twini Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/sis_opt.c,v 1.26 2003/08/23 10:25:19 twini Exp $ */ /* * SiS driver option evaluation * @@ -110,6 +110,7 @@ typedef enum { OPTION_XVYUVCHROMAKEY, OPTION_SCALELCD, OPTION_SPECIALTIMING, + OPTION_LVDSHL, OPTION_ENABLEHOTKEY, OPTION_MERGEDFB, OPTION_CRT2HSYNC, @@ -210,6 +211,7 @@ static const OptionInfoRec SISOptions[] = { { OPTION_SCALELCD, "ScaleLCD", OPTV_BOOLEAN, {0}, -1 }, { OPTION_ENABLEHOTKEY, "EnableHotkey", OPTV_BOOLEAN, {0}, -1 }, { OPTION_SPECIALTIMING, "SpecialTiming", OPTV_STRING, {0}, -1 }, + { OPTION_LVDSHL, "LVDSHL", OPTV_INTEGER, {0}, -1 }, { OPTION_ENABLESISCTRL, "EnableSiSCtrl", OPTV_BOOLEAN, {0}, -1 }, { OPTION_STOREDBRIR, "StoredGammaBrightnessRed", OPTV_INTEGER, {0}, -1 }, { OPTION_STOREDBRIG, "StoredGammaBrightnessGreen", OPTV_INTEGER, {0}, -1 }, @@ -268,6 +270,11 @@ SiSOptions(ScrnInfoPtr pScrn) pSiS->NoHostBus = FALSE; /* pSiS->UsePCIRetry = TRUE; */ pSiS->TurboQueue = TRUE; +#ifdef SISVRAMQ + /* TODO: Option (315 series VRAM command queue) */ + /* But beware: sisfb does not know about this!!! */ + pSiS->cmdQueueSize = 512*1024; +#endif pSiS->HWCursor = TRUE; pSiS->Rotate = FALSE; pSiS->ShadowFB = FALSE; @@ -688,6 +695,9 @@ SiSOptions(ScrnInfoPtr pScrn) if(xf86GetOptValString(pSiS->Options, OPTION_SPECIALTIMING)) { xf86DrvMsg(pScrn->scrnIndex, X_WARNING, mystring, "SpecialTiming"); } + if(xf86GetOptValString(pSiS->Options, OPTION_LVDSHL)) { + xf86DrvMsg(pScrn->scrnIndex, X_WARNING, mystring, "LVDSHL"); + } if(xf86GetOptValString(pSiS->Options, OPTION_TVSTANDARD)) { xf86DrvMsg(pScrn->scrnIndex, X_WARNING, mystring, "TVStandard"); } @@ -737,11 +747,19 @@ SiSOptions(ScrnInfoPtr pScrn) } else #endif { - if(pSiS->VGAEngine != SIS_315_VGA) { + if(pSiS->VGAEngine == SIS_315_VGA) { + +#ifdef SISVRAMQ + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Using VRAM command queue, size %dk\n", + pSiS->cmdQueueSize / 1024); +#else + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Using MMIO command queue, size 512k\n"); +#endif + + } else { + + /* TurboQueue */ - /* TurboQueue - * We always use this on 315 series. - */ from = X_DEFAULT; if(xf86GetOptValBool(pSiS->Options, OPTION_TURBOQUEUE, &pSiS->TurboQueue)) { from = X_CONFIG; @@ -754,26 +772,26 @@ SiSOptions(ScrnInfoPtr pScrn) Bool val; - /* RestoreBySetMode (300/315/330 series only) - * Set this to force the driver to set the old mode instead of restoring - * the register contents. This can be used to overcome problems with - * LCD panels and video bridges. - */ + /* RestoreBySetMode (300/315/330 series only) + * Set this to force the driver to set the old mode instead of restoring + * the register contents. This can be used to overcome problems with + * LCD panels and video bridges. + */ if(xf86GetOptValBool(pSiS->Options, OPTION_RESTOREBYSET, &val)) { pSiS->restorebyset = val ? TRUE : FALSE; } - /* EnableHotkey (300/315/330 series only) - * Enables or disables the BIOS hotkey switch for - * switching the output device on laptops. - * This key causes a total machine hang on many 300 series - * machines, it is therefore by default disabled on such. - * In dual head mode, using the hotkey is lethal, so we - * forbid it then in any case. - * However, although the driver disables the hotkey as - * BIOS developers intented to do that, some buggy BIOSes - * still cause the machine to freeze. Hence the warning. - */ + /* EnableHotkey (300/315/330 series only) + * Enables or disables the BIOS hotkey switch for + * switching the output device on laptops. + * This key causes a total machine hang on many 300 series + * machines, it is therefore by default disabled on such. + * In dual head mode, using the hotkey is lethal, so we + * forbid it then in any case. + * However, although the driver disables the hotkey as + * BIOS developers intented to do that, some buggy BIOSes + * still cause the machine to freeze. Hence the warning. + */ { int flag = 0; #ifdef SISDUALHEAD @@ -798,12 +816,12 @@ SiSOptions(ScrnInfoPtr pScrn) } } - /* UseROMData (300/315/330 series only) - * This option is enabling/disabling usage of some machine - * specific data from the BIOS ROM. This option can - and - * should - be used in case the driver makes problems - * because SiS changed the location of this data. - */ + /* UseROMData (300/315/330 series only) + * This option is enabling/disabling usage of some machine + * specific data from the BIOS ROM. This option can - and + * should - be used in case the driver makes problems + * because SiS changed the location of this data. + */ if(xf86GetOptValBool(pSiS->Options, OPTION_USEROMDATA, &val)) { pSiS->OptROMUsage = val ? 1 : 0; xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, @@ -811,13 +829,13 @@ SiSOptions(ScrnInfoPtr pScrn) val ? enabledstr : disabledstr); } - /* UseOEMData (300/315/330 series only) - * The driver contains quite a lot data for OEM LCD panels - * and TV connector specifics which override the defaults. - * If this data is incorrect, the TV may lose color and - * the LCD panel might show some strange effects. Use this - * option to disable the usage of this data. - */ + /* UseOEMData (300/315/330 series only) + * The driver contains quite a lot data for OEM LCD panels + * and TV connector specifics which override the defaults. + * If this data is incorrect, the TV may lose color and + * the LCD panel might show some strange effects. Use this + * option to disable the usage of this data. + */ if(xf86GetOptValBool(pSiS->Options, OPTION_USEOEM, &val)) { pSiS->OptUseOEM = val ? 1 : 0; xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, @@ -825,12 +843,12 @@ SiSOptions(ScrnInfoPtr pScrn) val ? enabledstr : disabledstr); } - /* ForceCRT1 (300/315/330 series only) - * This option can be used to force CRT1 to be switched on/off. Its - * intention is mainly for old monitors that can't be detected - * automatically. This is only useful on machines with a video bridge. - * In normal cases, this option won't be necessary. - */ + /* ForceCRT1 (300/315/330 series only) + * This option can be used to force CRT1 to be switched on/off. Its + * intention is mainly for old monitors that can't be detected + * automatically. This is only useful on machines with a video bridge. + * In normal cases, this option won't be necessary. + */ if(xf86GetOptValBool(pSiS->Options, OPTION_FORCECRT1, &val)) { pSiS->forceCRT1 = val ? 1 : 0; xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, @@ -838,26 +856,26 @@ SiSOptions(ScrnInfoPtr pScrn) val ? "ON" : "OFF"); } - /* NoCRT2DDCDetection (315/330 series only) - * If set to true, this disables CRT2 detection using DDC. This is - * to avoid problems with not entirely DDC compiant LCD panels or - * VGA monitors connected to the secondary VGA plug. Since LCD and - * VGA share the same DDC channel, it might in some cases be impossible - * to determine if the device is a CRT monitor or a flat panel. - */ + /* NoCRT2DDCDetection (315/330 series only) + * If set to true, this disables CRT2 detection using DDC. This is + * to avoid problems with not entirely DDC compiant LCD panels or + * VGA monitors connected to the secondary VGA plug. Since LCD and + * VGA share the same DDC channel, it might in some cases be impossible + * to determine if the device is a CRT monitor or a flat panel. + */ if(xf86GetOptValBool(pSiS->Options, OPTION_NODDCFORCRT2, &val)) { pSiS->nocrt2ddcdetection = val ? TRUE : FALSE; } - /* ForceCRT2ReDetection (315/330 series only) - * If set to true, it forces re-detection of the LCD panel and - * a secondary VGA connection even if the BIOS already had found - * about it. This is meant for custom panels (ie such with - * non-standard resolutions) which the BIOS will "detect" according - * to the established timings, resulting in only a very vague idea - * about the panels real resolution. As for secondary VGA, this - * enables us to include a Plasma panel's proprietary modes. - */ + /* ForceCRT2ReDetection (315/330 series only) + * If set to true, it forces re-detection of the LCD panel and + * a secondary VGA connection even if the BIOS already had found + * about it. This is meant for custom panels (ie such with + * non-standard resolutions) which the BIOS will "detect" according + * to the established timings, resulting in only a very vague idea + * about the panels real resolution. As for secondary VGA, this + * enables us to include a Plasma panel's proprietary modes. + */ if(xf86GetOptValBool(pSiS->Options, OPTION_FORCECRT2REDETECTION, &val)) { if(val) { pSiS->forcecrt2redetection = TRUE; @@ -865,11 +883,11 @@ SiSOptions(ScrnInfoPtr pScrn) } else pSiS->forcecrt2redetection = FALSE; } - /* ForceCRT2Type (300/315/330 series only) - * Used for forcing the driver to initialize a given - * CRT2 device type. - * (SVIDEO, COMPOSITE and SCART for overriding detection) - */ + /* ForceCRT2Type (300/315/330 series only) + * Used for forcing the driver to initialize a given + * CRT2 device type. + * (SVIDEO, COMPOSITE and SCART for overriding detection) + */ strptr = (char *)xf86GetOptValString(pSiS->Options, OPTION_FORCE_CRT2TYPE); if(strptr != NULL) { if(!xf86NameCmp(strptr,"TV")) @@ -962,6 +980,7 @@ SiSOptions(ScrnInfoPtr pScrn) * scaling of modes lower than the panel's native resolution. * Setting this to TRUE will force the bridge/panel link * to scale; FALSE will rely on the panel's capabilities. + * Not supported on all machines. */ if(xf86GetOptValBool(pSiS->Options, OPTION_SCALELCD, &val)) { pSiS->UsePanelScaler = val ? 0 : 1; @@ -991,6 +1010,22 @@ SiSOptions(ScrnInfoPtr pScrn) } } + /* LVDSHL (300/315/330 series + 30xLV bridge only) + * This might be required if the LCD panel is too dark. + * The parameter is an integer from 0 to 3. + */ + if(xf86GetOptValInteger(pSiS->Options, OPTION_LVDSHL, &pSiS->SiS_Pr->LVDSHL)) { + if((pSiS->SiS_Pr->LVDSHL < 0) || (pSiS->SiS_Pr->LVDSHL > 3)) { + xf86DrvMsg(pScrn->scrnIndex, X_WARNING, + "Illegal LVDSHL parameter, valid is 0 through 3\n"); + pSiS->SiS_Pr->LVDSHL = -1; + } else { + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, + "LVDSHL will be %d\n", + pSiS->SiS_Pr->LVDSHL); + } + } + } @@ -1324,12 +1359,19 @@ SiSOptions(ScrnInfoPtr pScrn) #if XF86_VERSION_CURRENT < XF86_VERSION_NUMERIC(4,3,99,0,0) pSiS->NoXvideo = TRUE; xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, - "Rotating screen %sclockwise (2D acceleration and Xv disabled)\n", + "Rotating screen %sclockwise; (2D acceleration and Xv disabled)\n", (pSiS->Rotate == -1) ? "counter " : ""); #else xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, - "Rotating screen %sclockwise (2D acceleration disabled)\n", - (pSiS->Rotate == -1) ? "counter " : ""); + "Rotating screen %sclockwise (2D acceleration %sdisabled)\n", + (pSiS->Rotate == -1) ? "counter " : "", +#if XF86_VERSION_CURRENT >= XF86_VERSION_NUMERIC(4,3,0,0,0) + "and RandR extension " +#else + "" +#endif + ); + #endif } @@ -1406,7 +1448,8 @@ SiSOptions(ScrnInfoPtr pScrn) } if(xf86GetOptValBool(pSiS->Options, OPTION_XVDEFDISABLEGFX, &val)) { if(val) pSiS->XvDefDisableGfx = TRUE; - xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Graphics display will be %s during Xv usage\n", + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, + "Graphics display will be %s during Xv usage\n", val ? disabledstr : enabledstr); } if((pSiS->VGAEngine == SIS_300_VGA) || (pSiS->VGAEngine == SIS_315_VGA)) { diff --git a/xc/programs/Xserver/hw/xfree86/drivers/sis/vstruct.h b/xc/programs/Xserver/hw/xfree86/drivers/sis/vstruct.h index 4e6156207..74dd31d7c 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/sis/vstruct.h +++ b/xc/programs/Xserver/hw/xfree86/drivers/sis/vstruct.h @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/vstruct.h,v 1.11 2003/08/07 12:52:24 twini Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/vstruct.h,v 1.13 2003/08/26 14:29:36 twini Exp $ */ /* * General structure definitions for universal mode switching modules * @@ -222,6 +222,7 @@ typedef UCHAR DRAM4Type[4]; #define CUT_COMPAQ12802 5 #define CUT_PANEL848 6 #define CUT_CLEVO1024 7 +#define CUT_CLEVO10242 8 typedef struct _SiS_Private { @@ -637,6 +638,8 @@ typedef struct _SiS_Private BOOLEAN SiS_CHPALM; BOOLEAN SiS_CHPALN; + + int LVDSHL; BOOLEAN Backup; UCHAR Backup_Mode; |