Signed-off-by: Andrew Morton --- 25-akpm/drivers/char/drm/sis_mm.c | 2 25-akpm/drivers/video/sis/310vtbl.h | 40 +- 25-akpm/drivers/video/sis/init.c | 20 + 25-akpm/drivers/video/sis/init.h | 45 -- 25-akpm/drivers/video/sis/init301.c | 51 +- 25-akpm/drivers/video/sis/init301.h | 2 25-akpm/drivers/video/sis/initdef.h | 4 25-akpm/drivers/video/sis/osdef.h | 5 25-akpm/drivers/video/sis/sis.h | 17 25-akpm/drivers/video/sis/sis_main.c | 691 +++++++++++++++++++++++++++++------ 25-akpm/drivers/video/sis/sis_main.h | 62 +-- 11 files changed, 736 insertions(+), 203 deletions(-) diff -puN drivers/char/drm/sis_mm.c~sisfb-update-1710-fixes drivers/char/drm/sis_mm.c --- 25/drivers/char/drm/sis_mm.c~sisfb-update-1710-fixes 2004-06-07 21:41:15.299764856 -0700 +++ 25-akpm/drivers/char/drm/sis_mm.c 2004-06-07 21:41:15.319761816 -0700 @@ -113,7 +113,7 @@ int sis_fb_alloc( DRM_IOCTL_ARGS ) DRM_COPY_TO_USER_IOCTL((drm_sis_mem_t *)data, fb, sizeof(fb)); - DRM_DEBUG("alloc fb, size = %d, offset = %ld\n", fb.size, req.offset); + DRM_DEBUG("alloc fb, size = %d, offset = %d\n", fb.size, req.offset); return retval; } diff -puN drivers/video/sis/310vtbl.h~sisfb-update-1710-fixes drivers/video/sis/310vtbl.h --- 25/drivers/video/sis/310vtbl.h~sisfb-update-1710-fixes 2004-06-07 21:41:15.301764552 -0700 +++ 25-akpm/drivers/video/sis/310vtbl.h 2004-06-07 21:41:15.322761360 -0700 @@ -151,21 +151,27 @@ static const SiS_ExtStruct SiS310_EMode {0x3f,0x6a1b,0x0000,SIS_RI_856x480, 0x00,0x00,0x00,0x00,0x47,-1}, /* 856x480 */ {0x42,0x6a3d,0x0000,SIS_RI_856x480, 0x00,0x00,0x00,0x00,0x47,-1}, {0x45,0x6a7f,0x0000,SIS_RI_856x480, 0x00,0x00,0x00,0x00,0x47,-1}, - {0x48,0x6a1b,0x0000,SIS_RI_1360x768, 0x00,0x00,0x00,0x00,0x49,-1}, /* 1360x768 */ - {0x4b,0x6a3d,0x0000,SIS_RI_1360x768, 0x00,0x00,0x00,0x00,0x49,-1}, - {0x4e,0x6a7f,0x0000,SIS_RI_1360x768, 0x00,0x00,0x00,0x00,0x49,-1}, + {0x48,0x6a3b,0x0000,SIS_RI_1360x768, 0x00,0x00,0x00,0x00,0x49,-1}, /* 1360x768 */ + {0x4b,0x6a7d,0x0000,SIS_RI_1360x768, 0x00,0x00,0x00,0x00,0x49,-1}, + {0x4e,0x6aff,0x0000,SIS_RI_1360x768, 0x00,0x00,0x00,0x00,0x49,-1}, {0x4f,0x9a1f,0x0000,SIS_RI_320x200, 0x00,0x00,0x04,0x04,0x25, 0}, /* 320x200x32 */ {0x53,0x9a1f,0x0000,SIS_RI_320x240, 0x00,0x00,0x04,0x04,0x26, 2}, /* 320x240x32 */ {0x54,0xba1f,0x0000,SIS_RI_400x300, 0x00,0x00,0x07,0x07,0x27, 3}, /* 400x300x32 */ {0x5f,0x6a1b,0x0000,SIS_RI_768x576, 0x00,0x00,0x06,0x06,0x4a,-1}, /* 768x576 */ {0x60,0x6a1d,0x0000,SIS_RI_768x576, 0x00,0x00,0x06,0x06,0x4a,-1}, - {0x61,0x6a1f,0x0000,SIS_RI_768x576, 0x00,0x00,0x06,0x06,0x4a,-1}, - {0x14,0x0e1b,0x0000,SIS_RI_1280x800, 0x00,0x00,0x00,0x00,0x4b, 7}, /* 1280x800 */ - {0x15,0x0e3d,0x0000,SIS_RI_1280x800, 0x00,0x00,0x00,0x00,0x4b, 7}, - {0x16,0x0e7f,0x0000,SIS_RI_1280x800, 0x00,0x00,0x00,0x00,0x4b, 7}, - {0x17,0x0e1b,0x0000,SIS_RI_1680x1050,0x00,0x00,0x00,0x00,0x4c, 9}, /* 1680x1050 */ - {0x18,0x0e3d,0x0000,SIS_RI_1680x1050,0x00,0x00,0x00,0x00,0x4c, 9}, - {0x19,0x0e7f,0x0000,SIS_RI_1680x1050,0x00,0x00,0x00,0x00,0x4c, 9}, + {0x61,0x6a3f,0x0000,SIS_RI_768x576, 0x00,0x00,0x06,0x06,0x4a,-1}, + {0x14,0x0e3b,0x0000,SIS_RI_1280x800, 0x00,0x00,0x00,0x00,0x4b, 7}, /* 1280x800 */ + {0x15,0x0e7d,0x0000,SIS_RI_1280x800, 0x00,0x00,0x00,0x00,0x4b, 7}, + {0x16,0x0eff,0x0000,SIS_RI_1280x800, 0x00,0x00,0x00,0x00,0x4b, 7}, + {0x17,0x0e3b,0x0000,SIS_RI_1680x1050,0x00,0x00,0x00,0x00,0x4c, 9}, /* 1680x1050 */ + {0x18,0x0e7d,0x0000,SIS_RI_1680x1050,0x00,0x00,0x00,0x00,0x4c, 9}, + {0x19,0x0eff,0x0000,SIS_RI_1680x1050,0x00,0x00,0x00,0x00,0x4c, 9}, + {0x2c,0x267b,0x0000,SIS_RI_1920x1080,0x00,0x00,0x00,0x00,0x4d,-1}, /* 1920x1080(i) */ + {0x2d,0x26fd,0x0000,SIS_RI_1920x1080,0x00,0x00,0x00,0x00,0x4d,-1}, + {0x73,0x27ff,0x0000,SIS_RI_1920x1080,0x00,0x00,0x00,0x00,0x4d,-1}, + {0x1d,0x6a1b,0x0000,SIS_RI_960x540, 0x00,0x00,0x00,0x00,0x4e,-1}, /* 960x540 */ + {0x1e,0x6a3d,0x0000,SIS_RI_960x540, 0x00,0x00,0x00,0x00,0x4e,-1}, + {0x1f,0x6a7f,0x0000,SIS_RI_960x540, 0x00,0x00,0x00,0x00,0x4e,-1}, {0xff,0x0000,0x0000,0, 0x00,0x00,0x00,0x00,0x00,-1} }; @@ -248,6 +254,8 @@ static const SiS_Ext2Struct SiS310_RefIn {0x006f,0x4d,0x03,0x06,0x15,0x5f, 768, 576, 0x30}, /* 0x4a 768x576-56Hz */ {0x0067,0x4f,0x5c,0x08,0x0d,0x14,1280, 800, 0x30}, /* 0x4b 1280x800-60Hz */ {0x0067,0x50,0x5d,0x0c,0x0e,0x17,1680,1050, 0x30}, /* 0x4c 1680x1050-60Hz */ + {0x0087,0x51,0x69,0x00,0x00,0x2c,1920,1080, 0x30}, /* 0x4d 1920x1080 60Hzi */ + {0x0067,0x52,0x6a,0x00,0x1c,0x1d, 960, 540, 0x30}, /* 0x4e 960x540 60Hz */ {0xffff,0x00,0x00,0x00,0x00,0x00, 0, 0, 0} }; @@ -510,7 +518,13 @@ static const SiS_CRT1TableStruct SiS310_ 0x21}}, /* 0x4f */ {{0x15,0xd1,0xd1,0x99,0xe2,0x19,0x3d,0x10, /* 1680x1050-60 */ 0x1a,0x8d,0x19,0x19,0x3e,0x2f,0x01,0x0c, - 0x20}} /* 0x50 */ + 0x20}}, /* 0x50 */ + {{0x0e,0xef,0xef,0x92,0xfe,0x03,0x30,0xf0, /* 1920x1080-60i */ + 0x1e,0x83,0x1b,0x1c,0x31,0x00,0x01,0x00, + 0x61}}, /* 0x51 */ + {{0x85,0x77,0x77,0x89,0x7d,0x01,0x31,0xf0, /* 960x540-60 */ + 0x1e,0x84,0x1b,0x1c,0x32,0x00,0x00,0x02, + 0x41}} /* 0x52 */ }; static const SiS_MCLKDataStruct SiS310_MCLKData_0_315[] = @@ -692,6 +706,8 @@ static SiS_VCLKDataStruct SiS310_VCLKDat { 0x5c,0xc6, 32}, /* 0x66 856x480@60 */ { 0x76,0xe7, 27}, /* 0x67 720x480@60 */ { 0x5f,0xc6, 33}, /* 0x68 720/768x576@60 */ + { 0x52,0x27, 75}, /* 0x69 1920x1080i 60Hz interlaced */ + { 0x7c,0x6b, 38} /* 0x6a 960x540@60 */ }; static SiS_VBVCLKDataStruct SiS310_VBVCLKData[]= @@ -807,6 +823,8 @@ static SiS_VBVCLKDataStruct SiS310_VBVCL { 0x5c,0xc6, 32}, /* 0x66 856x480@60 */ { 0x76,0xe7, 27}, /* 0x67 720x480@60 */ { 0x5f,0xc6, 33}, /* 0x68 720/768x576@60 */ + { 0x52,0x27, 75}, /* 0x69 1920x1080i 60Hz interlaced (UNUSED) */ + { 0x7c,0x6b, 38} /* 0x6a 960x540@60 */ }; static const DRAM4Type SiS310_SR15[8] = { diff -puN drivers/video/sis/init301.c~sisfb-update-1710-fixes drivers/video/sis/init301.c --- 25/drivers/video/sis/init301.c~sisfb-update-1710-fixes 2004-06-07 21:41:15.304764096 -0700 +++ 25-akpm/drivers/video/sis/init301.c 2004-06-07 21:41:15.331759992 -0700 @@ -427,6 +427,7 @@ SiS_DDC2Delay(SiS_Private *SiS_Pr, USHOR } } +#if defined(SIS300) || defined(SIS315H) static void SiS_GenericDelay(SiS_Private *SiS_Pr, USHORT delay) { @@ -441,6 +442,7 @@ SiS_GenericDelay(SiS_Private *SiS_Pr, US delay--; } } +#endif #ifdef SIS315H static void @@ -452,6 +454,7 @@ SiS_LongDelay(SiS_Private *SiS_Pr, USHOR } #endif +#if defined(SIS300) || defined(SIS315H) static void SiS_ShortDelay(SiS_Private *SiS_Pr, USHORT delay) { @@ -459,12 +462,15 @@ SiS_ShortDelay(SiS_Private *SiS_Pr, USHO SiS_GenericDelay(SiS_Pr,0x42); } } +#endif static void SiS_PanelDelay(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo, USHORT DelayTime) { +#if defined(SIS300) || defined(SIS315H) UCHAR *ROMAddr = HwInfo->pjVirtualRomBase; USHORT PanelID, DelayIndex, Delay=0; +#endif if(HwInfo->jChipType < SIS_315H) { @@ -593,6 +599,7 @@ SiS_WaitRetrace1(SiS_Private *SiS_Pr) while((!(SiS_GetRegByte(SiS_Pr->SiS_P3da) & 0x08)) && --watchdog); } +#if defined(SIS300) || defined(SIS315H) static void SiS_WaitRetrace2(SiS_Private *SiS_Pr, USHORT reg) { @@ -603,6 +610,7 @@ SiS_WaitRetrace2(SiS_Private *SiS_Pr, US watchdog = 65535; while((!(SiS_GetReg(SiS_Pr->SiS_Part1Port,reg) & 0x02)) && --watchdog); } +#endif static void SiS_WaitVBRetrace(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo) @@ -2040,6 +2048,7 @@ SiS_GetVCLK2Ptr(SiS_Private *SiS_Pr, USH if((SiS_Pr->SiS_LCDInfo & DontExpandLCD) && (SiS_Pr->SiS_LCDInfo & LCDPass11)) { VCLKIndex = VCLKIndexGEN; switch(resinfo) { + /* Only those whose IndexGEN doesn't match VBVCLK array: */ case SIS_RI_1280x720: VCLKIndex = VCLK_1280x720; if(SiS_Pr->SiS_LCDResInfo == Panel_1280x720) { if(SiS_Pr->PanelHT == 1344) { @@ -2229,7 +2238,10 @@ SiS_SetCRT2ModeRegs(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo) { USHORT i,j,modeflag; - USHORT tempbl,tempcl,tempah=0; + USHORT tempcl,tempah=0; +#if defined(SIS300) || defined(SIS315H) + USHORT tempbl; +#endif #ifdef SIS315H UCHAR *ROMAddr = HwInfo->pjVirtualRomBase; USHORT tempah2, tempbl2; @@ -4158,8 +4170,10 @@ SiS_EnableBridge(SiS_Private *SiS_Pr, PS #ifdef SIS315H /* 315 series */ +#ifdef SET_EMI UCHAR r30=0, r31=0, r32=0, r33=0, cr36=0; /* USHORT emidelay=0; */ +#endif if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) { SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x1f,0xef); @@ -4256,9 +4270,9 @@ SiS_EnableBridge(SiS_Private *SiS_Pr, PS } #endif SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x27,0x0c); -#ifdef SET_EMI - if(SiS_Pr->SiS_VBType & (VB_SIS302LV | VB_SIS302ELV)) { + if(SiS_Pr->SiS_VBType & (VB_SIS302LV | VB_SIS302ELV)) { +#ifdef SET_EMI cr36 = SiS_GetReg(SiS_Pr->SiS_P3d4,0x36); if(SiS_Pr->SiS_ROMNew) { @@ -4373,12 +4387,11 @@ SiS_EnableBridge(SiS_Private *SiS_Pr, PS SiS_SetReg(SiS_Pr->SiS_Part4Port,0x31,r31); SiS_SetReg(SiS_Pr->SiS_Part4Port,0x32,r32); SiS_SetReg(SiS_Pr->SiS_Part4Port,0x33,r33); - if(!(SiS_Pr->OverruleEMI && (!r30) && (!r31) && (!r32) && (!r33))) { - SiS_SetReg(SiS_Pr->SiS_Part4Port,0x34,0x10); - } else { - SiS_SetReg(SiS_Pr->SiS_Part4Port,0x34,0x00); - } +#endif /* SET_EMI */ + SiS_SetReg(SiS_Pr->SiS_Part4Port,0x34,0x10); + +#ifdef SET_EMI if( (SiS_LCDAEnabled(SiS_Pr, HwInfo)) || (SiS_CRT2IsLCD(SiS_Pr, HwInfo)) ) { if(r30 & 0x40) { @@ -4394,8 +4407,8 @@ SiS_EnableBridge(SiS_Private *SiS_Pr, PS SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x30,0x40); } } - } #endif + } } if(!(SiS_WeHaveBacklightCtrl(SiS_Pr,HwInfo))) { @@ -6024,7 +6037,9 @@ static void SiS_SetGroup1(SiS_Private *SiS_Pr, USHORT ModeNo, USHORT ModeIdIndex, PSIS_HW_INFO HwInfo, USHORT RefreshRateTableIndex) { +#if defined(SIS300) || defined(SIS315H) UCHAR *ROMAddr = HwInfo->pjVirtualRomBase; +#endif USHORT temp=0, tempax=0, tempbx=0, tempcx=0, bridgeadd=0; USHORT pushbx=0, CRT1Index=0, modeflag, resinfo=0; #ifdef SIS315H @@ -7566,13 +7581,14 @@ SiS_SetGroup4(SiS_Private *SiS_Pr, USHOR if(SiS_IsDualLink(SiS_Pr, HwInfo)) { SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x27,0x2c); } -#ifdef SET_EMI + if(SiS_Pr->SiS_VBType & (VB_SIS302LV | VB_SIS302ELV)) { SiS_SetReg(SiS_Pr->SiS_Part4Port,0x2a,0x00); +#ifdef SET_EMI SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x30,0x0c); +#endif SiS_SetReg(SiS_Pr->SiS_Part4Port,0x34,0x10); } -#endif } return; } @@ -7721,13 +7737,13 @@ SiS_SetGroup4(SiS_Private *SiS_Pr, USHOR SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x27,0x2c); } } -#ifdef SET_EMI if(SiS_Pr->SiS_VBType & (VB_SIS302LV | VB_SIS302ELV)) { SiS_SetReg(SiS_Pr->SiS_Part4Port,0x2a,0x00); +#ifdef SET_EMI SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x30,0x0c); +#endif SiS_SetReg(SiS_Pr->SiS_Part4Port,0x34,0x10); } -#endif } } /* 301B */ @@ -7933,7 +7949,10 @@ static void SiS_SetCHTVReg(SiS_Private *SiS_Pr, USHORT ModeNo, USHORT ModeIdIndex, USHORT RefreshRateTableIndex) { - USHORT temp, tempbx, tempcl; +#if defined(SIS300) || defined(SIS315H) + USHORT temp, tempbx; +#endif + USHORT tempcl; USHORT TVType, resindex; const SiS_CHTVRegDataStruct *CHTVRegData = NULL; @@ -11368,13 +11387,13 @@ SiS_FinalizeLCD(SiS_Private *SiS_Pr, USH if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) { if(SiS_Pr->SiS_LCDResInfo == Panel_1024x768) { -#ifdef SET_EMI if(SiS_Pr->SiS_VBType & (VB_SIS302LV | VB_SIS302ELV)) { SiS_SetReg(SiS_Pr->SiS_Part4Port,0x2a,0x00); +#ifdef SET_EMI SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x30,0x0c); +#endif SiS_SetReg(SiS_Pr->SiS_Part4Port,0x34,0x10); } -#endif } else if(SiS_Pr->SiS_LCDResInfo == Panel_1280x1024) { if(SiS_Pr->LVDSHL == -1) { /* Maybe ACER only? */ diff -puN drivers/video/sis/init301.h~sisfb-update-1710-fixes drivers/video/sis/init301.h --- 25/drivers/video/sis/init301.h~sisfb-update-1710-fixes 2004-06-07 21:41:15.305763944 -0700 +++ 25-akpm/drivers/video/sis/init301.h 2004-06-07 21:41:15.332759840 -0700 @@ -218,7 +218,7 @@ static const UCHAR SiS_Part2CLVX_6[] = { 0x00,0x04, 0x04,0x1A,0x04,0x7E,0x02,0x1B,0x05,0x7E,0x01,0x1A,0x07,0x7E,0x00,0x1A,0x09,0x7D, 0x7F,0x19,0x0B,0x7D,0x7E,0x18,0x0D,0x7D,0x7D,0x17,0x10,0x7C,0x7D,0x15,0x12,0x7C, - 0x7C,0x14,0x14,0x7C,0x7C,0x12,0x15,0x7D,0x7C,0x10,0x17,0x7D /* 0x1D(6330)? */ ,0x7C,0x0D,0x18,0x7F, + 0x7C,0x14,0x14,0x7C,0x7C,0x12,0x15,0x7D,0x7C,0x10,0x17,0x7D,0x7C,0x0D,0x18,0x7F, 0x7D,0x0B,0x19,0x7F,0x7D,0x09,0x1A,0x00,0x7D,0x07,0x1A,0x02,0x7E,0x05,0x1B,0x02, 0xFF,0xFF, }; diff -puN drivers/video/sis/init.c~sisfb-update-1710-fixes drivers/video/sis/init.c --- 25/drivers/video/sis/init.c~sisfb-update-1710-fixes 2004-06-07 21:41:15.307763640 -0700 +++ 25-akpm/drivers/video/sis/init.c 2004-06-07 21:41:15.336759232 -0700 @@ -82,6 +82,7 @@ /* POINTER INITIALIZATION */ /*********************************************/ +#if defined(SIS300) || defined(SIS315H) static void InitCommonPointer(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo) { @@ -208,6 +209,7 @@ InitCommonPointer(SiS_Private *SiS_Pr, P SiS_Pr->SiS_PanelMinLVDS = Panel_800x600; /* lowest value LVDS/LCDA */ SiS_Pr->SiS_PanelMin301 = Panel_1024x768; /* lowest value 301 */ } +#endif #ifdef SIS300 static void @@ -652,6 +654,11 @@ SiS_GetModeID(int VGAEngine, ULONG VBFla case 856: if(VDisplay == 480) ModeIndex = ModeIndex_856x480[Depth]; break; + case 960: + if(VGAEngine == SIS_315_VGA) { + if(VDisplay == 540) ModeIndex = ModeIndex_960x540[Depth]; + } + break; case 1024: if(VDisplay == 768) ModeIndex = ModeIndex_1024x768[Depth]; else if(VDisplay == 576) ModeIndex = ModeIndex_1024x576[Depth]; @@ -723,6 +730,9 @@ SiS_GetModeID(int VGAEngine, ULONG VBFla break; case 1920: if(!(VBFlags & CRT1_LCDA)) { + if(VGAEngine == SIS_315_VGA) { + if(VDisplay == 1080) ModeIndex = ModeIndex_1920x1080[Depth]; + } if(VDisplay == 1440) ModeIndex = ModeIndex_1920x1440[Depth]; } break; @@ -888,6 +898,11 @@ SiS_GetModeID_LCD(int VGAEngine, ULONG V if(VDisplay == 480) ModeIndex = ModeIndex_856x480[Depth]; } break; + case 960: + if(VGAEngine == SIS_315_VGA) { + if(VDisplay == 540) ModeIndex = ModeIndex_960x540[Depth]; + } + break; case 1024: if(VDisplay == 768) ModeIndex = ModeIndex_1024x768[Depth]; if(VGAEngine == SIS_315_VGA) { @@ -1109,6 +1124,11 @@ SiS_GetModeID_VGA2(int VGAEngine, ULONG case 856: if(VDisplay == 480) ModeIndex = ModeIndex_856x480[Depth]; break; + case 960: + if(VGAEngine == SIS_315_VGA) { + if(VDisplay == 540) ModeIndex = ModeIndex_960x540[Depth]; + } + break; case 1024: if(VDisplay == 768) ModeIndex = ModeIndex_1024x768[Depth]; else if(VDisplay == 576) ModeIndex = ModeIndex_1024x576[Depth]; diff -puN drivers/video/sis/initdef.h~sisfb-update-1710-fixes drivers/video/sis/initdef.h --- 25/drivers/video/sis/initdef.h~sisfb-update-1710-fixes 2004-06-07 21:41:15.308763488 -0700 +++ 25-akpm/drivers/video/sis/initdef.h 2004-06-07 21:41:15.337759080 -0700 @@ -437,7 +437,7 @@ #define SIS_RI_856x480 19 #define SIS_RI_1280x768 20 #define SIS_RI_1400x1050 21 -#define SIS_RI_1152x864 22 /* Up to this SiS conforming */ +#define SIS_RI_1152x864 22 /* Up to here SiS conforming */ #define SIS_RI_848x480 23 #define SIS_RI_1360x768 24 #define SIS_RI_1024x600 25 @@ -446,6 +446,8 @@ #define SIS_RI_1360x1024 28 #define SIS_RI_1680x1050 29 #define SIS_RI_1280x800 30 +#define SIS_RI_1920x1080 31 +#define SIS_RI_960x540 32 /* CR5F */ #define IsM650 0x80 diff -puN drivers/video/sis/init.h~sisfb-update-1710-fixes drivers/video/sis/init.h --- 25/drivers/video/sis/init.h~sisfb-update-1710-fixes 2004-06-07 21:41:15.310763184 -0700 +++ 25-akpm/drivers/video/sis/init.h 2004-06-07 21:41:15.340758624 -0700 @@ -99,6 +99,7 @@ const USHORT ModeIndex_800x480[] = const USHORT ModeIndex_800x600[] = {0x30, 0x47, 0x00, 0x63}; const USHORT ModeIndex_848x480[] = {0x39, 0x3b, 0x00, 0x3e}; const USHORT ModeIndex_856x480[] = {0x3f, 0x42, 0x00, 0x45}; +const USHORT ModeIndex_960x540[] = {0x1d, 0x1e, 0x00, 0x1f}; /* 315 series only */ const USHORT ModeIndex_1024x768[] = {0x38, 0x4a, 0x00, 0x64}; const USHORT ModeIndex_1024x576[] = {0x71, 0x74, 0x00, 0x77}; const USHORT ModeIndex_1024x600[] = {0x20, 0x21, 0x00, 0x22}; /* 300 series only */ @@ -115,6 +116,7 @@ const USHORT ModeIndex_300_1360x1024[]= const USHORT ModeIndex_1400x1050[] = {0x26, 0x27, 0x00, 0x28}; /* 315 series only */ const USHORT ModeIndex_1680x1050[] = {0x17, 0x18, 0x00, 0x19}; /* 315 series only */ const USHORT ModeIndex_1600x1200[] = {0x3c, 0x3d, 0x00, 0x66}; +const USHORT ModeIndex_1920x1080[] = {0x2c, 0x2d, 0x00, 0x73}; /* 315 series only */ const USHORT ModeIndex_1920x1440[] = {0x68, 0x69, 0x00, 0x6b}; const USHORT ModeIndex_300_2048x1536[]= {0x6c, 0x6d, 0x00, 0x00}; const USHORT ModeIndex_310_2048x1536[]= {0x6c, 0x6d, 0x00, 0x6e}; @@ -255,9 +257,12 @@ static const SiS_ModeResInfoStruct SiS_M { 768, 576, 8,16}, /* 0x1b */ { 1360,1024, 8,16}, /* 0x1c */ { 1680,1050, 8,16}, /* 0x1d */ - { 1280, 800, 8,16} /* 0x1e */ + { 1280, 800, 8,16}, /* 0x1e */ + { 1920,1080, 8,16}, /* 0x1f */ + { 960, 540, 8,16} /* 0x20 */ }; +#if defined(SIS300) || defined(SIS315H) static SiS_StandTableStruct SiS_StandTable[]= { /* 0x00: MD_0_200 */ @@ -696,6 +701,7 @@ static SiS_StandTableStruct SiS_StandTab 0xff} } }; +#endif /**************************************************************/ /* SIS VIDEO BRIDGE ----------------------------------------- */ @@ -934,10 +940,10 @@ static const SiS_TVDataStruct SiS_Ext75 #if 0 { 2, 1, 0x35a,0x1f7,0x4f6,0x1e0, 0,128, 0, 0x00,0x00,0x00,0x00}, /* 720x480 */ #endif - { 99, 32, 0x320,0x1fe,0x500,0x2d0, 50, 0, 0, 0x00,0x00,0x00,0x00}, /* 720x480 test */ + { 99, 32, 0x320,0x1fe,0x500,0x2d0, 50, 0, 0, 0x00,0x00,0x00,0x00}, /* 720x480 test WORKS */ { 68, 64, 0x55f,0x346,0x500,0x2a8,0x27e, 0, 0, 0x00,0x00,0x00,0x00}, /* 1024x768 */ { 5, 2, 0x3a7,0x226,0x500,0x2a8, 0,128, 0, 0x00,0x00,0x00,0x00}, /* 720x576 */ - { 25, 24, 0x5d8,0x2f3,0x460,0x2a8, 50, 0, 0, 0x00,0x00,0x00,0x00} /* 1280x720 */ + { 25, 24, 0x5d8,0x2f3,0x460,0x2a8, 50, 0, 0, 0x00,0x00,0x00,0x00} /* 1280x720 WORKS */ #endif #if 0 { 3, 1, 0x3a7,0x1d6,0x500,0x2a8, 50, 0, 0, 0x00,0x00,0x00,0x00}, @@ -951,7 +957,7 @@ static const SiS_TVDataStruct SiS_Ext75 { 25, 24, 0x5d8,0x2f3,0x460,0x2a8, 50, 0, 0, 0x00,0x00,0x00,0x00} /* 1280x720 */ #endif #if 0 - { 136, 35, 0x339,0x181,0x460,0x2a8, 50, 0, 0, 0x00,0x00,0x00,0x00}, /* TEST (0.93) */ + { 136, 35, 0x339,0x181,0x460,0x2a8, 50, 0, 0, 0x00,0x00,0x00,0x00}, /* TEST (0.93) BAD */ { 17, 6, 0x339,0x203,0x460,0x2a8, 50, 0, 50, 0x00,0x00,0x00,0x00}, { 136, 35, 0x339,0x181,0x460,0x2a8, 50, 0, 50, 0x00,0x00,0x00,0x00}, { 17, 6, 0x339,0x203,0x460,0x2a8, 50, 0, 50, 0x00,0x00,0x00,0x00}, @@ -1062,25 +1068,17 @@ static const SiS_LCDDataStruct SiS_StLC { 1, 1, 1688, 1066, 1688, 1066 } }; -#undef SISUSE6330MODES - static const SiS_LCDDataStruct SiS_ExtLCD1400x1050Data[] = { -#ifdef SISUSE6330MODES - { 211, 60, 1260, 410, 1688, 1066 }, /* 640x400 (6330) */ -#else +/* { 211, 60, 1260, 410, 1688, 1066 }, 640x400 (6330) */ { 211, 100, 2100, 408, 1688, 1066 }, /* 640x400 (6325) WORKS */ -#endif { 211, 64, 1536, 358, 1688, 1066 }, { 211, 100, 2100, 408, 1688, 1066 }, { 211, 64, 1536, 358, 1688, 1066 }, -#ifdef SISUSE6330MODES - { 211, 80, 1400, 490, 1688, 1066 }, /* 640x480 (6330) */ - { 211, 117, 1638, 613, 1688, 1066 }, /* 800x600 (6330) */ -#else +/* { 211, 80, 1400, 490, 1688, 1066 }, 640x480 (6330) */ { 211, 48, 840, 488, 1688, 1066 }, /* 640x480 (6325) WORKS */ +/* { 211, 117, 1638, 613, 1688, 1066 }, 800x600 (6330) */ { 211, 72, 1008, 609, 1688, 1066 }, /* 800x600 (6325) WORKS */ -#endif { 211, 128, 1400, 776, 1688, 1066 }, /* 1024x768 */ { 211, 205, 1680, 1041, 1688, 1066 }, /* 1280x1024 - not used (always unscaled) */ { 1, 1, 1688, 1066, 1688, 1066 }, /* 1400x1050 */ @@ -1121,19 +1119,13 @@ static const SiS_LCDDataStruct SiS_StLC static const SiS_LCDDataStruct SiS_ExtLCD1600x1200Data[] = { -#ifndef SISUSE6330MODES - {72,11, 990, 422, 2160, 1250 }, /* 640x400 (6330) */ -#else - {27, 4, 800, 500, 2160, 1250 }, /* 640x400 (6235) */ -#endif + {72,11, 990, 422, 2160, 1250 }, /* 640x400 (6330) WORKS */ +/* {27, 4, 800, 500, 2160, 1250 }, 640x400 (6235) */ {27, 4, 800, 500, 2160, 1250 }, { 6, 1, 900, 500, 2160, 1250 }, { 6, 1, 900, 500, 2160, 1250 }, -#ifndef SISUSE6330MODES - {45, 8, 960, 505, 2160, 1250 }, /* 640x480 (6330) */ -#else - {27, 1, 800, 500, 2160, 1250 }, /* 640x480 (6325) */ -#endif + {45, 8, 960, 505, 2160, 1250 }, /* 640x480 (6330) WORKS */ +/* {27, 1, 800, 500, 2160, 1250 }, 640x480 (6325) */ { 4, 1,1080, 625, 2160, 1250 }, { 5, 2,1350, 800, 2160, 1250 }, {27,16,1500,1064, 2160, 1250 }, /* 1280x1024 */ @@ -1170,7 +1162,8 @@ static const SiS_LCDDataStruct SiS_NoSc { 1, 1,1056, 497,1056, 497 }, /* 0x18: 800x480 */ { 1, 1,1328, 739,1328, 739 }, /* 0x19: 1024x576 */ { 1, 1,1680, 892,1680, 892 }, /* 0x1a: 1152x864 */ - { 1, 1,1808, 808,1808, 808 } /* 0x1b: 1360x768 */ + { 1, 1,1808, 808,1808, 808 }, /* 0x1b: 1360x768 */ + { 1, 1,1104, 563,1104, 563 } /* 0x1c: 960x540 */ }; diff -puN drivers/video/sis/osdef.h~sisfb-update-1710-fixes drivers/video/sis/osdef.h --- 25/drivers/video/sis/osdef.h~sisfb-update-1710-fixes 2004-06-07 21:41:15.311763032 -0700 +++ 25-akpm/drivers/video/sis/osdef.h 2004-06-07 21:41:15.341758472 -0700 @@ -94,6 +94,11 @@ #define SIS315H #endif +#if !defined(SIS300) && !defined(SIS315H) +#warning Neither CONFIG_FB_SIS_300 nor CONFIG_FB_SIS_315 is set +#warning sisfb will not work! +#endif + #define OutPortByte(p,v) outb((u8)(v),(SISIOADDRESS)(p)) #define OutPortWord(p,v) outw((u16)(v),(SISIOADDRESS)(p)) #define OutPortLong(p,v) outl((u32)(v),(SISIOADDRESS)(p)) diff -puN drivers/video/sis/sis.h~sisfb-update-1710-fixes drivers/video/sis/sis.h --- 25/drivers/video/sis/sis.h~sisfb-update-1710-fixes 2004-06-07 21:41:15.313762728 -0700 +++ 25-akpm/drivers/video/sis/sis.h 2004-06-07 21:41:15.341758472 -0700 @@ -37,7 +37,7 @@ #define VER_MAJOR 1 #define VER_MINOR 7 -#define VER_LEVEL 10 +#define VER_LEVEL 12 #undef SIS_CONFIG_COMPAT @@ -293,12 +293,6 @@ #define MMIO_QUEUE_WRITEPORT Q_WRITE_PTR #define MMIO_QUEUE_READPORT Q_READ_PTR -#if !defined(__i386__) && !defined(__x86_64__) -#ifndef ioremap_nocache -#define ioremap_nocache(X, Y) ioremap(X, Y) -#endif -#endif - enum _SIS_CMDTYPE { MMIO_CMD = 0, AGP_CMD_QUEUE, @@ -411,16 +405,14 @@ struct sis_video_info { int video_cmap_len; int video_width; int video_height; - int video_vwidth; /* DEPRECATED - use var instead */ - int video_vheight; /* DEPRECATED - use var instead */ - int org_x; /* DEPRECATED - use var instead */ - int org_y; /* DEPRECATED - use var instead */ - int video_linelength; unsigned int refresh_rate; unsigned int chip; u8 revision_id; + int video_linelength; /* real pitch */ + int scrnpitchCRT1; /* pitch regarding interlace */ + u16 DstColor; /* For 2d acceleration */ u32 SiS310_AccelDepth; u32 CommandReg; @@ -448,6 +440,7 @@ struct sis_video_info { int current_height; int current_htotal; int current_vtotal; + int current_linelength; __u32 current_pixclock; int current_refresh_rate; diff -puN drivers/video/sis/sis_main.c~sisfb-update-1710-fixes drivers/video/sis/sis_main.c --- 25/drivers/video/sis/sis_main.c~sisfb-update-1710-fixes 2004-06-07 21:41:15.314762576 -0700 +++ 25-akpm/drivers/video/sis/sis_main.c 2004-06-07 21:41:15.350757104 -0700 @@ -536,6 +536,25 @@ sisfb_verify_rate(struct sis_video_info if(mode_idx < 0) return FALSE; + /* Skip for 320x200, 320x240, 640x400 */ + switch(sisbios_mode[mode_idx].mode_no[ivideo->mni]) { + case 0x59: + case 0x41: + case 0x4f: + case 0x50: + case 0x56: + case 0x53: + case 0x2f: + case 0x5d: + case 0x5e: + return TRUE; +#ifdef CONFIG_FB_SIS_315 + case 0x5a: + case 0x5b: + if(ivideo->sisvga_engine == SIS_315_VGA) return TRUE; +#endif + } + if(rate < (monitor->vmin - 1)) return FALSE; if(rate > (monitor->vmax + 1)) return FALSE; @@ -955,6 +974,52 @@ sisfb_set_vparms(struct sis_video_info * } } +static int +sisfb_calc_maxyres(struct sis_video_info *ivideo, struct fb_var_screeninfo *var) +{ + int maxyres = ivideo->heapstart / (var->xres_virtual * (var->bits_per_pixel >> 3)); + + if(maxyres > 32767) maxyres = 32767; + + return maxyres; +} + +static void +sisfb_calc_pitch(struct sis_video_info *ivideo, struct fb_var_screeninfo *var) +{ + ivideo->video_linelength = var->xres_virtual * (var->bits_per_pixel >> 3); + ivideo->scrnpitchCRT1 = ivideo->video_linelength; + if(!(ivideo->currentvbflags & CRT1_LCDA)) { + if((var->vmode & FB_VMODE_MASK) == FB_VMODE_INTERLACED) { + ivideo->scrnpitchCRT1 <<= 1; + } + } + +} + +static void +sisfb_set_pitch(struct sis_video_info *ivideo) +{ + BOOLEAN isslavemode = FALSE; + unsigned short HDisplay1 = ivideo->scrnpitchCRT1 >> 3; + unsigned short HDisplay2 = ivideo->video_linelength >> 3; + + if(sisfb_bridgeisslave(ivideo)) isslavemode = TRUE; + + /* We need to set pitch for CRT1 if bridge is in slave mode, too */ + if((ivideo->currentvbflags & VB_DISPTYPE_DISP1) || (isslavemode)) { + outSISIDXREG(SISCR,0x13,(HDisplay1 & 0xFF)); + setSISIDXREG(SISSR,0x0E,0xF0,(HDisplay1 >> 8)); + } + + /* We must not set the pitch for CRT2 if bridge is in slave mode */ + if((ivideo->currentvbflags & VB_DISPTYPE_DISP2) && (!isslavemode)) { + orSISIDXREG(SISPART1,ivideo->CRT2_write_enable,0x01); + outSISIDXREG(SISPART1,0x07,(HDisplay2 & 0xFF)); + setSISIDXREG(SISPART1,0x09,0xF0,(HDisplay2 >> 8)); + } +} + static void sisfb_bpp_to_var(struct sis_video_info *ivideo, struct fb_var_screeninfo *var) { @@ -989,8 +1054,7 @@ sisfb_bpp_to_var(struct sis_video_info * } static int -sisfb_do_set_var(struct fb_var_screeninfo *var, int isactive, - struct fb_info *info) +sisfb_do_set_var(struct fb_var_screeninfo *var, int isactive, struct fb_info *info) { struct sis_video_info *ivideo = (struct sis_video_info *)info->par; unsigned int htotal = 0, vtotal = 0; @@ -1088,15 +1152,26 @@ sisfb_do_set_var(struct fb_var_screeninf sisfb_post_setmode(ivideo); - ivideo->video_bpp = sisbios_mode[ivideo->sisfb_mode_idx].bpp; - ivideo->video_vwidth = ivideo->video_width = sisbios_mode[ivideo->sisfb_mode_idx].xres; - ivideo->video_vheight = ivideo->video_height = sisbios_mode[ivideo->sisfb_mode_idx].yres; - ivideo->video_linelength = ivideo->video_width * (ivideo->video_bpp >> 3); - ivideo->org_x = ivideo->org_y = 0; + ivideo->video_bpp = sisbios_mode[ivideo->sisfb_mode_idx].bpp; + ivideo->video_width = sisbios_mode[ivideo->sisfb_mode_idx].xres; + ivideo->video_height = sisbios_mode[ivideo->sisfb_mode_idx].yres; + + sisfb_calc_pitch(ivideo, var); + sisfb_set_pitch(ivideo); + ivideo->accel = 0; - if(ivideo->sisfb_accel) { - ivideo->accel = (var->accel_flags & FB_ACCELF_TEXT) ? -1 : 0; +#if defined(FBINFO_HWACCEL_DISABLED) && defined(FBINFO_HWACCEL_XPAN) +#ifdef STUPID_ACCELF_TEXT_SHIT + if(var->accel_flags & FB_ACCELF_TEXT) { + info->flags &= ~FBINFO_HWACCEL_DISABLED; + } else { + info->flags |= FBINFO_HWACCEL_DISABLED; } +#endif + if(!(info->flags & FBINFO_HWACCEL_DISABLED)) ivideo->accel = -1; +#else + if(var->accel_flags & FB_ACCELF_TEXT) ivideo->accel = -1; +#endif sisfb_set_vparms(ivideo); @@ -1105,12 +1180,12 @@ sisfb_do_set_var(struct fb_var_screeninf ivideo->current_bpp = ivideo->video_bpp; ivideo->current_htotal = htotal; ivideo->current_vtotal = vtotal; + ivideo->current_linelength = ivideo->video_linelength; ivideo->current_pixclock = var->pixclock; ivideo->current_refresh_rate = ivideo->refresh_rate; #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0) ivideo->sisfb_lastrates[ivideo->mode_no] = ivideo->refresh_rate; #endif - } return 0; @@ -1128,7 +1203,7 @@ sisfb_pan_var(struct sis_video_info *ivi return -EINVAL; } - base = var->yoffset * var->xres_virtual + var->xoffset; + base = (var->yoffset * var->xres_virtual) + var->xoffset; /* calculate base bpp dep. */ switch(var->bits_per_pixel) { @@ -1301,7 +1376,10 @@ sisfb_crtc_to_var(struct sis_video_info D = B - F - C; - var->xres = var->xres_virtual = E * 8; + var->xres = E * 8; + if(var->xres_virtual < var->xres) { + var->xres_virtual = var->xres; + } if((var->xres == 320) && (var->yres == 200 || var->yres == 240)) { @@ -1343,8 +1421,7 @@ sisfb_crtc_to_var(struct sis_video_info var->pixclock = (u32) (1000000000 / drate); if(ivideo->sisfb_ypan) { - maxyres = ivideo->heapstart / (var->xres * (var->bits_per_pixel >> 3)); - if(maxyres > 32767) maxyres = 32767; + maxyres = sisfb_calc_maxyres(ivideo, var); if(ivideo->sisfb_max) { var->yres_virtual = maxyres; } else { @@ -1452,24 +1529,20 @@ sisfb_set_disp(int con, struct fb_var_sc switch(ivideo->video_bpp) { #ifdef FBCON_HAS_CFB8 - case 8: - sw = ivideo->accel ? &fbcon_sis8 : &fbcon_cfb8; + case 8: sw = ivideo->accel ? &fbcon_sis8 : &fbcon_cfb8; break; #endif #ifdef FBCON_HAS_CFB16 - case 16: - sw = ivideo->accel ? &fbcon_sis16 : &fbcon_cfb16; + case 16:sw = ivideo->accel ? &fbcon_sis16 : &fbcon_cfb16; display->dispsw_data = &ivideo->sis_fbcon_cmap.cfb16; break; #endif #ifdef FBCON_HAS_CFB32 - case 32: - sw = ivideo->accel ? &fbcon_sis32 : &fbcon_cfb32; + case 32:sw = ivideo->accel ? &fbcon_sis32 : &fbcon_cfb32; display->dispsw_data = &ivideo->sis_fbcon_cmap.cfb32; break; #endif - default: - sw = &fbcon_dummy; + default:sw = &fbcon_dummy; break; } memcpy(&ivideo->sisfb_sw, sw, sizeof(*sw)); @@ -1522,7 +1595,6 @@ static int sisfb_set_var(struct fb_var_screeninfo *var, int con, struct fb_info *info) { struct sis_video_info *ivideo = (struct sis_video_info *)info->par; - unsigned int cols, rows; int err; fb_display[con].var.activate = FB_ACTIVATE_NOW; @@ -1546,10 +1618,10 @@ sisfb_set_var(struct fb_var_screeninfo * sisfb_do_install_cmap(con, info); +#if 0 /* Why was this called here? */ + unsigned int cols, rows; cols = sisbios_mode[ivideo->sisfb_mode_idx].cols; rows = sisbios_mode[ivideo->sisfb_mode_idx].rows; - -#if 0 /* Why was this called here? */ vc_resize_con(rows, cols, fb_display[con].conp->vc_num); #endif return 0; @@ -1611,17 +1683,11 @@ sisfb_pan_display(struct fb_var_screenin struct sis_video_info *ivideo = (struct sis_video_info *)info->par; int err; - if(var->vmode & FB_VMODE_YWRAP) { - if((var->yoffset < 0) || - (var->yoffset >= fb_display[con].var.yres_virtual) || - (var->xoffset)) { - return -EINVAL; - } - } else { - if((var->xoffset+fb_display[con].var.xres > fb_display[con].var.xres_virtual) || - (var->yoffset+fb_display[con].var.yres > fb_display[con].var.yres_virtual)) { - return -EINVAL; - } + if(var->vmode & FB_VMODE_YWRAP) return -EINVAL; + + if((var->xoffset+fb_display[con].var.xres > fb_display[con].var.xres_virtual) || + (var->yoffset+fb_display[con].var.yres > fb_display[con].var.yres_virtual)) { + return -EINVAL; } if(con == ivideo->currcon) { @@ -1630,11 +1696,6 @@ sisfb_pan_display(struct fb_var_screenin fb_display[con].var.xoffset = var->xoffset; fb_display[con].var.yoffset = var->yoffset; - if(var->vmode & FB_VMODE_YWRAP) { - fb_display[con].var.vmode |= FB_VMODE_YWRAP; - } else { - fb_display[con].var.vmode &= ~FB_VMODE_YWRAP; - } return 0; } @@ -1898,14 +1959,12 @@ sisfb_check_var(struct fb_var_screeninfo if(var->xoffset < 0) var->xoffset = 0; if(var->yoffset < 0) var->yoffset = 0; - /* Horiz-panning not supported */ - if(var->xres != var->xres_virtual) { + if(var->xres > var->xres_virtual) { var->xres_virtual = var->xres; } if(ivideo->sisfb_ypan) { - maxyres = ivideo->heapstart / (var->xres * (var->bits_per_pixel >> 3)); - if(maxyres > 32767) maxyres = 32767; + maxyres = sisfb_calc_maxyres(ivideo, var); if(ivideo->sisfb_max) { var->yres_virtual = maxyres; } else { @@ -1957,28 +2016,17 @@ sisfb_pan_display(struct fb_var_screenin return -EINVAL; } - if(var->vmode & FB_VMODE_YWRAP) { - if((var->yoffset < 0) || - (var->yoffset >= info->var.yres_virtual) || - (var->xoffset)) { - return -EINVAL; - } - } else { - if(var->xoffset + info->var.xres > info->var.xres_virtual || - var->yoffset + info->var.yres > info->var.yres_virtual) { - return -EINVAL; - } + if(var->vmode & FB_VMODE_YWRAP) return -EINVAL; + + if(var->xoffset + info->var.xres > info->var.xres_virtual || + var->yoffset + info->var.yres > info->var.yres_virtual) { + return -EINVAL; } if((err = sisfb_pan_var(ivideo, var)) < 0) return err; info->var.xoffset = var->xoffset; info->var.yoffset = var->yoffset; - if(var->vmode & FB_VMODE_YWRAP) { - info->var.vmode |= FB_VMODE_YWRAP; - } else { - info->var.vmode &= ~FB_VMODE_YWRAP; - } return 0; } @@ -2157,7 +2205,7 @@ sisfb_get_fix(struct fb_fix_screeninfo * fix->type = FB_TYPE_PACKED_PIXELS; fix->type_aux = 0; fix->visual = (ivideo->video_bpp == 8) ? FB_VISUAL_PSEUDOCOLOR : FB_VISUAL_TRUECOLOR; - fix->xpanstep = 0; + fix->xpanstep = 1; fix->ypanstep = (ivideo->sisfb_ypan) ? 1 : 0; fix->ywrapstep = 0; fix->line_length = ivideo->video_linelength; @@ -2248,7 +2296,9 @@ static struct pci_dev * sisfb_get_northb static int __devinit sisfb_get_dram_size(struct sis_video_info *ivideo) { +#if defined(CONFIG_FB_SIS_300) || defined(CONFIG_FB_SIS_315) u8 reg; +#endif ivideo->video_size = 0; @@ -2808,12 +2858,14 @@ static void __devinit SiS_Sense30x(struc /* Determine and detect attached TV's on Chrontel */ static void __devinit SiS_SenseCh(struct sis_video_info *ivideo) { +#if defined(CONFIG_FB_SIS_300) || defined(CONFIG_FB_SIS_315) u8 temp1, temp2; + char stdstr[] = "sisfb: Chrontel: Detected TV connected to"; +#endif #ifdef CONFIG_FB_SIS_300 unsigned char test[3]; int i; #endif - char stdstr[] = "sisfb: Chrontel: Detected TV connected to"; if(ivideo->chip < SIS_315H) { @@ -3585,9 +3637,11 @@ static void sisfb_set_TVyposoffset(struc static void sisfb_post_setmode(struct sis_video_info *ivideo) { - u8 reg; BOOLEAN crt1isoff = FALSE; BOOLEAN doit = TRUE; +#if defined(CONFIG_FB_SIS_300) || defined(CONFIG_FB_SIS_315) + u8 reg; +#endif #ifdef CONFIG_FB_SIS_315 u8 reg1; #endif @@ -3980,7 +4034,7 @@ static char * __devinit sis_find_rom(str return NULL; } -#ifdef SIS300 +#ifdef CONFIG_FB_SIS_300 static int __devinit sisfb_chkbuswidth300(struct pci_dev *pdev, ULONG FBAddress) { @@ -4279,6 +4333,405 @@ static void __devinit sisfb_post_sis300( } #endif +#ifdef CONFIG_FB_SIS_315 +static void __devinit sisfb_post_sis315330(struct pci_dev *pdev) +{ +#ifdef YET_TO_BE_DONE + struct sis_video_info *ivideo = pci_get_drvdata(pdev); + u8 reg, v1, v2, v3, v4, v5, v6, v7, v8; + u16 index, rindex, memtype = 0; + u32 reg1_32, reg2_32, reg3_32; + int i; + + /* Unlock */ + /* outSISIDXREG(0x3c4,0x05,0x86); */ + outSISIDXREG(SISSR,0x05,0x86); + + /* Enable relocated i/o ports */ + /* setSISIDXREG(0x3c4,0x20,~0x10,0x20); */ + setSISIDXREG(SISSR,0x20,~0x10,0x20); + + /* Clear regs */ + for(i = 0; i < 0x22; i++) { + outSISIDXREG(SISSR,(0x06 + i),0x00); + } + v1 = 0x0d; + if( is 330) v1 = 0x0b; + for(i = 0; i < v1; i++) { + outSISIDXREG(SISSR,(0x31 + i),0x00); + } + for(i = 0; i < 0x10; i++) { + outSISIDXREG(SISCR,(0x30 + i),0x00); + } + + /* Reset clocks */ + reg = inSISREG(SISMISCR); + outSISIDXREG(SISSR,0x28,0x81); + outSISIDXREG(SISSR,0x2A,0x00); + outSISIDXREG(SISSR,0x29,0xE1); + outSISREG(SISMISCW,(reg | 0x0c)); + outSISIDXREG(SISSR,0x2B,0x81); + outSISIDXREG(SISSR,0x2D,0x00); + outSISIDXREG(SISSR,0x2C,0xE1); + outSISIDXREG(SISSR,0x2E,0x81); + outSISIDXREG(SISSR,0x30,0x00); + outSISIDXREG(SISSR,0x2F,0xE1); + SiS_DDC2Delay(....); + outSISREG(SISMISCW,reg); + + /* Get memory type */ + if(ivideo->sishw_ext.UseROM) { + if(ivideo->sishw_ext.pjVirtualRomBase[0x52] & 0x80)) { + memtype = ivideo->sishw_ext.pjVirtualRomBase[0x52]; + } else { + inSISIDXREG(SISSR,0x3a,memtype); + } + memtype &= 0x03; + if( is 330 ) { + if(memtype <= 1) memtype = 0; + else { + inSISIDXREG(SISCR,0x5F,reg); + reg &= 0x30; + switch(reg) { + case 0x00: memtype = 1; break; + case 0x10: memtype = 3; break; + case 0x20: memtype = 3; break; + default: memtype = 2; + } + } + } + } + + /* Set clocks */ + v1 = 0x3b; v2 = 0x22; v3 = 0x01; /* Assume 143Mhz MCLK */ + v4 = 0x5c; v5 = 0x23; v6 = 0x01; /* Assume 166Mhz ECLK */ + if(ivideo->sishw_ext.UseROM) { + index = memtype * 5; + rindex = index + 0x54; + v1 = ivideo->sishw_ext.pjVirtualRomBase[rindex++]; + v2 = ivideo->sishw_ext.pjVirtualRomBase[rindex++]; + v3 = ivideo->sishw_ext.pjVirtualRomBase[rindex++]; + rindex = index + 0x68; + v4 = ivideo->sishw_ext.pjVirtualRomBase[rindex++]; + v5 = ivideo->sishw_ext.pjVirtualRomBase[rindex++]; + v6 = ivideo->sishw_ext.pjVirtualRomBase[rindex++]; + } + outSISIDXREG(SISSR,0x28,v1); + outSISIDXREG(SISSR,0x29,v2); + outSISIDXREG(SISSR,0x2a,v3); + if( is 330 ) { + inSISIDXREG(SISSR,0x3a,reg); + reg &= 0x03; + if(reg >= 2) { + ... + } + } + outSISIDXREG(SISSR,0x2e,v4); + outSISIDXREG(SISSR,0x2f,v5); + outSISIDXREG(SISSR,0x30,v6); + + /* End of comp with 330 */ + + v1 = 0x18; + if(ivideo->sishw_ext.UseROM) v1 = ivideo->sishw_ext.pjVirtualRomBase[0x7c]; + outSISIDXREG(SISSR,0x07,v1); + outSISIDXREG(SISSR,0x11,0x0f); + + v1 = 0x00; v2 = 0x0f; v3 = 0xba; v4 = 0xa9; + v5 = 0xa0; v6 = 0x00; v7 = 0x30; + if(ivideo->sishw_ext.UseROM) { + index = memtype + 0x7d; + v1 = ivideo->sishw_ext.pjVirtualRomBase[index]; + v2 = ivideo->sishw_ext.pjVirtualRomBase[index + 4]; + v3 = ivideo->sishw_ext.pjVirtualRomBase[index + 8]; + v4 = ivideo->sishw_ext.pjVirtualRomBase[index + 12]; + v5 = ivideo->sishw_ext.pjVirtualRomBase[index + 16]; + v6 = ivideo->sishw_ext.pjVirtualRomBase[index + 20]; + v7 = ivideo->sishw_ext.pjVirtualRomBase[index + 24]; + } + outSISIDXREG(SISSR,0x15,v1); /* Ram type (assuming 0, BIOS 0x7d step 4) */ + outSISIDXREG(SISSR,0x16,v2); + outSISIDXREG(SISSR,0x17,v3); + outSISIDXREG(SISSR,0x18,v4); + outSISIDXREG(SISSR,0x19,v5); + outSISIDXREG(SISSR,0x1a,v6); + outSISIDXREG(SISSR,0x1b,v7); + outSISIDXREG(SISSR,0x1c,v8); /* ---- */ + + v1 = 0x77; v2 = 0x77; v3 = 0x00; v4 = 0x5b; v5 = 0x00; + if(ivideo->sishw_ext.UseROM) { + index = memtype + 0xa2; + v1 = ivideo->sishw_ext.pjVirtualRomBase[index]; + v2 = ivideo->sishw_ext.pjVirtualRomBase[index + 4]; + v3 = ivideo->sishw_ext.pjVirtualRomBase[index + 8]; + v4 = ivideo->sishw_ext.pjVirtualRomBase[index + 12]; + v5 = ivideo->sishw_ext.pjVirtualRomBase[index + 16]; + } + outSISIDXREG(SISCR,0x40,v1); + outSISIDXREG(SISCR,0x41,v2); + outSISIDXREG(SISCR,0x42,v3); + outSISIDXREG(SISCR,0x43,v4); + outSISIDXREG(SISCR,0x44,v5); + + if( is 330 ) { + + v1 = 0x; + if(ivideo->sishw_ext.UseROM) { + v1 = ivideo->sishw_ext.pjVirtualRomBase[0xBA]; + } + outSISIDXREG(SISCR,0x59,v1); + + v1 = 0x; v2 = 0x; v3 = 0x; v4 = 0x; + v5 = 0x; v6 = 0x; v7 = 0x; v8 = 0x; + if(ivideo->sishw_ext.UseROM) { + index = memtype + 0xbe; + v1 = ivideo->sishw_ext.pjVirtualRomBase[index]; + v2 = ivideo->sishw_ext.pjVirtualRomBase[index + 4]; + v3 = ivideo->sishw_ext.pjVirtualRomBase[index + 8]; + v4 = ivideo->sishw_ext.pjVirtualRomBase[index + 12]; + v5 = ivideo->sishw_ext.pjVirtualRomBase[index + 16]; + v6 = ivideo->sishw_ext.pjVirtualRomBase[index + 20]; + v7 = ivideo->sishw_ext.pjVirtualRomBase[index + 24]; + v8 = ivideo->sishw_ext.pjVirtualRomBase[index + 28]; + } + outSISIDXREG(SISCR,0x68,v1); + outSISIDXREG(SISCR,0x69,v2); + outSISIDXREG(SISCR,0x6a,v3); + outSISIDXREG(SISCR,0x6b,v4); + outSISIDXREG(SISCR,0x6c,v5); + outSISIDXREG(SISCR,0x6d,v6); + outSISIDXREG(SISCR,0x6e,v7); + outSISIDXREG(SISCR,0x6f,v8); + + v1 = 0x20; + inSISIDXREG(SISSR,0x3b,reg); + + if(!(reg & 0x04)) { + inSISIDXREG(SISCR,0x5F,reg); + reg &= 0x30; + if(reg) v1 = 0x23; + } + outSISIDXREG(SISCR,0x48,v1); + outSISIDXREG(SISCR,0x4c,0x20); + + xx= xxx(); + if(xx >= 1) { + v1 = 0x; + if(ivideo->sishw_ext.UseROM) { + v1 = ivideo->sishw_ext.pjVirtualRomBase[0xBA]; + } + outSISIDXREG(SISCR,0x59,v1); + } + + + + } else { + + outSISIDXREG(SISCR,0x48,0x23); + + andSISIDXREG(SISSR,0x16,0x0f); + if(memtype <= 1) { + orSISIDXREG(SISSR,0x16,0x80); + } else { + v1 = 0x0f; + if(ivideo->sishw_ext.UseROM) { + v1 = ivideo->sishw_ext.pjVirtualRomBase[0x81 + memtype]; + } + if(!(v1 & 0x10)) v2 = 0xc0; + else v2 = 0xd0; + orSISIDXREG(SISSR,0x16,v2); + andSISIDXREG(SISSR,0x16,0x0f); + if(!(v1 & 0x10)) v2 = 0x80; + else v2 = 0xA0; + orSISIDXREG(SISSR,0x16,v2); + } + + if(memtype >= 2) { + const u8 sr3cseq1[] = { 0xc0,0xe0,0xf0,0xe0,0xf0,0xa0,0xb0,0xa0,0xb0,0x90,0xd0 }; + const u8 sr3cseq2[] = { 0xc0,0xa0,0xb0,0xa0,0xb0,0xe0,0xf0,0xa0,0xb0,0x90,0xd0 }; + for(i = 0; i < 11; i++) { + outSISIDXREG(SISSR,0x3c,sr3cseq1[i]); + } + outSISIDXREG(SISSR,0x3d,0x00); + outSISIDXREG(SISSR,0x3d,0x04); + SiS_DDC2Delay(0x200); + v1 = inSISIDXREG(SISCR,0xEC); + v2 = inSISIDXREG(SISCR,0xED); + reg1_32 = (v2 << 8) | v1; + outSISIDXREG(SISSR,0x3D,0x00); + for(i = 0; i < 11; i++) { + outSISIDXREG(SISSR,0x3c,sr3cseq2[i]); + } + outSISIDXREG(SISSR,0x3d,0x00); + outSISIDXREG(SISSR,0x3d,0x04); + SiS_DDC2Delay(0x200); + v1 = inSISIDXREG(SISCR,0xEC); + v2 = inSISIDXREG(SISCR,0xED); + reg2_32 = (v2 << 8) | v1; + outSISIDXREG(SISSR,0x3D,0x00); + reg3_32 = reg2_32 << 1; + reg2_32 >>= 1; + reg3_32 += reg2_32; + v1 = 0x40; + if(reg3_32 > reg1_32) v1 = 0x10; + outSISIDXREG(SISCR,0x59,v1); + } + + } + + v1 = 0x00; + if(ivideo->sishw_ext.UseROM) { + v1 = ivideo->sishw_ext.pjVirtualRomBase[0x99]; + } + outSISIDXREG(SISSR,0x1f,v1); + + outSISIDXREG(SISSR,0x20,0x20); + + v1 = 0xf6; v2 = 0x0d; v3 = 0x33; + if(ivideo->sishw_ext.UseROM) { + v1 = ivideo->sishw_ext.pjVirtualRomBase[0x9c]; + v2 = ivideo->sishw_ext.pjVirtualRomBase[0x9d]; + v3 = ivideo->sishw_ext.pjVirtualRomBase[0x9e]; + } + outSISIDXREG(SISSR,0x23,v1); + outSISIDXREG(SISSR,0x24,v2); + outSISIDXREG(SISSR,0x25,v3); + + outSISIDXREG(SISSR,0x21,0x84); + outSISIDXREG(SISSR,0x22,0x00); + outSISIDXREG(SISSR,0x27,0x1f); + + v1 = 0x00; v2 = 0x00; + if(ivideo->sishw_ext.UseROM) { + v1 = ivideo->sishw_ext.pjVirtualRomBase[0x9F]; + v2 = ivideo->sishw_ext.pjVirtualRomBase[0xA1]; + } + outSISIDXREG(SISSR,0x31,v1); + outSISIDXREG(SISSR,0x33,v2); + + v1 = 0x11; + if(ivideo->sishw_ext.UseROM) { + v1 = ivideo->sishw_ext.pjVirtualRomBase[0xA0]; + } + v2 = inSISIDXREG(SISPART4,0x00); + if((v2 != 1) && (v2 != 2)) v1 &= 0xef; + outSISIDXREG(SISSR,0x32,v1); + + /* AGP */ + pci_read_config_long(pdev, 0x50, ®1_32); + reg1_32 >>= 20; + reg1_32 &= 0x0f; + if(reg1_32 == 1) { + v1 = 0xAA; v2 = 0x33; + if(ivideo->sishw_ext.UseROM) { + v1 = ivideo->sishw_ext.pjVirtualRomBase[0xF7]; + v2 = ivideo->sishw_ext.pjVirtualRomBase[0x9E]; + } + } else { + v1 = 0x88; v2 = 0x03; + if(ivideo->sishw_ext.UseROM) { + v1 = ivideo->sishw_ext.pjVirtualRomBase[0xF8]; + v2 = ivideo->sishw_ext.pjVirtualRomBase[0xF6]; + } + } + outSISIDXREG(SISCR,0x49,v1); + outSISIDXREG(SISSR,0x25,v2); + + v1 = inSISIDXREG(SISPART4,0x00); + if((v1 == 1) || (v1 == 2)) { + orSISIDXREG(SISPART1,0x2F,0x01); /* Unlock CRT2 */ + outSISIDXREG(SISPART1,0x00,0x00); + v1 = 0x00; + if(ivideo->sishw_ext.UseROM) { + v1 = ivideo->sishw_ext.pjVirtualRomBase[0xb6]; + } + outSISIDXREG(SISPART1,0x02,v1); + outSISIDXREG(SISPART1,0x2E,0x08); + outSISIDXREG(SISPART2,0x00,0x1c); + v1 = 0x40; v2 = 0x00; v3 = 0x80; + if(ivideo->sishw_ext.UseROM) { + v1 = ivideo->sishw_ext.pjVirtualRomBase[0xb7]; + v2 = ivideo->sishw_ext.pjVirtualRomBase[0xb8]; + v3 = ivideo->sishw_ext.pjVirtualRomBase[0xbb]; + } + outSISIDXREG(SISPART4,0x0d,v1); + outSISIDXREG(SISPART4,0x0e,v2); + outSISIDXREG(SISPART4,0x10,v3); + outSISIDXREG(SISPART4,0x0F,0x3F); + + inSISIDXREG(SISPART4,0x01,reg); + if(reg >= 0xb0) { + inSISIDXREG(SISPART4,0x23,reg); + reg &= 0x20; + reg <<= 1; + outSISIDXREG(SISPART4,0x23,reg); + } + } + outSISIDXREG(SISCR,0x37,0x02); /* Why? */ + + outSISIDXREG(SISCR,0x83,0x00); + outSISIDXREG(SISCR,0x90,0x00); + andSISIDXREG(SISSR,0x5B,0xDF); + outSISIDXREG(SISVID,0x00,0x86); + outSISIDXREG(SISVID,0x32,0x00); + outSISIDXREG(SISVID,0x30,0x00); + outSISIDXREG(SISVID,0x32,0x01); + outSISIDXREG(SISVID,0x30,0x00); + orSISIDXREG(SISCR,0x63,0x80); + /* End of Init1 */ + + /* Set Mode 0x2e */ + + /* Ramsize */ + orSISIDXREG(SISSR,0x16,0x0f); + orSISIDXREG(SISSR,0x18,0xA9); + orSISIDXREG(SISSR,0x19,0xA0); + orSISIDXREG(SISSR,0x1B,0x30); + andSISIDXREG(SISSR,0x17,0xF8); + orSISIDXREG(SISSR,0x19,0x03); + andSIDIDXREG(SISSR,0x13,0x00); + + /* Need to map max FB size for finding out about RAM size */ + ivideo->sishw_ext.pjVideoMemoryAddress = ioremap(ivideo->video_base, 0x4000000); + if(ivideo->sishw_ext.pjVideoMemoryAddress) { + /* Find out about bus width */ + if(memtype <= 1) { + outSISIDXREG(SISSR,0x14,0x02); + andSISIDXREG(SISSR,0x16,0x0F); + orSISIDXREG(SISSR,0x16,0x80); + + ... + + } else { + + ... + + } + + /* Find out about size */ + + + iounmap(ivideo->sishw_ext.pjVideoMemoryAddress); + } else { + printk(KERN_DEBUG "sisfb: Failed to map memory for size detection, assuming 8MB\n"); + outSISIDXREG(SISSR,0x14,0x??); /* 8MB, 64bit default */ + } + + /* AGP (Missing: Checks for VIA and AMD hosts) */ + v1 = 0xA5; v2 = 0xFB; + if(ivideo->sishw_ext.UseROM) { + v1 = ivideo->sishw_ext.pjVirtualRomBase[0x9A]; + v2 = ivideo->sishw_ext.pjVirtualRomBase[0x9B]; + } + outSISIDXREG(SISSR,0x21,v1); + outSISIDXREG(SISSR,0x22,v2); + +#endif + return; +} +#endif + + int __devinit sisfb_probe(struct pci_dev *pdev, const struct pci_device_id *ent) { struct sisfb_chip_info *chipinfo = &sisfb_chip_info[ent->driver_data]; @@ -4492,13 +4945,26 @@ int __devinit sisfb_probe(struct pci_dev || (sisfb_resetcard) #endif ) { - for(i = 0x30; i <= 0x3f; i++) { - outSISIDXREG(SISCR,i,0x00); - } + for(i = 0x30; i <= 0x3f; i++) { + outSISIDXREG(SISCR,i,0x00); + } } + /* Find out about current video mode */ inSISIDXREG(SISCR,0x34,reg); - ivideo->modeprechange = ((reg & 0x7f)) ? (reg & 0x7f) : 0x03; + if(reg & 0x7f) { + ivideo->modeprechange = reg & 0x7f; + } else { + ivideo->modeprechange = 0x03; +#if defined(__i386__) || defined(__x86_64__) + unsigned char *tt = ioremap(0, 0x1000); + if(tt) { + ivideo->modeprechange = tt[0x449]; + iounmap(tt); + } +#endif + } + #if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) #ifdef MODULE if((reg & 0x80) && (reg != 0xff)) { @@ -4607,7 +5073,9 @@ int __devinit sisfb_probe(struct pci_dev || (sisfb_resetcard) #endif ) { - if(ivideo->chip == SIS_300) sisfb_post_sis300(pdev); + if(ivideo->chip == SIS_300) { + sisfb_post_sis300(pdev); + } } } #endif @@ -4619,9 +5087,11 @@ int __devinit sisfb_probe(struct pci_dev || (sisfb_resetcard) #endif ) { - if((ivideo->sisfb_mode_idx < 0) || - ((sisbios_mode[ivideo->sisfb_mode_idx].mode_no[ivideo->mni]) != 0xFF)) { - /* TODO: POSTing 315/330 not supported yet */ + if((ivideo->chip == SIS_315H) || + (ivideo->chip == SIS_315) || + (ivideo->chip == SIS_315PRO) || + (ivideo->chip == SIS_330)) { + sisfb_post_sis315330(pdev); } } } @@ -4643,8 +5113,6 @@ int __devinit sisfb_probe(struct pci_dev orSISIDXREG(SISSR, IND_SIS_MODULE_ENABLE, SIS_ENABLE_2D); } - - if(sisfb_pdc != 0xff) { if(ivideo->sisvga_engine == SIS_300_VGA) sisfb_pdc &= 0x3c; else sisfb_pdc &= 0x1f; @@ -4832,8 +5300,6 @@ int __devinit sisfb_probe(struct pci_dev if(tmp & 0x04) { ivideo->SiS_Pr.SiS_UseLCDA = TRUE; ivideo->detectedlcda = 0x03; - printk(KERN_DEBUG - "sisfb: BIOS uses LCDA for low resolution and text modes\n"); } } @@ -4963,10 +5429,8 @@ int __devinit sisfb_probe(struct pci_dev } ivideo->video_bpp = sisbios_mode[ivideo->sisfb_mode_idx].bpp; - ivideo->video_vwidth = ivideo->video_width = sisbios_mode[ivideo->sisfb_mode_idx].xres; - ivideo->video_vheight = ivideo->video_height = sisbios_mode[ivideo->sisfb_mode_idx].yres; - ivideo->org_x = ivideo->org_y = 0; - ivideo->video_linelength = ivideo->video_width * (ivideo->video_bpp >> 3); + ivideo->video_width = sisbios_mode[ivideo->sisfb_mode_idx].xres; + ivideo->video_height = sisbios_mode[ivideo->sisfb_mode_idx].yres; sisfb_set_vparms(ivideo); @@ -4998,16 +5462,23 @@ int __devinit sisfb_probe(struct pci_dev sisfb_post_setmode(ivideo); + /* Maximize regardless of sisfb_max at startup */ + ivideo->default_var.yres_virtual = 32767; + + /* Force reset of x virtual in crtc_to_var */ + ivideo->default_var.xres_virtual = 0; + + sisfb_crtc_to_var(ivideo, &ivideo->default_var); + + sisfb_calc_pitch(ivideo, &ivideo->default_var); + sisfb_set_pitch(ivideo); + ivideo->accel = 0; if(ivideo->sisfb_accel) { ivideo->accel = -1; ivideo->default_var.accel_flags |= FB_ACCELF_TEXT; - sisfb_initaccel(ivideo); } - - /* Maximize regardless of sisfb_max at startup */ - ivideo->default_var.yres_virtual = 32767; - sisfb_crtc_to_var(ivideo, &ivideo->default_var); + sisfb_initaccel(ivideo); sis_fb_info->node = -1; sis_fb_info->flags = FBINFO_FLAG_DEFAULT; @@ -5044,25 +5515,35 @@ int __devinit sisfb_probe(struct pci_dev } } - ivideo->accel = 0; - if(ivideo->sisfb_accel) { - ivideo->accel = -1; - ivideo->default_var.accel_flags |= FB_ACCELF_TEXT; - sisfb_initaccel(ivideo); - } - if(ivideo->sisfb_ypan) { /* Maximize regardless of sisfb_max at startup */ - ivideo->default_var.yres_virtual = - ivideo->heapstart / - (ivideo->default_var.xres * (ivideo->default_var.bits_per_pixel >> 3)); - if(ivideo->default_var.yres_virtual > 32767) ivideo->default_var.yres_virtual = 32767; - if(ivideo->default_var.yres_virtual <= ivideo->default_var.yres) { + ivideo->default_var.yres_virtual = sisfb_calc_maxyres(ivideo, &ivideo->default_var); + if(ivideo->default_var.yres_virtual < ivideo->default_var.yres) { ivideo->default_var.yres_virtual = ivideo->default_var.yres; } } + sisfb_calc_pitch(ivideo, &ivideo->default_var); + + ivideo->accel = 0; + if(ivideo->sisfb_accel) { + ivideo->accel = -1; +#ifdef STUPID_ACCELF_TEXT_SHIT + ivideo->default_var.accel_flags |= FB_ACCELF_TEXT; +#endif + } + sisfb_initaccel(ivideo); + +#if defined(FBINFO_HWACCEL_DISABLED) && defined(FBINFO_HWACCEL_XPAN) + sis_fb_info->flags = FBINFO_DEFAULT | + FBINFO_HWACCEL_YPAN | + FBINFO_HWACCEL_XPAN | + FBINFO_HWACCEL_COPYAREA | + FBINFO_HWACCEL_FILLRECT | + ((ivideo->accel) ? 0 : FBINFO_HWACCEL_DISABLED); +#else sis_fb_info->flags = FBINFO_FLAG_DEFAULT; +#endif sis_fb_info->var = ivideo->default_var; sis_fb_info->fix = ivideo->sisfb_fix; sis_fb_info->screen_base = (char *)ivideo->video_vbase; @@ -5131,21 +5612,13 @@ int __devinit sisfb_probe(struct pci_dev } #endif -#if 0 - printk(KERN_DEBUG "sisfb: Installed SISFB_GET_INFO_SIZE ioctl (%x)\n", SISFB_GET_INFO_SIZE); - printk(KERN_DEBUG "sisfb: Installed SISFB_GET_INFO ioctl (%x)\n", SISFB_GET_INFO); - printk(KERN_DEBUG "sisfb: Installed SISFB_GET_VBRSTATUS ioctl (%x)\n", SISFB_GET_VBRSTATUS); - printk(KERN_DEBUG "sisfb: Installed SISFB_GET_TVPOSOFFSET ioctl (%x)\n", SISFB_GET_TVPOSOFFSET); - printk(KERN_DEBUG "sisfb: Installed SISFB_SET_TVPOSOFFSET ioctl (%x)\n", SISFB_SET_TVPOSOFFSET); -#endif - - printk(KERN_INFO "sisfb: 2D acceleration is %s, scroll-mode %s\n", + printk(KERN_INFO "sisfb: 2D acceleration is %s, y-panning %s\n", ivideo->sisfb_accel ? "enabled" : "disabled", ivideo->sisfb_ypan ? - (ivideo->sisfb_max ? "ypan (auto-max)" : "ypan (no auto-max)") : "redraw"); + (ivideo->sisfb_max ? "enabled (auto-max)" : "enabled (no auto-max)") : "disabled"); - printk(KERN_INFO "fb%d: %s frame buffer device, Version %d.%d.%02d\n", + printk(KERN_INFO "fb%d: %s frame buffer device, Version %d.%d.%d\n", #if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) GET_FB_IDX(sis_fb_info->node), #else diff -puN drivers/video/sis/sis_main.h~sisfb-update-1710-fixes drivers/video/sis/sis_main.h --- 25/drivers/video/sis/sis_main.h~sisfb-update-1710-fixes 2004-06-07 21:41:15.316762272 -0700 +++ 25-akpm/drivers/video/sis/sis_main.h 2004-06-07 21:41:15.353756648 -0700 @@ -161,7 +161,7 @@ SIS_HEAP sisfb_heap; /* Mode table */ static const struct _sisbios_mode { char name[15]; - u8 mode_no[2]; + u8 mode_no[2]; u16 vesa_mode_no_1; /* "SiS defined" VESA mode number */ u16 vesa_mode_no_2; /* Real VESA mode numbers */ u16 xres; @@ -230,66 +230,74 @@ static const struct _sisbios_mode { {"856x480x16", {0x42,0x42}, 0x0000, 0x0000, 856, 480, 16, 2, 107, 30, MD_SIS300|MD_SIS315}, {"856x480x24", {0x45,0x45}, 0x0000, 0x0000, 856, 480, 32, 2, 107, 30, MD_SIS300|MD_SIS315}, {"856x480x32", {0x45,0x45}, 0x0000, 0x0000, 856, 480, 32, 2, 107, 30, MD_SIS300|MD_SIS315}, + {"960x540x8", {0x1d,0x1d}, 0x0000, 0x0000, 960, 540, 8, 1, 120, 33, MD_SIS315}, + {"960x540x16", {0x1e,0x1e}, 0x0000, 0x0000, 960, 540, 16, 1, 120, 33, MD_SIS315}, + {"960x540x24", {0x1f,0x1f}, 0x0000, 0x0000, 960, 540, 32, 1, 120, 33, MD_SIS315}, + {"960x540x32", {0x1f,0x1f}, 0x0000, 0x0000, 960, 540, 32, 1, 120, 33, MD_SIS315}, {"1024x576x8", {0x71,0x71}, 0x0000, 0x0000, 1024, 576, 8, 1, 128, 36, MD_SIS300|MD_SIS315}, - {"1024x576x16", {0x74,0x74}, 0x0000, 0x0000, 1024, 576, 16, 1, 128, 36, MD_SIS300|MD_SIS315}, +/*60*/ {"1024x576x16", {0x74,0x74}, 0x0000, 0x0000, 1024, 576, 16, 1, 128, 36, MD_SIS300|MD_SIS315}, {"1024x576x24", {0x77,0x77}, 0x0000, 0x0000, 1024, 576, 32, 1, 128, 36, MD_SIS300|MD_SIS315}, {"1024x576x32", {0x77,0x77}, 0x0000, 0x0000, 1024, 576, 32, 1, 128, 36, MD_SIS300|MD_SIS315}, {"1024x600x8", {0x20,0x20}, 0x0000, 0x0000, 1024, 600, 8, 1, 128, 37, MD_SIS300 }, -/*60*/ {"1024x600x16", {0x21,0x21}, 0x0000, 0x0000, 1024, 600, 16, 1, 128, 37, MD_SIS300 }, + {"1024x600x16", {0x21,0x21}, 0x0000, 0x0000, 1024, 600, 16, 1, 128, 37, MD_SIS300 }, {"1024x600x24", {0x22,0x22}, 0x0000, 0x0000, 1024, 600, 32, 1, 128, 37, MD_SIS300 }, {"1024x600x32", {0x22,0x22}, 0x0000, 0x0000, 1024, 600, 32, 1, 128, 37, MD_SIS300 }, {"1024x768x8", {0x38,0x38}, 0x0105, 0x0105, 1024, 768, 8, 2, 128, 48, MD_SIS300|MD_SIS315}, {"1024x768x16", {0x4a,0x4a}, 0x0117, 0x0117, 1024, 768, 16, 2, 128, 48, MD_SIS300|MD_SIS315}, {"1024x768x24", {0x64,0x64}, 0x013c, 0x0118, 1024, 768, 32, 2, 128, 48, MD_SIS300|MD_SIS315}, - {"1024x768x32", {0x64,0x64}, 0x013c, 0x0118, 1024, 768, 32, 2, 128, 48, MD_SIS300|MD_SIS315}, +/*70*/ {"1024x768x32", {0x64,0x64}, 0x013c, 0x0118, 1024, 768, 32, 2, 128, 48, MD_SIS300|MD_SIS315}, {"1152x768x8", {0x23,0x23}, 0x0000, 0x0000, 1152, 768, 8, 1, 144, 48, MD_SIS300 }, {"1152x768x16", {0x24,0x24}, 0x0000, 0x0000, 1152, 768, 16, 1, 144, 48, MD_SIS300 }, {"1152x768x24", {0x25,0x25}, 0x0000, 0x0000, 1152, 768, 32, 1, 144, 48, MD_SIS300 }, -/*70*/ {"1152x768x32", {0x25,0x25}, 0x0000, 0x0000, 1152, 768, 32, 1, 144, 48, MD_SIS300 }, + {"1152x768x32", {0x25,0x25}, 0x0000, 0x0000, 1152, 768, 32, 1, 144, 48, MD_SIS300 }, {"1152x864x8", {0x29,0x29}, 0x0000, 0x0000, 1152, 864, 8, 1, 144, 54, MD_SIS300|MD_SIS315}, {"1152x864x16", {0x2a,0x2a}, 0x0000, 0x0000, 1152, 864, 16, 1, 144, 54, MD_SIS300|MD_SIS315}, {"1152x864x24", {0x2b,0x2b}, 0x0000, 0x0000, 1152, 864, 32, 1, 144, 54, MD_SIS300|MD_SIS315}, {"1152x864x32", {0x2b,0x2b}, 0x0000, 0x0000, 1152, 864, 32, 1, 144, 54, MD_SIS300|MD_SIS315}, {"1280x720x8", {0x79,0x79}, 0x0000, 0x0000, 1280, 720, 8, 1, 160, 45, MD_SIS300|MD_SIS315}, - {"1280x720x16", {0x75,0x75}, 0x0000, 0x0000, 1280, 720, 16, 1, 160, 45, MD_SIS300|MD_SIS315}, +/*80*/ {"1280x720x16", {0x75,0x75}, 0x0000, 0x0000, 1280, 720, 16, 1, 160, 45, MD_SIS300|MD_SIS315}, {"1280x720x24", {0x78,0x78}, 0x0000, 0x0000, 1280, 720, 32, 1, 160, 45, MD_SIS300|MD_SIS315}, {"1280x720x32", {0x78,0x78}, 0x0000, 0x0000, 1280, 720, 32, 1, 160, 45, MD_SIS300|MD_SIS315}, {"1280x768x8", {0x55,0x23}, 0x0000, 0x0000, 1280, 768, 8, 1, 160, 48, MD_SIS300|MD_SIS315}, -/*80*/ {"1280x768x16", {0x5a,0x24}, 0x0000, 0x0000, 1280, 768, 16, 1, 160, 48, MD_SIS300|MD_SIS315}, + {"1280x768x16", {0x5a,0x24}, 0x0000, 0x0000, 1280, 768, 16, 1, 160, 48, MD_SIS300|MD_SIS315}, {"1280x768x24", {0x5b,0x25}, 0x0000, 0x0000, 1280, 768, 32, 1, 160, 48, MD_SIS300|MD_SIS315}, {"1280x768x32", {0x5b,0x25}, 0x0000, 0x0000, 1280, 768, 32, 1, 160, 48, MD_SIS300|MD_SIS315}, {"1280x800x8", {0x14,0x14}, 0x0000, 0x0000, 1280, 800, 8, 1, 160, 50, MD_SIS315}, {"1280x800x16", {0x15,0x15}, 0x0000, 0x0000, 1280, 800, 16, 1, 160, 50, MD_SIS315}, {"1280x800x24", {0x16,0x16}, 0x0000, 0x0000, 1280, 800, 32, 1, 160, 50, MD_SIS315}, - {"1280x800x32", {0x16,0x16}, 0x0000, 0x0000, 1280, 800, 32, 1, 160, 50, MD_SIS315}, +/*90*/ {"1280x800x32", {0x16,0x16}, 0x0000, 0x0000, 1280, 800, 32, 1, 160, 50, MD_SIS315}, {"1280x960x8", {0x7c,0x7c}, 0x0000, 0x0000, 1280, 960, 8, 1, 160, 60, MD_SIS300|MD_SIS315}, {"1280x960x16", {0x7d,0x7d}, 0x0000, 0x0000, 1280, 960, 16, 1, 160, 60, MD_SIS300|MD_SIS315}, {"1280x960x24", {0x7e,0x7e}, 0x0000, 0x0000, 1280, 960, 32, 1, 160, 60, MD_SIS300|MD_SIS315}, -/*90*/ {"1280x960x32", {0x7e,0x7e}, 0x0000, 0x0000, 1280, 960, 32, 1, 160, 60, MD_SIS300|MD_SIS315}, + {"1280x960x32", {0x7e,0x7e}, 0x0000, 0x0000, 1280, 960, 32, 1, 160, 60, MD_SIS300|MD_SIS315}, {"1280x1024x8", {0x3a,0x3a}, 0x0107, 0x0107, 1280, 1024, 8, 2, 160, 64, MD_SIS300|MD_SIS315}, {"1280x1024x16", {0x4d,0x4d}, 0x011a, 0x011a, 1280, 1024, 16, 2, 160, 64, MD_SIS300|MD_SIS315}, {"1280x1024x24", {0x65,0x65}, 0x013d, 0x011b, 1280, 1024, 32, 2, 160, 64, MD_SIS300|MD_SIS315}, {"1280x1024x32", {0x65,0x65}, 0x013d, 0x011b, 1280, 1024, 32, 2, 160, 64, MD_SIS300|MD_SIS315}, {"1360x768x8", {0x48,0x48}, 0x0000, 0x0000, 1360, 768, 8, 1, 170, 48, MD_SIS300|MD_SIS315}, - {"1360x768x16", {0x4b,0x4b}, 0x0000, 0x0000, 1360, 768, 16, 1, 170, 48, MD_SIS300|MD_SIS315}, +/*100*/ {"1360x768x16", {0x4b,0x4b}, 0x0000, 0x0000, 1360, 768, 16, 1, 170, 48, MD_SIS300|MD_SIS315}, {"1360x768x24", {0x4e,0x4e}, 0x0000, 0x0000, 1360, 768, 32, 1, 170, 48, MD_SIS300|MD_SIS315}, {"1360x768x32", {0x4e,0x4e}, 0x0000, 0x0000, 1360, 768, 32, 1, 170, 48, MD_SIS300|MD_SIS315}, {"1360x1024x8", {0x67,0x67}, 0x0000, 0x0000, 1360, 1024, 8, 1, 170, 64, MD_SIS300 }, -/*100*/ {"1360x1024x16", {0x6f,0x6f}, 0x0000, 0x0000, 1360, 1024, 16, 1, 170, 64, MD_SIS300 }, + {"1360x1024x16", {0x6f,0x6f}, 0x0000, 0x0000, 1360, 1024, 16, 1, 170, 64, MD_SIS300 }, {"1360x1024x24", {0x72,0x72}, 0x0000, 0x0000, 1360, 1024, 32, 1, 170, 64, MD_SIS300 }, {"1360x1024x32", {0x72,0x72}, 0x0000, 0x0000, 1360, 1024, 32, 1, 170, 64, MD_SIS300 }, {"1400x1050x8", {0x26,0x26}, 0x0000, 0x0000, 1400, 1050, 8, 1, 175, 65, MD_SIS315}, {"1400x1050x16", {0x27,0x27}, 0x0000, 0x0000, 1400, 1050, 16, 1, 175, 65, MD_SIS315}, {"1400x1050x24", {0x28,0x28}, 0x0000, 0x0000, 1400, 1050, 32, 1, 175, 65, MD_SIS315}, - {"1400x1050x32", {0x28,0x28}, 0x0000, 0x0000, 1400, 1050, 32, 1, 175, 65, MD_SIS315}, +/*110*/ {"1400x1050x32", {0x28,0x28}, 0x0000, 0x0000, 1400, 1050, 32, 1, 175, 65, MD_SIS315}, {"1600x1200x8", {0x3c,0x3c}, 0x0130, 0x011c, 1600, 1200, 8, 1, 200, 75, MD_SIS300|MD_SIS315}, {"1600x1200x16", {0x3d,0x3d}, 0x0131, 0x011e, 1600, 1200, 16, 1, 200, 75, MD_SIS300|MD_SIS315}, {"1600x1200x24", {0x66,0x66}, 0x013e, 0x011f, 1600, 1200, 32, 1, 200, 75, MD_SIS300|MD_SIS315}, -/*110*/ {"1600x1200x32", {0x66,0x66}, 0x013e, 0x011f, 1600, 1200, 32, 1, 200, 75, MD_SIS300|MD_SIS315}, + {"1600x1200x32", {0x66,0x66}, 0x013e, 0x011f, 1600, 1200, 32, 1, 200, 75, MD_SIS300|MD_SIS315}, {"1680x1050x8", {0x17,0x17}, 0x0000, 0x0000, 1680, 1050, 8, 1, 210, 65, MD_SIS315}, {"1680x1050x16", {0x18,0x18}, 0x0000, 0x0000, 1680, 1050, 16, 1, 210, 65, MD_SIS315}, {"1680x1050x24", {0x19,0x19}, 0x0000, 0x0000, 1680, 1050, 32, 1, 210, 65, MD_SIS315}, {"1680x1050x32", {0x19,0x19}, 0x0000, 0x0000, 1680, 1050, 32, 1, 210, 65, MD_SIS315}, + {"1920x1080x8", {0x2c,0x2c}, 0x0000, 0x0000, 1920, 1080, 8, 1, 240, 67, MD_SIS315}, +/*120*/ {"1920x1080x16", {0x2d,0x2d}, 0x0000, 0x0000, 1920, 1080, 16, 1, 240, 67, MD_SIS315}, + {"1920x1080x24", {0x73,0x73}, 0x0000, 0x0000, 1920, 1080, 32, 1, 240, 67, MD_SIS315}, + {"1920x1080x32", {0x73,0x73}, 0x0000, 0x0000, 1920, 1080, 32, 1, 240, 67, MD_SIS315}, {"1920x1440x8", {0x68,0x68}, 0x013f, 0x0000, 1920, 1440, 8, 1, 240, 75, MD_SIS300|MD_SIS315}, {"1920x1440x16", {0x69,0x69}, 0x0140, 0x0000, 1920, 1440, 16, 1, 240, 75, MD_SIS300|MD_SIS315}, {"1920x1440x24", {0x6b,0x6b}, 0x0141, 0x0000, 1920, 1440, 32, 1, 240, 75, MD_SIS300|MD_SIS315}, @@ -297,7 +305,7 @@ static const struct _sisbios_mode { {"2048x1536x8", {0x6c,0x6c}, 0x0000, 0x0000, 2048, 1536, 8, 1, 256, 96, MD_SIS315}, {"2048x1536x16", {0x6d,0x6d}, 0x0000, 0x0000, 2048, 1536, 16, 1, 256, 96, MD_SIS315}, {"2048x1536x24", {0x6e,0x6e}, 0x0000, 0x0000, 2048, 1536, 32, 1, 256, 96, MD_SIS315}, - {"2048x1536x32", {0x6e,0x6e}, 0x0000, 0x0000, 2048, 1536, 32, 1, 256, 96, MD_SIS315}, +/*130*/ {"2048x1536x32", {0x6e,0x6e}, 0x0000, 0x0000, 2048, 1536, 32, 1, 256, 96, MD_SIS315}, {"\0", {0x00,0x00}, 0, 0, 0, 0, 0, 0, 0} }; @@ -310,18 +318,18 @@ static const struct _sis_lcd_data { } sis_lcd_data[] = { { LCD_640x480, 640, 480, 23 }, { LCD_800x600, 800, 600, 43 }, - { LCD_1024x600, 1024, 600, 59 }, - { LCD_1024x768, 1024, 768, 63 }, - { LCD_1152x768, 1152, 768, 67 }, - { LCD_1152x864, 1152, 864, 71 }, - { LCD_1280x720, 1280, 720, 75 }, - { LCD_1280x768, 1280, 768, 79 }, - { LCD_1280x800, 1280, 800, 83 }, - { LCD_1280x960, 1280, 960, 87 }, - { LCD_1280x1024, 1280, 1024, 91 }, - { LCD_1400x1050, 1400, 1050, 103 }, - { LCD_1680x1050, 1680, 1050, 111 }, - { LCD_1600x1200, 1600, 1200, 107 }, + { LCD_1024x600, 1024, 600, 63 }, + { LCD_1024x768, 1024, 768, 67 }, + { LCD_1152x768, 1152, 768, 71 }, + { LCD_1152x864, 1152, 864, 75 }, + { LCD_1280x720, 1280, 720, 79 }, + { LCD_1280x768, 1280, 768, 83 }, + { LCD_1280x800, 1280, 800, 87 }, + { LCD_1280x960, 1280, 960, 91 }, + { LCD_1280x1024, 1280, 1024, 95 }, + { LCD_1400x1050, 1400, 1050, 107 }, + { LCD_1680x1050, 1680, 1050, 115 }, + { LCD_1600x1200, 1600, 1200, 111 }, { LCD_640x480_2, 640, 480, 23 }, { LCD_640x480_3, 640, 480, 23 }, { LCD_320x480, 320, 480, 9 }, @@ -417,6 +425,7 @@ static const struct _sis_vrate { {7, 800, 600, 120, TRUE}, {8, 800, 600, 160, TRUE}, {1, 848, 480, 39, TRUE}, {2, 848, 480, 60, TRUE}, {1, 856, 480, 39, TRUE}, {2, 856, 480, 60, TRUE}, + {1, 960, 540, 60, TRUE}, {1, 1024, 576, 60, TRUE}, {2, 1024, 576, 75, TRUE}, {3, 1024, 576, 85, TRUE}, {1, 1024, 600, 60, TRUE}, {1, 1024, 768, 43, TRUE}, {2, 1024, 768, 60, TRUE}, {3, 1024, 768, 70, FALSE}, @@ -437,6 +446,7 @@ static const struct _sis_vrate { {4, 1600, 1200, 75, TRUE}, {5, 1600, 1200, 85, TRUE}, {6, 1600, 1200, 100, TRUE}, {7, 1600, 1200, 120, TRUE}, {1, 1680, 1050, 60, TRUE}, + {1, 1920, 1080, 30, TRUE}, {1, 1920, 1440, 60, TRUE}, {2, 1920, 1440, 65, TRUE}, {3, 1920, 1440, 70, TRUE}, {4, 1920, 1440, 75, TRUE}, {5, 1920, 1440, 85, TRUE}, {6, 1920, 1440, 100, TRUE}, {1, 2048, 1536, 60, TRUE}, {2, 2048, 1536, 65, TRUE}, {3, 2048, 1536, 70, TRUE}, _